Full Code of tauri-apps/tauri for AI

dev 1ef6a119b157 cached
956 files
6.1 MB
1.7M tokens
5662 symbols
3 requests
Download .txt
Showing preview only (6,583K chars total). Download the full file or copy to clipboard to get everything.
Repository: tauri-apps/tauri
Branch: dev
Commit: 1ef6a119b157
Files: 956
Total size: 6.1 MB

Directory structure:
gitextract_bd3gcnsk/

├── .cargo/
│   ├── audit.toml
│   └── config.toml
├── .changes/
│   ├── README.md
│   ├── base64.md
│   ├── config.json
│   ├── data-tauri-drag-region-deep.md
│   ├── fix-build-bundles-arg.md
│   ├── linux-deploy-link.md
│   ├── prompt-signing-key-password-context.md
│   └── toml-ver.md
├── .devcontainer/
│   ├── Dockerfile
│   ├── README.md
│   └── devcontainer.json
├── .docker/
│   └── cross/
│       ├── aarch64.Dockerfile
│       ├── cmake.sh
│       ├── common.sh
│       ├── deny-debian-packages.sh
│       ├── dropbear.sh
│       ├── lib.sh
│       ├── linux-image.sh
│       ├── linux-runner
│       ├── qemu.sh
│       └── xargo.sh
├── .editorconfig
├── .github/
│   ├── CODEOWNERS
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── docs_report.md
│   │   └── feature_request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── RELEASING.md
│   └── workflows/
│       ├── audit.yml
│       ├── bench.yml
│       ├── check-change-tags.yml
│       ├── check-generated-files.yml
│       ├── check-license-header.yml
│       ├── covector-comment-on-fork.yml
│       ├── covector-status.yml
│       ├── covector-version-or-publish.yml
│       ├── deploy-schema-worker.yml
│       ├── docker.yml
│       ├── fmt.yml
│       ├── lint-js.yml
│       ├── lint-rust.yml
│       ├── publish-cli-js.yml
│       ├── publish-cli-rs.yml
│       ├── supply-chain.yml
│       ├── test-android.yml
│       ├── test-cli-js.yml
│       ├── test-cli-rs.yml
│       ├── test-core.yml
│       └── udeps.yml
├── .gitignore
├── .prettierignore
├── .prettierrc
├── .scripts/
│   └── ci/
│       ├── check-change-tags.js
│       ├── check-license-header.js
│       ├── has-diff.sh
│       ├── pack-cli.sh
│       └── sync-cli-metadata.js
├── .vscode/
│   └── extensions.json
├── ARCHITECTURE.md
├── Cargo.toml
├── LICENSE.spdx
├── LICENSE_APACHE-2.0
├── LICENSE_MIT
├── README.md
├── SECURITY.md
├── bench/
│   ├── Cargo.toml
│   ├── README.md
│   ├── src/
│   │   ├── build_benchmark_jsons.rs
│   │   ├── run_benchmark.rs
│   │   └── utils.rs
│   └── tests/
│       ├── cpu_intensive/
│       │   ├── public/
│       │   │   ├── index.css
│       │   │   ├── index.html
│       │   │   ├── site.js
│       │   │   └── worker.js
│       │   └── src-tauri/
│       │       ├── .gitignore
│       │       ├── Cargo.toml
│       │       ├── build.rs
│       │       ├── src/
│       │       │   └── main.rs
│       │       └── tauri.conf.json
│       ├── files_transfer/
│       │   ├── public/
│       │   │   └── index.html
│       │   └── src-tauri/
│       │       ├── .gitignore
│       │       ├── Cargo.toml
│       │       ├── build.rs
│       │       ├── src/
│       │       │   └── main.rs
│       │       └── tauri.conf.json
│       └── helloworld/
│           ├── public/
│           │   └── index.html
│           └── src-tauri/
│               ├── .gitignore
│               ├── Cargo.toml
│               ├── build.rs
│               ├── src/
│               │   └── main.rs
│               └── tauri.conf.json
├── crates/
│   ├── tauri/
│   │   ├── .scripts/
│   │   │   └── loop_qc.sh
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   ├── build.rs
│   │   ├── mobile/
│   │   │   ├── android/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle.kts
│   │   │   │   ├── proguard-rules.pro
│   │   │   │   └── src/
│   │   │   │       ├── androidTest/
│   │   │   │       │   └── java/
│   │   │   │       │       └── app/
│   │   │   │       │           └── tauri/
│   │   │   │       │               └── ExampleInstrumentedTest.kt
│   │   │   │       ├── main/
│   │   │   │       │   ├── AndroidManifest.xml
│   │   │   │       │   └── java/
│   │   │   │       │       └── app/
│   │   │   │       │           └── tauri/
│   │   │   │       │               ├── AppPlugin.kt
│   │   │   │       │               ├── FsUtils.kt
│   │   │   │       │               ├── JniMethod.kt
│   │   │   │       │               ├── Logger.kt
│   │   │   │       │               ├── PathPlugin.kt
│   │   │   │       │               ├── PermissionHelper.kt
│   │   │   │       │               ├── PermissionState.kt
│   │   │   │       │               ├── annotation/
│   │   │   │       │               │   ├── ActivityCallback.kt
│   │   │   │       │               │   ├── InvokeArg.kt
│   │   │   │       │               │   ├── Permission.kt
│   │   │   │       │               │   ├── PermissionCallback.kt
│   │   │   │       │               │   ├── PluginMethod.kt
│   │   │   │       │               │   └── TauriPlugin.kt
│   │   │   │       │               └── plugin/
│   │   │   │       │                   ├── Channel.kt
│   │   │   │       │                   ├── InvalidPluginMethodException.kt
│   │   │   │       │                   ├── Invoke.kt
│   │   │   │       │                   ├── JSArray.kt
│   │   │   │       │                   ├── JSObject.kt
│   │   │   │       │                   ├── Plugin.kt
│   │   │   │       │                   ├── PluginHandle.kt
│   │   │   │       │                   ├── PluginManager.kt
│   │   │   │       │                   ├── PluginMethodData.kt
│   │   │   │       │                   └── PluginResult.kt
│   │   │   │       └── test/
│   │   │   │           └── java/
│   │   │   │               └── app/
│   │   │   │                   └── tauri/
│   │   │   │                       └── ExampleUnitTest.kt
│   │   │   ├── android-codegen/
│   │   │   │   └── TauriActivity.kt
│   │   │   ├── ios-api/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── Package.swift
│   │   │   │   ├── README.md
│   │   │   │   ├── Sources/
│   │   │   │   │   └── Tauri/
│   │   │   │   │       ├── Channel.swift
│   │   │   │   │       ├── Invoke.swift
│   │   │   │   │       ├── JSTypes.swift
│   │   │   │   │       ├── JsonValue.swift
│   │   │   │   │       ├── Logger.swift
│   │   │   │   │       ├── Plugin/
│   │   │   │   │       │   └── Plugin.swift
│   │   │   │   │       ├── Tauri.swift
│   │   │   │   │       └── UiUtils.swift
│   │   │   │   └── Tests/
│   │   │   │       └── TauriTests/
│   │   │   │           └── TauriTests.swift
│   │   │   └── proguard-tauri.pro
│   │   ├── permissions/
│   │   │   ├── app/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── event/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── image/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── menu/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── path/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── resources/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── tray/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── webview/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   └── window/
│   │   │       └── autogenerated/
│   │   │           └── reference.md
│   │   ├── scripts/
│   │   │   ├── bundle.global.js
│   │   │   ├── core.js
│   │   │   ├── freeze_prototype.js
│   │   │   ├── init.js
│   │   │   ├── ipc-protocol.js
│   │   │   ├── ipc.js
│   │   │   ├── isolation.js
│   │   │   ├── pattern.js
│   │   │   └── process-ipc-message-fn.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   └── plugin.rs
│   │   │   ├── app.rs
│   │   │   ├── async_runtime.rs
│   │   │   ├── error.rs
│   │   │   ├── event/
│   │   │   │   ├── event-system-spec.md
│   │   │   │   ├── event_name.rs
│   │   │   │   ├── init.js
│   │   │   │   ├── listener.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── plugin.rs
│   │   │   ├── image/
│   │   │   │   ├── mod.rs
│   │   │   │   └── plugin.rs
│   │   │   ├── ios.rs
│   │   │   ├── ipc/
│   │   │   │   ├── authority.rs
│   │   │   │   ├── capability_builder.rs
│   │   │   │   ├── channel.rs
│   │   │   │   ├── command.rs
│   │   │   │   ├── format_callback.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── protocol.rs
│   │   │   ├── lib.rs
│   │   │   ├── manager/
│   │   │   │   ├── menu.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── tray.rs
│   │   │   │   ├── webview.rs
│   │   │   │   └── window.rs
│   │   │   ├── menu/
│   │   │   │   ├── builders/
│   │   │   │   │   ├── check.rs
│   │   │   │   │   ├── icon.rs
│   │   │   │   │   ├── menu.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── normal.rs
│   │   │   │   ├── check.rs
│   │   │   │   ├── icon.rs
│   │   │   │   ├── menu.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── normal.rs
│   │   │   │   ├── plugin.rs
│   │   │   │   ├── predefined.rs
│   │   │   │   └── submenu.rs
│   │   │   ├── path/
│   │   │   │   ├── android.rs
│   │   │   │   ├── desktop.rs
│   │   │   │   ├── init.js
│   │   │   │   ├── mod.rs
│   │   │   │   └── plugin.rs
│   │   │   ├── pattern.rs
│   │   │   ├── plugin/
│   │   │   │   └── mobile.rs
│   │   │   ├── plugin.rs
│   │   │   ├── process.rs
│   │   │   ├── protocol/
│   │   │   │   ├── asset.rs
│   │   │   │   ├── isolation.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── tauri.rs
│   │   │   ├── resources/
│   │   │   │   ├── mod.rs
│   │   │   │   └── plugin.rs
│   │   │   ├── scope/
│   │   │   │   ├── fs.rs
│   │   │   │   └── mod.rs
│   │   │   ├── state.rs
│   │   │   ├── test/
│   │   │   │   ├── mock_runtime.rs
│   │   │   │   └── mod.rs
│   │   │   ├── tray/
│   │   │   │   ├── mod.rs
│   │   │   │   └── plugin.rs
│   │   │   ├── vibrancy/
│   │   │   │   ├── macos.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── windows.rs
│   │   │   ├── webview/
│   │   │   │   ├── mod.rs
│   │   │   │   ├── plugin.rs
│   │   │   │   ├── scripts/
│   │   │   │   │   ├── print.js
│   │   │   │   │   ├── toggle-devtools.js
│   │   │   │   │   └── zoom-hotkey.js
│   │   │   │   └── webview_window.rs
│   │   │   └── window/
│   │   │       ├── mod.rs
│   │   │       ├── plugin.rs
│   │   │       └── scripts/
│   │   │           └── drag.js
│   │   └── test/
│   │       ├── api/
│   │       │   ├── test.txt
│   │       │   └── test_binary
│   │       ├── fixture/
│   │       │   ├── config.json
│   │       │   ├── dist/
│   │       │   │   └── index.html
│   │       │   ├── isolation/
│   │       │   │   ├── dist/
│   │       │   │   │   └── index.html
│   │       │   │   ├── isolation-dist/
│   │       │   │   │   ├── index.html
│   │       │   │   │   └── index.js
│   │       │   │   └── src-tauri/
│   │       │   │       ├── icons/
│   │       │   │       │   └── icon.ico~dev
│   │       │   │       └── tauri.conf.json
│   │       │   ├── src-tauri/
│   │       │   │   ├── icons/
│   │       │   │   │   └── icon.ico~dev
│   │       │   │   └── tauri.conf.json
│   │       │   └── test.txt
│   │       └── updater/
│   │           └── fixture/
│   │               ├── archives/
│   │               │   ├── archive.linux.tar.gz.sig
│   │               │   ├── archive.macos.tar.gz.sig
│   │               │   └── archive.windows.zip.sig
│   │               ├── bad_signature/
│   │               │   ├── update.key
│   │               │   └── update.key.pub
│   │               └── good_signature/
│   │                   ├── update.key
│   │                   └── update.key.pub
│   ├── tauri-build/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   └── src/
│   │       ├── acl.rs
│   │       ├── codegen/
│   │       │   ├── context.rs
│   │       │   └── mod.rs
│   │       ├── lib.rs
│   │       ├── manifest.rs
│   │       ├── mobile.rs
│   │       ├── static_vcruntime.rs
│   │       └── windows-app-manifest.xml
│   ├── tauri-bundler/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── License_Apache.md
│   │   ├── License_MIT.md
│   │   ├── README.md
│   │   └── src/
│   │       ├── bundle/
│   │       │   ├── category.rs
│   │       │   ├── kmp/
│   │       │   │   └── mod.rs
│   │       │   ├── linux/
│   │       │   │   ├── appimage/
│   │       │   │   │   ├── linuxdeploy-plugin-gstreamer.sh
│   │       │   │   │   ├── linuxdeploy-plugin-gtk.sh
│   │       │   │   │   ├── linuxdeploy.rs
│   │       │   │   │   └── mod.rs
│   │       │   │   ├── debian.rs
│   │       │   │   ├── freedesktop/
│   │       │   │   │   ├── main.desktop
│   │       │   │   │   └── mod.rs
│   │       │   │   ├── mod.rs
│   │       │   │   └── rpm.rs
│   │       │   ├── macos/
│   │       │   │   ├── app.rs
│   │       │   │   ├── dmg/
│   │       │   │   │   ├── bundle_dmg
│   │       │   │   │   ├── eula-resources-template.xml
│   │       │   │   │   ├── mod.rs
│   │       │   │   │   └── template.applescript
│   │       │   │   ├── icon.rs
│   │       │   │   ├── ios.rs
│   │       │   │   ├── mod.rs
│   │       │   │   └── sign.rs
│   │       │   ├── platform.rs
│   │       │   ├── settings.rs
│   │       │   ├── updater_bundle.rs
│   │       │   └── windows/
│   │       │       ├── mod.rs
│   │       │       ├── msi/
│   │       │       │   ├── default-locale-strings.xml
│   │       │       │   ├── install-task.ps1
│   │       │       │   ├── languages.json
│   │       │       │   ├── main.wxs
│   │       │       │   ├── mod.rs
│   │       │       │   ├── uninstall-task.ps1
│   │       │       │   └── update-task.xml
│   │       │       ├── nsis/
│   │       │       │   ├── FileAssociation.nsh
│   │       │       │   ├── installer.nsi
│   │       │       │   ├── languages/
│   │       │       │   │   ├── Arabic.nsh
│   │       │       │   │   ├── Bulgarian.nsh
│   │       │       │   │   ├── Dutch.nsh
│   │       │       │   │   ├── English.nsh
│   │       │       │   │   ├── French.nsh
│   │       │       │   │   ├── German.nsh
│   │       │       │   │   ├── Hebrew.nsh
│   │       │       │   │   ├── Italian.nsh
│   │       │       │   │   ├── Japanese.nsh
│   │       │       │   │   ├── Korean.nsh
│   │       │       │   │   ├── Norwegian.nsh
│   │       │       │   │   ├── Persian.nsh
│   │       │       │   │   ├── Portuguese.nsh
│   │       │       │   │   ├── PortugueseBR.nsh
│   │       │       │   │   ├── Russian.nsh
│   │       │       │   │   ├── SimpChinese.nsh
│   │       │       │   │   ├── Spanish.nsh
│   │       │       │   │   ├── SpanishInternational.nsh
│   │       │       │   │   ├── Swedish.nsh
│   │       │       │   │   ├── TradChinese.nsh
│   │       │       │   │   ├── Turkish.nsh
│   │       │       │   │   └── Ukrainian.nsh
│   │       │       │   ├── mod.rs
│   │       │       │   └── utils.nsh
│   │       │       ├── sign.rs
│   │       │       └── util.rs
│   │       ├── bundle.rs
│   │       ├── error.rs
│   │       ├── lib.rs
│   │       └── utils/
│   │           ├── fs_utils.rs
│   │           ├── http_utils.rs
│   │           └── mod.rs
│   ├── tauri-cli/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── ENVIRONMENT_VARIABLES.md
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   ├── build.rs
│   │   ├── config.schema.json
│   │   ├── metadata-v2.json
│   │   ├── metadata.json
│   │   ├── schema.json
│   │   ├── scripts/
│   │   │   └── kill-children.sh
│   │   ├── src/
│   │   │   ├── acl/
│   │   │   │   ├── capability/
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── new.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── permission/
│   │   │   │       ├── add.rs
│   │   │   │       ├── ls.rs
│   │   │   │       ├── mod.rs
│   │   │   │       ├── new.rs
│   │   │   │       └── rm.rs
│   │   │   ├── add.rs
│   │   │   ├── build.rs
│   │   │   ├── bundle.rs
│   │   │   ├── completions.rs
│   │   │   ├── dev/
│   │   │   │   ├── auto-reload.js
│   │   │   │   └── builtin_dev_server.rs
│   │   │   ├── dev.rs
│   │   │   ├── error.rs
│   │   │   ├── helpers/
│   │   │   │   ├── app_paths.rs
│   │   │   │   ├── cargo.rs
│   │   │   │   ├── cargo_manifest.rs
│   │   │   │   ├── config.rs
│   │   │   │   ├── flock.rs
│   │   │   │   ├── framework.rs
│   │   │   │   ├── fs.rs
│   │   │   │   ├── http.rs
│   │   │   │   ├── icns.json
│   │   │   │   ├── mod.rs
│   │   │   │   ├── npm.rs
│   │   │   │   ├── pbxproj.rs
│   │   │   │   ├── plist.rs
│   │   │   │   ├── plugins.rs
│   │   │   │   ├── prompts.rs
│   │   │   │   ├── template.rs
│   │   │   │   └── updater_signature.rs
│   │   │   ├── icon.rs
│   │   │   ├── info/
│   │   │   │   ├── app.rs
│   │   │   │   ├── env_nodejs.rs
│   │   │   │   ├── env_rust.rs
│   │   │   │   ├── env_system.rs
│   │   │   │   ├── ios.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── packages_nodejs.rs
│   │   │   │   ├── packages_rust.rs
│   │   │   │   └── plugins.rs
│   │   │   ├── init.rs
│   │   │   ├── inspect.rs
│   │   │   ├── interface/
│   │   │   │   ├── mod.rs
│   │   │   │   ├── rust/
│   │   │   │   │   ├── cargo_config.rs
│   │   │   │   │   ├── desktop.rs
│   │   │   │   │   ├── installation.rs
│   │   │   │   │   └── manifest.rs
│   │   │   │   └── rust.rs
│   │   │   ├── lib.rs
│   │   │   ├── main.rs
│   │   │   ├── migrate/
│   │   │   │   ├── migrations/
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── v1/
│   │   │   │   │   │   ├── config.rs
│   │   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   │   ├── api-example.tauri.conf.json
│   │   │   │   │   │   │   └── cli-template.tauri.conf.json
│   │   │   │   │   │   ├── frontend/
│   │   │   │   │   │   │   └── partial_loader/
│   │   │   │   │   │   │       ├── mod.rs
│   │   │   │   │   │   │       ├── svelte.rs
│   │   │   │   │   │   │       └── vue.rs
│   │   │   │   │   │   ├── frontend.rs
│   │   │   │   │   │   ├── manifest.rs
│   │   │   │   │   │   └── mod.rs
│   │   │   │   │   └── v2_beta.rs
│   │   │   │   └── mod.rs
│   │   │   ├── mobile/
│   │   │   │   ├── android/
│   │   │   │   │   ├── android_studio_script.rs
│   │   │   │   │   ├── build.rs
│   │   │   │   │   ├── dev.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── project.rs
│   │   │   │   │   └── run.rs
│   │   │   │   ├── init.rs
│   │   │   │   ├── ios/
│   │   │   │   │   ├── build.rs
│   │   │   │   │   ├── dev.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── project.rs
│   │   │   │   │   ├── run.rs
│   │   │   │   │   └── xcode_script.rs
│   │   │   │   └── mod.rs
│   │   │   ├── plugin/
│   │   │   │   ├── android.rs
│   │   │   │   ├── init.rs
│   │   │   │   ├── ios.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── new.rs
│   │   │   ├── remove.rs
│   │   │   └── signer/
│   │   │       ├── generate.rs
│   │   │       ├── mod.rs
│   │   │       └── sign.rs
│   │   ├── tauri-dev-watcher.gitignore
│   │   ├── tauri.config.schema.json
│   │   ├── tauri.gitignore
│   │   ├── templates/
│   │   │   ├── app/
│   │   │   │   └── src-tauri/
│   │   │   │       ├── .gitignore
│   │   │   │       ├── Cargo.crate-manifest
│   │   │   │       ├── build.rs
│   │   │   │       ├── capabilities/
│   │   │   │       │   └── default.json
│   │   │   │       ├── icons/
│   │   │   │       │   └── icon.icns
│   │   │   │       ├── src/
│   │   │   │       │   ├── lib.rs
│   │   │   │       │   └── main.rs
│   │   │   │       └── tauri.conf.json
│   │   │   ├── mobile/
│   │   │   │   ├── android/
│   │   │   │   │   ├── .editorconfig
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── .gitignore
│   │   │   │   │   │   ├── build.gradle.kts
│   │   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   │   └── src/
│   │   │   │   │   │       └── main/
│   │   │   │   │   │           ├── AndroidManifest.xml
│   │   │   │   │   │           ├── MainActivity.kt
│   │   │   │   │   │           └── res/
│   │   │   │   │   │               ├── drawable/
│   │   │   │   │   │               │   └── ic_launcher_background.xml
│   │   │   │   │   │               ├── drawable-v24/
│   │   │   │   │   │               │   └── ic_launcher_foreground.xml
│   │   │   │   │   │               ├── layout/
│   │   │   │   │   │               │   └── activity_main.xml
│   │   │   │   │   │               ├── values/
│   │   │   │   │   │               │   ├── colors.xml
│   │   │   │   │   │               │   ├── strings.xml
│   │   │   │   │   │               │   └── themes.xml
│   │   │   │   │   │               ├── values-night/
│   │   │   │   │   │               │   └── themes.xml
│   │   │   │   │   │               └── xml/
│   │   │   │   │   │                   └── file_paths.xml
│   │   │   │   │   ├── build.gradle.kts
│   │   │   │   │   ├── buildSrc/
│   │   │   │   │   │   ├── build.gradle.kts
│   │   │   │   │   │   └── src/
│   │   │   │   │   │       └── main/
│   │   │   │   │   │           └── kotlin/
│   │   │   │   │   │               ├── BuildTask.kt
│   │   │   │   │   │               └── RustPlugin.kt
│   │   │   │   │   ├── gradle/
│   │   │   │   │   │   └── wrapper/
│   │   │   │   │   │       ├── gradle-wrapper.jar
│   │   │   │   │   │       └── gradle-wrapper.properties
│   │   │   │   │   ├── gradle.properties
│   │   │   │   │   ├── gradlew
│   │   │   │   │   ├── gradlew.bat
│   │   │   │   │   └── settings.gradle
│   │   │   │   └── ios/
│   │   │   │       ├── .gitignore
│   │   │   │       ├── Assets.xcassets/
│   │   │   │       │   ├── AppIcon.appiconset/
│   │   │   │       │   │   └── Contents.json
│   │   │   │       │   └── Contents.json
│   │   │   │       ├── ExportOptions.plist
│   │   │   │       ├── LaunchScreen.storyboard
│   │   │   │       ├── Podfile
│   │   │   │       ├── Sources/
│   │   │   │       │   └── {{app.name}}/
│   │   │   │       │       ├── bindings/
│   │   │   │       │       │   └── bindings.h
│   │   │   │       │       └── main.mm
│   │   │   │       ├── project.yml
│   │   │   │       └── {{app.name}}.xcodeproj/
│   │   │   │           └── project.xcworkspace/
│   │   │   │               └── xcshareddata/
│   │   │   │                   └── WorkspaceSettings.xcsettings
│   │   │   ├── plugin/
│   │   │   │   ├── .github/
│   │   │   │   │   └── workflows/
│   │   │   │   │       ├── audit.yml
│   │   │   │   │       ├── clippy.yml
│   │   │   │   │       └── test.yml
│   │   │   │   ├── .gitignore
│   │   │   │   ├── Cargo.crate-manifest
│   │   │   │   ├── README.md
│   │   │   │   ├── __example-api/
│   │   │   │   │   └── tauri-app/
│   │   │   │   │       ├── .gitignore
│   │   │   │   │       ├── .vscode/
│   │   │   │   │       │   └── extensions.json
│   │   │   │   │       ├── README.md
│   │   │   │   │       ├── index.html
│   │   │   │   │       ├── jsconfig.json
│   │   │   │   │       ├── package.json
│   │   │   │   │       ├── src/
│   │   │   │   │       │   ├── App.svelte
│   │   │   │   │       │   ├── lib/
│   │   │   │   │       │   │   └── Greet.svelte
│   │   │   │   │       │   ├── main.js
│   │   │   │   │       │   ├── style.css
│   │   │   │   │       │   └── vite-env.d.ts
│   │   │   │   │       ├── src-tauri/
│   │   │   │   │       │   ├── .gitignore
│   │   │   │   │       │   ├── Cargo.crate-manifest
│   │   │   │   │       │   ├── build.rs
│   │   │   │   │       │   ├── capabilities/
│   │   │   │   │       │   │   └── default.json
│   │   │   │   │       │   ├── icons/
│   │   │   │   │       │   │   └── icon.icns
│   │   │   │   │       │   ├── src/
│   │   │   │   │       │   │   ├── lib.rs
│   │   │   │   │       │   │   └── main.rs
│   │   │   │   │       │   └── tauri.conf.json
│   │   │   │   │       └── vite.config.js
│   │   │   │   ├── __example-basic/
│   │   │   │   │   └── vanilla/
│   │   │   │   │       ├── .gitignore
│   │   │   │   │       ├── package.json
│   │   │   │   │       ├── public/
│   │   │   │   │       │   └── index.html
│   │   │   │   │       └── src-tauri/
│   │   │   │   │           ├── .gitignore
│   │   │   │   │           ├── Cargo.crate-manifest
│   │   │   │   │           ├── build.rs
│   │   │   │   │           ├── capabilities/
│   │   │   │   │           │   └── default.json
│   │   │   │   │           ├── icons/
│   │   │   │   │           │   └── icon.icns
│   │   │   │   │           ├── rustfmt.toml
│   │   │   │   │           ├── src/
│   │   │   │   │           │   ├── lib.rs
│   │   │   │   │           │   └── main.rs
│   │   │   │   │           └── tauri.conf.json
│   │   │   │   ├── android/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── build.gradle.kts
│   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   ├── settings.gradle
│   │   │   │   │   └── src/
│   │   │   │   │       ├── androidTest/
│   │   │   │   │       │   └── java/
│   │   │   │   │       │       └── ExampleInstrumentedTest.kt
│   │   │   │   │       ├── main/
│   │   │   │   │       │   ├── AndroidManifest.xml
│   │   │   │   │       │   └── java/
│   │   │   │   │       │       ├── Example.kt
│   │   │   │   │       │       └── ExamplePlugin.kt
│   │   │   │   │       └── test/
│   │   │   │   │           └── java/
│   │   │   │   │               └── ExampleUnitTest.kt
│   │   │   │   ├── build.rs
│   │   │   │   ├── guest-js/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── ios-spm/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── Package.swift
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── Sources/
│   │   │   │   │   │   └── ExamplePlugin.swift
│   │   │   │   │   └── Tests/
│   │   │   │   │       └── PluginTests/
│   │   │   │   │           └── PluginTests.swift
│   │   │   │   ├── ios-xcode/
│   │   │   │   │   ├── tauri-plugin-{{ plugin_name }}/
│   │   │   │   │   │   └── ExamplePlugin.swift
│   │   │   │   │   └── tauri-plugin-{{ plugin_name }}.xcodeproj/
│   │   │   │   │       ├── project.pbxproj
│   │   │   │   │       └── project.xcworkspace/
│   │   │   │   │           ├── contents.xcworkspacedata
│   │   │   │   │           └── xcshareddata/
│   │   │   │   │               └── IDEWorkspaceChecks.plist
│   │   │   │   ├── package.json
│   │   │   │   ├── rollup.config.js
│   │   │   │   ├── src/
│   │   │   │   │   ├── commands.rs
│   │   │   │   │   ├── desktop.rs
│   │   │   │   │   ├── error.rs
│   │   │   │   │   ├── lib.rs
│   │   │   │   │   ├── mobile.rs
│   │   │   │   │   └── models.rs
│   │   │   │   └── tsconfig.json
│   │   │   └── tauri.conf.json
│   │   └── tests/
│   │       └── fixtures/
│   │           └── pbxproj/
│   │               ├── project.pbxproj
│   │               └── snapshots/
│   │                   ├── tauri_cli__helpers__pbxproj__tests__project-modified.pbxproj.snap
│   │                   └── tauri_cli__helpers__pbxproj__tests__project.pbxproj.snap
│   ├── tauri-codegen/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   └── src/
│   │       ├── context.rs
│   │       ├── embedded_assets.rs
│   │       ├── image.rs
│   │       ├── lib.rs
│   │       └── vendor/
│   │           ├── blake3_reference.rs
│   │           └── mod.rs
│   ├── tauri-driver/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE.spdx
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   └── src/
│   │       ├── cli.rs
│   │       ├── main.rs
│   │       ├── server.rs
│   │       └── webdriver.rs
│   ├── tauri-macos-sign/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── README.md
│   │   └── src/
│   │       ├── certificate.rs
│   │       ├── keychain/
│   │       │   └── identity.rs
│   │       ├── keychain.rs
│   │       ├── lib.rs
│   │       └── provisioning_profile.rs
│   ├── tauri-macros/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   └── src/
│   │       ├── command/
│   │       │   ├── handler.rs
│   │       │   ├── mod.rs
│   │       │   └── wrapper.rs
│   │       ├── context.rs
│   │       ├── lib.rs
│   │       ├── menu.rs
│   │       ├── mobile.rs
│   │       └── runtime.rs
│   ├── tauri-plugin/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── build/
│   │       │   ├── mobile.rs
│   │       │   └── mod.rs
│   │       ├── lib.rs
│   │       └── runtime.rs
│   ├── tauri-runtime/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   ├── build.rs
│   │   └── src/
│   │       ├── dpi.rs
│   │       ├── lib.rs
│   │       ├── monitor.rs
│   │       ├── webview.rs
│   │       └── window.rs
│   ├── tauri-runtime-wry/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   ├── build.rs
│   │   └── src/
│   │       ├── dialog/
│   │       │   ├── mod.rs
│   │       │   └── windows.rs
│   │       ├── lib.rs
│   │       ├── monitor/
│   │       │   ├── linux.rs
│   │       │   ├── macos.rs
│   │       │   ├── mod.rs
│   │       │   └── windows.rs
│   │       ├── undecorated_resizing.rs
│   │       ├── util.rs
│   │       ├── webview.rs
│   │       └── window/
│   │           ├── linux.rs
│   │           ├── macos.rs
│   │           ├── mod.rs
│   │           └── windows.rs
│   ├── tauri-schema-generator/
│   │   ├── Cargo.toml
│   │   ├── README.md
│   │   ├── build.rs
│   │   ├── schemas/
│   │   │   ├── capability.schema.json
│   │   │   ├── config.schema.json
│   │   │   ├── permission.schema.json
│   │   │   └── scope.schema.json
│   │   └── src/
│   │       └── main.rs
│   ├── tauri-schema-worker/
│   │   ├── .gitignore
│   │   ├── Cargo.toml
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── config.rs
│   │   │   └── lib.rs
│   │   └── wrangler.toml
│   ├── tauri-utils/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   └── src/
│   │       ├── acl/
│   │       │   ├── build.rs
│   │       │   ├── capability.rs
│   │       │   ├── identifier.rs
│   │       │   ├── manifest.rs
│   │       │   ├── mod.rs
│   │       │   ├── resolved.rs
│   │       │   ├── schema.rs
│   │       │   └── value.rs
│   │       ├── assets.rs
│   │       ├── build.rs
│   │       ├── config/
│   │       │   └── parse.rs
│   │       ├── config.rs
│   │       ├── config_v1/
│   │       │   ├── mod.rs
│   │       │   └── parse.rs
│   │       ├── html.rs
│   │       ├── io.rs
│   │       ├── lib.rs
│   │       ├── mime_type.rs
│   │       ├── pattern/
│   │       │   ├── isolation.js
│   │       │   ├── isolation.rs
│   │       │   └── mod.rs
│   │       ├── platform/
│   │       │   └── starting_binary.rs
│   │       ├── platform.rs
│   │       ├── plugin.rs
│   │       ├── resources.rs
│   │       └── tokens.rs
│   └── tests/
│       ├── acl/
│       │   ├── Cargo.toml
│       │   ├── fixtures/
│       │   │   ├── capabilities/
│       │   │   │   ├── basic-ping/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── file-explorer/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── file-explorer-remote/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── multiwebview/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── multiwindow/
│       │   │   │   │   ├── cap-external.toml
│       │   │   │   │   ├── cap-main.json
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── platform-specific-permissions/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── scope/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   └── scope-extended/
│       │   │   │       ├── cap.json
│       │   │   │       └── required-plugins.json
│       │   │   ├── plugins/
│       │   │   │   ├── fs/
│       │   │   │   │   ├── deny-home.toml
│       │   │   │   │   ├── move-tmp.toml
│       │   │   │   │   ├── read-dir.toml
│       │   │   │   │   ├── read-download-dir.toml
│       │   │   │   │   ├── read-file.toml
│       │   │   │   │   ├── read-resources.toml
│       │   │   │   │   ├── read.toml
│       │   │   │   │   └── scope.toml
│       │   │   │   ├── os/
│       │   │   │   │   ├── linux.toml
│       │   │   │   │   ├── macos.toml
│       │   │   │   │   ├── open-browser.toml
│       │   │   │   │   └── windows.toml
│       │   │   │   └── ping/
│       │   │   │       └── ping.toml
│       │   │   └── snapshots/
│       │   │       ├── acl_tests__tests__basic-ping.snap
│       │   │       ├── acl_tests__tests__file-explorer-remote.snap
│       │   │       ├── acl_tests__tests__file-explorer.snap
│       │   │       ├── acl_tests__tests__multiwebview.snap
│       │   │       ├── acl_tests__tests__multiwindow.snap
│       │   │       ├── acl_tests__tests__scope-extended.snap
│       │   │       ├── acl_tests__tests__scope.snap
│       │   │       ├── linux/
│       │   │       │   └── acl_tests__tests__platform-specific-permissions.snap
│       │   │       ├── macOS/
│       │   │       │   └── acl_tests__tests__platform-specific-permissions.snap
│       │   │       └── windows/
│       │   │           └── acl_tests__tests__platform-specific-permissions.snap
│       │   └── src/
│       │       └── lib.rs
│       ├── app-updater/
│       │   └── frameworks/
│       │       └── test.framework/
│       │           ├── Headers
│       │           ├── Modules
│       │           ├── Resources
│       │           └── Versions/
│       │               ├── A/
│       │               │   ├── Headers/
│       │               │   │   └── test.h
│       │               │   ├── Modules/
│       │               │   │   └── module.modulemap
│       │               │   ├── Resources/
│       │               │   │   └── Info.plist
│       │               │   ├── _CodeSignature/
│       │               │   │   └── CodeResources
│       │               │   └── test
│       │               └── Current
│       └── restart/
│           ├── Cargo.toml
│           ├── LICENSE.spdx
│           ├── LICENSE_APACHE-2.0
│           ├── LICENSE_MIT
│           ├── build.rs
│           ├── src/
│           │   └── main.rs
│           └── tests/
│               └── restart.rs
├── dependabot.yml
├── examples/
│   ├── .icons/
│   │   └── icon.icns
│   ├── README.md
│   ├── api/
│   │   ├── .gitignore
│   │   ├── .setup-cross.sh
│   │   ├── .taurignore
│   │   ├── README.md
│   │   ├── dist/
│   │   │   └── .gitkeep
│   │   ├── index.html
│   │   ├── isolation-dist/
│   │   │   ├── index.html
│   │   │   └── index.js
│   │   ├── jsconfig.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── App.svelte
│   │   │   ├── app.css
│   │   │   ├── components/
│   │   │   │   ├── MenuBuilder.svelte
│   │   │   │   └── MenuItemBuilder.svelte
│   │   │   ├── main.js
│   │   │   ├── views/
│   │   │   │   ├── App.svelte
│   │   │   │   ├── Communication.svelte
│   │   │   │   ├── Menu.svelte
│   │   │   │   ├── Tray.svelte
│   │   │   │   ├── WebRTC.svelte
│   │   │   │   ├── Welcome.svelte
│   │   │   │   └── Window.svelte
│   │   │   └── vite-env.d.ts
│   │   ├── src-tauri/
│   │   │   ├── .gitignore
│   │   │   ├── .taurignore
│   │   │   ├── Cargo.toml
│   │   │   ├── Cross.toml
│   │   │   ├── Info.plist
│   │   │   ├── build.rs
│   │   │   ├── capabilities/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── main.json
│   │   │   │   └── run-app.json
│   │   │   ├── locales/
│   │   │   │   └── pt-BR.wxl
│   │   │   ├── permissions/
│   │   │   │   ├── app-menu/
│   │   │   │   │   └── default.toml
│   │   │   │   └── autogenerated/
│   │   │   │       ├── echo.toml
│   │   │   │       ├── log_operation.toml
│   │   │   │       ├── perform_request.toml
│   │   │   │       └── spam.toml
│   │   │   ├── src/
│   │   │   │   ├── cmd.rs
│   │   │   │   ├── lib.rs
│   │   │   │   ├── main.rs
│   │   │   │   ├── menu_plugin.rs
│   │   │   │   └── tray.rs
│   │   │   ├── tauri-plugin-sample/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── Cargo.toml
│   │   │   │   ├── android/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── build.gradle.kts
│   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   ├── settings.gradle
│   │   │   │   │   └── src/
│   │   │   │   │       ├── androidTest/
│   │   │   │   │       │   └── java/
│   │   │   │   │       │       └── com/
│   │   │   │   │       │           └── plugin/
│   │   │   │   │       │               └── sample/
│   │   │   │   │       │                   └── ExampleInstrumentedTest.kt
│   │   │   │   │       ├── main/
│   │   │   │   │       │   ├── AndroidManifest.xml
│   │   │   │   │       │   └── java/
│   │   │   │   │       │       └── com/
│   │   │   │   │       │           └── plugin/
│   │   │   │   │       │               └── sample/
│   │   │   │   │       │                   ├── Example.kt
│   │   │   │   │       │                   └── ExamplePlugin.kt
│   │   │   │   │       └── test/
│   │   │   │   │           └── java/
│   │   │   │   │               └── com/
│   │   │   │   │                   └── plugin/
│   │   │   │   │                       └── sample/
│   │   │   │   │                           └── ExampleUnitTest.kt
│   │   │   │   ├── api-iife.js
│   │   │   │   ├── build.rs
│   │   │   │   ├── ios/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── Package.swift
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── Sources/
│   │   │   │   │   │   └── ExamplePlugin.swift
│   │   │   │   │   └── Tests/
│   │   │   │   │       └── PluginTests/
│   │   │   │   │           └── PluginTests.swift
│   │   │   │   ├── permissions/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── autogenerated/
│   │   │   │   │   │   ├── commands/
│   │   │   │   │   │   │   └── ping.toml
│   │   │   │   │   │   └── reference.md
│   │   │   │   │   ├── global-scope.toml
│   │   │   │   │   └── ping-scoped.toml
│   │   │   │   └── src/
│   │   │   │       ├── desktop.rs
│   │   │   │       ├── error.rs
│   │   │   │       ├── lib.rs
│   │   │   │       ├── mobile.rs
│   │   │   │       └── models.rs
│   │   │   └── tauri.conf.json
│   │   ├── svelte.config.js
│   │   ├── unocss.config.js
│   │   └── vite.config.js
│   ├── commands/
│   │   ├── README.md
│   │   ├── commands.rs
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── file-associations/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── package.json
│   │   └── src-tauri/
│   │       ├── .license_template
│   │       ├── Cargo.toml
│   │       ├── Info.plist
│   │       ├── build.rs
│   │       ├── src/
│   │       │   └── main.rs
│   │       └── tauri.conf.json
│   ├── helloworld/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── isolation/
│   │   ├── README.md
│   │   ├── dist/
│   │   │   ├── index.html
│   │   │   └── linked.js
│   │   ├── isolation-dist/
│   │   │   ├── index.html
│   │   │   └── index.js
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── multiwebview/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── multiwindow/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── resources/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── package.json
│   │   └── src-tauri/
│   │       ├── Cargo.toml
│   │       ├── assets/
│   │       │   └── index.js
│   │       ├── build.rs
│   │       ├── capabilities/
│   │       │   └── app.json
│   │       ├── src/
│   │       │   └── main.rs
│   │       └── tauri.conf.json
│   ├── run-return/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── splashscreen/
│   │   ├── README.md
│   │   ├── dist/
│   │   │   ├── index.html
│   │   │   └── splashscreen.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── state/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   └── streaming/
│       ├── README.md
│       ├── index.html
│       ├── main.rs
│       └── tauri.conf.json
├── package.json
├── packages/
│   ├── api/
│   │   ├── .gitignore
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   ├── eslint.config.js
│   │   ├── package.json
│   │   ├── rollup.config.ts
│   │   ├── src/
│   │   │   ├── app.ts
│   │   │   ├── core.ts
│   │   │   ├── dpi.ts
│   │   │   ├── event.ts
│   │   │   ├── global.d.ts
│   │   │   ├── image.ts
│   │   │   ├── index.ts
│   │   │   ├── menu/
│   │   │   │   ├── base.ts
│   │   │   │   ├── checkMenuItem.ts
│   │   │   │   ├── iconMenuItem.ts
│   │   │   │   ├── menu.ts
│   │   │   │   ├── menuItem.ts
│   │   │   │   ├── predefinedMenuItem.ts
│   │   │   │   └── submenu.ts
│   │   │   ├── menu.ts
│   │   │   ├── mocks.ts
│   │   │   ├── path.ts
│   │   │   ├── tray.ts
│   │   │   ├── webview.ts
│   │   │   ├── webviewWindow.ts
│   │   │   └── window.ts
│   │   └── tsconfig.json
│   └── cli/
│       ├── .cargo/
│       │   └── config.toml
│       ├── .gitignore
│       ├── .npmignore
│       ├── CHANGELOG.md
│       ├── Cargo.toml
│       ├── LICENSE_APACHE-2.0
│       ├── LICENSE_MIT
│       ├── README.md
│       ├── __tests__/
│       │   ├── fixtures/
│       │   │   └── empty/
│       │   │       ├── .gitignore
│       │   │       ├── dist/
│       │   │       │   └── index.html
│       │   │       └── package.json
│       │   └── template.spec.ts
│       ├── append-headers.js
│       ├── build.rs
│       ├── index.d.ts
│       ├── index.js
│       ├── main.d.ts
│       ├── main.js
│       ├── npm/
│       │   ├── darwin-arm64/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── darwin-x64/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-arm-gnueabihf/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-arm64-gnu/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-arm64-musl/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-riscv64-gnu/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-x64-gnu/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-x64-musl/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── win32-arm64-msvc/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── win32-ia32-msvc/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   └── win32-x64-msvc/
│       │       ├── README.md
│       │       └── package.json
│       ├── package.json
│       ├── src/
│       │   └── lib.rs
│       └── tauri.js
├── pnpm-workspace.yaml
├── renovate.json
├── rustfmt.toml
└── supply-chain/
    ├── audits.toml
    └── config.toml

================================================
FILE CONTENTS
================================================

================================================
FILE: .cargo/audit.toml
================================================
[advisories]
ignore = [
  # rsa Marvin Attack
  "RUSTSEC-2023-0071",
  # difference is unmaintained
  "RUSTSEC-2020-0095",
  # proc-macro-error is unmaintained
  "RUSTSEC-2024-0370",
  # time crate can't be updated in the repo because of MSRV, users are unaffected
  "RUSTSEC-2026-0009",
]


================================================
FILE: .cargo/config.toml
================================================
[env]
# workaround needed to prevent `STATUS_ENTRYPOINT_NOT_FOUND` error in tests
# see https://github.com/tauri-apps/tauri/pull/4383#issuecomment-1212221864
__TAURI_WORKSPACE__ = "true"


================================================
FILE: .changes/README.md
================================================
# Changes

##### via https://github.com/jbolda/covector

As you create PRs and make changes that require a version bump, please add a new markdown file in this folder. You do not note the version _number_, but rather the type of bump that you expect: major, minor, or patch. The filename is not important, as long as it is a `.md`, but we recommend that it represents the overall change for organizational purposes.

When you select the version bump required, you do _not_ need to consider dependencies. Only note the package with the actual change, and any packages that depend on that package will be bumped automatically in the process.

Use the following format:

```md
---
'package-a': 'patch:enhance'
'package-b': 'patch:enhance'
---

Change summary goes here
```

Summaries do not have a specific character limit, but are text only. These summaries are used within the (future implementation of) changelogs. They will give context to the change and also point back to the original PR if more details and context are needed.

Changes will be designated as a `major`, `minor` or `patch` as further described in [semver](https://semver.org/).

Given a version number MAJOR.MINOR.PATCH, increment the:

- MAJOR version when you make incompatible API changes,
- MINOR version when you add functionality in a backwards compatible manner, and
- PATCH version when you make backwards compatible bug fixes.

Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format, but will be discussed prior to usage (as extra steps will be necessary in consideration of merging and publishing).

Additionally you could specify a tag for the change file to group it with other changes by prefixing the bump with `:<tag>`, for example:

```md
---
'package-a': 'patch:enhance'
---

Change summary goes here
```

which will group this change file with other changes that specify the `bug` tag.

For list of available tags, see the `changeTags` key in [./config.json](./config.json)


================================================
FILE: .changes/base64.md
================================================
---
"tauri-macos-sign": patch:enhance
---

Do not rely on system base64 CLI to decode certificates.


================================================
FILE: .changes/config.json
================================================
{
  "gitSiteUrl": "https://www.github.com/tauri-apps/tauri/",
  "changeTags": {
    "feat": "New Features",
    "enhance": "Enhancements",
    "bug": "Bug Fixes",
    "perf": "Performance Improvements",
    "changes": "What's Changed",
    "sec": "Security fixes",
    "deps": "Dependencies",
    "breaking": "Breaking Changes"
  },
  "defaultChangeTag": "changes",
  "pkgManagers": {
    "rust": {
      "version": true,
      "getPublishedVersion": {
        "use": "fetch:check",
        "options": {
          "url": "https://crates.io/api/v1/crates/${ pkg.pkgFile.pkg.package.name }/${ pkg.pkgFile.version }"
        }
      },
      "prepublish": [
        "cargo install cargo-audit --features=fix",
        {
          "command": "echo '<details>\n<summary><em><h4>Cargo Audit</h4></em></summary>\n\n```'",
          "dryRunCommand": true,
          "pipe": true
        },
        {
          "command": "cargo audit ${ process.env.CARGO_AUDIT_OPTIONS || '' }",
          "dryRunCommand": true,
          "runFromRoot": true,
          "pipe": true
        },
        {
          "command": "echo '```\n\n</details>\n'",
          "dryRunCommand": true,
          "pipe": true
        }
      ],
      "publish": [
        {
          "command": "echo '<details>\n<summary><em><h4>Cargo Publish</h4></em></summary>\n\n```'",
          "dryRunCommand": true,
          "pipe": true
        },
        {
          "command": "cargo publish",
          "dryRunCommand": "cargo publish --dry-run",
          "pipe": true
        },
        {
          "command": "echo '```\n\n</details>\n'",
          "dryRunCommand": true,
          "pipe": true
        }
      ],
      "postpublish": {
        "use": "fetch:check",
        "options": {
          "url": "https://crates.io/api/v1/crates/${ pkg.pkgFile.pkg.package.name }/${ pkg.pkgFile.version }"
        },
        "retries": [5000, 5000, 5000]
      }
    },
    "javascript": {
      "version": true,
      "getPublishedVersion": {
        "use": "fetch:check",
        "options": {
          "url": "https://registry.npmjs.com/${ pkg.pkgFile.pkg.name }/${ pkg.pkgFile.version }"
        }
      },
      "prepublish": [
        {
          "command": "echo '<details>\n<summary><em><h4>PNPM Audit</h4></em></summary>\n\n```'",
          "dryRunCommand": true,
          "pipe": true
        },
        {
          "command": "pnpm i --frozen-lockfile",
          "dryRunCommand": true
        },
        {
          "command": "pnpm audit",
          "dryRunCommand": true,
          "runFromRoot": true,
          "pipe": true
        },
        {
          "command": "echo '```\n\n</details>\n'",
          "dryRunCommand": true,
          "pipe": true
        }
      ],
      "publish": [
        {
          "command": "echo '<details>\n<summary><em><h4>PNPM Publish</h4></em></summary>\n\n```'",
          "dryRunCommand": true,
          "pipe": true
        },
        {
          "command": "pnpm publish --access public --loglevel silly --no-git-checks",
          "dryRunCommand": "npm publish --dry-run --access public --no-git-checks",
          "pipe": true
        },
        {
          "command": "echo '```\n\n</details>\n'",
          "dryRunCommand": true,
          "pipe": true
        }
      ],
      "postpublish": {
        "use": "fetch:check",
        "options": {
          "url": "https://registry.npmjs.com/${ pkg.pkgFile.pkg.name }/${ pkg.pkgFile.version }"
        },
        "retries": [5000, 5000, 5000]
      }
    }
  },
  "packages": {
    "@tauri-apps/api": {
      "path": "./packages/api",
      "manager": "javascript",
      "publish": [
        {
          "command": "echo '<details>\n<summary><em><h4>PNPM Publish</h4></em></summary>\n\n```'",
          "dryRunCommand": true,
          "pipe": true
        },
        {
          "command": "pnpm npm-publish",
          "dryRunCommand": true,
          "pipe": true
        },
        {
          "command": "echo '```\n\n</details>\n'",
          "dryRunCommand": true,
          "pipe": true
        }
      ]
    },
    "tauri-utils": {
      "path": "./crates/tauri-utils",
      "manager": "rust"
    },
    "tauri-macos-sign": {
      "path": "./crates/tauri-macos-sign",
      "manager": "rust"
    },
    "tauri-bundler": {
      "path": "./crates/tauri-bundler",
      "manager": "rust",
      "dependencies": ["tauri-utils", "tauri-macos-sign"]
    },
    "tauri-runtime": {
      "path": "./crates/tauri-runtime",
      "manager": "rust",
      "dependencies": ["tauri-utils"]
    },
    "tauri-runtime-wry": {
      "path": "./crates/tauri-runtime-wry",
      "manager": "rust",
      "dependencies": ["tauri-utils", "tauri-runtime"]
    },
    "tauri-codegen": {
      "path": "./crates/tauri-codegen",
      "manager": "rust",
      "dependencies": ["tauri-utils"]
    },
    "tauri-macros": {
      "path": "./crates/tauri-macros",
      "manager": "rust",
      "dependencies": ["tauri-codegen", "tauri-utils"]
    },
    "tauri-plugin": {
      "path": "./crates/tauri-plugin",
      "manager": "rust",
      "dependencies": ["tauri-utils"],
      "postversion": "node ../../.scripts/ci/sync-cli-metadata.js ${ pkg.pkg } ${ release.type }"
    },
    "tauri-build": {
      "path": "./crates/tauri-build",
      "manager": "rust",
      "dependencies": ["tauri-codegen", "tauri-utils"],
      "postversion": "node ../../.scripts/ci/sync-cli-metadata.js ${ pkg.pkg } ${ release.type }"
    },
    "tauri": {
      "path": "./crates/tauri",
      "manager": "rust",
      "dependencies": [
        "tauri-macros",
        "tauri-utils",
        "tauri-runtime",
        "tauri-runtime-wry",
        "tauri-build"
      ],
      "postversion": [
        "node ../../.scripts/ci/sync-cli-metadata.js ${ pkg.pkg } ${ release.type }",
        "cargo build --manifest-path ../tauri-schema-generator/Cargo.toml"
      ]
    },
    "@tauri-apps/cli": {
      "path": "./packages/cli",
      "manager": "javascript",
      "dependencies": ["tauri-cli"],
      "postversion": "node ../../.scripts/ci/sync-cli-metadata.js ${ pkg.pkg } ${ release.type }",
      "prepublish": [],
      "publish": [],
      "postpublish": []
    },
    "tauri-cli": {
      "path": "./crates/tauri-cli",
      "manager": "rust",
      "dependencies": ["tauri-bundler", "tauri-utils", "tauri-macos-sign"]
    },
    "tauri-driver": {
      "path": "./crates/tauri-driver",
      "manager": "rust"
    }
  }
}


================================================
FILE: .changes/data-tauri-drag-region-deep.md
================================================
---
"tauri": minor:feat
---

Add `data-tauri-drag-region="deep"` so clicks on non-clickable children will drag as well. Can still opt out of drag on some regions using `data-tauri-drag-region="false"`


================================================
FILE: .changes/fix-build-bundles-arg.md
================================================
---
"tauri-bundler": patch:bug
"tauri-cli": patch:bug
"@tauri-apps/cli": patch:bug
---

Fix `build --bundles` to allow `nsis` arg in linux+macOS


================================================
FILE: .changes/linux-deploy-link.md
================================================
---
"tauri-bundler": patch:bug
---

Correct GitHub Release URL path for Linux i686 tooling.


================================================
FILE: .changes/prompt-signing-key-password-context.md
================================================
---
"tauri-cli": patch:enhance
"@tauri-apps/cli": patch:enhance
---

Show the context before prompting for updater signing key password


================================================
FILE: .changes/toml-ver.md
================================================
---
tauri-utils: patch:deps
---

Changed `toml` crate version from `0.9` to `">=0.9, <=1"`


================================================
FILE: .devcontainer/Dockerfile
================================================
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/master/containers/ubuntu/.devcontainer/base.Dockerfile
# [Choice] Ubuntu version (use jammy or bionic on local arm64/Apple Silicon): jammy, focal, bionic
ARG VARIANT="jammy"
FROM mcr.microsoft.com/vscode/devcontainers/base:0-${VARIANT}

# Derived from Tauri contribution and setup guides:
# See: https://github.com/tauri-apps/tauri/blob/dev/.github/CONTRIBUTING.md#development-guide
# See: https://v2.tauri.app/start/prerequisites/
ARG TAURI_BUILD_DEPS="build-essential curl libappindicator3-dev libgtk-3-dev librsvg2-dev libssl-dev libwebkit2gtk-4.1-dev wget"

RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
    && apt-get install -y --no-install-recommends $TAURI_BUILD_DEPS


================================================
FILE: .devcontainer/README.md
================================================
# VS Code Devcontainer for Tauri

## Overview

Please note that most of these instructions are derived from Microsoft's VS Code documentation: [Developing inside a Container](https://code.visualstudio.com/docs/remote/containers). Check the official documentation if you encounter problems and submit a PR with any corrections you find for the instructions below.

The development container included in this repository is derived from [Microsoft's default Ubuntu development container](https://github.com/microsoft/vscode-dev-containers/tree/master/containers/ubuntu). Contents of the Ubuntu Docker image can be in the [VS Code devcontainer Ubuntu base Dockerfile](https://github.com/microsoft/vscode-dev-containers/blob/main/containers/ubuntu/.devcontainer/base.Dockerfile). The contents of the container used for development can be found in the [Dockerfile](./Dockerfile) located in the same directory as this README.

## Usage

1. Ensure you have all [Devcontainer Prerequisites](#devcontainer-prerequisites)
2. Open the directory containing your [`tauri-apps/tauri`](https://github.com/tauri-apps/tauri) code.
3. Install the [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) extension pack for VS Code. This will be included if you install recommended workspace extensions upon opening this repository.
4. Ensure Docker is running
5. [Open your workspace in the provided devcontainer](https://code.visualstudio.com/docs/remote/containers#_open-an-existing-workspace-in-a-container): Open this repository in VS Code and run **Remote-Containers: Reopen in Container...** from the Command Palette (<kbd>F1</kbd>).

### Devcontainer Prerequisites

Prerequisites are mainly derived from VS Code's instructions for usage of development containers, documented here: [Developing inside a Container: Getting Started](https://code.visualstudio.com/docs/remote/containers#_getting-started).

1. Docker (Docker Desktop recommended)
2. VS Code
3. X window host - required if you want to be able to interact with a GUI from your Docker host

### A note on filesystem performance

Due to limitations in how Docker shares files between the Docker host and a container, it's also recommended that developers [clone Tauri source code into a container volume](https://code.visualstudio.com/remote/advancedcontainers/improve-performance#_use-clone-repository-in-container-volume). This is optional, but highly advised as many filesystem/IO heavy operations (`cargo build`, `pnpm install`, etc) will be very slow if they operate on directories shared with a Docker container from the Docker host.

To do this, open your project with VS Code and run **Remote-Containers: Clone Repository in Container Volume...** from the Command Palette (<kbd>F1</kbd>).

### Accessing a Tauri application running you the devcontainer

Docker Desktop provides facilities for [allowing the development container to connect to a service on the Docker host](https://docs.docker.com/desktop/windows/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host). So long as you have an X window server running on your Docker host, the devcontainer can connect to it and expose your Tauri GUI via an X window.

**Export the `DISPLAY` variable within the devcontainer terminal you launch your Tauri application from to expose your GUI outside of the devcontainer**.

```bash
export DISPLAY="host.docker.internal:0"
```


================================================
FILE: .devcontainer/devcontainer.json
================================================
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.234.0/containers/ubuntu
{
  "name": "Ubuntu",
  "build": {
    "dockerfile": "Dockerfile",
    // Update 'VARIANT' to pick an Ubuntu version: jammy / ubuntu-22.04, focal / ubuntu-20.04, bionic /ubuntu-18.04
    // Use ubuntu-22.04 or ubuntu-18.04 on local arm64/Apple Silicon.
    "args": { "VARIANT": "ubuntu-22.04" }
  },

  // Set *default* container specific settings.json values on container create.
  "settings": {},

  // Add the IDs of extensions you want installed when the container is created.
  "extensions": [],

  // Use 'forwardPorts' to make a list of ports inside the container available locally.
  // "forwardPorts": [],

  // Use 'postCreateCommand' to run commands after the container is created.
  // "postCreateCommand": "uname -a",

  // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
  "remoteUser": "vscode",
  "features": {
    "node": "lts",
    "rust": "latest"
  }
}


================================================
FILE: .docker/cross/aarch64.Dockerfile
================================================
FROM ubuntu:22.04
ARG DEBIAN_FRONTEND=noninteractive

COPY common.sh lib.sh /
RUN /common.sh

COPY cmake.sh /
RUN /cmake.sh

COPY xargo.sh /
RUN /xargo.sh

RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
    g++-aarch64-linux-gnu \
    libc6-dev-arm64-cross

COPY deny-debian-packages.sh /
RUN TARGET_ARCH=arm64 /deny-debian-packages.sh \
    binutils \
    binutils-aarch64-linux-gnu

COPY qemu.sh /
RUN /qemu.sh aarch64 softmmu

COPY dropbear.sh /
RUN /dropbear.sh

COPY linux-image.sh /
RUN /linux-image.sh aarch64

COPY linux-runner /

ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
    CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER="/linux-runner aarch64" \
    CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc \
    CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++ \
    BINDGEN_EXTRA_CLANG_ARGS_aarch64_unknown_linux_gnu="--sysroot=/usr/aarch64-linux-gnu" \
    QEMU_LD_PREFIX=/usr/aarch64-linux-gnu \
    RUST_TEST_THREADS=1 \
    PKG_CONFIG_PATH="/usr/lib/aarch64-linux-gnu/pkgconfig/:${PKG_CONFIG_PATH}"

RUN dpkg --add-architecture arm64
RUN apt-get update
RUN apt-get install --assume-yes --no-install-recommends libssl-dev:arm64 libdbus-1-dev:arm64 libsoup2.4-dev:arm64 libssl-dev:arm64 libgtk-3-dev:arm64 webkit2gtk-4.1-dev:arm64 libappindicator3-1:arm64 librsvg2-dev:arm64 patchelf:arm64


================================================
FILE: .docker/cross/cmake.sh
================================================
#!/usr/bin/env bash

set -x
set -euo pipefail

# shellcheck disable=SC1091
. lib.sh

main() {
    local version=3.23.1

    install_packages curl

    local td
    td="$(mktemp -d)"

    pushd "${td}"

    curl --retry 3 -sSfL "https://github.com/Kitware/CMake/releases/download/v${version}/cmake-${version}-linux-x86_64.sh" -o cmake.sh
    sh cmake.sh --skip-license --prefix=/usr/local

    popd

    purge_packages

    rm -rf "${td}"
    rm -rf /var/lib/apt/lists/*
    rm "${0}"
}

main "${@}"


================================================
FILE: .docker/cross/common.sh
================================================
#!/usr/bin/env bash

set -x
set -euo pipefail

# shellcheck disable=SC1091
. lib.sh

# For architectures except amd64 and i386, look for packages on ports.ubuntu.com instead.
# This is important if you enable additional architectures so you can install libraries to cross-compile against.
# Look for 'dpkg --add-architecture' in the README for more details.
if grep -i ubuntu /etc/os-release >/dev/null; then
    sed 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch-=amd64,i386] http:\/\/ports.ubuntu.com\/ubuntu-ports\//g' /etc/apt/sources.list > /etc/apt/sources.list.d/ports.list
    sed -i 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch=amd64,i386] http:\/\/\1.archive.ubuntu.com\/ubuntu\//g' /etc/apt/sources.list
fi

install_packages \
    autoconf \
    automake \
    binutils \
    ca-certificates \
    curl \
    file \
    gcc \
    git \
    libtool \
    m4 \
    make

if_centos install_packages \
    clang-devel \
    gcc-c++ \
    glibc-devel \
    pkgconfig

if_ubuntu install_packages \
    g++ \
    libc6-dev \
    libclang-dev \
    pkg-config


================================================
FILE: .docker/cross/deny-debian-packages.sh
================================================
#!/usr/bin/env bash

set -x
set -euo pipefail

main() {
    local package

    for package in "${@}"; do
        echo "Package: ${package}:${TARGET_ARCH}
Pin: release *
Pin-Priority: -1" > "/etc/apt/preferences.d/${package}"
        echo "${package}"
    done

    rm "${0}"
}

main "${@}"


================================================
FILE: .docker/cross/dropbear.sh
================================================
#!/usr/bin/env bash

set -x
set -euo pipefail

# shellcheck disable=SC1091
. lib.sh

main() {
    local version=2022.82

    install_packages \
        autoconf \
        automake \
        bzip2 \
        curl \
        make

    if_centos install_packages zlib-devel
    if_ubuntu install_packages zlib1g-dev

    local td
    td="$(mktemp -d)"

    pushd "${td}"

    curl --retry 3 -sSfL "https://matt.ucc.asn.au/dropbear/releases/dropbear-${version}.tar.bz2" -O
    tar --strip-components=1 -xjf "dropbear-${version}.tar.bz2"

    # Remove some unwanted message
    sed -i '/skipping hostkey/d' cli-kex.c
    sed -i '/failed to identify current user/d' cli-runopts.c

    ./configure \
       --disable-syslog \
       --disable-shadow \
       --disable-lastlog \
       --disable-utmp \
       --disable-utmpx \
       --disable-wtmp \
       --disable-wtmpx \
       --disable-pututline \
       --disable-pututxline

    make "-j$(nproc)" PROGRAMS=dbclient
    cp dbclient /usr/local/bin/

    purge_packages

    popd

    rm -rf "${td}"
    rm "${0}"
}

main "${@}"


================================================
FILE: .docker/cross/lib.sh
================================================
purge_list=()

install_packages() {
    if grep -i ubuntu /etc/os-release; then
        apt-get update

        for pkg in "${@}"; do
            if ! dpkg -L "${pkg}" >/dev/null 2>/dev/null; then
                apt-get install --assume-yes --no-install-recommends "${pkg}"

                purge_list+=( "${pkg}" )
            fi
        done
    else
        for pkg in "${@}"; do
            if ! yum list installed "${pkg}" >/dev/null 2>/dev/null; then
                yum install -y "${pkg}"

                purge_list+=( "${pkg}" )
            fi
        done
    fi
}

purge_packages() {
    if (( ${#purge_list[@]} )); then
        if grep -i ubuntu /etc/os-release; then
            apt-get purge --assume-yes --auto-remove "${purge_list[@]}"
        else
            yum remove -y "${purge_list[@]}"
        fi
    fi
}

if_centos() {
    if grep -q -i centos /etc/os-release; then
        eval "${@}"
    fi
}

if_ubuntu() {
    if grep -q -i ubuntu /etc/os-release; then
        eval "${@}"
    fi
}


================================================
FILE: .docker/cross/linux-image.sh
================================================
#!/usr/bin/env bash

set -x
set -euo pipefail

# shellcheck disable=SC1091
. lib.sh

main() {
    # arch in the rust target
    local arch="${1}" \
          kversion=4.19.0-20

    local debsource="deb http://http.debian.net/debian/ buster main"
    debsource="${debsource}\ndeb http://security.debian.org/ buster/updates main"

    local dropbear="dropbear-bin"

    local -a deps
    local kernel=
    local libgcc="libgcc1"

    # select debian arch and kernel version
    case "${arch}" in
        aarch64)
            arch=arm64
            kernel="${kversion}-arm64"
            ;;
        armv7)
            arch=armhf
            kernel="${kversion}-armmp"
            ;;
        i686)
            arch=i386
            kernel="${kversion}-686"
            ;;
        mips|mipsel)
            kernel="${kversion}-4kc-malta"
            ;;
        mips64el)
            kernel="${kversion}-5kc-malta"
            ;;
        powerpc)
            # there is no buster powerpc port, so we use jessie
            # use a more recent kernel from backports
            kversion='4.9.0-0.bpo.6'
            kernel="${kversion}-powerpc"
            debsource="deb http://archive.debian.org/debian jessie main"
            debsource="${debsource}\ndeb http://archive.debian.org/debian jessie-backports main"
            debsource="${debsource}\ndeb http://ftp.ports.debian.org/debian-ports unstable main"
            debsource="${debsource}\ndeb http://ftp.ports.debian.org/debian-ports unreleased main"

            # archive.debian.org Release files are expired.
            echo "Acquire::Check-Valid-Until false;" | tee -a /etc/apt/apt.conf.d/10-nocheckvalid
            echo "APT::Get::AllowUnauthenticated true;" | tee -a /etc/apt/apt.conf.d/10-nocheckvalid

            dropbear="dropbear"
            deps=(libcrypt1:"${arch}")
            ;;
        powerpc64)
            # there is no stable port
            arch=ppc64
            # https://packages.debian.org/en/sid/linux-image-powerpc64
            kversion='5.*'
            kernel="${kversion}-powerpc64"
            libgcc="libgcc-s1"
            debsource="deb http://ftp.ports.debian.org/debian-ports unstable main"
            debsource="${debsource}\ndeb http://ftp.ports.debian.org/debian-ports unreleased main"
            # sid version of dropbear requires these dependencies
            deps=(libcrypt1:"${arch}")
            ;;
        powerpc64le)
            arch=ppc64el
            kernel="${kversion}-powerpc64le"
            ;;
        s390x)
            arch=s390x
            kernel="${kversion}-s390x"
            ;;
        sparc64)
            # there is no stable port
            # https://packages.debian.org/en/sid/linux-image-sparc64
            kernel='*-sparc64'
            libgcc="libgcc-s1"
            debsource="deb http://ftp.ports.debian.org/debian-ports unstable main"
            debsource="${debsource}\ndeb http://ftp.ports.debian.org/debian-ports unreleased main"
            # sid version of dropbear requires these dependencies
            deps=(libcrypt1:"${arch}")
            ;;
        x86_64)
            arch=amd64
            kernel="${kversion}-amd64"
            ;;
        *)
            echo "Invalid arch: ${arch}"
            exit 1
            ;;
    esac

    install_packages ca-certificates \
        curl \
        cpio \
        sharutils \
        gnupg

    # Download packages
    mv /etc/apt/sources.list /etc/apt/sources.list.bak
    echo -e "${debsource}" > /etc/apt/sources.list

    # Old ubuntu does not support --add-architecture, so we directly change multiarch file
    if [ -f /etc/dpkg/dpkg.cfg.d/multiarch ]; then
        cp /etc/dpkg/dpkg.cfg.d/multiarch /etc/dpkg/dpkg.cfg.d/multiarch.bak
    fi
    dpkg --add-architecture "${arch}" || echo "foreign-architecture ${arch}" > /etc/dpkg/dpkg.cfg.d/multiarch

    # Add Debian keys.
    curl --retry 3 -sSfL 'https://ftp-master.debian.org/keys/archive-key-{7.0,8,9,10}.asc' -O
    curl --retry 3 -sSfL 'https://ftp-master.debian.org/keys/archive-key-{8,9,10}-security.asc' -O
    curl --retry 3 -sSfL 'https://ftp-master.debian.org/keys/release-{7,8,9,10}.asc' -O
    curl --retry 3 -sSfL 'https://www.ports.debian.org/archive_{2020,2021,2022}.key' -O

    for key in *.asc *.key; do
      apt-key add "${key}"
      rm "${key}"
    done

    # allow apt-get to retry downloads
    echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80-retries

    apt-get update

    mkdir -p "/qemu/${arch}"
    chmod 777 /qemu "/qemu/${arch}"

    cd "/qemu/${arch}"
    apt-get -d --no-install-recommends download \
        ${deps[@]+"${deps[@]}"} \
        "busybox:${arch}" \
        "${dropbear}:${arch}" \
        "libtommath1:${arch}" \
        "libtomcrypt1:${arch}" \
        "libgmp10:${arch}" \
        "libc6:${arch}" \
        "${libgcc}:${arch}" \
        "libstdc++6:${arch}" \
        "linux-image-${kernel}:${arch}" \
        ncurses-base \
        "zlib1g:${arch}"
    cd /qemu

    # Install packages
    root="root-${arch}"
    mkdir -p "${root}"/{bin,etc/dropbear,root,sys,dev,proc,sbin,tmp,usr/{bin,sbin},var/log}
    for deb in "${arch}"/*deb; do
        dpkg -x "${deb}" "${root}"/
    done

    cp "${root}/boot/vmlinu"* kernel

    # initrd
    mkdir -p "${root}/modules"
    cp -v \
        "${root}/lib/modules"/*/kernel/drivers/net/net_failover.ko \
        "${root}/lib/modules"/*/kernel/drivers/net/virtio_net.ko \
        "${root}/lib/modules"/*/kernel/drivers/virtio/* \
        "${root}/lib/modules"/*/kernel/fs/netfs/netfs.ko \
        "${root}/lib/modules"/*/kernel/fs/9p/9p.ko \
        "${root}/lib/modules"/*/kernel/fs/fscache/fscache.ko \
        "${root}/lib/modules"/*/kernel/net/9p/9pnet.ko \
        "${root}/lib/modules"/*/kernel/net/9p/9pnet_virtio.ko \
        "${root}/lib/modules"/*/kernel/net/core/failover.ko \
        "${root}/modules" || true # some file may not exist
    rm -rf "${root:?}/boot"
    rm -rf "${root:?}/lib/modules"

    cat << 'EOF' > "${root}/etc/hosts"
127.0.0.1 localhost qemu
EOF

    cat << 'EOF' > $root/etc/hostname
qemu
EOF

    cat << 'EOF' > $root/etc/passwd
root::0:0:root:/root:/bin/sh
EOF

cat << 'EOF' | uudecode -o $root/etc/dropbear/dropbear_rsa_host_key
begin 600 dropbear_rsa_host_key
M````!W-S:"UR<V$````#`0`!```!`0"N!-<%K,3Z.!Z,OEMB2.N\O.$IWQ*F
M#5%(_;(^2YKY_J_.RQW/7U@_MK&J#!Z0_\;EH#98ZW*E1\.<FF%P/*Y.W56-
M31.'EJE`TN@=T5EC(8"Y%3'ZBYH)^WIVJ]S*G/_;#RH\_?S"U^1L_<<.F`O+
MZVI?*]\KTDOT&QV0#B-M;"%_7:\>+3[X=QMH,B<HM$+0E[\B6*^!XKLR@V,K
M)<V80HHK:_#;D]26XKN&CB./EZAC%4)78R!G""4HT@UK<5I4B^$/""`,?*\T
M>*4$RYULV,V3X6]K:7@Q?80"#WXGGQZNFN6CZ7LTDX(F6J[\]F5<0`HEOF:Z
MX;^53`L'4I/A```!``$L:$Z*#6<^3@+O%.[-#/5H+.C'3\#QQZN[1;J>L`8I
MZ_&T'!"J'/Y+?R?55G:M^=]R*-&I3TOJYZA8@&H51ZOAF59'1_>>Z@?E4#)$
MQU)X/RWH51ZB5KSDWJS:D'7GD(!?NAY`C'7\)I:_4)J")QBV/P"RJQGHG'%B
M1BT2LE6676>`1K,0\NIMZTKQNB(IC+88<7#8%_-=P<&6<"9LH>60TSS?3?-C
MN`T36YB/3^<(Q;`N1NT>I9EZS`BAC^-?.:,R\7EL"<4>7E=]^1]B\K9])AQU
MBM\]M;4V(S(6KH-I.4[6>9E+@\UEM.J6:[2LUEEJDG:G:+:/EVF^Y75@(S$`
M``"!`.O+KW=&*CBCHL"11&SVO4/K]$R-]7MV7,3RR)Q[X'0;6.?4JHW!3VR6
M*FGBY--37ZD-+UV.8_+"$<?B"#&K$.[V)F7V2\UY!7(0FZ@A2`0ADDY*J-_B
M4AU&.*GP#F/!I([:?E],.>6PH9)(/E.\G19#G0K`LRM?JWS!58&;D0C1````
M@0"\[@NYWSTW(?Q@:_A*1Y3/AKYO5?S=0"<2>#V-AH6W-NCSDTSRP=2D79FS
M"D?[;.)V>8'#9&I3"MU@+:2\Z%$0-MG0+J'(0>T1_C6?*C=4U0I$DI<=@D]1
H_&DE8Y(OT%%EPG]!$H&5HX*),_D1A2\P=R.7G'`0L%YM-79Y"T">$0``
`
end
EOF

    # dropbear complains when this file is missing
    touch "${root}/var/log/lastlog"

    cat << 'EOF' > $root/init
#!/bin/busybox sh

set -e

/bin/busybox --install

mount -t devtmpfs devtmpfs /dev
mount -t proc none /proc
mount -t sysfs none /sys
mkdir /dev/pts
mount -t devpts none /dev/pts/

# some archs does not have virtio modules
insmod /modules/failover.ko || true
insmod /modules/net_failover.ko || true
insmod /modules/virtio.ko || true
insmod /modules/virtio_ring.ko || true
insmod /modules/virtio_mmio.ko || true
insmod /modules/virtio_pci_legacy_dev.ko || true
insmod /modules/virtio_pci_modern_dev.ko || true
insmod /modules/virtio_pci.ko || true
insmod /modules/virtio_net.ko || true
insmod /modules/netfs.ko || true
insmod /modules/fscache.ko
insmod /modules/9pnet.ko
insmod /modules/9pnet_virtio.ko || true
insmod /modules/9p.ko

ifconfig lo 127.0.0.1
ifconfig eth0 10.0.2.15
route add default gw 10.0.2.2 eth0

mkdir /target
mount -t 9p -o trans=virtio target /target -oversion=9p2000.u || true

exec dropbear -F -E -B
EOF

    chmod +x "${root}/init"
    cd "${root}"
    find . | cpio --create --format='newc' --quiet | gzip > ../initrd.gz
    cd -

    # Clean up
    rm -rf "/qemu/${root}" "/qemu/${arch}"
    mv -f /etc/apt/sources.list.bak /etc/apt/sources.list
    if [ -f /etc/dpkg/dpkg.cfg.d/multiarch.bak ]; then
        mv /etc/dpkg/dpkg.cfg.d/multiarch.bak /etc/dpkg/dpkg.cfg.d/multiarch
    fi
    # can fail if arch is used (amd64 and/or i386)
    dpkg --remove-architecture "${arch}" || true
    apt-get update

    purge_packages

    ls -lh /qemu
}

main "${@}"


================================================
FILE: .docker/cross/linux-runner
================================================
#!/usr/bin/env bash

set -e

LOG=/tmp/qemu.log
LOCK=/tmp/qemu.lock

if [ -n "${CROSS_DEBUG}" ]; then
    set -x
fi

# arch in the rust target
arch="${1}"
shift

if [ "${CROSS_RUNNER}" = "" ]; then
    if [[ "${arch}" == i?86 ]] || [[ "${arch}" == x86_64 ]]; then
        CROSS_RUNNER=native
    else
        CROSS_RUNNER=qemu-user
    fi
fi

# select qemu arch
qarch="${arch}"
case "${arch}" in
    armv7)
        qarch="arm"
        ;;
    i686)
        qarch="i386"
        ;;
    powerpc)
        qarch="ppc"
        ;;
    powerpc64)
        qarch="ppc64"
        ;;
    powerpc64le)
        if [ "${CROSS_RUNNER}" = "qemu-user" ]; then
            qarch="ppc64le"
        else
            qarch="ppc64"
        fi
        ;;
esac

case "${CROSS_RUNNER}" in
    native)
        exec "${@}"
        ;;
    qemu-user)
        exec "qemu-${qarch}" "${@}"
        ;;
    qemu-system)
        true
        ;;
    *)
        echo "Invalid runner: \"${CROSS_RUNNER}\"";
        echo "Valid runners are: native, qemu-user and qemu-system"
        exit 1
        ;;
esac

n="$(nproc)"
memory=1G
driver9p="virtio-9p-pci"
drivernet="virtio-net-pci"

# select qemu parameters
case "${arch}" in
    aarch64)
        # 8 is the max number of cpu supported by qemu-aarch64
        n=$(( n > 8 ? 8 : n ))
        opt="-machine virt -cpu cortex-a57"
        ;;
    armv7)
        opt="-machine virt"
        driver9p="virtio-9p-device"
        drivernet="virtio-net-device"
        ;;
    i686)
        opt="-append console=ttyS0"
        ;;
    mips|mipsel)
        # avoid kernel error
        # https://blahcat.github.io/2017/07/14/building-a-debian-stretch-qemu-image-for-mipsel/
        opt="-append nokaslr"
        n=1
        ;;
    mips64el)
        # avoid kernel error
        # https://blahcat.github.io/2017/07/14/building-a-debian-stretch-qemu-image-for-mipsel/
        opt="-append nokaslr -cpu MIPS64R2-generic"
        n=1
        ;;
    powerpc)
        opt="-append console=ttyPZ0"
        n=1
        ;;
    powerpc64|powerpc64le)
        opt="-append console=hvc0 --nodefaults -serial stdio"
        ;;
    s390x)
        n=1
        driver9p="virtio-9p-ccw"
        drivernet="virtio-net-ccw"
        ;;
    sparc64)
        n=1
        driver9p+=",bus=pciB"
        drivernet+=",bus=pciB"
        ;;
    x86_64)
        opt="-append console=ttyS0"
        ;;
esac

(
    flock -n 200 || exit 0

    echo Booting QEMU virtual machine with $n cpus...

    QEMU_CMD="qemu-system-${qarch} \
        -m ${memory} \
        -smp ${n} \
        -nographic \
        -monitor none \
        -netdev user,id=net0,hostfwd=tcp::10022-:22 \
        -device ${drivernet},netdev=net0 \
        -kernel /qemu/kernel \
        -initrd /qemu/initrd.gz \
        ${opt} \
        -fsdev local,id=fs0,path=/target,security_model=mapped \
        -device ${driver9p},fsdev=fs0,mount_tag=target"

    touch "${LOG}"
    if [[ -n "${CROSS_DEBUG}" ]]; then
        (${QEMU_CMD} 2>&1 | tee -a "${LOG}") &
    else
        ${QEMU_CMD} >> "${LOG}" 2>&1 &
    fi

    # wait for dropbear
    for _ in $(seq 240); do
        if grep -q "Not backgrounding" "${LOG}"; then
            READY=1
            break
        fi
        sleep 0.5s
    done

    if [ -z "${READY}" ]; then
        if [ -n "${CROSS_DEBUG}" ]; then
            echo "Not ready but continuing because CROSS_DEBUG is set"
        else
            echo "Qemu is not ready after ${SECONDS} seconds..."
            echo "Set the environment variable CROSS_DEBUG=1 to debug"
            echo "Last 100 lines of qemu output:"
            tail -n 100 "${LOG}"
            exit 1
        fi
    fi

    echo "Booted in ${SECONDS} seconds"

) 200>"${LOCK}"

if [[ -t 1 ]] && [[ -t 2 ]]; then
  tty_flag='-t'
fi

exec dbclient ${tty_flag} -p 10022 -y -y root@localhost "${@}"


================================================
FILE: .docker/cross/qemu.sh
================================================
#!/usr/bin/env bash

set -x
set -euo pipefail

# shellcheck disable=SC1091
. lib.sh

build_static_libffi () {
    local version=3.0.13

    local td
    td="$(mktemp -d)"

    pushd "${td}"


    curl --retry 3 -sSfL "https://github.com/libffi/libffi/archive/refs/tags/v${version}.tar.gz" -O -L
    tar --strip-components=1 -xzf "v${version}.tar.gz"
    ./configure --prefix="$td"/lib --disable-builddir --disable-shared --enable-static
    make "-j$(nproc)"
    install -m 644 ./.libs/libffi.a /usr/lib64/

    popd

    rm -rf "${td}"
}

build_static_libmount () {
    local version_spec=2.23.2
    local version=2.23
    local td
    td="$(mktemp -d)"

    pushd "${td}"

    curl --retry 3 -sSfL "https://kernel.org/pub/linux/utils/util-linux/v${version}/util-linux-${version_spec}.tar.xz" -O -L
    tar --strip-components=1 -xJf "util-linux-${version_spec}.tar.xz"
    ./configure --disable-shared --enable-static --without-ncurses
    make "-j$(nproc)" mount blkid
    install -m 644 ./.libs/*.a /usr/lib64/

    popd

    rm -rf "${td}"
}


build_static_libattr() {
    local version=2.4.46

    local td
    td="$(mktemp -d)"

    pushd "${td}"

    yum install -y gettext

    curl --retry 3 -sSfL "https://download.savannah.nongnu.org/releases/attr/attr-${version}.src.tar.gz" -O
    tar --strip-components=1 -xzf "attr-${version}.src.tar.gz"
    cp /usr/share/automake*/config.* .

    ./configure
    make "-j$(nproc)"
    install -m 644 ./libattr/.libs/libattr.a /usr/lib64/

    yum remove -y gettext

    popd

    rm -rf "${td}"
}

build_static_libcap() {
    local version=2.22

    local td
    td="$(mktemp -d)"

    pushd "${td}"

    curl --retry 3 -sSfL "https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-${version}.tar.xz" -O
    tar --strip-components=1 -xJf "libcap-${version}.tar.xz"
    make "-j$(nproc)"
    install -m 644 libcap/libcap.a /usr/lib64/

    popd

    rm -rf "${td}"
}

build_static_pixman() {
    local version=0.34.0

    local td
    td="$(mktemp -d)"

    pushd "${td}"

    curl --retry 3 -sSfL "https://www.cairographics.org/releases/pixman-${version}.tar.gz" -O
    tar --strip-components=1 -xzf "pixman-${version}.tar.gz"
    ./configure
    make "-j$(nproc)"
    install -m 644 ./pixman/.libs/libpixman-1.a /usr/lib64/

    popd

    rm -rf "${td}"
}

main() {
    local version=5.1.0

    if_centos version=4.2.1

    local arch="${1}" \
          softmmu="${2:-}"

    install_packages \
        autoconf \
        automake \
        bison \
        bzip2 \
        curl \
        flex \
        libtool \
        make \
        patch \
        python3 \

    if_centos install_packages \
        gcc-c++ \
        pkgconfig \
        xz \
        glib2-devel \
        glib2-static \
        glibc-static \
        libattr-devel \
        libcap-devel \
        libfdt-devel \
        pcre-static \
        pixman-devel \
        libselinux-devel \
        libselinux-static \
        libffi \
        libuuid-devel \
        libblkid-devel \
        libmount-devel \
        zlib-devel \
        zlib-static

    if_centos 'curl --retry 3 -sSfL "https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD" -o /usr/share/automake*/config.guess'
    if_centos 'curl --retry 3 -sSfL "https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD" -o /usr/share/automake*/config.sub'

    # these are not packaged as static libraries in centos; build them manually
    if_centos build_static_libffi
    if_centos build_static_libmount
    if_centos build_static_libattr
    if_centos build_static_libcap
    if_centos build_static_pixman

    if_ubuntu install_packages \
        g++ \
        pkg-config \
        xz-utils \
        libattr1-dev \
        libcap-ng-dev \
        libffi-dev \
        libglib2.0-dev \
        libpixman-1-dev \
        libselinux1-dev \
        zlib1g-dev

    # if we have python3.6+, we can install qemu 6.1.0, which needs ninja-build
    # ubuntu 16.04 only provides python3.5, so remove when we have a newer qemu.
    is_ge_python36=$(python3 -c "import sys; print(int(sys.version_info >= (3, 6)))")
    if [[ "${is_ge_python36}" == "1" ]]; then
        if_ubuntu version=6.1.0
        if_ubuntu install_packages ninja-build
    fi

    local td
    td="$(mktemp -d)"

    pushd "${td}"

    curl --retry 3 -sSfL "https://download.qemu.org/qemu-${version}.tar.xz" -O
    tar --strip-components=1 -xJf "qemu-${version}.tar.xz"

    local targets="${arch}-linux-user"
    local virtfs=""
    case "${softmmu}" in
        softmmu)
            if [ "${arch}" = "ppc64le" ]; then
                targets="${targets},ppc64-softmmu"
            else
                targets="${targets},${arch}-softmmu"
            fi
            virtfs="--enable-virtfs"
            ;;
        "")
            true
            ;;
        *)
            echo "Invalid softmmu option: ${softmmu}"
            exit 1
            ;;
    esac

    ./configure \
        --disable-kvm \
        --disable-vnc \
        --disable-guest-agent \
        --enable-linux-user \
        --static \
        ${virtfs} \
        --target-list="${targets}"
    make "-j$(nproc)"
    make install

    # HACK the binfmt_misc interpreter we'll use expects the QEMU binary to be
    # in /usr/bin. Create an appropriate symlink
    ln -s "/usr/local/bin/qemu-${arch}" "/usr/bin/qemu-${arch}-static"

    purge_packages

    popd

    rm -rf "${td}"
    rm "${0}"
}

main "${@}"


================================================
FILE: .docker/cross/xargo.sh
================================================
#!/usr/bin/env bash

set -x
set -euo pipefail

# shellcheck disable=SC1091
. lib.sh

main() {
    install_packages ca-certificates curl

    export RUSTUP_HOME=/tmp/rustup
    export CARGO_HOME=/tmp/cargo

    curl --retry 3 -sSfL https://sh.rustup.rs -o rustup-init.sh
    sh rustup-init.sh -y --no-modify-path --profile minimal
    rm rustup-init.sh

    PATH="${CARGO_HOME}/bin:${PATH}" cargo install xargo --root /usr/local

    rm -r "${RUSTUP_HOME}" "${CARGO_HOME}"

    purge_packages

    rm "${0}"
}

main "${@}"


================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true


================================================
FILE: .github/CODEOWNERS
================================================
# Current WG Code Sub Teams:
# @tauri-apps/wg-tauri
# @tauri-apps/wg-devops

# Order is important; the last matching pattern takes the most precedence.
* @tauri-apps/wg-tauri

.github @tauri-apps/wg-devops


================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall
  community

Examples of unacceptable behavior include:

- The use of sexualized language or imagery, and sexual attention or advances of
  any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address,
  without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
[contact@tauri.app](mailto:contact@tauri.app).
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series of
actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within the
community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].

Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].

For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].

[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations


================================================
FILE: .github/CONTRIBUTING.md
================================================
# Tauri Contributing Guide

Hi! We, the maintainers, are really excited that you are interested in contributing to Tauri. Before submitting your contribution though, please make sure to take a moment and read through the [Code of Conduct](CODE_OF_CONDUCT.md), as well as the appropriate section for the contribution you intend to make:

- [Issue Reporting Guidelines](#issue-reporting-guidelines)
- [Pull Request Guidelines](#pull-request-guidelines)
- [Development Guide](#development-guide)
- [AI Tool Policy](#ai-tool-policy)

## Issue Reporting Guidelines

- The issue list of this repo is **exclusively** for bug reports and feature requests. Non-conforming issues will be closed immediately.

- If you have a question, you can get quick answers from the [Tauri Discord chat](https://discord.gg/SpmNs4S).

- Try to search for your issue, it may have already been answered or even fixed in the development branch (`dev`).

- Check if the issue is reproducible with the latest stable version of Tauri. If you are using a pre-release, please indicate the specific version you are using.

- It is **required** that you clearly describe the steps necessary to reproduce the issue you are running into. Although we would love to help our users as much as possible, diagnosing issues without clear reproduction steps is extremely time-consuming and simply not sustainable.

- Use only the minimum amount of code necessary to reproduce the unexpected behavior. A good bug report should isolate specific methods that exhibit unexpected behavior and precisely define how expectations were violated. What did you expect the method or methods to do, and how did the observed behavior differ? The more precisely you isolate the issue, the faster we can investigate.

- Issues with no clear repro steps will not be triaged. If an issue labeled "need repro" receives no further input from the issue author for more than 5 days, it will be closed.

- If your issue is resolved but still open, don't hesitate to close it. In case you found a solution by yourself, it could be helpful to explain how you fixed it.

- Most importantly, we beg your patience: the team must balance your request against many other responsibilities — fixing other bugs, answering other questions, new features, new documentation, etc. The issue list is not paid support and we cannot make guarantees about how fast your issue can be resolved.

## Pull Request Guidelines

- You have to [sign your commits](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits).

- It's OK to have multiple small commits as you work on the PR - we will let GitHub automatically squash it before merging.

- If adding new feature:
  - Provide convincing reason to add this feature. Ideally you should open a suggestion issue first and have it greenlighted before working on it.

- If fixing a bug:
  - If you are resolving a special issue, add `(fix: #xxxx[,#xxx])` (#xxxx is the issue id) in your PR title for a better release log, e.g. `fix: update entities encoding/decoding (fix #3899)`.
  - Provide detailed description of the bug in the PR, or link to an issue that does.

- If the PR is meant to be released, follow the instructions in `.changes/readme.md` to log your changes. ie. [readme.md](https://github.com/tauri-apps/tauri/blob/dev/.changes/README.md)

## Development Guide

**NOTE: If you have any question don't hesitate to ask in our Discord server. We try to keep this guide to up guide, but if something doesn't work let us know.**

### General Setup

First, [join our Discord server](https://discord.gg/SpmNs4S) and let us know that you want to contribute. This way we can point you in the right direction and help ensure your contribution will be as helpful as possible.

To set up your machine for development, follow the [Tauri setup guide](https://v2.tauri.app/start/prerequisites/) to get all the tools you need to develop Tauri apps. The only additional tool you may need is [PNPM](https://pnpm.io/), it is only required if you are developing the Node CLI or API packages (`packages/cli` and `packages/api`).

Next, [fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) and clone [this repository](https://github.com/tauri-apps).
The development process varies depending on what part of Tauri you are contributing to, see the guides below for per-package instructions.

Some Tauri packages will be automatically built when running one of the examples. Others, however, will need to be built beforehand. To initialize, execute these commands in the repository root:

```bash
pnpm install
pnpm build
```

### Overview

See [Architecture](../ARCHITECTURE.md#major-components) for an overview of the packages in this repository.

### Developing Tauri Core and Related Components (Rust API, Macros, Codegen, and Utils)

The code for the Rust crates, including the Core, Macros, Utils, WRY runtime, and a few more are located in the [main Tauri repository](https://github.com/tauri-apps/tauri/tree/dev/crates).

The easiest way to test your changes is to use the [helloworld](https://github.com/tauri-apps/tauri/tree/dev/examples/helloworld) example app. It automatically rebuilds and uses your local copy of the Tauri core packages. Just run `cargo run --example helloworld` after making changes to test them out.

To test local changes against your own application simply point the Tauri create to your local repository. In `src-tauri/Cargo.toml` file change:

`tauri = { version = "2.1.1" }`

to:

`tauri = { path = "path/to/local/tauri/crates/tauri" }`

If any other crates depend on Tauri you will have to point them to the local repo as well.

### Developing Tauri Bundler and Rust CLI

The code for the bundler is located in [crates/tauri-bundler](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-bundler), and the code for the Rust CLI is located in [tauri-cli](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-cli).
Running `cargo install --path .` in the Rust CLI directory will allow you to run `cargo tauri build` and `cargo tauri dev` anywhere, using the updated copy of the bundler and cli. You will have to run this command each time you make a change in either package.
You can use `cargo install --path . --debug` to speed up test builds.

### Developing The Node.js CLI (`@tauri-apps/cli`)

[`@tauri-apps/cli`](https://github.com/tauri-apps/tauri/tree/dev/packages/cli) is a small wrapper around `tauri-cli` so most changes should be happen in the Rust CLI (see above).

#### Building the documentation locally

You can build the Rust documentation locally running the following script:

```bash
$ cargo +nightly doc --all-features --open
```

### Developing the JS API

The JS API provides bindings between the developer's JS in the Webview and the built-in Tauri APIs, written in Rust. Its code is located in [/packages/api](https://github.com/tauri-apps/tauri/tree/dev/packages/api).
After making changes to the code, run `pnpm build` to build it. To test your changes, we recommend using the API example app, located in [/examples/api](https://github.com/tauri-apps/tauri/tree/dev/examples/api). It will automatically use your local copy of the JS API and provides a helpful UI to test the various commands.

## AI Tool Policy

It takes a lot of time to review a Pull Request while it's very easy to make a nonsensical but plausible looking one using AI tools.
It is unfair for other contributors and the reviewers to spend much of the time dealing with this, hence these rules:

1. Review and test all LLM-generated content before submitting, you're the one responsible for it, not the AI.
2. Don't use AI to respond to review comments (except for translations).

We will close the Pull Request with a `ai-slop` tag if you failed to do so.

## Financial Contribution

Tauri is an MIT-licensed open source project. Its ongoing development can be supported via [GitHub Sponsors](https://github.com/sponsors/tauri-apps) or [Open Collective](https://opencollective.com/tauri). We prefer GitHub Sponsors as donations made are doubled through the matching fund program.


================================================
FILE: .github/FUNDING.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

# These are supported funding model platforms

github: tauri-apps
patreon: #
open_collective: tauri
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
custom: # Replace with a single custom sponsorship URL


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: 🐞 Bug Report
title: '[bug] '
description: Report a bug
labels: ['type: bug', 'status: needs triage']

body:
  - type: markdown
    attributes:
      value: |
        ## First of all
        1. Please search for [existing issues](https://github.com/tauri-apps/tauri/issues?q=is%3Aissue) about this problem first.
        2. Make sure `rustc` and all relevant Tauri packages are up to date.
        3. Make sure it's an issue with Tauri and not something else you are using.
        4. Remember to follow our community guidelines and be friendly.

  - type: textarea
    id: description
    attributes:
      label: Describe the bug
      description: A clear description of what the bug is. Include screenshots if applicable.
      placeholder: Bug description
    validations:
      required: true

  - type: textarea
    id: reproduction
    attributes:
      label: Reproduction
      description: A link to a reproduction repo or steps to reproduce the behaviour.
      placeholder: |
        Please provide a minimal reproduction or steps to reproduce, see this guide https://stackoverflow.com/help/minimal-reproducible-example
        Why reproduction is required? see this article https://antfu.me/posts/why-reproductions-are-required

  - type: textarea
    id: expected-behavior
    attributes:
      label: Expected behavior
      description: A clear description of what you expected to happen.

  - type: textarea
    id: info
    attributes:
      label: Full `tauri info` output
      description: 'Output of `npm run tauri info` or `cargo tauri info`'
      render: text
    validations:
      required: true

  - type: textarea
    id: logs
    attributes:
      label: Stack trace
      render: text

  - type: textarea
    id: context
    attributes:
      label: Additional context
      description: Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

contact_links:
  - name: 💬 Discord Chat
    url: https://discord.com/invite/tauri
    about: Ask questions and talk to other Tauri users and the maintainers


================================================
FILE: .github/ISSUE_TEMPLATE/docs_report.md
================================================
---
name: 📚 Docs Report
about: Create a report to help us improve the docs
title: '[docs] '
labels: 'type: documentation'
assignees: ''
---


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: 💡 Feature Request
title: '[feat] '
description: Suggest an idea
labels: ['type: feature request']

body:
  - type: textarea
    id: problem
    attributes:
      label: Describe the problem
      description: A clear description of the problem this feature would solve
      placeholder: "I'm always frustrated when..."
    validations:
      required: true

  - type: textarea
    id: solution
    attributes:
      label: "Describe the solution you'd like"
      description: A clear description of what change you would like
      placeholder: 'I would like to...'
    validations:
      required: true

  - type: textarea
    id: alternatives
    attributes:
      label: Alternatives considered
      description: "Any alternative solutions you've considered"

  - type: textarea
    id: context
    attributes:
      label: Additional context
      description: Add any other context about the problem here.


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
Before submitting a PR, please read https://github.com/tauri-apps/tauri/blob/dev/.github/CONTRIBUTING.md#pull-request-guidelines

1. Give the PR a descriptive title.

  Examples of good title:
    - fix(windows): fix race condition in event loop
    - docs: update example for `App::show`
    - feat: add `Window::set_fullscreen`

  Examples of bad title:
    - fix #7123
    - update docs
    - fix bugs

2. If there is a related issue, reference it in the PR text, e.g. closes #123.
3. If this change requires a new version, then add a change file in `.changes` directory with the appropriate bump, see https://github.com/tauri-apps/tauri/blob/dev/.changes/README.md
4. Ensure that all your commits are signed https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits
5. Ensure `cargo test` and `cargo clippy` passes.
6. Propose your changes as a draft PR if your work is still in progress.
-->


================================================
FILE: .github/RELEASING.md
================================================
# Tauri Releasing Handbook

This handbook contains information about our release pipeline and how to deal with common issues.
This document is mainly intended for team members responsible for maintaining the project.

- [Covector](#covector)
- [Version Pull Request](#version-pull-request)
- [Releasing and Publishing](#releasing-and-publishing)
- [Publishing failed, what to do?](#publishing-failed-what-to-do)

## Covector

We use [`covector`](https://github.com/jbolda/covector) to manage our version bumps and release pipeline.
It can be configured in [`.changes/config.json`](../.changes/config.json) which includes how each package should be published step by step.

Some packages can't be published directly using `covector` as it requires to be built on a matrix of platforms
such as `tauri-cli` prebuilt binaries which is published using [publish-cli-rs.yml](./workflows/publish-cli-rs.yml)
and `@tauri-apps/cli` native Node.js modules which is published using using [publish-cli-js.yml](./workflows/publish-cli-js.yml)
both of which are triggered after `covector` has created a github release for both of them, see `Trigger @tauri-apps/cli publishing workflow`
and `Trigger tauri-cli publishing workflow` steps in [covector-version-or-publish.yml](./workflows/covector-version-or-publish.yml)

## Version Pull Request

On each pull request merged, [covector-version-or-publish.yml](./workflows/covector-version-or-publish.yml) workflow will run, and:

When there're change files inside `.changes` folder and they're not all included in `pre.json` (usually this is only when we are in `-alpha` to `-rc` phase), it will open/update an `Apply Version Updates From Current Changes` PR (https://github.com/tauri-apps/tauri/pull/11029 for example) that bumps all packages based on current existing change files and generate `CHANGELOG.md` entries. see `Create Pull Request With Versions Bumped` step in [covector-version-or-publish.yml](./workflows/covector-version-or-publish.yml).

Otherwise, covector will start to publish packages configured in [`.changes/config.json`](../.changes/config.json).

## Releasing and Publishing

Releasing can be as easy as merging the version pull request but here is a checklist to follow:

- [ ] Double check that every package is bumped correctly and there are no accidental major or minor being released unless that is indeed the intention.
- [ ] Make sure that there are no pending or unfinished [covector-version-or-publish.yml](./workflows/covector-version-or-publish.yml) workflow runs.
- [ ] Approve and merge the version pull request

## Publishing failed, what to do?

It is possible and due to many factors that one or many packages release can fail to release, there is no reason to panic, we can fix this.

Did all of the packages fail to release?

- yes?
  - [ ] `git checkout -b revert-branch`
  - [ ] `git revert HEAD~1`
- no?
  - [ ] `git checkout -b revert-branch`
  - [ ] `git revert HEAD~1 --no-commit`
  - [ ] Edit the commit and revert only changes related to packages that failed to publish
  - [ ] `git revert --continue`

Then:

- [ ] Make a pull request with reverted changes, get it approved and merged
- [ ] Fix the issue that caused releases to fail in another PR, get it approved and merged
- [ ] Repeat the release process again.


================================================
FILE: .github/workflows/audit.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: Audit

on:
  workflow_dispatch:
  schedule:
    - cron: '0 0 * * *'
  pull_request:
    paths:
      - '.github/workflows/audit.yml'
      - '**/Cargo.lock'
      - '**/Cargo.toml'
      - '**/package.json'
      - '**/pnpm-lock.yaml'
  push:
    branches:
      - dev
    paths:
      - '.github/workflows/audit.yml'
      - '**/Cargo.lock'
      - '**/Cargo.toml'
      - '**/package.json'
      - '**/pnpm-lock.yaml'

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  audit-rust:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: rust audit
        uses: rustsec/audit-check@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

  audit-js:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm i -g --force corepack
      - uses: actions/setup-node@v4
        with:
          node-version: 'lts/*'
      - run: pnpm audit


================================================
FILE: .github/workflows/bench.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: bench

on:
  push:
    branches:
      - dev
  workflow_dispatch:
  pull_request:
    paths:
      - '.github/workflows/bench.yml'
      - 'bench/**'

env:
  RUST_BACKTRACE: 1
  CARGO_PROFILE_DEV_DEBUG: 0 # This would add unnecessary bloat to the target folder, decreasing cache efficiency.
  LC_ALL: en_US.UTF-8 # This prevents strace from changing its number format to use commas.

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  bench:
    strategy:
      fail-fast: false
      matrix:
        rust: [nightly]
        platform:
          - { target: x86_64-unknown-linux-gnu, os: ubuntu-latest }

    runs-on: ${{ matrix.platform.os }}

    steps:
      - uses: actions/checkout@v4

      - name: install Rust ${{ matrix.rust }}
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          components: rust-src
          targets: ${{ matrix.platform.target }}

      - name: setup python
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'
          architecture: x64

      - name: install dependencies
        run: |
          python -m pip install --upgrade pip
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends \
            webkit2gtk-4.1 libayatana-appindicator3-dev \
            xvfb \
            at-spi2-core
          wget https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine_1.18.0_amd64.deb
          sudo dpkg -i hyperfine_1.18.0_amd64.deb
          pip install memory_profiler

      - uses: Swatinem/rust-cache@v2

      - name: run benchmarks
        run: |
          cargo build --manifest-path bench/tests/cpu_intensive/src-tauri/Cargo.toml --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target ${{ matrix.platform.target }}
          cargo build --manifest-path bench/tests/files_transfer/src-tauri/Cargo.toml --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target ${{ matrix.platform.target }}
          cargo build --manifest-path bench/tests/helloworld/src-tauri/Cargo.toml --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target ${{ matrix.platform.target }}
          xvfb-run --auto-servernum cargo run --manifest-path bench/Cargo.toml --bin run_benchmark

      - name: clone benchmarks_results
        if: github.repository == 'tauri-apps/tauri' && github.ref == 'refs/heads/dev'
        uses: actions/checkout@v4
        with:
          token: ${{ secrets.BENCH_PAT }}
          path: gh-pages
          repository: tauri-apps/benchmark_results

      - name: push new benchmarks
        if: github.repository == 'tauri-apps/tauri' && github.ref == 'refs/heads/dev'
        run: |
          cargo run --manifest-path bench/Cargo.toml --bin build_benchmark_jsons
          cd gh-pages
          git pull
          git config user.name "tauri-bench"
          git config user.email "gh.tauribot@gmail.com"
          git add .
          git commit --message "Update Tauri benchmarks"
          git push origin gh-pages

      - name: Print worker info
        run: |
          cat /proc/cpuinfo
          cat /proc/meminfo


================================================
FILE: .github/workflows/check-change-tags.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: check change tags

on:
  pull_request:
    paths:
      - '.changes/*.md'

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: check change files end with .md
        run: |
          for file in .changes/*
          do
            if [[ ! "$file" =~ \.(md|json)$ ]]; then
              echo ".changes directory should only contain files that end with .md"
              echo "found an invalid file in .changes directory:"
              echo "$file"
              exit 1
            fi
          done

      - uses: dorny/paths-filter@v3
        id: filter
        with:
          list-files: shell
          filters: |
            changes:
              - added|modified: '.changes/*.md'

      - name: check
        run: node ./.scripts/ci/check-change-tags.js ${{ steps.filter.outputs.changes_files }}
        if: ${{ steps.filter.outputs.changes == 'true' }}


================================================
FILE: .github/workflows/check-generated-files.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: check generated files

on:
  pull_request:
    paths:
      - '.github/workflows/check-generated-files.yml'
      - 'pnpm-lock.yaml'
      - 'packages/api/src/**'
      - 'crates/tauri/scripts/bundle.global.js'
      - 'crates/tauri-utils/src/config.rs'
      - 'crates/tauri-cli/config.schema.json'
      - 'crates/tauri-schema-generator/schemas/*.json'

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  changes:
    runs-on: ubuntu-latest
    outputs:
      api: ${{ steps.filter.outputs.api }}
      schema: ${{ steps.filter.outputs.schema }}
    steps:
      - uses: actions/checkout@v4
      - uses: dorny/paths-filter@v3
        id: filter
        with:
          filters: |
            api:
              - 'pnpm-lock.yaml'
              - 'packages/api/src/**'
              - 'crates/tauri/scripts/bundle.global.js'
            schema:
              - 'crates/tauri-utils/src/config.rs'
              - 'crates/tauri-cli/config.schema.json'
              - 'crates/tauri-schema-generator/schemas/*.json'

  api:
    runs-on: ubuntu-latest
    needs: changes
    if: needs.changes.outputs.api == 'true'
    steps:
      - uses: actions/checkout@v4
      - run: npm i -g --force corepack
      - uses: actions/setup-node@v4
        with:
          node-version: 'lts/*'
          cache: 'pnpm'

      - name: install deps
        run: pnpm i --frozen-lockfile
      - name: build api
        run: pnpm build
        working-directory: packages/api
      - name: check api
        run: ./.scripts/ci/has-diff.sh

  schema:
    runs-on: ubuntu-latest
    needs: changes
    if: needs.changes.outputs.schema == 'true'
    steps:
      - uses: actions/checkout@v4

      - name: install stable
        uses: dtolnay/rust-toolchain@stable

      - name: install Linux dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libgtk-3-dev

      - uses: Swatinem/rust-cache@v2

      - name: generate schemas
        run: cargo build --manifest-path ./crates/tauri-schema-generator/Cargo.toml

      - name: check schemas
        run: ./.scripts/ci/has-diff.sh


================================================
FILE: .github/workflows/check-license-header.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: check license headers

on:
  pull_request:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dorny/paths-filter@v3
        id: filter
        with:
          list-files: shell
          filters: |
            added:
              - added: '**'
      - name: check header license on new files
        if: ${{ steps.filter.outputs.added == 'true' }}
        run: node ./.scripts/ci/check-license-header.js ${{ steps.filter.outputs.added_files }}


================================================
FILE: .github/workflows/covector-comment-on-fork.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: covector comment
on:
  workflow_run:
    workflows: [covector status] # the `name` of the workflow run on `pull_request` running `status` with `comment: true`
    types:
      - completed

# note all other permissions are set to none if not specified
#  and these set the permissions for `secrets.GITHUB_TOKEN`
permissions:
  # to read the action artifacts on `covector status` workflows
  actions: read
  # to write the comment
  pull-requests: write

jobs:
  comment:
    runs-on: ubuntu-latest
    if: github.event.workflow_run.conclusion == 'success' &&
      (github.event.workflow_run.head_repository.full_name != github.repository || github.actor == 'dependabot[bot]')
    steps:
      - name: covector status
        uses: jbolda/covector/packages/action@covector-v0
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          command: 'status'


================================================
FILE: .github/workflows/covector-status.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: covector status
on: [pull_request]

jobs:
  covector:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: covector status
        uses: jbolda/covector/packages/action@covector-v0
        id: covector
        with:
          command: 'status'
          token: ${{ secrets.GITHUB_TOKEN }}
          comment: true


================================================
FILE: .github/workflows/covector-version-or-publish.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: covector version or publish

on:
  push:
    branches:
      - dev

jobs:
  run-integration-tests:
    runs-on: ${{ matrix.platform }}

    strategy:
      fail-fast: false
      matrix:
        platform: [ubuntu-latest, macos-latest, windows-latest]

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - run: npm i -g --force corepack
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'pnpm'

      - name: install stable
        uses: dtolnay/rust-toolchain@stable

      - name: install Linux dependencies
        if: matrix.platform == 'ubuntu-latest'
        run: |
          sudo apt-get update
          sudo apt-get install -y webkit2gtk-4.1 libayatana-appindicator3-dev libfuse2 librsvg2-dev

      - uses: Swatinem/rust-cache@v2

      - name: build CLI
        run: cargo build --manifest-path ./crates/tauri-cli/Cargo.toml

      - name: run integration tests
        run: cargo test --test '*' -- --ignored

      - name: run CLI tests
        timeout-minutes: 30
        run: |
          cd ./packages/cli
          pnpm i --frozen-lockfile
          pnpm build
          pnpm test

  version-or-publish:
    runs-on: ubuntu-latest
    timeout-minutes: 65
    permissions:
      actions: write # required for workflow_dispatch
      contents: write # required to create new releases
      pull-requests: write # required to open version update pr
      id-token: write # pnpm provenance / oidc token
    outputs:
      change: ${{ steps.covector.outputs.change }}
      commandRan: ${{ steps.covector.outputs.commandRan }}
      successfulPublish: ${{ steps.covector.outputs.successfulPublish }}
    needs:
      - run-integration-tests

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - run: npm i -g --force corepack
      - uses: actions/setup-node@v6
        with:
          node-version: 24

      - name: cargo login
        run: cargo login ${{ secrets.ORG_CRATES_IO_TOKEN }}
      - name: git config
        run: |
          git config --global user.name "${{ github.event.pusher.name }}"
          git config --global user.email "${{ github.event.pusher.email }}"

      - name: install Linux dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y webkit2gtk-4.1 libayatana-appindicator3-dev librsvg2-dev

      - name: covector version or publish (publish when no change files present)
        uses: jbolda/covector/packages/action@covector-v0
        id: covector
        env:
          CARGO_AUDIT_OPTIONS: ${{ secrets.CARGO_AUDIT_OPTIONS }}
          NPM_CONFIG_PROVENANCE: true
        with:
          command: 'version-or-publish'
          token: ${{ secrets.GITHUB_TOKEN }}
          createRelease: true
          recognizeContributors: true

      - name: Sync Cargo.lock
        if: steps.covector.outputs.commandRan == 'version'
        run: cargo tree --depth 0

      - name: Create Pull Request With Versions Bumped
        if: steps.covector.outputs.commandRan == 'version'
        uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # 7.0.6
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          branch: release/version-updates
          title: Apply Version Updates From Current Changes
          commit-message: 'apply version updates'
          labels: 'version updates'
          body: ${{ steps.covector.outputs.change }}
          sign-commits: true

      - name: Trigger doc update
        if: |
          steps.covector.outputs.successfulPublish == 'true' &&
          steps.covector.outputs.packagesPublished != ''
        uses: peter-evans/repository-dispatch@ff45666b9427631e3450c54a1bcbee4d9ff4d7c0 # 3.0.0
        with:
          token: ${{ secrets.ORG_TAURI_BOT_PAT }}
          repository: tauri-apps/tauri-docs
          event-type: update-docs

      - name: Trigger `@tauri-apps/cli` publishing workflow
        if: |
          steps.covector.outputs.successfulPublish == 'true' &&
          contains(steps.covector.outputs.packagesPublished, '@tauri-apps/cli')
        run: gh workflow run 31554138 -r dev -f releaseId=${{ steps.covector.outputs['-tauri-apps-cli-releaseId'] }}
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Trigger `tauri-cli` publishing workflow
        if: |
          steps.covector.outputs.successfulPublish == 'true' &&
          contains(steps.covector.outputs.packagesPublished, 'tauri-cli')
        run: gh workflow run 31554139 -r dev
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/deploy-schema-worker.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: deploy schema worker

on:
  push:
    branches:
      - dev
    paths:
      - '.github/workflows/deploy-schema-worker.yml'
      - 'crates/tauri-schema-worker/**'

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: cloudflare/wrangler-action@v3
        with:
          command: deploy
          workingDirectory: 'crates/tauri-schema-worker'
          apiToken: ${{ secrets.SCHEMA_WORKER_CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.SCHEMA_WORKER_CLOUDFLARE_ACCOUNT_ID  }}


================================================
FILE: .github/workflows/docker.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: docker

on:
  workflow_dispatch:
  #pull_request:
  #  paths:
  #    - '.docker/**'
  #    - '.github/workflows/docker.yml'

jobs:
  setup:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: install stable
        uses: dtolnay/rust-toolchain@stable

      - name: install Linux dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libgtk-3-dev

      - name: install cross
        run: cargo install cross --git https://github.com/cross-rs/cross

      - name: Upload cross
        uses: actions/upload-artifact@v4
        with:
          name: cross
          path: '~/.cargo/bin/cross'
          if-no-files-found: error

      - name: build CLI
        run: cargo build --manifest-path ./crates/tauri-cli/Cargo.toml

      - name: Upload CLI
        uses: actions/upload-artifact@v4
        with:
          name: cargo-tauri
          path: crates/tauri-cli/target/debug/cargo-tauri
          if-no-files-found: error

  docker:
    needs: setup
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        target:
          - { name: 'aarch64-unknown-linux-gnu', filename: 'aarch64' }

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: install stable
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target.name }}

      - run: npm i -g --force corepack
      - name: Setup node
        uses: actions/setup-node@v4
        with:
          node-version: 'lts/*'

      - name: Download cross
        uses: actions/download-artifact@v4.1.7
        with:
          name: cross
          path: '~/.cargo/bin'

      - name: Download CLI
        uses: actions/download-artifact@v4.1.7
        with:
          name: cargo-tauri
          path: 'examples/api'

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and export to Docker
        uses: docker/build-push-action@v3
        with:
          context: .docker/cross
          file: .docker/cross/${{ matrix.target.filename }}.Dockerfile
          load: true
          tags: ${{ matrix.target.name }}:latest

      - name: install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y webkit2gtk-4.1 libayatana-appindicator3-dev

      - name: Test
        run: |
          cd packages/api
          pnpm i --frozen-lockfile && pnpm build
          cd ../../examples/api
          pnpm i --frozen-lockfile
          . .setup-cross.sh
          chmod +x cargo-tauri
          chmod +x $HOME/.cargo/bin/cross
          ./cargo-tauri build --runner cross --bundles deb --target ${{ matrix.target.name }} --verbose

      - name: Build and push
        uses: docker/build-push-action@v3
        with:
          context: .docker/cross
          file: .docker/cross/${{ matrix.target.filename }}.Dockerfile
          push: true
          tags: ghcr.io/${{ github.repository }}/${{ matrix.target.name }}:latest


================================================
FILE: .github/workflows/fmt.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: check formatting

on:
  pull_request:

jobs:
  rustfmt:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: install Rust stable and rustfmt
        uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt

      - name: run cargo fmt
        run: cargo fmt --all -- --check

  prettier:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm i -g --force corepack
      - uses: actions/setup-node@v4
        with:
          node-version: 'lts/*'
          cache: 'pnpm'
      - run: pnpm i --frozen-lockfile
      - run: pnpm format:check

  taplo:
    name: taplo (.toml files)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: install Rust stable
        uses: dtolnay/rust-toolchain@stable

      - name: install taplo-cli
        uses: taiki-e/install-action@v2
        with:
          tool: taplo-cli

      - run: taplo fmt --check --diff


================================================
FILE: .github/workflows/lint-js.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: lint js

on:
  pull_request:
    paths:
      - '.github/workflows/lint-js.yml'
      - 'packages/**'

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  eslint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm i -g --force corepack
      - uses: actions/setup-node@v4
        with:
          node-version: 'lts/*'
          cache: 'pnpm'
      - run: pnpm i --frozen-lockfile
      - run: pnpm eslint:check

  typescript:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm i -g --force corepack
      - uses: actions/setup-node@v4
        with:
          node-version: 'lts/*'
          cache: 'pnpm'
      - run: pnpm i --frozen-lockfile
      - run: pnpm ts:check


================================================
FILE: .github/workflows/lint-rust.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: lint rust

on:
  push:
    branches:
      - dev
  pull_request:
    paths:
      - '.github/workflows/lint-rust.yml'
      - 'crates/**'

env:
  RUST_BACKTRACE: 1
  CARGO_PROFILE_DEV_DEBUG: 0 # This would add unnecessary bloat to the target folder, decreasing cache efficiency.

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  clippy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: install rust stable and clippy
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy

      - name: install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libgtk-3-dev webkit2gtk-4.1 libayatana-appindicator3-dev

      - uses: Swatinem/rust-cache@v2

      - run: cargo clippy --all-targets --all-features -- -D warnings


================================================
FILE: .github/workflows/publish-cli-js.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: publish `@tauri-apps/cli`
env:
  DEBUG: napi:*
  APP_NAME: cli
  MACOSX_DEPLOYMENT_TARGET: '10.13'
on:
  workflow_dispatch:
    inputs:
      releaseId:
        description: 'ID of the `@tauri-apps/cli` release'
        required: true
  repository_dispatch:
    types: [publish-js-cli]

defaults:
  run:
    working-directory: packages/cli/

permissions:
  contents: write # update release
  id-token: write # oidc token

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        settings:
          - host: macos-latest
            target: x86_64-apple-darwin
            architecture: x64
            build: |
              pnpm build --target=x86_64-apple-darwin
              strip -x *.node
          - host: windows-latest
            build: pnpm build
            target: x86_64-pc-windows-msvc
            architecture: x64
          - host: windows-latest
            build: pnpm build --target i686-pc-windows-msvc
            target: i686-pc-windows-msvc
            architecture: x64
          - host: windows-latest
            architecture: x64
            target: aarch64-pc-windows-msvc
            build: pnpm build --target aarch64-pc-windows-msvc
          - host: ubuntu-22.04
            target: x86_64-unknown-linux-gnu
            docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian
            build: |
              npm i -g --force corepack
              cd packages/cli
              pnpm build --target x86_64-unknown-linux-gnu
              strip *.node
          - host: ubuntu-22.04
            target: x86_64-unknown-linux-musl
            docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
            build: |
              cd packages/cli
              pnpm build
              strip *.node
          - host: macos-latest
            target: aarch64-apple-darwin
            build: |
              pnpm build --features native-tls-vendored --target=aarch64-apple-darwin
              strip -x *.node
          - host: ubuntu-22.04
            target: aarch64-unknown-linux-gnu
            docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64
            build: |
              npm i -g --force corepack
              cd packages/cli
              pnpm build --target aarch64-unknown-linux-gnu
              aarch64-unknown-linux-gnu-strip *.node
          - host: ubuntu-22.04
            architecture: x64
            target: armv7-unknown-linux-gnueabihf
            setup: |
              sudo apt-get update
              sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
            build: |
              pnpm build --target=armv7-unknown-linux-gnueabihf
              arm-linux-gnueabihf-strip *.node
          - host: ubuntu-22.04
            architecture: x64
            target: aarch64-unknown-linux-musl
            docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
            build: |
              cd packages/cli
              rustup target add aarch64-unknown-linux-musl
              pnpm build --target aarch64-unknown-linux-musl
              /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node
          - host: ubuntu-22.04
            architecture: x64
            target: riscv64gc-unknown-linux-gnu
            setup: |
              sudo apt-get update
              sudo apt-get install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu -y
            build: |
              pnpm build --target=riscv64gc-unknown-linux-gnu
              riscv64-linux-gnu-strip *.node
    name: stable - ${{ matrix.settings.target }} - node@20
    runs-on: ${{ matrix.settings.host }}
    steps:
      - uses: actions/checkout@v4
      - run: npm i -g --force corepack
      - name: Setup node
        uses: actions/setup-node@v4
        if: ${{ !matrix.settings.docker }}
        with:
          node-version: 20
          cache: 'pnpm'
          architecture: ${{ matrix.settings.architecture }}
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        if: ${{ !matrix.settings.docker }}
        with:
          targets: ${{ matrix.settings.target }}
      - uses: Swatinem/rust-cache@v2
        with:
          key: ${{ matrix.settings.target }}
        if: ${{ matrix.settings.docker }}
      - name: Setup toolchain
        run: ${{ matrix.settings.setup }}
        if: ${{ matrix.settings.setup }}
        shell: bash
      - name: Install dependencies
        run: pnpm i --frozen-lockfile --ignore-scripts

      - name: Build in docker
        uses: addnab/docker-run-action@v3
        if: ${{ matrix.settings.docker }}
        with:
          image: ${{ matrix.settings.docker }}
          options: --user 0:0 -v ${{ github.workspace }}/.cargo-cache/git/db:/root/.cargo/git/db -v ${{ github.workspace }}/.cargo/registry/cache:/root/.cargo/registry/cache -v ${{ github.workspace }}/.cargo/registry/index:/root/.cargo/registry/index -v ${{ github.workspace }}:/build -w /build
          run: ${{ matrix.settings.build }}

      - name: Build
        run: ${{ matrix.settings.build }}
        if: ${{ !matrix.settings.docker }}
        shell: bash

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: bindings-${{ matrix.settings.target }}
          path: packages/cli/${{ env.APP_NAME }}.*.node
          if-no-files-found: error
  #  build-freebsd:
  #    runs-on: macos-10.15
  #    name: Build FreeBSD
  #    steps:
  #      - uses: actions/checkout@v4
  #      - name: Build
  #        id: build
  #        uses: vmactions/freebsd-vm@v0.1.6
  #        env:
  #          DEBUG: napi:*
  #          RUSTUP_HOME: /usr/local/rustup
  #          CARGO_HOME: /usr/local/cargo
  #          RUSTUP_IO_THREADS: 1
  #        with:
  #          envs: DEBUG RUSTUP_HOME CARGO_HOME RUSTUP_IO_THREADS
  #          usesh: true
  #          mem: 3000
  #          prepare: |
  #            pkg install -y curl node14 python2
  #            curl -qL https://www.npmjs.com/install.sh | sh
  #            npm install -g pnpm
  #            curl https://sh.rustup.rs -sSf --output rustup.sh
  #            sh rustup.sh -y --profile minimal --default-toolchain stable
  #            export PATH="/usr/local/cargo/bin:$PATH"
  #            echo "~~~~ rustc --version ~~~~"
  #            rustc --version
  #            echo "~~~~ node -v ~~~~"
  #            node -v
  #            echo "~~~~ pnpm --version ~~~~"
  #            pnpm --version
  #          run: |
  #            export PATH="/usr/local/cargo/bin:$PATH"
  #            pwd
  #            ls -lah
  #            whoami
  #            env
  #            freebsd-version
  #            cd ./packages/cli/
  #            pnpm i --frozen-lockfile --ignore-scripts
  #            pnpm build
  #            strip -x *.node
  #            rm -rf node_modules
  #            rm -rf ../../target
  #      - name: Upload artifact
  #        uses: actions/upload-artifact@v4
  #        with:
  #          name: bindings-freebsd
  #          path: packages/cli/${{ env.APP_NAME }}.*.node
  #          if-no-files-found: error
  test-macOS-windows-binding:
    name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }}
    needs:
      - build
    strategy:
      fail-fast: false
      matrix:
        settings:
          - host: macos-latest
            target: aarch64-apple-darwin
          - host: windows-latest
            target: x86_64-pc-windows-msvc
        node:
          - '18'
          - '20'
    runs-on: ${{ matrix.settings.host }}
    steps:
      - uses: actions/checkout@v4
      - run: npm i -g --force corepack
      - name: Setup node
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: 'pnpm'
      - name: Install dependencies
        run: pnpm i --frozen-lockfile --ignore-scripts
      - name: Download artifacts
        uses: actions/download-artifact@v4.1.7
        with:
          name: bindings-${{ matrix.settings.target }}
          path: 'packages/cli/'
      - name: List packages
        run: ls -R .
        shell: bash
      - name: Test bindings
        run: pnpm test
  test-linux-x64-gnu-binding:
    name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }}
    needs:
      - build
    strategy:
      fail-fast: false
      matrix:
        node:
          - '18'
          - '20'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm i -g --force corepack
      - name: Setup node
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: 'pnpm'
      - name: Install dependencies
        run: pnpm i --frozen-lockfile --ignore-scripts
      - name: Download artifacts
        uses: actions/download-artifact@v4.1.7
        with:
          name: bindings-x86_64-unknown-linux-gnu
          path: 'packages/cli'
      - name: List packages
        run: ls -R .
        shell: bash
      - name: install system dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y webkit2gtk-4.1 libayatana-appindicator3-dev librsvg2-dev
      - name: Test bindings
        run: pnpm test
  test-linux-x64-musl-binding:
    name: Test bindings on x86_64-unknown-linux-musl - node@${{ matrix.node }}
    needs:
      - build
    strategy:
      fail-fast: false
      matrix:
        node:
          - '18'
          - '20'
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
    steps:
      - uses: actions/checkout@v4
      - run: npm i -g --force corepack
      - name: Setup node
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: 'pnpm'
      - name: Install dependencies
        run: pnpm i --frozen-lockfile --ignore-scripts
      - name: Download artifacts
        uses: actions/download-artifact@v4.1.7
        with:
          name: bindings-x86_64-unknown-linux-musl
          path: 'packages/cli/'
      - name: List packages
        run: ls -R .
        shell: bash
      - name: Setup and run tests
        run: |
          pnpm tauri --help
          ls -la
      #- name: Setup and run tests
      #  run: |
      #    rustup install stable
      #    rustup default stable
      #    pnpm test
      #    ls -la
  test-linux-arm-bindings:
    name: Test bindings on ${{ matrix.image }} - node@${{ matrix.node }}
    needs:
      - build
    strategy:
      fail-fast: false
      matrix:
        node:
          - '18'
          - '20'
        image:
          - ghcr.io/napi-rs/napi-rs/nodejs:aarch64-16
    runs-on: ubuntu-latest
    steps:
      - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
        working-directory: ${{ github.workspace }}
      - uses: actions/checkout@v4
      - name: List packages
        run: ls -R .
        shell: bash
      - name: Download aarch64-gnu artifacts
        uses: actions/download-artifact@v4.1.7
        with:
          name: bindings-aarch64-unknown-linux-gnu
          path: 'packages/cli'
      - name: Download armv7-gnueabihf artifacts
        uses: actions/download-artifact@v4.1.7
        with:
          name: bindings-armv7-unknown-linux-gnueabihf
          path: 'packages/cli/'
      # TODO: actually run test, blocked by https://github.com/rust-lang/cargo/issues/8719
      - uses: addnab/docker-run-action@v3
        with:
          image: ${{ matrix.image }}
          options: '-v ${{ github.workspace }}:/build -w /build -e RUSTUP_HOME=/usr/local/rustup -e CARGO_HOME=/usr/local/cargo'
          shell: bash
          run: |
            set -e
            export PATH=/usr/local/cargo/bin/:/usr/local/fnm:$PATH
            apt-get update
            DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get install --no-install-recommends -y unzip libayatana-appindicator3-dev
            bash
            curl https://sh.rustup.rs -sSf | bash -s -- -y
            curl -fsSL https://fnm.vercel.app/install | bash -s -- --install-dir "/usr/local/fnm" --skip-shell
            eval "$(fnm env --use-on-cd)"
            fnm install ${{ matrix.node }}
            fnm use ${{ matrix.node }}
            cd packages/cli
            node tauri.js --help
            ls -la
  publish:
    name: Publish
    runs-on: ubuntu-latest
    needs:
      #- build-freebsd
      - test-macOS-windows-binding
      - test-linux-x64-gnu-binding
      - test-linux-x64-musl-binding
      #- test-linux-arm-bindings
    steps:
      - uses: actions/checkout@v4
      - run: npm i -g --force corepack
      - name: Setup node
        uses: actions/setup-node@v6
        with:
          node-version: 24
          cache: 'pnpm'
      - name: Install dependencies
        run: pnpm i --frozen-lockfile --ignore-scripts
      - name: Download all artifacts
        uses: actions/download-artifact@v4.1.7
        with:
          path: packages/cli/artifacts
      - name: Move artifacts
        run: pnpm artifacts
      - name: List packages
        run: ls -R ./npm
        shell: bash
      - name: Publish
        run: |
          npm publish
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NODE_AUTH_TOKEN: ''
          RELEASE_ID: ${{ github.event.client_payload.releaseId || inputs.releaseId }}


================================================
FILE: .github/workflows/publish-cli-rs.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: publish `tauri-cli`
env:
  MACOSX_DEPLOYMENT_TARGET: '10.13'
on:
  workflow_dispatch:
  repository_dispatch:
    types: [publish-clirs]

jobs:
  build:
    runs-on: ${{ matrix.config.os }}

    strategy:
      fail-fast: false
      matrix:
        config:
          - os: ubuntu-22.04
            rust_target: x86_64-unknown-linux-gnu
            ext: ''
            args: ''
          - os: macos-latest
            rust_target: x86_64-apple-darwin
            ext: ''
            args: ''
          - os: macos-latest
            rust_target: aarch64-apple-darwin
            ext: ''
            args: ''
          - os: windows-latest
            rust_target: x86_64-pc-windows-msvc
            ext: '.exe'
            args: ''
          - os: windows-latest
            rust_target: aarch64-pc-windows-msvc
            ext: '.exe'
            args: ''
          - os: ubuntu-22.04
            rust_target: riscv64gc-unknown-linux-gnu
            ext: ''
            args: ''
            cross: true

    steps:
      - uses: actions/checkout@v4

      - name: 'Setup Rust'
        if: ${{ !matrix.config.cross }}
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.config.rust_target }}

      - uses: Swatinem/rust-cache@v2
        if: ${{ !matrix.config.cross }}
        with:
          key: ${{ matrix.config.rust_target }}

      - name: install Linux dependencies
        if: ${{ !matrix.config.cross && startsWith(matrix.config.os, 'ubuntu') }}
        run: |
          sudo apt-get update
          sudo apt-get install -y libgtk-3-dev

      - name: Install cross
        if: ${{ matrix.config.cross }}
        uses: taiki-e/install-action@v2
        with:
          tool: cross@0.2.5

      - name: Build CLI
        if: ${{ !matrix.config.cross }}
        run: cargo build --manifest-path ./crates/tauri-cli/Cargo.toml --profile release-size-optimized ${{ matrix.config.args }}

      - name: Build CLI (cross)
        if: ${{ matrix.config.cross }}
        run: cross build --manifest-path ./crates/tauri-cli/Cargo.toml --target ${{ matrix.config.rust_target }} --profile release-size-optimized ${{ matrix.config.args }}

      - name: Upload CLI
        if: ${{ !matrix.config.cross }}
        uses: actions/upload-artifact@v4
        with:
          name: cargo-tauri-${{ matrix.config.rust_target }}${{ matrix.config.ext }}
          path: target/release-size-optimized/cargo-tauri${{ matrix.config.ext }}
          if-no-files-found: error

      - name: Upload CLI (cross)
        if: ${{ matrix.config.cross }}
        uses: actions/upload-artifact@v4
        with:
          name: cargo-tauri-${{ matrix.config.rust_target }}${{ matrix.config.ext }}
          path: target/${{ matrix.config.rust_target }}/release-size-optimized/cargo-tauri${{ matrix.config.ext }}
          if-no-files-found: error

  upload:
    needs: build
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Download built CLIs
        uses: actions/download-artifact@v4.1.7
        with:
          path: outputs

      - name: Pack archives
        run: ./.scripts/ci/pack-cli.sh

      - name: Get CLI version
        run: echo "CLI_VERSION=$(cat crates/tauri-cli/metadata-v2.json | jq '."cli.js".version' -r)" >> $GITHUB_ENV

      - name: Publish release
        uses: softprops/action-gh-release@50195ba7f6f93d1ac97ba8332a178e008ad176aa
        with:
          tag_name: tauri-cli-v${{ env.CLI_VERSION }}
          files: |
            outputs/cargo-tauri-*.zip
            outputs/cargo-tauri-*.tgz


================================================
FILE: .github/workflows/supply-chain.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: supply chain health status
on:
  workflow_dispatch:
  schedule:
    - cron: '0 0 * * *'
  push:
    branches:
      - dev
    paths:
      - '.github/workflows/supply-chain.yml'
      - '**/Cargo.lock'
      - '**/Cargo.toml'
jobs:
  cargo-vet:
    name: check rust dependencies with cargo vet
    runs-on: ubuntu-latest
    env:
      CARGO_VET_VERSION: 0.9.1
    steps:
      - uses: actions/checkout@master
      - name: Install Rust
        run: rustup update stable && rustup default stable

      - uses: actions/cache@v4
        with:
          path: ${{ runner.tool_cache }}/cargo-vet
          key: cargo-vet-bin-${{ env.CARGO_VET_VERSION }}

      - name: Add the tool cache directory to the search path
        run: echo "${{ runner.tool_cache }}/cargo-vet/bin" >> $GITHUB_PATH

      - name: Ensure that the tool cache is populated with the cargo-vet binary
        run: cargo install --root ${{ runner.tool_cache }}/cargo-vet --version ${{ env.CARGO_VET_VERSION }} cargo-vet

      # Enable this again to break the workflow once we have a reasonable amount of suggestions to get to a clean base line
      #      - name: Invoke cargo-vet
      #        run: cargo vet --locked

      - name: Provide audit suggestions
        run: cargo vet suggest


================================================
FILE: .github/workflows/test-android.yml
================================================
# Copyright 2019-2024 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'
      - 'crates/tauri-cli/templates/mobile/android/**'
      - 'crates/tauri-cli/src/mobile/**'
      - '!crates/tauri-cli/src/mobile/ios.rs'
      - '!crates/tauri-cli/src/mobile/ios/**'
      - 'crates/tauri-build/src/mobile.rs'
      - 'crates/tauri/mobile/android/**'
      - 'crates/tauri/mobile/android-codegen/**'
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  test:
    runs-on: ${{ matrix.platform }}

    strategy:
      fail-fast: false
      matrix:
        platform: [ubuntu-latest, macos-latest, windows-latest]

    steps:
      - uses: actions/checkout@v4

      - name: install Rust 1.77.2
        uses: dtolnay/rust-toolchain@1.77.2

      - name: install Linux dependencies
        if: matrix.platform == 'ubuntu-latest'
        run: |
          sudo apt-get update
          sudo apt-get install -y libgtk-3-dev webkit2gtk-4.1

      - run: npm i -g --force corepack
      - name: setup node
        uses: actions/setup-node@v4
        with:
          node-version: lts/*
          cache: 'pnpm'

      - uses: actions/setup-java@v3
        with:
          distribution: temurin
          java-version: 17
          cache: 'gradle'

      - name: Setup NDK
        uses: nttld/setup-ndk@v1
        id: setup-ndk
        with:
          ndk-version: r25b
          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'
        run: |
          directory="${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/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 CLI
        run: cargo build --manifest-path ./crates/tauri-cli/Cargo.toml

      - name: move CLI to cargo bin dir
        if: matrix.platform != 'windows-latest'
        run: mv ./target/debug/cargo-tauri $HOME/.cargo/bin

      - name: move CLI to cargo bin dir
        if: matrix.platform == 'windows-latest'
        run: mv ./target/debug/cargo-tauri.exe $HOME/.cargo/bin

      - run: pnpm i --frozen-lockfile

      - name: build Tauri API
        working-directory: ./packages/api
        run: pnpm build

      - name: init Android Studio project
        working-directory: ./examples/api
        run: cargo tauri android init
        env:
          NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}

      - name: build APK
        working-directory: ./examples/api
        run: cargo tauri android build
        env:
          NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}


================================================
FILE: .github/workflows/test-cli-js.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: test `@tauri-apps/cli`

on:
  push:
    branches:
      - dev
  pull_request:
    paths:
      - '.github/workflows/test-cli-js.yml'
      - 'packages/cli/**'
      # currently` @tauri-apps/cli` only tests the template
      - 'crates/tauri-cli/templates/app/**'

env:
  RUST_BACKTRACE: 1
  CARGO_PROFILE_DEV_DEBUG: 0 # This would add unnecessary bloat to the target folder, decreasing cache efficiency.

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  test:
    runs-on: ${{ matrix.platform }}

    strategy:
      fail-fast: false
      matrix:
        platform: [ubuntu-latest, macos-latest, windows-latest]

    steps:
      - uses: actions/checkout@v4

      - name: install Rust stable
        uses: dtolnay/rust-toolchain@stable

      - run: npm i -g --force corepack
      - name: setup node
        uses: actions/setup-node@v4
        with:
          node-version: 'lts/*'
          cache: 'pnpm'

      - name: install Linux dependencies
        if: matrix.platform == 'ubuntu-latest'
        run: |
          sudo apt-get update
          sudo apt-get install -y webkit2gtk-4.1 libayatana-appindicator3-dev librsvg2-dev

      - uses: Swatinem/rust-cache@v2

      - name: test
        timeout-minutes: 30
        run: |
          cd ./packages/cli
          pnpm i --frozen-lockfile
          pnpm build
          pnpm test


================================================
FILE: .github/workflows/test-cli-rs.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: test `tauri-cli`

on:
  push:
    branches:
      - dev
  pull_request:
    paths:
      - '.github/workflows/test-cli-rs.yml'
      - 'crates/tauri-utils/**'
      - 'crates/tauri-bundler/**'
      - 'crates/tauri-cli/**'

env:
  RUST_BACKTRACE: 1
  CARGO_PROFILE_DEV_DEBUG: 0 # This would add unnecessary bloat to the target folder, decreasing cache efficiency.

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  test:
    runs-on: ${{ matrix.platform.os }}

    strategy:
      fail-fast: false
      matrix:
        platform:
          - { target: x86_64-pc-windows-msvc, os: windows-latest }
          - {
              target: aarch64-pc-windows-msvc,
              os: windows-latest,
              args: --no-default-features --features native-tls-vendored
            }
          - { target: x86_64-unknown-linux-gnu, os: ubuntu-latest }
          - { target: x86_64-apple-darwin, os: macos-latest }

    steps:
      - uses: actions/checkout@v4

      - name: 'Setup Rust'
        uses: dtolnay/rust-toolchain@1.77.2
        with:
          targets: ${{ matrix.platform.target }}

      - name: install Linux dependencies
        if: matrix.platform.os == 'ubuntu-latest'
        run: |
          sudo apt-get update
          sudo apt-get install -y libgtk-3-dev webkit2gtk-4.1 libayatana-appindicator3-dev librsvg2-dev

      - uses: Swatinem/rust-cache@v2

      - name: test CLI
        run: cargo test --manifest-path ./crates/tauri-cli/Cargo.toml ${{ matrix.platform.args }}


================================================
FILE: .github/workflows/test-core.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: test core

on:
  push:
    branches:
      - dev
  pull_request:
    paths:
      - '.github/workflows/test-core.yml'
      - 'crates/**'
      - '!crates/tauri/scripts/**'
      - '!crates/tauri-cli/**'
      - '!crates/tauri-bundler/**'
      - '!crates/tauri-macos-sign/**'
      - '!crates/tauri-schema-generator/**'

env:
  RUST_BACKTRACE: 1
  CARGO_PROFILE_DEV_DEBUG: 0 # This would add unnecessary bloat to the target folder, decreasing cache efficiency.

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  test:
    runs-on: ${{ matrix.platform.os }}

    strategy:
      fail-fast: false
      matrix:
        platform:
          - {
              target: x86_64-pc-windows-msvc,
              os: windows-latest,
              toolchain: '1.77.2',
              cross: false,
              command: 'test'
            }
          - {
              target: x86_64-unknown-linux-gnu,
              os: ubuntu-latest,
              toolchain: '1.77.2',
              cross: false,
              command: 'test'
            }
          - {
              target: aarch64-apple-darwin,
              os: macos-14,
              toolchain: '1.77.2',
              cross: false,
              command: 'test'
            }
          - {
              target: aarch64-apple-ios,
              os: macos-latest,
              toolchain: '1.77.2',
              cross: false,
              command: 'build'
            }
          - {
              target: aarch64-linux-android,
              os: ubuntu-latest,
              toolchain: '1.77.2',
              cross: true,
              command: 'build'
            }
        features:
          - { args: --no-default-features, key: no-default }
          - { args: --all-features, key: all }

    steps:
      - uses: actions/checkout@v4

      - name: install Rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.platform.toolchain }}
          targets: ${{ matrix.platform.target }}

      - name: install Linux dependencies
        if: contains(matrix.platform.target, 'unknown-linux')
        run: |
          sudo apt-get update
          sudo apt-get install -y webkit2gtk-4.1 libxdo-dev libayatana-appindicator3-dev

      - uses: Swatinem/rust-cache@v2
        with:
          key: ${{ matrix.platform.target }}
          save-if: ${{ matrix.features.key == 'all' }}

      - name: test tauri-utils
        if: ${{ !matrix.platform.cross }}
        # Using --lib --bins --tests to skip doc tests
        run: cargo ${{ matrix.platform.command }} --target ${{ matrix.platform.target }} ${{ matrix.features.args }} --lib --bins --tests --manifest-path crates/tauri-utils/Cargo.toml

      - name: test tauri-utils (using cross)
        if: ${{ matrix.platform.cross }}
        # Using --lib --bins --tests to skip doc tests
        run: |
          cargo install cross --git https://github.com/cross-rs/cross --rev 51f46f296253d8122c927c5bb933e3c4f27cc317 --locked
          cross ${{ matrix.platform.command }} --target ${{ matrix.platform.target }} ${{ matrix.features.args }} --lib --bins --tests --manifest-path crates/tauri-utils/Cargo.toml

      - name: test tauri
        if: ${{ !matrix.platform.cross }}
        run: cargo ${{ matrix.features.key == 'no-default' && 'check' || matrix.platform.command }} --target ${{ matrix.platform.target }} ${{ matrix.features.args }} --manifest-path crates/tauri/Cargo.toml

      - name: test tauri (using cross)
        if: ${{ matrix.platform.cross }}
        run: |
          cargo install cross --git https://github.com/cross-rs/cross --rev 51f46f296253d8122c927c5bb933e3c4f27cc317 --locked
          cross ${{ matrix.features.key == 'no-default' && 'check' || matrix.platform.command }} --target ${{ matrix.platform.target }} ${{ matrix.features.args }} --manifest-path crates/tauri/Cargo.toml


================================================
FILE: .github/workflows/udeps.yml
================================================
# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: Udeps

on:
  push:
    branches:
      - dev

env:
  RUST_BACKTRACE: 1
  CARGO_PROFILE_DEV_DEBUG: 0 # This would add unnecessary bloat to the target folder, decreasing cache efficiency.

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  changes:
    runs-on: ubuntu-latest
    outputs:
      tauri: ${{ steps.filter.outputs.tauri }}
      build: ${{ steps.filter.outputs.build }}
      codegen: ${{ steps.filter.outputs.codegen }}
      macros: ${{ steps.filter.outputs.macros }}
      runtime: ${{ steps.filter.outputs.runtime }}
      wry: ${{ steps.filter.outputs.wry }}
      utils: ${{ steps.filter.outputs.utils }}
      bundler: ${{ steps.filter.outputs.bundler }}
      cli: ${{ steps.filter.outputs.cli }}
    steps:
      - uses: actions/checkout@v4
      - uses: dorny/paths-filter@v3
        id: filter
        with:
          filters: |
            tauri:
              - 'crates/tauri/**'
              - '!crates/tauri/scripts/**'
            build:
              - 'crates/tauri-build/**'
            codegen:
              - 'crates/tauri-codegen/**'
            macros:
              - 'crates/tauri-macros/**'
            runtime:
              - 'crates/tauri-runtime/**'
            wry:
              - 'crates/tauri-runtime-wry/**'
            utils:
              - 'crates/tauri-utils/**'
            bundler:
              - 'crates/tauri-bundler/**'
            cli:
              - 'crates/tauri-cli/**'
            macossign:
              - 'crates/tauri-macos-sign/**'

  setup:
    runs-on: ubuntu-latest
    needs: changes
    if: |
      needs.changes.outputs.tauri == 'true' ||
      needs.changes.outputs.build == 'true' ||
      needs.changes.outputs.codegen == 'true' ||
      needs.changes.outputs.macros == 'true' ||
      needs.changes.outputs.runtime == 'true' ||
      needs.changes.outputs.wry == 'true' ||
      needs.changes.outputs.utils == 'true' ||
      needs.changes.outputs.bundler == 'true' ||
      needs.changes.outputs.cli == 'true' ||
      needs.changes.outputs.macossign == 'true'

    steps:
      - uses: actions/checkout@v4

      - name: Install Rust nightly
        uses: dtolnay/rust-toolchain@nightly

      - name: Install udeps
        run: cargo install cargo-udeps --locked --force

      - name: Upload udeps
        uses: actions/upload-artifact@v4
        with:
          name: udeps
          path: '~/.cargo/bin/cargo-udeps'
          if-no-files-found: error

      - name: Create udeps matrix
        id: create-matrix
        env:
          TAURI: ${{ needs.changes.outputs.tauri == 'true' }}
          BUILD: ${{ needs.changes.outputs.build == 'true' }}
          CODEGEN: ${{ needs.changes.outputs.codegen == 'true' }}
          MACROS: ${{ needs.changes.outputs.macros == 'true' }}
          RUNTIME: ${{ needs.changes.outputs.runtime == 'true' }}
          WRY: ${{ needs.changes.outputs.wry == 'true' }}
          UTILS: ${{ needs.changes.outputs.utils == 'true' }}
          BUNDLER: ${{ needs.changes.outputs.bundler == 'true' }}
          CLI: ${{ needs.changes.outputs.cli == 'true' }}
          MACOSSIGN: ${{ needs.changes.outputs.macossign == 'true' }}
        run: |
          crates=()
          if [ "${TAURI}" == "true" ]; then crates[${#crates[@]}]="\"./crates/tauri\""; fi
          if [ "${BUILD}" == "true" ]; then crates[${#crates[@]}]="\"./crates/tauri-build\""; fi
          if [ "${CODEGEN}" == "true" ]; then crates[${#crates[@]}]="\"./crates/tauri-codegen\""; fi
          if [ "${MACROS}" == "true" ]; then crates[${#crates[@]}]="\"./crates/tauri-macros\""; fi
          if [ "${RUNTIME}" == "true" ]; then crates[${#crates[@]}]="\"./crates/tauri-runtime\""; fi
          if [ "${WRY}" == "true" ]; then crates[${#crates[@]}]="\"./crates/tauri-runtime-wry\""; fi
          if [ "${UTILS}" == "true" ]; then crates[${#crates[@]}]="\"./crates/tauri-utils\""; fi
          if [ "${BUNDLER}" == "true" ]; then crates[${#crates[@]}]="\"./crates/tauri-bundler\""; fi
          if [ "${CLI}" == "true" ]; then crates[${#crates[@]}]="\"./crates/tauri-cli\""; fi
          if [ "${MACOSSIGN}" == "true" ]; then crates[${#crates[@]}]="\"./crates/tauri-macos-sign\""; fi
          echo "matrix=[$crates]" >> "$GITHUB_OUTPUT"
    outputs:
      matrix: ${{ steps.create-matrix.outputs.matrix }}

  udeps:
    runs-on: ubuntu-latest
    needs: setup
    strategy:
      matrix:
        path: ${{ fromJson(needs.setup.outputs.matrix) }}
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust nightly
        uses: dtolnay/rust-toolchain@nightly

      - name: install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libgtk-3-dev

      - uses: Swatinem/rust-cache@v2

      - name: Download udeps
        uses: actions/download-artifact@v4.1.7
        with:
          name: udeps
          path: '~/.cargo/bin'

      - run: chmod +x $HOME/.cargo/bin/cargo-udeps

      - name: Install required packages
        run: |
          sudo apt-get update
          sudo apt-get install -y webkit2gtk-4.1 libayatana-appindicator3-dev

      - name: Run udeps
        run: cargo udeps --manifest-path ${{ matrix.path }}/Cargo.toml --all-targets --all-features


================================================
FILE: .gitignore
================================================
# dependency directories
node_modules/

# Optional npm and yarn cache directory
.npm/
.yarn/

# Output of 'npm pack'
*.tgz

# dotenv environment variables file
.env

# .vscode workspace settings file
.vscode/settings.json
.vscode/launch.json
.vscode/tasks.json

# npm, yarn and bun lock files
package-lock.json
yarn.lock
bun.lockb

# rust compiled folders
target/

# test video for streaming example
streaming_example_test_video.mp4

# examples /gen directory
/examples/**/src-tauri/gen/
/bench/**/src-tauri/gen/

# logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# runtime data
pids
*.pid
*.seed
*.pid.lock

# miscellaneous
/.vs
.DS_Store
.Thumbs.db
*.sublime*
.idea
debug.log
TODO.md
.aider*


================================================
FILE: .prettierignore
================================================
/audits
/.vscode

# change files are hand-written and shouldn't be formatted
/.changes/*
!/.changes/config.json

# dependcies and artifacts directories
node_modules/
target/
dist/

# lock files
pnpm-lock.yaml

# autogenerated and minimized js file
crates/tauri/scripts/bundle.global.js

# this file is an IIFE, shouldn't be formatted
crates/tauri/scripts/process-ipc-message-fn.js

# cli templates should be formatted manually
# it also includes invalid json files that
# prettier can't handle
crates/tauri-cli/templates

# autogenerated files
**/autogenerated/**/*.md
packages/cli/index.js
packages/cli/index.d.ts
crates/tauri-schema-worker/.wrangler
CHANGELOG.md
*schema.json

# WiX templates
*.wxs

# examples /gen directory
examples/**/src-tauri/gen
bench/**/src-tauri/gen


================================================
FILE: .prettierrc
================================================
{
  "singleQuote": true,
  "semi": false,
  "trailingComma": "none",
  "experimentalOperatorPosition": "start"
}


================================================
FILE: .scripts/ci/check-change-tags.js
================================================
#!/usr/bin/env node

// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT

const fs = require('fs')
const path = require('path')
const ignorePackages = [
  'tauri-macros',
  'tauri-codegen',
  'tauri-runtime',
  'tauri-runtime-wry',
  'tauri-driver'
]

const covectorConfig = JSON.parse(
  fs.readFileSync('.changes/config.json', 'utf8')
)
const tags = Object.keys(covectorConfig.changeTags)

const missingTagsFiles = {}
const unknownTagsFiles = {}

function checkChangeFiles(changeFiles) {
  for (const file of changeFiles) {
    const content = fs.readFileSync(file, 'utf8')
    const [frontMatter] = /^---[\s\S.]*---\n/i.exec(content)
    const packages = frontMatter
      .split('\n')
      .filter((l) => !(l === '---' || !l))
      .map((l) => l.replace(/('|")/g, '').split(':'))

    for (const [package, _, tag] of packages) {
      if (!tag) {
        if (ignorePackages.includes(package)) continue

        if (!missingTagsFiles[file]) missingTagsFiles[file] = []
        missingTagsFiles[file].push(package)
      } else if (!tags.includes(tag)) {
        if (!unknownTagsFiles[file]) unknownTagsFiles[file] = []
        unknownTagsFiles[file].push({ package, tag })
      }
    }
  }
  const missingTagsEntries = Object.entries(missingTagsFiles)
  const unknownTagsEntries = Object.entries(unknownTagsFiles)
  if (missingTagsEntries.length > 0 || unknownTagsEntries.length > 0) {
    for (const [file, packages] of missingTagsEntries) {
      for (const package of packages) {
        console.error(
          `Package \`${package}\` is missing a change tag in ${file} `
        )
      }
    }

    for (const [file, packages] of unknownTagsEntries) {
      for (const { package, tag } of packages) {
        console.error(
          `Package \`${package}\` has an unknown change tag ${tag} in ${file} `
        )
      }
    }

    process.exit(1)
  }
}

const [_bin, _script, ...files] = process.argv

if (files.length > 0) {
  checkChangeFiles(
    files.filter((f) => f.toLowerCase() !== '.changes/readme.md')
  )
} else {
  const changeFiles = fs
    .readdirSync('.changes')
    .filter((f) => f.endsWith('.md') && f.toLowerCase() !== 'readme.md')
    .map((p) => path.join('.changes', p))
  checkChangeFiles(changeFiles)
}


================================================
FILE: .scripts/ci/check-license-header.js
================================================
#!/usr/bin/env node

// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT

const fs = require('fs')
const path = require('path')
const readline = require('readline')

const header = `Copyright 2019-2024 Tauri Programme within The Commons Conservancy
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: MIT`
const bundlerLicense =
  '// Copyright 2016-2019 Cargo-Bundle developers <https://github.com/burtonageo/cargo-bundle>'
const denoLicense =
  '// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.'

const extensions = ['.rs', '.js', '.ts', '.yml', '.swift', '.kt']
const ignore = [
  'target',
  'templates',
  'node_modules',
  'gen',
  'dist',
  'bundle.global.js'
]

async function checkFile(file) {
  if (
    extensions.some((e) => file.endsWith(e))
    && !ignore.some((i) => file.includes(`/${i}/`) || path.basename(file) === i)
  ) {
    const fileStream = fs.createReadStream(file)
    const rl = readline.createInterface({
      input: fileStream,
      crlfDelay: Infinity
    })

    let contents = ``
    let i = 0
    for await (let line of rl) {
      // ignore empty lines, allow shebang and bundler license
      if (
        line.length === 0
        || line.startsWith('#!')
        || line.startsWith('// swift-tools-version:')
        || line === bundlerLicense
        || line === denoLicense
      ) {
        continue
      }

      // strip comment marker
      if (line.startsWith('// ')) {
        line = line.substring(3)
      } else if (line.startsWith('# ')) {
        line = line.substring(2)
      }

      contents += line
      if (++i === 3) {
        break
      }
      contents += '\n'
    }
    if (contents !== header) {
      return true
    }
  }
  return false
}

async function check(src) {
  const missingHeader = []

  for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
    const p = path.join(src, entry.name)

    if (entry.isSymbolicLink() || ignore.includes(entry.name)) {
      continue
    }

    if (entry.isDirectory()) {
      const missing = await check(p)
      missingHeader.push(...missing)
    } else {
      const isMissing = await checkFile(p)
      if (isMissing) {
        missingHeader.push(p)
      }
    }
  }

  return missingHeader
}

const [_bin, _script, ...files] = process.argv

if (files.length > 0) {
  async function run() {
    const missing = []
    for (const f of files) {
      const isMissing = await checkFile(f)
      if (isMissing) {
        missing.push(f)
      }
    }
    if (missing.length > 0) {
      console.log(missing.join('\n'))
      process.exit(1)
    }
  }

  run()
} else {
  check('.').then((missing) => {
    if (missing.length > 0) {
      console.log(missing.join('\n'))
      process.exit(1)
    }
  })
}


================================================
FILE: .scripts/ci/has-diff.sh
================================================
#!/bin/bash

# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

git_output=$(git diff --ignore-submodules --name-only HEAD)
if [ -z "$git_output" ];
then
  echo "✔ working directory is clean"
else
  echo "✘ found diff:"
  echo "$git_output"
  exit 1
fi


================================================
FILE: .scripts/ci/pack-cli.sh
================================================
#!/bin/bash

# Copyright 2019-2024 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

set -euxo pipefail

for o in outputs/*; do
  pushd "$o"

  chmod +x cargo-tauri*
  cp ../../crates/tauri-cli/LICENSE* ../../crates/tauri-cli/README.md .

  target=$(basename "$o" | cut -d. -f1)
  if grep -qE '(apple|windows)' <<< "$target"; then
    zip "../${target}.zip" *
  else
    tar cv * | gzip -9 > "../${target}.tgz"
  fi

  popd
done


================================================
FILE: .scripts/ci/sync-cli-metadata.js
================================================
#!/usr/bin/env node

// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT

/*
This script is solely intended to be run as part of the `covector version` step to
keep the `../../crates/tauri-cli/metadata-v2.json` up to date with other version bumps. Long term
we should look to find a more "rusty way" to import / "pin" a version value in our tauri-cli
rust binaries.
*/

const { readFileSync, writeFileSync } = require('fs')
const { resolve } = require('path')

const packageNickname = process.argv[2]
const filePath = resolve(__dirname, '../../crates/tauri-cli/metadata-v2.json')
const bump = process.argv[3]
let index = null

switch (bump) {
  case 'major':
  case 'premajor':
    index = 0
    break
  case 'minor':
    index = 1
    break
  case 'patch':
    index = 2
    break
  case 'prerelease':
  case 'prepatch':
    index = 3
    break
  default:
    throw new Error('unexpected bump ' + bump)
}

const inc = (version) => {
  const v = version.split('.')
  for (let i = 0; i < v.length; i++) {
    if (i === index) {
      v[i] = String(Number(v[i]) + 1)
    } else if (i > index) {
      v[i] = 0
    }
  }
  if (bump === 'premajor') {
    const pre = JSON.parse(
      readFileSync(resolve(__dirname, '../../.changes/pre.json'), 'utf-8')
    )
    return `${v.join('.')}-${pre.tag}.0`
  }
  return v.join('.')
}

// read file into js object
const metadata = JSON.parse(readFileSync(filePath, 'utf-8'))

// set field version
let version
if (packageNickname === '@tauri-apps/cli') {
  version = inc(metadata['cli.js'].version)
  metadata['cli.js'].version = version
} else {
  version = inc(metadata[packageNickname])
  metadata[packageNickname] = version
}

writeFileSync(filePath, JSON.stringify(metadata, null, 2) + '\n')
console.log(`wrote ${version} for ${packageNickname} into metadata-v2.json`)
console.dir(metadata)


================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": [
    "rust-lang.rust-analyzer",
    "EditorConfig.EditorConfig",
    "esbenp.prettier-vscode",
    "tamasfe.even-better-toml"
  ]
}


================================================
FILE: ARCHITECTURE.md
================================================
# The Tauri Architecture

<https://tauri.app>

<https://github.com/tauri-apps/tauri>

## Introduction

Tauri is a polyglot and generic toolkit that is very composable and allows engineers to make a wide variety of applications. It is used for building applications for Desktop Computers using a combination of Rust tools and HTML rendered in a Webview. Apps built with Tauri can ship with any number of pieces of an optional JS API / Rust API so that webviews can control the system via message passing. In fact, developers can extend the default API with their own functionality and bridge the Webview and Rust-based backend easily.

Tauri apps can have custom menus and have tray-type interfaces. They can be updated, and are managed by the user's operating system as expected. They are very small, because they use the OS's webview. They do not ship a runtime, since the final binary is compiled from Rust. This makes the reversing of Tauri apps not a trivial task.

## What Tauri is NOT

- Tauri is not a lightweight kernel wrapper...instead it directly uses [WRY](#wry) and [TAO](#tao) to do the heavy-lifting in making system calls to the OS.
- Tauri is not a VM or virtualized environment...instead it is an application toolkit that allows making Webview OS applications.

## Major Components

The following section briefly describes the roles of the various parts of Tauri.

### Tauri Core [STABLE RUST]

#### [tauri](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri)

This is the major crate that holds everything together. It brings the runtimes, macros, utilities and API into one final product. It reads the `tauri.conf.json` file at compile time in order to bring in features and undertake actual configuration of the app (and even the `Cargo.toml` file in the project's folder). It handles script injection (for polyfills / prototype revision) at runtime, hosts the API for systems interaction, and even manages updating.

#### [tauri-build](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-build)

Apply the macros at build-time in order to rig some special features needed by `cargo`.

#### [tauri-codegen](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-codegen)

- Embed, hash, and compress assets, including icons for the app as well as the system-tray.
- Parse `tauri.conf.json` at compile time and generate the Config struct.

#### [tauri-macros](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-macros)

Create macros for the context, handler, and commands by leveraging the `tauri-codegen` crate.

#### [tauri-runtime](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-runtime)

This is the glue layer between tauri itself and lower level webview libraries.

#### [tauri-runtime-wry](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-runtime-wry)

This crate opens up direct systems-level interactions specifically for WRY, such as printing, monitor detection, and other windowing related tasks. `tauri-runtime` implementation for WRY.

#### [tauri-utils](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-utils)

This is common code that is reused in many places and offers useful utilities like parsing configuration files, detecting platform triples, injecting the CSP, and managing assets.

### Tauri Tooling

#### [@tauri-apps/api](https://github.com/tauri-apps/tauri/tree/dev/packages/api) [TS -> JS]

A TypeScript library that creates `cjs` and `esm` JavaScript endpoints for you to import into your Frontend framework so that the Webview can call and listen to backend activity. We also ship the pure TypeScript, because for some frameworks this is more optimal. It uses the message passing of webviews to their hosts.

#### [bundler](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-bundler) [RUST / SHELL]

The bundler is a library that builds a Tauri App for the platform triple it detects / is told. At the moment it currently supports macOS, Windows and Linux - but in the near future will support mobile platforms as well. May be used outside of Tauri projects.

#### [@tauri-apps/cli](https://github.com/tauri-apps/tauri/tree/dev/packages/cli) [JS]

It is a wrapper around [tauri-cli](https://github.com/tauri-apps/tauri/blob/dev/crates/tauri-cli) using [napi-rs](https://github.com/napi-rs/napi-rs) to produce NPM packages for each platform.

#### [tauri-cli](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-cli) [RUST]

This rust executable provides the full interface to all of the required activities for which the CLI is required. It will run on macOS, Windows, and Linux.

#### [create-tauri-app](https://github.com/tauri-apps/create-tauri-app) [JS]

This is a toolkit that will enable engineering teams to rapidly scaffold out a new tauri-apps project using the frontend framework of their choice (as long as it has been configured).

# External Crates

The Tauri-Apps organisation maintains two "upstream" crates from Tauri, namely TAO for creating and managing application windows, and WRY for interfacing with the Webview that lives within the window.

## [TAO](https://github.com/tauri-apps/tao)

Cross-platform application window creation library in Rust that supports all major platforms like Windows, macOS, Linux, iOS and Android. Written in Rust, it is a fork of [winit](https://github.com/rust-windowing/winit) that we have extended for our own needs like menu bar and system tray.

## [WRY](https://github.com/tauri-apps/wry)

WRY is a cross-platform WebView rendering library in Rust that supports all major desktop platforms like Windows, macOS, and Linux.
Tauri uses WRY as the abstract layer responsible to determine which webview is used (and how interactions are made).

# Additional tooling

## [tauri-action](https://github.com/tauri-apps/tauri-action)

This is a github workflow that builds tauri binaries for all platforms. It is not the fastest out there, but it gets the job done and is highly configurable. Even allowing you to create a (very basic) tauri app even if tauri is not setup.

## [create-pull-request](https://github.com/tauri-apps/create-pull-request)

Because this is a very risky (potentially destructive) github action, we forked it in order to have strong guarantees that the code we think is running is actually the code that is running.

## [vue-cli-plugin-tauri](https://github.com/tauri-apps/vue-cli-plugin-tauri)

This plugin allows you to very quickly install tauri in a vue-cli project.

## [tauri-vscode](https://github.com/tauri-apps/tauri-vscode)

This project enhances the VS Code interface with several nice-to-have features.

# Tauri Plugins [documentation](https://v2.tauri.app/develop/plugins/)

Generally speaking, plugins are authored by third parties (even though there may be official, supported plugins). A plugin generally does 3 things:

1. It provides rust code to do "something".
2. It provides interface glue to make it easy to integrate into an app.
3. It provides a JS API for interfacing with the rust code.

Here are several examples of Tauri Plugins:

- <https://github.com/tauri-apps/tauri-plugin-sql>
- <https://github.com/tauri-apps/tauri-plugin-stronghold>
- <https://github.com/tauri-apps/tauri-plugin-authenticator>

# Workflows

## What does the Development flow look like?

A developer must first install the prerequisite toolchains for creating a Tauri app. At the very least this will entail installing rust & cargo, and most likely also a modern version of node.js and potentially another package manager. Some platforms may also require other tooling and libraries, but this has been documented carefully in the respective platform docs.

Because of the many ways to build front-ends, we will stick with a common node.js based approach for development. (Note: Tauri does not by default ship a node.js runtime.)

The easiest way to do this is to run the following:

```
npm create tauri-app
```

Which will ask you a bunch of questions about the framework you want to install and then create everything you need in a single folder - some via the placement of template files and some through normal installation procedures of your framework.

> If you don't use this process, you will have to manually install the tauri cli, initialise tauri and manually configure the `tauri.conf.json` file.

Once everything is installed, you can run:

```
pnpm tauri dev
-or-
yarn tauri dev
-or-
npm run tauri dev
```

This will do several things:

1. start the JS Framework devserver
2. begin the long process of downloading and compiling the rust libraries
3. open an application window with devtools enabled
4. keep a long-lived console alive

If you change your HTML/CSS/TS/JS, your framework devserver should give you its best shot at instant hot module reloading and you will see the changes instantly.

If you modify your rust code or anything in the Cargo.toml, the window will close while rust recompiles. When finished it will reload.

If you need to get deeper insight into your current project, or triage requires investigation of installed components, just run:

```
pnpm tauri info
```

## What does the Release flow look like?

The release flow begins with proper configuration in the `tauri.conf.json` file. In this file, the developer can configure not only the basic behaviour of the application (like window size and decoration), they can also provide settings for signing and updating.

Depending upon the operating system that the developer (or CI) is building the application on, there will be an app built for them for that system. (Cross compilation is not currently available, however there is an official [GitHub Action](https://github.com/tauri-apps/tauri-action) that can be used to build for all platforms.)

To kick off this process, just:

```
pnpm tauri build
```

After some time, the process will end and you can see the results in the `./src-tauri/target/release` folder.

## What does the End-User flow look like?

End users will be provided with binaries in ways that are appropriate for their systems. Whether macOS, Linux, or Windows, direct download or store installations - they will be able to follow procedures for installing and removing that they are used to.

## What does the Updating flow look like?

When a new version is ready, the developer publishes the new signed artifacts to a server (that they have configured within `tauri.conf.json`).

The application can poll this server to see if there is a new release. When there is a new release, the user is prompted to update. The application update is downloaded, verified (checksum & signature), updated, closed, and restarted.

## License

Tauri itself is licensed under MIT or Apache-2.0. If you repackage it and modify any source code, it is your responsibility to verify that you are complying with all upstream licenses. Tauri is provided AS-IS with no explicit claim for suitability for any purpose.

Here you may peruse our [Software Bill of Materials](https://app.fossa.com/projects/git%2Bgithub.com%2Ftauri-apps%2Ftauri).


================================================
FILE: Cargo.toml
================================================
[workspace]
members = [
  "crates/tauri",
  "crates/tauri-runtime",
  "crates/tauri-runtime-wry",
  "crates/tauri-macros",
  "crates/tauri-utils",
  "crates/tauri-build",
  "crates/tauri-codegen",
  "crates/tauri-plugin",
  "crates/tauri-schema-generator",
  "crates/tauri-schema-worker",
  "crates/tauri-cli",
  "crates/tauri-bundler",
  "crates/tauri-macos-sign",
  "crates/tauri-driver",

  # @tauri-apps/cli rust project
  "packages/cli",

  # integration tests
  "crates/tests/restart",
  "crates/tests/acl",

  # bench
  "bench",
  "bench/tests/cpu_intensive/src-tauri",
  "bench/tests/files_transfer/src-tauri",
  "bench/tests/helloworld/src-tauri",

  # examples
  "examples/file-associations/src-tauri",
  "examples/resources/src-tauri",
  "examples/api/src-tauri",
  "examples/api/src-tauri/tauri-plugin-sample",
]
resolver = "2"

[workspace.package]
authors = ["Tauri Programme within The Commons Conservancy"]
homepage = "https://tauri.app/"
repository = "https://github.com/tauri-apps/tauri"
categories = ["gui", "web-programming"]
license = "Apache-2.0 OR MIT"
edition = "2021"
rust-version = "1.77.2"

# default to small, optimized workspace release binaries
[profile.release]
panic = "abort"
codegen-units = 1
lto = true
incremental = false
opt-level = "s"
strip = true

# profiles for tauri-cli
[profile.dev.package.miniz_oxide]
opt-level = 3

[profile.release-size-optimized]
inherits = "release"
codegen-units = 1
lto = true
incremental = false
opt-level = "s"

# Temporary patch to schemars to preserve newlines in docstrings for our reference docs schemas
# See https://github.com/GREsau/schemars/issues/120 for reference
[patch.crates-io]
schemars_derive = { git = 'https://github.com/tauri-apps/schemars.git', branch = 'feat/preserve-description-newlines' }
tauri = { path = "./crates/tauri" }
tauri-plugin = { path = "./crates/tauri-plugin" }
tauri-utils = { path = "./crates/tauri-utils" }


================================================
FILE: LICENSE.spdx
================================================
SPDXVersion: SPDX-2.1
DataLicense: CC0-1.0
PackageName: tauri
DataFormat: SPDXRef-1
PackageSupplier: Organization: The Tauri Programme in the Commons Conservancy
PackageHomePage: https://tauri.app
PackageLicenseDeclared: Apache-2.0
PackageLicenseDeclared: MIT
PackageCopyrightText: 2019-2025, The Tauri Programme in the Commons Conservancy
PackageSummary: <text>Tauri is a rust project that enables developers to make secure
and small desktop applications using a web frontend.
                </text>
PackageComment: <text>The package includes the following libraries; see
Relationship information.
                </text>
Created: 2019-05-20T09:00:00Z
PackageDownloadLocation: git://github.com/tauri-apps/tauri
PackageDownloadLocation: git+https://github.com/tauri-apps/tauri.git
PackageDownloadLocation: git+ssh://github.com/tauri-apps/tauri.git
Creator: Person: Daniel Thompson-Yvetot


================================================
FILE: LICENSE_APACHE-2.0
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS


================================================
FILE: LICENSE_MIT
================================================
MIT License

Copyright (c) 2017 - Present Tauri Apps Contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<img src=".github/splash.png" alt="Tauri" />

[![status](https://img.shields.io/badge/status-stable-blue.svg)](https://github.com/tauri-apps/tauri/tree/dev)
[![License](https://img.shields.io/badge/License-MIT%20or%20Apache%202-green.svg)](https://opencollective.com/tauri)
[![test core](https://img.shields.io/github/actions/workflow/status/tauri-apps/tauri/test-core.yml?label=test%20core&logo=github)](https://github.com/tauri-apps/tauri/actions/workflows/test-core.yml)
[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Ftauri-apps%2Ftauri.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Ftauri-apps%2Ftauri?ref=badge_shield)
[![Chat Server](https://img.shields.io/badge/chat-discord-7289da.svg)](https://discord.com/invite/tauri)
[![website](https://img.shields.io/badge/website-tauri.app-purple.svg)](https://tauri.app)
[![https://good-labs.github.io/greater-good-affirmation/assets/images/badge.svg](https://good-labs.github.io/greater-good-affirmation/assets/images/badge.svg)](https://good-labs.github.io/greater-good-affirmation)
[![support](https://img.shields.io/badge/sponsor-Open%20Collective-blue.svg)](https://opencollective.com/tauri)

## Introduction

Tauri is a framework for building tiny, blazingly fast binaries for all major desktop platforms. Developers can integrate any front-end framework that compiles to HTML, JS and CSS for building their user interface. The backend of the application is a rust-sourced binary with an API that the front-end can interact with.

The user interface in Tauri apps currently leverages [`tao`](https://docs.rs/tao) as a window handling library on macOS, Windows, Linux, Android and iOS. To render your application, Tauri uses [WRY](https://github.com/tauri-apps/wry), a library which provides a unified interface to the system webview, leveraging WKWebView on macOS & iOS, WebView2 on Windows, WebKitGTK on Linux and Android System WebView on Android.

To learn more about the details of how all of these pieces fit together, please consult this [ARCHITECTURE.md](https://github.com/tauri-apps/tauri/blob/dev/ARCHITECTURE.md) document.

## Getting Started

If you are interested in making a tauri app, please visit the [documentation website](https://tauri.app).

The quickest way to get started is to install the [prerequisites](https://v2.tauri.app/start/prerequisites/) for your system and create a new project with [`create-tauri-app`](https://github.com/tauri-apps/create-tauri-app/#usage). For example with `npm`:

```sh
npm create tauri-app@latest
```

## Features

The list of Tauri's features includes, but is not limited to:

- Built-in app bundler to create app bundles in formats like `.app`, `.dmg`, `.deb`, `.rpm`, `.AppImage` and Windows installers like `.exe` (via NSIS) and `.msi` (via WiX).
- Built-in self updater (desktop only)
- System tray icons
- Native notifications
- Native WebView Protocol (tauri doesn't create a localhost http(s) server to serve the WebView contents)
- GitHub action for streamlined CI
- VS Code extension

### Platforms

Tauri currently supports development and distribution on the following platforms:

| Platform   | Versions                                                                                                        |
| :--------- | :-------------------------------------------------------------------------------------------------------------- |
| Windows    | 7 and above                                                                                                     |
| macOS      | 10.15 and above                                                                                                 |
| Linux      | webkit2gtk 4.0 for Tauri v1 (for example Ubuntu 18.04). webkit2gtk 4.1 for Tauri v2 (for example Ubuntu 22.04). |
| iOS/iPadOS | 9 and above                                                                                                     |
| Android    | 7 and above (currently 8 and above)                                                                             |

## Contributing

Before you start working on something, it's best to check if there is an existing issue first. It's also a good idea to stop by the Discord server and confirm with the team if it makes sense or if someone else is already working on it.

Please make sure to read the [Contributing Guide](./.github/CONTRIBUTING.md) before making a pull request.

Thank you to everyone contributing to Tauri!

### Documentation

Documentation in a polyglot system is a tricky proposition. To this end, we prefer to use inline documentation in the Rust & JS source code as much as possible. Check out the hosting repository for the documentation site for further information: <https://github.com/tauri-apps/tauri-docs>

## Partners

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
        <a href="https://crabnebula.dev" target="_blank">
          <img src=".github/sponsors/crabnebula.svg" alt="CrabNebula" width="283">
        </a>
      </td>
    </tr>
  </tbody>
</table>

For the complete list of sponsors please visit our [website](https://tauri.app#sponsors) and [Open Collective](https://opencollective.com/tauri).

## Organization

Tauri aims to be a sustainable collective based on principles that guide sustainable free and open software communities. To this end it has become a Programme within the [Commons Conservancy](https://commonsconservancy.org/), and you can contribute financially via [Open Collective](https://opencollective.com/tauri).

## Licenses

Code: (c) 2015 - Present - The Tauri Programme within The Commons Conservancy.

MIT or MIT/Apache 2.0 where applicable.

Logo: CC-BY-NC-ND

- Original Tauri Logo Designs by [Alve Larsson](https://alve.io/), [Daniel Thompson-Yvetot](https://github.com/nothingismagick) and [Guillaume Chau](https://github.com/akryum)

[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Ftauri-apps%2Ftauri.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Ftauri-apps%2Ftauri?ref=badge_large)


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

| Version | Supported          |
| ------- | ------------------ |
| > 1.0   | :white_check_mark: |
| < 1.0   | :x:                |

## Reporting a Vulnerability

If you have found a potential security threat, vulnerability or exploit in Tauri
or one of its upstream dependencies, please DON'T create a pull-request, DON'T
file an issue on GitHub, DON'T mention it on Discord and DON'T create a forum thread.

Please submit your report via the GitHub Private Vulnerability Disclosure functionality.

Find out more about the reporting process [here](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability).

Our team will triage your report and keep you informed about the progress.
We may ask questions or request further guidance on reproduction of the vulnerability in the comments of the advisory, which will be publicized.

Additionally, we may ask you to independently verify our patch, which will be available in the private advisory branch. Please do not publish your vulnerability during the process or before coordinated public disclosure from our side. We try to adhere to common standards of publication within 90-Days of disclosure.

Depending on your decision to accept or deny credit for the vulnerability, you will be publicly attributed to the vulnerability and may be mentioned in our announcements.

At the current time we do not have the financial ability to reward bounties,
but in extreme cases will at our discretion consider a reward.


================================================
FILE: bench/Cargo.toml
================================================
[package]
name = "tauri_bench"
version = "0.1.0"
authors = ["Tauri Programme within The Commons Conservancy"]
edition = "2021"
rust-version = "1.77.2"
license = "Apache-2.0 OR MIT"
description = "Cross-platform WebView rendering library"
repository = "https://github.com/tauri-apps/wry"

[dependencies]
anyhow = "1"
time = { version = "0.3", features = ["formatting"] }
tempfile = "3"
serde_json = "1"
serde = { version = "1", features = ["derive"] }

[[bin]]
name = "run_benchmark"
path = "src/run_benchmark.rs"

[[bin]]
name = "build_benchmark_jsons"
path = "src/build_benchmark_jsons.rs"


================================================
FILE: bench/README.md
================================================
# Tauri Bench

 <img align="right" src="https://github.com/tauri-apps/tauri/raw/dev/.github/icon.png" height="128" width="128">

[![status](https://img.shields.io/badge/Status-beta-green.svg)](https://github.com/tauri-apps/tauri)
[![License](https://img.shields.io/badge/License-MIT%20or%20Apache%202-green.svg)](https://opencollective.com/tauri)
[![test core](https://img.shields.io/github/actions/workflow/status/tauri-apps/tauri/test-core.yml?label=test%20core&logo=github)](https://github.com/tauri-apps/tauri/actions/workflows/test-core.yml)
[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Ftauri-apps%2Ftauri.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Ftauri-apps%2Ftauri?ref=badge_shield)
[![Chat Server](https://img.shields.io/badge/chat-discord-7289da.svg)](https://discord.gg/SpmNs4S)
[![website](https://img.shields.io/badge/website-tauri.app-purple.svg)](https://tauri.app)
[![https://good-labs.github.io/greater-good-affirmation/assets/images/badge.svg](https://good-labs.github.io/greater-good-affirmation/assets/images/badge.svg)](https://good-labs.github.io/greater-good-affirmation)
[![support](https://img.shields.io/badge/sponsor-Open%20Collective-blue.svg)](https://opencollective.com/tauri)

## About Tauri

Tauri is a polyglot and generic system that is very composable and allows engineers to make a wide variety of applications. It is used for building applications for Desktop Computers using a combination of Rust tools and HTML rendered in a Webview. Apps built with Tauri can ship with any number of pieces of an optional JS API / Rust API so that webviews can control the system via message passing. In fact, developers can extend the default API with their own functionality and bridge the Webview and Rust-based backend easily.

Tauri apps can have custom menus and have tray-type interfaces. They can be updated, and are managed by the user's operating system as expected. They are very small, because they use the system's webview. They do not ship a runtime, since the final binary is compiled from rust. This makes the reversing of Tauri apps not a trivial task.

## This module

This rust module run on CI, provides internal metrics results of Tauri. To learn more see [benchmark_results](https://github.com/tauri-apps/benchmark_results) repository.

**\*_Internal use only_**

## Semver

**tauri** is following [Semantic Versioning 2.0](https://semver.org/).

## Licenses

Code: (c) 2015 - 2021 - The Tauri Programme within The Commons Conservancy.

MIT or MIT/Apache 2.0 where applicable.

Logo: CC-BY-NC-ND

- Original Tauri Logo Designs by [Daniel Thompson-Yvetot](https://github.com/nothingismagick) and [Guillaume Chau](https://github.com/akryum)


================================================
FILE: bench/src/build_benchmark_jsons.rs
================================================
// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT

//! This Rust binary runs on CI and provides internal metrics results of Tauri. To learn more see [benchmark_results](https://github.com/tauri-apps/benchmark_results) repository.
//!
//! ***_Internal use only_**

#![doc(
  html_logo_url = "https://github.com/tauri-apps/tauri/raw/dev/.github/icon.png",
  html_favicon_url = "https://github.com/tauri-apps/tauri/raw/dev/.github/icon.png"
)]
// file is used by multiple binaries
#![allow(dead_code)]

use std::{fs::File, io::BufReader};
mod utils;

fn main() {
  let tauri_data = &utils::tauri_root_path()
    .join("gh-pages")
    .join("tauri-data.json");
  let tauri_recent = &utils::tauri_root_path()
    .join("gh-pages")
    .join("tauri-recent.json");

  // current data
  let current_data_buffer = BufReader::new(
    File::open(utils::target_dir().join("bench.json")).expect("Unable to read current data file"),
  );
  let current_data: utils::BenchResult =
    serde_json::from_reader(current_data_buffer).expect("Unable to read current data buffer");

  // all data's
  let all_data_buffer =
    BufReader::new(File::open(tauri_data).expect("Unable to read all data file"));
  let mut all_data: Vec<utils::BenchResult> =
    serde_json::from_reader(all_data_buffer).expect("Unable to read all data buffer");

  // add current data to all data
  all_data.push(current_data);

  // use only latest 20 elements from all data
  let recent: Vec<utils::BenchResult> = if all_data.len() > 20 {
    all_data[all_data.len() - 20..].to_vec()
  } else {
    all_data.clone()
  };

  // write json's
  utils::write_json(
    tauri_data
      .to_str()
      .expect("Something wrong with tauri_data"),
    &serde_json::to_value(all_data).expect("Unable to build final json (all)"),
  )
  .unwrap_or_else(|_| panic!("Unable to write {tauri_data:?}"));

  utils::write_json(
    tauri_recent
      .to_str()
      .expect("Something wrong with tauri_recent"),
    &serde_json::to_value(recent).expect("Unable to build final json (recent)"),
  )
  .unwrap_or_else(|_| panic!("Unable to write {tauri_recent:?}"));
}


================================================
FILE: bench/src/run_benchmark.rs
================================================
// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT

//! This Rust binary runs on CI and provides internal metrics results of Tauri.
//! To learn more see [benchmark_results](https://github.com/tauri-apps/benchmark_results) repository.
//!
//! ***_Internal use only_***

#![doc(
  html_logo_url = "https://github.com/tauri-apps/tauri/raw/dev/.github/icon.png",
  html_favicon_url = "https://github.com/tauri-apps/tauri/raw/dev/.github/icon.png"
)]

use anyhow::{Context, Result};
use std::{
  collections::{HashMap, HashSet},
  env,
  path::Path,
  process::{Command, Stdio},
};

mod utils;

/// The list of examples for benchmarks
fn get_all_benchmarks(target: &str) -> Vec<(String, String)> {
  vec![
    (
      "tauri_hello_world".into(),
      format!("../target/{target}/release/bench_helloworld"),
    ),
    (
      "tauri_cpu_intensive".into(),
      format!("../target/{target}/release/bench_cpu_intensive"),
    ),
    (
      "tauri_3mb_transfer".into(),
      format!("../target/{target}/release/bench_files_transfer"),
    ),
  ]
}

fn run_strace_benchmarks(new_data: &mut utils::BenchResult, target: &str) -> Result<()> {
  use std::io::Read;

  let mut thread_count = HashMap::<String, u64>::new();
  let mut syscall_count = HashMap::<String, u64>::new();

  for (name, example_exe) in get_all_benchmarks(target) {
    let mut file = tempfile::NamedTempFile::new()
      .context("failed to create temporary file for strace output")?;

    let exe_path = utils::bench_root_path().join(&example_exe);
    let exe_path_str = exe_path
      .to_str()
      .context("executable path contains invalid UTF-8")?;
    let temp_path_str = file
      .path()
      .to_str()
      .context("temporary file path contains invalid UTF-8")?;

    Command::new("strace")
      .args(["-c", "-f", "-o", temp_path_str, exe_path_str])
      .stdout(Stdio::inherit())
      .spawn()
      .context("failed to spawn strace process")?
      .wait()
      .context("failed to wait for strace process")?;

    let mut output = String::new();
    file
      .as_file_mut()
      .read_to_string(&mut output)
      .context("failed to read strace output")?;

    let strace_result = utils::parse_strace_output(&output);
    // Count clone/clone3 syscalls as thread creation indicators
    let clone_calls = strace_result.get("clone").map(|d| d.calls).unwrap_or(0)
      + strace_result.get("clone3").map(|d| d.calls).unwrap_or(0);

    if let Some(total) = strace_result.get("total") {
      thread_count.insert(name.clone(), clone_calls);
      syscall_count.insert(name, total.calls);
    }
  }

  new_data.thread_count = thread_count;
  new_data.syscall_count = syscall_count;

  Ok(())
}

fn run_max_mem_benchmark(target: &str) -> Result<HashMap<String, u64>> {
  let mut results = HashMap::<String, u64>::new();

  for (name, example_exe) in get_all_benchmarks(target) {
    let benchmark_file = utils::target_dir().join(format!("mprof{name}_.dat"));
    let benchmark_file_str = benchmark_file
      .to_str()
      .context("benchmark file path contains invalid UTF-8")?;

    let exe_path = utils::bench_root_path().join(&example_exe);
    let exe_path_str = exe_path
      .to_str()
      .context("executable path contains invalid UTF-8")?;

    let proc = Command::new("mprof")
      .args(["run", "-C", "-o", benchmark_file_str, exe_path_str])
      .stdout(Stdio::null())
      .stderr(Stdio::piped())
      .spawn()
      .with_context(|| format!("failed to spawn mprof for benchmark {name}"))?;

    let proc_result = proc
      .wait_with_output()
      .with_context(|| format!("failed to wait for mprof {name}"))?;

    if !proc_result.status.success() {
      eprintln!(
        "mprof failed for {name}: {}",
        String::from_utf8_lossy(&proc_result.stderr)
      );
    }

    if let Some(mem) = utils::parse_max_mem(benchmark_file_str)
      .with_context(|| format!("failed to parse mprof data for {name}"))?
    {
      results.insert(name, mem);
    }

    // Clean up the temporary file
    if let Err(e) = std::fs::remove_file(&benchmark_file) {
      eprintln!("Warning: failed to remove temporary file {benchmark_file_str}: {e}");
    }
  }

  Ok(results)
}

fn rlib_size(target_dir: &Path, prefix: &str) -> Result<u64> {
  let mut size = 0;
  let mut seen = HashSet::new();

  let deps_dir = target_dir.join("deps");
  for entry in std::fs::read_dir(&deps_dir).with_context(|| {
    format!(
      "failed to read target deps directory: {}",
      deps_dir.display()
    )
  })? {
    let entry = entry.context("failed to read directory entry")?;
    let name = entry.file_name().to_string_lossy().to_string();

    if name.starts_with(prefix) && name.ends_with(".rlib") {
      if let Some(start) = name.split('-').next() {
        if seen.insert(start.to_string()) {
          size += entry
            .metadata()
            .context("failed to read file metadata")?
            .len();
        }
      }
    }
  }

  if size == 0 {
    anyhow::bail!(
      "no rlib files found for prefix {prefix} in {}",
      deps_dir.display()
    );
  }

  Ok(size)
}

fn get_binary_sizes(target_dir: &Path, target: &str) -> Result<HashMap<String, u64>> {
  let mut sizes = HashMap::<String, u64>::new();

  let wry_size = rlib_size(target_dir, "libwry")?;
  sizes.insert("wry_rlib".to_string(), wry_size);

  for (name, example_exe) in get_all_benchmarks(target) {
    let exe_path = utils::bench_root_path().join(&example_exe);
    let meta = std::fs::metadata(&exe_path)
      .with_context(|| format!("failed to read metadata for {}", exe_path.display()))?;
    sizes.insert(name, meta.len());
  }

  Ok(sizes)
}

/// (target OS, target triple)
const TARGETS: &[(&str, &[&str])] = &[
  (
    "Windows",
    &[
      "x86_64-pc-windows-gnu",
      "i686-pc-windows-gnu",
      "i686-pc-windows-msvc",
      "x86_64-pc-windows-msvc",
    ],
  ),
  (
    "Linux",
    &[
      "x86_64-unknown-linux-gnu",
      "i686-unknown-linux-gnu",
      "aarch64-unknown-linux-gnu",
    ],
  ),
  ("macOS", &["x86_64-apple-darwin", "aarch64-apple-darwin"]),
];

fn cargo_deps() -> HashMap<String, usize> {
  let mut results = HashMap::new();
  for (os, targets) in TARGETS {
    for target in *targets {
      let mut cmd = Command::new("cargo");
      cmd.arg("tree");
      cmd.arg("--no-dedupe");
      cmd.args(["--edges", "normal"]);
      cmd.args(["--prefix", "none"]);
      cmd.args(["--target", target]);
      cmd.current_dir(utils::tauri_root_path());

      match cmd.output() {
        Ok(output) if output.status.success() => {
          let full_deps = String::from_utf8_lossy(&output.stdout);
          let count = full_deps
            .lines()
            .collect::<HashSet<_>>()
            .len()
            .saturating_sub(1); // output includes wry itself

          // set the count to the highest count seen for this OS
          let existing = results.entry(os.to_string()).or_default();
          *existing = count.max(*existing);

          if count <= 10 {
            eprintln!("Warning: dependency count for {target} seems low: {count}");
          }
        }
        Ok(output) => {
          eprintln!(
            "cargo tree failed for {target}: {}",
            String::from_utf8_lossy(&output.stderr)
          );
        }
        Err(e) => {
          eprintln!("Failed to run cargo tree for {target}: {e}");
        }
      }
    }
  }
  results
}

const RESULT_KEYS: &[&str] = &["mean", "stddev", "user", "system", "min", "max"];

fn run_exec_time(target: &str) -> Result<HashMap<String, HashMap<String, f64>>> {
  let target_dir = utils::target_dir();
  let benchmark_file = target_dir.join("hyperfine_results.json");
  let benchmark_file_str = benchmark_file
    .to_str()
    .context("benchmark file path contains invalid UTF-8")?;

  let mut command = vec![
    "hyperfine",
    "--export-json",
    benchmark_file_str,
    "--show-output",
    "--warmup",
    "3",
  ];

  let benchmarks = get_all_benchmarks(target);
  let mut benchmark_paths = Vec::new();

  for (_, example_exe) in &benchmarks {
    let exe_path = utils::bench_root_path().join(example_exe);
    let exe_path_str = exe_path
      .to_str()
      .context("executable path contains invalid UTF-8")?;
    benchmark_paths.push(exe_path_str.to_string());
  }

  for path in &benchmark_paths {
    command.push(path.as_str());
  }

  utils::run(&command)?;

  let mut results = HashMap::<String, HashMap<String, f64>>::new();
  let hyperfine_results = utils::read_json(benchmark_file_str)?;

  if let Some(results_array) = hyperfine_results
    .as_object()
    .and_then(|obj| obj.get("results"))
    .and_then(|val| val.as_array())
  {
    for ((name, _), data) in benchmarks.iter().zip(results_array.iter()) {
      if let Some(data_obj) = data.as_object() {
        let filtered_data: HashMap<String, f64> = data_obj
          .iter()
          .filter(|(key, _)| RESULT_KEYS.contains(&key.as_str()))
          .filter_map(|(key, val)| val.as_f64().map(|v| (key.clone(), v)))
          .collect();

        results.insert(name.clone(), filtered_data);
      }
    }
  }

  Ok(results)
}

fn main() -> Result<()> {
  let json_3mb = utils::home_path().join(".tauri_3mb.json");

  if !json_3mb.exists() {
    println!("Downloading test data...");
    utils::download_file(
      "https://github.com/lemarier/tauri-test/releases/download/v2.0.0/json_3mb.json",
      json_3mb,
    )
    .context("failed to download test data")?;
  }

  println!("Starting tauri benchmark");

  let target_dir = utils::target_dir();
  let target = utils::get_target();

  env::set_current_dir(utils::bench_root_path())
    .context("failed to set working directory to bench root")?;

  let now = std::time::SystemTime::now()
    .duration_since(std::time::UNIX_EPOCH)
    .context("failed to get current time")?;
  let timestamp = format!("{}", now.as_secs());

  println!("Running execution time benchmarks...");
  let exec_time = run_exec_time(target)?;

  println!("Getting binary sizes...");
  let binary_size = get_binary_sizes(&target_dir, target)?;

  println!("Analyzing cargo dependencies...");
  let cargo_deps = cargo_deps();

  let mut new_data = utils::BenchResult {
    created_at: timestamp,
    sha1: {
      let output = utils::run_collect(&["git", "rev-parse", "HEAD"])?;
      output.0.trim().to_string()
    },
    exec_time,
    binary_size,
    cargo_deps,
    ..Default::default()
  };

  if cfg!(target_os = "linux") {
    println!("Running Linux-specific benchmarks...");
    run_strace_benchmarks(&mut new_data, target)?;
    new_data.max_memory = run_max_mem_benchmark(target)?;
  }

  println!("===== <BENCHMARK RESULTS>");
  serde_json::to_writer_pretty(std::io::stdout(), &new_data)
    .context("failed to serialize benchmark results")?;
  println!("\n===== </BENCHMARK RESULTS>");

  let bench_file = target_dir.join("bench.json");
  if let Some(filename) = bench_file.to_str() {
    utils::write_json(filename, &serde_json::to_value(&new_data)?)
      .context("failed to write benchmark results to file")?;
    println!("Results written to: {filename}");
  } else {
    eprintln!("Cannot write bench.json, path contains invalid UTF-8");
  }

  Ok(())
}


================================================
FILE: bench/src/utils.rs
================================================
// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT

//! Utility functions for benchmarking tasks in the Tauri project.
//!
//! This module provides helpers for:
//! - Paths to project directories and targets
//! - Running and collecting process outputs
//! - Parsing memory profiler (`mprof`) and syscall profiler (`strace`) outputs
//! - JSON read/write utilities
//! - File download utilities (via `curl` or file copy)

use anyhow::{bail, Context, Result};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::{
  collections::HashMap,
  fs,
  io::{BufRead, BufReader},
  path::PathBuf,
  process::{Command, Output, Stdio},
};

/// Holds the results of a benchmark run.
#[derive(Default, Clone, Serialize, Deserialize, Debug)]
pub struct BenchResult {
  pub created_at: String,
  pub sha1: String,
  pub exec_time: HashMap<String, HashMap<String, f64>>,
  pub binary_size: HashMap<String, u64>,
  pub max_memory: HashMap<String, u64>,
  pub thread_count: HashMap<String, u64>,
  pub syscall_count: HashMap<String, u64>,
  pub cargo_deps: HashMap<String, usize>,
}

/// Represents a single line of parsed `strace` output.
#[derive(Debug, Clone, Serialize)]
pub struct StraceOutput {
  pub percent_time: f64,
  pub seconds: f64,
  pub usecs_per_call: Option<u64>,
  pub calls: u64,
  pub errors: u64,
}

/// Get the compilation target triple for the current platform.
pub fn get_target() -> &'static str {
  #[cfg(target_os = "macos")]
  return if cfg!(target_arch = "aarch64") {
    "aarch64-apple-darwin"
  } else {
    "x86_64-apple-darwin"
  };

  #[cfg(target_os = "ios")]
  return if cfg!(target_arch = "aarch64") {
    "aarch64-apple-ios"
  } else {
    "x86_64-apple-ios"
  };

  #[cfg(target_os = "linux")]
  return "x86_64-unknown-linux-gnu";

  #[cfg(target_os = "windows")]
  unimplemented!("Windows target not implemented yet");
}

/// Get the `target/release` directory path for benchmarks.
pub fn target_dir() -> PathBuf {
  bench_root_path()
    .join("..")
    .join("target")
    .join(get_target())
    .join("release")
}

/// Get the root path of the current benchmark crate.
pub fn bench_root_path() -> PathBuf {
  PathBuf::from(env!("CARGO_MANIFEST_DIR"))
}

/// Get the home directory of the current user.
pub fn home_path() -> PathBuf {
  #[cfg(any(target_os = "macos", target_os = "ios", target_os = "linux"))]
  {
    PathBuf::from(std::env::var("HOME").unwrap_or_default())
  }

  #[cfg(target_os = "windows")]
  {
    PathBuf::from(std::env::var("USERPROFILE").unwrap_or_default())
  }
}

/// Get the root path of the Tauri repository.
pub fn tauri_root_path() -> PathBuf {
  bench_root_path().parent().map(|p| p.to_path_buf()).unwrap()
}

/// Run a command and collect its stdout and stderr as strings.
/// Returns an error if the command fails or exits with a non-zero status.
pub fn run_collect(cmd: &[&str]) -> Result<(String, String)> {
  let output: Output = Command::new(cmd[0])
    .args(&cmd[1..])
    .stdin(Stdio::piped())
    .stdout(Stdio::piped())
    .stderr(Stdio::piped())
    .output()
    .with_context(|| format!("failed to execute command: {cmd:?}"))?;

  if !output.status.success() {
    bail!(
      "Command {:?} exited with {:?}\nstdout:\n{}\nstderr:\n{}",
      cmd,
      output.status.code(),
      String::from_utf8_lossy(&output.stdout),
      String::from_utf8_lossy(&output.stderr)
    );
  }

  Ok((
    String::from_utf8_lossy(&output.stdout).to_string(),
    String::from_utf8_lossy(&output.stderr).to_string(),
  ))
}

/// Parse a memory profiler (`mprof`) output file and return the maximum
/// memory usage in bytes. Returns `None` if no values are found.
pub fn parse_max_mem(file_path: &str) -> Result<Option<u64>> {
  let file = fs::File::open(file_path)
    .with_context(|| format!("failed to open mprof output file {file_path}"))?;
  let output = BufReader::new(file);

  let mut highest: u64 = 0;

  for line in output.lines().map_while(Result::ok) {
    let split: Vec<&str> = line.split(' ').collect();
    if split.len() == 3 {
      if let Ok(mb) = split[1].parse::<f64>() {
        let current_bytes = (mb * 1024.0 * 1024.0) as u64;
        highest = highest.max(current_bytes);
      }
    }
  }

  // Best-effort cleanup
  let _ = fs::remove_file(file_path);

  Ok(if highest > 0 { Some(highest) } else { None })
}

/// Parse the output of `strace -c` and return a summary of syscalls.
pub fn parse_strace_output(output: &str) -> HashMap<String, StraceOutput> {
  let mut summary = HashMap::new();

  let mut lines = output
    .lines()
    .filter(|line| !line.is_empty() && !line.contains("detached ..."));

  let count = lines.clone().count();
  if count < 4 {
    return summary;
  }

  let total_line = lines.next_back().unwrap();
  lines.next_back(); // Drop separator
  let data_lines = lines.skip(2);

  for line in data_lines {
    let syscall_fields: Vec<&str> = line.split_whitespace().collect();
    let len = syscall_fields.len();

    if let Some(&syscall_name) = syscall_fields.last() {
      if (5..=6).contains(&len) {
        let output = StraceOutput {
          percent_time: syscall_fields[0].parse().unwrap_or(0.0),
          seconds: syscall_fields[1].parse().unwrap_or(0.0),
          usecs_per_call: syscall_fields[2].parse().ok(),
          calls: syscall_fields[3].parse().unwrap_or(0),
          errors: if len < 6 {
            0
          } else {
            syscall_fields[4].parse().unwrap_or(0)
          },
        };
        summary.insert(syscall_name.to_string(), output);
      }
    }
  }

  let total_fields: Vec<&str> = total_line.split_whitespace().collect();
  let total = match total_fields.len() {
    5 => StraceOutput {
      percent_time: total_fields[0].parse().unwrap_or(0.0),
      seconds: total_fields[1].parse().unwrap_or(0.0),
      usecs_per_call: None,
      calls: total_fields[2].parse().unwrap_or(0),
      errors: total_fields[3].parse().unwrap_or(0),
    },
    6 => StraceOutput {
      percent_time: total_fields[0].parse().unwrap_or(0.0),
      seconds: total_fields[1].parse().unwrap_or(0.0),
      usecs_per_call: total_fields[2].parse().ok(),
      calls: total_fields[3].parse().unwrap_or(0),
      errors: total_fields[4].parse().unwrap_or(0),
    },
    _ => {
      panic!("Unexpected total field count: {}", total_fields.len());
    }
  };

  summary.insert("total".to_string(), total);
  summary
}

/// Run a command and wait for completion.
/// Returns an error if the command fails.
pub fn run(cmd: &[&str]) -> Result<()> {
  let status = Command::new(cmd[0])
    .args(&cmd[1..])
    .stdin(Stdio::piped())
    .status()
    .with_context(|| format!("failed to execute command: {cmd:?}"))?;

  if !status.success() {
    bail!("Command {:?} exited with {:?}", cmd, status.code());
  }
  Ok(())
}

/// Read a JSON file into a [`serde_json::Value`].
pub fn read_json(filename: &str) -> Result<Value> {
  let f =
    fs::File::open(filename).with_context(|| format!("failed to open JSON file {filename}"))?;
  Ok(serde_json::from_reader(f)?)
}

/// Write a [`serde_json::Value`] into a JSON file.
pub fn write_json(filename: &str, value: &Value) -> Result<()> {
  let f =
    fs::File::create(filename).with_context(|| format!("failed to create JSON file {filename}"))?;
  serde_json::to_writer(f, value)?;
  Ok(())
}

/// Download a file from either a local path or an HTTP/HTTPS URL.
/// Falls back to copying the file if the URL does not start with http/https.
pub fn download_file(url: &str, filename: PathBuf) -> Result<()> {
  if !url.starts_with("http:") && !url.starts_with("https:") {
    fs::copy(url, &filename).with_context(|| format!("failed to copy from {url}"))?;
    return Ok(());
  }

  println!("Downloading {url}");
  let status = Command::new("curl")
    .arg("-L")
    .arg("-s")
    .arg("-o")
    .arg(&filename)
    .arg(url)
    .status()
    .with_context(|| format!("failed to execute curl for {url}"))?;

  if !status.success() {
    bail!("curl failed with exit code {:?}", status.code());
  }
  if !filename.exists() {
    bail!("expected file {:?} to exist after download", filename);
  }

  Ok(())
}


================================================
FILE: bench/tests/cpu_intensive/public/index.css
================================================
body {
  font-family:
    -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial,
    sans-serif;
  margin: auto;
  max-width: 38rem;
  padding: 2rem;
}


================================================
FILE: bench/tests/cpu_intensive/public/index.html
================================================
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Hello World!</title>
    <link rel="stylesheet" href="index.css" />
  </head>
  <body>
    <h1>Calculate prime numbers</h1>
    <p></p>
    <button type="button" id="start">Start</button>
    <p id="status"></p>
    <p id="results"></p>
    <script src="site.js"></script>
  </body>
</html>


================================================
FILE: bench/tests/cpu_intensive/public/site.js
================================================
// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT

// Create web worker
const THRESHOLD = 10000000
const worker = new Worker('worker.js')
/** @type {HTMLButtonElement} */
const start = document.getElementById('start')
/** @type {HTMLParagraphElement} */
const status = document.getElementById('status')
const results = document.getElementById('results')

const ITERATIONS = 1

let resolver

const onMessage = (message) => {
  // Update the UI
  let prefix = '[Calculating]'

  if (message.data.status === 'done') {
    // tell tauri that we are done
    window.__TAURI__.core.invoke('app_completed_successfully')
  }

  status.innerHTML = `${prefix} Found <code>${message.data.count}</code> prime numbers in <code>${message.data.time}ms</code>`

  if (message.data.status === 'done') {
    resolver(message.data.time)
  }
}

worker.addEventListener('message', onMessage)

const benchmark = () => {
  return new Promise((resolve) => {
    const startTime = Date.now()
    resolver = resolve
    worker.postMessage({ value: THRESHOLD, startTime })
  })
}

const calculate = async () => {
  let total = 0

  for (let i = 0; i < ITERATIONS; i++) {
    const result = await benchmark()
    total += result
  }

  const average = total / ITERATIONS

  results.innerText = `Average time: ${average}ms`
}

window.addEventListener('DOMContentLoaded', calculate)


================================================
FILE: bench/tests/cpu_intensive/public/worker.js
================================================
// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT

const isPrime = (number) => {
  if (number % 2 === 0 && number > 2) {
    return false
  }

  let start = 2
  const limit = Math.sqrt(number)
  while (start <= limit) {
    if (number % start++ < 1) {
      return false
    }
  }
  return number > 1
}

addEventListener('message', (e) => {
  const { startTime } = e.data

  let n = 0
  let total = 0
  const THRESHOLD = e.data.value
  const primes = []

  let previous = startTime

  while (++n <= THRESHOLD) {
    if (isPrime(n)) {
      primes.push(n)
      total++

      const now = Date.now()

      if (now - previous > 250) {
        previous = now
        postMessage({
          status: 'calculating',
          count: total,
          time: Date.now() - startTime
        })
      }
    }
  }

  postMessage({ status: 'done', count: total, time: Date.now() - startTime })
})


================================================
FILE: bench/tests/cpu_intensive/src-tauri/.gitignore
================================================
# Generated by Cargo
# will have compiled files and executables
/target/


================================================
FILE: bench/tests/cpu_intensive/src-tauri/Cargo.toml
================================================
[package]
name = "bench_cpu_intensive"
version = "0.1.0"
description = "A very simple Tauri Application"
edition = "2021"
rust-version = "1.77.2"

[build-dependencies]
tauri-build = { path = "../../../../crates/tauri-build", features = [
  "codegen",
] }

[dependencies]
serde_json = "1"
serde = { version = "1", features = ["derive"] }
tauri =
Download .txt
gitextract_bd3gcnsk/

├── .cargo/
│   ├── audit.toml
│   └── config.toml
├── .changes/
│   ├── README.md
│   ├── base64.md
│   ├── config.json
│   ├── data-tauri-drag-region-deep.md
│   ├── fix-build-bundles-arg.md
│   ├── linux-deploy-link.md
│   ├── prompt-signing-key-password-context.md
│   └── toml-ver.md
├── .devcontainer/
│   ├── Dockerfile
│   ├── README.md
│   └── devcontainer.json
├── .docker/
│   └── cross/
│       ├── aarch64.Dockerfile
│       ├── cmake.sh
│       ├── common.sh
│       ├── deny-debian-packages.sh
│       ├── dropbear.sh
│       ├── lib.sh
│       ├── linux-image.sh
│       ├── linux-runner
│       ├── qemu.sh
│       └── xargo.sh
├── .editorconfig
├── .github/
│   ├── CODEOWNERS
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── docs_report.md
│   │   └── feature_request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── RELEASING.md
│   └── workflows/
│       ├── audit.yml
│       ├── bench.yml
│       ├── check-change-tags.yml
│       ├── check-generated-files.yml
│       ├── check-license-header.yml
│       ├── covector-comment-on-fork.yml
│       ├── covector-status.yml
│       ├── covector-version-or-publish.yml
│       ├── deploy-schema-worker.yml
│       ├── docker.yml
│       ├── fmt.yml
│       ├── lint-js.yml
│       ├── lint-rust.yml
│       ├── publish-cli-js.yml
│       ├── publish-cli-rs.yml
│       ├── supply-chain.yml
│       ├── test-android.yml
│       ├── test-cli-js.yml
│       ├── test-cli-rs.yml
│       ├── test-core.yml
│       └── udeps.yml
├── .gitignore
├── .prettierignore
├── .prettierrc
├── .scripts/
│   └── ci/
│       ├── check-change-tags.js
│       ├── check-license-header.js
│       ├── has-diff.sh
│       ├── pack-cli.sh
│       └── sync-cli-metadata.js
├── .vscode/
│   └── extensions.json
├── ARCHITECTURE.md
├── Cargo.toml
├── LICENSE.spdx
├── LICENSE_APACHE-2.0
├── LICENSE_MIT
├── README.md
├── SECURITY.md
├── bench/
│   ├── Cargo.toml
│   ├── README.md
│   ├── src/
│   │   ├── build_benchmark_jsons.rs
│   │   ├── run_benchmark.rs
│   │   └── utils.rs
│   └── tests/
│       ├── cpu_intensive/
│       │   ├── public/
│       │   │   ├── index.css
│       │   │   ├── index.html
│       │   │   ├── site.js
│       │   │   └── worker.js
│       │   └── src-tauri/
│       │       ├── .gitignore
│       │       ├── Cargo.toml
│       │       ├── build.rs
│       │       ├── src/
│       │       │   └── main.rs
│       │       └── tauri.conf.json
│       ├── files_transfer/
│       │   ├── public/
│       │   │   └── index.html
│       │   └── src-tauri/
│       │       ├── .gitignore
│       │       ├── Cargo.toml
│       │       ├── build.rs
│       │       ├── src/
│       │       │   └── main.rs
│       │       └── tauri.conf.json
│       └── helloworld/
│           ├── public/
│           │   └── index.html
│           └── src-tauri/
│               ├── .gitignore
│               ├── Cargo.toml
│               ├── build.rs
│               ├── src/
│               │   └── main.rs
│               └── tauri.conf.json
├── crates/
│   ├── tauri/
│   │   ├── .scripts/
│   │   │   └── loop_qc.sh
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   ├── build.rs
│   │   ├── mobile/
│   │   │   ├── android/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle.kts
│   │   │   │   ├── proguard-rules.pro
│   │   │   │   └── src/
│   │   │   │       ├── androidTest/
│   │   │   │       │   └── java/
│   │   │   │       │       └── app/
│   │   │   │       │           └── tauri/
│   │   │   │       │               └── ExampleInstrumentedTest.kt
│   │   │   │       ├── main/
│   │   │   │       │   ├── AndroidManifest.xml
│   │   │   │       │   └── java/
│   │   │   │       │       └── app/
│   │   │   │       │           └── tauri/
│   │   │   │       │               ├── AppPlugin.kt
│   │   │   │       │               ├── FsUtils.kt
│   │   │   │       │               ├── JniMethod.kt
│   │   │   │       │               ├── Logger.kt
│   │   │   │       │               ├── PathPlugin.kt
│   │   │   │       │               ├── PermissionHelper.kt
│   │   │   │       │               ├── PermissionState.kt
│   │   │   │       │               ├── annotation/
│   │   │   │       │               │   ├── ActivityCallback.kt
│   │   │   │       │               │   ├── InvokeArg.kt
│   │   │   │       │               │   ├── Permission.kt
│   │   │   │       │               │   ├── PermissionCallback.kt
│   │   │   │       │               │   ├── PluginMethod.kt
│   │   │   │       │               │   └── TauriPlugin.kt
│   │   │   │       │               └── plugin/
│   │   │   │       │                   ├── Channel.kt
│   │   │   │       │                   ├── InvalidPluginMethodException.kt
│   │   │   │       │                   ├── Invoke.kt
│   │   │   │       │                   ├── JSArray.kt
│   │   │   │       │                   ├── JSObject.kt
│   │   │   │       │                   ├── Plugin.kt
│   │   │   │       │                   ├── PluginHandle.kt
│   │   │   │       │                   ├── PluginManager.kt
│   │   │   │       │                   ├── PluginMethodData.kt
│   │   │   │       │                   └── PluginResult.kt
│   │   │   │       └── test/
│   │   │   │           └── java/
│   │   │   │               └── app/
│   │   │   │                   └── tauri/
│   │   │   │                       └── ExampleUnitTest.kt
│   │   │   ├── android-codegen/
│   │   │   │   └── TauriActivity.kt
│   │   │   ├── ios-api/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── Package.swift
│   │   │   │   ├── README.md
│   │   │   │   ├── Sources/
│   │   │   │   │   └── Tauri/
│   │   │   │   │       ├── Channel.swift
│   │   │   │   │       ├── Invoke.swift
│   │   │   │   │       ├── JSTypes.swift
│   │   │   │   │       ├── JsonValue.swift
│   │   │   │   │       ├── Logger.swift
│   │   │   │   │       ├── Plugin/
│   │   │   │   │       │   └── Plugin.swift
│   │   │   │   │       ├── Tauri.swift
│   │   │   │   │       └── UiUtils.swift
│   │   │   │   └── Tests/
│   │   │   │       └── TauriTests/
│   │   │   │           └── TauriTests.swift
│   │   │   └── proguard-tauri.pro
│   │   ├── permissions/
│   │   │   ├── app/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── event/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── image/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── menu/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── path/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── resources/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── tray/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   ├── webview/
│   │   │   │   └── autogenerated/
│   │   │   │       └── reference.md
│   │   │   └── window/
│   │   │       └── autogenerated/
│   │   │           └── reference.md
│   │   ├── scripts/
│   │   │   ├── bundle.global.js
│   │   │   ├── core.js
│   │   │   ├── freeze_prototype.js
│   │   │   ├── init.js
│   │   │   ├── ipc-protocol.js
│   │   │   ├── ipc.js
│   │   │   ├── isolation.js
│   │   │   ├── pattern.js
│   │   │   └── process-ipc-message-fn.js
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   └── plugin.rs
│   │   │   ├── app.rs
│   │   │   ├── async_runtime.rs
│   │   │   ├── error.rs
│   │   │   ├── event/
│   │   │   │   ├── event-system-spec.md
│   │   │   │   ├── event_name.rs
│   │   │   │   ├── init.js
│   │   │   │   ├── listener.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── plugin.rs
│   │   │   ├── image/
│   │   │   │   ├── mod.rs
│   │   │   │   └── plugin.rs
│   │   │   ├── ios.rs
│   │   │   ├── ipc/
│   │   │   │   ├── authority.rs
│   │   │   │   ├── capability_builder.rs
│   │   │   │   ├── channel.rs
│   │   │   │   ├── command.rs
│   │   │   │   ├── format_callback.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── protocol.rs
│   │   │   ├── lib.rs
│   │   │   ├── manager/
│   │   │   │   ├── menu.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── tray.rs
│   │   │   │   ├── webview.rs
│   │   │   │   └── window.rs
│   │   │   ├── menu/
│   │   │   │   ├── builders/
│   │   │   │   │   ├── check.rs
│   │   │   │   │   ├── icon.rs
│   │   │   │   │   ├── menu.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── normal.rs
│   │   │   │   ├── check.rs
│   │   │   │   ├── icon.rs
│   │   │   │   ├── menu.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── normal.rs
│   │   │   │   ├── plugin.rs
│   │   │   │   ├── predefined.rs
│   │   │   │   └── submenu.rs
│   │   │   ├── path/
│   │   │   │   ├── android.rs
│   │   │   │   ├── desktop.rs
│   │   │   │   ├── init.js
│   │   │   │   ├── mod.rs
│   │   │   │   └── plugin.rs
│   │   │   ├── pattern.rs
│   │   │   ├── plugin/
│   │   │   │   └── mobile.rs
│   │   │   ├── plugin.rs
│   │   │   ├── process.rs
│   │   │   ├── protocol/
│   │   │   │   ├── asset.rs
│   │   │   │   ├── isolation.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── tauri.rs
│   │   │   ├── resources/
│   │   │   │   ├── mod.rs
│   │   │   │   └── plugin.rs
│   │   │   ├── scope/
│   │   │   │   ├── fs.rs
│   │   │   │   └── mod.rs
│   │   │   ├── state.rs
│   │   │   ├── test/
│   │   │   │   ├── mock_runtime.rs
│   │   │   │   └── mod.rs
│   │   │   ├── tray/
│   │   │   │   ├── mod.rs
│   │   │   │   └── plugin.rs
│   │   │   ├── vibrancy/
│   │   │   │   ├── macos.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── windows.rs
│   │   │   ├── webview/
│   │   │   │   ├── mod.rs
│   │   │   │   ├── plugin.rs
│   │   │   │   ├── scripts/
│   │   │   │   │   ├── print.js
│   │   │   │   │   ├── toggle-devtools.js
│   │   │   │   │   └── zoom-hotkey.js
│   │   │   │   └── webview_window.rs
│   │   │   └── window/
│   │   │       ├── mod.rs
│   │   │       ├── plugin.rs
│   │   │       └── scripts/
│   │   │           └── drag.js
│   │   └── test/
│   │       ├── api/
│   │       │   ├── test.txt
│   │       │   └── test_binary
│   │       ├── fixture/
│   │       │   ├── config.json
│   │       │   ├── dist/
│   │       │   │   └── index.html
│   │       │   ├── isolation/
│   │       │   │   ├── dist/
│   │       │   │   │   └── index.html
│   │       │   │   ├── isolation-dist/
│   │       │   │   │   ├── index.html
│   │       │   │   │   └── index.js
│   │       │   │   └── src-tauri/
│   │       │   │       ├── icons/
│   │       │   │       │   └── icon.ico~dev
│   │       │   │       └── tauri.conf.json
│   │       │   ├── src-tauri/
│   │       │   │   ├── icons/
│   │       │   │   │   └── icon.ico~dev
│   │       │   │   └── tauri.conf.json
│   │       │   └── test.txt
│   │       └── updater/
│   │           └── fixture/
│   │               ├── archives/
│   │               │   ├── archive.linux.tar.gz.sig
│   │               │   ├── archive.macos.tar.gz.sig
│   │               │   └── archive.windows.zip.sig
│   │               ├── bad_signature/
│   │               │   ├── update.key
│   │               │   └── update.key.pub
│   │               └── good_signature/
│   │                   ├── update.key
│   │                   └── update.key.pub
│   ├── tauri-build/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   └── src/
│   │       ├── acl.rs
│   │       ├── codegen/
│   │       │   ├── context.rs
│   │       │   └── mod.rs
│   │       ├── lib.rs
│   │       ├── manifest.rs
│   │       ├── mobile.rs
│   │       ├── static_vcruntime.rs
│   │       └── windows-app-manifest.xml
│   ├── tauri-bundler/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── License_Apache.md
│   │   ├── License_MIT.md
│   │   ├── README.md
│   │   └── src/
│   │       ├── bundle/
│   │       │   ├── category.rs
│   │       │   ├── kmp/
│   │       │   │   └── mod.rs
│   │       │   ├── linux/
│   │       │   │   ├── appimage/
│   │       │   │   │   ├── linuxdeploy-plugin-gstreamer.sh
│   │       │   │   │   ├── linuxdeploy-plugin-gtk.sh
│   │       │   │   │   ├── linuxdeploy.rs
│   │       │   │   │   └── mod.rs
│   │       │   │   ├── debian.rs
│   │       │   │   ├── freedesktop/
│   │       │   │   │   ├── main.desktop
│   │       │   │   │   └── mod.rs
│   │       │   │   ├── mod.rs
│   │       │   │   └── rpm.rs
│   │       │   ├── macos/
│   │       │   │   ├── app.rs
│   │       │   │   ├── dmg/
│   │       │   │   │   ├── bundle_dmg
│   │       │   │   │   ├── eula-resources-template.xml
│   │       │   │   │   ├── mod.rs
│   │       │   │   │   └── template.applescript
│   │       │   │   ├── icon.rs
│   │       │   │   ├── ios.rs
│   │       │   │   ├── mod.rs
│   │       │   │   └── sign.rs
│   │       │   ├── platform.rs
│   │       │   ├── settings.rs
│   │       │   ├── updater_bundle.rs
│   │       │   └── windows/
│   │       │       ├── mod.rs
│   │       │       ├── msi/
│   │       │       │   ├── default-locale-strings.xml
│   │       │       │   ├── install-task.ps1
│   │       │       │   ├── languages.json
│   │       │       │   ├── main.wxs
│   │       │       │   ├── mod.rs
│   │       │       │   ├── uninstall-task.ps1
│   │       │       │   └── update-task.xml
│   │       │       ├── nsis/
│   │       │       │   ├── FileAssociation.nsh
│   │       │       │   ├── installer.nsi
│   │       │       │   ├── languages/
│   │       │       │   │   ├── Arabic.nsh
│   │       │       │   │   ├── Bulgarian.nsh
│   │       │       │   │   ├── Dutch.nsh
│   │       │       │   │   ├── English.nsh
│   │       │       │   │   ├── French.nsh
│   │       │       │   │   ├── German.nsh
│   │       │       │   │   ├── Hebrew.nsh
│   │       │       │   │   ├── Italian.nsh
│   │       │       │   │   ├── Japanese.nsh
│   │       │       │   │   ├── Korean.nsh
│   │       │       │   │   ├── Norwegian.nsh
│   │       │       │   │   ├── Persian.nsh
│   │       │       │   │   ├── Portuguese.nsh
│   │       │       │   │   ├── PortugueseBR.nsh
│   │       │       │   │   ├── Russian.nsh
│   │       │       │   │   ├── SimpChinese.nsh
│   │       │       │   │   ├── Spanish.nsh
│   │       │       │   │   ├── SpanishInternational.nsh
│   │       │       │   │   ├── Swedish.nsh
│   │       │       │   │   ├── TradChinese.nsh
│   │       │       │   │   ├── Turkish.nsh
│   │       │       │   │   └── Ukrainian.nsh
│   │       │       │   ├── mod.rs
│   │       │       │   └── utils.nsh
│   │       │       ├── sign.rs
│   │       │       └── util.rs
│   │       ├── bundle.rs
│   │       ├── error.rs
│   │       ├── lib.rs
│   │       └── utils/
│   │           ├── fs_utils.rs
│   │           ├── http_utils.rs
│   │           └── mod.rs
│   ├── tauri-cli/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── ENVIRONMENT_VARIABLES.md
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   ├── build.rs
│   │   ├── config.schema.json
│   │   ├── metadata-v2.json
│   │   ├── metadata.json
│   │   ├── schema.json
│   │   ├── scripts/
│   │   │   └── kill-children.sh
│   │   ├── src/
│   │   │   ├── acl/
│   │   │   │   ├── capability/
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── new.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── permission/
│   │   │   │       ├── add.rs
│   │   │   │       ├── ls.rs
│   │   │   │       ├── mod.rs
│   │   │   │       ├── new.rs
│   │   │   │       └── rm.rs
│   │   │   ├── add.rs
│   │   │   ├── build.rs
│   │   │   ├── bundle.rs
│   │   │   ├── completions.rs
│   │   │   ├── dev/
│   │   │   │   ├── auto-reload.js
│   │   │   │   └── builtin_dev_server.rs
│   │   │   ├── dev.rs
│   │   │   ├── error.rs
│   │   │   ├── helpers/
│   │   │   │   ├── app_paths.rs
│   │   │   │   ├── cargo.rs
│   │   │   │   ├── cargo_manifest.rs
│   │   │   │   ├── config.rs
│   │   │   │   ├── flock.rs
│   │   │   │   ├── framework.rs
│   │   │   │   ├── fs.rs
│   │   │   │   ├── http.rs
│   │   │   │   ├── icns.json
│   │   │   │   ├── mod.rs
│   │   │   │   ├── npm.rs
│   │   │   │   ├── pbxproj.rs
│   │   │   │   ├── plist.rs
│   │   │   │   ├── plugins.rs
│   │   │   │   ├── prompts.rs
│   │   │   │   ├── template.rs
│   │   │   │   └── updater_signature.rs
│   │   │   ├── icon.rs
│   │   │   ├── info/
│   │   │   │   ├── app.rs
│   │   │   │   ├── env_nodejs.rs
│   │   │   │   ├── env_rust.rs
│   │   │   │   ├── env_system.rs
│   │   │   │   ├── ios.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── packages_nodejs.rs
│   │   │   │   ├── packages_rust.rs
│   │   │   │   └── plugins.rs
│   │   │   ├── init.rs
│   │   │   ├── inspect.rs
│   │   │   ├── interface/
│   │   │   │   ├── mod.rs
│   │   │   │   ├── rust/
│   │   │   │   │   ├── cargo_config.rs
│   │   │   │   │   ├── desktop.rs
│   │   │   │   │   ├── installation.rs
│   │   │   │   │   └── manifest.rs
│   │   │   │   └── rust.rs
│   │   │   ├── lib.rs
│   │   │   ├── main.rs
│   │   │   ├── migrate/
│   │   │   │   ├── migrations/
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── v1/
│   │   │   │   │   │   ├── config.rs
│   │   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   │   ├── api-example.tauri.conf.json
│   │   │   │   │   │   │   └── cli-template.tauri.conf.json
│   │   │   │   │   │   ├── frontend/
│   │   │   │   │   │   │   └── partial_loader/
│   │   │   │   │   │   │       ├── mod.rs
│   │   │   │   │   │   │       ├── svelte.rs
│   │   │   │   │   │   │       └── vue.rs
│   │   │   │   │   │   ├── frontend.rs
│   │   │   │   │   │   ├── manifest.rs
│   │   │   │   │   │   └── mod.rs
│   │   │   │   │   └── v2_beta.rs
│   │   │   │   └── mod.rs
│   │   │   ├── mobile/
│   │   │   │   ├── android/
│   │   │   │   │   ├── android_studio_script.rs
│   │   │   │   │   ├── build.rs
│   │   │   │   │   ├── dev.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── project.rs
│   │   │   │   │   └── run.rs
│   │   │   │   ├── init.rs
│   │   │   │   ├── ios/
│   │   │   │   │   ├── build.rs
│   │   │   │   │   ├── dev.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── project.rs
│   │   │   │   │   ├── run.rs
│   │   │   │   │   └── xcode_script.rs
│   │   │   │   └── mod.rs
│   │   │   ├── plugin/
│   │   │   │   ├── android.rs
│   │   │   │   ├── init.rs
│   │   │   │   ├── ios.rs
│   │   │   │   ├── mod.rs
│   │   │   │   └── new.rs
│   │   │   ├── remove.rs
│   │   │   └── signer/
│   │   │       ├── generate.rs
│   │   │       ├── mod.rs
│   │   │       └── sign.rs
│   │   ├── tauri-dev-watcher.gitignore
│   │   ├── tauri.config.schema.json
│   │   ├── tauri.gitignore
│   │   ├── templates/
│   │   │   ├── app/
│   │   │   │   └── src-tauri/
│   │   │   │       ├── .gitignore
│   │   │   │       ├── Cargo.crate-manifest
│   │   │   │       ├── build.rs
│   │   │   │       ├── capabilities/
│   │   │   │       │   └── default.json
│   │   │   │       ├── icons/
│   │   │   │       │   └── icon.icns
│   │   │   │       ├── src/
│   │   │   │       │   ├── lib.rs
│   │   │   │       │   └── main.rs
│   │   │   │       └── tauri.conf.json
│   │   │   ├── mobile/
│   │   │   │   ├── android/
│   │   │   │   │   ├── .editorconfig
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── .gitignore
│   │   │   │   │   │   ├── build.gradle.kts
│   │   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   │   └── src/
│   │   │   │   │   │       └── main/
│   │   │   │   │   │           ├── AndroidManifest.xml
│   │   │   │   │   │           ├── MainActivity.kt
│   │   │   │   │   │           └── res/
│   │   │   │   │   │               ├── drawable/
│   │   │   │   │   │               │   └── ic_launcher_background.xml
│   │   │   │   │   │               ├── drawable-v24/
│   │   │   │   │   │               │   └── ic_launcher_foreground.xml
│   │   │   │   │   │               ├── layout/
│   │   │   │   │   │               │   └── activity_main.xml
│   │   │   │   │   │               ├── values/
│   │   │   │   │   │               │   ├── colors.xml
│   │   │   │   │   │               │   ├── strings.xml
│   │   │   │   │   │               │   └── themes.xml
│   │   │   │   │   │               ├── values-night/
│   │   │   │   │   │               │   └── themes.xml
│   │   │   │   │   │               └── xml/
│   │   │   │   │   │                   └── file_paths.xml
│   │   │   │   │   ├── build.gradle.kts
│   │   │   │   │   ├── buildSrc/
│   │   │   │   │   │   ├── build.gradle.kts
│   │   │   │   │   │   └── src/
│   │   │   │   │   │       └── main/
│   │   │   │   │   │           └── kotlin/
│   │   │   │   │   │               ├── BuildTask.kt
│   │   │   │   │   │               └── RustPlugin.kt
│   │   │   │   │   ├── gradle/
│   │   │   │   │   │   └── wrapper/
│   │   │   │   │   │       ├── gradle-wrapper.jar
│   │   │   │   │   │       └── gradle-wrapper.properties
│   │   │   │   │   ├── gradle.properties
│   │   │   │   │   ├── gradlew
│   │   │   │   │   ├── gradlew.bat
│   │   │   │   │   └── settings.gradle
│   │   │   │   └── ios/
│   │   │   │       ├── .gitignore
│   │   │   │       ├── Assets.xcassets/
│   │   │   │       │   ├── AppIcon.appiconset/
│   │   │   │       │   │   └── Contents.json
│   │   │   │       │   └── Contents.json
│   │   │   │       ├── ExportOptions.plist
│   │   │   │       ├── LaunchScreen.storyboard
│   │   │   │       ├── Podfile
│   │   │   │       ├── Sources/
│   │   │   │       │   └── {{app.name}}/
│   │   │   │       │       ├── bindings/
│   │   │   │       │       │   └── bindings.h
│   │   │   │       │       └── main.mm
│   │   │   │       ├── project.yml
│   │   │   │       └── {{app.name}}.xcodeproj/
│   │   │   │           └── project.xcworkspace/
│   │   │   │               └── xcshareddata/
│   │   │   │                   └── WorkspaceSettings.xcsettings
│   │   │   ├── plugin/
│   │   │   │   ├── .github/
│   │   │   │   │   └── workflows/
│   │   │   │   │       ├── audit.yml
│   │   │   │   │       ├── clippy.yml
│   │   │   │   │       └── test.yml
│   │   │   │   ├── .gitignore
│   │   │   │   ├── Cargo.crate-manifest
│   │   │   │   ├── README.md
│   │   │   │   ├── __example-api/
│   │   │   │   │   └── tauri-app/
│   │   │   │   │       ├── .gitignore
│   │   │   │   │       ├── .vscode/
│   │   │   │   │       │   └── extensions.json
│   │   │   │   │       ├── README.md
│   │   │   │   │       ├── index.html
│   │   │   │   │       ├── jsconfig.json
│   │   │   │   │       ├── package.json
│   │   │   │   │       ├── src/
│   │   │   │   │       │   ├── App.svelte
│   │   │   │   │       │   ├── lib/
│   │   │   │   │       │   │   └── Greet.svelte
│   │   │   │   │       │   ├── main.js
│   │   │   │   │       │   ├── style.css
│   │   │   │   │       │   └── vite-env.d.ts
│   │   │   │   │       ├── src-tauri/
│   │   │   │   │       │   ├── .gitignore
│   │   │   │   │       │   ├── Cargo.crate-manifest
│   │   │   │   │       │   ├── build.rs
│   │   │   │   │       │   ├── capabilities/
│   │   │   │   │       │   │   └── default.json
│   │   │   │   │       │   ├── icons/
│   │   │   │   │       │   │   └── icon.icns
│   │   │   │   │       │   ├── src/
│   │   │   │   │       │   │   ├── lib.rs
│   │   │   │   │       │   │   └── main.rs
│   │   │   │   │       │   └── tauri.conf.json
│   │   │   │   │       └── vite.config.js
│   │   │   │   ├── __example-basic/
│   │   │   │   │   └── vanilla/
│   │   │   │   │       ├── .gitignore
│   │   │   │   │       ├── package.json
│   │   │   │   │       ├── public/
│   │   │   │   │       │   └── index.html
│   │   │   │   │       └── src-tauri/
│   │   │   │   │           ├── .gitignore
│   │   │   │   │           ├── Cargo.crate-manifest
│   │   │   │   │           ├── build.rs
│   │   │   │   │           ├── capabilities/
│   │   │   │   │           │   └── default.json
│   │   │   │   │           ├── icons/
│   │   │   │   │           │   └── icon.icns
│   │   │   │   │           ├── rustfmt.toml
│   │   │   │   │           ├── src/
│   │   │   │   │           │   ├── lib.rs
│   │   │   │   │           │   └── main.rs
│   │   │   │   │           └── tauri.conf.json
│   │   │   │   ├── android/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── build.gradle.kts
│   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   ├── settings.gradle
│   │   │   │   │   └── src/
│   │   │   │   │       ├── androidTest/
│   │   │   │   │       │   └── java/
│   │   │   │   │       │       └── ExampleInstrumentedTest.kt
│   │   │   │   │       ├── main/
│   │   │   │   │       │   ├── AndroidManifest.xml
│   │   │   │   │       │   └── java/
│   │   │   │   │       │       ├── Example.kt
│   │   │   │   │       │       └── ExamplePlugin.kt
│   │   │   │   │       └── test/
│   │   │   │   │           └── java/
│   │   │   │   │               └── ExampleUnitTest.kt
│   │   │   │   ├── build.rs
│   │   │   │   ├── guest-js/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── ios-spm/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── Package.swift
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── Sources/
│   │   │   │   │   │   └── ExamplePlugin.swift
│   │   │   │   │   └── Tests/
│   │   │   │   │       └── PluginTests/
│   │   │   │   │           └── PluginTests.swift
│   │   │   │   ├── ios-xcode/
│   │   │   │   │   ├── tauri-plugin-{{ plugin_name }}/
│   │   │   │   │   │   └── ExamplePlugin.swift
│   │   │   │   │   └── tauri-plugin-{{ plugin_name }}.xcodeproj/
│   │   │   │   │       ├── project.pbxproj
│   │   │   │   │       └── project.xcworkspace/
│   │   │   │   │           ├── contents.xcworkspacedata
│   │   │   │   │           └── xcshareddata/
│   │   │   │   │               └── IDEWorkspaceChecks.plist
│   │   │   │   ├── package.json
│   │   │   │   ├── rollup.config.js
│   │   │   │   ├── src/
│   │   │   │   │   ├── commands.rs
│   │   │   │   │   ├── desktop.rs
│   │   │   │   │   ├── error.rs
│   │   │   │   │   ├── lib.rs
│   │   │   │   │   ├── mobile.rs
│   │   │   │   │   └── models.rs
│   │   │   │   └── tsconfig.json
│   │   │   └── tauri.conf.json
│   │   └── tests/
│   │       └── fixtures/
│   │           └── pbxproj/
│   │               ├── project.pbxproj
│   │               └── snapshots/
│   │                   ├── tauri_cli__helpers__pbxproj__tests__project-modified.pbxproj.snap
│   │                   └── tauri_cli__helpers__pbxproj__tests__project.pbxproj.snap
│   ├── tauri-codegen/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   └── src/
│   │       ├── context.rs
│   │       ├── embedded_assets.rs
│   │       ├── image.rs
│   │       ├── lib.rs
│   │       └── vendor/
│   │           ├── blake3_reference.rs
│   │           └── mod.rs
│   ├── tauri-driver/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE.spdx
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   └── src/
│   │       ├── cli.rs
│   │       ├── main.rs
│   │       ├── server.rs
│   │       └── webdriver.rs
│   ├── tauri-macos-sign/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── README.md
│   │   └── src/
│   │       ├── certificate.rs
│   │       ├── keychain/
│   │       │   └── identity.rs
│   │       ├── keychain.rs
│   │       ├── lib.rs
│   │       └── provisioning_profile.rs
│   ├── tauri-macros/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   └── src/
│   │       ├── command/
│   │       │   ├── handler.rs
│   │       │   ├── mod.rs
│   │       │   └── wrapper.rs
│   │       ├── context.rs
│   │       ├── lib.rs
│   │       ├── menu.rs
│   │       ├── mobile.rs
│   │       └── runtime.rs
│   ├── tauri-plugin/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── build/
│   │       │   ├── mobile.rs
│   │       │   └── mod.rs
│   │       ├── lib.rs
│   │       └── runtime.rs
│   ├── tauri-runtime/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   ├── build.rs
│   │   └── src/
│   │       ├── dpi.rs
│   │       ├── lib.rs
│   │       ├── monitor.rs
│   │       ├── webview.rs
│   │       └── window.rs
│   ├── tauri-runtime-wry/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   ├── build.rs
│   │   └── src/
│   │       ├── dialog/
│   │       │   ├── mod.rs
│   │       │   └── windows.rs
│   │       ├── lib.rs
│   │       ├── monitor/
│   │       │   ├── linux.rs
│   │       │   ├── macos.rs
│   │       │   ├── mod.rs
│   │       │   └── windows.rs
│   │       ├── undecorated_resizing.rs
│   │       ├── util.rs
│   │       ├── webview.rs
│   │       └── window/
│   │           ├── linux.rs
│   │           ├── macos.rs
│   │           ├── mod.rs
│   │           └── windows.rs
│   ├── tauri-schema-generator/
│   │   ├── Cargo.toml
│   │   ├── README.md
│   │   ├── build.rs
│   │   ├── schemas/
│   │   │   ├── capability.schema.json
│   │   │   ├── config.schema.json
│   │   │   ├── permission.schema.json
│   │   │   └── scope.schema.json
│   │   └── src/
│   │       └── main.rs
│   ├── tauri-schema-worker/
│   │   ├── .gitignore
│   │   ├── Cargo.toml
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── config.rs
│   │   │   └── lib.rs
│   │   └── wrangler.toml
│   ├── tauri-utils/
│   │   ├── CHANGELOG.md
│   │   ├── Cargo.toml
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   └── src/
│   │       ├── acl/
│   │       │   ├── build.rs
│   │       │   ├── capability.rs
│   │       │   ├── identifier.rs
│   │       │   ├── manifest.rs
│   │       │   ├── mod.rs
│   │       │   ├── resolved.rs
│   │       │   ├── schema.rs
│   │       │   └── value.rs
│   │       ├── assets.rs
│   │       ├── build.rs
│   │       ├── config/
│   │       │   └── parse.rs
│   │       ├── config.rs
│   │       ├── config_v1/
│   │       │   ├── mod.rs
│   │       │   └── parse.rs
│   │       ├── html.rs
│   │       ├── io.rs
│   │       ├── lib.rs
│   │       ├── mime_type.rs
│   │       ├── pattern/
│   │       │   ├── isolation.js
│   │       │   ├── isolation.rs
│   │       │   └── mod.rs
│   │       ├── platform/
│   │       │   └── starting_binary.rs
│   │       ├── platform.rs
│   │       ├── plugin.rs
│   │       ├── resources.rs
│   │       └── tokens.rs
│   └── tests/
│       ├── acl/
│       │   ├── Cargo.toml
│       │   ├── fixtures/
│       │   │   ├── capabilities/
│       │   │   │   ├── basic-ping/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── file-explorer/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── file-explorer-remote/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── multiwebview/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── multiwindow/
│       │   │   │   │   ├── cap-external.toml
│       │   │   │   │   ├── cap-main.json
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── platform-specific-permissions/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   ├── scope/
│       │   │   │   │   ├── cap.toml
│       │   │   │   │   └── required-plugins.json
│       │   │   │   └── scope-extended/
│       │   │   │       ├── cap.json
│       │   │   │       └── required-plugins.json
│       │   │   ├── plugins/
│       │   │   │   ├── fs/
│       │   │   │   │   ├── deny-home.toml
│       │   │   │   │   ├── move-tmp.toml
│       │   │   │   │   ├── read-dir.toml
│       │   │   │   │   ├── read-download-dir.toml
│       │   │   │   │   ├── read-file.toml
│       │   │   │   │   ├── read-resources.toml
│       │   │   │   │   ├── read.toml
│       │   │   │   │   └── scope.toml
│       │   │   │   ├── os/
│       │   │   │   │   ├── linux.toml
│       │   │   │   │   ├── macos.toml
│       │   │   │   │   ├── open-browser.toml
│       │   │   │   │   └── windows.toml
│       │   │   │   └── ping/
│       │   │   │       └── ping.toml
│       │   │   └── snapshots/
│       │   │       ├── acl_tests__tests__basic-ping.snap
│       │   │       ├── acl_tests__tests__file-explorer-remote.snap
│       │   │       ├── acl_tests__tests__file-explorer.snap
│       │   │       ├── acl_tests__tests__multiwebview.snap
│       │   │       ├── acl_tests__tests__multiwindow.snap
│       │   │       ├── acl_tests__tests__scope-extended.snap
│       │   │       ├── acl_tests__tests__scope.snap
│       │   │       ├── linux/
│       │   │       │   └── acl_tests__tests__platform-specific-permissions.snap
│       │   │       ├── macOS/
│       │   │       │   └── acl_tests__tests__platform-specific-permissions.snap
│       │   │       └── windows/
│       │   │           └── acl_tests__tests__platform-specific-permissions.snap
│       │   └── src/
│       │       └── lib.rs
│       ├── app-updater/
│       │   └── frameworks/
│       │       └── test.framework/
│       │           ├── Headers
│       │           ├── Modules
│       │           ├── Resources
│       │           └── Versions/
│       │               ├── A/
│       │               │   ├── Headers/
│       │               │   │   └── test.h
│       │               │   ├── Modules/
│       │               │   │   └── module.modulemap
│       │               │   ├── Resources/
│       │               │   │   └── Info.plist
│       │               │   ├── _CodeSignature/
│       │               │   │   └── CodeResources
│       │               │   └── test
│       │               └── Current
│       └── restart/
│           ├── Cargo.toml
│           ├── LICENSE.spdx
│           ├── LICENSE_APACHE-2.0
│           ├── LICENSE_MIT
│           ├── build.rs
│           ├── src/
│           │   └── main.rs
│           └── tests/
│               └── restart.rs
├── dependabot.yml
├── examples/
│   ├── .icons/
│   │   └── icon.icns
│   ├── README.md
│   ├── api/
│   │   ├── .gitignore
│   │   ├── .setup-cross.sh
│   │   ├── .taurignore
│   │   ├── README.md
│   │   ├── dist/
│   │   │   └── .gitkeep
│   │   ├── index.html
│   │   ├── isolation-dist/
│   │   │   ├── index.html
│   │   │   └── index.js
│   │   ├── jsconfig.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── App.svelte
│   │   │   ├── app.css
│   │   │   ├── components/
│   │   │   │   ├── MenuBuilder.svelte
│   │   │   │   └── MenuItemBuilder.svelte
│   │   │   ├── main.js
│   │   │   ├── views/
│   │   │   │   ├── App.svelte
│   │   │   │   ├── Communication.svelte
│   │   │   │   ├── Menu.svelte
│   │   │   │   ├── Tray.svelte
│   │   │   │   ├── WebRTC.svelte
│   │   │   │   ├── Welcome.svelte
│   │   │   │   └── Window.svelte
│   │   │   └── vite-env.d.ts
│   │   ├── src-tauri/
│   │   │   ├── .gitignore
│   │   │   ├── .taurignore
│   │   │   ├── Cargo.toml
│   │   │   ├── Cross.toml
│   │   │   ├── Info.plist
│   │   │   ├── build.rs
│   │   │   ├── capabilities/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── main.json
│   │   │   │   └── run-app.json
│   │   │   ├── locales/
│   │   │   │   └── pt-BR.wxl
│   │   │   ├── permissions/
│   │   │   │   ├── app-menu/
│   │   │   │   │   └── default.toml
│   │   │   │   └── autogenerated/
│   │   │   │       ├── echo.toml
│   │   │   │       ├── log_operation.toml
│   │   │   │       ├── perform_request.toml
│   │   │   │       └── spam.toml
│   │   │   ├── src/
│   │   │   │   ├── cmd.rs
│   │   │   │   ├── lib.rs
│   │   │   │   ├── main.rs
│   │   │   │   ├── menu_plugin.rs
│   │   │   │   └── tray.rs
│   │   │   ├── tauri-plugin-sample/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── Cargo.toml
│   │   │   │   ├── android/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── build.gradle.kts
│   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   ├── settings.gradle
│   │   │   │   │   └── src/
│   │   │   │   │       ├── androidTest/
│   │   │   │   │       │   └── java/
│   │   │   │   │       │       └── com/
│   │   │   │   │       │           └── plugin/
│   │   │   │   │       │               └── sample/
│   │   │   │   │       │                   └── ExampleInstrumentedTest.kt
│   │   │   │   │       ├── main/
│   │   │   │   │       │   ├── AndroidManifest.xml
│   │   │   │   │       │   └── java/
│   │   │   │   │       │       └── com/
│   │   │   │   │       │           └── plugin/
│   │   │   │   │       │               └── sample/
│   │   │   │   │       │                   ├── Example.kt
│   │   │   │   │       │                   └── ExamplePlugin.kt
│   │   │   │   │       └── test/
│   │   │   │   │           └── java/
│   │   │   │   │               └── com/
│   │   │   │   │                   └── plugin/
│   │   │   │   │                       └── sample/
│   │   │   │   │                           └── ExampleUnitTest.kt
│   │   │   │   ├── api-iife.js
│   │   │   │   ├── build.rs
│   │   │   │   ├── ios/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── Package.swift
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── Sources/
│   │   │   │   │   │   └── ExamplePlugin.swift
│   │   │   │   │   └── Tests/
│   │   │   │   │       └── PluginTests/
│   │   │   │   │           └── PluginTests.swift
│   │   │   │   ├── permissions/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── autogenerated/
│   │   │   │   │   │   ├── commands/
│   │   │   │   │   │   │   └── ping.toml
│   │   │   │   │   │   └── reference.md
│   │   │   │   │   ├── global-scope.toml
│   │   │   │   │   └── ping-scoped.toml
│   │   │   │   └── src/
│   │   │   │       ├── desktop.rs
│   │   │   │       ├── error.rs
│   │   │   │       ├── lib.rs
│   │   │   │       ├── mobile.rs
│   │   │   │       └── models.rs
│   │   │   └── tauri.conf.json
│   │   ├── svelte.config.js
│   │   ├── unocss.config.js
│   │   └── vite.config.js
│   ├── commands/
│   │   ├── README.md
│   │   ├── commands.rs
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── file-associations/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── package.json
│   │   └── src-tauri/
│   │       ├── .license_template
│   │       ├── Cargo.toml
│   │       ├── Info.plist
│   │       ├── build.rs
│   │       ├── src/
│   │       │   └── main.rs
│   │       └── tauri.conf.json
│   ├── helloworld/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── isolation/
│   │   ├── README.md
│   │   ├── dist/
│   │   │   ├── index.html
│   │   │   └── linked.js
│   │   ├── isolation-dist/
│   │   │   ├── index.html
│   │   │   └── index.js
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── multiwebview/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── multiwindow/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── resources/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── package.json
│   │   └── src-tauri/
│   │       ├── Cargo.toml
│   │       ├── assets/
│   │       │   └── index.js
│   │       ├── build.rs
│   │       ├── capabilities/
│   │       │   └── app.json
│   │       ├── src/
│   │       │   └── main.rs
│   │       └── tauri.conf.json
│   ├── run-return/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── splashscreen/
│   │   ├── README.md
│   │   ├── dist/
│   │   │   ├── index.html
│   │   │   └── splashscreen.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   ├── state/
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── main.rs
│   │   └── tauri.conf.json
│   └── streaming/
│       ├── README.md
│       ├── index.html
│       ├── main.rs
│       └── tauri.conf.json
├── package.json
├── packages/
│   ├── api/
│   │   ├── .gitignore
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE_APACHE-2.0
│   │   ├── LICENSE_MIT
│   │   ├── README.md
│   │   ├── eslint.config.js
│   │   ├── package.json
│   │   ├── rollup.config.ts
│   │   ├── src/
│   │   │   ├── app.ts
│   │   │   ├── core.ts
│   │   │   ├── dpi.ts
│   │   │   ├── event.ts
│   │   │   ├── global.d.ts
│   │   │   ├── image.ts
│   │   │   ├── index.ts
│   │   │   ├── menu/
│   │   │   │   ├── base.ts
│   │   │   │   ├── checkMenuItem.ts
│   │   │   │   ├── iconMenuItem.ts
│   │   │   │   ├── menu.ts
│   │   │   │   ├── menuItem.ts
│   │   │   │   ├── predefinedMenuItem.ts
│   │   │   │   └── submenu.ts
│   │   │   ├── menu.ts
│   │   │   ├── mocks.ts
│   │   │   ├── path.ts
│   │   │   ├── tray.ts
│   │   │   ├── webview.ts
│   │   │   ├── webviewWindow.ts
│   │   │   └── window.ts
│   │   └── tsconfig.json
│   └── cli/
│       ├── .cargo/
│       │   └── config.toml
│       ├── .gitignore
│       ├── .npmignore
│       ├── CHANGELOG.md
│       ├── Cargo.toml
│       ├── LICENSE_APACHE-2.0
│       ├── LICENSE_MIT
│       ├── README.md
│       ├── __tests__/
│       │   ├── fixtures/
│       │   │   └── empty/
│       │   │       ├── .gitignore
│       │   │       ├── dist/
│       │   │       │   └── index.html
│       │   │       └── package.json
│       │   └── template.spec.ts
│       ├── append-headers.js
│       ├── build.rs
│       ├── index.d.ts
│       ├── index.js
│       ├── main.d.ts
│       ├── main.js
│       ├── npm/
│       │   ├── darwin-arm64/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── darwin-x64/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-arm-gnueabihf/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-arm64-gnu/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-arm64-musl/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-riscv64-gnu/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-x64-gnu/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── linux-x64-musl/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── win32-arm64-msvc/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   ├── win32-ia32-msvc/
│       │   │   ├── README.md
│       │   │   └── package.json
│       │   └── win32-x64-msvc/
│       │       ├── README.md
│       │       └── package.json
│       ├── package.json
│       ├── src/
│       │   └── lib.rs
│       └── tauri.js
├── pnpm-workspace.yaml
├── renovate.json
├── rustfmt.toml
└── supply-chain/
    ├── audits.toml
    └── config.toml
Download .txt
Showing preview only (493K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5662 symbols across 345 files)

FILE: .scripts/ci/check-change-tags.js
  function checkChangeFiles (line 25) | function checkChangeFiles(changeFiles) {

FILE: .scripts/ci/check-license-header.js
  function checkFile (line 29) | async function checkFile(file) {
  function check (line 74) | async function check(src) {
  function run (line 101) | async function run() {

FILE: bench/src/build_benchmark_jsons.rs
  function main (line 19) | fn main() {

FILE: bench/src/run_benchmark.rs
  function get_all_benchmarks (line 26) | fn get_all_benchmarks(target: &str) -> Vec<(String, String)> {
  function run_strace_benchmarks (line 43) | fn run_strace_benchmarks(new_data: &mut utils::BenchResult, target: &str...
  function run_max_mem_benchmark (line 93) | fn run_max_mem_benchmark(target: &str) -> Result<HashMap<String, u64>> {
  function rlib_size (line 140) | fn rlib_size(target_dir: &Path, prefix: &str) -> Result<u64> {
  function get_binary_sizes (line 176) | fn get_binary_sizes(target_dir: &Path, target: &str) -> Result<HashMap<S...
  constant TARGETS (line 193) | const TARGETS: &[(&str, &[&str])] = &[
  function cargo_deps (line 214) | fn cargo_deps() -> HashMap<String, usize> {
  constant RESULT_KEYS (line 258) | const RESULT_KEYS: &[&str] = &["mean", "stddev", "user", "system", "min"...
  function run_exec_time (line 260) | fn run_exec_time(target: &str) -> Result<HashMap<String, HashMap<String,...
  function main (line 317) | fn main() -> Result<()> {

FILE: bench/src/utils.rs
  type BenchResult (line 27) | pub struct BenchResult {
  type StraceOutput (line 40) | pub struct StraceOutput {
  function get_target (line 49) | pub fn get_target() -> &'static str {
  function target_dir (line 72) | pub fn target_dir() -> PathBuf {
  function bench_root_path (line 81) | pub fn bench_root_path() -> PathBuf {
  function home_path (line 86) | pub fn home_path() -> PathBuf {
  function tauri_root_path (line 99) | pub fn tauri_root_path() -> PathBuf {
  function run_collect (line 105) | pub fn run_collect(cmd: &[&str]) -> Result<(String, String)> {
  function parse_max_mem (line 132) | pub fn parse_max_mem(file_path: &str) -> Result<Option<u64>> {
  function parse_strace_output (line 156) | pub fn parse_strace_output(output: &str) -> HashMap<String, StraceOutput> {
  function run (line 221) | pub fn run(cmd: &[&str]) -> Result<()> {
  function read_json (line 235) | pub fn read_json(filename: &str) -> Result<Value> {
  function write_json (line 242) | pub fn write_json(filename: &str, value: &Value) -> Result<()> {
  function download_file (line 251) | pub fn download_file(url: &str, filename: PathBuf) -> Result<()> {

FILE: bench/tests/cpu_intensive/public/site.js
  constant THRESHOLD (line 6) | const THRESHOLD = 10000000
  constant ITERATIONS (line 14) | const ITERATIONS = 1

FILE: bench/tests/cpu_intensive/src-tauri/build.rs
  function main (line 5) | fn main() {

FILE: bench/tests/cpu_intensive/src-tauri/src/main.rs
  function app_completed_successfully (line 8) | fn app_completed_successfully() {
  function main (line 12) | fn main() {

FILE: bench/tests/files_transfer/src-tauri/build.rs
  function main (line 5) | fn main() {

FILE: bench/tests/files_transfer/src-tauri/src/main.rs
  function app_should_close (line 11) | fn app_should_close(exit_code: i32) {
  function read_file (line 16) | async fn read_file<R: Runtime>(app: AppHandle<R>) -> Result<Response, St...
  function main (line 25) | fn main() {

FILE: bench/tests/helloworld/src-tauri/build.rs
  function main (line 5) | fn main() {

FILE: bench/tests/helloworld/src-tauri/src/main.rs
  function app_loaded_successfully (line 8) | fn app_loaded_successfully() {
  function main (line 12) | fn main() {

FILE: crates/tauri-build/src/acl.rs
  type InlinedPlugin (line 32) | pub struct InlinedPlugin {
    method new (line 51) | pub fn new() -> Self {
    method commands (line 57) | pub fn commands(mut self, commands: &'static [&'static str]) -> Self {
    method permissions_path_pattern (line 67) | pub fn permissions_path_pattern(mut self, pattern: &'static str) -> Se...
    method default_permission (line 75) | pub fn default_permission(mut self, default: DefaultPermissionRule) ->...
  type DefaultPermissionRule (line 40) | pub enum DefaultPermissionRule {
  type AppManifest (line 88) | pub struct AppManifest {
    method new (line 94) | pub fn new() -> Self {
    method commands (line 100) | pub fn commands(mut self, commands: &'static [&'static str]) -> Self {
    method permissions_path_pattern (line 110) | pub fn permissions_path_pattern(mut self, pattern: &'static str) -> Se...
  function save_capabilities (line 117) | fn save_capabilities(capabilities: &BTreeMap<String, Capability>) -> Res...
  function save_acl_manifests (line 129) | fn save_acl_manifests(acl_manifests: &BTreeMap<String, Manifest>) -> Res...
  function read_plugins_manifests (line 141) | fn read_plugins_manifests() -> Result<BTreeMap<String, Manifest>> {
  type InlinedPluginsAcl (line 160) | struct InlinedPluginsAcl {
  function inline_plugins (line 165) | fn inline_plugins(
  type AppManifestAcl (line 260) | struct AppManifestAcl {
  function app_manifest_permissions (line 265) | fn app_manifest_permissions(
  function validate_capabilities (line 337) | fn validate_capabilities(
  function build (line 400) | pub fn build(out_dir: &Path, target: Target, attributes: &Attributes) ->...

FILE: crates/tauri-build/src/codegen/context.rs
  type CodegenContext (line 19) | pub struct CodegenContext {
    method new (line 37) | pub fn new() -> Self {
    method config_path (line 47) | pub fn config_path(mut self, config_path: impl Into<PathBuf>) -> Self {
    method out_file (line 64) | pub fn out_file(mut self, filename: PathBuf) -> Self {
    method capability (line 71) | pub fn capability<P: AsRef<Path>>(mut self, path: P) -> Self {
    method try_build (line 83) | pub(crate) fn try_build(self) -> Result<PathBuf> {
  method default (line 26) | fn default() -> Self {

FILE: crates/tauri-build/src/lib.rs
  function copy_file (line 41) | fn copy_file(from: impl AsRef<Path>, to: impl AsRef<Path>) -> Result<()> {
  function copy_binaries (line 56) | fn copy_binaries(
  function copy_resources (line 88) | fn copy_resources(resources: ResourcePaths<'_>, path: &Path) -> Result<(...
  function symlink_dir (line 106) | fn symlink_dir(src: &Path, dst: &Path) -> std::io::Result<()> {
  function symlink_dir (line 112) | fn symlink_dir(src: &Path, dst: &Path) -> std::io::Result<()> {
  function symlink_file (line 118) | fn symlink_file(src: &Path, dst: &Path) -> std::io::Result<()> {
  function symlink_file (line 124) | fn symlink_file(src: &Path, dst: &Path) -> std::io::Result<()> {
  function copy_dir (line 128) | fn copy_dir(from: &Path, to: &Path) -> Result<()> {
  function copy_framework_from (line 151) | fn copy_framework_from(src_dir: &Path, framework: &str, dest_dir: &Path)...
  function copy_frameworks (line 163) | fn copy_frameworks(dest_dir: &Path, frameworks: &[String]) -> Result<()> {
  function cfg_alias (line 206) | fn cfg_alias(alias: &str, has_feature: bool) {
  type WindowsAttributes (line 216) | pub struct WindowsAttributes {
    method new (line 255) | pub fn new() -> Self {
    method new_without_app_manifest (line 264) | pub fn new_without_app_manifest() -> Self {
    method window_icon_path (line 274) | pub fn window_icon_path<P: AsRef<Path>>(mut self, window_icon_path: P)...
    method app_manifest (line 333) | pub fn app_manifest<S: AsRef<str>>(mut self, manifest: S) -> Self {
  method default (line 248) | fn default() -> Self {
  type Attributes (line 341) | pub struct Attributes {
    method new (line 353) | pub fn new() -> Self {
    method windows_attributes (line 359) | pub fn windows_attributes(mut self, windows_attributes: WindowsAttribu...
    method capabilities_path_pattern (line 372) | pub fn capabilities_path_pattern(mut self, pattern: &'static str) -> S...
    method plugin (line 380) | pub fn plugin(mut self, name: &'static str, plugin: InlinedPlugin) -> ...
    method plugins (line 388) | pub fn plugins<I>(mut self, plugins: I) -> Self
    method app_manifest (line 399) | pub fn app_manifest(mut self, manifest: AppManifest) -> Self {
    method codegen (line 407) | pub fn codegen(mut self, codegen: codegen::context::CodegenContext) ->...
  function is_dev (line 413) | pub fn is_dev() -> bool {
  function build (line 440) | pub fn build() {
  function try_build (line 456) | pub fn try_build(attributes: Attributes) -> Result<()> {

FILE: crates/tauri-build/src/manifest.rs
  type Diff (line 10) | struct Diff {
  type DependencyKind (line 16) | enum DependencyKind {
  type AllowlistedDependency (line 22) | struct AllowlistedDependency {
  function check (line 30) | pub fn check(config: &Config, manifest: &mut Manifest) -> Result<()> {
  function find_dependency (line 85) | fn find_dependency(manifest: &mut Manifest, name: &str, kind: Dependency...
  function features_diff (line 107) | fn features_diff(current: &[String], expected: &[String]) -> Diff {
  function check_features (line 125) | fn check_features(dependency: Dependency, metadata: &AllowlistedDependen...
  function array_diff (line 185) | fn array_diff() {

FILE: crates/tauri-build/src/mobile.rs
  function generate_gradle_files (line 10) | pub fn generate_gradle_files(project_dir: PathBuf) -> Result<()> {

FILE: crates/tauri-build/src/static_vcruntime.rs
  function build (line 10) | pub fn build() {
  function override_msvcrt_lib (line 29) | fn override_msvcrt_lib() {

FILE: crates/tauri-bundler/src/bundle.rs
  constant BUNDLE_VAR_TOKEN (line 19) | const BUNDLE_VAR_TOKEN: &[u8] = b"__TAURI_BUNDLE_TYPE_VAR_UNK";
  function patch_binary (line 21) | fn patch_binary(binary: &PathBuf, package_type: &PackageType) -> crate::...
  type Bundle (line 98) | pub struct Bundle {
  function bundle_project (line 107) | pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<Bundle>> {
  function sign_binaries_if_needed (line 302) | fn sign_binaries_if_needed(settings: &Settings, target_os: &TargetPlatfo...
  function check_icons (line 348) | pub fn check_icons(settings: &Settings) -> crate::Result<bool> {

FILE: crates/tauri-bundler/src/bundle/category.rs
  constant CONFIDENCE_THRESHOLD (line 8) | const CONFIDENCE_THRESHOLD: f64 = 0.8;
  constant MACOS_APP_CATEGORY_PREFIX (line 10) | const MACOS_APP_CATEGORY_PREFIX: &str = "public.app-category.";
  type AppCategory (line 20) | pub enum AppCategory {
    method canonical (line 100) | fn canonical(self) -> &'static str {
    method freedesktop_categories (line 149) | pub fn freedesktop_categories(self) -> &'static str {
    method macos_application_category_type (line 196) | pub fn macos_application_category_type(self) -> &'static str {
    method deserialize (line 243) | fn deserialize<D: serde::Deserializer<'d>>(deserializer: D) -> Result<...
  type Err (line 64) | type Err = Option<&'static str>;
  method from_str (line 68) | fn from_str(input: &str) -> Result<AppCategory, Self::Err> {
  type AppCategoryVisitor (line 248) | struct AppCategoryVisitor {
    type Value (line 253) | type Value = AppCategory;
    method expecting (line 255) | fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
    method visit_str (line 265) | fn visit_str<E: serde::de::Error>(mut self, value: &str) -> Result<App...
  constant CATEGORY_STRINGS (line 277) | const CATEGORY_STRINGS: &[(&str, AppCategory)] = &[
  function category_from_string_ok (line 359) | fn category_from_string_ok() {
  function category_from_string_did_you_mean (line 404) | fn category_from_string_did_you_mean() {
  function category_from_string_totally_wrong (line 414) | fn category_from_string_totally_wrong() {
  function ls_application_category_type_round_trip (line 420) | fn ls_application_category_type_round_trip() {

FILE: crates/tauri-bundler/src/bundle/kmp/mod.rs
  function index_of (line 8) | pub fn index_of(pattern: &[u8], target: &[u8]) -> Option<usize> {
  function find_failure_function (line 40) | fn find_failure_function(pattern: &[u8]) -> Vec<usize> {

FILE: crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy.rs
  function bundle_project (line 21) | pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
  function prepare_tools (line 226) | fn prepare_tools(tools_path: &Path, arch: &str, verbose: bool) -> crate:...

FILE: crates/tauri-bundler/src/bundle/linux/appimage/mod.rs
  function bundle_project (line 14) | pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
  function write_and_make_executable (line 18) | fn write_and_make_executable(path: &Path, data: Vec<u8>) -> std::io::Res...

FILE: crates/tauri-bundler/src/bundle/linux/debian.rs
  function bundle_project (line 46) | pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
  function generate_data (line 112) | pub fn generate_data(
  function generate_changelog_file (line 145) | fn generate_changelog_file(settings: &Settings, data_dir: &Path) -> crat...
  function generate_control_file (line 162) | fn generate_control_file(
  function generate_scripts (line 265) | fn generate_scripts(settings: &Settings, control_dir: &Path) -> crate::R...
  function create_script_file_from_path (line 288) | fn create_script_file_from_path(from: &PathBuf, to: &PathBuf) -> crate::...
  function generate_md5sums (line 302) | fn generate_md5sums(control_dir: &Path, data_dir: &Path) -> crate::Resul...
  function copy_resource_files (line 329) | fn copy_resource_files(settings: &Settings, data_dir: &Path) -> crate::R...
  function create_file_with_data (line 336) | fn create_file_with_data<P: AsRef<Path>>(path: P, data: &str) -> crate::...
  function total_dir_size (line 345) | fn total_dir_size(dir: &Path) -> crate::Result<u64> {
  function create_tar_from_dir (line 354) | fn create_tar_from_dir<P: AsRef<Path>, W: Write>(src_dir: P, dest_file: ...
  function tar_and_gzip_dir (line 383) | fn tar_and_gzip_dir<P: AsRef<Path>>(src_dir: P) -> crate::Result<PathBuf> {
  function create_archive (line 396) | fn create_archive(srcs: Vec<PathBuf>, dest: &Path) -> crate::Result<()> {

FILE: crates/tauri-bundler/src/bundle/linux/freedesktop/mod.rs
  type Icon (line 35) | pub struct Icon {
  function list_icon_files (line 44) | pub fn list_icon_files(
  function copy_icon_files (line 86) | pub fn copy_icon_files(settings: &Settings, data_dir: &Path) -> crate::R...
  function generate_desktop_file (line 98) | pub fn generate_desktop_file(

FILE: crates/tauri-bundler/src/bundle/linux/rpm.rs
  function bundle_project (line 20) | pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {

FILE: crates/tauri-bundler/src/bundle/macos/app.rs
  constant NESTED_CODE_FOLDER (line 44) | const NESTED_CODE_FOLDER: [&str; 6] = [
  function bundle_project (line 55) | pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
  function remove_extra_attr (line 148) | fn remove_extra_attr(app_bundle_path: &Path) -> crate::Result<()> {
  function copy_binaries_to_bundle (line 158) | fn copy_binaries_to_bundle(
  function copy_custom_files_to_bundle (line 175) | fn copy_custom_files_to_bundle(bundle_directory: &Path, settings: &Setti...
  function create_info_plist (line 204) | fn create_info_plist(
  function copy_framework_from (line 440) | fn copy_framework_from(dest_dir: &Path, framework: &str, src_dir: &Path)...
  function copy_frameworks_to_bundle (line 452) | fn copy_frameworks_to_bundle(
  function add_framework_sign_path (line 515) | fn add_framework_sign_path(
  function add_executable_bundle_sign_path (line 536) | fn add_executable_bundle_sign_path(
  function add_nested_code_sign_path (line 556) | fn add_nested_code_sign_path(src_path: &Path, dest_path: &Path, sign_pat...
  function create_test_bundle (line 613) | fn create_test_bundle(
  function test_copy_custom_file_to_bundle_file (line 647) | fn test_copy_custom_file_to_bundle_file() {
  function test_copy_custom_file_to_bundle_dir (line 667) | fn test_copy_custom_file_to_bundle_dir() {
  function test_copy_custom_files_to_bundle_missing_source (line 699) | fn test_copy_custom_files_to_bundle_missing_source() {
  function test_copy_custom_files_to_bundle_invalid_source (line 716) | fn test_copy_custom_files_to_bundle_invalid_source() {
  function test_copy_custom_files_to_bundle_dev_null (line 733) | fn test_copy_custom_files_to_bundle_dev_null() {

FILE: crates/tauri-bundler/src/bundle/macos/dmg/mod.rs
  type Bundled (line 21) | pub struct Bundled {
  function bundle_project (line 28) | pub fn bundle_project(settings: &Settings, bundles: &[Bundle]) -> crate:...

FILE: crates/tauri-bundler/src/bundle/macos/icon.rs
  function create_icns_file (line 21) | pub fn create_icns_file(out_dir: &Path, settings: &Settings) -> crate::R...
  function make_icns_image (line 103) | fn make_icns_image(img: image::DynamicImage) -> io::Result<icns::Image> {

FILE: crates/tauri-bundler/src/bundle/macos/ios.rs
  function bundle_project (line 34) | pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
  function generate_icon_files (line 75) | fn generate_icon_files(bundle_dir: &Path, settings: &Settings) -> crate:...
  function generate_info_plist (line 143) | fn generate_info_plist(

FILE: crates/tauri-bundler/src/bundle/macos/sign.rs
  type SignTarget (line 14) | pub struct SignTarget {
  function keychain (line 19) | pub fn keychain(identity: Option<&str>) -> crate::Result<Option<tauri_ma...
  function sign (line 46) | pub fn sign(
  function notarize (line 76) | pub fn notarize(
  function notarize_without_stapling (line 86) | pub fn notarize_without_stapling(
  function notarize_auth (line 96) | pub fn notarize_auth() -> Result<tauri_macos_sign::AppleNotarizationCred...
  function find_api_key (line 162) | fn find_api_key(folder: PathBuf, file_name: &OsString) -> Option<PathBuf> {

FILE: crates/tauri-bundler/src/bundle/platform.rs
  type RustCfg (line 14) | struct RustCfg {
  function parse_rust_cfg (line 18) | fn parse_rust_cfg(cfg: String) -> RustCfg {
  function target_triple (line 40) | pub fn target_triple() -> Result<String, crate::Error> {
  function parse_rust_cfg (line 110) | fn parse_rust_cfg() {

FILE: crates/tauri-bundler/src/bundle/settings.rs
  type PackageType (line 26) | pub enum PackageType {
    method from (line 48) | fn from(bundle: BundleType) -> Self {
    method from_short_name (line 64) | pub fn from_short_name(name: &str) -> Option<PackageType> {
    method short_name (line 82) | pub fn short_name(&self) -> &'static str {
    method all (line 97) | pub fn all() -> &'static [PackageType] {
    method priority (line 107) | pub fn priority(&self) -> u32 {
  constant ALL_PACKAGE_TYPES (line 122) | const ALL_PACKAGE_TYPES: &[PackageType] = &[
  type PackageSettings (line 144) | pub struct PackageSettings {
  type UpdaterSettings (line 161) | pub struct UpdaterSettings {
  type DebianSettings (line 172) | pub struct DebianSettings {
  type AppImageSettings (line 220) | pub struct AppImageSettings {
  type RpmSettings (line 231) | pub struct RpmSettings {
  type Position (line 278) | pub struct Position {
  type Size (line 287) | pub struct Size {
  type DmgSettings (line 296) | pub struct DmgSettings {
  type IosSettings (line 311) | pub struct IosSettings {
  type MacOsSettings (line 318) | pub struct MacOsSettings {
  type Entitlements (line 371) | pub enum Entitlements {
  type PlistKind (line 380) | pub enum PlistKind {
  type WixLanguageConfig (line 389) | pub struct WixLanguageConfig {
  type WixLanguage (line 396) | pub struct WixLanguage(pub Vec<(String, WixLanguageConfig)>);
  method default (line 399) | fn default() -> Self {
  type WixSettings (line 406) | pub struct WixSettings {
  type NsisSettings (line 460) | pub struct NsisSettings {
  type CustomSignCommandSettings (line 540) | pub struct CustomSignCommandSettings {
  type WindowsSettings (line 551) | pub struct WindowsSettings {
    method can_sign (line 593) | pub(crate) fn can_sign(&self) -> bool {
  method default (line 603) | fn default() -> Self {
  type BundleSettings (line 622) | pub struct BundleSettings {
  type BundleBinary (line 704) | pub struct BundleBinary {
    method new (line 712) | pub fn new(name: String, main: bool) -> Self {
    method with_path (line 721) | pub fn with_path(name: String, main: bool, src_path: Option<String>) -...
    method set_main (line 730) | pub fn set_main(&mut self, main: bool) {
    method set_name (line 735) | pub fn set_name(&mut self, name: String) {
    method set_src_path (line 741) | pub fn set_src_path(mut self, src_path: Option<String>) -> Self {
    method main (line 747) | pub fn main(&self) -> bool {
    method name (line 752) | pub fn name(&self) -> &str {
    method src_path (line 757) | pub fn src_path(&self) -> Option<&String> {
  type Arch (line 763) | pub enum Arch {
  type Settings (line 782) | pub struct Settings {
    method set_log_level (line 937) | pub fn set_log_level(&mut self, level: log::Level) {
    method log_level (line 942) | pub fn log_level(&self) -> log::Level {
    method project_out_directory (line 947) | pub fn project_out_directory(&self) -> &Path {
    method target (line 952) | pub fn target(&self) -> &str {
    method target_platform (line 957) | pub fn target_platform(&self) -> &TargetPlatform {
    method binary_arch (line 962) | pub fn binary_arch(&self) -> Arch {
    method main_binary (line 983) | pub fn main_binary(&self) -> crate::Result<&BundleBinary> {
    method main_binary_mut (line 992) | pub fn main_binary_mut(&mut self) -> crate::Result<&mut BundleBinary> {
    method main_binary_name (line 1001) | pub fn main_binary_name(&self) -> crate::Result<&str> {
    method binary_path (line 1011) | pub fn binary_path(&self, binary: &BundleBinary) -> PathBuf {
    method binaries (line 1032) | pub fn binaries(&self) -> &Vec<BundleBinary> {
    method package_types (line 1045) | pub fn package_types(&self) -> crate::Result<Vec<PackageType>> {
    method product_name (line 1079) | pub fn product_name(&self) -> &str {
    method bundle_identifier (line 1084) | pub fn bundle_identifier(&self) -> &str {
    method publisher (line 1089) | pub fn publisher(&self) -> Option<&str> {
    method icon_files (line 1094) | pub fn icon_files(&self) -> ResourcePaths<'_> {
    method resource_files (line 1103) | pub fn resource_files(&self) -> ResourcePaths<'_> {
    method external_binaries (line 1117) | pub fn external_binaries(&self) -> ResourcePaths<'_> {
    method copy_binaries (line 1127) | pub fn copy_binaries(&self, path: &Path) -> crate::Result<Vec<PathBuf>> {
    method copy_resources (line 1146) | pub fn copy_resources(&self, path: &Path) -> crate::Result<()> {
    method version_string (line 1156) | pub fn version_string(&self) -> &str {
    method copyright_string (line 1161) | pub fn copyright_string(&self) -> Option<&str> {
    method author_names (line 1166) | pub fn author_names(&self) -> &[String] {
    method authors_comma_separated (line 1174) | pub fn authors_comma_separated(&self) -> Option<String> {
    method license (line 1184) | pub fn license(&self) -> Option<String> {
    method license_file (line 1189) | pub fn license_file(&self) -> Option<PathBuf> {
    method homepage_url (line 1194) | pub fn homepage_url(&self) -> Option<&str> {
    method app_category (line 1203) | pub fn app_category(&self) -> Option<AppCategory> {
    method file_associations (line 1208) | pub fn file_associations(&self) -> Option<&Vec<FileAssociation>> {
    method deep_link_protocols (line 1214) | pub fn deep_link_protocols(&self) -> Option<&Vec<DeepLinkProtocol>> {
    method short_description (line 1219) | pub fn short_description(&self) -> &str {
    method long_description (line 1228) | pub fn long_description(&self) -> Option<&str> {
    method local_tools_directory (line 1233) | pub fn local_tools_directory(&self) -> Option<&Path> {
    method deb (line 1238) | pub fn deb(&self) -> &DebianSettings {
    method appimage (line 1243) | pub fn appimage(&self) -> &AppImageSettings {
    method rpm (line 1248) | pub fn rpm(&self) -> &RpmSettings {
    method dmg (line 1253) | pub fn dmg(&self) -> &DmgSettings {
    method ios (line 1258) | pub fn ios(&self) -> &IosSettings {
    method macos (line 1263) | pub fn macos(&self) -> &MacOsSettings {
    method windows (line 1268) | pub fn windows(&self) -> &WindowsSettings {
    method updater (line 1273) | pub fn updater(&self) -> Option<&UpdaterSettings> {
    method no_sign (line 1278) | pub fn no_sign(&self) -> bool {
    method set_no_sign (line 1283) | pub fn set_no_sign(&mut self, no_sign: bool) {
  type SettingsBuilder (line 810) | pub struct SettingsBuilder {
    method new (line 824) | pub fn new() -> Self {
    method project_out_directory (line 830) | pub fn project_out_directory<P: AsRef<Path>>(mut self, path: P) -> Self {
    method local_tools_directory (line 840) | pub fn local_tools_directory<P: AsRef<Path>>(mut self, path: P) -> Self {
    method package_types (line 849) | pub fn package_types(mut self, package_types: Vec<PackageType>) -> Self {
    method package_settings (line 856) | pub fn package_settings(mut self, settings: PackageSettings) -> Self {
    method bundle_settings (line 863) | pub fn bundle_settings(mut self, settings: BundleSettings) -> Self {
    method binaries (line 870) | pub fn binaries(mut self, binaries: Vec<BundleBinary>) -> Self {
    method target (line 877) | pub fn target(mut self, target: String) -> Self {
    method log_level (line 884) | pub fn log_level(mut self, level: log::Level) -> Self {
    method no_sign (line 891) | pub fn no_sign(mut self, no_sign: bool) -> Self {
    method build (line 901) | pub fn build(self) -> crate::Result<Settings> {

FILE: crates/tauri-bundler/src/bundle/updater_bundle.rs
  function bundle_project (line 29) | pub fn bundle_project(settings: &Settings, bundles: &[Bundle]) -> crate:...
  function bundle_update_macos (line 51) | fn bundle_update_macos(bundles: &[Bundle]) -> crate::Result<Vec<PathBuf>> {
  function bundle_update_linux (line 87) | fn bundle_update_linux(bundles: &[Bundle]) -> crate::Result<Vec<PathBuf>> {
  function bundle_update_windows (line 121) | fn bundle_update_windows(settings: &Settings, bundles: &[Bundle]) -> cra...
  function create_zip (line 204) | pub fn create_zip(src_file: &Path, dst_file: &Path) -> crate::Result<Pat...
  function create_tar (line 231) | fn create_tar(src_dir: &Path, dest_path: &Path) -> crate::Result<PathBuf> {
  function create_tar_from_src (line 245) | fn create_tar_from_src<P: AsRef<Path>, W: Write>(src_dir: P, dest_file: ...
  function create_tar_from_src (line 254) | fn create_tar_from_src<P: AsRef<Path>, W: Write>(src_dir: P, dest_file: ...

FILE: crates/tauri-bundler/src/bundle/windows/msi/mod.rs
  constant WIX_URL (line 39) | pub const WIX_URL: &str =
  constant WIX_SHA256 (line 41) | pub const WIX_SHA256: &str = "6ac824e1642d6f7277d0ed7ea09411a508f6116ba6...
  constant WIX_REQUIRED_FILES (line 43) | const WIX_REQUIRED_FILES: &[&str] = &[
  function bundle_project (line 58) | pub fn bundle_project(settings: &Settings, updater: bool) -> crate::Resu...
  constant UUID_NAMESPACE (line 96) | const UUID_NAMESPACE: [u8; 16] = [
  type ResourceMap (line 101) | type ResourceMap = BTreeMap<String, ResourceDirectory>;
  type LanguageMetadata (line 104) | struct LanguageMetadata {
  type Binary (line 115) | struct Binary {
  type ResourceFile (line 127) | struct ResourceFile {
  type ResourceDirectory (line 139) | struct ResourceDirectory {
    method add_file (line 152) | fn add_file(&mut self, file: ResourceFile) {
    method get_wix_data (line 157) | fn get_wix_data(self) -> crate::Result<(String, Vec<String>)> {
  function copy_icon (line 197) | fn copy_icon(settings: &Settings, filename: &str, path: &Path) -> crate:...
  function app_installer_output_path (line 212) | fn app_installer_output_path(
  function generate_package_guid (line 249) | fn generate_package_guid(settings: &Settings) -> Uuid {
  function generate_guid (line 254) | fn generate_guid(key: &[u8]) -> Uuid {
  function get_and_extract_wix (line 260) | pub fn get_and_extract_wix(path: &Path) -> crate::Result<()> {
  function clear_env_for_wix (line 270) | fn clear_env_for_wix(cmd: &mut Command) {
  function validate_wix_version (line 282) | fn validate_wix_version(version_str: &str) -> crate::Result<()> {
  function convert_version (line 312) | fn convert_version(version_str: &str) -> crate::Result<String> {
  function run_candle (line 344) | fn run_candle(
  function run_light (line 399) | fn run_light(
  function build_wix_app_installer (line 428) | pub fn build_wix_app_installer(
  function generate_binaries_data (line 891) | fn generate_binaries_data(settings: &Settings) -> crate::Result<Vec<Bina...
  type MergeModule (line 939) | struct MergeModule {
  function get_merge_modules (line 944) | fn get_merge_modules(settings: &Settings) -> crate::Result<Vec<MergeModu...
  function generate_resource_data (line 970) | fn generate_resource_data(settings: &Settings) -> crate::Result<Resource...
  function validates_wix_version (line 1109) | fn validates_wix_version() {
  function converts_version_to_wix (line 1124) | fn converts_version_to_wix() {

FILE: crates/tauri-bundler/src/bundle/windows/nsis/mod.rs
  constant NSIS_URL (line 38) | const NSIS_URL: &str =
  constant NSIS_SHA1 (line 41) | const NSIS_SHA1: &str = "EF7FF767E5CBD9EDD22ADD3A32C9B8F4500BB10D";
  constant NSIS_TAURI_UTILS_URL (line 42) | const NSIS_TAURI_UTILS_URL: &str =
  constant NSIS_TAURI_UTILS_SHA1 (line 44) | const NSIS_TAURI_UTILS_SHA1: &str = "75197FEE3C6A814FE035788D1C34EAD3934...
  constant NSIS_REQUIRED_FILES (line 47) | const NSIS_REQUIRED_FILES: &[&str] = &[
  constant NSIS_PLUGIN_FILES (line 62) | const NSIS_PLUGIN_FILES: &[&str] = &[
  constant NSIS_REQUIRED_FILES (line 70) | const NSIS_REQUIRED_FILES: &[&str] = &["Plugins/x86-unicode/additional/n...
  constant NSIS_REQUIRED_FILES_HASH (line 72) | const NSIS_REQUIRED_FILES_HASH: &[(&str, &str, &str, HashAlgorithm)] = &[(
  function bundle_project (line 81) | pub fn bundle_project(settings: &Settings, updater: bool) -> crate::Resu...
  function get_and_extract_nsis (line 123) | fn get_and_extract_nsis(nsis_toolset_path: &Path, _tauri_tools_path: &Pa...
  function try_add_numeric_build_number (line 150) | fn try_add_numeric_build_number(version_str: &str) -> crate::Result<Stri...
  function build_nsis_app_installer (line 174) | fn build_nsis_app_installer(
  function handlebars_or (line 679) | fn handlebars_or(
  function association_description (line 697) | fn association_description(
  function handlebars_no_escape (line 715) | fn handlebars_no_escape(
  type ResourcesMap (line 734) | type ResourcesMap = BTreeMap<PathBuf, (PathBuf, PathBuf)>;
  function generate_resource_data (line 735) | fn generate_resource_data(settings: &Settings) -> crate::Result<Resource...
  type BinariesMap (line 793) | type BinariesMap = BTreeMap<PathBuf, String>;
  function generate_binaries_data (line 794) | fn generate_binaries_data(settings: &Settings) -> crate::Result<Binaries...
  function generate_estimated_size (line 826) | fn generate_estimated_size(
  function get_lang_data (line 847) | fn get_lang_data(lang: &str) -> Option<(String, &[u8])> {
  function write_utf8_with_bom (line 876) | fn write_utf8_with_bom<P: AsRef<Path>, C: AsRef<[u8]>>(path: P, content:...

FILE: crates/tauri-bundler/src/bundle/windows/sign.rs
  method sign_params (line 17) | pub(crate) fn sign_params(&self) -> SignParams {
  type SignParams (line 43) | pub struct SignParams {
  function signtool (line 53) | fn signtool() -> Option<PathBuf> {
  function verify (line 124) | pub fn verify(path: &Path) -> crate::Result<bool> {
  function sign_command_custom (line 135) | pub fn sign_command_custom<P: AsRef<Path>>(
  function sign_command_default (line 162) | pub fn sign_command_default<P: AsRef<Path>>(
  function sign_command (line 188) | pub fn sign_command<P: AsRef<Path>>(path: P, params: &SignParams) -> cra...
  function sign_custom (line 200) | pub fn sign_custom<P: AsRef<Path>>(
  function sign_default (line 219) | pub fn sign_default<P: AsRef<Path>>(path: P, params: &SignParams) -> cra...
  function sign (line 237) | pub fn sign<P: AsRef<Path>>(path: P, params: &SignParams) -> crate::Resu...
  function try_sign (line 249) | pub fn try_sign<P: AsRef<Path>>(file_path: P, settings: &Settings) -> cr...
  function should_sign (line 266) | pub fn should_sign(file_path: &Path) -> crate::Result<bool> {

FILE: crates/tauri-bundler/src/bundle/windows/util.rs
  constant WEBVIEW2_BOOTSTRAPPER_URL (line 13) | pub const WEBVIEW2_BOOTSTRAPPER_URL: &str = "https://go.microsoft.com/fw...
  constant WEBVIEW2_OFFLINE_INSTALLER_X86_URL (line 14) | pub const WEBVIEW2_OFFLINE_INSTALLER_X86_URL: &str =
  constant WEBVIEW2_OFFLINE_INSTALLER_X64_URL (line 16) | pub const WEBVIEW2_OFFLINE_INSTALLER_X64_URL: &str =
  constant WEBVIEW2_URL_PREFIX (line 18) | pub const WEBVIEW2_URL_PREFIX: &str =
  constant NSIS_OUTPUT_FOLDER_NAME (line 20) | pub const NSIS_OUTPUT_FOLDER_NAME: &str = "nsis";
  constant NSIS_UPDATER_OUTPUT_FOLDER_NAME (line 21) | pub const NSIS_UPDATER_OUTPUT_FOLDER_NAME: &str = "nsis-updater";
  constant WIX_OUTPUT_FOLDER_NAME (line 22) | pub const WIX_OUTPUT_FOLDER_NAME: &str = "msi";
  constant WIX_UPDATER_OUTPUT_FOLDER_NAME (line 23) | pub const WIX_UPDATER_OUTPUT_FOLDER_NAME: &str = "msi-updater";
  function webview2_guid_path (line 25) | pub fn webview2_guid_path(url: &str) -> crate::Result<(String, String)> {
  function download_webview2_bootstrapper (line 42) | pub fn download_webview2_bootstrapper(base_path: &Path) -> crate::Result...
  function download_webview2_offline_installer (line 50) | pub fn download_webview2_offline_installer(base_path: &Path, arch: &str)...
  function os_bitness (line 67) | pub fn os_bitness<'a>() -> Option<&'a str> {

FILE: crates/tauri-bundler/src/error.rs
  type Error (line 16) | pub enum Error {
  type NotarizeAuthError (line 184) | pub enum NotarizeAuthError {
  type Result (line 196) | pub type Result<T> = std::result::Result<T, Error>;
  type Context (line 198) | pub trait Context<T> {
    method context (line 200) | fn context<C>(self, context: C) -> Result<T>
    method with_context (line 203) | fn with_context<C, F>(self, f: F) -> Result<T>
  function context (line 210) | fn context<C>(self, context: C) -> Result<T>
  function with_context (line 217) | fn with_context<C, F>(self, f: F) -> Result<T>
  function context (line 227) | fn context<C>(self, context: C) -> Result<T>
  function with_context (line 234) | fn with_context<C, F>(self, f: F) -> Result<T>
  type ErrorExt (line 243) | pub trait ErrorExt<T> {
    method fs_context (line 244) | fn fs_context(self, context: &'static str, path: impl Into<PathBuf>) -...
  function fs_context (line 248) | fn fs_context(self, context: &'static str, path: impl Into<PathBuf>) -> ...

FILE: crates/tauri-bundler/src/utils/fs_utils.rs
  function create_file (line 14) | pub fn create_file(path: &Path) -> crate::Result<BufWriter<File>> {
  function create_dir (line 25) | pub fn create_dir(path: &Path, erase: bool) -> crate::Result<()> {
  function create_dir_all (line 35) | pub fn create_dir_all(path: &Path, erase: bool) -> crate::Result<()> {
  function remove_dir_all (line 44) | pub fn remove_dir_all(path: &Path) -> crate::Result<()> {
  function symlink_dir (line 55) | fn symlink_dir(src: &Path, dst: &Path) -> io::Result<()> {
  function symlink_dir (line 61) | fn symlink_dir(src: &Path, dst: &Path) -> io::Result<()> {
  function symlink_file (line 68) | fn symlink_file(src: &Path, dst: &Path) -> io::Result<()> {
  function symlink_file (line 74) | fn symlink_file(src: &Path, dst: &Path) -> io::Result<()> {
  function copy_file (line 81) | pub fn copy_file(from: &Path, to: &Path) -> crate::Result<()> {
  function copy_dir (line 103) | pub fn copy_dir(from: &Path, to: &Path) -> crate::Result<()> {
  function copy_custom_files (line 151) | pub fn copy_custom_files(
  function create_file_with_parent_dirs (line 176) | fn create_file_with_parent_dirs() {
  function copy_dir_with_symlinks (line 190) | fn copy_dir_with_symlinks() {

FILE: crates/tauri-bundler/src/utils/http_utils.rs
  constant BUNDLER_USER_AGENT (line 17) | const BUNDLER_USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", en...
  function generate_github_mirror_url_from_template (line 19) | fn generate_github_mirror_url_from_template(github_url: &str) -> Option<...
  function generate_github_mirror_url_from_base (line 35) | fn generate_github_mirror_url_from_base(github_url: &str) -> Option<Stri...
  function generate_github_alternative_url (line 45) | fn generate_github_alternative_url(url: &str) -> Option<(ureq::Agent, St...
  function create_agent_and_url (line 63) | fn create_agent_and_url(url: &str) -> (ureq::Agent, String) {
  function base_ureq_agent (line 67) | pub(crate) fn base_ureq_agent() -> ureq::Agent {
  function download (line 86) | pub fn download(url: &str) -> crate::Result<Vec<u8>> {
  type HashAlgorithm (line 99) | pub enum HashAlgorithm {
  function download_and_verify (line 107) | pub fn download_and_verify(
  function verify_hash (line 119) | pub fn verify_hash(data: &[u8], hash: &str, hash_algorithm: HashAlgorith...
  function verify_data_with_hasher (line 133) | fn verify_data_with_hasher(data: &[u8], hash: &str, mut hasher: impl Dig...
  function verify_file_hash (line 146) | pub fn verify_file_hash<P: AsRef<Path>>(
  function extract_zip (line 157) | pub fn extract_zip(data: &[u8], path: &Path) -> crate::Result<()> {
  constant GITHUB_ASSET_URL (line 194) | const GITHUB_ASSET_URL: &str =
  constant NON_GITHUB_ASSET_URL (line 196) | const NON_GITHUB_ASSET_URL: &str = "https://someotherwebsite.com/somefil...
  function test_generate_mirror_url_no_env_var (line 199) | fn test_generate_mirror_url_no_env_var() {
  function test_generate_mirror_url_non_github_url (line 206) | fn test_generate_mirror_url_non_github_url() {
  type TestCase (line 215) | struct TestCase {
  function test_generate_mirror_url_correctly (line 221) | fn test_generate_mirror_url_correctly() {

FILE: crates/tauri-bundler/src/utils/mod.rs
  function is_retina (line 22) | pub fn is_retina(path: &Path) -> bool {
  type CommandExt (line 30) | pub trait CommandExt {
    method piped (line 33) | fn piped(&mut self) -> std::io::Result<ExitStatus>;
    method output_ok (line 34) | fn output_ok(&mut self) -> crate::Result<Output>;
    method piped (line 38) | fn piped(&mut self) -> std::io::Result<ExitStatus> {
    method output_ok (line 48) | fn output_ok(&mut self) -> crate::Result<Output> {
  function retina_icon_paths (line 121) | fn retina_icon_paths() {
  function resource_relative_paths (line 127) | fn resource_relative_paths() {

FILE: crates/tauri-cli/build.rs
  function main (line 5) | fn main() {

FILE: crates/tauri-cli/src/acl/capability/mod.rs
  type Cli (line 13) | pub struct Cli {
  type Commands (line 19) | enum Commands {
  function command (line 24) | pub fn command(cli: Cli) -> Result<()> {

FILE: crates/tauri-cli/src/acl/capability/new.rs
  type Options (line 14) | pub struct Options {
  function command (line 34) | pub fn command(options: Options) -> Result<()> {

FILE: crates/tauri-cli/src/acl/mod.rs
  type FileFormat (line 13) | enum FileFormat {
    method extension (line 28) | pub fn extension(&self) -> &'static str {
    method serialize (line 35) | pub fn serialize<S: Serialize>(&self, s: &S) -> crate::Result<String> {
  method fmt (line 19) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {

FILE: crates/tauri-cli/src/acl/permission/add.rs
  type TomlOrJson (line 16) | enum TomlOrJson {
    method identifier (line 22) | fn identifier(&self) -> &str {
    method platforms (line 35) | fn platforms(&self) -> Option<Vec<&str>> {
    method insert_permission (line 57) | fn insert_permission(&mut self, identifier: String) {
    method has_permission (line 81) | fn has_permission(&self, identifier: &str) -> bool {
    method to_string (line 101) | fn to_string(&self) -> Result<String> {
  function capability_from_path (line 111) | fn capability_from_path<P: AsRef<Path>>(path: P) -> Option<TomlOrJson> {
  type Options (line 127) | pub struct Options {
  function command (line 134) | pub fn command(options: Options) -> Result<()> {

FILE: crates/tauri-cli/src/acl/permission/ls.rs
  type Options (line 18) | pub struct Options {
  function command (line 26) | pub fn command(options: Options) -> Result<()> {

FILE: crates/tauri-cli/src/acl/permission/mod.rs
  type Cli (line 16) | pub struct Cli {
  type Commands (line 22) | enum Commands {
  function command (line 32) | pub fn command(cli: Cli) -> Result<()> {

FILE: crates/tauri-cli/src/acl/permission/new.rs
  type Options (line 20) | pub struct Options {
  function command (line 40) | pub fn command(options: Options) -> Result<()> {

FILE: crates/tauri-cli/src/acl/permission/rm.rs
  function rm_permission_files (line 17) | fn rm_permission_files(identifier: &str, dir: &Path) -> Result<()> {
  function rm_permission_from_capabilities (line 103) | fn rm_permission_from_capabilities(identifier: &str, dir: &Path) -> Resu...
  function identifier_match (line 176) | fn identifier_match(identifier: &str, permission: &str) -> bool {
  type Options (line 185) | pub struct Options {
  function command (line 192) | pub fn command(options: Options) -> Result<()> {

FILE: crates/tauri-cli/src/add.rs
  type Options (line 24) | pub struct Options {
  function command (line 41) | pub fn command(options: Options) -> Result<()> {
  function run (line 46) | pub fn run(options: Options, dirs: &Dirs) -> Result<()> {

FILE: crates/tauri-cli/src/build.rs
  type Options (line 27) | pub struct Options {
  function command (line 84) | pub fn command(mut options: Options, verbosity: u8) -> Result<()> {
  function setup (line 140) | pub fn setup(

FILE: crates/tauri-cli/src/bundle.rs
  type BundleFormat (line 28) | pub struct BundleFormat(PackageType);
  type Err (line 31) | type Err = crate::Error;
  method from_str (line 32) | fn from_str(s: &str) -> crate::Result<Self> {
  method value_variants (line 40) | fn value_variants<'a>() -> &'a [Self] {
  method to_possible_value (line 45) | fn to_possible_value(&self) -> Option<PossibleValue> {
  type Options (line 56) | pub struct Options {
    method from (line 106) | fn from(value: crate::build::Options) -> Self {
  function command (line 120) | pub fn command(options: Options, verbosity: u8) -> crate::Result<()> {
  function bundle (line 163) | pub fn bundle<A: AppSettings>(
  function sign_updaters (line 226) | fn sign_updaters(
  function print_signed_updater_archive (line 316) | fn print_signed_updater_archive(output_paths: &[PathBuf]) -> crate::Resu...

FILE: crates/tauri-cli/src/completions.rs
  constant PKG_MANAGERS (line 11) | const PKG_MANAGERS: &[&str] = &["cargo", "pnpm", "npm", "yarn", "bun", "...
  type Options (line 15) | pub struct Options {
  function completions_for (line 24) | fn completions_for(shell: Shell, manager: &'static str, cmd: Command) ->...
  function get_completions (line 43) | fn get_completions(shell: Shell, cmd: Command) -> Result<String> {
  function command (line 92) | pub fn command(options: Options, cmd: Command) -> Result<()> {

FILE: crates/tauri-cli/src/dev.rs
  constant KILL_CHILDREN_SCRIPT (line 38) | const KILL_CHILDREN_SCRIPT: &[u8] = include_bytes!("../scripts/kill-chil...
  constant TAURI_CLI_BUILTIN_WATCHER_IGNORE_FILE (line 40) | pub const TAURI_CLI_BUILTIN_WATCHER_IGNORE_FILE: &[u8] =
  type Options (line 49) | pub struct Options {
  function command (line 99) | pub fn command(options: Options) -> Result<()> {
  function command_internal (line 109) | fn command_internal(mut options: Options, dirs: Dirs) -> Result<()> {
  function setup (line 136) | pub fn setup(
  function on_app_exit (line 322) | pub fn on_app_exit(code: Option<i32>, reason: ExitReason, exit_on_panic:...
  function kill_before_dev_process (line 332) | pub fn kill_before_dev_process() {

FILE: crates/tauri-cli/src/dev/builtin_dev_server.rs
  constant RELOAD_SCRIPT (line 23) | const RELOAD_SCRIPT: &str = include_str!("./auto-reload.js");
  type ServerState (line 26) | struct ServerState {
  function start (line 32) | pub fn start<P: AsRef<Path>>(dir: P, ip: IpAddr, port: Option<u16>) -> c...
  function handler (line 84) | async fn handler(uri: Uri, state: State<ServerState>) -> impl IntoRespon...
  function ws_handler (line 115) | async fn ws_handler(ws: WebSocketUpgrade, state: State<ServerState>) -> ...
  function inject_address (line 130) | fn inject_address(html_bytes: Vec<u8>, address: &SocketAddr) -> Vec<u8> {
  function fs_read_scoped (line 157) | fn fs_read_scoped(path: PathBuf, scope: &Path) -> crate::Result<Vec<u8>> {
  function watch (line 166) | fn watch<F: Fn() + Send + 'static>(dir: PathBuf, handler: F) {

FILE: crates/tauri-cli/src/error.rs
  type Error (line 8) | pub enum Error {
  type Result (line 32) | pub type Result<T> = std::result::Result<T, Error>;
  type Context (line 34) | pub trait Context<T> {
    method context (line 36) | fn context<C>(self, context: C) -> Result<T>
    method with_context (line 39) | fn with_context<C, F>(self, f: F) -> Result<T>
  function context (line 46) | fn context<C>(self, context: C) -> Result<T>
  function with_context (line 53) | fn with_context<C, F>(self, f: F) -> Result<T>
  function context (line 63) | fn context<C>(self, context: C) -> Result<T>
  function with_context (line 70) | fn with_context<C, F>(self, f: F) -> Result<T>
  type ErrorExt (line 79) | pub trait ErrorExt<T> {
    method fs_context (line 80) | fn fs_context(self, context: &'static str, path: impl Into<PathBuf>) -...
  function fs_context (line 84) | fn fs_context(self, context: &'static str, path: impl Into<PathBuf>) -> ...

FILE: crates/tauri-cli/src/helpers/app_paths.rs
  constant TAURI_GITIGNORE (line 20) | const TAURI_GITIGNORE: &[u8] = include_bytes!("../../tauri.gitignore");
  constant ENV_TAURI_APP_PATH (line 22) | const ENV_TAURI_APP_PATH: &str = "TAURI_APP_PATH";
  constant ENV_TAURI_FRONTEND_PATH (line 24) | const ENV_TAURI_FRONTEND_PATH: &str = "TAURI_FRONTEND_PATH";
  type Dirs (line 26) | pub struct Dirs {
  function walk_builder (line 34) | pub fn walk_builder(path: &Path) -> WalkBuilder {
  function lookup (line 52) | fn lookup<F: Fn(&PathBuf) -> bool>(dir: &Path, checker: F) -> Option<Pat...
  function env_tauri_app_path (line 82) | fn env_tauri_app_path() -> Option<PathBuf> {
  function env_tauri_frontend_path (line 87) | fn env_tauri_frontend_path() -> Option<PathBuf> {
  function resolve_tauri_dir (line 92) | pub fn resolve_tauri_dir() -> Option<PathBuf> {
  function resolve_dirs (line 130) | pub fn resolve_dirs() -> Dirs {
  function resolve_frontend_dir (line 146) | pub fn resolve_frontend_dir() -> Option<PathBuf> {

FILE: crates/tauri-cli/src/helpers/cargo.rs
  type CargoInstallOptions (line 10) | pub struct CargoInstallOptions<'a> {
  function install_one (line 20) | pub fn install_one(options: CargoInstallOptions) -> crate::Result<()> {
  type CargoUninstallOptions (line 69) | pub struct CargoUninstallOptions<'a> {
  function uninstall_one (line 75) | pub fn uninstall_one(options: CargoUninstallOptions) -> crate::Result<()> {

FILE: crates/tauri-cli/src/helpers/cargo_manifest.rs
  type CargoLockPackage (line 16) | pub struct CargoLockPackage {
  type CargoLock (line 23) | pub struct CargoLock {
  type CargoManifestDependencyPackage (line 28) | pub struct CargoManifestDependencyPackage {
  type CargoManifestDependency (line 38) | pub enum CargoManifestDependency {
  type CargoManifestPackage (line 44) | pub struct CargoManifestPackage {
  type CargoManifest (line 49) | pub struct CargoManifest {
  function cargo_manifest_and_lock (line 54) | pub fn cargo_manifest_and_lock(tauri_dir: &Path) -> (Option<CargoManifes...
  type CrateVersion (line 67) | pub struct CrateVersion {
    method has_version (line 77) | pub fn has_version(&self) -> bool {
    method fmt (line 83) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type CrateMetadata (line 116) | struct CrateMetadata {
  type CrateIoGetResponse (line 125) | struct CrateIoGetResponse {
  function crate_latest_version (line 131) | pub fn crate_latest_version(name: &str) -> Option<String> {
  function crate_version (line 140) | pub fn crate_version(

FILE: crates/tauri-cli/src/helpers/config.rs
  constant MERGE_CONFIG_EXTENSION_NAME (line 23) | pub const MERGE_CONFIG_EXTENSION_NAME: &str = "--config";
  type ConfigMetadata (line 25) | pub struct ConfigMetadata {
    type Target (line 38) | type Target = Config;
    method deref (line 41) | fn deref(&self) -> &Config {
    method original_identifier (line 49) | pub fn original_identifier(&self) -> Option<&str> {
    method find_bundle_identifier_overwriter (line 54) | pub fn find_bundle_identifier_overwriter(&self) -> Option<OsString> {
  function wix_settings (line 69) | pub fn wix_settings(config: WixConfig) -> tauri_bundler::WixSettings {
  function nsis_settings (line 107) | pub fn nsis_settings(config: NsisConfig) -> tauri_bundler::NsisSettings {
  function custom_sign_settings (line 124) | pub fn custom_sign_settings(
  function config_schema_validator (line 141) | fn config_schema_validator() -> &'static jsonschema::Validator {
  function load_config (line 151) | fn load_config(
  function get_config (line 237) | pub fn get_config(
  function reload_config (line 245) | pub fn reload_config(
  function merge_config_with (line 256) | pub fn merge_config_with(
  function merge_patches (line 280) | fn merge_patches(doc: &mut serde_json::Value, patch: &serde_json::Value) {
  function merge_patches (line 300) | fn merge_patches() {

FILE: crates/tauri-cli/src/helpers/flock.rs
  type FileLock (line 17) | pub struct FileLock {
    method file (line 32) | pub fn file(&self) -> &File {
    method path (line 40) | pub fn path(&self) -> &Path {
    method parent (line 46) | pub fn parent(&self) -> &Path {
  type State (line 24) | enum State {
  method read (line 53) | fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
  method seek (line 59) | fn seek(&mut self, to: SeekFrom) -> io::Result<u64> {
  method write (line 65) | fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  method flush (line 69) | fn flush(&mut self) -> io::Result<()> {
  method drop (line 75) | fn drop(&mut self) {
  function open_rw (line 94) | pub fn open_rw<P>(path: P, msg: &str) -> Result<FileLock>
  function open_ro (line 115) | pub fn open_ro<P>(path: P, msg: &str) -> Result<FileLock>
  function open (line 127) | fn open(path: &Path, opts: &OpenOptions, state: State, msg: &str) -> Res...
  function acquire (line 183) | fn acquire(
  function lock_shared (line 258) | pub(super) fn lock_shared(file: &File) -> Result<()> {
  function lock_exclusive (line 262) | pub(super) fn lock_exclusive(file: &File) -> Result<()> {
  function try_lock_shared (line 266) | pub(super) fn try_lock_shared(file: &File) -> Result<()> {
  function try_lock_exclusive (line 270) | pub(super) fn try_lock_exclusive(file: &File) -> Result<()> {
  function unlock (line 274) | pub(super) fn unlock(file: &File) -> Result<()> {
  function error_contended (line 278) | pub(super) fn error_contended(err: &Error) -> bool {
  function error_unsupported (line 282) | pub(super) fn error_unsupported(err: &Error) -> bool {
  function flock (line 294) | fn flock(file: &File, flag: libc::c_int) -> Result<()> {
  function flock (line 304) | fn flock(file: &File, flag: libc::c_int) -> Result<()> {
  function lock_shared (line 322) | pub(super) fn lock_shared(file: &File) -> Result<()> {
  function lock_exclusive (line 326) | pub(super) fn lock_exclusive(file: &File) -> Result<()> {
  function try_lock_shared (line 330) | pub(super) fn try_lock_shared(file: &File) -> Result<()> {
  function try_lock_exclusive (line 334) | pub(super) fn try_lock_exclusive(file: &File) -> Result<()> {
  function error_contended (line 338) | pub(super) fn error_contended(err: &Error) -> bool {
  function error_unsupported (line 342) | pub(super) fn error_unsupported(err: &Error) -> bool {
  function unlock (line 346) | pub(super) fn unlock(file: &File) -> Result<()> {
  function lock_file (line 355) | fn lock_file(file: &File, flags: LOCK_FILE_FLAGS) -> Result<()> {

FILE: crates/tauri-cli/src/helpers/framework.rs
  type Framework (line 8) | pub enum Framework {
    method dev_url (line 24) | pub fn dev_url(&self) -> String {
    method frontend_dist (line 42) | pub fn frontend_dist(&self) -> String {
    method fmt (line 62) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  type Bundler (line 81) | pub enum Bundler {
    method fmt (line 88) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  function infer_from_package_json (line 97) | pub fn infer_from_package_json(package_json: &str) -> (Option<Framework>...

FILE: crates/tauri-cli/src/helpers/fs.rs
  function copy_file (line 11) | pub fn copy_file(from: impl AsRef<Path>, to: impl AsRef<Path>) -> crate:...
  function find_in_directory (line 39) | pub fn find_in_directory(path: &Path, glob_pattern: &str) -> crate::Resu...

FILE: crates/tauri-cli/src/helpers/http.rs
  constant CLI_USER_AGENT (line 7) | const CLI_USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("...
  function get (line 9) | pub fn get(url: &str) -> Result<Response<Body>, ureq::Error> {

FILE: crates/tauri-cli/src/helpers/mod.rs
  function command_env (line 35) | pub fn command_env(debug: bool) -> HashMap<&'static str, String> {
  function resolve_tauri_path (line 50) | pub fn resolve_tauri_path<P: AsRef<Path>>(path: P, crate_name: &str) -> ...
  function cross_command (line 59) | pub fn cross_command(bin: &str) -> Command {
  function run_hook (line 71) | pub fn run_hook(
  function strip_semver_prerelease_tag (line 130) | pub fn strip_semver_prerelease_tag(version: &mut semver::Version) -> cra...

FILE: crates/tauri-cli/src/helpers/npm.rs
  function manager_version (line 13) | pub fn manager_version(package_manager: &str) -> Option<String> {
  function detect_yarn_or_berry (line 29) | fn detect_yarn_or_berry() -> PackageManager {
  type PackageManager (line 41) | pub enum PackageManager {
    method from_project (line 69) | pub fn from_project<P: AsRef<Path>>(path: P) -> Self {
    method from_environment_variable (line 77) | fn from_environment_variable() -> Option<Self> {
    method all_from_project (line 90) | pub fn all_from_project<P: AsRef<Path>>(path: P) -> Vec<Self> {
    method cross_command (line 115) | fn cross_command(&self) -> Command {
    method install (line 126) | pub fn install<P: AsRef<Path>>(
    method remove (line 168) | pub fn remove<P: AsRef<Path>>(
    method current_package_version (line 210) | pub fn current_package_version<P: AsRef<Path>>(
    method current_package_versions (line 284) | pub fn current_package_versions(
  method fmt (line 51) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  function yarn_package_versions (line 355) | fn yarn_package_versions(
  function yarn_berry_package_versions (line 410) | fn yarn_berry_package_versions(

FILE: crates/tauri-cli/src/helpers/pbxproj.rs
  function parse (line 13) | pub fn parse<P: AsRef<Path>>(path: P) -> crate::Result<Pbxproj> {
  function split_at_identation (line 158) | fn split_at_identation(s: &str) -> Option<(&str, &str)> {
  type State (line 164) | enum State {
  type Pbxproj (line 176) | pub struct Pbxproj {
    method fmt (line 189) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    method has_changes (line 198) | pub fn has_changes(&self) -> bool {
    method serialize (line 202) | fn serialize(&self) -> String {
    method save (line 221) | pub fn save(&self) -> std::io::Result<()> {
    method set_build_settings (line 225) | pub fn set_build_settings(&mut self, build_configuration_id: &str, key...
  type XCBuildConfiguration (line 263) | pub struct XCBuildConfiguration {
    method get_build_setting (line 268) | pub fn get_build_setting(&self, key: &str) -> Option<&BuildSettings> {
  type BuildSettings (line 274) | pub struct BuildSettings {
  type XCConfigurationList (line 282) | pub struct XCConfigurationList {
  type BuildConfigurationRef (line 288) | pub struct BuildConfigurationRef {
  function parse (line 296) | fn parse() {
  function modify (line 311) | fn modify() {

FILE: crates/tauri-cli/src/helpers/plist.rs
  type PlistKind (line 9) | pub enum PlistKind {
    method from (line 15) | fn from(p: PathBuf) -> Self {
    method from (line 20) | fn from(p: plist::Value) -> Self {
  function merge_plist (line 25) | pub fn merge_plist(src: Vec<PlistKind>) -> crate::Result<plist::Value> {

FILE: crates/tauri-cli/src/helpers/plugins.rs
  type PluginMetadata (line 8) | pub struct PluginMetadata {
  function known_plugins (line 17) | pub fn known_plugins() -> HashMap<&'static str, PluginMetadata> {
  function version_req (line 87) | fn version_req() -> String {

FILE: crates/tauri-cli/src/helpers/prompts.rs
  function input (line 9) | pub fn input<T>(
  function confirm (line 39) | pub fn confirm(prompt: &str, default: Option<bool>) -> Result<bool> {
  function multiselect (line 48) | pub fn multiselect<T: ToString>(

FILE: crates/tauri-cli/src/helpers/template.rs
  type JsonMap (line 21) | pub struct JsonMap(Map<String, JsonValue>);
    method insert (line 30) | pub fn insert(&mut self, name: &str, value: impl Serialize) {
    method inner (line 34) | pub fn inner(&self) -> &Map<String, JsonValue> {
  method default (line 24) | fn default() -> Self {
  function render (line 39) | pub fn render<P: AsRef<Path>, D: Serialize>(
  function render_with_generator (line 58) | pub fn render_with_generator<

FILE: crates/tauri-cli/src/helpers/updater_signature.rs
  type KeyPair (line 21) | pub struct KeyPair {
  function create_file (line 26) | fn create_file(path: &Path) -> crate::Result<BufWriter<File>> {
  function generate_key (line 35) | pub fn generate_key(password: Option<String>) -> crate::Result<KeyPair> {
  function decode_key (line 51) | pub fn decode_key<S: AsRef<[u8]>>(base64_key: S) -> crate::Result<String> {
  function save_keypair (line 61) | pub fn save_keypair<P>(
  function sign_file (line 117) | pub fn sign_file<P>(secret_key: &SecretKey, bin_path: P) -> crate::Resul...
  function secret_key (line 163) | pub fn secret_key<S: AsRef<[u8]>>(
  function pub_key (line 177) | pub fn pub_key<S: AsRef<[u8]>>(public_key: S) -> crate::Result<PublicKey> {
  function unix_timestamp (line 187) | fn unix_timestamp() -> u64 {
  function open_data_file (line 195) | fn open_data_file<P>(data_path: P) -> crate::Result<BufReader<File>>
  constant PRIVATE_KEY (line 212) | const PRIVATE_KEY: &str = "dW50cnVzdGVkIGNvbW1lbnQ6IHJzaWduIGVuY3J5cHRlZ...
  function empty_password_is_valid (line 216) | fn empty_password_is_valid() {
  function generate_empty_password_keys_and_use (line 228) | fn generate_empty_password_keys_and_use() {

FILE: crates/tauri-cli/src/icon.rs
  type IcnsEntry (line 35) | struct IcnsEntry {
  type PngEntry (line 41) | struct PngEntry {
  type AndroidIconKind (line 47) | enum AndroidIconKind {
  type AndroidEntries (line 52) | struct AndroidEntries {
  type Manifest (line 60) | struct Manifest {
  type Options (line 71) | pub struct Options {
  type Source (line 107) | enum Source {
    method width (line 113) | fn width(&self) -> u32 {
    method height (line 120) | fn height(&self) -> u32 {
    method resize_exact (line 127) | fn resize_exact(&self, size: u32) -> DynamicImage {
  function resize_image (line 155) | fn resize_image(image: &DynamicImage, new_width: u32, new_height: u32) -...
  function read_source (line 180) | fn read_source(path: PathBuf) -> Result<Source> {
  function parse_bg_color (line 216) | fn parse_bg_color(bg_color_string: &String) -> Result<Rgba<u8>> {
  function command (line 236) | pub fn command(options: Options) -> Result<()> {
  function parse_manifest (line 299) | fn parse_manifest(manifest_path: &Path) -> Result<Manifest> {
  function appx (line 312) | fn appx(source: &Source, out_dir: &Path) -> Result<()> {
  function icns (line 327) | fn icns(source: &Source, out_dir: &Path) -> Result<()> {
  function ico (line 368) | fn ico(source: &Source, out_dir: &Path) -> Result<()> {
  function android (line 407) | fn android(
  function png (line 664) | fn png(source: &Source, out_dir: &Path, ios_color: Rgba<u8>) -> Result<(...
  type Background (line 792) | enum Background<'a> {
  function resize_png (line 798) | fn resize_png(
  function resize_and_save_png (line 834) | fn resize_and_save_png(
  function write_png (line 851) | fn write_png<W: Write>(image_data: &[u8], w: W, size: u32) -> image::Ima...
  function content_bounds (line 858) | fn content_bounds(img: &DynamicImage) -> Option<(u32, u32, u32, u32)> {
  function resize_asset (line 896) | fn resize_asset(img: &DynamicImage, target_size: u32, scale_percent: f32...
  function apply_round_mask (line 933) | fn apply_round_mask(

FILE: crates/tauri-cli/src/info/app.rs
  function items (line 10) | pub fn items(config: &ConfigMetadata, frontend_dir: Option<&PathBuf>) ->...

FILE: crates/tauri-cli/src/info/env_nodejs.rs
  function items (line 10) | pub fn items(metadata: &VersionMetadata) -> Vec<SectionItem> {

FILE: crates/tauri-cli/src/info/env_rust.rs
  function component_version (line 10) | fn component_version(component: &str) -> Option<(String, Status)> {
  function items (line 29) | pub fn items() -> Vec<SectionItem> {

FILE: crates/tauri-cli/src/info/env_system.rs
  type VsInstanceInfo (line 16) | struct VsInstanceInfo {
  constant VSWHERE (line 21) | const VSWHERE: &[u8] = include_bytes!("../../scripts/vswhere.exe");
  function build_tools_version (line 24) | fn build_tools_version() -> crate::Result<Vec<String>> {
  function webview2_version (line 103) | fn webview2_version() -> crate::Result<Option<String>> {
  function pkg_conf_version (line 161) | fn pkg_conf_version(package: &str) -> Option<String> {
  function webkit2gtk_ver (line 180) | fn webkit2gtk_ver() -> Option<String> {
  function rsvg2_ver (line 190) | fn rsvg2_ver() -> Option<String> {
  function is_xcode_command_line_tools_installed (line 195) | fn is_xcode_command_line_tools_installed() -> bool {
  function xcode_version (line 204) | pub fn xcode_version() -> Option<String> {
  function de_and_session (line 218) | fn de_and_session() -> String {
  function items (line 246) | pub fn items() -> Vec<SectionItem> {

FILE: crates/tauri-cli/src/info/ios.rs
  function items (line 9) | pub fn items() -> Vec<SectionItem> {

FILE: crates/tauri-cli/src/info/mod.rs
  type JsCliVersionMetadata (line 28) | struct JsCliVersionMetadata {
  type VersionMetadata (line 35) | pub struct VersionMetadata {
  function version_metadata (line 40) | fn version_metadata() -> Result<VersionMetadata> {
  type Status (line 46) | pub enum Status {
    method color (line 55) | fn color<S: AsRef<str>>(&self, s: S) -> ColoredString {
  method fmt (line 67) | fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
  type ActionResult (line 82) | pub enum ActionResult {
    method from (line 93) | fn from(value: String) -> Self {
    method from (line 99) | fn from(value: (String, Status)) -> Self {
    method from (line 108) | fn from(value: Option<String>) -> Self {
    method from (line 114) | fn from(value: Option<(String, Status)>) -> Self {
  type SectionItem (line 124) | pub struct SectionItem {
    method new (line 145) | fn new() -> Self {
    method action (line 154) | fn action<F: FnMut() -> ActionResult + 'static>(mut self, action: F) -...
    method description (line 164) | fn description<S: AsRef<str>>(mut self, description: S) -> Self {
    method run_action (line 169) | fn run_action(&mut self) {
    method run_action_if_err (line 177) | fn run_action_if_err(&mut self) {
    method apply_action_result (line 185) | fn apply_action_result(&mut self, result: ActionResult) {
    method run (line 201) | fn run(&mut self, interactive: bool) -> Status {
  method fmt (line 133) | fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
  type Section (line 223) | struct Section<'a> {
  function display (line 230) | fn display(&mut self) {
  type Options (line 257) | pub struct Options {
  function command (line 263) | pub fn command(options: Options) -> Result<()> {

FILE: crates/tauri-cli/src/info/packages_nodejs.rs
  type YarnVersionInfo (line 18) | struct YarnVersionInfo {
  function npm_latest_version (line 22) | pub fn npm_latest_version(pm: &PackageManager, name: &str) -> crate::Res...
  function package_manager (line 108) | pub fn package_manager(frontend_dir: &PathBuf) -> PackageManager {
  function items (line 133) | pub fn items(
  function nodejs_section_item (line 153) | pub fn nodejs_section_item(

FILE: crates/tauri-cli/src/info/packages_rust.rs
  function items (line 12) | pub fn items(frontend_dir: Option<&PathBuf>, tauri_dir: Option<&Path>) -...
  function rust_section_item (line 69) | pub fn rust_section_item(dep: &str, crate_version: CrateVersion) -> Sect...

FILE: crates/tauri-cli/src/info/plugins.rs
  type InstalledPackage (line 23) | pub struct InstalledPackage {
  type InstalledPackages (line 31) | pub struct InstalledPackages(Vec<InstalledPackage>);
    method mismatched (line 34) | pub fn mismatched(&self) -> Vec<&InstalledPackage> {
  function installed_tauri_packages (line 45) | pub fn installed_tauri_packages(
  function items (line 107) | pub fn items(
  function check_mismatched_packages (line 141) | pub fn check_mismatched_packages(frontend_dir: &Path, tauri_path: &Path)...

FILE: crates/tauri-cli/src/init.rs
  constant TEMPLATE_DIR (line 28) | const TEMPLATE_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/template...
  constant TAURI_CONF_TEMPLATE (line 29) | const TAURI_CONF_TEMPLATE: &str = include_str!("../templates/tauri.conf....
  type Options (line 33) | pub struct Options {
    method load (line 77) | fn load(mut self) -> Result<Self> {
  type InitDefaults (line 71) | struct InitDefaults {
  function default_dev_command (line 168) | fn default_dev_command(pm: PackageManager) -> &'static str {
  function default_build_command (line 179) | fn default_build_command(pm: PackageManager) -> &'static str {
  function command (line 190) | pub fn command(mut options: Options) -> Result<()> {

FILE: crates/tauri-cli/src/inspect.rs
  type Cli (line 13) | pub struct Cli {
  type Commands (line 19) | enum Commands {
  function command (line 24) | pub fn command(cli: Cli) -> Result<()> {
  function wix_upgrade_code (line 32) | fn wix_upgrade_code(tauri_dir: &Path) -> Result<()> {

FILE: crates/tauri-cli/src/interface/mod.rs
  type DevProcess (line 17) | pub trait DevProcess {
    method kill (line 18) | fn kill(&self) -> std::io::Result<()>;
    method wait (line 20) | fn wait(&self) -> std::io::Result<ExitStatus>;
    method manually_killed_process (line 22) | fn manually_killed_process(&self) -> bool;
  type AppSettings (line 25) | pub trait AppSettings {
    method get_package_settings (line 26) | fn get_package_settings(&self) -> tauri_bundler::PackageSettings;
    method get_bundle_settings (line 27) | fn get_bundle_settings(
    method app_binary_path (line 34) | fn app_binary_path(&self, options: &Options, tauri_dir: &Path) -> crat...
    method get_binaries (line 35) | fn get_binaries(
    method app_name (line 40) | fn app_name(&self) -> Option<String>;
    method lib_name (line 41) | fn lib_name(&self) -> Option<String>;
    method get_bundler_settings (line 43) | fn get_bundler_settings(
  type ExitReason (line 93) | pub enum ExitReason {

FILE: crates/tauri-cli/src/interface/rust.rs
  type Options (line 50) | pub struct Options {
    method from (line 63) | fn from(options: crate::build::Options) -> Self {
    method from (line 79) | fn from(options: crate::bundle::Options) -> Self {
    method from (line 93) | fn from(options: crate::dev::Options) -> Self {
  type MobileOptions (line 109) | pub struct MobileOptions {
  type WatcherOptions (line 119) | pub struct WatcherOptions {
  type RustupTarget (line 125) | pub struct RustupTarget {
  type Rust (line 130) | pub struct Rust {
    method new (line 138) | pub fn new(config: &Config, target: Option<String>, tauri_dir: &Path) ...
    method app_settings (line 179) | pub fn app_settings(&self) -> Arc<RustAppSettings> {
    method build (line 183) | pub fn build(&mut self, options: Options, dirs: &Dirs) -> crate::Resul...
    method dev (line 194) | pub fn dev<F: Fn(Option<i32>, ExitReason) + Send + Sync + 'static>(
    method mobile_dev (line 240) | pub fn mobile_dev<
    method watch (line 274) | pub fn watch<R: Fn(&ConfigMetadata) -> crate::Result<Box<dyn DevProces...
    method env (line 291) | pub fn env(&self) -> HashMap<&str, String> {
    method build_options (line 484) | pub fn build_options(&self, args: &mut Vec<String>, features: &mut Vec...
    method run_dev (line 495) | fn run_dev<F: Fn(Option<i32>, ExitReason) + Send + Sync + 'static>(
    method run_dev_watcher (line 510) | fn run_dev_watcher<
  type IgnoreMatcher (line 325) | struct IgnoreMatcher(Vec<Gitignore>);
    method is_ignore (line 328) | fn is_ignore(&self, path: &Path, is_dir: bool) -> bool {
  function build_ignore_matcher (line 342) | fn build_ignore_matcher(dir: &Path) -> IgnoreMatcher {
  function lookup (line 385) | fn lookup<F: FnMut(FileType, PathBuf)>(dir: &Path, mut f: F) {
  function dev_options (line 409) | fn dev_options(
  function get_watch_folders (line 453) | fn get_watch_folders(
  type MaybeWorkspace (line 608) | pub enum MaybeWorkspace<T> {
  function deserialize (line 614) | fn deserialize<D>(deserializer: D) -> Result<MaybeWorkspace<T>, D::Error>
  function resolve (line 630) | fn resolve(
  function _as_defined (line 648) | fn _as_defined(&self) -> Option<&T> {
  type TomlWorkspaceField (line 657) | pub struct TomlWorkspaceField {
  type WorkspaceSettings (line 663) | struct WorkspaceSettings {
  type WorkspacePackageSettings (line 670) | struct WorkspacePackageSettings {
  type BinarySettings (line 680) | struct BinarySettings {
    method file_name (line 690) | pub fn file_name(&self) -> &str {
  type CargoPackageSettings (line 698) | pub struct CargoPackageSettings {
  type CargoSettings (line 717) | struct CargoSettings {
    method load (line 732) | fn load(dir: &Path) -> crate::Result<Self> {
  type RustAppSettings (line 743) | pub struct RustAppSettings {
    method new (line 1054) | pub fn new(
    method target (line 1170) | fn target<'a>(&'a self, options: &'a Options) -> Option<&'a str> {
    method out_dir (line 1177) | pub fn out_dir(&self, options: &Options, tauri_dir: &Path) -> crate::R...
  type DesktopDeepLinks (line 757) | enum DesktopDeepLinks {
  type UpdaterConfig (line 763) | pub struct UpdaterConfig {
  type WindowsUpdateInstallMode (line 773) | pub enum WindowsUpdateInstallMode {
    method deserialize (line 787) | fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
    method msiexec_args (line 805) | pub fn msiexec_args(&self) -> &'static [&'static str] {
  type UpdaterWindowsConfig (line 816) | pub struct UpdaterWindowsConfig {
  method get_package_settings (line 822) | fn get_package_settings(&self) -> PackageSettings {
  method get_bundle_settings (line 826) | fn get_bundle_settings(
  method app_binary_path (line 907) | fn app_binary_path(&self, options: &Options, tauri_dir: &Path) -> crate:...
  method get_binaries (line 934) | fn get_binaries(&self, options: &Options, tauri_dir: &Path) -> crate::Re...
  method app_name (line 1024) | fn app_name(&self) -> Option<String> {
  method lib_name (line 1038) | fn lib_name(&self) -> Option<String> {
  type CargoMetadata (line 1183) | pub(crate) struct CargoMetadata {
  type Package (line 1191) | struct Package {
  type Dependency (line 1199) | struct Dependency {
  function get_cargo_metadata (line 1205) | pub(crate) fn get_cargo_metadata(tauri_dir: &Path) -> crate::Result<Carg...
  function get_in_workspace_dependency_paths (line 1226) | fn get_in_workspace_dependency_paths(tauri_dir: &Path) -> crate::Result<...
  function find_dependencies (line 1256) | fn find_dependencies(
  function get_cargo_target_dir (line 1278) | pub(crate) fn get_cargo_target_dir(args: &[String], tauri_dir: &Path) ->...
  function get_target_dir (line 1294) | fn get_target_dir(
  function get_cargo_option (line 1311) | fn get_cargo_option<'a>(args: &'a [String], option: &'a str) -> Option<&...
  function get_workspace_dir (line 1324) | pub fn get_workspace_dir(tauri_dir: &Path) -> crate::Result<PathBuf> {
  function get_profile (line 1332) | pub fn get_profile(options: &Options) -> &str {
  function get_profile_dir (line 1340) | pub fn get_profile_dir(options: &Options) -> &str {
  function tauri_config_to_bundle_settings (line 1348) | fn tauri_config_to_bundle_settings(
  type TrayKind (line 1688) | pub enum TrayKind {
  function get_appindicator_library_path (line 1693) | pub fn get_appindicator_library_path() -> (TrayKind, String) {
  function get_library_path (line 1710) | pub fn get_library_path(name: &str) -> Option<String> {
  function parse_cargo_option (line 1734) | fn parse_cargo_option() {
  function parse_profile_from_opts (line 1753) | fn parse_profile_from_opts() {
  function parse_target_dir_from_opts (line 1814) | fn parse_target_dir_from_opts() {

FILE: crates/tauri-cli/src/interface/rust/cargo_config.rs
  type PathAncestors (line 18) | struct PathAncestors<'a> {
  function new (line 23) | fn new(path: &'a Path) -> PathAncestors<'a> {
  type Item (line 31) | type Item = &'a Path;
  method next (line 33) | fn next(&mut self) -> Option<&'a Path> {
  type BuildConfig (line 45) | pub struct BuildConfig {
    method target (line 102) | pub fn target(&self) -> Option<&str> {
  type ConfigSchema (line 50) | pub struct ConfigSchema {
  type Config (line 55) | pub struct Config {
    method load (line 60) | pub fn load(path: &Path) -> Result<Self> {
    method build (line 96) | pub fn build(&self) -> &BuildConfig {
  function get_file_path (line 112) | fn get_file_path(

FILE: crates/tauri-cli/src/interface/rust/desktop.rs
  type DevChild (line 24) | pub struct DevChild {
  method kill (line 30) | fn kill(&self) -> std::io::Result<()> {
  method wait (line 36) | fn wait(&self) -> std::io::Result<ExitStatus> {
  method manually_killed_process (line 40) | fn manually_killed_process(&self) -> bool {
  function run_dev (line 45) | pub fn run_dev<F: Fn(Option<i32>, ExitReason) + Send + Sync + 'static>(
  function build (line 151) | pub fn build(
  function build_production_app (line 205) | fn build_production_app(
  function cargo_command (line 231) | fn cargo_command(
  function fetch_available_targets (line 280) | fn fetch_available_targets() -> Option<Vec<RustupTarget>> {
  function validate_target (line 300) | fn validate_target(
  function rename_app (line 321) | fn rename_app(
  function stderr_width (line 345) | pub fn stderr_width() -> Option<usize> {
  function stderr_width (line 379) | pub fn stderr_width() -> Option<usize> {

FILE: crates/tauri-cli/src/interface/rust/installation.rs
  function installed_targets (line 12) | pub fn installed_targets() -> Result<Vec<String>> {

FILE: crates/tauri-cli/src/interface/rust/manifest.rs
  type Manifest (line 19) | pub struct Manifest {
    method features (line 25) | pub fn features(&self) -> HashMap<String, Vec<String>> {
    method all_enabled_features (line 50) | pub fn all_enabled_features(&self, enabled_features: &[String]) -> Vec...
  function get_enabled_features (line 66) | fn get_enabled_features(list: &HashMap<String, Vec<String>>, feature: &s...
  function read_manifest (line 82) | pub fn read_manifest(manifest_path: &Path) -> crate::Result<(DocumentMut...
  function serialize_manifest (line 93) | pub fn serialize_manifest(manifest: &DocumentMut) -> String {
  function toml_array (line 105) | pub fn toml_array(features: &HashSet<String>) -> Array {
  function find_dependency (line 115) | fn find_dependency<'a>(
  function write_features (line 151) | fn write_features<F: Fn(&str) -> bool>(
  type DependencyKind (line 185) | enum DependencyKind {
  type DependencyAllowlist (line 191) | struct DependencyAllowlist {
  function inject_features_table (line 198) | fn inject_features_table<D: TableLike, F: Fn(&str) -> bool>(
  function inject_features (line 237) | fn inject_features(
  function rewrite_manifest (line 272) | pub fn rewrite_manifest(config: &Config, tauri_dir: &Path) -> crate::Res...
  function inject_features (line 338) | fn inject_features(toml: &str, mut dependencies: Vec<DependencyAllowlist...
  function tauri_dependency (line 401) | fn tauri_dependency(features: HashSet<String>) -> DependencyAllowlist {
  function tauri_build_dependency (line 410) | fn tauri_build_dependency(features: HashSet<String>) -> DependencyAllowl...
  function inject_features_table (line 420) | fn inject_features_table() {
  function inject_features_target (line 441) | fn inject_features_target() {
  function inject_features_inline_table (line 464) | fn inject_features_inline_table() {
  function inject_features_string (line 486) | fn inject_features_string() {

FILE: crates/tauri-cli/src/lib.rs
  type ConfigValue (line 54) | pub struct ConfigValue(pub(crate) serde_json::Value);
  type Err (line 57) | type Err = Error;
  method from_str (line 59) | fn from_str(config: &str) -> std::result::Result<Self, Self::Err> {
  type RunMode (line 93) | pub enum RunMode {
  method fmt (line 101) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type VersionMetadata (line 116) | pub struct VersionMetadata {
  type PackageJson (line 125) | pub struct PackageJson {
  type Cli (line 142) | pub(crate) struct Cli {
  type Commands (line 151) | enum Commands {
  function format_error (line 173) | fn format_error<I: CommandFactory>(err: clap::Error) -> clap::Error {
  function get_verbosity (line 178) | fn get_verbosity(cli_verbose: u8) -> u8 {
  function run (line 197) | pub fn run<I, A>(args: I, bin_name: Option<String>)
  function try_run (line 211) | pub fn try_run<I, A>(args: I, bin_name: Option<String>) -> Result<()>
  function verbosity_level (line 301) | fn verbosity_level(num: u8) -> Level {
  function prettyprint_level (line 310) | fn prettyprint_level(lvl: Level) -> &'static str {
  type CommandExt (line 320) | pub trait CommandExt {
    method piped (line 323) | fn piped(&mut self) -> std::io::Result<ExitStatus>;
    method output_ok (line 324) | fn output_ok(&mut self) -> crate::Result<Output>;
    method piped (line 328) | fn piped(&mut self) -> std::io::Result<ExitStatus> {
    method output_ok (line 344) | fn output_ok(&mut self) -> crate::Result<Output> {
  function verify_cli (line 429) | fn verify_cli() {
  function help_output_includes_build (line 434) | fn help_output_includes_build() {

FILE: crates/tauri-cli/src/main.rs
  function main (line 6) | fn main() {
  function main (line 12) | fn main() {

FILE: crates/tauri-cli/src/migrate/migrations/v1/config.rs
  function migrate (line 19) | pub fn migrate(tauri_dir: &Path) -> Result<MigratedConfig> {
  type MigratedConfig (line 75) | pub struct MigratedConfig {
  function migrate_config (line 80) | fn migrate_config(config: &mut Value) -> Result<MigratedConfig> {
  function process_package_metadata (line 187) | fn process_package_metadata(config: &mut Map<String, Value>) {
  function process_build (line 221) | fn process_build(config: &mut Map<String, Value>) {
  function process_bundle (line 261) | fn process_bundle(config: &mut Map<String, Value>, migrated: &MigratedCo...
  function process_security (line 388) | fn process_security(security: &mut Map<String, Value>) -> Result<()> {
  function process_allowlist (line 439) | fn process_allowlist(
  function allowlist_to_permissions (line 468) | fn allowlist_to_permissions(
  function process_cli (line 659) | fn process_cli(plugins: &mut Map<String, Value>, cli: Value) -> Result<(...
  function process_updater (line 669) | fn process_updater(
  constant KNOWN_PLUGINS (line 700) | const KNOWN_PLUGINS: &[&str] = &[
  function plugins_from_permissions (line 712) | fn plugins_from_permissions(permissions: &Vec<PermissionEntry>) -> HashS...
  function migrate (line 730) | fn migrate(original: &serde_json::Value) -> serde_json::Value {
  function migrate_full (line 765) | fn migrate_full() {
  function skips_migrating_updater (line 963) | fn skips_migrating_updater() {
  function migrate_updater_pubkey (line 977) | fn migrate_updater_pubkey() {
  function migrate_dangerous_use_http_scheme (line 995) | fn migrate_dangerous_use_http_scheme() {
  function can_migrate_default_config (line 1017) | fn can_migrate_default_config() {
  function can_migrate_api_example_config (line 1023) | fn can_migrate_api_example_config() {
  function can_migrate_cli_template_config (line 1030) | fn can_migrate_cli_template_config() {
  function migrate_updater_target (line 1037) | fn migrate_updater_target() {
  function migrate_csp_object (line 1124) | fn migrate_csp_object() {
  function migrate_csp_existing_connect_src_string (line 1148) | fn migrate_csp_existing_connect_src_string() {
  function migrate_csp_existing_connect_src_array (line 1180) | fn migrate_csp_existing_connect_src_array() {
  function migrate_invalid_url_dev_path (line 1215) | fn migrate_invalid_url_dev_path() {
  function migrate_webview_fixed_runtime_path (line 1233) | fn migrate_webview_fixed_runtime_path() {

FILE: crates/tauri-cli/src/migrate/migrations/v1/frontend.rs
  constant RENAMED_MODULES (line 21) | const RENAMED_MODULES: phf::Map<&str, &str> = phf::phf_map! {
  constant PLUGINIFIED_MODULES (line 25) | const PLUGINIFIED_MODULES: [&str; 11] = [
  constant MODULES_MAP (line 39) | const MODULES_MAP: phf::Map<&str, &str> = phf::phf_map! {
  constant JS_EXTENSIONS (line 68) | const JS_EXTENSIONS: &[&str] = &["js", "mjs", "jsx", "ts", "mts", "tsx",...
  function migrate (line 71) | pub fn migrate(frontend_dir: &Path) -> Result<Vec<String>> {
  function migrate_imports (line 137) | fn migrate_imports<'a>(
  function migrates_vue (line 363) | fn migrates_vue() {
  function migrates_svelte (line 447) | fn migrates_svelte() {
  function migrates_js (line 515) | fn migrates_js() {

FILE: crates/tauri-cli/src/migrate/migrations/v1/frontend/partial_loader/mod.rs
  constant SCRIPT_START (line 14) | const SCRIPT_START: &str = "<script";
  constant SCRIPT_END (line 15) | const SCRIPT_END: &str = "</script>";
  type JavaScriptSource (line 18) | pub struct JavaScriptSource<'a> {
  function new (line 27) | pub fn new(source_text: &'a str, source_type: SourceType, start: usize) ...
  type PartialLoader (line 36) | pub struct PartialLoader;
    method parse (line 41) | pub fn parse<'a>(ext: &str, source_text: &'a str) -> Option<Vec<JavaSc...
  function find_script_closing_angle (line 52) | fn find_script_closing_angle(source_text: &str, pointer: usize) -> Optio...

FILE: crates/tauri-cli/src/migrate/migrations/v1/frontend/partial_loader/svelte.rs
  type SveltePartialLoader (line 12) | pub struct SveltePartialLoader<'a> {
  function new (line 17) | pub fn new(source_text: &'a str) -> Self {
  function parse (line 21) | pub fn parse(self) -> Vec<JavaScriptSource<'a>> {
  function parse_script (line 27) | fn parse_script(&self) -> Option<JavaScriptSource<'a>> {
  function parse_svelte (line 63) | fn parse_svelte(source_text: &str) -> JavaScriptSource<'_> {
  function test_parse_svelte (line 69) | fn test_parse_svelte() {
  function test_parse_svelte_ts_with_generic (line 82) | fn test_parse_svelte_ts_with_generic() {

FILE: crates/tauri-cli/src/migrate/migrations/v1/frontend/partial_loader/vue.rs
  type VuePartialLoader (line 12) | pub struct VuePartialLoader<'a> {
  function new (line 17) | pub fn new(source_text: &'a str) -> Self {
  function parse (line 21) | pub fn parse(self) -> Vec<JavaScriptSource<'a>> {
  function parse_scripts (line 29) | fn parse_scripts(&self) -> Vec<JavaScriptSource<'a>> {
  function parse_script (line 40) | fn parse_script(&self, pointer: &mut usize) -> Option<JavaScriptSource<'...
  function parse_vue (line 77) | fn parse_vue(source_text: &str) -> JavaScriptSource<'_> {
  function test_parse_vue_one_line (line 83) | fn test_parse_vue_one_line() {
  function test_build_vue_with_ts_flag_1 (line 96) | fn test_build_vue_with_ts_flag_1() {
  function test_build_vue_with_ts_flag_2 (line 109) | fn test_build_vue_with_ts_flag_2() {
  function test_build_vue_with_ts_flag_3 (line 122) | fn test_build_vue_with_ts_flag_3() {
  function test_build_vue_with_tsx_flag (line 135) | fn test_build_vue_with_tsx_flag() {
  function test_build_vue_with_escape_string (line 149) | fn test_build_vue_with_escape_string() {
  function test_multi_level_template_literal (line 163) | fn test_multi_level_template_literal() {
  function test_brace_with_regex_in_template_literal (line 175) | fn test_brace_with_regex_in_template_literal() {
  function test_no_script (line 187) | fn test_no_script() {
  function test_syntax_error (line 197) | fn test_syntax_error() {
  function test_multiple_scripts (line 207) | fn test_multiple_scripts() {
  function test_unicode (line 220) | fn test_unicode() {

FILE: crates/tauri-cli/src/migrate/migrations/v1/manifest.rs
  constant CRATE_TYPES (line 16) | const CRATE_TYPES: [&str; 3] = ["lib", "staticlib", "cdylib"];
  function migrate (line 18) | pub fn migrate(tauri_dir: &Path) -> Result<()> {
  function migrate_manifest (line 29) | fn migrate_manifest(manifest: &mut DocumentMut) -> Result<()> {
  function find_dependency (line 124) | fn find_dependency<'a>(
  function features_to_rename (line 155) | fn features_to_rename() -> Vec<(&'static str, &'static str)> {
  function features_to_remove (line 165) | fn features_to_remove() -> Vec<&'static str> {
  function dependency_version (line 195) | fn dependency_version() -> String {
  function migrate_dependency (line 208) | fn migrate_dependency(item: &mut Item, version: &str, remove: &[&str], r...
  function migrate_dependency_table (line 218) | fn migrate_dependency_table<D: TableLike>(
  function migrate_deps (line 257) | fn migrate_deps<F: FnOnce(&[&str]) -> String>(get_toml: F) {
  function migrate_table (line 345) | fn migrate_table() {
  function migrate_inline_table (line 358) | fn migrate_inline_table() {
  function migrate_str (line 372) | fn migrate_str() {
  function migrate_add_crate_types (line 383) | fn migrate_add_crate_types() {

FILE: crates/tauri-cli/src/migrate/migrations/v1/mod.rs
  function run (line 11) | pub fn run(dirs: &Dirs) -> Result<()> {

FILE: crates/tauri-cli/src/migrate/migrations/v2_beta.rs
  function run (line 16) | pub fn run(dirs: &Dirs) -> Result<()> {
  function migrate_npm_dependencies (line 31) | fn migrate_npm_dependencies(frontend_dir: &Path) -> Result<()> {
  function migrate_permissions (line 80) | fn migrate_permissions(tauri_dir: &Path) -> Result<()> {
  function migrate_manifest (line 112) | fn migrate_manifest(manifest: &mut DocumentMut) -> Result<()> {
  function migrate_dependency (line 168) | fn migrate_dependency(dependencies: &mut Table, name: &str, version: &st...
  function migrate_dependency_table (line 190) | fn migrate_dependency_table<D: TableLike>(dep: &mut D, version: &str) {

FILE: crates/tauri-cli/src/migrate/mod.rs
  function command (line 16) | pub fn command() -> Result<()> {

FILE: crates/tauri-cli/src/mobile/android/android_studio_script.rs
  type Options (line 24) | pub struct Options {
  function command (line 40) | pub fn command(options: Options) -> Result<()> {
  function validate_lib (line 163) | fn validate_lib(path: &Path) -> Result<()> {
  function adb_forward_port (line 189) | fn adb_forward_port(
  function run_adb_reverse (line 298) | fn run_adb_reverse(
  function adb_reverse_list (line 311) | fn adb_reverse_list(

FILE: crates/tauri-cli/src/mobile/android/build.rs
  type Options (line 37) | pub struct Options {
  method from (line 95) | fn from(options: Options) -> Self {
  type BuiltApplication (line 113) | pub struct BuiltApplication {
  function command (line 121) | pub fn command(options: Options, noise_level: NoiseLevel) -> Result<Buil...
  function run (line 135) | pub fn run(
  function run_build (line 241) | fn run_build(
  function get_targets_or_all (line 320) | fn get_targets_or_all<'a>(targets: Vec<String>) -> Result<Vec<&'a Target...

FILE: crates/tauri-cli/src/mobile/android/dev.rs
  type Options (line 45) | pub struct Options {
  method from (line 114) | fn from(options: Options) -> Self {
  function command (line 133) | pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> {
  function run_command (line 143) | fn run_command(options: Options, noise_level: NoiseLevel, dirs: Dirs) ->...
  function run_dev (line 229) | fn run_dev(
  function run (line 357) | fn run(

FILE: crates/tauri-cli/src/mobile/android/mod.rs
  constant NDK_VERSION (line 50) | const NDK_VERSION: &str = "29.0.13846066";
  constant SDK_VERSION (line 51) | const SDK_VERSION: u8 = 36;
  constant CMDLINE_TOOLS_URL (line 54) | const CMDLINE_TOOLS_URL: &str =
  constant CMDLINE_TOOLS_URL (line 57) | const CMDLINE_TOOLS_URL: &str =
  constant CMDLINE_TOOLS_URL (line 60) | const CMDLINE_TOOLS_URL: &str =
  type Cli (line 71) | pub struct Cli {
  type InitOptions (line 78) | pub struct InitOptions {
  type Commands (line 97) | enum Commands {
  function command (line 106) | pub fn command(cli: Cli, verbosity: u8) -> Result<()> {
  function get_config (line 125) | pub fn get_config(
  function env (line 191) | pub fn env(non_interactive: bool) -> Result<Env> {
  function download_cmdline_tools (line 197) | fn download_cmdline_tools(extract_path: &Path) -> Result<()> {
  function ensure_env (line 223) | fn ensure_env(non_interactive: bool) -> Result<()> {
  function ensure_java (line 230) | fn ensure_java() -> Result<()> {
  function ensure_sdk (line 250) | fn ensure_sdk(non_interactive: bool) -> Result<()> {
  function ensure_ndk (line 346) | fn ensure_ndk(non_interactive: bool) -> Result<()> {
  function delete_codegen_vars (line 430) | fn delete_codegen_vars() {
  function adb_device_prompt (line 438) | fn adb_device_prompt<'a>(env: &'_ Env, target: Option<&str>) -> Result<D...
  function emulator_prompt (line 484) | fn emulator_prompt(env: &'_ Env, target: Option<&str>) -> Result<emulato...
  function device_prompt (line 525) | fn device_prompt<'a>(env: &'_ Env, target: Option<&str>) -> Result<Devic...
  function detect_target_ok (line 550) | fn detect_target_ok<'a>(env: &Env) -> Option<&'a Target<'a>> {
  function open_and_wait (line 554) | fn open_and_wait(config: &AndroidConfig, env: &Env) -> ! {
  function inject_resources (line 564) | fn inject_resources(config: &AndroidConfig, tauri_config: &TauriConfig) ...
  function configure_cargo (line 596) | fn configure_cargo(env: &mut Env, config: &AndroidConfig) -> Result<()> {
  function generate_tauri_properties (line 617) | fn generate_tauri_properties(

FILE: crates/tauri-cli/src/mobile/android/project.rs
  constant TEMPLATE_DIR (line 33) | const TEMPLATE_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/template...
  function gen (line 35) | pub fn gen(
  function generate_out_file (line 160) | fn generate_out_file(

FILE: crates/tauri-cli/src/mobile/android/run.rs
  type Options (line 27) | pub struct Options {
  function command (line 66) | pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> {

FILE: crates/tauri-cli/src/mobile/init.rs
  function command (line 26) | pub fn command(
  function exec (line 48) | fn exec(
  function handlebars (line 180) | fn handlebars(app: &App) -> (Handlebars<'static>, JsonMap) {
  function get_str (line 203) | fn get_str<'a>(helper: &'a Helper) -> &'a str {
  function get_str_array (line 210) | fn get_str_array(helper: &Helper, formatter: impl Fn(&str) -> String) ->...
  function html_escape (line 218) | fn html_escape(
  function join (line 230) | fn join(
  function quote_and_join (line 248) | fn quote_and_join(
  function quote_and_join_colon_prefix (line 270) | fn quote_and_join_colon_prefix(
  function snake_case (line 292) | fn snake_case(
  function escape_kotlin_keyword (line 305) | fn escape_kotlin_keyword(
  function app_root (line 327) | fn app_root(ctx: &Context) -> std::result::Result<&str, RenderError> {
  function prefix_path (line 341) | fn prefix_path(
  function unprefix_path (line 361) | fn unprefix_path(
  function is_pnpm_dlx (line 386) | fn is_pnpm_dlx() -> bool {

FILE: crates/tauri-cli/src/mobile/ios/build.rs
  type Options (line 47) | pub struct Options {
  type ExportMethod (line 103) | pub enum ExportMethod {
    method pre_xcode_15_4_name (line 111) | pub fn pre_xcode_15_4_name(&self) -> String {
    method fmt (line 121) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
    type Err (line 131) | type Err = &'static str;
    method from_str (line 133) | fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
  method from (line 144) | fn from(options: Options) -> Self {
  type BuiltApplication (line 162) | pub struct BuiltApplication {
  function command (line 170) | pub fn command(options: Options, noise_level: NoiseLevel) -> Result<Buil...
  function run (line 175) | pub fn run(options: Options, noise_level: NoiseLevel, dirs: &Dirs) -> Re...
  function run_build (line 354) | fn run_build(
  function auth_credentials_from_env (line 541) | fn auth_credentials_from_env() -> Result<Option<cargo_mobile2::apple::Au...

FILE: crates/tauri-cli/src/mobile/ios/dev.rs
  constant PHYSICAL_IPHONE_DEV_WARNING (line 40) | const PHYSICAL_IPHONE_DEV_WARNING: &str = "To develop on physical phones...
  type Options (line 54) | pub struct Options {
  method from (line 121) | fn from(options: Options) -> Self {
  function command (line 140) | pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> {
  function run_command (line 150) | fn run_command(options: Options, noise_level: NoiseLevel, dirs: Dirs) ->...
  function run_dev (line 277) | fn run_dev(
  function run (line 376) | fn run(

FILE: crates/tauri-cli/src/mobile/ios/mod.rs
  constant APPLE_DEVELOPMENT_TEAM_ENV_VAR_NAME (line 54) | pub const APPLE_DEVELOPMENT_TEAM_ENV_VAR_NAME: &str = "APPLE_DEVELOPMENT...
  constant LIB_OUTPUT_FILE_NAME (line 55) | pub const LIB_OUTPUT_FILE_NAME: &str = "libapp.a";
  type Cli (line 65) | pub struct Cli {
  type InitOptions (line 72) | pub struct InitOptions {
  type Commands (line 94) | enum Commands {
  function command (line 103) | pub fn command(cli: Cli, verbosity: u8) -> Result<()> {
  function get_config (line 122) | pub fn get_config(
  function connected_device_prompt (line 284) | fn connected_device_prompt<'a>(env: &'_ Env, target: Option<&str>) -> Re...
  type InstalledRuntimesList (line 333) | struct InstalledRuntimesList {
  type InstalledRuntime (line 338) | struct InstalledRuntime {
  function simulator_prompt (line 342) | fn simulator_prompt(env: &'_ Env, target: Option<&str>) -> Result<device...
  function device_prompt (line 401) | fn device_prompt<'a>(env: &'_ Env, target: Option<&str>) -> Result<Devic...
  function ensure_ios_runtime_installed (line 414) | fn ensure_ios_runtime_installed() -> Result<()> {
  function detect_target_ok (line 450) | fn detect_target_ok<'a>(env: &Env) -> Option<&'a Target<'a>> {
  function open_and_wait (line 454) | fn open_and_wait(config: &AppleConfig, env: &Env) -> ! {
  function inject_resources (line 464) | fn inject_resources(config: &AppleConfig, tauri_config: &TauriConfig) ->...
  function signing_from_env (line 484) | pub fn signing_from_env() -> Result<(
  type ProjectConfig (line 519) | pub struct ProjectConfig {
  function project_config (line 525) | pub fn project_config(
  function load_pbxproj (line 536) | pub fn load_pbxproj(config: &AppleConfig) -> Result<pbxproj::Pbxproj> {
  function synchronize_project_config (line 545) | pub fn synchronize_project_config(

FILE: crates/tauri-cli/src/mobile/ios/project.rs
  constant TEMPLATE_DIR (line 29) | const TEMPLATE_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/template...
  function gen (line 34) | pub fn gen(

FILE: crates/tauri-cli/src/mobile/ios/run.rs
  type Options (line 24) | pub struct Options {
  function command (line 63) | pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> {

FILE: crates/tauri-cli/src/mobile/ios/xcode_script.rs
  type Options (line 28) | pub struct Options {
  function command (line 55) | pub fn command(options: Options) -> Result<()> {
  function validate_lib (line 318) | fn validate_lib(path: &Path) -> Result<()> {

FILE: crates/tauri-cli/src/mobile/mod.rs
  constant MIN_DEVICE_MATCH_SCORE (line 51) | const MIN_DEVICE_MATCH_SCORE: isize = 0;
  type DevChild (line 54) | pub struct DevChild {
    method new (line 60) | fn new(handle: ChildHandle) -> Self {
  method kill (line 69) | fn kill(&self) -> std::io::Result<()> {
  method wait (line 75) | fn wait(&self) -> std::io::Result<ExitStatus> {
  method manually_killed_process (line 79) | fn manually_killed_process(&self) -> bool {
  type Target (line 85) | pub enum Target {
    method ide_name (line 92) | fn ide_name(&self) -> &'static str {
    method command_name (line 100) | fn command_name(&self) -> &'static str {
    method ide_build_script_name (line 108) | fn ide_build_script_name(&self) -> &'static str {
    method platform_target (line 116) | fn platform_target(&self) -> tauri_utils::platform::Target {
  type TargetDevice (line 126) | pub struct TargetDevice {
  type DevHost (line 132) | pub struct DevHost(Option<Option<IpAddr>>);
  type Err (line 135) | type Err = AddrParseError;
  method from_str (line 136) | fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
  method fmt (line 148) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  method default (line 158) | fn default() -> Self {
  type CliOptions (line 170) | pub struct CliOptions {
  function local_ip_address (line 180) | fn local_ip_address(force: bool) -> &'static IpAddr {
  type DevUrlConfig (line 221) | struct DevUrlConfig {
  function use_network_address_for_dev_url (line 225) | fn use_network_address_for_dev_url(
  function env_vars (line 306) | fn env_vars() -> HashMap<String, OsString> {
  function env (line 326) | fn env() -> std::result::Result<Env, EnvError> {
  type OptionsHandle (line 331) | pub struct OptionsHandle(#[allow(unused)] Runtime, #[allow(unused)] Serv...
  function write_options (line 334) | pub fn write_options(
  function read_options (line 372) | fn read_options(config: &ConfigMetadata) -> CliOptions {
  function get_app (line 411) | pub fn get_app(
  function ensure_init (line 471) | fn ensure_init(
  function ensure_gradlew (line 589) | fn ensure_gradlew(project_dir: &std::path::Path) -> Result<()> {
  function log_finished (line 613) | fn log_finished(outputs: Vec<PathBuf>, kind: &str) {

FILE: crates/tauri-cli/src/plugin/android.rs
  type Cli (line 28) | pub struct Cli {
  type Commands (line 34) | enum Commands {
  type InitOptions (line 40) | pub struct InitOptions {
  function command (line 50) | pub fn command(cli: Cli) -> Result<()> {

FILE: crates/tauri-cli/src/plugin/init.rs
  constant TEMPLATE_DIR (line 24) | pub const TEMPLATE_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/temp...
  type Options (line 28) | pub struct Options {
    method load (line 71) | fn load(&mut self) {
  function command (line 82) | pub fn command(mut options: Options) -> Result<()> {
  function plugin_name_data (line 273) | pub fn plugin_name_data(data: &mut BTreeMap<&'static str, serde_json::Va...
  function crates_metadata (line 286) | pub fn crates_metadata() -> Result<VersionMetadata> {
  function generate_android_out_file (line 291) | pub fn generate_android_out_file(

FILE: crates/tauri-cli/src/plugin/ios.rs
  type Cli (line 26) | pub struct Cli {
  type Commands (line 32) | enum Commands {
  type InitOptions (line 38) | pub struct InitOptions {
  function command (line 52) | pub fn command(cli: Cli) -> Result<()> {

FILE: crates/tauri-cli/src/plugin/mod.rs
  type PluginIosFramework (line 20) | pub enum PluginIosFramework {
  method fmt (line 29) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type Cli (line 45) | pub struct Cli {
  type Commands (line 51) | enum Commands {
  function command (line 58) | pub fn command(cli: Cli) -> Result<()> {
  function infer_plugin_name (line 69) | fn infer_plugin_name<P: AsRef<Path>>(directory: P) -> Result<String> {

FILE: crates/tauri-cli/src/plugin/new.rs
  type Options (line 15) | pub struct Options {
  function from (line 56) | fn from(o: Options) -> Self {
  function command (line 75) | pub fn command(mut options: Options) -> Result<()> {

FILE: crates/tauri-cli/src/remove.rs
  type Options (line 15) | pub struct Options {
  function command (line 20) | pub fn command(options: Options) -> Result<()> {

FILE: crates/tauri-cli/src/signer/generate.rs
  type Options (line 15) | pub struct Options {
  function command (line 30) | pub fn command(mut options: Options) -> Result<()> {

FILE: crates/tauri-cli/src/signer/mod.rs
  type Cli (line 19) | pub struct Cli {
  type Commands (line 25) | enum Commands {
  function command (line 30) | pub fn command(cli: Cli) -> Result<()> {

FILE: crates/tauri-cli/src/signer/sign.rs
  type Options (line 18) | pub struct Options {
  function backward_env_vars (line 44) | fn backward_env_vars(mut options: Options) -> Options {
  function command (line 73) | pub fn command(mut options: Options) -> Result<()> {

FILE: crates/tauri-cli/templates/app/src-tauri/build.rs
  function main (line 1) | fn main() {

FILE: crates/tauri-cli/templates/app/src-tauri/src/lib.rs
  function run (line 2) | pub fn run() {

FILE: crates/tauri-cli/templates/app/src-tauri/src/main.rs
  function main (line 4) | fn main() {

FILE: crates/tauri-cli/templates/mobile/ios/Sources/{{app.name}}/bindings/bindings.h
  function namespace (line 3) | namespace ffi {

FILE: crates/tauri-cli/templates/plugin/__example-api/tauri-app/src-tauri/build.rs
  function main (line 1) | fn main() {

FILE: crates/tauri-cli/templates/plugin/__example-api/tauri-app/src-tauri/src/lib.rs
  function greet (line 3) | fn greet(name: &str) -> String {
  function run (line 8) | pub fn run() {

FILE: crates/tauri-cli/templates/plugin/__example-api/tauri-app/src-tauri/src/main.rs
  function main (line 4) | fn main() {

FILE: crates/tauri-cli/templates/plugin/__example-basic/vanilla/src-tauri/build.rs
  function main (line 1) | fn main() {

FILE: crates/tauri-cli/templates/plugin/__example-basic/vanilla/src-tauri/src/lib.rs
  function run (line 2) | pub fn run() {

FILE: crates/tauri-cli/templates/plugin/__example-basic/vanilla/src-tauri/src/main.rs
  function main (line 4) | fn main() {

FILE: crates/tauri-cli/templates/plugin/build.rs
  constant COMMANDS (line 1) | const COMMANDS: &[&str] = &["ping"];
  function main (line 3) | fn main() {

FILE: crates/tauri-cli/templates/plugin/guest-js/index.ts
  function ping (line 6) | async function ping(value: string): Promise<string | null> {

FILE: crates/tauri-cli/templates/plugin/src/commands.rs
  function ping (line 11) | pub(crate) async fn ping<R: Runtime>(

FILE: crates/tauri-cli/templates/plugin/src/desktop.rs
  function ping (line 20) | pub fn ping(&self, payload: PingRequest) -> crate::Result<PingResponse> {

FILE: crates/tauri-cli/templates/plugin/src/error.rs
  type Result (line 6) | pub type Result<T> = std::result::Result<T, Error>;
  type Error (line 9) | pub enum Error {
  method serialize (line 18) | fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::E...

FILE: crates/tauri-cli/templates/plugin/src/mobile.rs
  function init (line 16) | pub fn init<R: Runtime, C: DeserializeOwned>(
  function ping (line 31) | pub fn ping(&self, payload: PingRequest) -> crate::Result<PingResponse> {

FILE: crates/tauri-cli/templates/plugin/src/models.rs
  type PingRequest (line 8) | pub struct PingRequest {
  type PingResponse (line 14) | pub struct PingResponse {

FILE: crates/tauri-codegen/src/context.rs
  type ContextData (line 34) | pub struct ContextData {
  function inject_script_hashes (line 47) | fn inject_script_hashes(document: &NodeRef, key: &AssetKey, csp_hashes: ...
  function map_core_assets (line 70) | fn map_core_assets(
  function map_isolation (line 96) | fn map_isolation(
  function context_codegen (line 136) | pub fn context_codegen(data: ContextData) -> EmbeddedAssetsResult<TokenS...
  function find_icon (line 497) | fn find_icon(

FILE: crates/tauri-codegen/src/embedded_assets.rs
  constant TARGET_PATH (line 23) | const TARGET_PATH: &str = "tauri-codegen-assets";
  type Asset (line 26) | type Asset = (AssetKey, (PathBuf, PathBuf));
  type EmbeddedAssetsError (line 31) | pub enum EmbeddedAssetsError {
  type EmbeddedAssetsResult (line 66) | pub type EmbeddedAssetsResult<T> = Result<T, EmbeddedAssetsError>;
  type EmbeddedAssets (line 78) | pub struct EmbeddedAssets {
    method new (line 254) | pub fn new(
    method compression_settings (line 290) | fn compression_settings() -> BrotliEncoderParams {
    method compress_file (line 306) | fn compress_file(
  type EmbeddedAssetsInput (line 83) | pub struct EmbeddedAssetsInput(Vec<PathBuf>);
    method from (line 86) | fn from(path: PathBuf) -> Self {
    method from (line 92) | fn from(paths: Vec<PathBuf>) -> Self {
  type RawEmbeddedAssets (line 98) | struct RawEmbeddedAssets {
    method new (line 105) | fn new(input: EmbeddedAssetsInput, options: &AssetOptions) -> Result<S...
  type CspHashes (line 157) | pub struct CspHashes {
    method add_if_applicable (line 171) | pub fn add_if_applicable(
  type AssetOptions (line 204) | pub struct AssetOptions {
    method new (line 215) | pub fn new(pattern: PatternKind) -> Self {
    method with_csp (line 228) | pub fn with_csp(mut self) -> Self {
    method freeze_prototype (line 235) | pub fn freeze_prototype(mut self, freeze: bool) -> Self {
    method dangerous_disable_asset_csp_modification (line 241) | pub fn dangerous_disable_asset_csp_modification(
  method to_tokens (line 392) | fn to_tokens(&self, tokens: &mut TokenStream) {
  function ensure_out_dir (line 437) | pub(crate) fn ensure_out_dir() -> EmbeddedAssetsResult<PathBuf> {

FILE: crates/tauri-codegen/src/image.rs
  type IconFormat (line 14) | pub(crate) enum IconFormat {
  type CachedIcon (line 22) | pub struct CachedIcon {
    method new (line 29) | pub fn new(root: &TokenStream, icon: &Path) -> EmbeddedAssetsResult<Se...
    method new_raw (line 41) | pub fn new_raw(root: &TokenStream, icon: &Path) -> EmbeddedAssetsResul...
    method new_ico (line 51) | pub fn new_ico(root: &TokenStream, icon: &Path) -> EmbeddedAssetsResul...
    method new_png (line 75) | pub fn new_png(root: &TokenStream, icon: &Path) -> EmbeddedAssetsResul...
    method open (line 101) | fn open(path: &Path) -> Vec<u8> {
  method to_tokens (line 107) | fn to_tokens(&self, tokens: &mut TokenStream) {

FILE: crates/tauri-codegen/src/lib.rs
  type CodegenConfigError (line 35) | pub enum CodegenConfigError {
  function get_config (line 57) | pub fn get_config(path: &Path) -> Result<(Config, PathBuf), CodegenConfi...
  function checksum (line 102) | fn checksum(bytes: &[u8]) -> Result<String, fmt::Error> {
  type Cached (line 120) | struct Cached {
    type Error (line 125) | type Error = EmbeddedAssetsError;
    method try_from (line 127) | fn try_from(value: String) -> Result<Self, Self::Error> {
    type Error (line 133) | type Error = EmbeddedAssetsError;
    method try_from (line 135) | fn try_from(content: Vec<u8>) -> Result<Self, Self::Error> {
  method to_tokens (line 146) | fn to_tokens(&self, tokens: &mut TokenStream) {

FILE: crates/tauri-codegen/src/vendor/blake3_reference.rs
  constant OUT_LEN (line 36) | const OUT_LEN: usize = 32;
  constant BLOCK_LEN (line 37) | const BLOCK_LEN: usize = 64;
  constant CHUNK_LEN (line 38) | const CHUNK_LEN: usize = 1024;
  constant CHUNK_START (line 40) | const CHUNK_START: u32 = 1 << 0;
  constant CHUNK_END (line 41) | const CHUNK_END: u32 = 1 << 1;
  constant PARENT (line 42) | const PARENT: u32 = 1 << 2;
  constant ROOT (line 43) | const ROOT: u32 = 1 << 3;
  constant IV (line 45) | const IV: [u32; 8] = [
  constant MSG_PERMUTATION (line 49) | const MSG_PERMUTATION: [usize; 16] = [2, 6, 3, 10, 7, 0, 4, 13, 1, 11, 1...
  function g (line 52) | fn g(state: &mut [u32; 16], a: usize, b: usize, c: usize, d: usize, mx: ...
  function round (line 63) | fn round(state: &mut [u32; 16], m: &[u32; 16]) {
  function permute (line 76) | fn permute(m: &mut [u32; 16]) {
  function compress (line 84) | fn compress(
  function first_8_words (line 132) | fn first_8_words(compression_output: [u32; 16]) -> [u32; 8] {
  function words_from_little_endian_bytes (line 136) | fn words_from_little_endian_bytes(bytes: &[u8], words: &mut [u32]) {
  type Output (line 146) | struct Output {
    method chaining_value (line 155) | fn chaining_value(&self) -> [u32; 8] {
    method root_output_bytes (line 165) | fn root_output_bytes(&self, out_slice: &mut [u8]) {
  type ChunkState (line 182) | struct ChunkState {
    method new (line 192) | fn new(key_words: [u32; 8], chunk_counter: u64, flags: u32) -> Self {
    method len (line 203) | fn len(&self) -> usize {
    method start_flag (line 207) | fn start_flag(&self) -> u32 {
    method update (line 215) | fn update(&mut self, mut input: &[u8]) {
    method output (line 243) | fn output(&self) -> Output {
  function parent_output (line 256) | fn parent_output(
  function parent_cv (line 274) | fn parent_cv(
  type Hasher (line 284) | pub struct Hasher {
    method new_internal (line 293) | fn new_internal(key_words: [u32; 8], flags: u32) -> Self {
    method new (line 304) | pub fn new() -> Self {
    method push_stack (line 308) | fn push_stack(&mut self, cv: [u32; 8]) {
    method pop_stack (line 313) | fn pop_stack(&mut self) -> [u32; 8] {
    method add_chunk_chaining_value (line 319) | fn add_chunk_chaining_value(&mut self, mut new_cv: [u32; 8], mut total...
    method update (line 335) | pub fn update(&mut self, mut input: &[u8]) {
    method finalize (line 355) | pub fn finalize(&self, out_slice: &mut [u8]) {
  method default (line 375) | fn default() -> Self {

FILE: crates/tauri-driver/src/cli.rs
  constant HELP (line 7) | const HELP: &str = "\
  type Args (line 21) | pub struct Args {
    method from (line 29) | fn from(mut args: pico_args::Arguments) -> Self {

FILE: crates/tauri-driver/src/main.rs
  function main (line 22) | fn main() {
  function main (line 28) | fn main() {

FILE: crates/tauri-driver/src/server.rs
  constant TAURI_OPTIONS (line 27) | const TAURI_OPTIONS: &str = "tauri:options";
  type TauriOptions (line 31) | struct TauriOptions {
    method into_native_object (line 42) | fn into_native_object(self) -> Map<String, Value> {
    method into_native_object (line 52) | fn into_native_object(self) -> Map<String, Value> {
  function handle (line 72) | async fn handle(
  function forward_to_native_driver (line 109) | fn forward_to_native_driver(
  function map_capabilities (line 139) | fn map_capabilities(mut json: Value) -> Value {
  function run (line 170) | pub async fn run(args: Args, mut _driver: Child) -> Result<(), Error> {

FILE: crates/tauri-driver/src/webdriver.rs
  constant DRIVER_BINARY (line 13) | const DRIVER_BINARY: &str = "WebKitWebDriver";
  constant DRIVER_BINARY (line 16) | const DRIVER_BINARY: &str = "msedgedriver.exe";
  function native (line 19) | pub fn native(args: &Args) -> Command {

FILE: crates/tauri-macos-sign/src/certificate.rs
  type SelfSignedCertificateRequest (line 13) | pub struct SelfSignedCertificateRequest {
  function generate_self_signed (line 36) | pub fn generate_self_signed(request: SelfSignedCertificateRequest) -> Re...

FILE: crates/tauri-macos-sign/src/keychain.rs
  type SigningIdentity (line 18) | pub enum SigningIdentity {
  type Keychain (line 23) | pub struct Keychain {
    method with_signing_identity (line 42) | pub fn with_signing_identity(identity: impl Into<String>) -> Self {
    method with_certificate (line 55) | pub fn with_certificate(
    method with_certificate_file (line 65) | pub fn with_certificate_file(cert_path: &Path, certificate_password: &...
    method signing_identity (line 193) | pub fn signing_identity(&self) -> String {
    method team_id (line 200) | pub fn team_id(&self) -> Option<&str> {
    method sign (line 207) | pub fn sign(
    method path (line 251) | pub fn path(&self) -> Option<&Path> {
  method drop (line 30) | fn drop(&mut self) {

FILE: crates/tauri-macos-sign/src/keychain/identity.rs
  function get_pem_list (line 12) | fn get_pem_list(keychain_path: &Path, name_substr: &str) -> Result<std::...
  type Team (line 29) | pub struct Team {
    method from_x509 (line 37) | fn from_x509(cert_prefix: &'static str, cert: X509Certificate) -> Resu...
    method certificate_name (line 82) | pub fn certificate_name(&self) -> String {
  function list (line 87) | pub fn list(keychain_path: &Path) -> Result<Vec<Team>> {

FILE: crates/tauri-macos-sign/src/lib.rs
  type Error (line 21) | pub enum Error {
  type Result (line 75) | pub type Result<T> = std::result::Result<T, Error>;
  type CommandExt (line 77) | trait CommandExt {
    method piped (line 80) | fn piped(&mut self) -> std::io::Result<ExitStatus>;
    method piped (line 84) | fn piped(&mut self) -> std::io::Result<ExitStatus> {
  type ApiKey (line 95) | pub enum ApiKey {
  type AppleNotarizationCredentials (line 100) | pub enum AppleNotarizationCredentials {
  type NotarytoolSubmitOutput (line 114) | struct NotarytoolSubmitOutput {
  function notarize (line 121) | pub fn notarize(
  function notarize_without_stapling (line 129) | pub fn notarize_without_stapling(
  function notarize_inner (line 137) | fn notarize_inner(
  function staple_app (line 252) | fn staple_app(mut app_bundle_path: PathBuf) -> Result<()> {
  type NotarytoolCmdExt (line 274) | pub trait NotarytoolCmdExt {
    method notarytool_args (line 275) | fn notarytool_args(
    method notarytool_args (line 283) | fn notarytool_args(
  function decode_base64 (line 334) | fn decode_base64(base64_input: &OsStr, out_path: &Path) -> Result<()> {
  function assert_command (line 357) | fn assert_command(

FILE: crates/tauri-macos-sign/src/provisioning_profile.rs
  type ProvisioningProfile (line 10) | pub struct ProvisioningProfile {
    method from_base64 (line 15) | pub fn from_base64(base64: &OsStr) -> Result<Self> {
    method uuid (line 38) | pub fn uuid(&self) -> Result<String> {

FILE: crates/tauri-macros/src/command/handler.rs
  type CommandDef (line 11) | struct CommandDef {
  method parse (line 17) | fn parse(input: ParseStream) -> syn::Result<Self> {
  type Handler (line 26) | pub struct Handler {
  method parse (line 33) | fn parse(input: &ParseBuffer<'_>) -> syn::Result<Self> {
  function try_get_plugin_name (line 70) | fn try_get_plugin_name(input: &ParseBuffer<'_>) -> Result<Option<String>...
  function filter_unused_commands (line 92) | fn filter_unused_commands(plugin_name: Option<String>, command_defs: &mu...
  function from (line 145) | fn from(

FILE: crates/tauri-macros/src/command/mod.rs
  function format_command_wrapper (line 14) | fn format_command_wrapper(function: &Ident) -> Ident {
  function path_to_command (line 19) | fn path_to_command(path: &mut Path) -> &mut PathSegment {

FILE: crates/tauri-macros/src/command/wrapper.rs
  type WrapperAttributeKind (line 22) | enum WrapperAttributeKind {
  method parse (line 28) | fn parse(input: ParseStream) -> syn::Result<Self> {
  type WrapperAttributes (line 39) | struct WrapperAttributes {
  method parse (line 46) | fn parse(input: ParseStream) -> syn::Result<Self> {
  type ExecutionContext (line 111) | enum ExecutionContext {
  type ArgumentCase (line 118) | enum ArgumentCase {
  type Invoke (line 124) | struct Invoke {
  function wrapper (line 131) | pub fn wrapper(attributes: TokenStream, item: TokenStream) -> TokenStream {
  function body_async (line 316) | fn body_async(
  function body_blocking (line 359) | fn body_blocking(
  function parse_args (line 394) | fn parse_args(
  function parse_arg (line 419) | fn parse_arg(
  function is_rustc_at_least (line 482) | fn is_rustc_at_least(major: u32, minor: u32) -> bool {
  function rustc_version (line 487) | fn rustc_version() -> &'static (u32, u32) {
  function cross_command (line 512) | fn cross_command(bin: &str) -> std::process::Command {

FILE: crates/tauri-macros/src/context.rs
  type ContextItems (line 16) | pub(crate) struct ContextItems {
  method parse (line 25) | fn parse(input: &ParseBuffer<'_>) -> syn::parse::Result<Self> {
  function generate_context (line 151) | pub(crate) fn generate_context(context: ContextItems) -> TokenStream {

FILE: crates/tauri-macros/src/lib.rs
  function command (line 35) | pub fn command(attributes: TokenStream, item: TokenStream) -> TokenStream {
  function mobile_entry_point (line 40) | pub fn mobile_entry_point(attributes: TokenStream, item: TokenStream) ->...
  function generate_handler (line 72) | pub fn generate_handler(item: TokenStream) -> TokenStream {
  function generate_context (line 83) | pub fn generate_context(items: TokenStream) -> TokenStream {
  function default_runtime (line 96) | pub fn default_runtime(attributes: TokenStream, input: TokenStream) -> T...
  function do_menu_item (line 158) | pub fn do_menu_item(input: TokenStream) -> TokenStream {
  function include_image (line 189) | pub fn include_image(tokens: TokenStream) -> TokenStream {

FILE: crates/tauri-macros/src/menu.rs
  type DoMenuItemInput (line 13) | pub struct DoMenuItemInput {
  type NegatedIdent (line 23) | struct NegatedIdent {
    method new (line 29) | fn new(ident: &str) -> Self {
    method is_negated (line 36) | fn is_negated(&self) -> bool {
  method parse (line 42) | fn parse(input: ParseStream) -> syn::Result<Self> {
  method parse (line 53) | fn parse(input: ParseStream) -> syn::Result<Self> {
  function do_menu_item (line 78) | pub fn do_menu_item(input: DoMenuItemInput) -> TokenStream {

FILE: crates/tauri-macros/src/mobile.rs
  function get_env_var (line 11) | fn get_env_var(name: &str, error: &mut Option<TokenStream2>, function: &...
  function entry_point (line 30) | pub fn entry_point(_attributes: TokenStream, item: TokenStream) -> Token...

FILE: crates/tauri-macros/src/runtime.rs
  type Input (line 13) | pub(crate) enum Input {
    method last_param_mut (line 36) | fn last_param_mut(&mut self) -> Option<&mut GenericParam> {
  method parse (line 20) | fn parse(input: ParseStream) -> syn::Result<Self> {
  method to_tokens (line 46) | fn to_tokens(&self, tokens: &mut TokenStream) {
  type Attributes (line 56) | pub(crate) struct Attributes {
  method parse (line 62) | fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
  function default_runtime (line 72) | pub(crate) fn default_runtime(attributes: Attributes, input: Input) -> T...

FILE: crates/tauri-plugin/src/build/mobile.rs
  function update_entitlements (line 18) | pub fn update_entitlements<F: FnOnce(&mut plist::Dictionary)>(f: F) -> R...
  function update_info_plist (line 35) | pub fn update_info_plist<F: FnOnce(&mut plist::Dictionary)>(f: F) -> Res...
  function update_android_manifest (line 51) | pub fn update_android_manifest(block_identifier: &str, parent: &str, ins...
  function setup (line 63) | pub(crate) fn setup(
  function copy_folder (line 122) | fn copy_folder(source: &Path, target: &Path, ignore_paths: &[&str]) -> R...
  function update_plist_file (line 156) | fn update_plist_file<P: AsRef<Path>, F: FnOnce(&mut plist::Dictionary)>(
  function xml_block_comment (line 181) | fn xml_block_comment(id: &str) -> String {
  function insert_into_xml (line 185) | fn insert_into_xml(xml: &str, block_identifier: &str, parent_tag: &str, ...
  function insert_into_xml (line 220) | fn insert_into_xml() {

FILE: crates/tauri-plugin/src/build/mod.rs
  constant RESERVED_PLUGIN_NAMES (line 19) | const RESERVED_PLUGIN_NAMES: &[&str] = &["core", "tauri"];
  function plugin_config (line 21) | pub fn plugin_config<T: DeserializeOwned>(name: &str) -> Option<T> {
  type Builder (line 36) | pub struct Builder<'a> {
  function new (line 45) | pub fn new(commands: &'a [&'static str]) -> Self {
  function global_scope_schema (line 56) | pub fn global_scope_schema(mut self, schema: schemars::schema::RootSchem...
  function global_api_script_path (line 64) | pub fn global_api_script_path<P: Into<PathBuf>>(mut self, path: P) -> Se...
  function android_path (line 70) | pub fn android_path<P: Into<PathBuf>>(mut self, android_path: P) -> Self {
  function ios_path (line 76) | pub fn ios_path<P: Into<PathBuf>>(mut self, ios_path: P) -> Self {
  function build (line 82) | pub fn build(self) {
  function try_build (line 95) | pub fn try_build(self) -> Result<()> {
  function cfg_alias (line 156) | fn cfg_alias(alias: &str, has_feature: bool) {
  function build_var (line 164) | fn build_var(key: &'static str) -> Result<String, Error> {

FILE: crates/tauri-runtime-wry/build.rs
  function alias (line 7) | fn alias(alias: &str, has_feature: bool) {
  function main (line 14) | fn main() {

FILE: crates/tauri-runtime-wry/src/dialog/mod.rs
  function error (line 8) | pub fn error<S: AsRef<str>>(err: S) {

FILE: crates/tauri-runtime-wry/src/dialog/windows.rs
  type Level (line 7) | enum Level {
  function error (line 15) | pub fn error<S: AsRef<str>>(err: S) {
  function dialog_inner (line 19) | fn dialog_inner(err: &str, level: Level) {
  function remove_hyperlink (line 95) | fn remove_hyperlink(str: &str) -> String {
  function test_remove_hyperlink (line 118) | fn test_remove_hyperlink() {

FILE: crates/tauri-runtime-wry/src/lib.rs
  type WebviewId (line 144) | pub type WebviewId = u32;
  type IpcHandler (line 145) | type IpcHandler = dyn Fn(Request<String>) + 'static;
  type WebContext (line 167) | pub struct WebContext {
  type WebContextStore (line 175) | pub type WebContextStore = Arc<Mutex<HashMap<Option<PathBuf>, WebContext...
  type WindowEventHandler (line 177) | pub type WindowEventHandler = Box<dyn Fn(&WindowEvent) + Send>;
  type WindowEventListeners (line 178) | pub type WindowEventListeners = Arc<Mutex<HashMap<WindowEventId, WindowE...
  type WebviewEventHandler (line 179) | pub type WebviewEventHandler = Box<dyn Fn(&WebviewEvent) + Send>;
  type WebviewEventListeners (line 180) | pub type WebviewEventListeners = Arc<Mutex<HashMap<WebviewEventId, Webvi...
  type WindowIdStore (line 183) | pub struct WindowIdStore(Arc<Mutex<HashMap<TaoWindowId, WindowId>>>);
    method insert (line 186) | pub fn insert(&self, w: TaoWindowId, id: WindowId) {
    method get (line 190) | pub fn get(&self, w: &TaoWindowId) -> Option<WindowId> {
  function send_user_message (line 234) | pub(crate) fn send_user_message<T: UserEvent>(
  type Context (line 257) | pub struct Context<T: UserEvent> {
  function run_threaded (line 271) | pub fn run_threaded<R, F>(&self, f: F) -> R
  function next_window_id (line 282) | fn next_window_id(&self) -> WindowId {
  function next_webview_id (line 286) | fn next_webview_id(&self) -> WebviewId {
  function next_window_event_id (line 290) | fn next_window_event_id(&self) -> u32 {
  function next_webview_event_id (line 294) | fn next_webview_event_id(&self) -> u32 {
  function create_window (line 300) | fn create_window<F: Fn(RawWindow) + Send + 'static>(
  function create_webview (line 364) | fn create_webview(
  type ActiveTraceSpanStore (line 407) | pub struct ActiveTraceSpanStore(Rc<RefCell<Vec<ActiveTracingSpan>>>);
    method remove_window_draw (line 411) | pub fn remove_window_draw(&self) {
  type ActiveTracingSpan (line 421) | pub enum ActiveTracingSpan {
  type WindowsStore (line 429) | pub struct WindowsStore(pub RefCell<BTreeMap<WindowId, WindowWrapper>>);
  type DispatcherMainThreadContext (line 440) | pub struct DispatcherMainThreadContext<T: UserEvent> {
  function fmt (line 458) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  type DeviceEventFilterWrapper (line 467) | pub struct DeviceEventFilterWrapper(pub TaoDeviceEventFilter);
    method from (line 470) | fn from(item: DeviceEventFilter) -> Self {
  type RectWrapper (line 479) | pub struct RectWrapper(pub wry::Rect);
    method from (line 481) | fn from(value: tauri_runtime::dpi::Rect) -> Self {
  type TaoIcon (line 490) | pub struct TaoIcon(pub TaoWindowIcon);
    type Error (line 493) | type Error = Error;
    method try_from (line 494) | fn try_from(icon: Icon<'_>) -> std::result::Result<Self, Self::Error> {
  type WindowEventWrapper (line 501) | pub struct WindowEventWrapper(pub Option<WindowEvent>);
    method map_from_tao (line 504) | fn map_from_tao(
    method parse (line 557) | fn parse(window: &WindowWrapper, event: &TaoWindowEvent<'_>) -> Self {
    method from (line 1415) | fn from(event: SynthesizedWindowEvent) -> Self {
  function map_theme (line 578) | pub fn map_theme(theme: &TaoTheme) -> Theme {
  function tao_activation_policy (line 587) | fn tao_activation_policy(activation_policy: ActivationPolicy) -> TaoActi...
  type MonitorHandleWrapper (line 596) | pub struct MonitorHandleWrapper(pub MonitorHandle);
  method from (line 599) | fn from(monitor: MonitorHandleWrapper) -> Monitor {
  type PhysicalPositionWrapper (line 610) | pub struct PhysicalPositionWrapper<T>(pub TaoPhysicalPosition<T>);
  function from (line 613) | fn from(position: PhysicalPositionWrapper<T>) -> Self {
  function from (line 622) | fn from(position: PhysicalPosition<T>) -> Self {
  type LogicalPositionWrapper (line 630) | struct LogicalPositionWrapper<T>(TaoLogicalPosition<T>);
  function from (line 633) | fn from(position: LogicalPosition<T>) -> Self {
  type PhysicalSizeWrapper (line 641) | pub struct PhysicalSizeWrapper<T>(pub TaoPhysicalSize<T>);
  function from (line 644) | fn from(size: PhysicalSizeWrapper<T>) -> Self {
  function from (line 653) | fn from(size: PhysicalSize<T>) -> Self {
  type LogicalSizeWrapper (line 661) | struct LogicalSizeWrapper<T>(TaoLogicalSize<T>);
  function from (line 664) | fn from(size: LogicalSize<T>) -> Self {
  type SizeWrapper (line 672) | pub struct SizeWrapper(pub TaoSize);
    method from (line 675) | fn from(size: Size) -> Self {
  type PositionWrapper (line 683) | pub struct PositionWrapper(pub TaoPosition);
    method from (line 686) | fn from(position: Position) -> Self {
  type UserAttentionTypeWrapper (line 695) | pub struct UserAttentionTypeWrapper(pub TaoUserAttentionType);
    method from (line 698) | fn from(request_type: UserAttentionType) -> Self {
  type CursorIconWrapper (line 708) | pub struct CursorIconWrapper(pub TaoCursorIcon);
    method from (line 711) | fn from(icon: CursorIcon) -> Self {
  type ProgressStateWrapper (line 755) | pub struct ProgressStateWrapper(pub TaoProgressState);
    method from (line 758) | fn from(status: ProgressBarStatus) -> Self {
  type ProgressBarStateWrapper (line 770) | pub struct ProgressBarStateWrapper(pub TaoProgressBarState);
    method from (line 773) | fn from(progress_state: ProgressBarState) -> Self {
  type WindowBuilderWrapper (line 785) | pub struct WindowBuilderWrapper {
    method fmt (line 794) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  type GtkWindow (line 1269) | pub struct GtkWindow(pub gtk::ApplicationWindow);
  type GtkBox (line 1287) | pub struct GtkBox(pub gtk::Box);
  type SendRawWindowHandle (line 1298) | pub struct SendRawWindowHandle(pub raw_window_handle::RawWindowHandle);
  type ApplicationMessage (line 1301) | pub enum ApplicationMessage {
  type WindowMessage (line 1312) | pub enum WindowMessage {
  type SynthesizedWindowEvent (line 1409) | pub enum SynthesizedWindowEvent {
  type WebviewMessage (line 1424) | pub enum WebviewMessage {
  type EventLoopWindowTargetMessage (line 1466) | pub enum EventLoopWindowTargetMessage {
  type CreateWindowClosure (line 1472) | pub type CreateWindowClosure<T> =
  type CreateWebviewClosure (line 1475) | pub type CreateWebviewClosure =
  type CreateWebviewOptions (line 1478) | pub struct CreateWebviewOptions {
  type Message (line 1482) | pub enum Message<T: 'static> {
  method clone (line 1504) | fn clone(&self) -> Self {
  type WryWebviewDispatcher (line 1514) | pub struct WryWebviewDispatcher<T: UserEvent> {
  type Runtime (line 1521) | type Runtime = Wry<T>;
  function run_on_main_thread (line 1523) | fn run_on_main_thread<F: FnOnce() + Send + 'static>(&self, f: F) -> Resu...
  function on_webview_event (line 1527) | fn on_webview_event<F: Fn(&WebviewEvent) + Send + 'static>(&self, f: F) ...
  function with_webview (line 1537) | fn with_webview<F: FnOnce(Box<dyn std::any::Any>) + Send + 'static>(&sel...
  function open_devtools (line 1549) | fn open_devtools(&self) {
  function close_devtools (line 1561) | fn close_devtools(&self) {
  function is_devtools_open (line 1574) | fn is_devtools_open(&self) -> Result<bool> {
  function url (line 1580) | fn url(&self) -> Result<String> {
  function bounds (line 1584) | fn bounds(&self) -> Result<tauri_runtime::dpi::Rect> {
  function position (line 1588) | fn position(&self) -> Result<PhysicalPosition<i32>> {
  function size (line 1592) | fn size(&self) -> Result<PhysicalSize<u32>> {
  function navigate (line 1598) | fn navigate(&self, url: Url) -> Result<()> {
  function reload (line 1609) | fn reload(&self) -> Result<()> {
  function print (line 1620) | fn print(&self) -> Result<()> {
  function close (line 1631) | fn close(&self) -> Result<()> {
  function set_bounds (line 1642) | fn set_bounds(&self, bounds: tauri_runtime::dpi::Rect) -> Result<()> {
  function set_size (line 1653) | fn set_size(&self, size: Size) -> Result<()> {
  function set_position (line 1664) | fn set_position(&self, position: Position) -> Result<()> {
  function set_focus (line 1675) | fn set_focus(&self) -> Result<()> {
  function reparent (line 1686) | fn reparent(&self, window_id: WindowId) -> Result<()> {
  function cookies_for_url (line 1704) | fn cookies_for_url(&self, url: Url) -> Result<Vec<Cookie<'static>>> {
  function cookies (line 1719) | fn cookies(&self) -> Result<Vec<Cookie<'static>>> {
  function set_cookie (line 1723) | fn set_cookie(&self, cookie: Cookie<'_>) -> Result<()> {
  function delete_cookie (line 1735) | fn delete_cookie(&self, cookie: Cookie<'_>) -> Result<()> {
  function set_auto_resize (line 1747) | fn set_auto_resize(&self, auto_resize: bool) -> Result<()> {
  function eval_script (line 1759) | fn eval_script<S: Into<String>>(&self, script: S) -> Result<()> {
  function eval_script (line 1774) | fn eval_script<S: Into<String>>(&self, script: S) -> Result<()> {
  function set_zoom (line 1785) | fn set_zoom(&self, scale_factor: f64) -> Result<()> {
  function clear_all_browsing_data (line 1796) | fn clear_all_browsing_data(&self) -> Result<()> {
  function hide (line 1807) | fn hide(&self) -> Result<()> {
  function show (line 1818) | fn show(&self) -> Result<()> {
  function set_background_color (line 1829) | fn set_background_color(&self, color: Option<Color>) -> Result<()> {
  type WryWindowDispatcher (line 1843) | pub struct WryWindowDispatcher<T: UserEvent> {
  function get_raw_window_handle (line 1852) | fn get_raw_window_handle<T: UserEvent>(
  type Runtime (line 1859) | type Runtime = Wry<T>;
  type WindowBuilder (line 1860) | type WindowBuilder = WindowBuilderWrapper;
    method new (line 813) | fn new() -> Self {
    method with_config (line 837) | fn with_config(config: &WindowConfig) -> Self {
    method center (line 950) | fn center(mut self) -> Self {
    method position (line 955) | fn position(mut self, x: f64, y: f64) -> Self {
    method inner_size (line 960) | fn inner_size(mut self, width: f64, height: f64) -> Self {
    method min_inner_size (line 967) | fn min_inner_size(mut self, min_width: f64, min_height: f64) -> Self {
    method max_inner_size (line 974) | fn max_inner_size(mut self, max_width: f64, max_height: f64) -> Self {
    method inner_size_constraints (line 981) | fn inner_size_constraints(mut self, constraints: WindowSizeConstraints...
    method prevent_overflow (line 996) | fn prevent_overflow(mut self) -> Self {
    method prevent_overflow_with_margin (line 1009) | fn prevent_overflow_with_margin(mut self, margin: Size) -> Self {
    method resizable (line 1014) | fn resizable(mut self, resizable: bool) -> Self {
    method maximizable (line 1019) | fn maximizable(mut self, maximizable: bool) -> Self {
    method minimizable (line 1024) | fn minimizable(mut self, minimizable: bool) -> Self {
    method closable (line 1029) | fn closable(mut self, closable: bool) -> Self {
    method title (line 1034) | fn title<S: Into<String>>(mut self, title: S) -> Self {
    method fullscreen (line 1039) | fn fullscreen(mut self, fullscreen: bool) -> Self {
    method focused (line 1050) | fn focused(mut self, focused: bool) -> Self {
    method focusable (line 1055) | fn focusable(mut self, focusable: bool) -> Self {
    method maximized (line 1060) | fn maximized(mut self, maximized: bool) -> Self {
    method visible (line 1065) | fn visible(mut self, visible: bool) -> Self {
    method transparent (line 1071) | fn transparent(mut self, transparent: bool) -> Self {
    method decorations (line 1076) | fn decorations(mut self, decorations: bool) -> Self {
    method always_on_bottom (line 1081) | fn always_on_bottom(mut self, always_on_bottom: bool) -> Self {
    method always_on_top (line 1086) | fn always_on_top(mut self, always_on_top: bool) -> Self {
    method visible_on_all_workspaces (line 1091) | fn visible_on_all_workspaces(mut self, visible_on_all_workspaces: bool...
    method content_protected (line 1098) | fn content_protected(mut self, protected: bool) -> Self {
    method shadow (line 1103) | fn shadow(#[allow(unused_mut)] mut self, _enable: bool) -> Self {
    method owner (line 1116) | fn owner(mut self, owner: HWND) -> Self {
    method parent (line 1122) | fn parent(mut self, parent: HWND) -> Self {
    method parent (line 1128) | fn parent(mut self, parent: *mut std::ffi::c_void) -> Self {
    method transient_for (line 1140) | fn transient_for(mut self, parent: &impl gtk::glib::IsA<gtk::Window>) ...
    method drag_and_drop (line 1146) | fn drag_and_drop(mut self, enabled: bool) -> Self {
    method title_bar_style (line 1152) | fn title_bar_style(mut self, style: TitleBarStyle) -> Self {
    method traffic_light_position (line 1179) | fn traffic_light_position<P: Into<Position>>(mut self, position: P) ->...
    method hidden_title (line 1185) | fn hidden_title(mut self, hidden: bool) -> Self {
    method tabbing_identifier (line 1191) | fn tabbing_identifier(mut self, identifier: &str) -> Self {
    method icon (line 1197) | fn icon(mut self, icon: Icon) -> Result<Self> {
    method background_color (line 1204) | fn background_color(mut self, color: Color) -> Self {
    method skip_taskbar (line 1217) | fn skip_taskbar(mut self, skip: bool) -> Self {
    method skip_taskbar (line 1223) | fn skip_taskbar(self, _skip: bool) -> Self {
    method theme (line 1227) | fn theme(mut self, theme: Option<Theme>) -> Self {
    method has_icon (line 1240) | fn has_icon(&self) -> bool {
    method get_theme (line 1244) | fn get_theme(&self) -> Option<Theme> {
    method window_classname (line 1252) | fn window_classname<S: Into<String>>(mut self, window_classname: S) ->...
    method window_classname (line 1257) | fn window_classname<S: Into<String>>(self, _window_classname: S) -> Se...
  function run_on_main_thread (line 1862) | fn run_on_main_thread<F: FnOnce() + Send + 'static>(&self, f: F) -> Resu...
  function on_window_event (line 1866) | fn on_window_event<F: Fn(&WindowEvent) + Send + 'static>(&self, f: F) ->...
  function scale_factor (line 1877) | fn scale_factor(&self) -> Result<f64> {
  function inner_position (line 1881) | fn inner_position(&self) -> Result<PhysicalPosition<i32>> {
  function outer_position (line 1885) | fn outer_position(&self) -> Result<PhysicalPosition<i32>> {
  function inner_size (line 1889) | fn inner_size(&self) -> Result<PhysicalSize<u32>> {
  function outer_size (line 1893) | fn outer_size(&self) -> Result<PhysicalSize<u32>> {
  function is_fullscreen (line 1897) | fn is_fullscreen(&self) -> Result<bool> {
  function is_minimized (line 1901) | fn is_minimized(&self) -> Result<bool> {
  function is_maximized (line 1905) | fn is_maximized(&self) -> Result<bool> {
  function is_focused (line 1909) | fn is_focused(&self) -> Result<bool> {
  function is_decorated (line 1914) | fn is_decorated(&self) -> Result<bool> {
  function is_resizable (line 1919) | fn is_resizable(&self) -> Result<bool> {
  function is_maximizable (line 1924) | fn is_maximizable(&self) -> Result<bool> {
  function is_minimizable (line 1929) | fn is_minimizable(&self) -> Result<bool> {
  function is_closable (line 1934) | fn is_closable(&self) -> Result<bool> {
  function is_visible (line 1938) | fn is_visible(&self) -> Result<bool> {
  function title (line 1942) | fn title(&self) -> Result<String> {
  function current_monitor (line 1946) | fn current_monitor(&self) -> Result<Option<Monitor>> {
  function primary_monitor (line 1950) | fn primary_monitor(&self) -> Result<Option<Monitor>> {
  function monitor_from_point (line 1954) | fn monitor_from_point(&self, x: f64, y: f64) -> Result<Option<Monitor>> {
  function available_monitors (line 1969) | fn available_monitors(&self) -> Result<Vec<Monitor>> {
  function theme (line 1978) | fn theme(&self) -> Result<Theme> {
  function is_enabled (line 1982) | fn is_enabled(&self) -> Result<bool> {
  function is_always_on_top (line 1986) | fn is_always_on_top(&self) -> Result<bool> {
  function gtk_window (line 1997) | fn gtk_window(&self) -> Result<gtk::ApplicationWindow> {
  function default_vbox (line 2008) | fn default_vbox(&self) -> Result<gtk::Box> {
  function window_handle (line 2012) | fn window_handle(
  function center (line 2022) | fn center(&self) -> Result<()> {
  function request_user_attention (line 2029) | fn request_user_attention(&self, request_type: Option<UserAttentionType>...
  function create_window (line 2041) | fn create_window<F: Fn(RawWindow) + Send + 'static>(
  function create_webview (line 2051) | fn create_webview(
  function set_resizable (line 2058) | fn set_resizable(&self, resizable: bool) -> Result<()> {
  function set_enabled (line 2065) | fn set_enabled(&self, enabled: bool) -> Result<()> {
  function set_maximizable (line 2072) | fn set_maximizable(&self, maximizable: bool) -> Result<()> {
  function set_minimizable (line 2079) | fn set_minimizable(&self, minimizable: bool) -> Result<()> {
  function set_closable (line 2086) | fn set_closable(&self, closable: bool) -> Result<()> {
  function set_title (line 2093) | fn set_title<S: Into<String>>(&self, title: S) -> Result<()> {
  function maximize (line 2100) | fn maximize(&self) -> Result<()> {
  function unmaximize (line 2107) | fn unmaximize(&self) -> Result<()> {
  function minimize (line 2114) | fn minimize(&self) -> Result<()> {
  function unminimize (line 2121) | fn unminimize(&self) -> Result<()> {
  function show (line 2128) | fn show(&self) -> Result<()> {
  function hide (line 2135) | fn hide(&self) -> Result<()> {
  function close (line 2142) | fn close(&self) -> Result<()> {
  function destroy (line 2151) | fn destroy(&self) -> Result<()> {
  function set_decorations (line 2160) | fn set_decorations(&self, decorations: bool) -> Result<()> {
  function set_shadow (line 2167) | fn set_shadow(&self, enable: bool) -> Result<()> {
  function set_always_on_bottom (line 2174) | fn set_always_on_bottom(&self, always_on_bottom: bool) -> Result<()> {
  function set_always_on_top (line 2184) | fn set_always_on_top(&self, always_on_top: bool) -> Result<()> {
  function set_visible_on_all_workspaces (line 2191) | fn set_visible_on_all_workspaces(&self, visible_on_all_workspaces: bool)...
  function set_content_protected (line 2201) | fn set_content_protected(&self, protected: bool) -> Result<()> {
  function set_size (line 2211) | fn set_size(&self, size: Size) -> Result<()> {
  function set_min_size (line 2218) | fn set_min_size(&self, size: Option<Size>) -> Result<()> {
  function set_max_size (line 2225) | fn set_max_size(&self, size: Option<Size>) -> Result<()> {
  function set_size_constraints (line 2232) | fn set_size_constraints(&self, constraints: WindowSizeConstraints) -> Re...
  function set_position (line 2242) | fn set_position(&self, position: Position) -> Result<()> {
  function set_fullscreen (line 2249) | fn set_fullscreen(&self, fullscreen: bool) -> Result<()> {
  function set_simple_fullscreen (line 2257) | fn set_simple_fullscreen(&self, enable: bool) -> Result<()> {
  function set_focus (line 2264) | fn set_focus(&self) -> Result<()> {
  function set_focusable (line 2271) | fn set_focusable(&self, focusable: bool) -> Result<()> {
  function set_icon (line 2278) | fn set_icon(&self, icon: Icon) -> Result<()> {
  function set_skip_taskbar (line 2288) | fn set_skip_taskbar(&self, skip: bool) -> Result<()> {
  function set_cursor_grab (line 2295) | fn set_cursor_grab(&self, grab: bool) -> crate::Result<()> {
  function set_cursor_visible (line 2302) | fn set_cursor_visible(&self, visible: bool) -> crate::Result<()> {
  function set_cursor_icon (line 2309) | fn set_cursor_icon(&self, icon: CursorIcon) -> crate::Result<()> {
  function set_cursor_position (line 2316) | fn set_cursor_position<Pos: Into<Position>>(&self, position: Pos) -> cra...
  function set_ignore_cursor_events (line 2326) | fn set_ignore_cursor_events(&self, ignore: bool) -> crate::Result<()> {
  function start_dragging (line 2333) | fn start_dragging(&self) -> Result<()> {
  function start_resize_dragging (line 2340) | fn start_resize_dragging(&self, direction: tauri_runtime::ResizeDirectio...
  function set_badge_count (line 2347) | fn set_badge_count(&self, count: Option<i64>, desktop_filename: Option<S...
  function set_badge_label (line 2357) | fn set_badge_label(&self, label: Option<String>) -> Result<()> {
  function set_overlay_icon (line 2364) | fn set_overlay_icon(&self, icon: Option<Icon>) -> Result<()> {
  function set_progress_bar (line 2373) | fn set_progress_bar(&self, progress_state: ProgressBarState) -> Result<(...
  function set_title_bar_style (line 2383) | fn set_title_bar_style(&self, style: tauri_utils::TitleBarStyle) -> Resu...
  function set_traffic_light_position (line 2390) | fn set_traffic_light_position(&self, position: Position) -> Result<()> {
  function set_theme (line 2400) | fn set_theme(&self, theme: Option<Theme>) -> Result<()> {
  function set_background_color (line 2407) | fn set_background_color(&self, color: Option<Color>) -> Result<()> {
  type WebviewWrapper (line 2416) | pub struct WebviewWrapper {
  type Target (line 2428) | type Target = WebView;
  method deref (line 2431) | fn deref(&self) -> &Self::Target {
  method drop (line 2437) | fn drop(&mut self) {
  type WindowWrapper (line 2464) | pub struct WindowWrapper {
    method label (line 2482) | pub fn label(&self) -> &str {
    method fmt (line 2488) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  type EventProxy (line 2497) | pub struct EventProxy<T: UserEvent>(TaoEventLoopProxy<Message<T>>);
  function send_event (line 2504) | fn send_event(&self, event: T) -> Result<()> {
  type PluginBuilder (line 2512) | pub trait PluginBuilder<T: UserEvent> {
    method build (line 2514) | fn build(self, context: Context<T>) -> Self::Plugin;
  type Plugin (line 2517) | pub trait Plugin<T: UserEvent> {
    method on_event (line 2518) | fn on_event(
  type Wry (line 2530) | pub struct Wry<T: UserEvent> {
  function fmt (line 2536) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  type WryHandle (line 2548) | pub struct WryHandle<T: UserEvent> {
  function create_tao_window (line 2558) | pub fn create_tao_window<F: FnOnce() -> (String, TaoWindowBuilder) + Sen...
  function window_id (line 2569) | pub fn window_id(&self, window_id: TaoWindowId) -> WindowId {
  function send_event (line 2581) | pub fn send_event(&self, message: Message<T>) -> Result<()> {
  function plugin (line 2590) | pub fn plugin<P: PluginBuilder<T> + 'static>(&mut self, plugin: P)
  type Runtime (line 2604) | type Runtime = Wry<T>;
  function create_proxy (line 2606) | fn create_proxy(&self) -> EventProxy<T> {
  function set_activation_policy (line 2611) | fn set_activation_policy(&self, activation_policy: ActivationPolicy) -> ...
  function set_dock_visibility (line 2619) | fn set_dock_visibility(&self, visible: bool) -> Result<()> {
  function request_exit (line 2623) | fn request_exit(&self, code: i32) -> Result<()> {
  function create_window (line 2634) | fn create_window<F: Fn(RawWindow) + Send + 'static>(
  function create_webview (line 2644) | fn create_webview(
  function run_on_main_thread (line 2652) | fn run_on_main_thread<F: FnOnce() + Send + 'static>(&self, f: F) -> Resu...
  function display_handle (line 2656) | fn display_handle(
  function primary_monitor (line 2662) | fn primary_monitor(&self) -> Option<Monitor> {
  function monitor_from_point (line 2671) | fn monitor_from_point(&self, x: f64, y: f64) -> Option<Monitor> {
  function available_monitors (line 2680) | fn available_monitors(&self) -> Vec<Monitor> {
  function cursor_position (line 2690) | fn cursor_position(&self) -> Result<PhysicalPosition<f64>> {
  function set_theme (line 2697) | fn set_theme(&self, theme: Option<Theme>) {
  function show (line 2705) | fn show(&self) -> tauri_runtime::Result<()> {
  function hide (line 2713) | fn hide(&self) -> tauri_runtime::Result<()> {
  function set_device_event_filter (line 2720) | fn set_device_event_filter(&self, filter: DeviceEventFilter) {
  function find_class (line 2728) | fn find_class<'a>(
  function run_on_android_context (line 2738) | fn run_on_android_context<F>(&self, f: F)
  function fetch_data_store_identifiers (line 2746) | fn fetch_data_store_identifiers<F: FnOnce(Vec<[u8; 16]>) + Send + 'static>(
  function remove_data_store (line 2757) | fn remove_data_store<F: FnOnce(Result<()>) + Send + 'static>(
  function init_with_builder (line 2770) | fn init_with_builder(
  function init (line 2794) | fn init(event_loop: EventLoop<Message<T>>) -> Result<Self> {
  type WindowDispatcher (line 2828) | type WindowDispatcher = WryWindowDispatcher<T>;
  type WebviewDispatcher (line 2829) | type WebviewDispatcher = WryWebviewDispatcher<T>;
  type Handle (line 2830) | type Handle = WryHandle<T>;
  type EventLoopProxy (line 2832) | type EventLoopProxy = EventProxy<T>;
  function new (line 2834) | fn new(args: RuntimeInitArgs) -> Result<Self> {
  function new_any_thread (line 2844) | fn new_any_thread(args: RuntimeInitArgs) -> Result<Self> {
  function new_any_thread (line 2852) | fn new_any_thread(args: RuntimeInitArgs) -> Result<Self> {
  function create_proxy (line 2859) | fn create_proxy(&self) -> EventProxy<T> {
  function handle (line 2863) | fn handle(&self) -> Self::Handle {
  function create_window (line 2869) | fn create_window<F: Fn(RawWindow) + Send + 'static>(
  function create_webview (line 2932) | fn create_webview(
  function primary_monitor (line 2988) | fn primary_monitor(&self) -> Option<Monitor> {
  function monitor_from_point (line 2997) | fn monitor_from_point(&self, x: f64, y: f64) -> Option<Monitor> {
  function available_monitors (line 3006) | fn available_monitors(&self) -> Vec<Monitor> {
  function cursor_position (line 3016) | fn cursor_position(&self) -> Result<PhysicalPosition<f64>> {
  function set_theme (line 3027) | fn set_theme(&self, theme: Option<Theme>) {
  function set_activation_policy (line 3032) | fn set_activation_policy(&mut self, activation_policy: ActivationPolicy) {
  function set_dock_visibility (line 3039) | fn set_dock_visibility(&mut self, visible: bool) {
  function show (line 3044) | fn show(&self) {
  function hide (line 3049) | fn hide(&self) {
  function set_device_event_filter (line 3053) | fn set_device_event_filter(&mut self, filter: DeviceEventFilter) {
  function run_iteration (line 3060) | fn run_iteration<F: FnMut(RunEvent<T>) + 'static>(&mut self, mut callbac...
  function run (line 3115) | fn run<F: FnMut(RunEvent<T>) + 'static>(self, callback: F) {
  function run_return (line 3122) | fn run_return<F: FnMut(RunEvent<T>) + 'static>(mut self, callback: F) ->...
  function run_return (line 3131) | fn run_return<F: FnMut(RunEvent<T>) + 'static>(self, callback: F) -> i32 {
  function make_event_handler (line 3137) | fn make_event_handler<T, F>(
  type EventLoopIterationContext (line 3189) | pub struct EventLoopIterationContext<'a, T: UserEvent> {
  type UserMessageContext (line 3197) | struct UserMessageContext {
  function handle_user_message (line 3202) | fn handle_user_message<T: UserEvent>(
  function handle_event_loop (line 4016) | fn handle_event_loop<T: UserEvent>(
  function on_close_requested (line 4262) | fn on_close_requested<'a, T: UserEvent>(
  function on_window_close (line 4293) | fn on_window_close(window_id: WindowId, windows: Arc<WindowsStore>) {
  function parse_proxy_url (line 4301) | fn parse_proxy_url(url: &Url) -> Result<ProxyConfig> {
  function create_window (line 4318) | fn create_window<T: UserEvent, F: Fn(RawWindow) + Send + 'static>(
  type WebviewKind (line 4541) | enum WebviewKind {
  type WebviewBounds (line 4549) | struct WebviewBounds {
  function create_webview (line 4556) | fn create_webview<T: UserEvent>(
  function create_ipc_handler (line 5169) | fn create_ipc_handler<T: UserEvent>(
  function inner_size (line 5195) | fn inner_size(
  function inner_size (line 5214) | fn inner_size(
  function to_tao_theme (line 5222) | fn to_tao_theme(theme: Option<Theme>) -> Option<TaoTheme> {

FILE: crates/tauri-runtime-wry/src/monitor/linux.rs
  function work_area (line 10) | fn work_area(&self) -> PhysicalRect<i32, u32> {

FILE: crates/tauri-runtime-wry/src/monitor/macos.rs
  function work_area (line 8) | fn work_area(&self) -> PhysicalRect<i32, u32> {

FILE: crates/tauri-runtime-wry/src/monitor/mod.rs
  type MonitorExt (line 20) | pub trait MonitorExt {
    method work_area (line 26) | fn work_area(&self) -> PhysicalRect<i32, u32>;
    method work_area (line 31) | fn work_area(&self) -> PhysicalRect<i32, u32> {

FILE: crates/tauri-runtime-wry/src/monitor/windows.rs
  function work_area (line 9) | fn work_area(&self) -> PhysicalRect<i32, u32> {

FILE: crates/tauri-runtime-wry/src/undecorated_resizing.rs
  constant CLIENT (line 14) | const CLIENT: isize = 0b0000;
  constant LEFT (line 15) | const LEFT: isize = 0b0001;
  constant RIGHT (line 16) | const RIGHT: isize = 0b0010;
  constant TOP (line 17) | const TOP: isize = 0b0100;
  constant BOTTOM (line 18) | const BOTTOM: isize = 0b1000;
  constant TOPLEFT (line 19) | const TOPLEFT: isize = TOP | LEFT;
  constant TOPRIGHT (line 20) | const TOPRIGHT: isize = TOP | RIGHT;
  constant BOTTOMLEFT (line 21) | const BOTTOMLEFT: isize = BOTTOM | LEFT;
  constant BOTTOMRIGHT (line 22) | const BOTTOMRIGHT: isize = BOTTOM | RIGHT;
  type WindowPositions (line 30) | type WindowPositions = i32;
  type WindowPositions (line 32) | type WindowPositions = f64;
  type HitTestResult (line 35) | enum HitTestResult {
    method to_win32 (line 92) | fn to_win32(self) -> i32 {
    method to_gtk_edge (line 509) | fn to_gtk_edge(self) -> gtk::gdk::WindowEdge {
  function hit_test (line 49) | fn hit_test(
  constant CLASS_NAME (line 107) | const CLASS_NAME: PCWSTR = w!("TAURI_DRAG_RESIZE_BORDERS");
  constant WINDOW_NAME (line 108) | const WINDOW_NAME: PCWSTR = w!("TAURI_DRAG_RESIZE_WINDOW");
  constant WM_UPDATE_UNDECORATED_SHADOWS (line 110) | const WM_UPDATE_UNDECORATED_SHADOWS: u32 = WM_USER + 100;
  type UndecoratedResizingData (line 112) | struct UndecoratedResizingData {
  function attach_resize_handler (line 117) | pub fn attach_resize_handler(hwnd: isize, has_undecorated_shadows: bool) {
  function subclass_parent (line 198) | unsafe extern "system" fn subclass_parent(
  function drag_resize_window_proc (line 263) | unsafe extern "system" fn drag_resize_window_proc(
  function detach_resize_handler (line 403) | pub fn detach_resize_handler(hwnd: isize) {
  function set_drag_hwnd_rgn (line 413) | unsafe fn set_drag_hwnd_rgn(hwnd: HWND, width: i32, height: i32, only_to...
  function update_drag_hwnd_rgn_for_undecorated (line 443) | pub fn update_drag_hwnd_rgn_for_undecorated(hwnd: isize, has_undecorated...
  function is_maximized (line 478) | fn is_maximized(window: HWND) -> windows::core::Result<bool> {
  function GET_X_LPARAM (line 490) | fn GET_X_LPARAM(lparam: LPARAM) -> i16 {
  function GET_Y_LPARAM (line 497) | fn GET_Y_LPARAM(lparam: LPARAM) -> i16 {
  constant BORDERLESS_RESIZE_INSET (line 506) | const BORDERLESS_RESIZE_INSET: i32 = 5;
  function attach_resize_handler (line 524) | pub fn attach_resize_handler(webview: &wry::WebView) {

FILE: crates/tauri-runtime-wry/src/util.rs
  function encode_wide (line 26) | pub fn encode_wide(string: impl AsRef<std::ffi::OsStr>) -> Vec<u16> {
  function get_function_impl (line 32) | pub(super) fn get_function_impl(library: &str, function: &str) -> FARPROC {
  type GetDpiForWindow (line 52) | type GetDpiForWindow = unsafe extern "system" fn(hwnd: HWND) -> u32;
  type GetDpiForMonitor (line 53) | type GetDpiForMonitor = unsafe extern "system" fn(
  type GetSystemMetricsForDpi (line 59) | type GetSystemMetricsForDpi =
  function hwnd_dpi (line 70) | pub unsafe fn hwnd_dpi(hwnd: HWND) -> u32 {
  function get_system_metrics_for_dpi (line 111) | pub unsafe fn get_system_metrics_for_dpi(nindex: SYSTEM_METRICS_INDEX, d...

FILE: crates/tauri-runtime-wry/src/webview.rs
  type Webview (line 13) | pub type Webview = webkit2gtk::WebView;
  type Webview (line 20) | pub struct Webview {
  type Webview (line 35) | pub struct Webview {
  type Webview (line 44) | pub type Webview = JniHandle;

FILE: crates/tauri-runtime-wry/src/window/linux.rs
  function set_enabled (line 16) | fn set_enabled(&self, enabled: bool) {
  function is_enabled (line 20) | fn is_enabled(&self) -> bool {
  function center (line 24) | fn center(&self) {

FILE: crates/tauri-runtime-wry/src/window/macos.rs
  function set_enabled (line 12) | fn set_enabled(&self, enabled: bool) {
  function is_enabled (line 34) | fn is_enabled(&self) -> bool {
  function center (line 39) | fn center(&self) {

FILE: crates/tauri-runtime-wry/src/window/mod.rs
  type WindowExt (line 20) | pub trait WindowExt {
    method set_enabled (line 26) | fn set_enabled(&self, enabled: bool);
    method is_enabled (line 33) | fn is_enabled(&self) -> bool;
    method center (line 40) | fn center(&self) {}
    method draw_surface (line 44) | fn draw_surface(
    method set_enabled (line 56) | fn set_enabled(&self, _: bool) {}
    method is_enabled (line 57) | fn is_enabled(&self) -> bool {
  function calculate_window_center_position (line 62) | pub fn calculate_window_center_position(

FILE: crates/tauri-runtime-wry/src/window/windows.rs
  function set_enabled (line 14) | fn set_enabled(&self, enabled: bool) {
  function is_enabled (line 18) | fn is_enabled(&self) -> bool {
  function center (line 22) | fn center(&self) {
  function draw_surface (line 46) | fn draw_surface(

FILE: crates/tauri-runtime/build.rs
  function alias (line 7) | fn alias(alias: &str, has_feature: bool) {
  function main (line 14) | fn main() {

FILE: crates/tauri-runtime/src/dpi.rs
  type Rect (line 10) | pub struct Rect {
  method default (line 18) | fn default() -> Self {
  type PhysicalRect (line 28) | pub struct PhysicalRect<P: dpi::Pixel, S: dpi::Pixel> {
  method default (line 36) | fn default() -> Self {
  type LogicalRect (line 46) | pub struct LogicalRect<P: dpi::Pixel, S: dpi::Pixel> {
  method default (line 54) | fn default() -> Self {

FILE: crates/tauri-runtime/src/lib.rs
  type WindowEventId (line 48) | pub type WindowEventId = u32;
  type WebviewEventId (line 49) | pub type WebviewEventId = u32;
  type ProgressBarStatus (line 54) | pub enum ProgressBarStatus {
  type ProgressBarState (line 70) | pub struct ProgressBarState {
  type UserAttentionType (line 82) | pub enum UserAttentionType {
  type DeviceEventFilter (line 95) | pub enum DeviceEventFilter {
  type ResizeDirection (line 107) | pub enum ResizeDirection {
  type Error (line 120) | pub enum Error {
  type Result (line 173) | pub type Result<T> = std::result::Result<T, Error>;
  type Icon (line 177) | pub struct Icon<'a> {
  type UserEvent (line 187) | pub trait UserEvent: Debug + Clone + Send + 'static {}
  type RunEvent (line 194) | pub enum RunEvent<T: UserEvent> {
  type ExitRequestedEventAction (line 240) | pub enum ExitRequestedEventAction {
  type ActivationPolicy (line 249) | pub enum ActivationPolicy {
  type RuntimeHandle (line 259) | pub trait RuntimeHandle<T: UserEvent>: Debug + Clone + Send + Sync + Siz...
    method create_proxy (line 263) | fn create_proxy(&self) -> <Self::Runtime as Runtime<T>>::EventLoopProxy;
    method set_activation_policy (line 268) | fn set_activation_policy(&self, activation_policy: ActivationPolicy) -...
    method set_dock_visibility (line 273) | fn set_dock_visibility(&self, visible: bool) -> Result<()>;
    method request_exit (line 276) | fn request_exit(&self, code: i32) -> Result<()>;
    method create_window (line 279) | fn create_window<F: Fn(RawWindow) + Send + 'static>(
    method create_webview (line 286) | fn create_webview(
    method run_on_main_thread (line 293) | fn run_on_main_thread<F: FnOnce() + Send + 'static>(&self, f: F) -> Re...
    method display_handle (line 296) | fn display_handle(
    method primary_monitor (line 303) | fn primary_monitor(&self) -> Option<Monitor>;
    method monitor_from_point (line 306) | fn monitor_from_point(&self, x: f64, y: f64) -> Option<Monitor>;
    method available_monitors (line 309) | fn available_monitors(&self) -> Vec<Monitor>;
    method cursor_position (line 312) | fn cursor_position(&self) -> Result<PhysicalPosition<f64>>;
    method set_theme (line 315) | fn set_theme(&self, theme: Option<Theme>);
    method show (line 320) | fn show(&self) -> Result<()>;
    method hide (line 325) | fn hide(&self) -> Result<()>;
    method set_device_event_filter (line 334) | fn set_device_event_filter(&self, filter: DeviceEventFilter);
    method find_class (line 338) | fn find_class<'a>(
    method run_on_android_context (line 349) | fn run_on_android_context<F>(&self, f: F)
    method fetch_data_store_identifiers (line 355) | fn fetch_data_store_identifiers<F: FnOnce(Vec<[u8; 16]>) + Send + 'sta...
    method remove_data_store (line 362) | fn remove_data_store<F: FnOnce(Result<()>) + Send + 'static>(
  type EventLoopProxy (line 369) | pub trait EventLoopProxy<T: UserEvent>: Debug + Clone + Send + Sync {
    method send_event (line 370) | fn send_event(&self, event: T) -> Result<()>;
  type RuntimeInitArgs (line 374) | pub struct RuntimeInitArgs {
  type Runtime (line 388) | pub trait Runtime<T: UserEvent>: Debug + Sized + 'static {
    method new (line 399) | fn new(args: RuntimeInitArgs) -> Result<Self>;
    method new_any_thread (line 421) | fn new_any_thread(args: RuntimeInitArgs) -> Result<Self>;
    method create_proxy (line 424) | fn create_proxy(&self) -> Self::EventLoopProxy;
    method handle (line 427) | fn handle(&self) -> Self::Handle;
    method create_window (line 430) | fn create_window<F: Fn(RawWindow) + Send + 'static>(
    method create_webview (line 437) | fn create_webview(
    method primary_monitor (line 446) | fn primary_monitor(&self) -> Option<Monitor>;
    method monitor_from_point (line 449) | fn monitor_from_point(&self, x: f64, y: f64) -> Option<Monitor>;
    method available_monitors (line 452) | fn available_monitors(&self) -> Vec<Monitor>;
    method cursor_position (line 455) | fn cursor_position(&self) -> Result<PhysicalPosition<f64>>;
    method set_theme (line 458) | fn set_theme(&self, theme: Option<Theme>);
    method set_activation_policy (line 463) | fn set_activation_policy(&mut self, activation_policy: ActivationPolicy);
    method set_dock_visibility (line 468) | fn set_dock_visibility(&mut self, visible: bool);
    method show (line 473) | fn show(&self);
    method hide (line 478) | fn hide(&self);
    method set_device_event_filter (line 491) | fn set_device_event_filter(&mut self, filter: DeviceEventFilter);
    method run_iteration (line 495) | fn run_iteration<F: FnMut(RunEvent<T>) + 'static>(&mut self, callback:...
    method run_return (line 498) | fn run_return<F: FnMut(RunEvent<T>) + 'static>(self, callback: F) -> i32;
    method run (line 501) | fn run<F: FnMut(RunEvent<T>) + 'static>(self, callback: F);
  type WebviewDispatch (line 505) | pub trait WebviewDispatch<T: UserEvent>: Debug + Clone + Send + Sync + S...
    method run_on_main_thread (line 510) | fn run_on_main_thread<F: FnOnce() + Send + 'static>(&self, f: F) -> Re...
    method on_webview_event (line 513) | fn on_webview_event<F: Fn(&WebviewEvent) + Send + 'static>(&self, f: F...
    method with_webview (line 516) | fn with_webview<F: FnOnce(Box<dyn std::any::Any>) + Send + 'static>(&s...
    method open_devtools (line 520) | fn open_devtools(&self);
    method close_devtools (line 524) | fn close_devtools(&self);
    method is_devtools_open (line 528) | fn is_devtools_open(&self) -> Result<bool>;
    method url (line 533) | fn url(&self) -> Result<String>;
    method bounds (line 536) | fn bounds(&self) -> Result<Rect>;
    method position (line 539) | fn position(&self) -> Result<PhysicalPosition<i32>>;
    method size (line 542) | fn size(&self) -> Result<PhysicalSize<u32>>;
    method navigate (line 547) | fn navigate(&self, url: Url) -> Result<()>;
    method reload (line 550) | fn reload(&self) -> Result<()>;
    method print (line 553) | fn print(&self) -> Result<()>;
    method close (line 556) | fn close(&self) -> Result<()>;
    method set_bounds (line 559) | fn set_bounds(&self, bounds: Rect) -> Result<()>;
    method set_size (line 562) | fn set_size(&self, size: Size) -> Result<()>;
    method set_position (line 565) | fn set_position(&self, position: Position) -> Result<()>;
    method set_focus (line 568) | fn set_focus(&self) -> Result<()>;
    method hide (line 571) | fn hide(&self) -> Result<()>;
    method show (line 574) | fn show(&self) -> Result<()>;
    method eval_script (line 577) | fn eval_script<S: Into<String>>(&self, script: S) -> Result<()>;
    method reparent (line 580) | fn reparent(&self, window_id: WindowId) -> Result<()>;
    method cookies_for_url (line 587) | fn cookies_for_url(&self, url: Url) -> Result<Vec<Cookie<'static>>>;
    method cookies (line 595) | fn cookies(&self) -> Result<Vec<Cookie<'static>>>;
    method set_cookie (line 602) | fn set_cookie(&self, cookie: cookie::Cookie<'_>) -> Result<()>;
    method delete_cookie (line 609) | fn delete_cookie(&self, cookie: cookie::Cookie<'_>) -> Result<()>;
    method set_auto_resize (line 612) | fn set_auto_resize(&self, auto_resize: bool) -> Result<()>;
    method set_zoom (line 615) | fn set_zoom(&self, scale_factor: f64) -> Result<()>;
    method set_background_color (line 618) | fn set_background_color(&self, color: Option<Color>) -> Result<()>;
    method clear_all_browsing_data (line 621) | fn clear_all_browsing_data(&self) -> Result<()>;
  type WindowDispatch (line 625) | pub trait WindowDispatch<T: UserEvent>: Debug + Clone + Send + Sync + Si...
    method run_on_main_thread (line 633) | fn run_on_main_thread<F: FnOnce() + Send + 'static>(&self, f: F) -> Re...
    method on_window_event (line 636) | fn on_window_event<F: Fn(&WindowEvent) + Send + 'static>(&self, f: F) ...
    method scale_factor (line 641) | fn scale_factor(&self) -> Result<f64>;
    method inner_position (line 644) | fn inner_position(&self) -> Result<PhysicalPosition<i32>>;
    method outer_position (line 647) | fn outer_position(&self) -> Result<PhysicalPosition<i32>>;
    method inner_size (line 652) | fn inner_size(&self) -> Result<PhysicalSize<u32>>;
    method outer_size (line 657) | fn outer_size(&self) -> Result<PhysicalSize<u32>>;
    method is_fullscreen (line 660) | fn is_fullscreen(&self) -> Result<bool>;
    method is_minimized (line 663) | fn is_minimized(&self) -> Result<bool>;
    method is_maximized (line 666) | fn is_maximized(&self) -> Result<bool>;
    method is_focused (line 669) | fn is_focused(&self) -> Result<bool>;
    method is_decorated (line 672) | fn is_decorated(&self) -> Result<bool>;
    method is_resizable (line 675) | fn is_resizable(&self) -> Result<bool>;
    method is_maximizable (line 682) | fn is_maximizable(&self) -> Result<bool>;
    method is_minimizable (line 689) | fn is_minimizable(&self) -> Result<bool>;
    method is_closable (line 696) | fn is_closable(&self) -> Result<bool>;
    method is_visible (line 699) | fn is_visible(&self) -> Result<bool>;
    method is_enabled (line 702) | fn is_enabled(&self) -> Result<bool>;
    method is_always_on_top (line 709) | fn is_always_on_top(&self) -> Result<bool>;
    method title (line 712) | fn title(&self) -> Result<String>;
    method current_monitor (line 717) | fn current_monitor(&self) -> Result<Option<Monitor>>;
    method primary_monitor (line 722) | fn primary_monitor(&self) -> Result<Option<Monitor>>;
    method monitor_from_point (line 725) | fn monitor_from_point(&self, x: f64, y: f64) -> Result<Option<Monitor>>;
    method available_monitors (line 728) | fn available_monitors(&self) -> Result<Vec<Monitor>>;
    method gtk_window (line 738) | fn gtk_window(&self) -> Result<gtk::ApplicationWindow>;
    method default_vbox (line 748) | fn default_vbox(&self) -> Result<gtk::Box>;
    method window_handle (line 751) | fn window_handle(
    method theme (line 756) | fn theme(&self) -> Result<Theme>;
    method center (line 761) | fn center(&self) -> Result<()>;
    method request_user_attention (line 766) | fn request_user_attention(&self, request_type: Option<UserAttentionTyp...
    method create_window (line 769) | fn create_window<F: Fn(RawWindow) + Send + 'static>(
    method create_webview (line 776) | fn create_webview(
    method set_resizable (line 782) | fn set_resizable(&self, resizable: bool) -> Result<()>;
    method set_enabled (line 789) | fn set_enabled(&self, enabled: bool) -> Result<()>;
    method set_maximizable (line 797) | fn set_maximizable(&self, maximizable: bool) -> Result<()>;
    method set_minimizable (line 804) | fn set_minimizable(&self, minimizable: bool) -> Result<()>;
    method set_closable (line 813) | fn set_closable(&self, closable: bool) -> Result<()>;
    method set_title (line 816) | fn set_title<S: Into<String>>(&self, title: S) -> Result<()>;
    method maximize (line 819) | fn maximize(&self) -> Result<()>;
    method unmaximize (line 822) | fn unmaximize(&self) -> Result<()>;
    method minimize (line 825) | fn minimize(&self) -> Result<()>;
    method unminimize (line 828) | fn unminimize(&self) -> Result<()>;
    method show (line 831) | fn show(&self) -> Result<()>;
    method hide (line 834) | fn hide(&self) -> Result<()>;
    method close (line 837) | fn close(&self) -> Result<()>;
    method destroy (line 840) | fn destroy(&self) -> Result<()>;
    method set_decorations (line 843) | fn set_decorations(&self, decorations: bool) -> Result<()>;
    method set_shadow (line 846) | fn set_shadow(&self, enable: bool) -> Result<()>;
    method set_always_on_bottom (line 849) | fn set_always_on_bottom(&self, always_on_bottom: bool) -> Result<()>;
    method set_always_on_top (line 852) | fn set_always_on_top(&self, always_on_top: bool) -> Result<()>;
    method set_visible_on_all_workspaces (line 855) | fn set_visible_on_all_workspaces(&self, visible_on_all_workspaces: boo...
    method set_background_color (line 858) | fn set_background_color(&self, color: Option<Color>) -> Result<()>;
    method set_content_protected (line 861) | fn set_content_protected(&self, protected: bool) -> Result<()>;
    method set_size (line 864) | fn set_size(&self, size: Size) -> Result<()>;
    method set_min_size (line 867) | fn set_min_size(&self, size: Option<Size>) -> Result<()>;
    method set_max_size (line 870) | fn set_max_size(&self, size: Option<Size>) -> Result<()>;
    method set_size_constraints (line 873) | fn set_size_constraints(&self, constraints: WindowSizeConstraints) -> ...
    method set_position (line 876) | fn set_position(&self, position: Position) -> Result<()>;
    method set_fullscreen (line 879) | fn set_fullscreen(&self, fullscreen: bool) -> Result<()>;
    method set_simple_fullscreen (line 882) | fn set_simple_fullscreen(&self, enable: bool) -> Result<()>;
    method set_focus (line 885) | fn set_focus(&self) -> Result<()>;
    method set_focusable (line 888) | fn set_focusable(&self, focusable: bool) -> Result<()>;
    method set_icon (line 891) | fn set_icon(&self, icon: Icon) -> Result<()>;
    method set_skip_taskbar (line 894) | fn set_skip_taskbar(&self, skip: bool) -> Result<()>;
    method set_cursor_grab (line 900) | fn set_cursor_grab(&self, grab: bool) -> Result<()>;
    method set_cursor_visible (line 905) | fn set_cursor_visible(&self, visible: bool) -> Result<()>;
    method set_cursor_icon (line 908) | fn set_cursor_icon(&self, icon: CursorIcon) -> Result<()>;
    method set_cursor_position (line 911) | fn set_cursor_position<Pos: Into<Position>>(&self, position: Pos) -> R...
    method set_ignore_cursor_events (line 914) | fn set_ignore_cursor_events(&self, ignore: bool) -> Result<()>;
    method start_dragging (line 917) | fn start_dragging(&self) -> Result<()>;
    method start_resize_dragging (line 920) | fn start_resize_dragging(&self, direction: ResizeDirection) -> Result<...
    method set_badge_count (line 930) | fn set_badge_count(&self, count: Option<i64>, desktop_filename: Option...
    method set_badge_label (line 933) | fn set_badge_label(&self, label: Option<String>) -> Result<()>;
    method set_overlay_icon (line 938) | fn set_overlay_icon(&self, icon: Option<Icon>) -> Result<()>;
    method set_progress_bar (line 946) | fn set_progress_bar(&self, progress_state: ProgressBarState) -> Result...
    method set_title_bar_style (line 953) | fn set_title_bar_style(&self, style: tauri_utils::TitleBarStyle) -> Re...
    method set_traffic_light_position (line 962) | fn set_traffic_light_position(&self, position: Position) -> Result<()>;
    method set_theme (line 970) | fn set_theme(&self, theme: Option<Theme>) -> Result<()>;

FILE: crates/tauri-runtime/src/monitor.rs
  type Monitor (line 9) | pub struct Monitor {

FILE: crates/tauri-runtime/src/webview.rs
  type UriSchemeProtocolHandler (line 26) | type UriSchemeProtocolHandler = dyn Fn(&str, http::Request<Vec<u8>>, Box...
  type WebResourceRequestHandler (line 31) | type WebResourceRequestHandler =
  type NavigationHandler (line 34) | type NavigationHandler = dyn Fn(&Url) -> bool + Send;
  type NewWindowHandler (line 36) | type NewWindowHandler = dyn Fn(Url, NewWindowFeatures) -> NewWindowRespo...
  type OnPageLoadHandler (line 38) | type OnPageLoadHandler = dyn Fn(Url, PageLoadEvent) + Send;
  type DocumentTitleChangedHandler (line 40) | type DocumentTitleChangedHandler = dyn Fn(String) + Send + 'static;
  type DownloadHandler (line 42) | type DownloadHandler = dyn Fn(DownloadEvent) -> bool + Send + Sync;
  type InputAccessoryViewBuilderFn (line 45) | type InputAccessoryViewBuilderFn = dyn Fn(&objc2_ui_kit::UIView) -> Opti...
  type DownloadEvent (line 51) | pub enum DownloadEvent<'a> {
  type CreationContext (line 73) | pub struct CreationContext<'a, 'b> {
  type PageLoadEvent (line 81) | pub enum PageLoadEvent {
  type NewWindowOpener (line 90) | pub struct NewWindowOpener {
  type NewWindowFeatures (line 121) | pub struct NewWindowFeatures {
    method new (line 128) | pub fn new(
    method size (line 142) | pub fn size(&self) -> Option<crate::dpi::LogicalSize<f64>> {
    method position (line 148) | pub fn position(&self) -> Option<crate::dpi::LogicalPosition<f64>> {
    method opener (line 153) | pub fn opener(&self) -> &NewWindowOpener {
  type NewWindowResponse (line 159) | pub enum NewWindowResponse {
  type ScrollBarStyle (line 181) | pub enum ScrollBarStyle {
  type PendingWebview (line 195) | pub struct PendingWebview<T: UserEvent, R: Runtime<T>> {
  function new (line 232) | pub fn new(
  function register_uri_scheme_protocol (line 258) | pub fn register_uri_scheme_protocol<
  function on_webview_created (line 276) | pub fn on_webview_created<
  type DetachedWebview (line 289) | pub struct DetachedWebview<T: UserEvent, R: Runtime<T>> {
  method clone (line 298) | fn clone(&self) -> Self {
  method hash (line 308) | fn hash<H: Hasher>(&self, state: &mut H) {
  method eq (line 316) | fn eq(&self, other: &Self) -> bool {
  type WebviewAttributes (line 323) | pub struct WebviewAttributes {
    method from (line 422) | fn from(config: &WindowConfig) -> Self {
    method new (line 482) | pub fn new(url: WebviewUrl) -> Self {
    method user_agent (line 530) | pub fn user_agent(mut self, user_agent: &str) -> Self {
    method initialization_script (line 553) | pub fn initialization_script(mut self, script: impl Into<String>) -> S...
    method initialization_script_on_all_frames (line 579) | pub fn initialization_script_on_all_frames(mut self, script: impl Into...
    method data_directory (line 589) | pub fn data_directory(mut self, data_directory: PathBuf) -> Self {
    method disable_drag_drop_handler (line 596) | pub fn disable_drag_drop_handler(mut self) -> Self {
    method enable_clipboard_access (line 606) | pub fn enable_clipboard_access(mut self) -> Self {
    method accept_first_mouse (line 613) | pub fn accept_first_mouse(mut self, accept: bool) -> Self {
    method additional_browser_args (line 620) | pub fn additional_browser_args(mut self, additional_args: &str) -> Self {
    method window_effects (line 627) | pub fn window_effects(mut self, effects: WindowEffectsConfig) -> Self {
    method incognito (line 634) | pub fn incognito(mut self, incognito: bool) -> Self {
    method transparent (line 642) | pub fn transparent(mut self, transparent: bool) -> Self {
    method focused (line 649) | pub fn focused(mut self, focus: bool) -> Self {
    method auto_resize (line 656) | pub fn auto_resize(mut self) -> Self {
    method proxy_url (line 663) | pub fn proxy_url(mut self, url: Url) -> Self {
    method zoom_hotkeys_enabled (line 678) | pub fn zoom_hotkeys_enabled(mut self, enabled: bool) -> Self {
    method browser_extensions_enabled (line 690) | pub fn browser_extensions_enabled(mut self, enabled: bool) -> Self {
    method use_https_scheme (line 705) | pub fn use_https_scheme(mut self, enabled: bool) -> Self {
    method devtools (line 720) | pub fn devtools(mut self, enabled: Option<bool>) -> Self {
    method background_color (line 731) | pub fn background_color(mut self, color: Color) -> Self {
    method traffic_light_position (line 744) | pub fn traffic_light_position(mut self, position: dpi::Position) -> Se...
    method allow_link_preview (line 759) | pub fn allow_link_preview(mut self, allow_link_preview: bool) -> Self {
    method background_throttling (line 779) | pub fn background_throttling(mut self, policy: Option<BackgroundThrott...
    method scroll_bar_style (line 798) | pub fn scroll_bar_style(mut self, style: ScrollBarStyle) -> Self {
  type InputAccessoryViewBuilder (line 405) | pub struct InputAccessoryViewBuilder(pub Box<InputAccessoryViewBuilderFn>);
    method fmt (line 409) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::result::Result<...
    method new (line 416) | pub fn new(builder: Box<InputAccessoryViewBuilderFn>) -> Self {
  type WebviewIpcHandler (line 805) | pub type WebviewIpcHandler<T, R> = Box<dyn Fn(DetachedWebview<T, R>, Req...
  type InitializationScript (line 809) | pub struct InitializationScript {

FILE: crates/tauri-runtime/src/window.rs
  type WindowEvent (line 30) | pub enum WindowEvent {
  type WebviewEvent (line 69) | pub enum WebviewEvent {
  type DragDropEvent (line 77) | pub enum DragDropEvent {
  type CursorIcon (line 104) | pub enum CursorIcon {
    method deserialize (line 162) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  type WindowSizeConstraints (line 211) | pub struct WindowSizeConstraints {
  type WindowBuilderBase (line 233) | pub trait WindowBuilderBase: std::fmt::Debug + Clone + Sized {}
  type WindowBuilder (line 239) | pub trait WindowBuilder: WindowBuilderBase {
    method new (line 241) | fn new() -> Self;
    method with_config (line 244) | fn with_config(config: &WindowConfig) -> Self;
    method center (line 248) | fn center(self) -> Self;
    method position (line 252) | fn position(self, x: f64, y: f64) -> Self;
    method inner_size (line 256) | fn inner_size(self, width: f64, height: f64) -> Self;
    method min_inner_size (line 260) | fn min_inner_size(self, min_width: f64, min_height: f64) -> Self;
    method max_inner_size (line 264) | fn max_inner_size(self, max_width: f64, max_height: f64) -> Self;
    method inner_size_constraints (line 268) | fn inner_size_constraints(self, constraints: WindowSizeConstraints) ->...
    method prevent_overflow (line 276) | fn prevent_overflow(self) -> Self;
    method prevent_overflow_with_margin (line 285) | fn prevent_overflow_with_margin(self, margin: dpi::Size) -> Self;
    method resizable (line 290) | fn resizable(self, resizable: bool) -> Self;
    method maximizable (line 300) | fn maximizable(self, maximizable: bool) -> Self;
    method minimizable (line 308) | fn minimizable(self, minimizable: bool) -> Self;
    method closable (line 318) | fn closable(self, closable: bool) -> Self;
    method title (line 322) | fn title<S: Into<String>>(self, title: S) -> Self;
    method fullscreen (line 326) | fn fullscreen(self, fullscreen: bool) -> Self;
    method focused (line 330) | fn focused(self, focused: bool) -> Self;
    method focusable (line 334) | fn focusable(self, focusable: bool) -> Self;
    method maximized (line 338) | fn maximized(self, maximized: bool) -> Self;
    method visible (line 342) | fn visible(self, visible: bool) -> Self;
    method transparent (line 352) | fn transparent(self, transparent: bool) -> Self;
    method decorations (line 356) | fn decorations(self, decorations: bool) -> Self;
    method always_on_bottom (line 360) | fn always_on_bottom(self, always_on_bottom: bool) -> Self;
    method always_on_top (line 364) | fn always_on_top(self, always_on_top: bool) -> Self;
    method visible_on_all_workspaces (line 368) | fn visible_on_all_workspaces(self, visible_on_all_workspaces: bool) ->...
    method content_protected (line 372) | fn content_protected(self, protected: bool) -> Self;
    method icon (line 375) | fn icon(self, icon: Icon) -> crate::Result<Self>;
    method skip_taskbar (line 379) | fn skip_taskbar(self, skip: bool) -> Self;
    method background_color (line 383) | fn background_color(self, color: Color) -> Self;
    method shadow (line 395) | fn shadow(self, enable: bool) -> Self;
    method owner (line 407) | fn owner(self, owner: HWND) -> Self;
    method parent (line 416) | fn parent(self, parent: HWND) -> Self;
    method parent (line 423) | fn parent(self, parent: *mut std::ffi::c_void) -> Self;
    method transient_for (line 435) | fn transient_for(self, parent: &impl gtk::glib::IsA<gtk::Window>) -> S...
    method drag_and_drop (line 440) | fn drag_and_drop(self, enabled: bool) -> Self;
    method title_bar_style (line 445) | fn title_bar_style(self, style: tauri_utils::TitleBarStyle) -> Self;
    method traffic_light_position (line 452) | fn traffic_light_position<P: Into<dpi::Position>>(self, position: P) -...
    method hidden_title (line 457) | fn hidden_title(self, hidden: bool) -> Self;
    method tabbing_identifier (line 467) | fn tabbing_identifier(self, identifier: &str) -> Self;
    method theme (line 470) | fn theme(self, theme: Option<Theme>) -> Self;
    method has_icon (line 473) | fn has_icon(&self) -> bool;
    method get_theme (line 475) | fn get_theme(&self) -> Option<Theme>;
    method window_classname (line 479) | fn window_classname<S: Into<String>>(self, window_classname: S) -> Self;
  type PendingWindow (line 483) | pub struct PendingWindow<T: UserEvent, R: Runtime<T>> {
  function is_label_valid (line 494) | pub fn is_label_valid(label: &str) -> bool {
  function assert_label_is_valid (line 500) | pub fn assert_label_is_valid(label: &str) {
  function new (line 509) | pub fn new(
  function set_webview (line 526) | pub fn set_webview(&mut self, webview: PendingWebview<T, R>) -> &mut Self {
  type WindowId (line 534) | pub struct WindowId(u32);
    method from (line 537) | fn from(value: u32) -> Self {
  type DetachedWindow (line 544) | pub struct DetachedWindow<T: UserEvent, R: Runtime<T>> {
  type DetachedWindowWebview (line 559) | pub struct DetachedWindowWebview<T: UserEvent, R: Runtime<T>> {
  method clone (line 565) | fn clone(&self) -> Self {
  method clone (line 574) | fn clone(&self) -> Self {
  method hash (line 586) | fn hash<H: Hasher>(&self, state: &mut H) {
  method eq (line 594) | fn eq(&self, other: &Self) -> bool {
  type RawWindow (line 601) | pub struct RawWindow<'a> {

FILE: crates/tauri-schema-generator/build.rs
  type VersionMetadata (line 21) | pub struct VersionMetadata {
  function main (line 25) | pub fn main() -> Result<(), Box<dyn Error>> {

FILE: crates/tauri-schema-generator/src/main.rs
  function main (line 12) | fn main() {}

FILE: crates/tauri-schema-worker/src/config.rs
  type CrateReleases (line 18) | pub struct CrateReleases {
  type CrateRelease (line 23) | pub struct CrateRelease {
  type CrateMetadataFull (line 30) | pub struct CrateMetadataFull {
  type CrateMetadata (line 36) | pub struct CrateMetadata {
  constant USERAGENT (line 40) | const USERAGENT: &str = "tauri-schema-worker (contact@tauri.app)";
  function router (line 42) | pub fn router() -> Router {
  function schema_for_version (line 51) | async fn schema_for_version(Path(version): Path<String>) -> Result<Strin...
  function stable_schema (line 58) | async fn stable_schema() -> Result<String> {
  function next_schema (line 65) | async fn next_schema() -> Result<String> {
  function try_schema_for_version (line 73) | async fn try_schema_for_version(version: String) -> anyhow::Result<Strin...
  function try_stable_schema (line 90) | async fn try_stable_schema() -> anyhow::Result<String> {
  function try_next_schema (line 96) | async fn try_next_schema() -> anyhow::Result<String> {
  function schema_file_for_version (line 107) | async fn schema_file_for_version(version: Version) -> anyhow::Result<Str...
  function crate_releases (line 130) | async fn crate_releases(crate_: &str) -> anyhow::Result<Vec<CrateRelease...
  function stable_version (line 141) | async fn stable_version(crate_: &str) -> anyhow::Result<Version> {
  function fetch_req (line 148) | fn fetch_req(url: &str) -> anyhow::Result<worker::Request> {

FILE: crates/tauri-schema-worker/src/lib.rs
  function main (line 12) | async fn main(
  function router (line 21) | fn router() -> Router {
  function root (line 25) | async fn root() -> &'static str {

FILE: crates/tauri-utils/src/acl/build.rs
  constant AUTOGENERATED_FOLDER_NAME (line 27) | pub const AUTOGENERATED_FOLDER_NAME: &str = "autogenerated";
  constant PERMISSION_FILES_PATH_KEY (line 30) | pub const PERMISSION_FILES_PATH_KEY: &str = "PERMISSION_FILES_PATH";
  constant GLOBAL_SCOPE_SCHEMA_PATH_KEY (line 33) | pub const GLOBAL_SCOPE_SCHEMA_PATH_KEY: &str = "GLOBAL_SCOPE_SCHEMA_PATH";
  constant PERMISSION_FILE_EXTENSIONS (line 36) | pub const PERMISSION_FILE_EXTENSIONS: &[&str] = &["json", "toml"];
  constant PERMISSION_DOCS_FILE_NAME (line 39) | pub const PERMISSION_DOCS_FILE_NAME: &str = "reference.md";
  constant CAPABILITY_FILE_EXTENSIONS (line 42) | const CAPABILITY_FILE_EXTENSIONS: &[&str] = &[
  constant CAPABILITIES_SCHEMA_FOLDER_NAME (line 50) | const CAPABILITIES_SCHEMA_FOLDER_NAME: &str = "schemas";
  constant CORE_PLUGIN_PERMISSIONS_TOKEN (line 52) | const CORE_PLUGIN_PERMISSIONS_TOKEN: &str = "__CORE_PLUGIN__";
  function parse_permissions (line 54) | fn parse_permissions(paths: Vec<PathBuf>) -> Result<Vec<PermissionFile>,...
  function define_permissions (line 70) | pub fn define_permissions<F: Fn(&Path) -> bool>(
  function read_permissions (line 114) | pub fn read_permissions() -> Result<HashMap<String, Vec<PermissionFile>>...
  function define_global_scope_schema (line 149) | pub fn define_global_scope_schema(
  function read_global_scope_schemas (line 171) | pub fn read_global_scope_schemas() -> Result<HashMap<String, serde_json:...
  function parse_capabilities (line 204) | pub fn parse_capabilities(pattern: &str) -> Result<BTreeMap<String, Capa...
  type AutogeneratedPermissions (line 247) | pub struct AutogeneratedPermissions {
  function autogenerate_command_permissions (line 255) | pub fn autogenerate_command_permissions(
  constant PERMISSION_TABLE_HEADER (line 322) | const PERMISSION_TABLE_HEADER: &str =
  function generate_docs (line 326) | pub fn generate_docs(
  function generate_allowed_commands (line 390) | pub fn generate_allowed_commands(

FILE: crates/tauri-utils/src/acl/capability.rs
  type PermissionEntry (line 23) | pub enum PermissionEntry {
    method identifier (line 38) | pub fn identifier(&self) -> &Identifier {
    method deserialize (line 50) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  type Capability (line 110) | pub struct Capability {
    method is_active (line 209) | pub fn is_active(&self, target: &Target) -> bool {
  function unique_permission (line 219) | fn unique_permission(gen: &mut schemars::gen::SchemaGenerator) -> schema...
  function default_capability_local (line 233) | fn default_capability_local() -> bool {
  type CapabilityRemote (line 241) | pub struct CapabilityRemote {
  type CapabilityFile (line 255) | pub enum CapabilityFile {
    method load (line 269) | pub fn load<P: AsRef<Path>>(path: P) -> Result<Self, super::Error> {
    method deserialize (line 286) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  type Err (line 316) | type Err = super::Error;
  method from_str (line 318) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  method to_tokens (line 336) | fn to_tokens(&self, tokens: &mut TokenStream) {
  method to_tokens (line 347) | fn to_tokens(&self, tokens: &mut TokenStream) {
  method to_tokens (line 365) | fn to_tokens(&self, tokens: &mut TokenStream) {
  function permission_entry_de (line 398) | fn permission_entry_de() {
  function capability_file_de (line 424) | fn capability_file_de() {

FILE: crates/tauri-utils/src/acl/identifier.rs
  constant IDENTIFIER_SEPARATOR (line 11) | const IDENTIFIER_SEPARATOR: u8 = b':';
  constant PLUGIN_PREFIX (line 12) | const PLUGIN_PREFIX: &str = "tauri-plugin-";
  constant CORE_PLUGIN_IDENTIFIER_PREFIX (line 13) | const CORE_PLUGIN_IDENTIFIER_PREFIX: &str = "core:";
  constant MAX_LEN_PREFIX (line 16) | const MAX_LEN_PREFIX: usize = 64 - PLUGIN_PREFIX.len();
  constant MAX_LEN_BASE (line 17) | const MAX_LEN_BASE: usize = 64;
  constant MAX_LEN_IDENTIFIER (line 18) | const MAX_LEN_IDENTIFIER: usize = MAX_LEN_PREFIX + 1 + MAX_LEN_BASE;
  type Identifier (line 22) | pub struct Identifier {
    method schema_name (line 29) | fn schema_name() -> String {
    method schema_id (line 33) | fn schema_id() -> std::borrow::Cow<'static, str> {
    method json_schema (line 38) | fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::...
    method as_ref (line 45) | fn as_ref(&self) -> &str {
    method get (line 53) | pub fn get(&self) -> &str {
    method get_base (line 58) | pub fn get_base(&self) -> &str {
    method get_prefix (line 66) | pub fn get_prefix(&self) -> Option<&str> {
    method set_prefix (line 71) | pub fn set_prefix(&mut self) -> Result<(), ParseIdentifierError> {
    method into_inner (line 76) | pub fn into_inner(self) -> (String, Option<NonZeroU8>) {
    method separator_index (line 80) | fn separator_index(&self) -> Option<usize> {
    type Error (line 150) | type Error = ParseIdentifierError;
    method try_from (line 152) | fn try_from(value: String) -> Result<Self, Self::Error> {
    method deserialize (line 212) | fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
  type ValidByte (line 86) | enum ValidByte {
    method alpha_numeric (line 92) | fn alpha_numeric(byte: u8) -> Option<Self> {
    method alpha_numeric_hyphen (line 96) | fn alpha_numeric_hyphen(byte: u8) -> Option<Self> {
    method next (line 100) | fn next(&self, next: u8) -> Option<ValidByte> {
  type ParseIdentifierError (line 116) | pub enum ParseIdentifierError {
  method serialize (line 221) | fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::E...
  function ident (line 233) | fn ident(s: impl Into<String>) -> Result<Identifier, ParseIdentifierErro...
  function max_len_fits_in_u8 (line 238) | fn max_len_fits_in_u8() {
  function format (line 243) | fn format() {
  function base (line 274) | fn base() {
  function prefix (line 280) | fn prefix() {
  method to_tokens (line 294) | fn to_tokens(&self, tokens: &mut TokenStream) {

FILE: crates/tauri-utils/src/acl/manifest.rs
  type DefaultPermission (line 19) | pub struct DefaultPermission {
  type PermissionFile (line 35) | pub struct PermissionFile {
  type Manifest (line 50) | pub struct Manifest {
    method new (line 63) | pub fn new(
    method global_scope_schema (line 106) | pub fn global_scope_schema(&self) -> Result<Option<ScopeSchema>, super...
  type ScopeSchema (line 101) | type ScopeSchema = (Schema, schemars::Map<String, Schema>);
  method to_tokens (line 139) | fn to_tokens(&self, tokens: &mut TokenStream) {
  method to_tokens (line 158) | fn to_tokens(&self, tokens: &mut TokenStream) {

FILE: crates/tauri-utils/src/acl/mod.rs
  constant PERMISSION_SCHEMAS_FOLDER_NAME (line 46) | pub const PERMISSION_SCHEMAS_FOLDER_NAME: &str = "schemas";
  constant PERMISSION_SCHEMA_FILE_NAME (line 48) | pub const PERMISSION_SCHEMA_FILE_NAME: &str = "schema.json";
  constant APP_ACL_KEY (line 50) | pub const APP_ACL_KEY: &str = "__app-acl__";
  constant ACL_MANIFESTS_FILE_NAME (line 52) | pub const ACL_MANIFESTS_FILE_NAME: &str = "acl-manifests.json";
  constant CAPABILITIES_FILE_NAME (line 54) | pub const CAPABILITIES_FILE_NAME: &str = "capabilities.json";
  constant ALLOWED_COMMANDS_FILE_NAME (line 56) | pub const ALLOWED_COMMANDS_FILE_NAME: &str = "allowed-commands.json";
  constant REMOVE_UNUSED_COMMANDS_ENV_VAR (line 59) | pub const REMOVE_UNUSED_COMMANDS_ENV_VAR: &str = "REMOVE_UNUSED_COMMANDS";
  type Error (line 73) | pub enum Error {
  type Commands (line 177) | pub struct Commands {
  type Scopes (line 202) | pub struct Scopes {
    method is_empty (line 212) | fn is_empty(&self) -> bool {
  type Permission (line 224) | pub struct Permission {
    method is_active (line 253) | pub fn is_active(&self, target: &Target) -> bool {
  type PermissionSet (line 265) | pub struct PermissionSet {
  type RemoteUrlPattern (line 278) | pub struct RemoteUrlPattern(Arc<urlpattern::UrlPattern>, String);
    method as_str (line 306) | pub fn as_str(&self) -> &str {
    method test (line 311) | pub fn test(&self, url: &Url) -> bool {
  type Err (line 281) | type Err = urlpattern::quirks::Error;
  method from_str (line 283) | fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
  method eq (line 320) | fn eq(&self, other: &Self) -> bool {
  type ExecutionContext (line 336) | pub enum ExecutionContext {
  function has_app_manifest (line 348) | pub fn has_app_manifest(acl: &BTreeMap<String, crate::acl::manifest::Man...
  function get_capabilities (line 353) | pub fn get_capabilities(
  type AllowedCommands (line 405) | pub struct AllowedCommands {
  function read_allowed_commands (line 413) | pub fn read_allowed_commands() -> Option<AllowedCommands> {
  function url_pattern_domain_wildcard (line 428) | fn url_pattern_domain_wildcard() {
  function url_pattern_path_wildcard (line 448) | fn url_pattern_path_wildcard() {
  function url_pattern_scheme_wildcard (line 455) | fn url_pattern_scheme_wildcard() {
  method to_tokens (line 474) | fn to_tokens(&self, tokens: &mut TokenStream) {
  method to_tokens (line 490) | fn to_tokens(&self, tokens: &mut TokenStream) {
  method to_tokens (line 498) | fn to_tokens(&self, tokens: &mut TokenStream) {
  method to_tokens (line 506) | fn to_tokens(&self, tokens: &mut TokenStream) {
  method to_tokens (line 532) | fn to_tokens(&self, tokens: &mut TokenStream) {

FILE: crates/tauri-utils/src/acl/resolved.rs
  type ScopeKey (line 20) | pub type ScopeKey = u64;
  type ResolvedCommandReference (line 25) | pub struct ResolvedCommandReference {
  type ResolvedCommand (line 34) | pub struct ResolvedCommand {
    method fmt (line 49) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  type ResolvedScope (line 61) | pub struct ResolvedScope {
  type Resolved (line 70) | pub struct Resolved {
    method resolve (line 85) | pub fn resolve(
  function parse_glob_patterns (line 199) | fn parse_glob_patterns(mut raw: Vec<String>) -> Result<Vec<glob::Pattern...
  function resolve_command (line 210) | fn resolve_command(
  type ResolvedPermission (line 250) | struct ResolvedPermission<'a> {
  function with_resolved_permissions (line 259) | fn with_resolved_permissions<F: FnMut(ResolvedPermission<'_>) -> Result<...
  type TraversedPermission (line 330) | pub struct TraversedPermission<'a> {
  function get_permissions (line 340) | pub fn get_permissions<'a>(
  function get_permission_set_permissions (line 375) | fn get_permission_set_permissions<'a>(
  function display_perm_key (line 433) | fn display_perm_key(prefix: &str) -> &str {
  method to_tokens (line 452) | fn to_tokens(&self, tokens: &mut TokenStream) {
  method to_tokens (line 465) | fn to_tokens(&self, tokens: &mut TokenStream) {
  method to_tokens (line 506) | fn to_tokens(&self, tokens: &mut TokenStream) {
  method to_tokens (line 519) | fn to_tokens(&self, tokens: &mut TokenStream) {
  function manifest (line 568) | fn manifest<const P: usize, const S: usize>(
  function id (line 612) | fn id(id: &str) -> Identifier {
  function resolves_permissions_from_other_plugins (line 617) | fn resolves_permissions_from_other_plugins() {

FILE: crates/tauri-utils/src/acl/schema.rs
  constant CAPABILITIES_SCHEMA_FILE_NAME (line 26) | pub const CAPABILITIES_SCHEMA_FILE_NAME: &str = "schema.json";
  constant CAPABILITIES_SCHEMA_FOLDER_PATH (line 28) | pub const CAPABILITIES_SCHEMA_FOLDER_PATH: &str = "gen/schemas";
  type PermissionSchemaGenerator (line 33) | pub trait PermissionSchemaGenerator<
    method has_default_permission_set (line 40) | fn has_default_permission_set(&self) -> bool;
    method default_set_description (line 43) | fn default_set_description(&self) -> Option<&str>;
    method default_set_permissions (line 46) | fn default_set_permissions(&self) -> Option<&Vec<String>>;
    method permission_sets (line 49) | fn permission_sets(&'a self) -> Ps;
    method permissions (line 52) | fn permissions(&'a self) -> P;
    method perm_id_schema (line 55) | fn perm_id_schema(name: Option<&str>, id: &str, description: Option<&s...
    method gen_possible_permission_schemas (line 87) | fn gen_possible_permission_schemas(&'a self, name: Option<&str>) -> Ve...
  function add_permissions_to_description (line 121) | fn add_permissions_to_description(
  method has_default_permission_set (line 149) | fn has_default_permission_set(&self) -> bool {
  method default_set_description (line 153) | fn default_set_description(&self) -> Option<&str> {
  method default_set_permissions (line 160) | fn default_set_permissions(&self) -> Option<&Vec<String>> {
  method permission_sets (line 164) | fn permission_sets(&'a self) -> Values<'a, std::string::String, Permissi...
  method permissions (line 168) | fn permissions(&'a self) -> Values<'a, std::string::String, Permission> {
  method has_default_permission_set (line 176) | fn has_default_permission_set(&self) -> bool {
  method default_set_description (line 180) | fn default_set_description(&self) -> Option<&str> {
  method default_set_permissions (line 184) | fn default_set_permissions(&self) -> Option<&Vec<String>> {
  method permission_sets (line 188) | fn permission_sets(&'a self) -> Iter<'a, PermissionSet> {
  method permissions (line 192) | fn permissions(&'a self) -> Iter<'a, Permission> {
  function extend_identifier_schema (line 198) | fn extend_identifier_schema(schema: &mut RootSchema, acl: &BTreeMap<Stri...
  function extend_permission_entry_schema (line 244) | fn extend_permission_entry_schema(root_schema: &mut RootSchema, acl: &BT...
  function generate_capability_schema (line 310) | pub fn generate_capability_schema(
  function extend_permission_file_schema (line 347) | fn extend_permission_file_schema(schema: &mut RootSchema, permissions: &...
  function generate_permissions_schema (line 385) | pub fn generate_permissions_schema<P: AsRef<Path>>(

FILE: crates/tauri-utils/src/acl/value.rs
  type Number (line 17) | pub enum Number {
    method from (line 27) | fn from(value: i64) -> Self {
    method from (line 34) | fn from(value: f64) -> Self {
  type Value (line 43) | pub enum Value {
    method from (line 85) | fn from(value: serde_json::Value) -> Self {
    method from (line 112) | fn from(value: bool) -> Self {
    method from (line 119) | fn from(value: T) -> Self {
    method from (line 126) | fn from(value: String) -> Self {
    method from (line 133) | fn from(value: toml::Value) -> Self {
  function from (line 64) | fn from(value: Value) -> Self {
  method to_tokens (line 159) | fn to_tokens(&self, tokens: &mut TokenStream) {
  method to_tokens (line 174) | fn to_tokens(&self, tokens: &mut TokenStream) {

FILE: crates/tauri-utils/src/assets.rs
  constant SCRIPT_NONCE_TOKEN (line 16) | pub const SCRIPT_NONCE_TOKEN: &str = "__TAURI_SCRIPT_NONCE__";
  constant STYLE_NONCE_TOKEN (line 18) | pub const STYLE_NONCE_TOKEN: &str = "__TAURI_STYLE_NONCE__";
  type AssetsIter (line 21) | pub type AssetsIter<'a> = dyn Iterator<Item = (Cow<'a, str>, Cow<'a, [u8...
  type AssetKey (line 30) | pub struct AssetKey(String);
    method as_ref (line 39) | fn as_ref(&self) -> &str {
    method from (line 45) | fn from(path: P) -> Self {
  method from (line 33) | fn from(key: AssetKey) -> Self {
  type CspHash (line 89) | pub enum CspHash<'a> {
  function directive (line 99) | pub fn directive(&self) -> &'static str {
  function hash (line 107) | pub fn hash(&self) -> &str {
  type EmbeddedAssets (line 116) | pub struct EmbeddedAssets {
    method fmt (line 145) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
    method new (line 156) | pub const fn new(
    method get (line 170) | pub fn get(&self, key: &AssetKey) -> Option<Cow<'_, [u8]>> {
    method get (line 181) | pub fn get(&self, key: &AssetKey) -> Option<Cow<'_, [u8]>> {
    method iter (line 186) | pub fn iter(&self) -> Box<AssetsIter<'_>> {
    method csp_hashes (line 196) | pub fn csp_hashes(&self, html_path: &AssetKey) -> Box<dyn Iterator<Ite...
  type DebugAssetMap (line 131) | struct DebugAssetMap<'a>(&'a phf::Map<&'static str, &'static [u8]>);
  function fmt (line 134) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {

FILE: crates/tauri-utils/src/build.rs
  function link_apple_library (line 9) | pub fn link_apple_library(name: &str, source: impl AsRef<std::path::Path...
  function link_swift_library (line 19) | fn lin
Condensed preview — 956 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,723K chars).
[
  {
    "path": ".cargo/audit.toml",
    "chars": 290,
    "preview": "[advisories]\nignore = [\n  # rsa Marvin Attack\n  \"RUSTSEC-2023-0071\",\n  # difference is unmaintained\n  \"RUSTSEC-2020-0095"
  },
  {
    "path": ".cargo/config.toml",
    "chars": 187,
    "preview": "[env]\n# workaround needed to prevent `STATUS_ENTRYPOINT_NOT_FOUND` error in tests\n# see https://github.com/tauri-apps/ta"
  },
  {
    "path": ".changes/README.md",
    "chars": 2019,
    "preview": "# Changes\n\n##### via https://github.com/jbolda/covector\n\nAs you create PRs and make changes that require a version bump,"
  },
  {
    "path": ".changes/base64.md",
    "chars": 100,
    "preview": "---\n\"tauri-macos-sign\": patch:enhance\n---\n\nDo not rely on system base64 CLI to decode certificates.\n"
  },
  {
    "path": ".changes/config.json",
    "chars": 6458,
    "preview": "{\n  \"gitSiteUrl\": \"https://www.github.com/tauri-apps/tauri/\",\n  \"changeTags\": {\n    \"feat\": \"New Features\",\n    \"enhance"
  },
  {
    "path": ".changes/data-tauri-drag-region-deep.md",
    "chars": 201,
    "preview": "---\n\"tauri\": minor:feat\n---\n\nAdd `data-tauri-drag-region=\"deep\"` so clicks on non-clickable children will drag as well. "
  },
  {
    "path": ".changes/fix-build-bundles-arg.md",
    "chars": 145,
    "preview": "---\n\"tauri-bundler\": patch:bug\n\"tauri-cli\": patch:bug\n\"@tauri-apps/cli\": patch:bug\n---\n\nFix `build --bundles` to allow `"
  },
  {
    "path": ".changes/linux-deploy-link.md",
    "chars": 92,
    "preview": "---\n\"tauri-bundler\": patch:bug\n---\n\nCorrect GitHub Release URL path for Linux i686 tooling.\n"
  },
  {
    "path": ".changes/prompt-signing-key-password-context.md",
    "chars": 136,
    "preview": "---\n\"tauri-cli\": patch:enhance\n\"@tauri-apps/cli\": patch:enhance\n---\n\nShow the context before prompting for updater signi"
  },
  {
    "path": ".changes/toml-ver.md",
    "chars": 91,
    "preview": "---\ntauri-utils: patch:deps\n---\n\nChanged `toml` crate version from `0.9` to `\">=0.9, <=1\"`\n"
  },
  {
    "path": ".devcontainer/Dockerfile",
    "chars": 779,
    "preview": "# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/master/containers/ubuntu/.devcont"
  },
  {
    "path": ".devcontainer/README.md",
    "chars": 3457,
    "preview": "# VS Code Devcontainer for Tauri\n\n## Overview\n\nPlease note that most of these instructions are derived from Microsoft's "
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 1112,
    "preview": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:\n// https://github.co"
  },
  {
    "path": ".docker/cross/aarch64.Dockerfile",
    "chars": 1364,
    "preview": "FROM ubuntu:22.04\nARG DEBIAN_FRONTEND=noninteractive\n\nCOPY common.sh lib.sh /\nRUN /common.sh\n\nCOPY cmake.sh /\nRUN /cmake"
  },
  {
    "path": ".docker/cross/cmake.sh",
    "chars": 499,
    "preview": "#!/usr/bin/env bash\n\nset -x\nset -euo pipefail\n\n# shellcheck disable=SC1091\n. lib.sh\n\nmain() {\n    local version=3.23.1\n\n"
  },
  {
    "path": ".docker/cross/common.sh",
    "chars": 1063,
    "preview": "#!/usr/bin/env bash\n\nset -x\nset -euo pipefail\n\n# shellcheck disable=SC1091\n. lib.sh\n\n# For architectures except amd64 an"
  },
  {
    "path": ".docker/cross/deny-debian-packages.sh",
    "chars": 290,
    "preview": "#!/usr/bin/env bash\n\nset -x\nset -euo pipefail\n\nmain() {\n    local package\n\n    for package in \"${@}\"; do\n        echo \"P"
  },
  {
    "path": ".docker/cross/dropbear.sh",
    "chars": 1077,
    "preview": "#!/usr/bin/env bash\n\nset -x\nset -euo pipefail\n\n# shellcheck disable=SC1091\n. lib.sh\n\nmain() {\n    local version=2022.82\n"
  },
  {
    "path": ".docker/cross/lib.sh",
    "chars": 1014,
    "preview": "purge_list=()\n\ninstall_packages() {\n    if grep -i ubuntu /etc/os-release; then\n        apt-get update\n\n        for pkg "
  },
  {
    "path": ".docker/cross/linux-image.sh",
    "chars": 8978,
    "preview": "#!/usr/bin/env bash\n\nset -x\nset -euo pipefail\n\n# shellcheck disable=SC1091\n. lib.sh\n\nmain() {\n    # arch in the rust tar"
  },
  {
    "path": ".docker/cross/linux-runner",
    "chars": 3819,
    "preview": "#!/usr/bin/env bash\n\nset -e\n\nLOG=/tmp/qemu.log\nLOCK=/tmp/qemu.lock\n\nif [ -n \"${CROSS_DEBUG}\" ]; then\n    set -x\nfi\n\n# ar"
  },
  {
    "path": ".docker/cross/qemu.sh",
    "chars": 5498,
    "preview": "#!/usr/bin/env bash\n\nset -x\nset -euo pipefail\n\n# shellcheck disable=SC1091\n. lib.sh\n\nbuild_static_libffi () {\n    local "
  },
  {
    "path": ".docker/cross/xargo.sh",
    "chars": 522,
    "preview": "#!/usr/bin/env bash\n\nset -x\nset -euo pipefail\n\n# shellcheck disable=SC1091\n. lib.sh\n\nmain() {\n    install_packages ca-ce"
  },
  {
    "path": ".editorconfig",
    "chars": 147,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\nend_of_line = lf\ninsert_final_newline = true\ntrim_"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 206,
    "preview": "# Current WG Code Sub Teams:\n# @tauri-apps/wg-tauri\n# @tauri-apps/wg-devops\n\n# Order is important; the last matching pat"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "chars": 5510,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 8175,
    "preview": "# Tauri Contributing Guide\n\nHi! We, the maintainers, are really excited that you are interested in contributing to Tauri"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 426,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 2010,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 296,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/docs_report.md",
    "chars": 140,
    "preview": "---\nname: 📚 Docs Report\nabout: Create a report to help us improve the docs\ntitle: '[docs] '\nlabels: 'type: documentation"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 1059,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 941,
    "preview": "<!--\nBefore submitting a PR, please read https://github.com/tauri-apps/tauri/blob/dev/.github/CONTRIBUTING.md#pull-reque"
  },
  {
    "path": ".github/RELEASING.md",
    "chars": 3301,
    "preview": "# Tauri Releasing Handbook\n\nThis handbook contains information about our release pipeline and how to deal with common is"
  },
  {
    "path": ".github/workflows/audit.yml",
    "chars": 1100,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/bench.yml",
    "chars": 3398,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/check-change-tags.yml",
    "chars": 1149,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/check-generated-files.yml",
    "chars": 2292,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/check-license-header.yml",
    "chars": 732,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/covector-comment-on-fork.yml",
    "chars": 1007,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/covector-status.yml",
    "chars": 531,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/covector-version-or-publish.yml",
    "chars": 4760,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/deploy-schema-worker.yml",
    "chars": 682,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/docker.yml",
    "chars": 3484,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/fmt.yml",
    "chars": 1120,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/lint-js.yml",
    "chars": 938,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/lint-rust.yml",
    "chars": 1019,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/publish-cli-js.yml",
    "chars": 13421,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/publish-cli-rs.yml",
    "chars": 3740,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/supply-chain.yml",
    "chars": 1407,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/test-android.yml",
    "chars": 3199,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/test-cli-js.yml",
    "chars": 1533,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/test-cli-rs.yml",
    "chars": 1685,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/test-core.yml",
    "chars": 4041,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".github/workflows/udeps.yml",
    "chars": 5399,
    "preview": "# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-Licens"
  },
  {
    "path": ".gitignore",
    "chars": 765,
    "preview": "# dependency directories\r\nnode_modules/\r\n\r\n# Optional npm and yarn cache directory\r\n.npm/\r\n.yarn/\r\n\r\n# Output of 'npm pa"
  },
  {
    "path": ".prettierignore",
    "chars": 777,
    "preview": "/audits\n/.vscode\n\n# change files are hand-written and shouldn't be formatted\n/.changes/*\n!/.changes/config.json\n\n# depen"
  },
  {
    "path": ".prettierrc",
    "chars": 113,
    "preview": "{\n  \"singleQuote\": true,\n  \"semi\": false,\n  \"trailingComma\": \"none\",\n  \"experimentalOperatorPosition\": \"start\"\n}\n"
  },
  {
    "path": ".scripts/ci/check-change-tags.js",
    "chars": 2332,
    "preview": "#!/usr/bin/env node\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: A"
  },
  {
    "path": ".scripts/ci/check-license-header.js",
    "chars": 2853,
    "preview": "#!/usr/bin/env node\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: A"
  },
  {
    "path": ".scripts/ci/has-diff.sh",
    "chars": 341,
    "preview": "#!/bin/bash\n\n# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n"
  },
  {
    "path": ".scripts/ci/pack-cli.sh",
    "chars": 496,
    "preview": "#!/bin/bash\n\n# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n"
  },
  {
    "path": ".scripts/ci/sync-cli-metadata.js",
    "chars": 1923,
    "preview": "#!/usr/bin/env node\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: A"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 156,
    "preview": "{\n  \"recommendations\": [\n    \"rust-lang.rust-analyzer\",\n    \"EditorConfig.EditorConfig\",\n    \"esbenp.prettier-vscode\",\n "
  },
  {
    "path": "ARCHITECTURE.md",
    "chars": 11024,
    "preview": "# The Tauri Architecture\n\n<https://tauri.app>\n\n<https://github.com/tauri-apps/tauri>\n\n## Introduction\n\nTauri is a polygl"
  },
  {
    "path": "Cargo.toml",
    "chars": 1915,
    "preview": "[workspace]\nmembers = [\n  \"crates/tauri\",\n  \"crates/tauri-runtime\",\n  \"crates/tauri-runtime-wry\",\n  \"crates/tauri-macros"
  },
  {
    "path": "LICENSE.spdx",
    "chars": 889,
    "preview": "SPDXVersion: SPDX-2.1\nDataLicense: CC0-1.0\nPackageName: tauri\nDataFormat: SPDXRef-1\nPackageSupplier: Organization: The T"
  },
  {
    "path": "LICENSE_APACHE-2.0",
    "chars": 10174,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "LICENSE_MIT",
    "chars": 1090,
    "preview": "MIT License\n\nCopyright (c) 2017 - Present Tauri Apps Contributors\n\nPermission is hereby granted, free of charge, to any "
  },
  {
    "path": "README.md",
    "chars": 6055,
    "preview": "<img src=\".github/splash.png\" alt=\"Tauri\" />\n\n[![status](https://img.shields.io/badge/status-stable-blue.svg)](https://g"
  },
  {
    "path": "SECURITY.md",
    "chars": 1630,
    "preview": "# Security Policy\n\n## Supported Versions\n\n| Version | Supported          |\n| ------- | ------------------ |\n| > 1.0   | "
  },
  {
    "path": "bench/Cargo.toml",
    "chars": 591,
    "preview": "[package]\nname = \"tauri_bench\"\nversion = \"0.1.0\"\nauthors = [\"Tauri Programme within The Commons Conservancy\"]\nedition = "
  },
  {
    "path": "bench/README.md",
    "chars": 2735,
    "preview": "# Tauri Bench\n\n <img align=\"right\" src=\"https://github.com/tauri-apps/tauri/raw/dev/.github/icon.png\" height=\"128\" width"
  },
  {
    "path": "bench/src/build_benchmark_jsons.rs",
    "chars": 2201,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "bench/src/run_benchmark.rs",
    "chars": 11283,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "bench/src/utils.rs",
    "chars": 8195,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "bench/tests/cpu_intensive/public/index.css",
    "chars": 170,
    "preview": "body {\n  font-family:\n    -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial,\n    sans-serif;\n  mar"
  },
  {
    "path": "bench/tests/cpu_intensive/public/index.html",
    "chars": 363,
    "preview": "<!doctype html>\n<html>\n  <head>\n    <meta charset=\"UTF-8\" />\n    <title>Hello World!</title>\n    <link rel=\"stylesheet\" "
  },
  {
    "path": "bench/tests/cpu_intensive/public/site.js",
    "chars": 1444,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "bench/tests/cpu_intensive/public/worker.js",
    "chars": 977,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "bench/tests/cpu_intensive/src-tauri/.gitignore",
    "chars": 73,
    "preview": "# Generated by Cargo\n# will have compiled files and executables\n/target/\n"
  },
  {
    "path": "bench/tests/cpu_intensive/src-tauri/Cargo.toml",
    "chars": 398,
    "preview": "[package]\nname = \"bench_cpu_intensive\"\nversion = \"0.1.0\"\ndescription = \"A very simple Tauri Application\"\nedition = \"2021"
  },
  {
    "path": "bench/tests/cpu_intensive/src-tauri/build.rs",
    "chars": 179,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "bench/tests/cpu_intensive/src-tauri/src/main.rs",
    "chars": 497,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "bench/tests/cpu_intensive/src-tauri/tauri.conf.json",
    "chars": 895,
    "preview": "{\n  \"$schema\": \"../../../../crates/tauri-schema-generator/schemas/config.schema.json\",\n  \"identifier\": \"com.tauri.dev\",\n"
  },
  {
    "path": "bench/tests/files_transfer/public/index.html",
    "chars": 752,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "bench/tests/files_transfer/src-tauri/.gitignore",
    "chars": 73,
    "preview": "# Generated by Cargo\n# will have compiled files and executables\n/target/\n"
  },
  {
    "path": "bench/tests/files_transfer/src-tauri/Cargo.toml",
    "chars": 399,
    "preview": "[package]\nname = \"bench_files_transfer\"\nversion = \"0.1.0\"\ndescription = \"A very simple Tauri Application\"\nedition = \"202"
  },
  {
    "path": "bench/tests/files_transfer/src-tauri/build.rs",
    "chars": 179,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "bench/tests/files_transfer/src-tauri/src/main.rs",
    "chars": 907,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "bench/tests/files_transfer/src-tauri/tauri.conf.json",
    "chars": 895,
    "preview": "{\n  \"$schema\": \"../../../../crates/tauri-schema-generator/schemas/config.schema.json\",\n  \"identifier\": \"com.tauri.dev\",\n"
  },
  {
    "path": "bench/tests/helloworld/public/index.html",
    "chars": 414,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "bench/tests/helloworld/src-tauri/.gitignore",
    "chars": 73,
    "preview": "# Generated by Cargo\n# will have compiled files and executables\n/target/\n"
  },
  {
    "path": "bench/tests/helloworld/src-tauri/Cargo.toml",
    "chars": 395,
    "preview": "[package]\nname = \"bench_helloworld\"\nversion = \"0.1.0\"\ndescription = \"A very simple Tauri Application\"\nedition = \"2021\"\nr"
  },
  {
    "path": "bench/tests/helloworld/src-tauri/build.rs",
    "chars": 179,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "bench/tests/helloworld/src-tauri/src/main.rs",
    "chars": 491,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "bench/tests/helloworld/src-tauri/tauri.conf.json",
    "chars": 953,
    "preview": "{\n  \"$schema\": \"../../../../crates/tauri-schema-generator/schemas/config.schema.json\",\n  \"identifier\": \"com.tauri.dev\",\n"
  },
  {
    "path": "crates/tauri/.scripts/loop_qc.sh",
    "chars": 282,
    "preview": "#!/bin/bash\n# Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n# SPDX-License-Identifier: Apache-2.0\n#"
  },
  {
    "path": "crates/tauri/CHANGELOG.md",
    "chars": 430271,
    "preview": "# Changelog\n\n## \\[2.10.3]\n\n### Dependencies\n\n- Upgraded to `tauri-utils@2.8.3`\n- Upgraded to `tauri-runtime@2.10.1`\n- Up"
  },
  {
    "path": "crates/tauri/Cargo.toml",
    "chars": 7536,
    "preview": "[package]\nname = \"tauri\"\nversion = \"2.10.3\"\ndescription = \"Make tiny, secure apps for all desktop platforms with Tauri\"\n"
  },
  {
    "path": "crates/tauri/LICENSE_APACHE-2.0",
    "chars": 10174,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "crates/tauri/LICENSE_MIT",
    "chars": 1090,
    "preview": "MIT License\n\nCopyright (c) 2017 - Present Tauri Apps Contributors\n\nPermission is hereby granted, free of charge, to any "
  },
  {
    "path": "crates/tauri/README.md",
    "chars": 3517,
    "preview": "# Tauri\n\n <img align=\"right\" src=\"https://github.com/tauri-apps/tauri/raw/dev/.github/icon.png\" height=\"128\" width=\"128\""
  },
  {
    "path": "crates/tauri/build.rs",
    "chars": 15584,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/.gitignore",
    "chars": 6,
    "preview": "/build"
  },
  {
    "path": "crates/tauri/mobile/android/build.gradle.kts",
    "chars": 1248,
    "preview": "plugins {\n    id(\"com.android.library\")\n    id(\"org.jetbrains.kotlin.android\")\n}\n\nandroid {\n    namespace = \"app.tauri\"\n"
  },
  {
    "path": "crates/tauri/mobile/android/proguard-rules.pro",
    "chars": 984,
    "preview": "-keep class app.tauri.** {\n  @app.tauri.JniMethod public <methods>;\n  native <methods>;\n}\n\n-keep class app.tauri.plugin."
  },
  {
    "path": "crates/tauri/mobile/android/src/androidTest/java/app/tauri/ExampleInstrumentedTest.kt",
    "chars": 793,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/AndroidManifest.xml",
    "chars": 121,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n</manifest>"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/AppPlugin.kt",
    "chars": 1541,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/FsUtils.kt",
    "chars": 7219,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/JniMethod.kt",
    "chars": 237,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/Logger.kt",
    "chars": 1855,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/PathPlugin.kt",
    "chars": 3857,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/PermissionHelper.kt",
    "chars": 4048,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/PermissionState.kt",
    "chars": 554,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/annotation/ActivityCallback.kt",
    "chars": 281,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/annotation/InvokeArg.kt",
    "chars": 271,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/annotation/Permission.kt",
    "chars": 551,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/annotation/PermissionCallback.kt",
    "chars": 283,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/annotation/PluginMethod.kt",
    "chars": 237,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/annotation/TauriPlugin.kt",
    "chars": 516,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Channel.kt",
    "chars": 1306,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/plugin/InvalidPluginMethodException.kt",
    "chars": 364,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Invoke.kt",
    "chars": 2131,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/plugin/JSArray.kt",
    "chars": 1155,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/plugin/JSObject.kt",
    "chars": 3569,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt",
    "chars": 16092,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginHandle.kt",
    "chars": 5607,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt",
    "chars": 7013,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginMethodData.kt",
    "chars": 371,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginResult.kt",
    "chars": 1629,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android/src/test/java/app/tauri/ExampleUnitTest.kt",
    "chars": 476,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/android-codegen/TauriActivity.kt",
    "chars": 1181,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/ios-api/.gitignore",
    "chars": 182,
    "preview": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package"
  },
  {
    "path": "crates/tauri/mobile/ios-api/Package.swift",
    "chars": 1142,
    "preview": "// swift-tools-version:5.3\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identif"
  },
  {
    "path": "crates/tauri/mobile/ios-api/README.md",
    "chars": 24,
    "preview": "# Tauri\n\nTauri iOS API.\n"
  },
  {
    "path": "crates/tauri/mobile/ios-api/Sources/Tauri/Channel.swift",
    "chars": 1821,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/ios-api/Sources/Tauri/Invoke.swift",
    "chars": 2928,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/ios-api/Sources/Tauri/JSTypes.swift",
    "chars": 3614,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/ios-api/Sources/Tauri/JsonValue.swift",
    "chars": 1692,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/ios-api/Sources/Tauri/Logger.swift",
    "chars": 3739,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/ios-api/Sources/Tauri/Plugin/Plugin.swift",
    "chars": 2036,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/ios-api/Sources/Tauri/Tauri.swift",
    "chars": 4879,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/ios-api/Sources/Tauri/UiUtils.swift",
    "chars": 742,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/ios-api/Tests/TauriTests/TauriTests.swift",
    "chars": 476,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/mobile/proguard-tauri.pro",
    "chars": 165,
    "preview": "# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n\n-keep class $PACKAGE.TauriActivity {\n  public app.taur"
  },
  {
    "path": "crates/tauri/permissions/app/autogenerated/reference.md",
    "chars": 4200,
    "preview": "## Default Permission\n\nDefault permissions for the plugin.\n\n#### This default permission set includes the following:\n\n- "
  },
  {
    "path": "crates/tauri/permissions/event/autogenerated/reference.md",
    "chars": 1303,
    "preview": "## Default Permission\n\nDefault permissions for the plugin, which enables all commands.\n\n#### This default permission set"
  },
  {
    "path": "crates/tauri/permissions/image/autogenerated/reference.md",
    "chars": 1563,
    "preview": "## Default Permission\n\nDefault permissions for the plugin, which enables all commands.\n\n#### This default permission set"
  },
  {
    "path": "crates/tauri/permissions/menu/autogenerated/reference.md",
    "chars": 6509,
    "preview": "## Default Permission\n\nDefault permissions for the plugin, which enables all commands.\n\n#### This default permission set"
  },
  {
    "path": "crates/tauri/permissions/path/autogenerated/reference.md",
    "chars": 2452,
    "preview": "## Default Permission\n\nDefault permissions for the plugin, which enables all commands.\n\n#### This default permission set"
  },
  {
    "path": "crates/tauri/permissions/resources/autogenerated/reference.md",
    "chars": 506,
    "preview": "## Default Permission\n\nDefault permissions for the plugin, which enables all commands.\n\n#### This default permission set"
  },
  {
    "path": "crates/tauri/permissions/tray/autogenerated/reference.md",
    "chars": 3476,
    "preview": "## Default Permission\n\nDefault permissions for the plugin, which enables all commands.\n\n#### This default permission set"
  },
  {
    "path": "crates/tauri/permissions/webview/autogenerated/reference.md",
    "chars": 5610,
    "preview": "## Default Permission\n\nDefault permissions for the plugin.\n\n#### This default permission set includes the following:\n\n- "
  },
  {
    "path": "crates/tauri/permissions/window/autogenerated/reference.md",
    "chars": 22088,
    "preview": "## Default Permission\n\nDefault permissions for the plugin.\n\n#### This default permission set includes the following:\n\n- "
  },
  {
    "path": "crates/tauri/scripts/bundle.global.js",
    "chars": 40223,
    "preview": "var __TAURI_IIFE__=function(e){\"use strict\";function n(e,n,t,i){if(\"a\"===t&&!i)throw new TypeError(\"Private accessor was"
  },
  {
    "path": "crates/tauri/scripts/core.js",
    "chars": 2981,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/scripts/freeze_prototype.js",
    "chars": 174,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/scripts/init.js",
    "chars": 300,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/scripts/ipc-protocol.js",
    "chars": 3390,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/scripts/ipc.js",
    "chars": 5832,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/scripts/isolation.js",
    "chars": 584,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/scripts/pattern.js",
    "chars": 558,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/scripts/process-ipc-message-fn.js",
    "chars": 1187,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/app/plugin.rs",
    "chars": 3649,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/app.rs",
    "chars": 81644,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/async_runtime.rs",
    "chars": 8560,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/error.rs",
    "chars": 6410,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/event/event-system-spec.md",
    "chars": 1003,
    "preview": "# Tauri Event System Specification\n\n## Emitters\n\nEmitters can emit to any and all listeners.\n\n- `App` and `AppHandle`\n- "
  },
  {
    "path": "crates/tauri/src/event/event_name.rs",
    "chars": 1920,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/event/init.js",
    "chars": 317,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/event/listener.rs",
    "chars": 10688,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/event/mod.rs",
    "chars": 5953,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/event/plugin.rs",
    "chars": 2096,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/image/mod.rs",
    "chars": 6915,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/image/plugin.rs",
    "chars": 2638,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/ios.rs",
    "chars": 1313,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/ipc/authority.rs",
    "chars": 34320,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/ipc/capability_builder.rs",
    "chars": 4374,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/ipc/channel.rs",
    "chars": 10708,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/ipc/command.rs",
    "chars": 9268,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/ipc/format_callback.rs",
    "chars": 12253,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/ipc/mod.rs",
    "chars": 15761,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/ipc/protocol.rs",
    "chars": 25050,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/lib.rs",
    "chars": 42368,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/manager/menu.rs",
    "chars": 3108,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/manager/mod.rs",
    "chars": 28851,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/manager/tray.rs",
    "chars": 2410,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/manager/webview.rs",
    "chars": 23092,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/manager/window.rs",
    "chars": 9112,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/menu/builders/check.rs",
    "chars": 2433,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/menu/builders/icon.rs",
    "chars": 3435,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/menu/builders/menu.rs",
    "chars": 19210,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/menu/builders/mod.rs",
    "chars": 409,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/menu/builders/normal.rs",
    "chars": 2063,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/menu/check.rs",
    "chars": 4267,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/menu/icon.rs",
    "chars": 6850,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/menu/menu.rs",
    "chars": 11867,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  },
  {
    "path": "crates/tauri/src/menu/mod.rs",
    "chars": 23738,
    "preview": "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-Lic"
  }
]

// ... and 756 more files (download for full content)

About this extraction

This page contains the full source code of the tauri-apps/tauri GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 956 files (6.1 MB), approximately 1.7M tokens, and a symbol index with 5662 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!