Compare commits

..
Author SHA1 Message Date
Tony 9eb4b7dec9 format 2026-07-04 20:28:00 +08:00
renovate[bot] b329a29094 chore(deps): update dependency prettier to v3.9.4 2026-07-03 02:45:07 +00:00
206 changed files with 1502 additions and 2564 deletions
-10
View File
@@ -1,17 +1,7 @@
[advisories] [advisories]
ignore = [ ignore = [
# rsa Marvin Attack
"RUSTSEC-2023-0071",
# time crate can't be updated in the repo because of MSRV, users are unaffected # time crate can't be updated in the repo because of MSRV, users are unaffected
"RUSTSEC-2026-0009", "RUSTSEC-2026-0009",
# libflate crates can't be updated in the repo because of MSRV, users are unaffected # libflate crates can't be updated in the repo because of MSRV, users are unaffected
"RUSTSEC-2026-0105", "RUSTSEC-2026-0105",
# quick-xml, need an update in plist, can't be updated in the repo because of MSRV, users are unaffected
# Also needs on update in wayland-scanner > arboard > tauri-plugin-clipboard-manager
"RUSTSEC-2026-0194",
# quick-xml, need an update in plist, can't be updated in the repo because of MSRV, users are unaffected
# Also needs on update in wayland-scanner > arboard > tauri-plugin-clipboard-manager
"RUSTSEC-2026-0195",
# quinn-proto, can't be updated in the repo because of MSRV, users are unaffected
"RUSTSEC-2026-0185",
] ]
@@ -0,0 +1,4 @@
---
"single-instance": patch
---
Fix blocked thread on the single-instance plugin for MacOS: replace standard `UnixListener` with `tokio::net::UnixListener`, so the task can yield.
+6
View File
@@ -0,0 +1,6 @@
---
"log": minor:feat
"log-js": minor
---
Added the `FileOpenStrategy` for log rotation. It defaults to append into existing file if any (previous behaviour), and brings a new feature to create a new file per session: `FileOpenStrategy::Rotate`.
@@ -0,0 +1,6 @@
---
positioner: patch
positioner-js: patch
---
Replaced a panic in `calculate_position` with an error return when the window has no associated monitor (e.g. during display sleep or monitor reconfiguration).
+6
View File
@@ -0,0 +1,6 @@
---
"log": patch
"log-js": patch
---
Removed an unused dependency `byte-unit`.
+5 -8
View File
@@ -29,27 +29,24 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: read
checks: write
jobs: jobs:
audit-js: audit-js:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- name: Cache pnpm modules - name: Cache pnpm modules
uses: actions/cache@v6 uses: actions/cache@v4
with: with:
path: ~/.pnpm-store path: ~/.pnpm-store
key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
${{ runner.os }}- ${{ runner.os }}-
- uses: actions/setup-node@v7 - uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
- uses: pnpm/action-setup@v6 - uses: pnpm/action-setup@v4
with: with:
version: 10.x.x
run_install: true run_install: true
- name: audit - name: audit
run: pnpm audit run: pnpm audit
+1 -5
View File
@@ -29,15 +29,11 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: read
checks: write
jobs: jobs:
audit-rust: audit-rust:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- uses: rustsec/audit-check@v2 - uses: rustsec/audit-check@v2
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
+1 -4
View File
@@ -13,14 +13,11 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: read
jobs: jobs:
check: check:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- name: check change files end with .md - name: check change files end with .md
run: | run: |
+6 -8
View File
@@ -15,16 +15,13 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: read
jobs: jobs:
changes: changes:
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs: outputs:
packages: ${{ steps.filter.outputs.changes }} packages: ${{ steps.filter.outputs.changes }}
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- uses: dorny/paths-filter@v2 - uses: dorny/paths-filter@v2
id: filter id: filter
with: with:
@@ -156,20 +153,21 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- name: Cache pnpm modules - name: Cache pnpm modules
uses: actions/cache@v6 uses: actions/cache@v4
with: with:
path: ~/.pnpm-store path: ~/.pnpm-store
key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
${{ runner.os }}- ${{ runner.os }}-
- uses: actions/setup-node@v7 - uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
- uses: pnpm/action-setup@v6 - uses: pnpm/action-setup@v4
with: with:
version: 10.x.x
run_install: true run_install: true
- name: build api - name: build api
+1 -4
View File
@@ -11,14 +11,11 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: read
jobs: jobs:
check: check:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- uses: dorny/paths-filter@v2 - uses: dorny/paths-filter@v2
id: filter id: filter
with: with:
+1 -4
View File
@@ -5,15 +5,12 @@
name: covector status name: covector status
on: [pull_request] on: [pull_request]
permissions:
contents: read
jobs: jobs:
covector: covector:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 # required for use of git history fetch-depth: 0 # required for use of git history
- name: covector status - name: covector status
@@ -28,17 +28,18 @@ jobs:
successfulPublish: ${{ steps.covector.outputs.successfulPublish }} successfulPublish: ${{ steps.covector.outputs.successfulPublish }}
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 # required for use of git history fetch-depth: 0 # required for use of git history
- uses: actions/setup-node@v7 - uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
registry-url: 'https://registry.npmjs.org' registry-url: 'https://registry.npmjs.org'
- uses: pnpm/action-setup@v6 - uses: pnpm/action-setup@v4
with: with:
version: 10.x.x
run_install: true run_install: true
- name: cargo login - name: cargo login
@@ -73,7 +74,7 @@ jobs:
- name: Create Pull Request With Versions Bumped - name: Create Pull Request With Versions Bumped
id: cpr id: cpr
uses: peter-evans/create-pull-request@v8.1.1 uses: peter-evans/create-pull-request@dd2324fc52d5d43c699a5636bcf19fceaa70c284 # 7.0.7
if: steps.covector.outputs.commandRan == 'version' if: steps.covector.outputs.commandRan == 'version'
with: with:
title: 'Publish New Versions (${{ github.ref_name }})' title: 'Publish New Versions (${{ github.ref_name }})'
+7 -9
View File
@@ -7,15 +7,12 @@ name: check formatting
on: on:
pull_request: pull_request:
permissions:
contents: read
jobs: jobs:
rustfmt: rustfmt:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- name: install Rust stable and rustfmt - name: install Rust stable and rustfmt
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@stable
@@ -28,19 +25,20 @@ jobs:
prettier: prettier:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- name: Cache pnpm modules - name: Cache pnpm modules
uses: actions/cache@v6 uses: actions/cache@v4
with: with:
path: ~/.pnpm-store path: ~/.pnpm-store
key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
${{ runner.os }}- ${{ runner.os }}-
- uses: actions/setup-node@v7 - uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
- uses: pnpm/action-setup@v6 - uses: pnpm/action-setup@v4
with: with:
version: 10.x.x
run_install: true run_install: true
- run: pnpm format:check - run: pnpm format:check
@@ -48,7 +46,7 @@ jobs:
name: taplo (.toml files) name: taplo (.toml files)
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- name: install Rust stable - name: install Rust stable
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@stable
+1 -4
View File
@@ -21,9 +21,6 @@ on:
- '.github/workflows/integration-tests.yml' - '.github/workflows/integration-tests.yml'
- 'plugins/updater/src/**' - 'plugins/updater/src/**'
permissions:
contents: read
jobs: jobs:
run-integration-tests: run-integration-tests:
runs-on: ${{ matrix.platform }} runs-on: ${{ matrix.platform }}
@@ -34,7 +31,7 @@ jobs:
platform: [ubuntu-22.04, macos-latest, windows-latest] platform: [ubuntu-22.04, macos-latest, windows-latest]
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
+5 -7
View File
@@ -32,26 +32,24 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: read
jobs: jobs:
eslint: eslint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- name: Cache pnpm modules - name: Cache pnpm modules
uses: actions/cache@v6 uses: actions/cache@v4
with: with:
path: ~/.pnpm-store path: ~/.pnpm-store
key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
${{ runner.os }}- ${{ runner.os }}-
- uses: actions/setup-node@v7 - uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
- uses: pnpm/action-setup@v6 - uses: pnpm/action-setup@v4
with: with:
version: 10.x.x
run_install: true run_install: true
- name: eslint - name: eslint
run: pnpm lint run: pnpm lint
+2 -5
View File
@@ -28,9 +28,6 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: read
jobs: jobs:
changes: changes:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -39,7 +36,7 @@ jobs:
outputs: outputs:
packages: ${{ steps.filter.outputs.changes }} packages: ${{ steps.filter.outputs.changes }}
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- uses: dorny/paths-filter@v2 - uses: dorny/paths-filter@v2
id: filter id: filter
with: with:
@@ -139,7 +136,7 @@ jobs:
package: ${{ fromJSON(needs.changes.outputs.packages) }} package: ${{ fromJSON(needs.changes.outputs.packages) }}
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- name: install webkit2gtk - name: install webkit2gtk
run: | run: |
+5 -7
View File
@@ -15,32 +15,30 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: read
jobs: jobs:
sync-to-mirrors: sync-to-mirrors:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- name: Fetch git tags - name: Fetch git tags
run: git fetch origin 'refs/tags/*:refs/tags/*' run: git fetch origin 'refs/tags/*:refs/tags/*'
- name: Cache pnpm modules - name: Cache pnpm modules
uses: actions/cache@v6 uses: actions/cache@v4
with: with:
path: ~/.pnpm-store path: ~/.pnpm-store
key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
${{ runner.os }}- ${{ runner.os }}-
- uses: actions/setup-node@v7 - uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
- uses: pnpm/action-setup@v6 - uses: pnpm/action-setup@v4
with: with:
version: 10.x.x
run_install: true run_install: true
- name: Build packages - name: Build packages
-79
View File
@@ -1,79 +0,0 @@
# Copyright 2019-2023 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT
name: test android
on:
pull_request:
paths:
- '.github/workflows/test-android.yml'
- '**/android/**'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
test:
runs-on: ${{ matrix.platform }}
strategy:
fail-fast: false
matrix:
platform: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@1.77.2
- uses: actions/setup-node@v7
with:
node-version: 'lts/*'
- uses: pnpm/action-setup@v6
with:
run_install: true
- uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 21
cache: gradle
- name: Setup NDK
uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: r25
local-cache: true
# TODO check after https://github.com/nttld/setup-ndk/issues/518 is fixed
- name: Restore Android Symlinks
if: matrix.platform == 'ubuntu-latest' || matrix.platform == 'macos-latest'
env:
NDK_HOST: ${{ matrix.platform == 'ubuntu-latest' && 'linux-x86_64' || 'darwin-x86_64' }}
run: |
directory="${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/$NDK_HOST/bin"
find "$directory" -type l | while read link; do
current_target=$(readlink "$link")
new_target="$directory/$(basename "$current_target")"
ln -sf "$new_target" "$link"
echo "Changed $(basename "$link") from $current_target to $new_target"
done
- uses: Swatinem/rust-cache@v2
- name: build API
run: pnpm build
- name: build APK
working-directory: ./examples/api
run: pnpm tauri android build
env:
NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
+2 -5
View File
@@ -30,9 +30,6 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: read
jobs: jobs:
changes: changes:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -41,7 +38,7 @@ jobs:
outputs: outputs:
packages: ${{ steps.filter.outputs.changes }} packages: ${{ steps.filter.outputs.changes }}
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- uses: dorny/paths-filter@v2 - uses: dorny/paths-filter@v2
id: filter id: filter
with: with:
@@ -228,7 +225,7 @@ jobs:
runs-on: ${{ matrix.platform.os }} runs-on: ${{ matrix.platform.os }}
steps: steps:
- uses: actions/checkout@v7 - uses: actions/checkout@v4
- name: install webkit2gtk - name: install webkit2gtk
if: contains(matrix.platform.target, 'unknown-linux') if: contains(matrix.platform.target, 'unknown-linux')
Generated
+65 -55
View File
@@ -201,13 +201,13 @@ dependencies = [
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.103" version = "1.0.98"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
[[package]] [[package]]
name = "api" name = "api"
version = "2.0.47" version = "2.0.44"
dependencies = [ dependencies = [
"log", "log",
"serde", "serde",
@@ -300,7 +300,7 @@ dependencies = [
"objc2-foundation 0.3.0", "objc2-foundation 0.3.0",
"parking_lot", "parking_lot",
"percent-encoding", "percent-encoding",
"windows-sys 0.59.0", "windows-sys 0.52.0",
"wl-clipboard-rs", "wl-clipboard-rs",
"x11rb", "x11rb",
] ]
@@ -1041,7 +1041,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"windows-sys 0.59.0", "windows-sys 0.48.0",
] ]
[[package]] [[package]]
@@ -1862,7 +1862,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@@ -2551,9 +2551,9 @@ dependencies = [
[[package]] [[package]]
name = "h2" name = "h2"
version = "0.4.19" version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633"
dependencies = [ dependencies = [
"atomic-waker", "atomic-waker",
"bytes", "bytes",
@@ -3463,6 +3463,9 @@ name = "log"
version = "0.4.27" version = "0.4.27"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
dependencies = [
"value-bag",
]
[[package]] [[package]]
name = "lru-slab" name = "lru-slab"
@@ -4717,7 +4720,7 @@ dependencies = [
"once_cell", "once_cell",
"socket2", "socket2",
"tracing", "tracing",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@@ -5167,7 +5170,7 @@ dependencies = [
"errno", "errno",
"libc", "libc",
"linux-raw-sys 0.4.15", "linux-raw-sys 0.4.15",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@@ -5180,7 +5183,7 @@ dependencies = [
"errno", "errno",
"libc", "libc",
"linux-raw-sys 0.11.0", "linux-raw-sys 0.11.0",
"windows-sys 0.60.2", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@@ -5237,7 +5240,7 @@ dependencies = [
"security-framework 3.5.1", "security-framework 3.5.1",
"security-framework-sys", "security-framework-sys",
"webpki-root-certs", "webpki-root-certs",
"windows-sys 0.60.2", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@@ -6309,9 +6312,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
[[package]] [[package]]
name = "tauri" name = "tauri"
version = "2.11.5" version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5" checksum = "b93bd86d231f0a8138f11a02a584769fe4b703dc36ae133d783228dbc4801405"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bytes", "bytes",
@@ -6364,9 +6367,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-build" name = "tauri-build"
version = "2.6.3" version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632" checksum = "3a318b234cc2dea65f575467bafcfb76286bce228ebc3778e337d61d03213007"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cargo_toml", "cargo_toml",
@@ -6387,9 +6390,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-codegen" name = "tauri-codegen"
version = "2.6.3" version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5" checksum = "6bd11644962add2549a60b7e7c6800f17d7020156e02f516021d8103e80cc528"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"ico", "ico",
@@ -6413,9 +6416,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-macros" name = "tauri-macros"
version = "2.6.3" version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45" checksum = "fed9d3742a37a355d2e47c9af924e9fbc112abb76f9835d35d4780e318419502"
dependencies = [ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
@@ -6455,7 +6458,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-barcode-scanner" name = "tauri-plugin-barcode-scanner"
version = "2.4.6" version = "2.4.5"
dependencies = [ dependencies = [
"log", "log",
"serde", "serde",
@@ -6467,7 +6470,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-biometric" name = "tauri-plugin-biometric"
version = "2.3.3" version = "2.3.2"
dependencies = [ dependencies = [
"log", "log",
"serde", "serde",
@@ -6493,7 +6496,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-clipboard-manager" name = "tauri-plugin-clipboard-manager"
version = "2.3.3" version = "2.3.2"
dependencies = [ dependencies = [
"arboard", "arboard",
"log", "log",
@@ -6506,7 +6509,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-deep-link" name = "tauri-plugin-deep-link"
version = "2.4.10" version = "2.4.9"
dependencies = [ dependencies = [
"dunce", "dunce",
"plist", "plist",
@@ -6525,7 +6528,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-dialog" name = "tauri-plugin-dialog"
version = "2.7.3" version = "2.7.1"
dependencies = [ dependencies = [
"log", "log",
"raw-window-handle", "raw-window-handle",
@@ -6541,7 +6544,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-fs" name = "tauri-plugin-fs"
version = "2.5.2" version = "2.5.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"dunce", "dunce",
@@ -6565,7 +6568,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-geolocation" name = "tauri-plugin-geolocation"
version = "2.3.3" version = "2.3.2"
dependencies = [ dependencies = [
"log", "log",
"serde", "serde",
@@ -6591,7 +6594,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-haptics" name = "tauri-plugin-haptics"
version = "2.3.3" version = "2.3.2"
dependencies = [ dependencies = [
"log", "log",
"serde", "serde",
@@ -6604,7 +6607,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-http" name = "tauri-plugin-http"
version = "2.6.0" version = "2.5.9"
dependencies = [ dependencies = [
"bytes", "bytes",
"cookie_store", "cookie_store",
@@ -6640,7 +6643,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-log" name = "tauri-plugin-log"
version = "2.9.1" version = "2.8.0"
dependencies = [ dependencies = [
"android_logger", "android_logger",
"fern", "fern",
@@ -6660,7 +6663,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-nfc" name = "tauri-plugin-nfc"
version = "2.3.6" version = "2.3.5"
dependencies = [ dependencies = [
"log", "log",
"serde", "serde",
@@ -6673,7 +6676,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-notification" name = "tauri-plugin-notification"
version = "2.4.0" version = "2.3.3"
dependencies = [ dependencies = [
"log", "log",
"notify-rust", "notify-rust",
@@ -6692,7 +6695,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-opener" name = "tauri-plugin-opener"
version = "2.5.5" version = "2.5.4"
dependencies = [ dependencies = [
"dunce", "dunce",
"glob", "glob",
@@ -6728,7 +6731,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-persisted-scope" name = "tauri-plugin-persisted-scope"
version = "2.3.8" version = "2.3.7"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"bincode", "bincode",
@@ -6742,7 +6745,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-positioner" name = "tauri-plugin-positioner"
version = "2.3.4" version = "2.3.2"
dependencies = [ dependencies = [
"log", "log",
"serde", "serde",
@@ -6763,7 +6766,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-shell" name = "tauri-plugin-shell"
version = "2.3.6" version = "2.3.5"
dependencies = [ dependencies = [
"encoding_rs", "encoding_rs",
"log", "log",
@@ -6782,7 +6785,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-single-instance" name = "tauri-plugin-single-instance"
version = "2.4.4" version = "2.4.2"
dependencies = [ dependencies = [
"semver", "semver",
"serde", "serde",
@@ -6798,7 +6801,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-sql" name = "tauri-plugin-sql"
version = "2.4.1" version = "2.4.0"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"indexmap 2.11.4", "indexmap 2.11.4",
@@ -6817,7 +6820,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-store" name = "tauri-plugin-store"
version = "2.4.4" version = "2.4.3"
dependencies = [ dependencies = [
"dunce", "dunce",
"serde", "serde",
@@ -6831,7 +6834,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-stronghold" name = "tauri-plugin-stronghold"
version = "2.3.2" version = "2.3.1"
dependencies = [ dependencies = [
"hex", "hex",
"iota-crypto", "iota-crypto",
@@ -6852,7 +6855,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-updater" name = "tauri-plugin-updater"
version = "2.11.0" version = "2.10.1"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"dirs 6.0.0", "dirs 6.0.0",
@@ -6883,7 +6886,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-upload" name = "tauri-plugin-upload"
version = "2.4.1" version = "2.4.0"
dependencies = [ dependencies = [
"futures-util", "futures-util",
"log", "log",
@@ -6901,7 +6904,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-websocket" name = "tauri-plugin-websocket"
version = "2.4.3" version = "2.4.2"
dependencies = [ dependencies = [
"futures-util", "futures-util",
"http", "http",
@@ -6932,9 +6935,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-runtime" name = "tauri-runtime"
version = "2.11.3" version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8" checksum = "8fef478ba1d2ac21c2d528740b24d0cb315e1e8b1111aae53fafac34804371fc"
dependencies = [ dependencies = [
"cookie", "cookie",
"dpi", "dpi",
@@ -6957,9 +6960,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-runtime-wry" name = "tauri-runtime-wry"
version = "2.11.4" version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f" checksum = "a3989df2ae1c476404fe0a2e8ffc4cfbde97e51efd613c2bb5355fbc9ab52cf0"
dependencies = [ dependencies = [
"gtk", "gtk",
"http", "http",
@@ -6983,9 +6986,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-utils" name = "tauri-utils"
version = "2.9.3" version = "2.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" checksum = "d57200389a2f82b4b0a40ae29ca19b6978116e8f4d4e974c3234ce40c0ffbdec"
dependencies = [ dependencies = [
"aes-gcm", "aes-gcm",
"anyhow", "anyhow",
@@ -7033,10 +7036,11 @@ dependencies = [
[[package]] [[package]]
name = "tauri-winrt-notification" name = "tauri-winrt-notification"
version = "0.7.3" version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed071c670382e85fc2f48ae706492d8c338f4f89bf72520d32f8abfe880aade" checksum = "0b1e66e07de489fe43a46678dd0b8df65e0c973909df1b60ba33874e297ba9b9"
dependencies = [ dependencies = [
"quick-xml 0.37.4",
"thiserror 2.0.12", "thiserror 2.0.12",
"windows 0.61.1", "windows 0.61.1",
"windows-version", "windows-version",
@@ -7052,7 +7056,7 @@ dependencies = [
"getrandom 0.3.2", "getrandom 0.3.2",
"once_cell", "once_cell",
"rustix 1.1.3", "rustix 1.1.3",
"windows-sys 0.60.2", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@@ -7467,9 +7471,9 @@ dependencies = [
[[package]] [[package]]
name = "tray-icon" name = "tray-icon"
version = "0.24.1" version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65ba1e5f6b9ef9fd87e21b9c6f351554dbd717960089168fcfdef854686961dc" checksum = "15edbb0d80583e85ee8df283410038e17314df5cba30da2087a54a85216c0773"
dependencies = [ dependencies = [
"crossbeam-channel", "crossbeam-channel",
"dirs 6.0.0", "dirs 6.0.0",
@@ -7741,6 +7745,12 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "value-bag"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5"
[[package]] [[package]]
name = "vcpkg" name = "vcpkg"
version = "0.2.15" version = "0.2.15"
@@ -8186,7 +8196,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [ dependencies = [
"windows-sys 0.59.0", "windows-sys 0.48.0",
] ]
[[package]] [[package]]
+1 -1
View File
@@ -11,7 +11,7 @@ resolver = "2"
[workspace.dependencies] [workspace.dependencies]
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
tracing = "0.1" tracing = "0.1"
log = "0.4.21" log = "0.4"
tauri = { version = "2.10", default-features = false } tauri = { version = "2.10", default-features = false }
tauri-build = "2.5" tauri-build = "2.5"
tauri-plugin = "2.5" tauri-plugin = "2.5"
-30
View File
@@ -1,35 +1,5 @@
# Changelog # Changelog
## [2.0.43]
### Dependencies
- Upgraded to `barcode-scanner-js@2.4.6`
- Upgraded to `biometric-js@2.3.3`
- Upgraded to `clipboard-manager-js@2.3.3`
- Upgraded to `dialog-js@2.7.3`
- Upgraded to `fs-js@2.5.2`
- Upgraded to `nfc-js@2.3.6`
- Upgraded to `notification-js@2.4.0`
- Upgraded to `opener-js@2.5.5`
- Upgraded to `shell-js@2.3.6`
- Upgraded to `http-js@2.6.0`
- Upgraded to `log-js@2.9.1`
- Upgraded to `updater-js@2.11.0`
## \[2.0.42]
### Dependencies
- Upgraded to `dialog-js@2.7.2`
- Upgraded to `store-js@2.4.4`
## \[2.0.41]
### Dependencies
- Upgraded to `log-js@2.9.0`
## \[2.0.40] ## \[2.0.40]
### Dependencies ### Dependencies
+2 -3
View File
@@ -1,13 +1,12 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en" theme="dark">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta <meta
name="viewport" name="viewport"
content="width=device-width, initial-scale=1.0, viewport-fit=cover, user-scalable=0" content="width=device-width, initial-scale=1.0, viewport-fit=cover, user-scalable=0"
/> />
<meta name="color-scheme" content="dark light" /> <title>Svelte + Vite App</title>
<title>API Example App</title>
</head> </head>
<body> <body>
+24 -24
View File
@@ -1,7 +1,7 @@
{ {
"name": "api", "name": "api",
"private": true, "private": true,
"version": "2.0.43", "version": "2.0.40",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite --clearScreen false", "dev": "vite --clearScreen false",
@@ -11,35 +11,35 @@
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2.11.0", "@tauri-apps/api": "^2.11.0",
"@tauri-apps/plugin-barcode-scanner": "workspace:*", "@tauri-apps/plugin-barcode-scanner": "^2.4.5",
"@tauri-apps/plugin-biometric": "workspace:*", "@tauri-apps/plugin-biometric": "^2.3.2",
"@tauri-apps/plugin-cli": "workspace:*", "@tauri-apps/plugin-cli": "^2.4.1",
"@tauri-apps/plugin-clipboard-manager": "workspace:*", "@tauri-apps/plugin-clipboard-manager": "^2.3.2",
"@tauri-apps/plugin-dialog": "workspace:*", "@tauri-apps/plugin-dialog": "^2.7.1",
"@tauri-apps/plugin-fs": "workspace:*", "@tauri-apps/plugin-fs": "^2.5.1",
"@tauri-apps/plugin-geolocation": "workspace:*", "@tauri-apps/plugin-geolocation": "^2.3.2",
"@tauri-apps/plugin-global-shortcut": "workspace:*", "@tauri-apps/plugin-global-shortcut": "^2.3.2",
"@tauri-apps/plugin-haptics": "workspace:*", "@tauri-apps/plugin-haptics": "^2.3.2",
"@tauri-apps/plugin-http": "workspace:*", "@tauri-apps/plugin-http": "^2.5.9",
"@tauri-apps/plugin-nfc": "workspace:*", "@tauri-apps/plugin-nfc": "^2.3.5",
"@tauri-apps/plugin-notification": "workspace:*", "@tauri-apps/plugin-notification": "^2.3.3",
"@tauri-apps/plugin-opener": "workspace:*", "@tauri-apps/plugin-opener": "^2.5.4",
"@tauri-apps/plugin-os": "workspace:*", "@tauri-apps/plugin-os": "^2.3.2",
"@tauri-apps/plugin-process": "workspace:*", "@tauri-apps/plugin-process": "^2.3.1",
"@tauri-apps/plugin-shell": "workspace:*", "@tauri-apps/plugin-shell": "^2.3.5",
"@tauri-apps/plugin-store": "workspace:*", "@tauri-apps/plugin-store": "^2.4.3",
"@tauri-apps/plugin-updater": "workspace:*", "@tauri-apps/plugin-updater": "^2.10.1",
"@tauri-apps/plugin-upload": "workspace:*", "@tauri-apps/plugin-upload": "^2.4.0",
"@zerodevx/svelte-json-view": "2.0.0" "@zerodevx/svelte-json-view": "1.0.11"
}, },
"devDependencies": { "devDependencies": {
"@iconify-json/codicon": "^1.2.49", "@iconify-json/codicon": "^1.2.49",
"@iconify-json/ph": "^1.2.2", "@iconify-json/ph": "^1.2.2",
"@sveltejs/vite-plugin-svelte": "^7.0.0", "@sveltejs/vite-plugin-svelte": "^7.0.0",
"@tauri-apps/cli": "2.11.4", "@tauri-apps/cli": "2.11.2",
"@unocss/extractor-svelte": "^66.6.7", "@unocss/extractor-svelte": "^66.6.7",
"svelte": "^5.55.7", "svelte": "^5.54.0",
"unocss": "^66.6.7", "unocss": "^66.6.7",
"vite": "^8.0.16" "vite": "^8.0.1"
} }
} }
-32
View File
@@ -1,37 +1,5 @@
# Changelog # Changelog
## [2.0.47]
### Dependencies
- Upgraded to `barcode-scanner@2.4.6`
- Upgraded to `biometric@2.3.3`
- Upgraded to `clipboard-manager@2.3.3`
- Upgraded to `dialog@2.7.3`
- Upgraded to `fs@2.5.2`
- Upgraded to `geolocation@2.3.3`
- Upgraded to `haptics@2.3.3`
- Upgraded to `nfc@2.3.6`
- Upgraded to `notification@2.4.0`
- Upgraded to `opener@2.5.5`
- Upgraded to `shell@2.3.6`
- Upgraded to `http@2.6.0`
- Upgraded to `log@2.9.1`
- Upgraded to `updater@2.11.0`
## \[2.0.46]
### Dependencies
- Upgraded to `dialog@2.7.2`
- Upgraded to `store@2.4.4`
## \[2.0.45]
### Dependencies
- Upgraded to `log@2.9.0`
## \[2.0.44] ## \[2.0.44]
### Dependencies ### Dependencies
+19 -16
View File
@@ -1,7 +1,7 @@
[package] [package]
name = "api" name = "api"
publish = false publish = false
version = "2.0.47" version = "2.0.44"
description = "An example Tauri Application showcasing the api" description = "An example Tauri Application showcasing the api"
edition = "2021" edition = "2021"
rust-version = { workspace = true } rust-version = { workspace = true }
@@ -20,24 +20,24 @@ serde = { workspace = true }
tiny_http = "0.12" tiny_http = "0.12"
time = "0.3" time = "0.3"
log = { workspace = true } log = { workspace = true }
tauri-plugin-log = { path = "../../../plugins/log", version = "2.9.1" } tauri-plugin-log = { path = "../../../plugins/log", version = "2.8.0" }
tauri-plugin-fs = { path = "../../../plugins/fs", version = "2.5.2", features = [ tauri-plugin-fs = { path = "../../../plugins/fs", version = "2.5.1", features = [
"watch", "watch",
] } ] }
tauri-plugin-clipboard-manager = { path = "../../../plugins/clipboard-manager", version = "2.3.3" } tauri-plugin-clipboard-manager = { path = "../../../plugins/clipboard-manager", version = "2.3.2" }
tauri-plugin-dialog = { path = "../../../plugins/dialog", version = "2.7.3" } tauri-plugin-dialog = { path = "../../../plugins/dialog", version = "2.7.1" }
tauri-plugin-http = { path = "../../../plugins/http", features = [ tauri-plugin-http = { path = "../../../plugins/http", features = [
"multipart", "multipart",
"cookies", "cookies",
], version = "2.6.0" } ], version = "2.5.9" }
tauri-plugin-notification = { path = "../../../plugins/notification", version = "2.4.0", features = [ tauri-plugin-notification = { path = "../../../plugins/notification", version = "2.3.3", features = [
"windows7-compat", "windows7-compat",
] } ] }
tauri-plugin-os = { path = "../../../plugins/os", version = "2.3.2" } tauri-plugin-os = { path = "../../../plugins/os", version = "2.3.2" }
tauri-plugin-process = { path = "../../../plugins/process", version = "2.3.1" } tauri-plugin-process = { path = "../../../plugins/process", version = "2.3.1" }
tauri-plugin-opener = { path = "../../../plugins/opener", version = "2.5.5" } tauri-plugin-opener = { path = "../../../plugins/opener", version = "2.5.4" }
tauri-plugin-shell = { path = "../../../plugins/shell", version = "2.3.6" } tauri-plugin-shell = { path = "../../../plugins/shell", version = "2.3.5" }
tauri-plugin-store = { path = "../../../plugins/store", version = "2.4.4" } tauri-plugin-store = { path = "../../../plugins/store", version = "2.4.3" }
tauri-plugin-upload = { path = "../../../plugins/upload", version = "2.3.0" } tauri-plugin-upload = { path = "../../../plugins/upload", version = "2.3.0" }
[dependencies.tauri] [dependencies.tauri]
@@ -57,12 +57,15 @@ features = [
[target."cfg(any(target_os = \"macos\", windows, target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\"))".dependencies] [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.4.1" } tauri-plugin-cli = { path = "../../../plugins/cli", version = "2.4.1" }
tauri-plugin-global-shortcut = { path = "../../../plugins/global-shortcut", version = "2.3.2" } tauri-plugin-global-shortcut = { path = "../../../plugins/global-shortcut", version = "2.3.2" }
tauri-plugin-updater = { path = "../../../plugins/updater", version = "2.11.0" } tauri-plugin-updater = { path = "../../../plugins/updater", version = "2.10.1" }
tauri-plugin-window-state = { path = "../../../plugins/window-state", version = "2.2.0" } tauri-plugin-window-state = { path = "../../../plugins/window-state", version = "2.2.0" }
[target."cfg(any(target_os = \"android\", target_os = \"ios\"))".dependencies] [target."cfg(any(target_os = \"android\", target_os = \"ios\"))".dependencies]
tauri-plugin-barcode-scanner = { path = "../../../plugins/barcode-scanner/", version = "2.4.6" } tauri-plugin-barcode-scanner = { path = "../../../plugins/barcode-scanner/", version = "2.4.5" }
tauri-plugin-nfc = { path = "../../../plugins/nfc", version = "2.3.6" } tauri-plugin-nfc = { path = "../../../plugins/nfc", version = "2.3.5" }
tauri-plugin-biometric = { path = "../../../plugins/biometric/", version = "2.3.3" } tauri-plugin-biometric = { path = "../../../plugins/biometric/", version = "2.3.2" }
tauri-plugin-geolocation = { path = "../../../plugins/geolocation/", version = "2.3.3" } tauri-plugin-geolocation = { path = "../../../plugins/geolocation/", version = "2.3.2" }
tauri-plugin-haptics = { path = "../../../plugins/haptics/", version = "2.3.3" } tauri-plugin-haptics = { path = "../../../plugins/haptics/", version = "2.3.2" }
[features]
prod = ["tauri/custom-protocol"]
@@ -15,9 +15,10 @@
] ]
}, },
"core:default", "core:default",
"core:app:allow-set-app-theme", "fs:default",
"core:window:allow-minimize", "core:window:allow-minimize",
"core:window:allow-toggle-maximize", "core:window:allow-maximize",
"core:window:allow-unmaximize",
"core:window:allow-close", "core:window:allow-close",
"core:window:allow-start-dragging", "core:window:allow-start-dragging",
"notification:default", "notification:default",
@@ -57,15 +58,17 @@
"clipboard-manager:allow-write-text", "clipboard-manager:allow-write-text",
"clipboard-manager:allow-read-image", "clipboard-manager:allow-read-image",
"clipboard-manager:allow-write-image", "clipboard-manager:allow-write-image",
"fs:default",
"fs:read-meta",
"fs:allow-open", "fs:allow-open",
"fs:allow-write", "fs:allow-write",
"fs:allow-read", "fs:allow-read",
"fs:allow-rename", "fs:allow-rename",
"fs:allow-mkdir", "fs:allow-mkdir",
"fs:allow-remove", "fs:allow-remove",
"fs:allow-stat",
"fs:allow-fstat",
"fs:allow-lstat",
"fs:allow-write-text-file", "fs:allow-write-text-file",
"fs:read-meta",
"fs:scope-download-recursive", "fs:scope-download-recursive",
"fs:scope-resource-recursive", "fs:scope-resource-recursive",
{ {
@@ -10,6 +10,7 @@
"global-shortcut:allow-unregister", "global-shortcut:allow-unregister",
"global-shortcut:allow-register", "global-shortcut:allow-register",
"global-shortcut:allow-unregister-all", "global-shortcut:allow-unregister-all",
{ "identifier": "fs:allow-watch", "allow": ["*", "**/*"] } { "identifier": "fs:allow-watch", "allow": ["*", "**/*"] },
"fs:allow-unwatch"
] ]
} }
@@ -1,11 +1,3 @@
package com.tauri.api package com.tauri.api
import android.os.Bundle class MainActivity : TauriActivity()
import androidx.activity.enableEdgeToEdge
class MainActivity : TauriActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
}
}
@@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="Theme.api" parent="Theme.Material3.DayNight.NoActionBar"> <style name="Theme.api" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
</resources> </resources>
@@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="Theme.api" parent="Theme.Material3.DayNight.NoActionBar"> <style name="Theme.api" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
</resources> </resources>
@@ -21,23 +21,7 @@ open class BuildTask : DefaultTask() {
runTauriCli(executable) runTauriCli(executable)
} catch (e: Exception) { } catch (e: Exception) {
if (Os.isFamily(Os.FAMILY_WINDOWS)) { if (Os.isFamily(Os.FAMILY_WINDOWS)) {
// Try different Windows-specific extensions runTauriCli("$executable.cmd")
val fallbacks = listOf(
"$executable.exe",
"$executable.cmd",
"$executable.bat",
)
var lastException: Exception = e
for (fallback in fallbacks) {
try {
runTauriCli(fallback)
return
} catch (fallbackException: Exception) {
lastException = fallbackException
}
}
throw lastException
} else { } else {
throw e; throw e;
} }
@@ -1,6 +1,6 @@
#Tue May 10 19:22:52 CST 2022 #Tue May 10 19:22:52 CST 2022
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
-5
View File
@@ -77,9 +77,7 @@
}, },
"updater": { "updater": {
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDE5QzMxNjYwNTM5OEUwNTgKUldSWTRKaFRZQmJER1h4d1ZMYVA3dnluSjdpN2RmMldJR09hUFFlZDY0SlFqckkvRUJhZDJVZXAK", "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDE5QzMxNjYwNTM5OEUwNTgKUldSWTRKaFRZQmJER1h4d1ZMYVA3dnluSjdpN2RmMldJR09hUFFlZDY0SlFqckkvRUJhZDJVZXAK",
"dangerousInsecureTransportProtocol": true,
"endpoints": [ "endpoints": [
"http://localhost:5173/updater-test/updater.json",
"https://tauri-update-server.vercel.app/update/{{target}}/{{current_version}}" "https://tauri-update-server.vercel.app/update/{{target}}/{{current_version}}"
] ]
} }
@@ -101,9 +99,6 @@
"localePath": "locales/pt-BR.wxl" "localePath": "locales/pt-BR.wxl"
} }
} }
},
"nsis": {
"compression": "none"
} }
}, },
"iOS": { "iOS": {
+202 -135
View File
@@ -1,16 +1,7 @@
<script module lang="ts"> <script>
export type ViewProps = {
onMessage: (value: unknown) => void
}
</script>
<script lang="ts">
import { onMount, tick } from 'svelte'
import { writable } from 'svelte/store' import { writable } from 'svelte/store'
import { MediaQuery } from 'svelte/reactivity' import { getCurrentWindow } from '@tauri-apps/api/window'
import { getCurrentWindow, type Theme } from '@tauri-apps/api/window'
import { getCurrentWebview } from '@tauri-apps/api/webview' import { getCurrentWebview } from '@tauri-apps/api/webview'
import { setTheme } from '@tauri-apps/api/app'
import * as os from '@tauri-apps/plugin-os' import * as os from '@tauri-apps/plugin-os'
import Welcome from './views/Welcome.svelte' import Welcome from './views/Welcome.svelte'
@@ -32,9 +23,10 @@
import Biometric from './views/Biometric.svelte' import Biometric from './views/Biometric.svelte'
import Geolocation from './views/Geolocation.svelte' import Geolocation from './views/Geolocation.svelte'
import Haptics from './views/Haptics.svelte' import Haptics from './views/Haptics.svelte'
import Nfc from './views/Nfc.svelte'
import TitleBar from './lib/TitleBar.svelte' import { onMount, tick } from 'svelte'
import { ask } from '@tauri-apps/plugin-dialog'
import Nfc from './views/Nfc.svelte'
const appWindow = getCurrentWindow() const appWindow = getCurrentWindow()
@@ -156,98 +148,114 @@
component: Haptics, component: Haptics,
icon: 'i-ph-vibrate' icon: 'i-ph-vibrate'
} }
].filter(Boolean) as { ]
label: string
component: typeof Haptics
icon: string
}[]
let selected = $state.raw(views[0])
// dark/light themes let selected = views[0]
const preferDark = new MediaQuery('prefers-color-scheme: dark') function select(view) {
let theme = $state<Theme | 'auto'>( selected = view
(localStorage.getItem('theme') as Theme | null) || 'auto'
)
async function switchTheme() {
switch (theme) {
case 'dark':
theme = 'light'
break
case 'light':
theme = 'auto'
break
case 'auto':
theme = 'dark'
break
}
applyTheme()
} }
function applyTheme() { // Window controls
const isDark = theme === 'auto' ? preferDark.current : theme === 'dark' let isWindowMaximized
if (isDark) { onMount(async () => {
document.documentElement.classList.add('dark') isWindowMaximized = await appWindow.isMaximized()
document.documentElement.classList.remove('light') appWindow.onResized(async () => {
} else { isWindowMaximized = await appWindow.isMaximized()
document.documentElement.classList.remove('dark') })
document.documentElement.classList.add('light')
}
setTheme(theme === 'auto' ? null : theme)
localStorage.setItem('theme', theme)
}
$effect(() => {
applyTheme()
}) })
// Console function minimize() {
const messages = writable<string[]>([]) appWindow.minimize()
let consoleTextEl: HTMLDivElement
// this function is renders HTML without sanitizing it so it's insecure
// we only use it with our own input data
async function insecureRenderHtml(html: string) {
messages.update((r) => [
...r,
`<pre><strong class="text-accent dark:text-darkAccent">[${new Date().toLocaleTimeString()}]:</strong> ${html}</pre>`
])
await tick()
consoleTextEl.scrollTop = consoleTextEl.scrollHeight
} }
async function onMessage(value: unknown) { async function toggleMaximize() {
const valueStr = ;(await appWindow.isMaximized())
typeof value === 'string' ? appWindow.unmaximize()
? value : appWindow.maximize()
: JSON.stringify( }
value instanceof ArrayBuffer
? Array.from(new Uint8Array(value)) let confirmed_close = false
: value, async function close() {
null, if (!confirmed_close) {
1 confirmed_close = await ask(
) 'Are you sure that you want to close this window?',
insecureRenderHtml(valueStr) {
title: 'Tauri API'
}
)
if (confirmed_close) {
appWindow.close()
}
}
}
// dark/light
let isDark
onMount(() => {
isDark = localStorage && localStorage.getItem('theme') == 'dark'
applyTheme(isDark)
})
function applyTheme(isDark) {
const html = document.querySelector('html')
isDark ? html.classList.add('dark') : html.classList.remove('dark')
localStorage && localStorage.setItem('theme', isDark ? 'dark' : '')
}
function toggleDark() {
isDark = !isDark
applyTheme(isDark)
}
// Console
let messages = writable([])
let consoleTextEl
async function onMessage(value) {
messages.update((r) => [
...r,
{
html:
`<pre><strong class="text-accent dark:text-darkAccent">[${new Date().toLocaleTimeString()}]:</strong> ` +
(typeof value === 'string' ? value : JSON.stringify(value, null, 1)) +
'</pre>'
}
])
await tick()
if (consoleTextEl) consoleTextEl.scrollTop = consoleTextEl.scrollHeight
}
// this function renders HTML without sanitizing it so it's insecure
// we only use it with our own input data
async function insecureRenderHtml(html) {
messages.update((r) => [
...r,
{
html:
`<pre><strong class="text-accent dark:text-darkAccent">[${new Date().toLocaleTimeString()}]:</strong> ` +
html +
'</pre>'
}
])
await tick()
if (consoleTextEl) consoleTextEl.scrollTop = consoleTextEl.scrollHeight
} }
function clear() { function clear() {
messages.update(() => []) messages.update(() => [])
} }
let consoleEl: HTMLDivElement let consoleEl, consoleH, cStartY
let consoleH = 0 let minConsoleHeight = 50
let cStartY = 0 function startResizingConsole(e) {
const minConsoleHeight = 50
function startResizingConsole(e: MouseEvent) {
cStartY = e.clientY cStartY = e.clientY
const styles = window.getComputedStyle(consoleEl) const styles = window.getComputedStyle(consoleEl)
consoleH = parseInt(styles.height, 10) consoleH = parseInt(styles.height, 10)
const moveHandler = (e: MouseEvent) => { const moveHandler = (e) => {
const dy = e.clientY - cStartY const dy = e.clientY - cStartY
const newH = consoleH - dy const newH = consoleH - dy
consoleEl.style.height = `${newH < minConsoleHeight ? minConsoleHeight : newH}px` consoleEl.style.height = `${
newH < minConsoleHeight ? minConsoleHeight : newH
}px`
} }
const upHandler = () => { const upHandler = () => {
document.removeEventListener('mouseup', upHandler) document.removeEventListener('mouseup', upHandler)
@@ -257,19 +265,21 @@
document.addEventListener('mousemove', moveHandler) document.addEventListener('mousemove', moveHandler)
} }
let isWindows = os.platform() === 'windows' let isWindows
onMount(async () => {
isWindows = (await os.platform()) === 'windows'
})
// mobile // mobile
let isSideBarOpen = $state(false) let isSideBarOpen = false
let sidebar: HTMLElement let sidebar
let sidebarToggle: HTMLElement let sidebarToggle
let isDraggingSideBar = false let isDraggingSideBar = false
let draggingStartPosX = 0 let draggingStartPosX = 0
let draggingEndPosX = 0 let draggingEndPosX = 0
const clamp = (min: number, num: number, max: number) => const clamp = (min, num, max) => Math.min(Math.max(num, min), max)
Math.min(Math.max(num, min), max)
function toggleSidebar() { function toggleSidebar(sidebar, isSideBarOpen) {
sidebar.style.setProperty( sidebar.style.setProperty(
'--translate-x', '--translate-x',
`${isSideBarOpen ? '0' : '-18.75'}rem` `${isSideBarOpen ? '0' : '-18.75'}rem`
@@ -277,9 +287,10 @@
} }
onMount(() => { onMount(() => {
document.addEventListener('click', (e) => { sidebar = document.querySelector('#sidebar')
if (!(e.target instanceof Node)) return sidebarToggle = document.querySelector('#sidebarToggle')
document.addEventListener('click', (e) => {
if (sidebarToggle.contains(e.target)) { if (sidebarToggle.contains(e.target)) {
isSideBarOpen = !isSideBarOpen isSideBarOpen = !isSideBarOpen
} else if (isSideBarOpen && !sidebar.contains(e.target)) { } else if (isSideBarOpen && !sidebar.contains(e.target)) {
@@ -288,7 +299,6 @@
}) })
document.addEventListener('touchstart', (e) => { document.addEventListener('touchstart', (e) => {
if (!(e.target instanceof Node)) return
if (sidebarToggle.contains(e.target)) return if (sidebarToggle.contains(e.target)) return
const x = e.touches[0].clientX const x = e.touches[0].clientX
@@ -320,22 +330,76 @@
}) })
}) })
$effect(() => { $: {
toggleSidebar() const sidebar = document.querySelector('#sidebar')
}) if (sidebar) {
toggleSidebar(sidebar, isSideBarOpen)
}
}
</script> </script>
<!-- custom titlebar for Windows --> <!-- custom titlebar for Windows -->
{#if isWindows} {#if isWindows}
<TitleBar {appWindow} {theme} {switchTheme} /> <div
class="w-screen select-none h-8 pl-2 flex justify-between items-center absolute text-primaryText dark:text-darkPrimaryText"
data-tauri-drag-region
>
<span class="lt-sm:pl-10 text-darkPrimaryText">Tauri API Validation</span>
<span
class="
h-100%
children:h-100% children:w-12 children:inline-flex
children:items-center children:justify-center"
>
<button
aria-label="Toggle dark mode"
title={isDark ? 'Switch to Light mode' : 'Switch to Dark mode'}
class="bg-inherit border-none hover:bg-hoverOverlay active:bg-hoverOverlayDarker dark:hover:bg-darkHoverOverlay dark:active:bg-darkHoverOverlayDarker"
on:click={toggleDark}
>
{#if isDark}
<div class="i-ph-sun"></div>
{:else}
<div class="i-ph-moon"></div>
{/if}
</button>
<button
aria-label="Minimize window"
title="Minimize"
class="bg-inherit border-none hover:bg-hoverOverlay active:bg-hoverOverlayDarker dark:hover:bg-darkHoverOverlay dark:active:bg-darkHoverOverlayDarker"
on:click={minimize}
>
<div class="i-codicon-chrome-minimize"></div>
</button>
<button
aria-label="Maximize window"
title={isWindowMaximized ? 'Restore' : 'Maximize'}
class="bg-inherit border-none hover:bg-hoverOverlay active:bg-hoverOverlayDarker dark:hover:bg-darkHoverOverlay dark:active:bg-darkHoverOverlayDarker"
on:click={toggleMaximize}
>
{#if isWindowMaximized}
<div class="i-codicon-chrome-restore"></div>
{:else}
<div class="i-codicon-chrome-maximize"></div>
{/if}
</button>
<button
aria-label="Close window"
title="Close"
class="bg-inherit border-none hover:bg-red-700 dark:hover:bg-red-700 hover:text-darkPrimaryText active:bg-red-700/90 dark:active:bg-red-700/90 active:text-darkPrimaryText"
on:click={close}
>
<div class="i-codicon-chrome-close"></div>
</button>
</span>
</div>
{/if} {/if}
<!-- Sidebar toggle, only visible on small screens --> <!-- Sidebar toggle, only visible on small screens -->
<div <div
id="sidebarToggle" id="sidebarToggle"
bind:this={sidebarToggle} class="z-2000 sidebar-toggle hidden lt-sm:flex justify-center absolute items-center w-8 h-8 rd-8
class="z-2000 hidden lt-sm:flex justify-center absolute items-center w-8 h-8 rd-8 bg-accent dark:bg-darkAccent active:bg-accentDark dark:active:bg-darkAccentDark"
bg-accent dark:bg-darkAccent active:bg-accentDark dark:active:bg-darkAccentDark text-accentText dark:text-darkAccentText"
> >
{#if isSideBarOpen} {#if isSideBarOpen}
<span class="i-codicon-close animate-duration-300ms animate-fade-in"></span> <span class="i-codicon-close animate-duration-300ms animate-fade-in"></span>
@@ -345,11 +409,10 @@
</div> </div>
<div <div
class="flex h-screen w-screen overflow-hidden text-primaryText dark:text-darkPrimaryText" class="flex h-screen w-screen overflow-hidden children-pt8 children-pb-2 text-primaryText dark:text-darkPrimaryText"
> >
<aside <aside
id="sidebar" id="sidebar"
bind:this={sidebar}
class="lt-sm:h-screen lt-sm:shadow-lg lt-sm:shadow lt-sm:transition-transform lt-sm:absolute lt-sm:z-1999 class="lt-sm:h-screen lt-sm:shadow-lg lt-sm:shadow lt-sm:transition-transform lt-sm:absolute lt-sm:z-1999
bg-darkPrimaryLighter transition-colors-250 overflow-hidden grid select-none px-2" bg-darkPrimaryLighter transition-colors-250 overflow-hidden grid select-none px-2"
> >
@@ -357,16 +420,13 @@
<img class="p-7" src="tauri_logo.png" alt="Tauri logo" /> <img class="p-7" src="tauri_logo.png" alt="Tauri logo" />
</a> </a>
{#if !isWindows} {#if !isWindows}
<a href="##" class="nv justify-between" onclick={switchTheme}> <a href="##" class="nv justify-between h-8" on:click={toggleDark}>
{#if theme === 'auto'} {#if isDark}
Switch to Dark mode
<div class="i-ph-circle-half-fill"></div>
{:else if theme === 'dark'}
Switch to Light mode Switch to Light mode
<div class="i-ph-moon"></div>
{:else if theme === 'light'}
Switch to Auto mode
<div class="i-ph-sun"></div> <div class="i-ph-sun"></div>
{:else}
Switch to Dark mode
<div class="i-ph-moon"></div>
{/if} {/if}
</a> </a>
<br /> <br />
@@ -375,7 +435,7 @@
{/if} {/if}
<a <a
class="nv justify-between" class="nv justify-between h-8"
target="_blank" target="_blank"
href="https://tauri.app/v1/guides/" href="https://tauri.app/v1/guides/"
> >
@@ -383,7 +443,7 @@
<span class="i-codicon-link-external"></span> <span class="i-codicon-link-external"></span>
</a> </a>
<a <a
class="nv justify-between" class="nv justify-between h-8"
target="_blank" target="_blank"
href="https://github.com/tauri-apps/tauri" href="https://github.com/tauri-apps/tauri"
> >
@@ -391,7 +451,7 @@
<span class="i-codicon-link-external"></span> <span class="i-codicon-link-external"></span>
</a> </a>
<a <a
class="nv justify-between" class="nv justify-between h-8"
target="_blank" target="_blank"
href="https://github.com/tauri-apps/tauri/tree/dev/examples/api" href="https://github.com/tauri-apps/tauri/tree/dev/examples/api"
> >
@@ -401,19 +461,23 @@
<br /> <br />
<div class="bg-white/5 h-2px"></div> <div class="bg-white/5 h-2px"></div>
<br /> <br />
<div class="flex flex-col overflow-y-auto children-flex-none gap-1"> <div
class="flex flex-col overflow-y-auto children-h-10 children-flex-none gap-1"
>
{#each views as view} {#each views as view}
<a {#if view}
href="##" <a
class="nv {selected === view ? 'nv_selected' : ''}" href="##"
onclick={() => { class="nv {selected === view ? 'nv_selected' : ''}"
selected = view on:click={() => {
isSideBarOpen = false select(view)
}} isSideBarOpen = false
> }}
<div class="{view.icon} mr-2"></div> >
<p>{view.label}</p></a <div class="{view.icon} mr-2"></div>
> <p>{view.label}</p></a
>
{/if}
{/each} {/each}
</div> </div>
</aside> </aside>
@@ -425,7 +489,11 @@
<h1>{selected.label}</h1> <h1>{selected.label}</h1>
<div class="overflow-y-auto"> <div class="overflow-y-auto">
<div class="mr-2"> <div class="mr-2">
<selected.component {onMessage} /> <svelte:component
this={selected.component}
{onMessage}
{insecureRenderHtml}
/>
</div> </div>
</div> </div>
</div> </div>
@@ -435,21 +503,20 @@
id="console" id="console"
class="select-none h-15rem grid grid-rows-[2px_2rem_1fr] gap-1 overflow-hidden" class="select-none h-15rem grid grid-rows-[2px_2rem_1fr] gap-1 overflow-hidden"
> >
<!-- svelte-ignore a11y_no_static_element_interactions -->
<div <div
role="button" on:mousedown={startResizingConsole}
tabindex="0"
onmousedown={startResizingConsole}
class="bg-black/20 h-2px cursor-ns-resize" class="bg-black/20 h-2px cursor-ns-resize"
></div> ></div>
<div class="flex justify-between items-center px-2"> <div class="flex justify-between items-center px-2">
<p class="font-semibold">Console</p> <p class="font-semibold">Console</p>
<button <button
aria-label="Clear Console" aria-label="Clear Console"
class="cursor-pointer h-85% rd-1 p-1 flex justify-center items-center border-none class="cursor-pointer h-85% rd-1 p-1 flex justify-center items-center border-none bg-inherit
hover:bg-hoverOverlay dark:hover:bg-darkHoverOverlay hover:bg-hoverOverlay dark:hover:bg-darkHoverOverlay
active:bg-hoverOverlay/25 dark:active:bg-darkHoverOverlay/25 active:bg-hoverOverlay/25 dark:active:bg-darkHoverOverlay/25
" "
onclick={clear} on:click={clear}
> >
<div class="i-codicon-clear-all"></div> <div class="i-codicon-clear-all"></div>
</button> </button>
@@ -458,8 +525,8 @@
bind:this={consoleTextEl} bind:this={consoleTextEl}
class="px-2 overflow-y-auto all:font-mono code-block all:text-xs select-text mr-2" class="px-2 overflow-y-auto all:font-mono code-block all:text-xs select-text mr-2"
> >
{#each $messages as messageHtml} {#each $messages as r}
{@html messageHtml} {@html r.html}
{/each} {/each}
</div> </div>
</div> </div>
+9 -32
View File
@@ -1,14 +1,3 @@
:root {
line-height: 1.5;
}
:root.dark {
color-scheme: dark;
}
:root.light {
color-scheme: light;
}
*:not(h1, h2, h3, h4, h5, h6) { *:not(h1, h2, h3, h4, h5, h6) {
margin: 0; margin: 0;
padding: 0; padding: 0;
@@ -19,11 +8,6 @@
font-family: 'Rubik', sans-serif; font-family: 'Rubik', sans-serif;
} }
button {
color: inherit;
background-color: inherit;
}
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 0.25rem; width: 0.25rem;
height: 3px; height: 3px;
@@ -49,34 +33,27 @@ code.code-block {
width: 18.75rem; width: 18.75rem;
} }
@media screen and (width < 640px) { @media screen and (max-width: 640px) {
#sidebar { #sidebar {
--translate-x: -18.75rem; --translate-x: -18.75rem;
transform: translateX(var(--translate-x)); transform: translateX(var(--translate-x));
} }
} }
#sidebar, .sidebar-toggle {
main { margin-top: 0.5rem;
padding-top: calc(env(safe-area-inset-top) + 2rem); margin-left: 0.5rem;
} }
#sidebar { body {
padding-left: calc(env(safe-area-inset-left) + 0.5rem); overflow: hidden;
} padding: env(safe-area-inset-top) env(safe-area-inset-right)
env(safe-area-inset-bottom) env(safe-area-inset-left);
main {
padding-right: env(safe-area-inset-right);
}
#sidebarToggle {
margin-top: calc(env(safe-area-inset-top) + 0.5rem);
margin-left: calc(env(safe-area-inset-left) + 0.5rem);
} }
#sidebar, #sidebar,
#console { #console {
padding-bottom: calc(env(safe-area-inset-bottom) + 1.5rem); padding-bottom: calc(env(safe-area-inset-bottom) + 24px);
} }
.transparent { .transparent {
-103
View File
@@ -1,103 +0,0 @@
<script lang="ts">
import type { Theme, Window } from '@tauri-apps/api/window'
import { ask } from '@tauri-apps/plugin-dialog'
import { onMount } from 'svelte'
let {
appWindow,
switchTheme,
theme
}: { appWindow: Window; switchTheme: () => void; theme: Theme | 'auto' } =
$props()
// Window controls
let isWindowMaximized = $state(false)
onMount(async () => {
isWindowMaximized = await appWindow.isMaximized()
appWindow.onResized(async () => {
isWindowMaximized = await appWindow.isMaximized()
})
})
async function minimize() {
await appWindow.minimize()
}
async function toggleMaximize() {
await appWindow.toggleMaximize()
}
let confirmedClose = false
async function close() {
if (!confirmedClose) {
confirmedClose = await ask(
'Are you sure that you want to close this window?',
{
title: 'Tauri API'
}
)
if (confirmedClose) {
appWindow.close()
}
}
}
</script>
<div
class="w-screen select-none h-8 flex justify-between items-center absolute text-primaryText dark:text-darkPrimaryText"
data-tauri-drag-region
>
<span
class="h-100% pl-2 flex-1 flex items-center lt-sm:pl-10 lt-lg:text-darkPrimaryText [app-region:drag]"
>Tauri API Validation</span
>
<span
class="
h-100%
children:h-100% children:w-12 children:inline-flex
children:items-center children:justify-center"
>
<button
aria-label="Toggle dark mode"
title={theme ? 'Switch to Light mode' : 'Switch to Dark mode'}
class="border-none hover:bg-hoverOverlay active:bg-hoverOverlayDarker dark:hover:bg-darkHoverOverlay dark:active:bg-darkHoverOverlayDarker"
onclick={switchTheme}
>
{#if theme === 'auto'}
<div title="Switch to Dark mode" class="i-ph-circle-half-fill"></div>
{:else if theme === 'dark'}
<div title="Switch to Light mode" class="i-ph-moon"></div>
{:else if theme === 'light'}
<div title="Switch to Auto mode" class="i-ph-sun"></div>
{/if}
</button>
<button
aria-label="Minimize window"
title="Minimize"
class="border-none hover:bg-hoverOverlay active:bg-hoverOverlayDarker dark:hover:bg-darkHoverOverlay dark:active:bg-darkHoverOverlayDarker"
onclick={minimize}
>
<div class="i-codicon-chrome-minimize"></div>
</button>
<button
aria-label="Maximize window"
title={isWindowMaximized ? 'Restore' : 'Maximize'}
class="border-none hover:bg-hoverOverlay active:bg-hoverOverlayDarker dark:hover:bg-darkHoverOverlay dark:active:bg-darkHoverOverlayDarker"
onclick={toggleMaximize}
>
{#if isWindowMaximized}
<div class="i-codicon-chrome-restore"></div>
{:else}
<div class="i-codicon-chrome-maximize"></div>
{/if}
</button>
<button
aria-label="Close window"
title="Close"
class="border-none hover:bg-red-700 dark:hover:bg-red-700 hover:text-darkPrimaryText active:bg-red-700/90 dark:active:bg-red-700/90 active:text-darkPrimaryText"
onclick={close}
>
<div class="i-codicon-chrome-close"></div>
</button>
</span>
</div>
+2 -1
View File
@@ -5,6 +5,7 @@
import { readFile } from '@tauri-apps/plugin-fs' import { readFile } from '@tauri-apps/plugin-fs'
export let onMessage export let onMessage
export let insecureRenderHtml
let text = 'clipboard message' let text = 'clipboard message'
function writeText() { function writeText() {
@@ -40,7 +41,7 @@
const image = await clipboard.readImage() const image = await clipboard.readImage()
arrayBufferToBase64(await image.rgba(), function (base64) { arrayBufferToBase64(await image.rgba(), function (base64) {
const src = 'data:image/png;base64,' + base64 const src = 'data:image/png;base64,' + base64
onMessage('<img src="' + src + '"></img>') insecureRenderHtml('<img src="' + src + '"></img>')
}) })
return return
} catch (_) {} } catch (_) {}
+77 -87
View File
@@ -1,138 +1,129 @@
<script lang="ts"> <script>
import { import { open, save, confirm, message } from "@tauri-apps/plugin-dialog";
open, import { readFile } from "@tauri-apps/plugin-fs";
save,
confirm,
message,
type PickerMode,
type FileAccessMode
} from '@tauri-apps/plugin-dialog'
import { readFile } from '@tauri-apps/plugin-fs'
import type { ViewProps } from '../App.svelte'
let { onMessage }: ViewProps = $props() export let onMessage;
export let insecureRenderHtml;
let defaultPath = null;
let filter = null;
let multiple = false;
let directory = false;
let pickerMode = "document";
let fileAccessMode = "scoped";
let defaultPath: string | undefined = $state() function arrayBufferToBase64(buffer, callback) {
let filter = $state('')
let multiple = $state(false)
let directory = $state(false)
let pickerMode: PickerMode = $state('document')
let fileAccessMode: FileAccessMode = $state('scoped')
function arrayBufferToBase64(
buffer: ArrayBuffer,
callback: (base64: string) => void
) {
var blob = new Blob([buffer], { var blob = new Blob([buffer], {
type: 'application/octet-binary' type: "application/octet-binary",
}) });
var reader = new FileReader() var reader = new FileReader();
reader.onload = function (evt) { reader.onload = function (evt) {
var dataurl = evt.target!.result as string var dataurl = evt.target.result;
callback(dataurl.split(',')[1]) callback(dataurl.substr(dataurl.indexOf(",") + 1));
} };
reader.readAsDataURL(blob) reader.readAsDataURL(blob);
} }
async function prompt() { async function prompt() {
confirm('Do you want to do something?') confirm("Do you want to do something?")
.then((res) => onMessage(res ? 'Yes' : 'No')) .then((res) => onMessage(res ? "Yes" : "No"))
.catch(onMessage) .catch(onMessage);
} }
async function promptCustom() { async function promptCustom() {
confirm('Is Tauri awesome?', { confirm("Is Tauri awesome?", {
okLabel: 'Absolutely', okLabel: "Absolutely",
cancelLabel: 'Totally' cancelLabel: "Totally",
}) })
.then((res) => .then((res) =>
onMessage( onMessage(
res ? 'Tauri is absolutely awesome' : 'Tauri is totally awesome' res ? "Tauri is absolutely awesome" : "Tauri is totally awesome"
) )
) )
.catch(onMessage) .catch(onMessage);
} }
async function msg() { async function msg() {
await message('Tauri is awesome!').then((res) => onMessage(res)) await message("Tauri is awesome!").then((res) => onMessage(res));
} }
async function msgCustom() { async function msgCustom(result) {
const buttons = { yes: 'awesome', no: 'amazing', cancel: 'stunning' } const buttons = { yes: "awesome", no: "amazing", cancel: "stunning" };
await message(`Tauri is: `, { buttons }) await message(`Tauri is: `, { buttons })
.then((res) => onMessage(`Tauri is ${res}`)) .then((res) => onMessage(`Tauri is ${res}`))
.catch(onMessage) .catch(onMessage);
} }
async function openDialog() { async function openDialog() {
try { try {
const result = await open({ var result = await open({
title: 'My wonderful open dialog', title: "My wonderful open dialog",
defaultPath, defaultPath,
filters: filter filters: filter
? [ ? [
{ {
name: 'Tauri Example', name: "Tauri Example",
extensions: filter.split(',').map((f) => f.trim()) extensions: filter.split(",").map((f) => f.trim()),
} },
] ]
: [], : [],
multiple, multiple,
directory, directory,
pickerMode, pickerMode,
fileAccessMode fileAccessMode,
}) })
if (Array.isArray(result)) { if (Array.isArray(result)) {
onMessage(result) onMessage(result);
} else if (result === null) {
onMessage('user cancelled the selection')
} else { } else {
const pathToRead = result var pathToRead = result;
const isFile = pathToRead.match(/\S+\.\S+$/g) var isFile = pathToRead.match(/\S+\.\S+$/g);
await readFile(pathToRead).then(function (res) { await readFile(pathToRead)
if (isFile) { .then(function (res) {
if ( if (isFile) {
pathToRead.includes('.png') if (
|| pathToRead.includes('.jpg') pathToRead.includes(".png") ||
|| pathToRead.includes('.jpeg') pathToRead.includes(".jpg") ||
) { pathToRead.includes(".jpeg")
arrayBufferToBase64(res.buffer, function (base64) { ) {
const src = 'data:image/png;base64,' + base64 arrayBufferToBase64(
onMessage('<img src="' + src + '"></img>') new Uint8Array(res),
}) function (base64) {
var src = "data:image/png;base64," + base64;
insecureRenderHtml('<img src="' + src + '"></img>');
}
);
} else {
// Convert byte array to UTF-8 string
const decoder = new TextDecoder('utf-8');
const text = decoder.decode(new Uint8Array(res));
onMessage(text);
}
} else { } else {
// Convert byte array to UTF-8 string onMessage(res);
const decoder = new TextDecoder('utf-8')
const text = decoder.decode(res)
onMessage(text)
}
} else {
onMessage(res)
} }
}) })
} }
} catch (exception) { } catch(exception) {
onMessage(exception) onMessage(exception)
} }
} }
function saveDialog() { function saveDialog() {
save({ save({
title: 'My wonderful save dialog', title: "My wonderful save dialog",
defaultPath, defaultPath,
filters: filter filters: filter
? [ ? [
{ {
name: 'Tauri Example', name: "Tauri Example",
extensions: filter.split(',').map((f) => f.trim()) extensions: filter.split(",").map((f) => f.trim()),
} },
] ]
: [] : [],
}) })
.then(onMessage) .then(onMessage)
.catch(onMessage) .catch(onMessage);
} }
</script> </script>
@@ -180,16 +171,15 @@
<br /> <br />
<div class="flex flex-wrap flex-col md:flex-row gap-2 children:flex-shrink-0"> <div class="flex flex-wrap flex-col md:flex-row gap-2 children:flex-shrink-0">
<button class="btn" id="open-dialog" onclick={openDialog}>Open dialog</button> <button class="btn" id="open-dialog" on:click={openDialog}>Open dialog</button>
<button class="btn" id="save-dialog" onclick={saveDialog} <button class="btn" id="save-dialog" on:click={saveDialog}
>Open save dialog</button >Open save dialog</button
> >
<button class="btn" id="prompt-dialog" onclick={prompt}>Prompt</button> <button class="btn" id="prompt-dialog" on:click={prompt}>Prompt</button>
<button class="btn" id="custom-prompt-dialog" onclick={promptCustom} <button class="btn" id="custom-prompt-dialog" on:click={promptCustom}
>Prompt (custom)</button >Prompt (custom)</button
> >
<button class="btn" id="message-dialog" onclick={msg}>Message</button> <button class="btn" id="message-dialog" on:click={msg}>Message</button>
<button class="btn" id="message-dialog" onclick={msgCustom} <button class="btn" id="message-dialog" on:click={msgCustom}>Message (custom)</button>
>Message (custom)</button
>
</div> </div>
+3 -3
View File
@@ -5,7 +5,7 @@
import { arrayBufferToBase64 } from '../lib/utils' import { arrayBufferToBase64 } from '../lib/utils'
import { onDestroy, onMount } from 'svelte' import { onDestroy, onMount } from 'svelte'
const { onMessage } = $props() const { onMessage, insecureRenderHtml } = $props()
let path = $state('') let path = $state('')
let img let img
@@ -118,12 +118,12 @@
new Uint8Array(response), new Uint8Array(response),
function (base64) { function (base64) {
const src = 'data:image/png;base64,' + base64 const src = 'data:image/png;base64,' + base64
onMessage('<img src="' + src + '"></img>') insecureRenderHtml('<img src="' + src + '"></img>')
} }
) )
} else { } else {
const value = String.fromCharCode.apply(null, response) const value = String.fromCharCode.apply(null, response)
onMessage( insecureRenderHtml(
'<textarea id="file-response"></textarea><button id="file-save">Save</button>' '<textarea id="file-response"></textarea><button id="file-save">Save</button>'
) )
setTimeout(() => { setTimeout(() => {
+11 -19
View File
@@ -1,18 +1,12 @@
<script lang="ts"> <script>
import { check, Update } from '@tauri-apps/plugin-updater' import { check } from '@tauri-apps/plugin-updater'
import { relaunch } from '@tauri-apps/plugin-process' import { relaunch } from '@tauri-apps/plugin-process'
import { onDestroy } from 'svelte'
let { onMessage } = $props() export let onMessage
let isChecking = $state(false) let isChecking, isInstalling, newUpdate
let isInstalling = $state(false) let totalSize = 0,
let newUpdate = $state<Update | undefined>() downloadedSize = 0
let totalSize = $state(0)
let downloadedSize = $state(0)
let progress = $derived(
totalSize ? Math.round((downloadedSize / totalSize) * 100) : 0
)
async function checkUpdate() { async function checkUpdate() {
isChecking = true isChecking = true
@@ -37,10 +31,10 @@
isInstalling = true isInstalling = true
downloadedSize = 0 downloadedSize = 0
try { try {
await newUpdate!.downloadAndInstall((downloadProgress) => { await newUpdate.downloadAndInstall((downloadProgress) => {
switch (downloadProgress.event) { switch (downloadProgress.event) {
case 'Started': case 'Started':
totalSize = downloadProgress.data.contentLength! totalSize = downloadProgress.data.contentLength
break break
case 'Progress': case 'Progress':
downloadedSize += downloadProgress.data.chunkLength downloadedSize += downloadProgress.data.chunkLength
@@ -60,16 +54,14 @@
} }
} }
onDestroy(() => { $: progress = totalSize ? Math.round((downloadedSize / totalSize) * 100) : 0
newUpdate?.close()
})
</script> </script>
<div class="flex children:grow children:h10"> <div class="flex children:grow children:h10">
{#if !isChecking && !newUpdate} {#if !isChecking && !newUpdate}
<button class="btn" onclick={checkUpdate}>Check update</button> <button class="btn" on:click={checkUpdate}>Check update</button>
{:else if !isInstalling && newUpdate} {:else if !isInstalling && newUpdate}
<button class="btn" onclick={install}>Install update</button> <button class="btn" on:click={install}>Install update</button>
{:else} {:else}
<div class="progress"> <div class="progress">
<span>{progress}%</span> <span>{progress}%</span>
-5
View File
@@ -1,5 +0,0 @@
*
!.gitignore
!README.md
!updater.json
-10
View File
@@ -1,10 +0,0 @@
To test the updater:
1. Comment out `verify_signature` inside `plugins/updater/src/updater.rs`
2. Run `pnpm tauri build --debug` to build the bundles
3. Copy the bundle you want to test to this folder (`examples/api/updater-test/`)
4. Run `pnpm tauri dev` and open the Updater tab to check
If the bundle you're testing doesn't exist in the `updater.json` yet, add it manually and welcome to open an PR
> The `updater.json` and debug bundles will be served by `vite`
-11
View File
@@ -1,11 +0,0 @@
{
"version": "2.1.0",
"notes": "Test update!",
"pub_date": "2026-03-01T14:04:20+00:00",
"platforms": {
"windows-x86_64": {
"signature": "",
"url": "http://localhost:5173/updater-test/Tauri API_2.0.0_x64_en-US.msi"
}
}
}
+1 -1
View File
@@ -27,7 +27,7 @@ export default defineConfig(async () => {
port: 5173, port: 5173,
strictPort: true, strictPort: true,
fs: { fs: {
allow: ['.'] allow: ['.', '../../tooling/api/dist']
} }
} }
} }
+14 -4
View File
@@ -18,12 +18,22 @@
"eslint": "10.4.0", "eslint": "10.4.0",
"eslint-config-prettier": "10.1.8", "eslint-config-prettier": "10.1.8",
"eslint-plugin-security": "4.0.1", "eslint-plugin-security": "4.0.1",
"prettier": "3.8.3", "prettier": "3.9.4",
"rollup": "4.62.5", "rollup": "4.60.3",
"tslib": "2.8.1", "tslib": "2.8.1",
"typescript": "6.0.3", "typescript": "6.0.3",
"typescript-eslint": "8.66.0" "typescript-eslint": "8.58.2"
}, },
"minimumReleaseAge": 4320, "minimumReleaseAge": 4320,
"packageManager": "pnpm@11.20.0" "pnpm": {
"overrides": {
"esbuild@<0.25.0": ">=0.25.0"
},
"onlyBuiltDependencies": [
"esbuild"
]
},
"engines": {
"pnpm": "^10.16.0"
}
} }
-7
View File
@@ -8,13 +8,6 @@ edition = { workspace = true }
rust-version = { workspace = true } rust-version = { workspace = true }
repository = { workspace = true } repository = { workspace = true }
links = "tauri-plugin-autostart" links = "tauri-plugin-autostart"
exclude = [
"/banner.png",
"/guest-js",
"/package.json",
"/rollup.config.js",
"/tsconfig.json",
]
[package.metadata.platforms.support] [package.metadata.platforms.support]
windows = { level = "full", notes = "" } windows = { level = "full", notes = "" }
+1 -1
View File
@@ -161,7 +161,7 @@ impl Builder {
/// ///
/// ```no_run /// ```no_run
/// Builder::new() /// Builder::new()
/// .app_name("My Custom Name") /// .app_name("My Custom Name"))
/// .build(); /// .build();
/// ``` /// ```
pub fn app_name<S: Into<String>>(mut self, app_name: S) -> Self { pub fn app_name<S: Into<String>>(mut self, app_name: S) -> Self {
-4
View File
@@ -1,9 +1,5 @@
# Changelog # Changelog
## [2.4.6]
- [`db9c5998`](https://github.com/tauri-apps/plugins-workspace/commit/db9c5998feff9384f9cbbefcbe0d45937c00a1fc) ([#3531](https://github.com/tauri-apps/plugins-workspace/pull/3531) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Fix missing `consumer-rules.pro` on Gradle v9.
## \[2.4.5] ## \[2.4.5]
- [`d8645ab3`](https://github.com/tauri-apps/plugins-workspace/commit/d8645ab3e5b508456681eb53275c0837db25aeee) ([#3393](https://github.com/tauri-apps/plugins-workspace/pull/3393) by [@AlexisZankowitch](https://github.com/tauri-apps/plugins-workspace/../../AlexisZankowitch)) Fixed a crash on iOS when `cancel()` is invoked by running the cancel handler on the main thread. - [`d8645ab3`](https://github.com/tauri-apps/plugins-workspace/commit/d8645ab3e5b508456681eb53275c0837db25aeee) ([#3393](https://github.com/tauri-apps/plugins-workspace/pull/3393) by [@AlexisZankowitch](https://github.com/tauri-apps/plugins-workspace/../../AlexisZankowitch)) Fixed a crash on iOS when `cancel()` is invoked by running the cancel handler on the main thread.
+2 -8
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "tauri-plugin-barcode-scanner" name = "tauri-plugin-barcode-scanner"
version = "2.4.6" version = "2.4.5"
description = "Scan QR codes, EAN-13 and other kinds of barcodes on Android and iOS" description = "Scan QR codes, EAN-13 and other kinds of barcodes on Android and iOS"
edition = { workspace = true } edition = { workspace = true }
authors = { workspace = true } authors = { workspace = true }
@@ -8,13 +8,7 @@ license = { workspace = true }
rust-version = { workspace = true } rust-version = { workspace = true }
repository = { workspace = true } repository = { workspace = true }
links = "tauri-plugin-barcode-scanner" links = "tauri-plugin-barcode-scanner"
exclude = [
"/banner.png",
"/guest-js",
"/package.json",
"/rollup.config.js",
"/tsconfig.json",
]
[package.metadata.docs.rs] [package.metadata.docs.rs]
targets = ["x86_64-linux-android"] targets = ["x86_64-linux-android"]
@@ -14,6 +14,15 @@ android {
consumerProguardFiles("consumer-rules.pro") consumerProguardFiles("consumer-rules.pro")
} }
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@tauri-apps/plugin-barcode-scanner", "name": "@tauri-apps/plugin-barcode-scanner",
"version": "2.4.6", "version": "2.4.5",
"description": "Scan QR codes, EAN-13 and other kinds of barcodes on Android and iOS", "description": "Scan QR codes, EAN-13 and other kinds of barcodes on Android and iOS",
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"authors": [ "authors": [
-4
View File
@@ -1,9 +1,5 @@
# Changelog # Changelog
## [2.3.3]
- [`db9c5998`](https://github.com/tauri-apps/plugins-workspace/commit/db9c5998feff9384f9cbbefcbe0d45937c00a1fc) ([#3531](https://github.com/tauri-apps/plugins-workspace/pull/3531) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Fix missing `consumer-rules.pro` on Gradle v9.
## \[2.3.2] ## \[2.3.2]
- [`93426f85`](https://github.com/tauri-apps/plugins-workspace/commit/93426f85120f49beb9f40222bff45185a32d54a9) Fixed an issue that caused docs.rs builds to fail. No user facing changes. - [`93426f85`](https://github.com/tauri-apps/plugins-workspace/commit/93426f85120f49beb9f40222bff45185a32d54a9) Fixed an issue that caused docs.rs builds to fail. No user facing changes.
+1 -2
View File
@@ -1,13 +1,12 @@
[package] [package]
name = "tauri-plugin-biometric" name = "tauri-plugin-biometric"
version = "2.3.3" version = "2.3.2"
description = "Prompt the user for biometric authentication on Android and iOS." description = "Prompt the user for biometric authentication on Android and iOS."
edition = { workspace = true } edition = { workspace = true }
authors = { workspace = true } authors = { workspace = true }
license = { workspace = true } license = { workspace = true }
repository = { workspace = true } repository = { workspace = true }
links = "tauri-plugin-biometric" links = "tauri-plugin-biometric"
exclude = ["/guest-js", "/package.json", "/rollup.config.js", "/tsconfig.json"]
[package.metadata.docs.rs] [package.metadata.docs.rs]
targets = ["x86_64-linux-android"] targets = ["x86_64-linux-android"]
@@ -14,6 +14,15 @@ android {
consumerProguardFiles("consumer-rules.pro") consumerProguardFiles("consumer-rules.pro")
} }
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@tauri-apps/plugin-biometric", "name": "@tauri-apps/plugin-biometric",
"version": "2.3.3", "version": "2.3.2",
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"authors": [ "authors": [
"Tauri Programme within The Commons Conservancy" "Tauri Programme within The Commons Conservancy"
-7
View File
@@ -8,13 +8,6 @@ license = { workspace = true }
rust-version = { workspace = true } rust-version = { workspace = true }
repository = { workspace = true } repository = { workspace = true }
links = "tauri-plugin-cli" links = "tauri-plugin-cli"
exclude = [
"/banner.png",
"/guest-js",
"/package.json",
"/rollup.config.js",
"/tsconfig.json",
]
[package.metadata.platforms.support] [package.metadata.platforms.support]
windows = { level = "full", notes = "" } windows = { level = "full", notes = "" }
-4
View File
@@ -1,9 +1,5 @@
# Changelog # Changelog
## [2.3.3]
- [`db9c5998`](https://github.com/tauri-apps/plugins-workspace/commit/db9c5998feff9384f9cbbefcbe0d45937c00a1fc) ([#3531](https://github.com/tauri-apps/plugins-workspace/pull/3531) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Fix missing `consumer-rules.pro` on Gradle v9.
## \[2.3.2] ## \[2.3.2]
- [`93426f85`](https://github.com/tauri-apps/plugins-workspace/commit/93426f85120f49beb9f40222bff45185a32d54a9) Fixed an issue that caused docs.rs builds to fail. No user facing changes. - [`93426f85`](https://github.com/tauri-apps/plugins-workspace/commit/93426f85120f49beb9f40222bff45185a32d54a9) Fixed an issue that caused docs.rs builds to fail. No user facing changes.
+1 -8
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "tauri-plugin-clipboard-manager" name = "tauri-plugin-clipboard-manager"
version = "2.3.3" version = "2.3.2"
description = "Read and write to the system clipboard." description = "Read and write to the system clipboard."
edition = { workspace = true } edition = { workspace = true }
authors = { workspace = true } authors = { workspace = true }
@@ -8,13 +8,6 @@ license = { workspace = true }
rust-version = { workspace = true } rust-version = { workspace = true }
repository = { workspace = true } repository = { workspace = true }
links = "tauri-plugin-clipboard-manager" links = "tauri-plugin-clipboard-manager"
exclude = [
"/banner.png",
"/guest-js",
"/package.json",
"/rollup.config.js",
"/tsconfig.json",
]
[package.metadata.docs.rs] [package.metadata.docs.rs]
@@ -14,6 +14,15 @@ android {
consumerProguardFiles("consumer-rules.pro") consumerProguardFiles("consumer-rules.pro")
} }
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@tauri-apps/plugin-clipboard-manager", "name": "@tauri-apps/plugin-clipboard-manager",
"version": "2.3.3", "version": "2.3.2",
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"authors": [ "authors": [
"Tauri Programme within The Commons Conservancy" "Tauri Programme within The Commons Conservancy"
-5
View File
@@ -1,10 +1,5 @@
# Changelog # Changelog
## [2.4.10]
- [`db9c5998`](https://github.com/tauri-apps/plugins-workspace/commit/db9c5998feff9384f9cbbefcbe0d45937c00a1fc) ([#3531](https://github.com/tauri-apps/plugins-workspace/pull/3531) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Fix missing `consumer-rules.pro` on Gradle v9.
- [`3fb27bf1`](https://github.com/tauri-apps/plugins-workspace/commit/3fb27bf13a88dd1e5aa2cc933408be02b0eafc91) ([#3504](https://github.com/tauri-apps/plugins-workspace/pull/3504) by [@vasfvitor](https://github.com/tauri-apps/plugins-workspace/../../vasfvitor)) adds proper Platform-specific sections to the docs for `register`, `unregister`, `isRegistered`, and `onOpenUrl`
## \[2.4.9] ## \[2.4.9]
- [`e6cdc9f5`](https://github.com/tauri-apps/plugins-workspace/commit/e6cdc9f52e2cd975b11b8e4c12879d597f1f76c3) ([#3396](https://github.com/tauri-apps/plugins-workspace/pull/3396) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Fix broken iOS custom URL schemes - [`e6cdc9f5`](https://github.com/tauri-apps/plugins-workspace/commit/e6cdc9f52e2cd975b11b8e4c12879d597f1f76c3) ([#3396](https://github.com/tauri-apps/plugins-workspace/pull/3396) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Fix broken iOS custom URL schemes
+1 -9
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "tauri-plugin-deep-link" name = "tauri-plugin-deep-link"
version = "2.4.10" version = "2.4.9"
description = "Set your Tauri application as the default handler for an URL" description = "Set your Tauri application as the default handler for an URL"
authors = { workspace = true } authors = { workspace = true }
license = { workspace = true } license = { workspace = true }
@@ -8,14 +8,6 @@ edition = { workspace = true }
rust-version = { workspace = true } rust-version = { workspace = true }
repository = { workspace = true } repository = { workspace = true }
links = "tauri-plugin-deep-link" links = "tauri-plugin-deep-link"
exclude = [
"/banner.png",
"/examples",
"/guest-js",
"/package.json",
"/rollup.config.js",
"/tsconfig.json",
]
[package.metadata.docs.rs] [package.metadata.docs.rs]
targets = ["x86_64-linux-android"] targets = ["x86_64-linux-android"]
@@ -14,6 +14,15 @@ android {
consumerProguardFiles("consumer-rules.pro") consumerProguardFiles("consumer-rules.pro")
} }
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8
@@ -1,11 +1,5 @@
# Changelog # Changelog
## [2.2.13]
### Dependencies
- Upgraded to `deep-link-js@2.4.10`
## \[2.2.12] ## \[2.2.12]
### Dependencies ### Dependencies
+5 -5
View File
@@ -1,7 +1,7 @@
{ {
"name": "deep-link-example", "name": "deep-link-example",
"private": true, "private": true,
"version": "2.2.13", "version": "2.2.12",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
@@ -11,11 +11,11 @@
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2.11.0", "@tauri-apps/api": "^2.11.0",
"@tauri-apps/plugin-deep-link": "workspace:*" "@tauri-apps/plugin-deep-link": "2.4.9"
}, },
"devDependencies": { "devDependencies": {
"@tauri-apps/cli": "2.11.4", "@tauri-apps/cli": "2.11.2",
"typescript": "^6.0.3", "typescript": "^6.0.0",
"vite": "^8.0.16" "vite": "^8.0.1"
} }
} }
@@ -26,3 +26,9 @@ tauri-plugin-single-instance = { path = "../../../../single-instance", features
"deep-link", "deep-link",
] } ] }
log = "0.4" log = "0.4"
[features]
# this feature is used for production builds or when `devUrl` points to the filesystem and the built-in dev server is disabled.
# If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `build` modes.
# DO NOT REMOVE!!
prod = ["tauri/custom-protocol"]
@@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="Theme.deep_link_example" parent="Theme.Material3.DayNight.NoActionBar"> <style name="Theme.deep_link_example" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
</resources> </resources>
@@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="Theme.deep_link_example" parent="Theme.Material3.DayNight.NoActionBar"> <style name="Theme.deep_link_example" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
</resources> </resources>
+7 -17
View File
@@ -14,11 +14,9 @@ import { type UnlistenFn, listen } from '@tauri-apps/api/event'
* const urls = await getCurrent(); * const urls = await getCurrent();
* ``` * ```
* *
* #### Platform-specific * #### - **Windows / Linux**: This function reads the command line arguments and checks if there's only one value, which must be an URL with scheme matching one of the configured values.
* * Note that you must manually check the arguments when registering deep link schemes dynamically with [`Self::register`].
* - **Windows / Linux:** This function reads the command line arguments and checks if there's only one value, which must be an URL with scheme matching one of the configured values. * Additionally, the deep link might have been provided as a CLI argument so you should check if its format matches what you expect..
* Note that you must manually check the arguments when registering deep link schemes dynamically with [`Self::register`].
* Additionally, the deep link might have been provided as a CLI argument so you should check if its format matches what you expect.
* *
* @since 2.0.0 * @since 2.0.0
*/ */
@@ -37,9 +35,7 @@ export async function getCurrent(): Promise<string[] | null> {
* await register("my-scheme"); * await register("my-scheme");
* ``` * ```
* *
* #### Platform-specific * #### - **macOS / Android / iOS**: Unsupported.
*
* - **macOS / Android / iOS:** Unsupported.
* *
* @since 2.0.0 * @since 2.0.0
*/ */
@@ -58,9 +54,7 @@ export async function register(protocol: string): Promise<null> {
* await unregister("my-scheme"); * await unregister("my-scheme");
* ``` * ```
* *
* #### Platform-specific * #### - **macOS / Linux / Android / iOS**: Unsupported.
*
* - **macOS / Linux / Android / iOS:** Unsupported.
* *
* @since 2.0.0 * @since 2.0.0
*/ */
@@ -79,9 +73,7 @@ export async function unregister(protocol: string): Promise<null> {
* await isRegistered("my-scheme"); * await isRegistered("my-scheme");
* ``` * ```
* *
* #### Platform-specific * #### - **macOS / Android / iOS**: Unsupported.
*
* - **macOS / Android / iOS:** Unsupported.
* *
* @since 2.0.0 * @since 2.0.0
*/ */
@@ -100,9 +92,7 @@ export async function isRegistered(protocol: string): Promise<boolean> {
* await onOpenUrl((urls) => { console.log(urls) }); * await onOpenUrl((urls) => { console.log(urls) });
* ``` * ```
* *
* #### Platform-specific * #### - **Windows / Linux**: Unsupported without the single-instance plugin. 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 * @since 2.0.0
*/ */
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@tauri-apps/plugin-deep-link", "name": "@tauri-apps/plugin-deep-link",
"version": "2.4.10", "version": "2.4.9",
"description": "Set your Tauri application as the default handler for an URL", "description": "Set your Tauri application as the default handler for an URL",
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"authors": [ "authors": [
@@ -28,6 +28,6 @@
"@tauri-apps/api": "^2.11.0" "@tauri-apps/api": "^2.11.0"
}, },
"devDependencies": { "devDependencies": {
"@tauri-apps/cli": "2.11.4" "@tauri-apps/cli": "2.11.2"
} }
} }
-15
View File
@@ -1,19 +1,5 @@
# Changelog # Changelog
## [2.7.3]
- [`db9c5998`](https://github.com/tauri-apps/plugins-workspace/commit/db9c5998feff9384f9cbbefcbe0d45937c00a1fc) ([#3531](https://github.com/tauri-apps/plugins-workspace/pull/3531) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Fix missing `consumer-rules.pro` on Gradle v9.
- [`cc9ec9b4`](https://github.com/tauri-apps/plugins-workspace/commit/cc9ec9b4ad2f9ec9bd57c3503ded1bd94d092c48) ([#3519](https://github.com/tauri-apps/plugins-workspace/pull/3519) by [@purvsinojiya-inventyv](https://github.com/tauri-apps/plugins-workspace/../../purvsinojiya-inventyv)) Fix Android save dialog MIME type when a single MIME type is provided.
- [`f8053e65`](https://github.com/tauri-apps/plugins-workspace/commit/f8053e659e4ccd85c1f52833411ff8417cbc5e69) ([#3527](https://github.com/tauri-apps/plugins-workspace/pull/3527) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Documented Cargo feature flags in each plugin's crate-level documentation.
### Dependencies
- Upgraded to `fs@2.5.2`
## \[2.7.2]
- [`40ae0a7f`](https://github.com/tauri-apps/plugins-workspace/commit/40ae0a7fa0ecc9b0cdbd952297f7a17f37308229) ([#3491](https://github.com/tauri-apps/plugins-workspace/pull/3491) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Use `com.google.android.material.dialog.MaterialAlertDialogBuilder` instead of `AlertDialog` so the dialog follows the app's theme
## \[2.7.1] ## \[2.7.1]
### Dependencies ### Dependencies
@@ -338,4 +324,3 @@
- [`717ae67`](https://github.com/tauri-apps/plugins-workspace/commit/717ae670978feb4492fac1f295998b93f2b9347f)([#371](https://github.com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release! - [`717ae67`](https://github.com/tauri-apps/plugins-workspace/commit/717ae670978feb4492fac1f295998b93f2b9347f)([#371](https://github.com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release!
d6e80b)([#545](https://github.com/tauri-apps/plugins-workspace/pull/545)) Fixes docs.rs build by enabling the `tauri/dox` feature flag. d6e80b)([#545](https://github.com/tauri-apps/plugins-workspace/pull/545)) Fixes docs.rs build by enabling the `tauri/dox` feature flag.
g.
+2 -10
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "tauri-plugin-dialog" name = "tauri-plugin-dialog"
version = "2.7.3" version = "2.7.1"
description = "Native system dialogs for opening and saving files along with message dialogs on your Tauri application." description = "Native system dialogs for opening and saving files along with message dialogs on your Tauri application."
edition = { workspace = true } edition = { workspace = true }
authors = { workspace = true } authors = { workspace = true }
@@ -8,14 +8,6 @@ license = { workspace = true }
rust-version = { workspace = true } rust-version = { workspace = true }
repository = { workspace = true } repository = { workspace = true }
links = "tauri-plugin-dialog" links = "tauri-plugin-dialog"
exclude = [
"/banner.png",
"/guest-js",
"/package.json",
"/rollup.config.js",
"/test",
"/tsconfig.json",
]
[features] [features]
default = ["gtk3"] default = ["gtk3"]
@@ -45,7 +37,7 @@ tauri = { workspace = true }
log = { workspace = true } log = { workspace = true }
thiserror = { workspace = true } thiserror = { workspace = true }
url = { workspace = true } url = { workspace = true }
tauri-plugin-fs = { path = "../fs", version = "2.5.2" } tauri-plugin-fs = { path = "../fs", version = "2.5.1" }
[target.'cfg(target_os = "ios")'.dependencies] [target.'cfg(target_os = "ios")'.dependencies]
tauri = { workspace = true, features = ["wry"] } tauri = { workspace = true, features = ["wry"] }
+11 -2
View File
@@ -14,6 +14,15 @@ android {
consumerProguardFiles("consumer-rules.pro") consumerProguardFiles("consumer-rules.pro")
} }
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8
@@ -26,8 +35,8 @@ android {
dependencies { dependencies {
implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.appcompat:appcompat:1.7.1") implementation("androidx.appcompat:appcompat:1.6.0")
implementation("com.google.android.material:material:1.13.0") implementation("com.google.android.material:material:1.7.0")
testImplementation("junit:junit:4.13.2") testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
@@ -5,6 +5,7 @@
package app.tauri.dialog package app.tauri.dialog
import android.app.Activity import android.app.Activity
import android.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Handler import android.os.Handler
@@ -20,7 +21,6 @@ import app.tauri.plugin.Invoke
import app.tauri.plugin.JSArray import app.tauri.plugin.JSArray
import app.tauri.plugin.JSObject import app.tauri.plugin.JSObject
import app.tauri.plugin.Plugin import app.tauri.plugin.Plugin
import com.google.android.material.dialog.MaterialAlertDialogBuilder
@InvokeArg @InvokeArg
class Filter { class Filter {
@@ -158,7 +158,7 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) {
Handler(Looper.getMainLooper()) Handler(Looper.getMainLooper())
.post { .post {
val builder = MaterialAlertDialogBuilder(activity) val builder = AlertDialog.Builder(activity)
if (args.title != null) { if (args.title != null) {
builder.setTitle(args.title) builder.setTitle(args.title)
@@ -191,7 +191,8 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) {
} }
} }
builder.show() val dialog = builder.create()
dialog.show()
} }
} }
@@ -204,10 +205,9 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) {
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT) val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE) intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.putExtra(Intent.EXTRA_TITLE, args.fileName ?: "") intent.putExtra(Intent.EXTRA_TITLE, args.fileName ?: "")
if (parsedTypes.size == 1) { intent.type = "*/*"
intent.type = parsedTypes.first()
} else { if (parsedTypes.isNotEmpty()) {
intent.type = "*/*"
intent.putExtra(Intent.EXTRA_MIME_TYPES, parsedTypes) intent.putExtra(Intent.EXTRA_MIME_TYPES, parsedTypes)
} }
+2 -6
View File
@@ -152,10 +152,7 @@ export type FileAccessMode = 'copy' | 'scoped'
* @since 2.4.0 * @since 2.4.0
*/ */
export type MessageDialogDefaultButtons = export type MessageDialogDefaultButtons =
| 'Ok' 'Ok' | 'OkCancel' | 'YesNo' | 'YesNoCancel'
| 'OkCancel'
| 'YesNo'
| 'YesNoCancel'
/** All possible button keys. */ /** All possible button keys. */
type ButtonKey = 'ok' | 'cancel' | 'yes' | 'no' type ButtonKey = 'ok' | 'cancel' | 'yes' | 'no'
@@ -217,8 +214,7 @@ export type MessageDialogCustomButtons =
* @since 2.4.0 * @since 2.4.0
*/ */
export type MessageDialogButtons = export type MessageDialogButtons =
| MessageDialogDefaultButtons MessageDialogDefaultButtons | MessageDialogCustomButtons
| MessageDialogCustomButtons
/** /**
* @since 2.0.0 * @since 2.0.0
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@tauri-apps/plugin-dialog", "name": "@tauri-apps/plugin-dialog",
"version": "2.7.3", "version": "2.7.1",
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"authors": [ "authors": [
"Tauri Programme within The Commons Conservancy" "Tauri Programme within The Commons Conservancy"
-5
View File
@@ -3,11 +3,6 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
//! Native system dialogs for opening and saving files along with message dialogs. //! Native system dialogs for opening and saving files along with message dialogs.
//!
//! ## Cargo features
//!
//! - **gtk3** *(enabled by default)*: Uses GTK for dialogs on Linux & BSDs; has no effect on Windows and macOS
//! - **xdg-portal**: Uses XDG Desktop Portal instead of GTK on Linux & BSDs
#![doc( #![doc(
html_logo_url = "https://github.com/tauri-apps/tauri/raw/dev/app-icon.png", html_logo_url = "https://github.com/tauri-apps/tauri/raw/dev/app-icon.png",
-7
View File
@@ -1,12 +1,5 @@
# Changelog # Changelog
## [2.5.2]
- [`db9c5998`](https://github.com/tauri-apps/plugins-workspace/commit/db9c5998feff9384f9cbbefcbe0d45937c00a1fc) ([#3531](https://github.com/tauri-apps/plugins-workspace/pull/3531) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Fix missing `consumer-rules.pro` on Gradle v9.
- [`f8053e65`](https://github.com/tauri-apps/plugins-workspace/commit/f8053e659e4ccd85c1f52833411ff8417cbc5e69) ([#3527](https://github.com/tauri-apps/plugins-workspace/pull/3527) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Documented Cargo feature flags in each plugin's crate-level documentation.
- [`685610ae`](https://github.com/tauri-apps/plugins-workspace/commit/685610ae782b668770d412f42a5d52d2cc9e497e) ([#3507](https://github.com/tauri-apps/plugins-workspace/pull/3507) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Fix `fs:default` and `fs:read-app-specific-dirs-recursive` not giving any command scopes
- [`3fb27bf1`](https://github.com/tauri-apps/plugins-workspace/commit/3fb27bf13a88dd1e5aa2cc933408be02b0eafc91) ([#3504](https://github.com/tauri-apps/plugins-workspace/pull/3504) by [@vasfvitor](https://github.com/tauri-apps/plugins-workspace/../../vasfvitor)) Fixed `deny-webview-data` has no effect, and on Linux, only deny access to the webview data paths instead of the entire `$APPLOCALDATA`
## \[2.5.1] ## \[2.5.1]
- [`ec054013`](https://github.com/tauri-apps/plugins-workspace/commit/ec0540138bece081e9a87982091947360e61987a) ([#3323](https://github.com/tauri-apps/plugins-workspace/pull/3323) by [@renovate](https://github.com/tauri-apps/plugins-workspace/../../renovate)) Updated dependency `toml` from 0.9 to 1 - [`ec054013`](https://github.com/tauri-apps/plugins-workspace/commit/ec0540138bece081e9a87982091947360e61987a) ([#3323](https://github.com/tauri-apps/plugins-workspace/pull/3323) by [@renovate](https://github.com/tauri-apps/plugins-workspace/../../renovate)) Updated dependency `toml` from 0.9 to 1
+1 -8
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "tauri-plugin-fs" name = "tauri-plugin-fs"
version = "2.5.2" version = "2.5.1"
description = "Access the file system." description = "Access the file system."
authors = { workspace = true } authors = { workspace = true }
license = { workspace = true } license = { workspace = true }
@@ -8,13 +8,6 @@ edition = { workspace = true }
rust-version = { workspace = true } rust-version = { workspace = true }
repository = { workspace = true } repository = { workspace = true }
links = "tauri-plugin-fs" links = "tauri-plugin-fs"
exclude = [
"/banner.png",
"/guest-js",
"/package.json",
"/rollup.config.js",
"/tsconfig.json",
]
[package.metadata.platforms.support] [package.metadata.platforms.support]
windows = { level = "full", notes = "Apps installed via MSI or NSIS in `perMachine` and `both` mode require admin permissions for write access in `$RESOURCES` folder" } windows = { level = "full", notes = "Apps installed via MSI or NSIS in `perMachine` and `both` mode require admin permissions for write access in `$RESOURCES` folder" }
+9 -1
View File
@@ -14,7 +14,15 @@ android {
consumerProguardFiles("consumer-rules.pro") consumerProguardFiles("consumer-rules.pro")
} }
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8
+2 -8
View File
@@ -1236,10 +1236,7 @@ type WatchEventKindAccess =
* @since 2.0.0 * @since 2.0.0
*/ */
type WatchEventKindCreate = type WatchEventKindCreate =
| { kind: 'any' } { kind: 'any' } | { kind: 'file' } | { kind: 'folder' } | { kind: 'other' }
| { kind: 'file' }
| { kind: 'folder' }
| { kind: 'other' }
/** /**
* @since 2.0.0 * @since 2.0.0
@@ -1265,10 +1262,7 @@ type WatchEventKindModify =
* @since 2.0.0 * @since 2.0.0
*/ */
type WatchEventKindRemove = type WatchEventKindRemove =
| { kind: 'any' } { kind: 'any' } | { kind: 'file' } | { kind: 'folder' } | { kind: 'other' }
| { kind: 'file' }
| { kind: 'folder' }
| { kind: 'other' }
// TODO: Remove this in v3, return `Watcher` instead // TODO: Remove this in v3, return `Watcher` instead
/** /**
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@tauri-apps/plugin-fs", "name": "@tauri-apps/plugin-fs",
"version": "2.5.2", "version": "2.5.1",
"description": "Access the file system.", "description": "Access the file system.",
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"authors": [ "authors": [
@@ -22,9 +22,7 @@ the `mkdir` command.
This default permission set prevents access to critical components This default permission set prevents access to critical components
of the Tauri application by default. of the Tauri application by default.
On Windows the webview data folder access is denied.
- On Windows the access to webview data folder `$APPLOCALDATA/EBWebView` is denied.
- On Linux the access to webview data paths inside `$APPLOCALDATA` are denied.
#### This default permission set includes the following: #### This default permission set includes the following:
@@ -3703,19 +3701,8 @@ This denies access to dangerous Tauri relevant files and folders by default.
</td> </td>
<td> <td>
This denies access to the following paths This denies read access to the
`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.
- `$APPLOCALDATA/CacheStorage/**`
- `$APPLOCALDATA/cookies`
- `$APPLOCALDATA/hsts-storage.sqlite`
- `$APPLOCALDATA/serviceworkers/**`
- `$APPLOCALDATA/WebKitCache/**`
- `$APPLOCALDATA/databases/**`
- `$APPLOCALDATA/localstorage/**`
- `$APPLOCALDATA/mediakeys/**`
- `$APPLOCALDATA/storage/**`
on linux as the webview data and configuration values are stored here.
Allowing access can lead to sensitive information disclosure and should be well considered. Allowing access can lead to sensitive information disclosure and should be well considered.
</td> </td>
@@ -3729,7 +3716,7 @@ Allowing access can lead to sensitive information disclosure and should be well
</td> </td>
<td> <td>
This denies access to the This denies read access to the
`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here. `$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.
Allowing access can lead to sensitive information disclosure and should be well considered. Allowing access can lead to sensitive information disclosure and should be well considered.
@@ -3758,7 +3745,7 @@ This enables all read related commands without any pre-configured accessible pat
<td> <td>
This permission allows recursive read functionality on the application This permission allows recursive read functionality on the application
specific base directories. specific base directories.
</td> </td>
@@ -1,8 +1,8 @@
"$schema" = "schemas/schema.json" "$schema" = "schemas/schema.json"
[[set]] [[permission]]
identifier = "create-app-specific-dirs" identifier = "create-app-specific-dirs"
description = """ description = """
This permissions allows to create the application specific directories. This permissions allows to create the application specific directories.
""" """
permissions = ["allow-mkdir", "scope-app-index"] commands.allow = ["mkdir", "scope-app-index"]
+1 -3
View File
@@ -24,9 +24,7 @@ the `mkdir` command.
This default permission set prevents access to critical components This default permission set prevents access to critical components
of the Tauri application by default. of the Tauri application by default.
On Windows the webview data folder access is denied.
- On Windows the access to webview data folder `$APPLOCALDATA/EBWebView` is denied.
- On Linux the access to webview data paths inside `$APPLOCALDATA` are denied.
""" """
permissions = [ permissions = [
"create-app-specific-dirs", "create-app-specific-dirs",
+6 -35
View File
@@ -2,47 +2,18 @@
[[permission]] [[permission]]
identifier = "deny-webview-data-linux" identifier = "deny-webview-data-linux"
description = """This denies access to the following paths description = """This denies read access to the
`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.
- `$APPLOCALDATA/CacheStorage/**`
- `$APPLOCALDATA/cookies`
- `$APPLOCALDATA/hsts-storage.sqlite`
- `$APPLOCALDATA/serviceworkers/**`
- `$APPLOCALDATA/WebKitCache/**`
- `$APPLOCALDATA/databases/**`
- `$APPLOCALDATA/localstorage/**`
- `$APPLOCALDATA/mediakeys/**`
- `$APPLOCALDATA/storage/**`
on linux as the webview data and configuration values are stored here.
Allowing access can lead to sensitive information disclosure and should be well considered.""" Allowing access can lead to sensitive information disclosure and should be well considered."""
platforms = ["linux"]
[[permission.scope.deny]] [[scope.deny]]
path = "$APPLOCALDATA/CacheStorage/**" path = "$APPLOCALDATA/**"
[[permission.scope.deny]]
path = "$APPLOCALDATA/cookies"
[[permission.scope.deny]]
path = "$APPLOCALDATA/hsts-storage.sqlite"
[[permission.scope.deny]]
path = "$APPLOCALDATA/serviceworkers/**"
[[permission.scope.deny]]
path = "$APPLOCALDATA/WebKitCache/**"
[[permission.scope.deny]]
path = "$APPLOCALDATA/databases/**"
[[permission.scope.deny]]
path = "$APPLOCALDATA/localstorage/**"
[[permission.scope.deny]]
path = "$APPLOCALDATA/mediakeys/**"
[[permission.scope.deny]]
path = "$APPLOCALDATA/storage/**"
[[permission]] [[permission]]
identifier = "deny-webview-data-windows" identifier = "deny-webview-data-windows"
description = """This denies access to the description = """This denies read access to the
`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here. `$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.
Allowing access can lead to sensitive information disclosure and should be well considered.""" Allowing access can lead to sensitive information disclosure and should be well considered."""
platforms = ["windows"]
[[permission.scope.deny]] [[scope.deny]]
path = "$APPLOCALDATA/EBWebView/**" path = "$APPLOCALDATA/EBWebView/**"
@@ -1,17 +1,17 @@
"$schema" = "schemas/schema.json" "$schema" = "schemas/schema.json"
[[set]] [[permission]]
identifier = "read-app-specific-dirs-recursive" identifier = "read-app-specific-dirs-recursive"
description = """ description = """
This permission allows recursive read functionality on the application This permission allows recursive read functionality on the application
specific base directories. specific base directories.
""" """
permissions = [ commands.allow = [
"allow-read-dir", "read_dir",
"allow-read-file", "read_file",
"allow-read-text-file", "read_text_file",
"allow-read-text-file-lines", "read_text_file_lines",
"allow-read-text-file-lines-next", "read_text_file_lines_next",
"allow-exists", "exists",
"scope-app-recursive", "scope-app-recursive",
] ]
+10 -10
View File
@@ -1969,16 +1969,16 @@
"markdownDescription": "Denies the write_text_file command without any pre-configured scope." "markdownDescription": "Denies the write_text_file command without any pre-configured scope."
}, },
{ {
"description": "This permissions allows to create the application specific directories.\n\n#### This permission set includes:\n\n- `allow-mkdir`\n- `scope-app-index`", "description": "This permissions allows to create the application specific directories.\n",
"type": "string", "type": "string",
"const": "create-app-specific-dirs", "const": "create-app-specific-dirs",
"markdownDescription": "This permissions allows to create the application specific directories.\n\n#### This permission set includes:\n\n- `allow-mkdir`\n- `scope-app-index`" "markdownDescription": "This permissions allows to create the application specific directories.\n"
}, },
{ {
"description": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\n\n- On Windows the access to webview data folder `$APPLOCALDATA/EBWebView` is denied.\n- On Linux the access to webview data paths inside `$APPLOCALDATA` are denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`", "description": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`",
"type": "string", "type": "string",
"const": "default", "const": "default",
"markdownDescription": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\n\n- On Windows the access to webview data folder `$APPLOCALDATA/EBWebView` is denied.\n- On Linux the access to webview data paths inside `$APPLOCALDATA` are denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`" "markdownDescription": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`"
}, },
{ {
"description": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`", "description": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`",
@@ -1987,16 +1987,16 @@
"markdownDescription": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`" "markdownDescription": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`"
}, },
{ {
"description": "This denies access to the following paths\n\n- `$APPLOCALDATA/CacheStorage/**`\n- `$APPLOCALDATA/cookies`\n- `$APPLOCALDATA/hsts-storage.sqlite`\n- `$APPLOCALDATA/serviceworkers/**`\n- `$APPLOCALDATA/WebKitCache/**`\n- `$APPLOCALDATA/databases/**`\n- `$APPLOCALDATA/localstorage/**`\n- `$APPLOCALDATA/mediakeys/**`\n- `$APPLOCALDATA/storage/**`\n\non linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", "description": "This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.",
"type": "string", "type": "string",
"const": "deny-webview-data-linux", "const": "deny-webview-data-linux",
"markdownDescription": "This denies access to the following paths\n\n- `$APPLOCALDATA/CacheStorage/**`\n- `$APPLOCALDATA/cookies`\n- `$APPLOCALDATA/hsts-storage.sqlite`\n- `$APPLOCALDATA/serviceworkers/**`\n- `$APPLOCALDATA/WebKitCache/**`\n- `$APPLOCALDATA/databases/**`\n- `$APPLOCALDATA/localstorage/**`\n- `$APPLOCALDATA/mediakeys/**`\n- `$APPLOCALDATA/storage/**`\n\non linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered." "markdownDescription": "This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered."
}, },
{ {
"description": "This denies access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", "description": "This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.",
"type": "string", "type": "string",
"const": "deny-webview-data-windows", "const": "deny-webview-data-windows",
"markdownDescription": "This denies access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered." "markdownDescription": "This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered."
}, },
{ {
"description": "This enables all read related commands without any pre-configured accessible paths.", "description": "This enables all read related commands without any pre-configured accessible paths.",
@@ -2005,10 +2005,10 @@
"markdownDescription": "This enables all read related commands without any pre-configured accessible paths." "markdownDescription": "This enables all read related commands without any pre-configured accessible paths."
}, },
{ {
"description": "This permission allows recursive read functionality on the application\nspecific base directories.\n\n#### This permission set includes:\n\n- `allow-read-dir`\n- `allow-read-file`\n- `allow-read-text-file`\n- `allow-read-text-file-lines`\n- `allow-read-text-file-lines-next`\n- `allow-exists`\n- `scope-app-recursive`", "description": "This permission allows recursive read functionality on the application\nspecific base directories. \n",
"type": "string", "type": "string",
"const": "read-app-specific-dirs-recursive", "const": "read-app-specific-dirs-recursive",
"markdownDescription": "This permission allows recursive read functionality on the application\nspecific base directories.\n\n#### This permission set includes:\n\n- `allow-read-dir`\n- `allow-read-file`\n- `allow-read-text-file`\n- `allow-read-text-file-lines`\n- `allow-read-text-file-lines-next`\n- `allow-exists`\n- `scope-app-recursive`" "markdownDescription": "This permission allows recursive read functionality on the application\nspecific base directories. \n"
}, },
{ {
"description": "This enables directory read and file metadata related commands without any pre-configured accessible paths.", "description": "This enables directory read and file metadata related commands without any pre-configured accessible paths.",
+109 -106
View File
@@ -74,7 +74,7 @@ pub type CommandResult<T> = std::result::Result<T, CommandError>;
/// Represents either a plain PathBuf or a PathHandle that manages security-scoped resources. /// Represents either a plain PathBuf or a PathHandle that manages security-scoped resources.
pub enum PathKind<R: Runtime> { pub enum PathKind<R: Runtime> {
/// A plain path that doesn't manage security-scoped resources. /// A plain path that doesn't manage security-scoped resources.
#[cfg(mobile)] // only used on mobile #[allow(dead_code)] // only used on mobile
Path(PathBuf), Path(PathBuf),
/// A path handle that manages security-scoped resources and will clean them up on drop. /// A path handle that manages security-scoped resources and will clean them up on drop.
Handle(PathHandle<R>), Handle(PathHandle<R>),
@@ -84,7 +84,6 @@ impl<R: Runtime> PathKind<R> {
/// Get a reference to the underlying path. /// Get a reference to the underlying path.
pub fn as_path(&self) -> &Path { pub fn as_path(&self) -> &Path {
match self { match self {
#[cfg(mobile)]
PathKind::Path(p) => p.as_ref(), PathKind::Path(p) => p.as_ref(),
PathKind::Handle(h) => h.as_ref(), PathKind::Handle(h) => h.as_ref(),
} }
@@ -93,7 +92,6 @@ impl<R: Runtime> PathKind<R> {
/// Get a reference to the underlying PathBuf. /// Get a reference to the underlying PathBuf.
pub fn as_path_buf(&self) -> &PathBuf { pub fn as_path_buf(&self) -> &PathBuf {
match self { match self {
#[cfg(mobile)]
PathKind::Path(p) => p, PathKind::Path(p) => p,
PathKind::Handle(h) => h, PathKind::Handle(h) => h,
} }
@@ -116,13 +114,27 @@ impl<R: Runtime> AsRef<PathBuf> for PathKind<R> {
pub struct FileHandle<R: Runtime> { pub struct FileHandle<R: Runtime> {
file: File, file: File,
path: PathKind<R>, path: PathKind<R>,
#[cfg(target_os = "ios")] #[allow(dead_code)] // Used in Drop implementation
path_: SafeFilePath, path_: SafeFilePath,
#[cfg(target_os = "ios")] #[allow(dead_code)] // Used in Drop implementation
app_handle: tauri::AppHandle<R>, app_handle: tauri::AppHandle<R>,
} }
impl<R: Runtime> FileHandle<R> { impl<R: Runtime> FileHandle<R> {
fn new(
file: File,
path: PathKind<R>,
path_: SafeFilePath,
app_handle: tauri::AppHandle<R>,
) -> Self {
Self {
file,
path,
path_,
app_handle,
}
}
/// Get the resolved path. /// Get the resolved path.
pub fn path(&self) -> &Path { pub fn path(&self) -> &Path {
self.path.as_path() self.path.as_path()
@@ -143,39 +155,41 @@ impl<R: Runtime> DerefMut for FileHandle<R> {
} }
} }
#[cfg(target_os = "ios")]
impl<R: Runtime> Drop for FileHandle<R> { impl<R: Runtime> Drop for FileHandle<R> {
fn drop(&mut self) { fn drop(&mut self) {
// Only clean up if we have a plain PathBuf, not a PathHandle #[cfg(target_os = "ios")]
// PathHandle will handle its own cleanup when it's dropped {
if let PathKind::Path(_) = &self.path { // Only clean up if we have a plain PathBuf, not a PathHandle
use crate::{FilePath, FsExt}; // PathHandle will handle its own cleanup when it's dropped
// Convert SafeFilePath to FilePath if let PathKind::Path(_) = &self.path {
let file_path: FilePath = match &self.path_ { use crate::{FilePath, FsExt};
SafeFilePath::Url(url) => FilePath::Url(url.clone()), // Convert SafeFilePath to FilePath
SafeFilePath::Path(safe_path) => FilePath::Path(safe_path.as_ref().to_owned()), let file_path: FilePath = match &self.path_ {
}; SafeFilePath::Url(url) => FilePath::Url(url.clone()),
SafeFilePath::Path(safe_path) => FilePath::Path(safe_path.as_ref().to_owned()),
};
// Only clean up if we're tracking this resource // Only clean up if we're tracking this resource
// If start_accessing_security_scoped_resource was used, it won't be in our tracking // If start_accessing_security_scoped_resource was used, it won't be in our tracking
// and we shouldn't interfere // and we shouldn't interfere
if let FilePath::Url(url) = file_path { if let FilePath::Url(url) = file_path {
if url.scheme() == "file" { if url.scheme() == "file" {
let security_scoped_resources = let security_scoped_resources =
self.app_handle.state::<crate::SecurityScopedResources>(); self.app_handle.state::<crate::SecurityScopedResources>();
// Only clean up if it's not tracked manually // Only clean up if it's not tracked manually
if !security_scoped_resources.is_tracked_manually(url.as_str()) { if !security_scoped_resources.is_tracked_manually(url.as_str()) {
log::debug!( log::debug!("Stopping accessing security-scoped resource for URL: {url} on drop");
"Stopping accessing security-scoped resource for URL: {url} on drop" let _ = self
); .app_handle
let _ = self .fs()
.app_handle .stop_accessing_security_scoped_resource(FilePath::Url(
.fs() url.clone(),
.stop_accessing_security_scoped_resource(FilePath::Url(url.clone())); ));
security_scoped_resources.remove(url.as_str()); security_scoped_resources.remove(url.as_str());
} else { } else {
log::debug!("Not cleaning up security-scoped resource for URL: {url} on drop (manually tracked via start_accessing_security_scoped_resource)"); log::debug!("Not cleaning up security-scoped resource for URL: {url} on drop (manually tracked via start_accessing_security_scoped_resource)");
}
} }
} }
} }
@@ -222,36 +236,38 @@ impl<R: Runtime> AsRef<PathBuf> for PathHandle<R> {
} }
} }
#[cfg(target_os = "ios")]
impl<R: Runtime> Drop for PathHandle<R> { impl<R: Runtime> Drop for PathHandle<R> {
fn drop(&mut self) { fn drop(&mut self) {
use crate::{FilePath, FsExt}; #[cfg(target_os = "ios")]
// Convert SafeFilePath to FilePath {
let file_path: FilePath = match &self.path_ { use crate::{FilePath, FsExt};
SafeFilePath::Url(url) => FilePath::Url(url.clone()), // Convert SafeFilePath to FilePath
SafeFilePath::Path(safe_path) => FilePath::Path(safe_path.as_ref().to_owned()), let file_path: FilePath = match &self.path_ {
}; SafeFilePath::Url(url) => FilePath::Url(url.clone()),
SafeFilePath::Path(safe_path) => FilePath::Path(safe_path.as_ref().to_owned()),
};
// Only clean up if we're tracking this resource (i.e., resolve_path started it) // Only clean up if we're tracking this resource (i.e., resolve_path started it)
// If start_accessing_security_scoped_resource was used, it won't be in our tracking // If start_accessing_security_scoped_resource was used, it won't be in our tracking
// and we shouldn't interfere // and we shouldn't interfere
if let FilePath::Url(url) = file_path { if let FilePath::Url(url) = file_path {
if url.scheme() == "file" { if url.scheme() == "file" {
let security_scoped_resources = let security_scoped_resources =
self.app_handle.state::<crate::SecurityScopedResources>(); self.app_handle.state::<crate::SecurityScopedResources>();
// Only clean up if it's not tracked manually // Only clean up if it's not tracked manually
if !security_scoped_resources.is_tracked_manually(url.as_str()) { if !security_scoped_resources.is_tracked_manually(url.as_str()) {
log::debug!( log::debug!(
"Stopping accessing security-scoped resource for URL: {url} on drop" "Stopping accessing security-scoped resource for URL: {url} on drop"
); );
let _ = self let _ = self
.app_handle .app_handle
.fs() .fs()
.stop_accessing_security_scoped_resource(FilePath::Url(url.clone())); .stop_accessing_security_scoped_resource(FilePath::Url(url.clone()));
security_scoped_resources.remove(url.as_str()); security_scoped_resources.remove(url.as_str());
} else { } else {
log::debug!("Not cleaning up security-scoped resource for URL: {url} on drop (manually tracked via start_accessing_security_scoped_resource)"); log::debug!("Not cleaning up security-scoped resource for URL: {url} on drop (manually tracked via start_accessing_security_scoped_resource)");
}
} }
} }
} }
@@ -272,7 +288,6 @@ pub fn create<R: Runtime>(
path: SafeFilePath, path: SafeFilePath,
options: Option<BaseOptions>, options: Option<BaseOptions>,
) -> CommandResult<ResourceId> { ) -> CommandResult<ResourceId> {
#[cfg(target_os = "ios")]
let path_ = path.clone(); let path_ = path.clone();
let resolved_path_handle = resolve_path( let resolved_path_handle = resolve_path(
"create", "create",
@@ -288,16 +303,13 @@ pub fn create<R: Runtime>(
resolved_path_handle.display() resolved_path_handle.display()
) )
})?; })?;
#[cfg(target_os = "ios")]
let app_handle = webview.app_handle().clone(); let app_handle = webview.app_handle().clone();
let file_handle = FileHandle { let file_handle = FileHandle::new(
file, file,
path: PathKind::Handle(resolved_path_handle), PathKind::Handle(resolved_path_handle),
#[cfg(target_os = "ios")]
path_, path_,
#[cfg(target_os = "ios")]
app_handle, app_handle,
}; );
let rid = webview let rid = webview
.resources_table() .resources_table()
.add(StdFileResource::new(file_handle)); .add(StdFileResource::new(file_handle));
@@ -1405,7 +1417,6 @@ fn resolve_file_in_fs<R: Runtime>(
path: SafeFilePath, path: SafeFilePath,
open_options: OpenOptions, open_options: OpenOptions,
) -> CommandResult<FileHandle<R>> { ) -> CommandResult<FileHandle<R>> {
#[cfg(target_os = "ios")]
let path_ = path.clone(); let path_ = path.clone();
let resolved_path_handle = resolve_path( let resolved_path_handle = resolve_path(
permission, permission,
@@ -1425,16 +1436,13 @@ fn resolve_file_in_fs<R: Runtime>(
) )
})?; })?;
#[cfg(target_os = "ios")]
let app_handle = webview.app_handle().clone(); let app_handle = webview.app_handle().clone();
Ok(FileHandle { Ok(FileHandle::new(
file, file,
path: PathKind::Handle(resolved_path_handle), PathKind::Handle(resolved_path_handle),
#[cfg(target_os = "ios")]
path_, path_,
#[cfg(target_os = "ios")]
app_handle, app_handle,
}) ))
} }
#[cfg(mobile)] #[cfg(mobile)]
@@ -1448,7 +1456,6 @@ pub fn resolve_file<R: Runtime>(
) -> CommandResult<FileHandle<R>> { ) -> CommandResult<FileHandle<R>> {
use crate::FsExt; use crate::FsExt;
#[cfg(target_os = "ios")]
let path_ = path.clone(); let path_ = path.clone();
match path { match path {
SafeFilePath::Url(url) => { SafeFilePath::Url(url) => {
@@ -1456,16 +1463,13 @@ pub fn resolve_file<R: Runtime>(
let file = webview let file = webview
.fs() .fs()
.open(SafeFilePath::Url(url.clone()), open_options.options)?; .open(SafeFilePath::Url(url.clone()), open_options.options)?;
#[cfg(target_os = "ios")]
let app_handle = webview.app_handle().clone(); let app_handle = webview.app_handle().clone();
Ok(FileHandle { Ok(FileHandle::new(
file, file,
path: PathKind::Path(resolved_path), PathKind::Path(resolved_path),
#[cfg(target_os = "ios")]
path_, path_,
#[cfg(target_os = "ios")]
app_handle, app_handle,
}) ))
} }
SafeFilePath::Path(path) => resolve_file_in_fs( SafeFilePath::Path(path) => resolve_file_in_fs(
permission, permission,
@@ -1490,37 +1494,36 @@ pub fn resolve_path<R: Runtime>(
// On iOS, start accessing security-scoped resource if the path is a file URL // On iOS, start accessing security-scoped resource if the path is a file URL
// Only if it hasn't been started already via start_accessing_security_scoped_resource // Only if it hasn't been started already via start_accessing_security_scoped_resource
#[cfg(target_os = "ios")] #[cfg(target_os = "ios")]
if let SafeFilePath::Url(url) = &path { {
if url.scheme() == "file" { if let SafeFilePath::Url(url) = &path {
use objc2_foundation::{NSString, NSURL}; if url.scheme() == "file" {
use objc2_foundation::{NSString, NSURL};
let security_scoped_resources = webview.state::<crate::SecurityScopedResources>(); let security_scoped_resources = webview.state::<crate::SecurityScopedResources>();
// Check if already active (started via start_accessing_security_scoped_resource) // Check if already active (started via start_accessing_security_scoped_resource)
if !security_scoped_resources.is_tracked_manually(url.as_str()) { if !security_scoped_resources.is_tracked_manually(url.as_str()) {
let url_nsstring = NSString::from_str(url.as_str()); let url_nsstring = NSString::from_str(url.as_str());
let ns_url = unsafe { NSURL::URLWithString(&url_nsstring) }; let ns_url = unsafe { NSURL::URLWithString(&url_nsstring) };
if let Some(ns_url) = ns_url { if let Some(ns_url) = ns_url {
// Start accessing the security-scoped resource // Start accessing the security-scoped resource
// This is required for files outside the app's sandbox (e.g., from file picker) // This is required for files outside the app's sandbox (e.g., from file picker)
unsafe { unsafe {
let success = ns_url.startAccessingSecurityScopedResource(); let success = ns_url.startAccessingSecurityScopedResource();
if success { if success {
log::debug!("Started accessing security-scoped resource for URL: {} (via resolve_path)", url.as_str()); log::debug!("Started accessing security-scoped resource for URL: {} (via resolve_path)", url.as_str());
// Track it so we know to clean it up // Track it so we know to clean it up
security_scoped_resources.track_manually(url.as_str().to_string()); security_scoped_resources.track_manually(url.as_str().to_string());
} else { } else {
log::warn!( log::warn!("Failed to start accessing security-scoped resource for URL: {}", url.as_str());
"Failed to start accessing security-scoped resource for URL: {}", }
url.as_str()
);
} }
} else {
log::debug!("Failed to create NSURL from URL: {}, ignoring security-scoped resource access request", url.as_str());
} }
} else { } else {
log::debug!("Failed to create NSURL from URL: {}, ignoring security-scoped resource access request", url.as_str()); log::debug!("Security-scoped resource already active for URL: {} (started via start_accessing_security_scoped_resource), skipping", url.as_str());
} }
} else {
log::debug!("Security-scoped resource already active for URL: {} (started via start_accessing_security_scoped_resource), skipping", url.as_str());
} }
} }
} }
-4
View File
@@ -3,10 +3,6 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
//! Access the file system. //! Access the file system.
//!
//! ## Cargo features
//!
//! - **watch**: Enables the `watch` command backed by [`notify`](http://crates.io/crates/notify).
// TODO(v3): consider redesign the API to implement automatic stopAccessingSecurityScopedResource on iOS // TODO(v3): consider redesign the API to implement automatic stopAccessingSecurityScopedResource on iOS
// this likely requires returning a handle to a resource so we can impl Drop for it // this likely requires returning a handle to a resource so we can impl Drop for it
-5
View File
@@ -1,10 +1,5 @@
# Changelog # Changelog
## [2.3.3]
- [`db9c5998`](https://github.com/tauri-apps/plugins-workspace/commit/db9c5998feff9384f9cbbefcbe0d45937c00a1fc) ([#3531](https://github.com/tauri-apps/plugins-workspace/pull/3531) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Fix missing `consumer-rules.pro` on Gradle v9.
- [`f8053e65`](https://github.com/tauri-apps/plugins-workspace/commit/f8053e659e4ccd85c1f52833411ff8417cbc5e69) ([#3527](https://github.com/tauri-apps/plugins-workspace/pull/3527) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Documented Cargo feature flags in each plugin's crate-level documentation.
## \[2.3.2] ## \[2.3.2]
- [`93426f85`](https://github.com/tauri-apps/plugins-workspace/commit/93426f85120f49beb9f40222bff45185a32d54a9) Fixed an issue that caused docs.rs builds to fail. No user facing changes. - [`93426f85`](https://github.com/tauri-apps/plugins-workspace/commit/93426f85120f49beb9f40222bff45185a32d54a9) Fixed an issue that caused docs.rs builds to fail. No user facing changes.
+1 -2
View File
@@ -1,13 +1,12 @@
[package] [package]
name = "tauri-plugin-geolocation" name = "tauri-plugin-geolocation"
description = "Get and track the device's current position" description = "Get and track the device's current position"
version = "2.3.3" version = "2.3.2"
edition = { workspace = true } edition = { workspace = true }
authors = { workspace = true } authors = { workspace = true }
license = { workspace = true } license = { workspace = true }
repository = { workspace = true } repository = { workspace = true }
links = "tauri-plugin-geolocation" links = "tauri-plugin-geolocation"
exclude = ["/guest-js", "/package.json", "/rollup.config.js", "/tsconfig.json"]
[package.metadata.docs.rs] [package.metadata.docs.rs]
targets = ["x86_64-linux-android"] targets = ["x86_64-linux-android"]
@@ -14,6 +14,15 @@ android {
consumerProguardFiles("consumer-rules.pro") consumerProguardFiles("consumer-rules.pro")
} }
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8

Some files were not shown because too many files have changed in this diff Show More