diff --git a/desktop/tauri/src-tauri/Cargo.lock b/desktop/tauri/src-tauri/Cargo.lock
index b7e28b8b..858e5a27 100644
--- a/desktop/tauri/src-tauri/Cargo.lock
+++ b/desktop/tauri/src-tauri/Cargo.lock
@@ -228,19 +228,18 @@ checksum = "d67af77d68a931ecd5cbd8a3b5987d63a1d1d1278f7f6a60ae33db485cdebb69"
[[package]]
name = "arboard"
-version = "3.3.2"
+version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2041f1943049c7978768d84e6d0fd95de98b76d6c4727b09e78ec253d29fa58"
+checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89"
dependencies = [
"clipboard-win",
"core-graphics",
- "image",
+ "image 0.25.1",
"log",
- "objc",
- "objc-foundation",
- "objc_id",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
"parking_lot",
- "thiserror",
"windows-sys 0.48.0",
"x11rb",
]
@@ -293,7 +292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb"
dependencies = [
"event-listener 5.3.0",
- "event-listener-strategy 0.5.1",
+ "event-listener-strategy 0.5.2",
"futures-core",
"pin-project-lite",
]
@@ -306,7 +305,7 @@ checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928"
dependencies = [
"concurrent-queue",
"event-listener 5.3.0",
- "event-listener-strategy 0.5.1",
+ "event-listener-strategy 0.5.2",
"futures-core",
"pin-project-lite",
]
@@ -326,11 +325,11 @@ dependencies = [
[[package]]
name = "async-fs"
-version = "2.1.1"
+version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc19683171f287921f2405677dd2ed2549c3b3bda697a563ebc3a121ace2aba1"
+checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a"
dependencies = [
- "async-lock 3.3.0",
+ "async-lock",
"blocking",
"futures-lite",
]
@@ -341,28 +340,19 @@ version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884"
dependencies = [
- "async-lock 3.3.0",
+ "async-lock",
"cfg-if",
"concurrent-queue",
"futures-io",
"futures-lite",
"parking",
"polling",
- "rustix 0.38.32",
+ "rustix 0.38.34",
"slab",
"tracing",
"windows-sys 0.52.0",
]
-[[package]]
-name = "async-lock"
-version = "2.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b"
-dependencies = [
- "event-listener 2.5.3",
-]
-
[[package]]
name = "async-lock"
version = "3.3.0"
@@ -376,29 +366,29 @@ dependencies = [
[[package]]
name = "async-process"
-version = "2.2.1"
+version = "2.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cad07b3443bfa10dcddf86a452ec48949e8e7fedf7392d82de3969fda99e90ed"
+checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d"
dependencies = [
"async-channel",
"async-io",
- "async-lock 3.3.0",
+ "async-lock",
"async-signal",
"async-task",
"blocking",
"cfg-if",
"event-listener 5.3.0",
"futures-lite",
- "rustix 0.38.32",
+ "rustix 0.38.34",
"tracing",
"windows-sys 0.52.0",
]
[[package]]
name = "async-recursion"
-version = "1.1.0"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30c5ef0ede93efbf733c1a727f3b6b5a1060bbedd5600183e66f6e4be4af0ec5"
+checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [
"proc-macro2",
"quote",
@@ -407,27 +397,27 @@ dependencies = [
[[package]]
name = "async-signal"
-version = "0.2.5"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5"
+checksum = "afe66191c335039c7bb78f99dc7520b0cbb166b3a1cb33a03f53d8a1c6f2afda"
dependencies = [
"async-io",
- "async-lock 2.8.0",
+ "async-lock",
"atomic-waker",
"cfg-if",
"futures-core",
"futures-io",
- "rustix 0.38.32",
+ "rustix 0.38.34",
"signal-hook-registry",
"slab",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
]
[[package]]
name = "async-task"
-version = "4.7.0"
+version = "4.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799"
+checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
[[package]]
name = "async-trait"
@@ -707,19 +697,26 @@ dependencies = [
]
[[package]]
-name = "blocking"
-version = "1.5.1"
+name = "block2"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118"
+checksum = "43ff7d91d3c1d568065b06c899777d1e48dcf76103a672a0adbc238a7f247f1e"
+dependencies = [
+ "objc2",
+]
+
+[[package]]
+name = "blocking"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88"
dependencies = [
"async-channel",
- "async-lock 3.3.0",
+ "async-lock",
"async-task",
- "fastrand",
"futures-io",
"futures-lite",
"piper",
- "tracing",
]
[[package]]
@@ -786,9 +783,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]]
name = "bytecount"
-version = "0.6.7"
+version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205"
+checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
[[package]]
name = "bytemuck"
@@ -841,7 +838,7 @@ dependencies = [
"ahash",
"cached_proc_macro",
"cached_proc_macro_types",
- "hashbrown 0.14.3",
+ "hashbrown 0.14.5",
"instant",
"once_cell",
"thiserror",
@@ -989,12 +986,13 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.0.94"
+version = "1.0.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7"
+checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b"
dependencies = [
"jobserver",
"libc",
+ "once_cell",
]
[[package]]
@@ -1219,9 +1217,9 @@ checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101"
[[package]]
name = "concurrent-queue"
-version = "2.4.0"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363"
+checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
dependencies = [
"crossbeam-utils",
]
@@ -1572,9 +1570,9 @@ dependencies = [
[[package]]
name = "data-encoding"
-version = "2.5.0"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
+checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2"
[[package]]
name = "data-url"
@@ -2086,12 +2084,6 @@ version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b"
-[[package]]
-name = "event-listener"
-version = "2.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
-
[[package]]
name = "event-listener"
version = "4.0.3"
@@ -2126,9 +2118,9 @@ dependencies = [
[[package]]
name = "event-listener-strategy"
-version = "0.5.1"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3"
+checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1"
dependencies = [
"event-listener 5.3.0",
"pin-project-lite",
@@ -2162,9 +2154,9 @@ dependencies = [
[[package]]
name = "fastrand"
-version = "2.0.2"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984"
+checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
[[package]]
name = "fdeflate"
@@ -2187,9 +2179,9 @@ dependencies = [
[[package]]
name = "fiat-crypto"
-version = "0.2.7"
+version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f"
+checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e"
[[package]]
name = "field-offset"
@@ -2215,9 +2207,9 @@ dependencies = [
[[package]]
name = "flate2"
-version = "1.0.28"
+version = "1.0.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
+checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae"
dependencies = [
"crc32fast",
"miniz_oxide",
@@ -2888,9 +2880,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "hashbrown"
-version = "0.14.3"
+version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
"ahash",
"allocator-api2",
@@ -3203,6 +3195,19 @@ dependencies = [
"tiff",
]
+[[package]]
+name = "image"
+version = "0.25.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "num-traits",
+ "png",
+ "tiff",
+]
+
[[package]]
name = "imagesize"
version = "0.12.0"
@@ -3246,7 +3251,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
dependencies = [
"equivalent",
- "hashbrown 0.14.3",
+ "hashbrown 0.14.5",
"serde",
]
@@ -3447,9 +3452,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
[[package]]
name = "jobserver"
-version = "0.1.30"
+version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "685a7d121ee3f65ae4fddd72b25a04bb36b6af81bc0828f7d5434c0fe60fa3a2"
+checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e"
dependencies = [
"libc",
]
@@ -3497,9 +3502,9 @@ dependencies = [
[[package]]
name = "jsonrpsee"
-version = "0.22.4"
+version = "0.22.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4b0e68d9af1f066c06d6e2397583795b912d78537d7d907c561e82c13d69fa1"
+checksum = "cfdb12a2381ea5b2e68c3469ec604a007b367778cdb14d09612c8069ebd616ad"
dependencies = [
"jsonrpsee-core",
"jsonrpsee-server",
@@ -3509,9 +3514,9 @@ dependencies = [
[[package]]
name = "jsonrpsee-client-transport"
-version = "0.22.4"
+version = "0.22.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92f254f56af1ae84815b9b1325094743dcf05b92abb5e94da2e81a35cff0cada"
+checksum = "4978087a58c3ab02efc5b07c5e5e2803024536106fd5506f558db172c889b3aa"
dependencies = [
"futures-util",
"http 0.2.12",
@@ -3527,9 +3532,9 @@ dependencies = [
[[package]]
name = "jsonrpsee-core"
-version = "0.22.4"
+version = "0.22.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "274d68152c24aa78977243bb56f28d7946e6aa309945b37d33174a3f92d89a3a"
+checksum = "b4b257e1ec385e07b0255dde0b933f948b5c8b8c28d42afda9587c3a967b896d"
dependencies = [
"anyhow",
"async-trait",
@@ -3552,9 +3557,9 @@ dependencies = [
[[package]]
name = "jsonrpsee-server"
-version = "0.22.4"
+version = "0.22.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b5bfbda5f8fb63f997102fd18f73e35e34c84c6dcdbdbbe72c6e48f6d2c959b"
+checksum = "12d8b6a9674422a8572e0b0abb12feeb3f2aeda86528c80d0350c2bd0923ab41"
dependencies = [
"futures-util",
"http 0.2.12",
@@ -3576,9 +3581,9 @@ dependencies = [
[[package]]
name = "jsonrpsee-types"
-version = "0.22.4"
+version = "0.22.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dc828e537868d6b12bbb07ec20324909a22ced6efca0057c825c3e1126b2c6d"
+checksum = "150d6168405890a7a3231a3c74843f58b8959471f6df76078db2619ddee1d07d"
dependencies = [
"anyhow",
"beef",
@@ -3589,9 +3594,9 @@ dependencies = [
[[package]]
name = "jsonrpsee-ws-client"
-version = "0.22.4"
+version = "0.22.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32f00abe918bf34b785f87459b9205790e5361a3f7437adb50e928dc243f27eb"
+checksum = "58b9db2dfd5bb1194b0ce921504df9ceae210a345bc2f6c5a61432089bbab070"
dependencies = [
"http 0.2.12",
"jsonrpsee-client-transport",
@@ -3757,9 +3762,9 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.153"
+version = "0.2.154"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
+checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
[[package]]
name = "libloading"
@@ -3829,9 +3834,9 @@ dependencies = [
[[package]]
name = "lock_api"
-version = "0.4.11"
+version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
dependencies = [
"autocfg",
"scopeguard",
@@ -4167,7 +4172,7 @@ dependencies = [
"log",
"mac-notification-sys",
"serde",
- "tauri-winrt-notification 0.2.1",
+ "tauri-winrt-notification",
"zbus",
]
@@ -4371,6 +4376,61 @@ dependencies = [
"objc_id",
]
+[[package]]
+name = "objc-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da284c198fb9b7b0603f8635185e85fbd5b64ee154b1ed406d489077de2d6d60"
+
+[[package]]
+name = "objc2"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4b25e1034d0e636cd84707ccdaa9f81243d399196b8a773946dcffec0401659"
+dependencies = [
+ "objc-sys",
+ "objc2-encode",
+]
+
+[[package]]
+name = "objc2-app-kit"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb79768a710a9a1798848179edb186d1af7e8a8679f369e4b8d201dd2a034047"
+dependencies = [
+ "block2",
+ "objc2",
+ "objc2-core-data",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-data"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e092bc42eaf30a08844e6a076938c60751225ec81431ab89f5d1ccd9f958d6c"
+dependencies = [
+ "block2",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-encode"
+version = "4.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88658da63e4cc2c8adb1262902cd6af51094df0488b760d6fd27194269c0950a"
+
+[[package]]
+name = "objc2-foundation"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfaefe14254871ea16c7d88968c0ff14ba554712a20d76421eec52f0a7fb8904"
+dependencies = [
+ "block2",
+ "objc2",
+]
+
[[package]]
name = "objc_exception"
version = "0.1.2"
@@ -4447,7 +4507,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79"
dependencies = [
"dlv-list",
- "hashbrown 0.14.3",
+ "hashbrown 0.14.5",
]
[[package]]
@@ -4544,9 +4604,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
[[package]]
name = "parking_lot"
-version = "0.12.1"
+version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -4554,15 +4614,15 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.9"
+version = "0.9.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall 0.4.1",
+ "redox_syscall 0.5.1",
"smallvec",
- "windows-targets 0.48.5",
+ "windows-targets 0.52.5",
]
[[package]]
@@ -4944,7 +5004,7 @@ dependencies = [
"base64 0.21.7",
"indexmap 2.2.6",
"line-wrap",
- "quick-xml 0.31.0",
+ "quick-xml",
"serde",
"time",
]
@@ -4964,15 +5024,15 @@ dependencies = [
[[package]]
name = "polling"
-version = "3.6.0"
+version = "3.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0c976a60b2d7e99d6f229e414670a9b85d13ac305cc6d1e9c134de58c5aaaf6"
+checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3"
dependencies = [
"cfg-if",
"concurrent-queue",
"hermit-abi 0.3.9",
"pin-project-lite",
- "rustix 0.38.32",
+ "rustix 0.38.34",
"tracing",
"windows-sys 0.52.0",
]
@@ -5102,15 +5162,6 @@ dependencies = [
"bytemuck",
]
-[[package]]
-name = "quick-xml"
-version = "0.30.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956"
-dependencies = [
- "memchr",
-]
-
[[package]]
name = "quick-xml"
version = "0.31.0"
@@ -5218,9 +5269,9 @@ checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
[[package]]
name = "raw-window-handle"
-version = "0.6.0"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544"
+checksum = "8cc3bcbdb1ddfc11e700e62968e6b4cc9c75bb466464ad28fb61c5b2c964418b"
[[package]]
name = "rayon"
@@ -5370,9 +5421,9 @@ dependencies = [
[[package]]
name = "reqwest"
-version = "0.12.3"
+version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19"
+checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10"
dependencies = [
"base64 0.22.0",
"bytes",
@@ -5449,7 +5500,7 @@ dependencies = [
"objc",
"objc-foundation",
"objc_id",
- "raw-window-handle 0.6.0",
+ "raw-window-handle 0.6.1",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
@@ -5631,9 +5682,9 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.38.32"
+version = "0.38.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89"
+checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
dependencies = [
"bitflags 2.5.0",
"errno",
@@ -5644,9 +5695,9 @@ dependencies = [
[[package]]
name = "rustls"
-version = "0.22.3"
+version = "0.22.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c"
+checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432"
dependencies = [
"log",
"ring",
@@ -5658,15 +5709,15 @@ dependencies = [
[[package]]
name = "rustls-pki-types"
-version = "1.4.1"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247"
+checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54"
[[package]]
name = "rustls-webpki"
-version = "0.102.2"
+version = "0.102.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610"
+checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf"
dependencies = [
"ring",
"rustls-pki-types",
@@ -5721,9 +5772,9 @@ dependencies = [
[[package]]
name = "schemars"
-version = "0.8.16"
+version = "0.8.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29"
+checksum = "7f55c82c700538496bdc329bb4918a81f87cc8888811bd123cf325a0f2f8d309"
dependencies = [
"dyn-clone",
"indexmap 1.9.3",
@@ -5735,14 +5786,14 @@ dependencies = [
[[package]]
name = "schemars_derive"
-version = "0.8.16"
+version = "0.8.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967"
+checksum = "83263746fe5e32097f06356968a077f96089739c927a61450efa069905eec108"
dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
- "syn 1.0.109",
+ "syn 2.0.60",
]
[[package]]
@@ -5813,9 +5864,9 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.198"
+version = "1.0.199"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc"
+checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a"
dependencies = [
"serde_derive",
]
@@ -5832,9 +5883,9 @@ dependencies = [
[[package]]
name = "serde_derive"
-version = "1.0.198"
+version = "1.0.199"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9"
+checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc"
dependencies = [
"proc-macro2",
"quote",
@@ -5843,13 +5894,13 @@ dependencies = [
[[package]]
name = "serde_derive_internals"
-version = "0.26.0"
+version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c"
+checksum = "330f01ce65a3a5fe59a60c82f3c9a024b573b8a6e875bd233fe5f934e71d54e3"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.60",
]
[[package]]
@@ -5917,11 +5968,11 @@ dependencies = [
[[package]]
name = "serde_with"
-version = "3.7.0"
+version = "3.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a"
+checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20"
dependencies = [
- "base64 0.21.7",
+ "base64 0.22.0",
"chrono",
"hex",
"indexmap 1.9.3",
@@ -5935,9 +5986,9 @@ dependencies = [
[[package]]
name = "serde_with_macros"
-version = "3.7.0"
+version = "3.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655"
+checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2"
dependencies = [
"darling 0.20.8",
"proc-macro2",
@@ -6064,9 +6115,9 @@ checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
[[package]]
name = "signal-hook-registry"
-version = "1.4.1"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
dependencies = [
"libc",
]
@@ -6134,9 +6185,9 @@ checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c"
[[package]]
name = "socket2"
-version = "0.5.6"
+version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871"
+checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -6167,7 +6218,7 @@ dependencies = [
"js-sys",
"log",
"objc",
- "raw-window-handle 0.6.0",
+ "raw-window-handle 0.6.1",
"redox_syscall 0.5.1",
"wasm-bindgen",
"wayland-sys",
@@ -6531,11 +6582,11 @@ dependencies = [
[[package]]
name = "tao"
-version = "0.27.0"
+version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd5b6ec2c43abd15155f040c765001098f50f425414b679225d471a1cd782753"
+checksum = "92bcf8885e147b56d6e26751263b45876284f32ca404703f6d3b8f80d16ff4dd"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.5.0",
"cocoa",
"core-foundation",
"core-graphics",
@@ -6557,12 +6608,13 @@ dependencies = [
"objc",
"once_cell",
"parking_lot",
- "raw-window-handle 0.6.0",
+ "raw-window-handle 0.6.1",
"scopeguard",
"tao-macros",
"unicode-segmentation",
"url",
- "windows 0.54.0",
+ "windows 0.56.0",
+ "windows-core 0.56.0",
"windows-version",
"x11-dl",
]
@@ -6613,7 +6665,7 @@ dependencies = [
"gtk",
"heck 0.4.1",
"http 1.1.0",
- "image",
+ "image 0.24.9",
"jni",
"libc",
"log",
@@ -6621,8 +6673,8 @@ dependencies = [
"muda",
"objc",
"percent-encoding",
- "raw-window-handle 0.6.0",
- "reqwest 0.12.3",
+ "raw-window-handle 0.6.1",
+ "reqwest 0.12.4",
"serde",
"serde_json",
"serde_repr",
@@ -6640,7 +6692,7 @@ dependencies = [
"url",
"urlpattern",
"webkit2gtk",
- "webview2-com 0.30.0",
+ "webview2-com",
"window-vibrancy",
"windows 0.56.0",
]
@@ -6669,9 +6721,9 @@ dependencies = [
[[package]]
name = "tauri-bundler"
-version = "2.0.1-beta.9"
+version = "2.0.1-beta.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb1b31a5827cd5742ed2da146de25265650e94722776225891a83fac459972bc"
+checksum = "1ca8bc7e72bbe56d4c7349b3f9176ada49198979d41f36c6098c53be69c1a1de"
dependencies = [
"anyhow",
"ar",
@@ -6681,9 +6733,9 @@ dependencies = [
"flate2",
"glob",
"handlebars 5.1.2",
- "heck 0.4.1",
+ "heck 0.5.0",
"hex",
- "image",
+ "image 0.24.9",
"log",
"md5",
"os_pipe",
@@ -6712,9 +6764,9 @@ dependencies = [
[[package]]
name = "tauri-cli"
-version = "2.0.0-beta.13"
+version = "2.0.0-beta.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97a2df50320ca1e818682c2d357b3500cc9c1a27233e1c8fd82970f0afe91e07"
+checksum = "7767938f2f20d17a6ceccda488055b50437694817a406a253508e10622b47e5a"
dependencies = [
"anyhow",
"axum",
@@ -6736,7 +6788,7 @@ dependencies = [
"heck 0.4.1",
"html5ever",
"ignore",
- "image",
+ "image 0.24.9",
"include_dir",
"itertools",
"json-patch",
@@ -6770,7 +6822,7 @@ dependencies = [
"thiserror",
"tokio",
"toml 0.8.12",
- "toml_edit 0.22.11",
+ "toml_edit 0.22.12",
"unicode-width",
"ureq",
"url",
@@ -6831,9 +6883,9 @@ dependencies = [
[[package]]
name = "tauri-plugin"
-version = "2.0.0-beta.12"
+version = "2.0.0-beta.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21c6be726c8d57ccf440e6b05a904e6acbbafb9aaf88b8a47cc1923d36ddc512"
+checksum = "6baaee0a083db1e04a1b7a3b0670d86a4d95dd2a54e7cbfb5547762b8ed098d9"
dependencies = [
"anyhow",
"glob",
@@ -6878,13 +6930,13 @@ dependencies = [
[[package]]
name = "tauri-plugin-dialog"
-version = "2.0.0-beta.5"
+version = "2.0.0-beta.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db4476c824a1488a52f4672d2b419a71fbf3dc97249013ef3c2c08fae2a23b71"
+checksum = "87caf6f2b704b0d27b4c64ef1fdd1f6ef97e2f5293216e230ad1efe61de54131"
dependencies = [
"dunce",
"log",
- "raw-window-handle 0.6.0",
+ "raw-window-handle 0.6.1",
"rfd",
"serde",
"serde_json",
@@ -6896,9 +6948,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-fs"
-version = "2.0.0-beta.5"
+version = "2.0.0-beta.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c138126392c350aa68554e3461529b02680062c9146ab7b41d3ef97a2deaf93b"
+checksum = "609f53d90f08808679ecdd81455d9a4d0053291b92780695569f7400fdba27d5"
dependencies = [
"anyhow",
"glob",
@@ -6915,9 +6967,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-notification"
-version = "2.0.0-beta.3"
+version = "2.0.0-beta.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ea37304d8bf7d875d0208f9c81b6af68d75dcd0f30c6910b10157739bd19353"
+checksum = "e5a8be5029a046b6b95aac438b9b78e61dbc5194a00efdc35c754de382ddb177"
dependencies = [
"log",
"mac-notification-sys",
@@ -6927,7 +6979,7 @@ dependencies = [
"serde_repr",
"tauri",
"tauri-plugin",
- "tauri-winrt-notification 0.1.3",
+ "tauri-winrt-notification",
"thiserror",
"time",
"url",
@@ -6997,7 +7049,7 @@ dependencies = [
"gtk",
"http 1.1.0",
"jni",
- "raw-window-handle 0.6.0",
+ "raw-window-handle 0.6.1",
"serde",
"serde_json",
"tauri-utils 2.0.0-beta.13",
@@ -7018,14 +7070,14 @@ dependencies = [
"jni",
"log",
"percent-encoding",
- "raw-window-handle 0.6.0",
+ "raw-window-handle 0.6.1",
"softbuffer",
"tao",
"tauri-runtime",
"tauri-utils 2.0.0-beta.13",
"url",
"webkit2gtk",
- "webview2-com 0.30.0",
+ "webview2-com",
"windows 0.56.0",
"wry",
]
@@ -7110,23 +7162,13 @@ dependencies = [
"toml 0.7.8",
]
-[[package]]
-name = "tauri-winrt-notification"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "006851c9ccefa3c38a7646b8cec804bb429def3da10497bfa977179869c3e8e2"
-dependencies = [
- "quick-xml 0.30.0",
- "windows 0.51.1",
-]
-
[[package]]
name = "tauri-winrt-notification"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f89f5fb70d6f62381f5d9b2ba9008196150b40b75f3068eb24faeddf1c686871"
dependencies = [
- "quick-xml 0.31.0",
+ "quick-xml",
"windows 0.56.0",
"windows-version",
]
@@ -7139,7 +7181,7 @@ checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
dependencies = [
"cfg-if",
"fastrand",
- "rustix 0.38.32",
+ "rustix 0.38.34",
"windows-sys 0.52.0",
]
@@ -7202,18 +7244,18 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
[[package]]
name = "thiserror"
-version = "1.0.58"
+version = "1.0.59"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297"
+checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.58"
+version = "1.0.59"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
+checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66"
dependencies = [
"proc-macro2",
"quote",
@@ -7444,7 +7486,7 @@ dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
- "toml_edit 0.22.11",
+ "toml_edit 0.22.12",
]
[[package]]
@@ -7493,15 +7535,15 @@ dependencies = [
[[package]]
name = "toml_edit"
-version = "0.22.11"
+version = "0.22.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb686a972ccef8537b39eead3968b0e8616cb5040dbb9bba93007c8e07c9215f"
+checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef"
dependencies = [
"indexmap 2.2.6",
"serde",
"serde_spanned",
"toml_datetime",
- "winnow 0.6.6",
+ "winnow 0.6.7",
]
[[package]]
@@ -7801,9 +7843,9 @@ checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94"
[[package]]
name = "unicode-width"
-version = "0.1.11"
+version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
+checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6"
[[package]]
name = "universal-hash"
@@ -7823,11 +7865,11 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "ureq"
-version = "2.9.6"
+version = "2.9.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35"
+checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd"
dependencies = [
- "base64 0.21.7",
+ "base64 0.22.0",
"flate2",
"log",
"once_cell",
@@ -8177,20 +8219,6 @@ dependencies = [
"rustls-pki-types",
]
-[[package]]
-name = "webview2-com"
-version = "0.29.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38d5949fc3f537e90240c3e4f78dda2fa0431b671d50845a2f582173ef8a1201"
-dependencies = [
- "webview2-com-macros",
- "webview2-com-sys 0.29.0",
- "windows 0.54.0",
- "windows-core 0.54.0",
- "windows-implement 0.53.0",
- "windows-interface 0.53.0",
-]
-
[[package]]
name = "webview2-com"
version = "0.30.0"
@@ -8198,11 +8226,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c914dd492a52f0377bef56fd1b6e74a79090f9ee631d625d5b505a00e4538b6"
dependencies = [
"webview2-com-macros",
- "webview2-com-sys 0.30.0",
+ "webview2-com-sys",
"windows 0.56.0",
"windows-core 0.56.0",
- "windows-implement 0.56.0",
- "windows-interface 0.56.0",
+ "windows-implement",
+ "windows-interface",
]
[[package]]
@@ -8216,17 +8244,6 @@ dependencies = [
"syn 2.0.60",
]
-[[package]]
-name = "webview2-com-sys"
-version = "0.29.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd1eaa1be63d6fdcadf893c40d7d53c889a6342b3a94930d34e6964d5bb7e8db"
-dependencies = [
- "thiserror",
- "windows 0.54.0",
- "windows-core 0.54.0",
-]
-
[[package]]
name = "webview2-com-sys"
version = "0.30.0"
@@ -8252,7 +8269,7 @@ checksum = "8211e4f58a2b2805adfbefbc07bab82958fc91e3836339b1ab7ae32465dce0d7"
dependencies = [
"either",
"home",
- "rustix 0.38.32",
+ "rustix 0.38.34",
"winsafe",
]
@@ -8280,11 +8297,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
-version = "0.1.6"
+version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
+checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
dependencies = [
- "winapi",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -8301,7 +8318,7 @@ checksum = "33082acd404763b315866e14a0d5193f3422c81086657583937a750cdd3ec340"
dependencies = [
"cocoa",
"objc",
- "raw-window-handle 0.6.0",
+ "raw-window-handle 0.6.1",
"windows-sys 0.52.0",
"windows-version",
]
@@ -8315,16 +8332,6 @@ dependencies = [
"windows-targets 0.48.5",
]
-[[package]]
-name = "windows"
-version = "0.51.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9"
-dependencies = [
- "windows-core 0.51.1",
- "windows-targets 0.48.5",
-]
-
[[package]]
name = "windows"
version = "0.54.0"
@@ -8332,8 +8339,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49"
dependencies = [
"windows-core 0.54.0",
- "windows-implement 0.53.0",
- "windows-interface 0.53.0",
"windows-targets 0.52.5",
]
@@ -8347,15 +8352,6 @@ dependencies = [
"windows-targets 0.52.5",
]
-[[package]]
-name = "windows-core"
-version = "0.51.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64"
-dependencies = [
- "windows-targets 0.48.5",
-]
-
[[package]]
name = "windows-core"
version = "0.52.0"
@@ -8381,23 +8377,12 @@ version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6"
dependencies = [
- "windows-implement 0.56.0",
- "windows-interface 0.56.0",
+ "windows-implement",
+ "windows-interface",
"windows-result",
"windows-targets 0.52.5",
]
-[[package]]
-name = "windows-implement"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.60",
-]
-
[[package]]
name = "windows-implement"
version = "0.56.0"
@@ -8409,17 +8394,6 @@ dependencies = [
"syn 2.0.60",
]
-[[package]]
-name = "windows-interface"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.60",
-]
-
[[package]]
name = "windows-interface"
version = "0.56.0"
@@ -8676,9 +8650,9 @@ dependencies = [
[[package]]
name = "winnow"
-version = "0.6.6"
+version = "0.6.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352"
+checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578"
dependencies = [
"memchr",
]
@@ -8711,11 +8685,11 @@ checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
[[package]]
name = "wry"
-version = "0.39.1"
+version = "0.39.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "798fb0ee725c2d243d463e62c5150fd12002a3f51f12a36d62cd7b1b7befd33d"
+checksum = "6e180ac2740d6cb4d5cec0abf63eacbea90f1b7e5e3803043b13c1c84c4b7884"
dependencies = [
- "base64 0.21.7",
+ "base64 0.22.0",
"block",
"cocoa",
"core-graphics",
@@ -8737,15 +8711,16 @@ dependencies = [
"objc_id",
"once_cell",
"percent-encoding",
- "raw-window-handle 0.6.0",
+ "raw-window-handle 0.6.1",
"sha2",
"soup3",
"tao-macros",
"thiserror",
"webkit2gtk",
"webkit2gtk-sys",
- "webview2-com 0.29.0",
- "windows 0.54.0",
+ "webview2-com",
+ "windows 0.56.0",
+ "windows-core 0.56.0",
"windows-version",
"x11-dl",
]
@@ -8778,7 +8753,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a"
dependencies = [
"gethostname",
- "rustix 0.38.32",
+ "rustix 0.38.34",
"x11rb-protocol",
]
@@ -8827,7 +8802,7 @@ checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f"
dependencies = [
"libc",
"linux-raw-sys 0.4.13",
- "rustix 0.38.32",
+ "rustix 0.38.34",
]
[[package]]
@@ -8865,7 +8840,7 @@ dependencies = [
"async-executor",
"async-fs",
"async-io",
- "async-lock 3.3.0",
+ "async-lock",
"async-process",
"async-recursion",
"async-task",
diff --git a/desktop/tauri/src-tauri/gen/schemas/windows-schema.json b/desktop/tauri/src-tauri/gen/schemas/windows-schema.json
new file mode 100644
index 00000000..594dade7
--- /dev/null
+++ b/desktop/tauri/src-tauri/gen/schemas/windows-schema.json
@@ -0,0 +1,2651 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "CapabilityFile",
+ "description": "Capability formats accepted in a capability file.",
+ "anyOf": [
+ {
+ "description": "A single capability.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Capability"
+ }
+ ]
+ },
+ {
+ "description": "A list of capabilities.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Capability"
+ }
+ },
+ {
+ "description": "A list of capabilities.",
+ "type": "object",
+ "required": [
+ "capabilities"
+ ],
+ "properties": {
+ "capabilities": {
+ "description": "The list of capabilities.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Capability"
+ }
+ }
+ }
+ }
+ ],
+ "definitions": {
+ "Capability": {
+ "description": "a grouping and boundary mechanism developers can use to separate windows or plugins functionality from each other at runtime.\n\nIf a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create trust groups and reduce impact of vulnerabilities in certain plugins or windows. Windows can be added to a capability by exact name or glob patterns like *, admin-* or main-window.",
+ "type": "object",
+ "required": [
+ "identifier",
+ "permissions"
+ ],
+ "properties": {
+ "identifier": {
+ "description": "Identifier of the capability.",
+ "type": "string"
+ },
+ "description": {
+ "description": "Description of the capability.",
+ "default": "",
+ "type": "string"
+ },
+ "remote": {
+ "description": "Configure remote URLs that can use the capability permissions.",
+ "anyOf": [
+ {
+ "$ref": "#/definitions/CapabilityRemote"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "local": {
+ "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.",
+ "default": true,
+ "type": "boolean"
+ },
+ "windows": {
+ "description": "List of windows that uses this capability. Can be a glob pattern.\n\nOn multiwebview windows, prefer [`Self::webviews`] for a fine grained access control.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "webviews": {
+ "description": "List of webviews that uses this capability. Can be a glob pattern.\n\nThis is only required when using on multiwebview contexts, by default all child webviews of a window that matches [`Self::windows`] are linked.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "permissions": {
+ "description": "List of permissions attached to this capability. Must include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/PermissionEntry"
+ }
+ },
+ "platforms": {
+ "description": "Target platforms this capability applies. By default all platforms are affected by this capability.",
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "$ref": "#/definitions/Target"
+ }
+ }
+ }
+ },
+ "CapabilityRemote": {
+ "description": "Configuration for remote URLs that are associated with the capability.",
+ "type": "object",
+ "required": [
+ "urls"
+ ],
+ "properties": {
+ "urls": {
+ "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n# Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "PermissionEntry": {
+ "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.",
+ "anyOf": [
+ {
+ "description": "Reference a permission or permission set by identifier.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Identifier"
+ }
+ ]
+ },
+ {
+ "description": "Reference a permission or permission set by identifier and extends its scope.",
+ "type": "object",
+ "oneOf": [
+ {
+ "type": "object",
+ "required": [
+ "identifier"
+ ],
+ "properties": {
+ "identifier": {
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "shell:default"
+ ]
+ },
+ {
+ "description": "shell:allow-execute -> Enables the execute command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:allow-execute"
+ ]
+ },
+ {
+ "description": "shell:allow-kill -> Enables the kill command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:allow-kill"
+ ]
+ },
+ {
+ "description": "shell:allow-open -> Enables the open command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:allow-open"
+ ]
+ },
+ {
+ "description": "shell:allow-stdin-write -> Enables the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:allow-stdin-write"
+ ]
+ },
+ {
+ "description": "shell:deny-execute -> Denies the execute command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:deny-execute"
+ ]
+ },
+ {
+ "description": "shell:deny-kill -> Denies the kill command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:deny-kill"
+ ]
+ },
+ {
+ "description": "shell:deny-open -> Denies the open command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:deny-open"
+ ]
+ },
+ {
+ "description": "shell:deny-stdin-write -> Denies the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:deny-stdin-write"
+ ]
+ }
+ ]
+ },
+ "allow": {
+ "items": {
+ "title": "Entry",
+ "description": "A command allowed to be executed by the webview API.",
+ "type": "object",
+ "required": [
+ "args",
+ "cmd",
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellAllowedArgs"
+ }
+ ]
+ },
+ "cmd": {
+ "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+ "type": "string"
+ },
+ "name": {
+ "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+ "type": "string"
+ },
+ "sidecar": {
+ "description": "If this command is a sidecar command.",
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "deny": {
+ "items": {
+ "title": "Entry",
+ "description": "A command allowed to be executed by the webview API.",
+ "type": "object",
+ "required": [
+ "args",
+ "cmd",
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellAllowedArgs"
+ }
+ ]
+ },
+ "cmd": {
+ "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+ "type": "string"
+ },
+ "name": {
+ "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+ "type": "string"
+ },
+ "sidecar": {
+ "description": "If this command is a sidecar command.",
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "Identifier": {
+ "oneOf": [
+ {
+ "description": "app:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "app:default"
+ ]
+ },
+ {
+ "description": "app:allow-app-hide -> Enables the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-app-hide"
+ ]
+ },
+ {
+ "description": "app:allow-app-show -> Enables the app_show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-app-show"
+ ]
+ },
+ {
+ "description": "app:allow-name -> Enables the name command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-name"
+ ]
+ },
+ {
+ "description": "app:allow-tauri-version -> Enables the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-tauri-version"
+ ]
+ },
+ {
+ "description": "app:allow-version -> Enables the version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-version"
+ ]
+ },
+ {
+ "description": "app:deny-app-hide -> Denies the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-app-hide"
+ ]
+ },
+ {
+ "description": "app:deny-app-show -> Denies the app_show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-app-show"
+ ]
+ },
+ {
+ "description": "app:deny-name -> Denies the name command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-name"
+ ]
+ },
+ {
+ "description": "app:deny-tauri-version -> Denies the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-tauri-version"
+ ]
+ },
+ {
+ "description": "app:deny-version -> Denies the version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-version"
+ ]
+ },
+ {
+ "description": "cli:default -> Allows reading the CLI matches",
+ "type": "string",
+ "enum": [
+ "cli:default"
+ ]
+ },
+ {
+ "description": "cli:allow-cli-matches -> Enables the cli_matches command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "cli:allow-cli-matches"
+ ]
+ },
+ {
+ "description": "cli:deny-cli-matches -> Denies the cli_matches command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "cli:deny-cli-matches"
+ ]
+ },
+ {
+ "type": "string",
+ "enum": [
+ "clipboard-manager:default"
+ ]
+ },
+ {
+ "description": "clipboard-manager:allow-read -> Enables the read command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:allow-read"
+ ]
+ },
+ {
+ "description": "clipboard-manager:allow-write -> Enables the write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:allow-write"
+ ]
+ },
+ {
+ "description": "clipboard-manager:deny-read -> Denies the read command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:deny-read"
+ ]
+ },
+ {
+ "description": "clipboard-manager:deny-write -> Denies the write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:deny-write"
+ ]
+ },
+ {
+ "type": "string",
+ "enum": [
+ "dialog:default"
+ ]
+ },
+ {
+ "description": "dialog:allow-ask -> Enables the ask command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "dialog:allow-ask"
+ ]
+ },
+ {
+ "description": "dialog:allow-confirm -> Enables the confirm command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "dialog:allow-confirm"
+ ]
+ },
+ {
+ "description": "dialog:allow-message -> Enables the message command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "dialog:allow-message"
+ ]
+ },
+ {
+ "description": "dialog:allow-open -> Enables the open command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "dialog:allow-open"
+ ]
+ },
+ {
+ "description": "dialog:allow-save -> Enables the save command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "dialog:allow-save"
+ ]
+ },
+ {
+ "description": "dialog:deny-ask -> Denies the ask command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "dialog:deny-ask"
+ ]
+ },
+ {
+ "description": "dialog:deny-confirm -> Denies the confirm command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "dialog:deny-confirm"
+ ]
+ },
+ {
+ "description": "dialog:deny-message -> Denies the message command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "dialog:deny-message"
+ ]
+ },
+ {
+ "description": "dialog:deny-open -> Denies the open command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "dialog:deny-open"
+ ]
+ },
+ {
+ "description": "dialog:deny-save -> Denies the save command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "dialog:deny-save"
+ ]
+ },
+ {
+ "description": "event:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "event:default"
+ ]
+ },
+ {
+ "description": "event:allow-emit -> Enables the emit command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "event:allow-emit"
+ ]
+ },
+ {
+ "description": "event:allow-emit-to -> Enables the emit_to command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "event:allow-emit-to"
+ ]
+ },
+ {
+ "description": "event:allow-listen -> Enables the listen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "event:allow-listen"
+ ]
+ },
+ {
+ "description": "event:allow-unlisten -> Enables the unlisten command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "event:allow-unlisten"
+ ]
+ },
+ {
+ "description": "event:deny-emit -> Denies the emit command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "event:deny-emit"
+ ]
+ },
+ {
+ "description": "event:deny-emit-to -> Denies the emit_to command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "event:deny-emit-to"
+ ]
+ },
+ {
+ "description": "event:deny-listen -> Denies the listen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "event:deny-listen"
+ ]
+ },
+ {
+ "description": "event:deny-unlisten -> Denies the unlisten command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "event:deny-unlisten"
+ ]
+ },
+ {
+ "description": "image:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "image:default"
+ ]
+ },
+ {
+ "description": "image:allow-from-bytes -> Enables the from_bytes command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "image:allow-from-bytes"
+ ]
+ },
+ {
+ "description": "image:allow-from-path -> Enables the from_path command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "image:allow-from-path"
+ ]
+ },
+ {
+ "description": "image:allow-new -> Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "image:allow-new"
+ ]
+ },
+ {
+ "description": "image:allow-rgba -> Enables the rgba command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "image:allow-rgba"
+ ]
+ },
+ {
+ "description": "image:allow-size -> Enables the size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "image:allow-size"
+ ]
+ },
+ {
+ "description": "image:deny-from-bytes -> Denies the from_bytes command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "image:deny-from-bytes"
+ ]
+ },
+ {
+ "description": "image:deny-from-path -> Denies the from_path command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "image:deny-from-path"
+ ]
+ },
+ {
+ "description": "image:deny-new -> Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "image:deny-new"
+ ]
+ },
+ {
+ "description": "image:deny-rgba -> Denies the rgba command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "image:deny-rgba"
+ ]
+ },
+ {
+ "description": "image:deny-size -> Denies the size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "image:deny-size"
+ ]
+ },
+ {
+ "description": "menu:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "menu:default"
+ ]
+ },
+ {
+ "description": "menu:allow-append -> Enables the append command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-append"
+ ]
+ },
+ {
+ "description": "menu:allow-create-default -> Enables the create_default command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-create-default"
+ ]
+ },
+ {
+ "description": "menu:allow-get -> Enables the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-get"
+ ]
+ },
+ {
+ "description": "menu:allow-insert -> Enables the insert command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-insert"
+ ]
+ },
+ {
+ "description": "menu:allow-is-checked -> Enables the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-is-checked"
+ ]
+ },
+ {
+ "description": "menu:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-is-enabled"
+ ]
+ },
+ {
+ "description": "menu:allow-items -> Enables the items command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-items"
+ ]
+ },
+ {
+ "description": "menu:allow-new -> Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-new"
+ ]
+ },
+ {
+ "description": "menu:allow-popup -> Enables the popup command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-popup"
+ ]
+ },
+ {
+ "description": "menu:allow-prepend -> Enables the prepend command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-prepend"
+ ]
+ },
+ {
+ "description": "menu:allow-remove -> Enables the remove command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-remove"
+ ]
+ },
+ {
+ "description": "menu:allow-remove-at -> Enables the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-remove-at"
+ ]
+ },
+ {
+ "description": "menu:allow-set-accelerator -> Enables the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-accelerator"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-app-menu -> Enables the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-app-menu"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-help-menu-for-nsapp -> Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-help-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-window-menu -> Enables the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-window-menu"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-windows-menu-for-nsapp -> Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-windows-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:allow-set-checked -> Enables the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-checked"
+ ]
+ },
+ {
+ "description": "menu:allow-set-enabled -> Enables the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-enabled"
+ ]
+ },
+ {
+ "description": "menu:allow-set-icon -> Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-icon"
+ ]
+ },
+ {
+ "description": "menu:allow-set-text -> Enables the set_text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-text"
+ ]
+ },
+ {
+ "description": "menu:allow-text -> Enables the text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-text"
+ ]
+ },
+ {
+ "description": "menu:deny-append -> Denies the append command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-append"
+ ]
+ },
+ {
+ "description": "menu:deny-create-default -> Denies the create_default command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-create-default"
+ ]
+ },
+ {
+ "description": "menu:deny-get -> Denies the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-get"
+ ]
+ },
+ {
+ "description": "menu:deny-insert -> Denies the insert command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-insert"
+ ]
+ },
+ {
+ "description": "menu:deny-is-checked -> Denies the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-is-checked"
+ ]
+ },
+ {
+ "description": "menu:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-is-enabled"
+ ]
+ },
+ {
+ "description": "menu:deny-items -> Denies the items command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-items"
+ ]
+ },
+ {
+ "description": "menu:deny-new -> Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-new"
+ ]
+ },
+ {
+ "description": "menu:deny-popup -> Denies the popup command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-popup"
+ ]
+ },
+ {
+ "description": "menu:deny-prepend -> Denies the prepend command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-prepend"
+ ]
+ },
+ {
+ "description": "menu:deny-remove -> Denies the remove command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-remove"
+ ]
+ },
+ {
+ "description": "menu:deny-remove-at -> Denies the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-remove-at"
+ ]
+ },
+ {
+ "description": "menu:deny-set-accelerator -> Denies the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-accelerator"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-app-menu -> Denies the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-app-menu"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-help-menu-for-nsapp -> Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-help-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-window-menu -> Denies the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-window-menu"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-windows-menu-for-nsapp -> Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-windows-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:deny-set-checked -> Denies the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-checked"
+ ]
+ },
+ {
+ "description": "menu:deny-set-enabled -> Denies the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-enabled"
+ ]
+ },
+ {
+ "description": "menu:deny-set-icon -> Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-icon"
+ ]
+ },
+ {
+ "description": "menu:deny-set-text -> Denies the set_text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-text"
+ ]
+ },
+ {
+ "description": "menu:deny-text -> Denies the text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-text"
+ ]
+ },
+ {
+ "description": "notification:default -> Allows requesting permission, checking permission state and sending notifications",
+ "type": "string",
+ "enum": [
+ "notification:default"
+ ]
+ },
+ {
+ "description": "notification:allow-is-permission-granted -> Enables the is_permission_granted command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-is-permission-granted"
+ ]
+ },
+ {
+ "description": "notification:allow-notify -> Enables the notify command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-notify"
+ ]
+ },
+ {
+ "description": "notification:allow-request-permission -> Enables the request_permission command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-request-permission"
+ ]
+ },
+ {
+ "description": "notification:deny-is-permission-granted -> Denies the is_permission_granted command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-is-permission-granted"
+ ]
+ },
+ {
+ "description": "notification:deny-notify -> Denies the notify command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-notify"
+ ]
+ },
+ {
+ "description": "notification:deny-request-permission -> Denies the request_permission command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-request-permission"
+ ]
+ },
+ {
+ "type": "string",
+ "enum": [
+ "os:default"
+ ]
+ },
+ {
+ "description": "os:allow-arch -> Enables the arch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:allow-arch"
+ ]
+ },
+ {
+ "description": "os:allow-exe-extension -> Enables the exe_extension command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:allow-exe-extension"
+ ]
+ },
+ {
+ "description": "os:allow-family -> Enables the family command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:allow-family"
+ ]
+ },
+ {
+ "description": "os:allow-hostname -> Enables the hostname command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:allow-hostname"
+ ]
+ },
+ {
+ "description": "os:allow-locale -> Enables the locale command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:allow-locale"
+ ]
+ },
+ {
+ "description": "os:allow-os-type -> Enables the os_type command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:allow-os-type"
+ ]
+ },
+ {
+ "description": "os:allow-platform -> Enables the platform command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:allow-platform"
+ ]
+ },
+ {
+ "description": "os:allow-version -> Enables the version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:allow-version"
+ ]
+ },
+ {
+ "description": "os:deny-arch -> Denies the arch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:deny-arch"
+ ]
+ },
+ {
+ "description": "os:deny-exe-extension -> Denies the exe_extension command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:deny-exe-extension"
+ ]
+ },
+ {
+ "description": "os:deny-family -> Denies the family command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:deny-family"
+ ]
+ },
+ {
+ "description": "os:deny-hostname -> Denies the hostname command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:deny-hostname"
+ ]
+ },
+ {
+ "description": "os:deny-locale -> Denies the locale command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:deny-locale"
+ ]
+ },
+ {
+ "description": "os:deny-os-type -> Denies the os_type command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:deny-os-type"
+ ]
+ },
+ {
+ "description": "os:deny-platform -> Denies the platform command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:deny-platform"
+ ]
+ },
+ {
+ "description": "os:deny-version -> Denies the version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "os:deny-version"
+ ]
+ },
+ {
+ "description": "path:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "path:default"
+ ]
+ },
+ {
+ "description": "path:allow-basename -> Enables the basename command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:allow-basename"
+ ]
+ },
+ {
+ "description": "path:allow-dirname -> Enables the dirname command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:allow-dirname"
+ ]
+ },
+ {
+ "description": "path:allow-extname -> Enables the extname command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:allow-extname"
+ ]
+ },
+ {
+ "description": "path:allow-is-absolute -> Enables the is_absolute command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:allow-is-absolute"
+ ]
+ },
+ {
+ "description": "path:allow-join -> Enables the join command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:allow-join"
+ ]
+ },
+ {
+ "description": "path:allow-normalize -> Enables the normalize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:allow-normalize"
+ ]
+ },
+ {
+ "description": "path:allow-resolve -> Enables the resolve command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:allow-resolve"
+ ]
+ },
+ {
+ "description": "path:allow-resolve-directory -> Enables the resolve_directory command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:allow-resolve-directory"
+ ]
+ },
+ {
+ "description": "path:deny-basename -> Denies the basename command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:deny-basename"
+ ]
+ },
+ {
+ "description": "path:deny-dirname -> Denies the dirname command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:deny-dirname"
+ ]
+ },
+ {
+ "description": "path:deny-extname -> Denies the extname command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:deny-extname"
+ ]
+ },
+ {
+ "description": "path:deny-is-absolute -> Denies the is_absolute command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:deny-is-absolute"
+ ]
+ },
+ {
+ "description": "path:deny-join -> Denies the join command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:deny-join"
+ ]
+ },
+ {
+ "description": "path:deny-normalize -> Denies the normalize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:deny-normalize"
+ ]
+ },
+ {
+ "description": "path:deny-resolve -> Denies the resolve command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:deny-resolve"
+ ]
+ },
+ {
+ "description": "path:deny-resolve-directory -> Denies the resolve_directory command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "path:deny-resolve-directory"
+ ]
+ },
+ {
+ "description": "resources:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "resources:default"
+ ]
+ },
+ {
+ "description": "resources:allow-close -> Enables the close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "resources:allow-close"
+ ]
+ },
+ {
+ "description": "resources:deny-close -> Denies the close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "resources:deny-close"
+ ]
+ },
+ {
+ "type": "string",
+ "enum": [
+ "shell:default"
+ ]
+ },
+ {
+ "description": "shell:allow-execute -> Enables the execute command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:allow-execute"
+ ]
+ },
+ {
+ "description": "shell:allow-kill -> Enables the kill command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:allow-kill"
+ ]
+ },
+ {
+ "description": "shell:allow-open -> Enables the open command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:allow-open"
+ ]
+ },
+ {
+ "description": "shell:allow-stdin-write -> Enables the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:allow-stdin-write"
+ ]
+ },
+ {
+ "description": "shell:deny-execute -> Denies the execute command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:deny-execute"
+ ]
+ },
+ {
+ "description": "shell:deny-kill -> Denies the kill command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:deny-kill"
+ ]
+ },
+ {
+ "description": "shell:deny-open -> Denies the open command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:deny-open"
+ ]
+ },
+ {
+ "description": "shell:deny-stdin-write -> Denies the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "shell:deny-stdin-write"
+ ]
+ },
+ {
+ "description": "tray:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "tray:default"
+ ]
+ },
+ {
+ "description": "tray:allow-get-by-id -> Enables the get_by_id command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-get-by-id"
+ ]
+ },
+ {
+ "description": "tray:allow-new -> Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-new"
+ ]
+ },
+ {
+ "description": "tray:allow-remove-by-id -> Enables the remove_by_id command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-remove-by-id"
+ ]
+ },
+ {
+ "description": "tray:allow-set-icon -> Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-set-icon"
+ ]
+ },
+ {
+ "description": "tray:allow-set-icon-as-template -> Enables the set_icon_as_template command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-set-icon-as-template"
+ ]
+ },
+ {
+ "description": "tray:allow-set-menu -> Enables the set_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-set-menu"
+ ]
+ },
+ {
+ "description": "tray:allow-set-show-menu-on-left-click -> Enables the set_show_menu_on_left_click command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-set-show-menu-on-left-click"
+ ]
+ },
+ {
+ "description": "tray:allow-set-temp-dir-path -> Enables the set_temp_dir_path command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-set-temp-dir-path"
+ ]
+ },
+ {
+ "description": "tray:allow-set-title -> Enables the set_title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-set-title"
+ ]
+ },
+ {
+ "description": "tray:allow-set-tooltip -> Enables the set_tooltip command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-set-tooltip"
+ ]
+ },
+ {
+ "description": "tray:allow-set-visible -> Enables the set_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-set-visible"
+ ]
+ },
+ {
+ "description": "tray:deny-get-by-id -> Denies the get_by_id command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-get-by-id"
+ ]
+ },
+ {
+ "description": "tray:deny-new -> Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-new"
+ ]
+ },
+ {
+ "description": "tray:deny-remove-by-id -> Denies the remove_by_id command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-remove-by-id"
+ ]
+ },
+ {
+ "description": "tray:deny-set-icon -> Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-set-icon"
+ ]
+ },
+ {
+ "description": "tray:deny-set-icon-as-template -> Denies the set_icon_as_template command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-set-icon-as-template"
+ ]
+ },
+ {
+ "description": "tray:deny-set-menu -> Denies the set_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-set-menu"
+ ]
+ },
+ {
+ "description": "tray:deny-set-show-menu-on-left-click -> Denies the set_show_menu_on_left_click command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-set-show-menu-on-left-click"
+ ]
+ },
+ {
+ "description": "tray:deny-set-temp-dir-path -> Denies the set_temp_dir_path command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-set-temp-dir-path"
+ ]
+ },
+ {
+ "description": "tray:deny-set-title -> Denies the set_title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-set-title"
+ ]
+ },
+ {
+ "description": "tray:deny-set-tooltip -> Denies the set_tooltip command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-set-tooltip"
+ ]
+ },
+ {
+ "description": "tray:deny-set-visible -> Denies the set_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-set-visible"
+ ]
+ },
+ {
+ "description": "webview:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "webview:default"
+ ]
+ },
+ {
+ "description": "webview:allow-create-webview -> Enables the create_webview command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-create-webview"
+ ]
+ },
+ {
+ "description": "webview:allow-create-webview-window -> Enables the create_webview_window command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-create-webview-window"
+ ]
+ },
+ {
+ "description": "webview:allow-internal-toggle-devtools -> Enables the internal_toggle_devtools command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-internal-toggle-devtools"
+ ]
+ },
+ {
+ "description": "webview:allow-print -> Enables the print command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-print"
+ ]
+ },
+ {
+ "description": "webview:allow-reparent -> Enables the reparent command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-reparent"
+ ]
+ },
+ {
+ "description": "webview:allow-set-webview-focus -> Enables the set_webview_focus command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-set-webview-focus"
+ ]
+ },
+ {
+ "description": "webview:allow-set-webview-position -> Enables the set_webview_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-set-webview-position"
+ ]
+ },
+ {
+ "description": "webview:allow-set-webview-size -> Enables the set_webview_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-set-webview-size"
+ ]
+ },
+ {
+ "description": "webview:allow-set-webview-zoom -> Enables the set_webview_zoom command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-set-webview-zoom"
+ ]
+ },
+ {
+ "description": "webview:allow-webview-close -> Enables the webview_close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-webview-close"
+ ]
+ },
+ {
+ "description": "webview:allow-webview-position -> Enables the webview_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-webview-position"
+ ]
+ },
+ {
+ "description": "webview:allow-webview-size -> Enables the webview_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:allow-webview-size"
+ ]
+ },
+ {
+ "description": "webview:deny-create-webview -> Denies the create_webview command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-create-webview"
+ ]
+ },
+ {
+ "description": "webview:deny-create-webview-window -> Denies the create_webview_window command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-create-webview-window"
+ ]
+ },
+ {
+ "description": "webview:deny-internal-toggle-devtools -> Denies the internal_toggle_devtools command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-internal-toggle-devtools"
+ ]
+ },
+ {
+ "description": "webview:deny-print -> Denies the print command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-print"
+ ]
+ },
+ {
+ "description": "webview:deny-reparent -> Denies the reparent command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-reparent"
+ ]
+ },
+ {
+ "description": "webview:deny-set-webview-focus -> Denies the set_webview_focus command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-set-webview-focus"
+ ]
+ },
+ {
+ "description": "webview:deny-set-webview-position -> Denies the set_webview_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-set-webview-position"
+ ]
+ },
+ {
+ "description": "webview:deny-set-webview-size -> Denies the set_webview_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-set-webview-size"
+ ]
+ },
+ {
+ "description": "webview:deny-set-webview-zoom -> Denies the set_webview_zoom command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-set-webview-zoom"
+ ]
+ },
+ {
+ "description": "webview:deny-webview-close -> Denies the webview_close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-close"
+ ]
+ },
+ {
+ "description": "webview:deny-webview-position -> Denies the webview_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-position"
+ ]
+ },
+ {
+ "description": "webview:deny-webview-size -> Denies the webview_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-size"
+ ]
+ },
+ {
+ "description": "window:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "window:default"
+ ]
+ },
+ {
+ "description": "window:allow-available-monitors -> Enables the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-available-monitors"
+ ]
+ },
+ {
+ "description": "window:allow-center -> Enables the center command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-center"
+ ]
+ },
+ {
+ "description": "window:allow-close -> Enables the close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-close"
+ ]
+ },
+ {
+ "description": "window:allow-create -> Enables the create command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-create"
+ ]
+ },
+ {
+ "description": "window:allow-current-monitor -> Enables the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-current-monitor"
+ ]
+ },
+ {
+ "description": "window:allow-destroy -> Enables the destroy command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-destroy"
+ ]
+ },
+ {
+ "description": "window:allow-hide -> Enables the hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-hide"
+ ]
+ },
+ {
+ "description": "window:allow-inner-position -> Enables the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-inner-position"
+ ]
+ },
+ {
+ "description": "window:allow-inner-size -> Enables the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-inner-size"
+ ]
+ },
+ {
+ "description": "window:allow-internal-toggle-maximize -> Enables the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-internal-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-is-closable -> Enables the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-closable"
+ ]
+ },
+ {
+ "description": "window:allow-is-decorated -> Enables the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-decorated"
+ ]
+ },
+ {
+ "description": "window:allow-is-focused -> Enables the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-focused"
+ ]
+ },
+ {
+ "description": "window:allow-is-fullscreen -> Enables the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-fullscreen"
+ ]
+ },
+ {
+ "description": "window:allow-is-maximizable -> Enables the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-maximizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-maximized -> Enables the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-maximized"
+ ]
+ },
+ {
+ "description": "window:allow-is-minimizable -> Enables the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-minimizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-minimized -> Enables the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-minimized"
+ ]
+ },
+ {
+ "description": "window:allow-is-resizable -> Enables the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-resizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-visible -> Enables the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-visible"
+ ]
+ },
+ {
+ "description": "window:allow-maximize -> Enables the maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-minimize -> Enables the minimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-minimize"
+ ]
+ },
+ {
+ "description": "window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-outer-position"
+ ]
+ },
+ {
+ "description": "window:allow-outer-size -> Enables the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-outer-size"
+ ]
+ },
+ {
+ "description": "window:allow-primary-monitor -> Enables the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-primary-monitor"
+ ]
+ },
+ {
+ "description": "window:allow-request-user-attention -> Enables the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-request-user-attention"
+ ]
+ },
+ {
+ "description": "window:allow-scale-factor -> Enables the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-scale-factor"
+ ]
+ },
+ {
+ "description": "window:allow-set-always-on-bottom -> Enables the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-always-on-bottom"
+ ]
+ },
+ {
+ "description": "window:allow-set-always-on-top -> Enables the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-always-on-top"
+ ]
+ },
+ {
+ "description": "window:allow-set-closable -> Enables the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-closable"
+ ]
+ },
+ {
+ "description": "window:allow-set-content-protected -> Enables the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-content-protected"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-grab -> Enables the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-grab"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-icon -> Enables the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-icon"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-position -> Enables the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-position"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-visible -> Enables the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-visible"
+ ]
+ },
+ {
+ "description": "window:allow-set-decorations -> Enables the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-decorations"
+ ]
+ },
+ {
+ "description": "window:allow-set-effects -> Enables the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-effects"
+ ]
+ },
+ {
+ "description": "window:allow-set-focus -> Enables the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-focus"
+ ]
+ },
+ {
+ "description": "window:allow-set-fullscreen -> Enables the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-fullscreen"
+ ]
+ },
+ {
+ "description": "window:allow-set-icon -> Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-icon"
+ ]
+ },
+ {
+ "description": "window:allow-set-ignore-cursor-events -> Enables the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-ignore-cursor-events"
+ ]
+ },
+ {
+ "description": "window:allow-set-max-size -> Enables the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-max-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-maximizable -> Enables the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-maximizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-min-size -> Enables the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-min-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-minimizable -> Enables the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-minimizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-position -> Enables the set_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-position"
+ ]
+ },
+ {
+ "description": "window:allow-set-progress-bar -> Enables the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-progress-bar"
+ ]
+ },
+ {
+ "description": "window:allow-set-resizable -> Enables the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-resizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-shadow -> Enables the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-shadow"
+ ]
+ },
+ {
+ "description": "window:allow-set-size -> Enables the set_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-skip-taskbar -> Enables the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-skip-taskbar"
+ ]
+ },
+ {
+ "description": "window:allow-set-title -> Enables the set_title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-title"
+ ]
+ },
+ {
+ "description": "window:allow-set-visible-on-all-workspaces -> Enables the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-visible-on-all-workspaces"
+ ]
+ },
+ {
+ "description": "window:allow-show -> Enables the show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-show"
+ ]
+ },
+ {
+ "description": "window:allow-start-dragging -> Enables the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-start-dragging"
+ ]
+ },
+ {
+ "description": "window:allow-start-resize-dragging -> Enables the start_resize_dragging command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-start-resize-dragging"
+ ]
+ },
+ {
+ "description": "window:allow-theme -> Enables the theme command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-theme"
+ ]
+ },
+ {
+ "description": "window:allow-title -> Enables the title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-title"
+ ]
+ },
+ {
+ "description": "window:allow-toggle-maximize -> Enables the toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-unmaximize -> Enables the unmaximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-unmaximize"
+ ]
+ },
+ {
+ "description": "window:allow-unminimize -> Enables the unminimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-unminimize"
+ ]
+ },
+ {
+ "description": "window:deny-available-monitors -> Denies the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-available-monitors"
+ ]
+ },
+ {
+ "description": "window:deny-center -> Denies the center command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-center"
+ ]
+ },
+ {
+ "description": "window:deny-close -> Denies the close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-close"
+ ]
+ },
+ {
+ "description": "window:deny-create -> Denies the create command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-create"
+ ]
+ },
+ {
+ "description": "window:deny-current-monitor -> Denies the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-current-monitor"
+ ]
+ },
+ {
+ "description": "window:deny-destroy -> Denies the destroy command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-destroy"
+ ]
+ },
+ {
+ "description": "window:deny-hide -> Denies the hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-hide"
+ ]
+ },
+ {
+ "description": "window:deny-inner-position -> Denies the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-inner-position"
+ ]
+ },
+ {
+ "description": "window:deny-inner-size -> Denies the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-inner-size"
+ ]
+ },
+ {
+ "description": "window:deny-internal-toggle-maximize -> Denies the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-internal-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:deny-is-closable -> Denies the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-closable"
+ ]
+ },
+ {
+ "description": "window:deny-is-decorated -> Denies the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-decorated"
+ ]
+ },
+ {
+ "description": "window:deny-is-focused -> Denies the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-focused"
+ ]
+ },
+ {
+ "description": "window:deny-is-fullscreen -> Denies the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-fullscreen"
+ ]
+ },
+ {
+ "description": "window:deny-is-maximizable -> Denies the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-maximizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-maximized -> Denies the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-maximized"
+ ]
+ },
+ {
+ "description": "window:deny-is-minimizable -> Denies the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-minimizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-minimized -> Denies the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-minimized"
+ ]
+ },
+ {
+ "description": "window:deny-is-resizable -> Denies the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-resizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-visible -> Denies the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-visible"
+ ]
+ },
+ {
+ "description": "window:deny-maximize -> Denies the maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-maximize"
+ ]
+ },
+ {
+ "description": "window:deny-minimize -> Denies the minimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-minimize"
+ ]
+ },
+ {
+ "description": "window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-outer-position"
+ ]
+ },
+ {
+ "description": "window:deny-outer-size -> Denies the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-outer-size"
+ ]
+ },
+ {
+ "description": "window:deny-primary-monitor -> Denies the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-primary-monitor"
+ ]
+ },
+ {
+ "description": "window:deny-request-user-attention -> Denies the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-request-user-attention"
+ ]
+ },
+ {
+ "description": "window:deny-scale-factor -> Denies the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-scale-factor"
+ ]
+ },
+ {
+ "description": "window:deny-set-always-on-bottom -> Denies the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-always-on-bottom"
+ ]
+ },
+ {
+ "description": "window:deny-set-always-on-top -> Denies the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-always-on-top"
+ ]
+ },
+ {
+ "description": "window:deny-set-closable -> Denies the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-closable"
+ ]
+ },
+ {
+ "description": "window:deny-set-content-protected -> Denies the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-content-protected"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-grab -> Denies the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-grab"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-icon -> Denies the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-icon"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-position -> Denies the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-position"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-visible -> Denies the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-visible"
+ ]
+ },
+ {
+ "description": "window:deny-set-decorations -> Denies the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-decorations"
+ ]
+ },
+ {
+ "description": "window:deny-set-effects -> Denies the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-effects"
+ ]
+ },
+ {
+ "description": "window:deny-set-focus -> Denies the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-focus"
+ ]
+ },
+ {
+ "description": "window:deny-set-fullscreen -> Denies the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-fullscreen"
+ ]
+ },
+ {
+ "description": "window:deny-set-icon -> Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-icon"
+ ]
+ },
+ {
+ "description": "window:deny-set-ignore-cursor-events -> Denies the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-ignore-cursor-events"
+ ]
+ },
+ {
+ "description": "window:deny-set-max-size -> Denies the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-max-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-maximizable -> Denies the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-maximizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-min-size -> Denies the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-min-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-minimizable -> Denies the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-minimizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-position -> Denies the set_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-position"
+ ]
+ },
+ {
+ "description": "window:deny-set-progress-bar -> Denies the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-progress-bar"
+ ]
+ },
+ {
+ "description": "window:deny-set-resizable -> Denies the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-resizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-shadow -> Denies the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-shadow"
+ ]
+ },
+ {
+ "description": "window:deny-set-size -> Denies the set_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-skip-taskbar -> Denies the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-skip-taskbar"
+ ]
+ },
+ {
+ "description": "window:deny-set-title -> Denies the set_title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-title"
+ ]
+ },
+ {
+ "description": "window:deny-set-visible-on-all-workspaces -> Denies the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-visible-on-all-workspaces"
+ ]
+ },
+ {
+ "description": "window:deny-show -> Denies the show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-show"
+ ]
+ },
+ {
+ "description": "window:deny-start-dragging -> Denies the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-start-dragging"
+ ]
+ },
+ {
+ "description": "window:deny-start-resize-dragging -> Denies the start_resize_dragging command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-start-resize-dragging"
+ ]
+ },
+ {
+ "description": "window:deny-theme -> Denies the theme command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-theme"
+ ]
+ },
+ {
+ "description": "window:deny-title -> Denies the title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-title"
+ ]
+ },
+ {
+ "description": "window:deny-toggle-maximize -> Denies the toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:deny-unmaximize -> Denies the unmaximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-unmaximize"
+ ]
+ },
+ {
+ "description": "window:deny-unminimize -> Denies the unminimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-unminimize"
+ ]
+ }
+ ]
+ },
+ "Value": {
+ "description": "All supported ACL values.",
+ "anyOf": [
+ {
+ "description": "Represents a null JSON value.",
+ "type": "null"
+ },
+ {
+ "description": "Represents a [`bool`].",
+ "type": "boolean"
+ },
+ {
+ "description": "Represents a valid ACL [`Number`].",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Number"
+ }
+ ]
+ },
+ {
+ "description": "Represents a [`String`].",
+ "type": "string"
+ },
+ {
+ "description": "Represents a list of other [`Value`]s.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Value"
+ }
+ },
+ {
+ "description": "Represents a map of [`String`] keys to [`Value`]s.",
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/definitions/Value"
+ }
+ }
+ ]
+ },
+ "Number": {
+ "description": "A valid ACL number.",
+ "anyOf": [
+ {
+ "description": "Represents an [`i64`].",
+ "type": "integer",
+ "format": "int64"
+ },
+ {
+ "description": "Represents a [`f64`].",
+ "type": "number",
+ "format": "double"
+ }
+ ]
+ },
+ "Target": {
+ "description": "Platform target.",
+ "oneOf": [
+ {
+ "description": "MacOS.",
+ "type": "string",
+ "enum": [
+ "macOS"
+ ]
+ },
+ {
+ "description": "Windows.",
+ "type": "string",
+ "enum": [
+ "windows"
+ ]
+ },
+ {
+ "description": "Linux.",
+ "type": "string",
+ "enum": [
+ "linux"
+ ]
+ },
+ {
+ "description": "Android.",
+ "type": "string",
+ "enum": [
+ "android"
+ ]
+ },
+ {
+ "description": "iOS.",
+ "type": "string",
+ "enum": [
+ "iOS"
+ ]
+ }
+ ]
+ },
+ "ShellAllowedArg": {
+ "description": "A command argument allowed to be executed by the webview API.",
+ "anyOf": [
+ {
+ "description": "A non-configurable argument that is passed to the command in the order it was specified.",
+ "type": "string"
+ },
+ {
+ "description": "A variable that is set while calling the command from the webview API.",
+ "type": "object",
+ "required": [
+ "validator"
+ ],
+ "properties": {
+ "validator": {
+ "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\n[regex]: https://docs.rs/regex/latest/regex/#syntax",
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ },
+ "ShellAllowedArgs": {
+ "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.",
+ "anyOf": [
+ {
+ "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.",
+ "type": "boolean"
+ },
+ {
+ "description": "A specific set of [`ShellAllowedArg`] that are valid to call for the command configuration.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ShellAllowedArg"
+ }
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/desktop/tauri/src-tauri/tauri.conf.json b/desktop/tauri/src-tauri/tauri.conf.json
index d695aae1..2647f36b 100644
--- a/desktop/tauri/src-tauri/tauri.conf.json
+++ b/desktop/tauri/src-tauri/tauri.conf.json
@@ -73,13 +73,27 @@
"postRemoveScript": "../../../packaging/linux/postrm"
}
},
+ "windows": {
+ "nsis": {
+ "installMode": "perMachine",
+ "template": "templates/installer.nsi"
+ },
+ "wix": {
+ "fragmentPaths": [
+ "templates/service.wxs"
+ ],
+ "template": "templates/main.wxs"
+ }
+ },
"externalBin": [
"binaries/portmaster-start",
"binaries/portmaster-core"
],
"targets": [
"deb",
- "rpm"
+ "rpm",
+ "nsis",
+ "msi"
],
"icon": [
"../assets/icons/pm_dark_512.png",
diff --git a/desktop/tauri/src-tauri/templates/installer.nsi b/desktop/tauri/src-tauri/templates/installer.nsi
new file mode 100644
index 00000000..3f6fc80c
--- /dev/null
+++ b/desktop/tauri/src-tauri/templates/installer.nsi
@@ -0,0 +1,804 @@
+Unicode true
+ManifestDPIAware true
+; Set the compression algorithm. Default is LZMA.
+!if "{{compression}}" == ""
+ SetCompressor /SOLID lzma
+!else
+ SetCompressor /SOLID "{{compression}}"
+!endif
+
+!include MUI2.nsh
+!include FileFunc.nsh
+!include x64.nsh
+!include WordFunc.nsh
+!include "FileAssociation.nsh"
+!include "StrFunc.nsh"
+!include "Win\COM.nsh"
+!include "Win\Propkey.nsh"
+${StrCase}
+${StrLoc}
+
+!define MANUFACTURER "{{manufacturer}}"
+!define PRODUCTNAME "{{product_name}}"
+!define VERSION "{{version}}"
+!define VERSIONWITHBUILD "{{version_with_build}}"
+!define SHORTDESCRIPTION "{{short_description}}"
+!define INSTALLMODE "{{install_mode}}"
+!define LICENSE "{{license}}"
+!define INSTALLERICON "{{installer_icon}}"
+!define SIDEBARIMAGE "{{sidebar_image}}"
+!define HEADERIMAGE "{{header_image}}"
+!define MAINBINARYNAME "{{main_binary_name}}"
+!define MAINBINARYSRCPATH "{{main_binary_path}}"
+!define BUNDLEID "{{bundle_id}}"
+!define COPYRIGHT "{{copyright}}"
+!define OUTFILE "{{out_file}}"
+!define ARCH "{{arch}}"
+!define PLUGINSPATH "{{additional_plugins_path}}"
+!define ALLOWDOWNGRADES "{{allow_downgrades}}"
+!define DISPLAYLANGUAGESELECTOR "{{display_language_selector}}"
+!define INSTALLWEBVIEW2MODE "{{install_webview2_mode}}"
+!define WEBVIEW2INSTALLERARGS "{{webview2_installer_args}}"
+!define WEBVIEW2BOOTSTRAPPERPATH "{{webview2_bootstrapper_path}}"
+!define WEBVIEW2INSTALLERPATH "{{webview2_installer_path}}"
+!define UNINSTKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}"
+!define MANUPRODUCTKEY "Software\${MANUFACTURER}\${PRODUCTNAME}"
+!define UNINSTALLERSIGNCOMMAND "{{uninstaller_sign_cmd}}"
+!define ESTIMATEDSIZE "{{estimated_size}}"
+
+Name "${PRODUCTNAME}"
+BrandingText "${COPYRIGHT}"
+OutFile "${OUTFILE}"
+
+; We don't actually use this value as default install path,
+; it's just for nsis to append the product name folder in the directory selector
+; https://nsis.sourceforge.io/Reference/InstallDir
+!define PLACEHOLDER_INSTALL_DIR "placeholder\${PRODUCTNAME}"
+InstallDir "${PLACEHOLDER_INSTALL_DIR}"
+
+VIProductVersion "${VERSIONWITHBUILD}"
+VIAddVersionKey "ProductName" "${PRODUCTNAME}"
+VIAddVersionKey "FileDescription" "${SHORTDESCRIPTION}"
+VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
+VIAddVersionKey "FileVersion" "${VERSION}"
+VIAddVersionKey "ProductVersion" "${VERSION}"
+
+; Plugins path, currently exists for linux only
+!if "${PLUGINSPATH}" != ""
+ !addplugindir "${PLUGINSPATH}"
+!endif
+
+!if "${UNINSTALLERSIGNCOMMAND}" != ""
+ !uninstfinalize '${UNINSTALLERSIGNCOMMAND}'
+!endif
+
+; Handle install mode, `perUser`, `perMachine` or `both`
+!if "${INSTALLMODE}" == "perMachine"
+ RequestExecutionLevel highest
+!endif
+
+!if "${INSTALLMODE}" == "currentUser"
+ RequestExecutionLevel user
+!endif
+
+!if "${INSTALLMODE}" == "both"
+ !define MULTIUSER_MUI
+ !define MULTIUSER_INSTALLMODE_INSTDIR "${PRODUCTNAME}"
+ !define MULTIUSER_INSTALLMODE_COMMANDLINE
+ !if "${ARCH}" == "x64"
+ !define MULTIUSER_USE_PROGRAMFILES64
+ !else if "${ARCH}" == "arm64"
+ !define MULTIUSER_USE_PROGRAMFILES64
+ !endif
+ !define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY "${UNINSTKEY}"
+ !define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME "CurrentUser"
+ !define MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAME
+ !define MULTIUSER_INSTALLMODE_FUNCTION RestorePreviousInstallLocation
+ !define MULTIUSER_EXECUTIONLEVEL Highest
+ !include MultiUser.nsh
+!endif
+
+; installer icon
+!if "${INSTALLERICON}" != ""
+ !define MUI_ICON "${INSTALLERICON}"
+!endif
+
+; installer sidebar image
+!if "${SIDEBARIMAGE}" != ""
+ !define MUI_WELCOMEFINISHPAGE_BITMAP "${SIDEBARIMAGE}"
+!endif
+
+; installer header image
+!if "${HEADERIMAGE}" != ""
+ !define MUI_HEADERIMAGE
+ !define MUI_HEADERIMAGE_BITMAP "${HEADERIMAGE}"
+!endif
+
+; Define registry key to store installer language
+!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
+!define MUI_LANGDLL_REGISTRY_KEY "${MANUPRODUCTKEY}"
+!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
+
+; Installer pages, must be ordered as they appear
+; 1. Welcome Page
+!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+!insertmacro MUI_PAGE_WELCOME
+
+; 2. License Page (if defined)
+!if "${LICENSE}" != ""
+ !define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+ !insertmacro MUI_PAGE_LICENSE "${LICENSE}"
+!endif
+
+; 3. Install mode (if it is set to `both`)
+!if "${INSTALLMODE}" == "both"
+ !define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+ !insertmacro MULTIUSER_PAGE_INSTALLMODE
+!endif
+
+
+; 4. Custom page to ask user if he wants to reinstall/uninstall
+; only if a previous installation was detected
+Var ReinstallPageCheck
+Page custom PageReinstall PageLeaveReinstall
+Function PageReinstall
+ ; Uninstall previous WiX installation if exists.
+ ;
+ ; A WiX installer stores the installation info in registry
+ ; using a UUID and so we have to loop through all keys under
+ ; `HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall`
+ ; and check if `DisplayName` and `Publisher` keys match ${PRODUCTNAME} and ${MANUFACTURER}
+ ;
+ ; This has a potential issue that there maybe another installation that matches
+ ; our ${PRODUCTNAME} and ${MANUFACTURER} but wasn't installed by our WiX installer,
+ ; however, this should be fine since the user will have to confirm the uninstallation
+ ; and they can chose to abort it if doesn't make sense.
+ StrCpy $0 0
+ wix_loop:
+ EnumRegKey $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" $0
+ StrCmp $1 "" wix_done ; Exit loop if there is no more keys to loop on
+ IntOp $0 $0 + 1
+ ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "DisplayName"
+ ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "Publisher"
+ StrCmp "$R0$R1" "${PRODUCTNAME}${MANUFACTURER}" 0 wix_loop
+ ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "UninstallString"
+ ${StrCase} $R1 $R0 "L"
+ ${StrLoc} $R0 $R1 "msiexec" ">"
+ StrCmp $R0 0 0 wix_done
+ StrCpy $R7 "wix"
+ StrCpy $R6 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1"
+ Goto compare_version
+ wix_done:
+
+ ; Check if there is an existing installation, if not, abort the reinstall page
+ ReadRegStr $R0 SHCTX "${UNINSTKEY}" ""
+ ReadRegStr $R1 SHCTX "${UNINSTKEY}" "UninstallString"
+ ${IfThen} "$R0$R1" == "" ${|} Abort ${|}
+
+ ; Compare this installar version with the existing installation
+ ; and modify the messages presented to the user accordingly
+ compare_version:
+ StrCpy $R4 "$(older)"
+ ${If} $R7 == "wix"
+ ReadRegStr $R0 HKLM "$R6" "DisplayVersion"
+ ${Else}
+ ReadRegStr $R0 SHCTX "${UNINSTKEY}" "DisplayVersion"
+ ${EndIf}
+ ${IfThen} $R0 == "" ${|} StrCpy $R4 "$(unknown)" ${|}
+
+ nsis_tauri_utils::SemverCompare "${VERSION}" $R0
+ Pop $R0
+ ; Reinstalling the same version
+ ${If} $R0 == 0
+ StrCpy $R1 "$(alreadyInstalledLong)"
+ StrCpy $R2 "$(addOrReinstall)"
+ StrCpy $R3 "$(uninstallApp)"
+ !insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(chooseMaintenanceOption)"
+ StrCpy $R5 "2"
+ ; Upgrading
+ ${ElseIf} $R0 == 1
+ StrCpy $R1 "$(olderOrUnknownVersionInstalled)"
+ StrCpy $R2 "$(uninstallBeforeInstalling)"
+ StrCpy $R3 "$(dontUninstall)"
+ !insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(choowHowToInstall)"
+ StrCpy $R5 "1"
+ ; Downgrading
+ ${ElseIf} $R0 == -1
+ StrCpy $R1 "$(newerVersionInstalled)"
+ StrCpy $R2 "$(uninstallBeforeInstalling)"
+ !if "${ALLOWDOWNGRADES}" == "true"
+ StrCpy $R3 "$(dontUninstall)"
+ !else
+ StrCpy $R3 "$(dontUninstallDowngrade)"
+ !endif
+ !insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(choowHowToInstall)"
+ StrCpy $R5 "1"
+ ${Else}
+ Abort
+ ${EndIf}
+
+ Call SkipIfPassive
+
+ nsDialogs::Create 1018
+ Pop $R4
+ ${IfThen} $(^RTL) == 1 ${|} nsDialogs::SetRTL $(^RTL) ${|}
+
+ ${NSD_CreateLabel} 0 0 100% 24u $R1
+ Pop $R1
+
+ ${NSD_CreateRadioButton} 30u 50u -30u 8u $R2
+ Pop $R2
+ ${NSD_OnClick} $R2 PageReinstallUpdateSelection
+
+ ${NSD_CreateRadioButton} 30u 70u -30u 8u $R3
+ Pop $R3
+ ; disable this radio button if downgrading and downgrades are disabled
+ !if "${ALLOWDOWNGRADES}" == "false"
+ ${IfThen} $R0 == -1 ${|} EnableWindow $R3 0 ${|}
+ !endif
+ ${NSD_OnClick} $R3 PageReinstallUpdateSelection
+
+ ; Check the first radio button if this the first time
+ ; we enter this page or if the second button wasn't
+ ; selected the last time we were on this page
+ ${If} $ReinstallPageCheck != 2
+ SendMessage $R2 ${BM_SETCHECK} ${BST_CHECKED} 0
+ ${Else}
+ SendMessage $R3 ${BM_SETCHECK} ${BST_CHECKED} 0
+ ${EndIf}
+
+ ${NSD_SetFocus} $R2
+ nsDialogs::Show
+FunctionEnd
+Function PageReinstallUpdateSelection
+ ${NSD_GetState} $R2 $R1
+ ${If} $R1 == ${BST_CHECKED}
+ StrCpy $ReinstallPageCheck 1
+ ${Else}
+ StrCpy $ReinstallPageCheck 2
+ ${EndIf}
+FunctionEnd
+Function PageLeaveReinstall
+ ${NSD_GetState} $R2 $R1
+
+ ; $R5 holds whether we are reinstalling the same version or not
+ ; $R5 == "1" -> different versions
+ ; $R5 == "2" -> same version
+ ;
+ ; $R1 holds the radio buttons state. its meaning is dependent on the context
+ StrCmp $R5 "1" 0 +2 ; Existing install is not the same version?
+ StrCmp $R1 "1" reinst_uninstall reinst_done ; $R1 == "1", then user chose to uninstall existing version, otherwise skip uninstalling
+ StrCmp $R1 "1" reinst_done ; Same version? skip uninstalling
+
+ reinst_uninstall:
+ HideWindow
+ ClearErrors
+
+ ${If} $R7 == "wix"
+ ReadRegStr $R1 HKLM "$R6" "UninstallString"
+ ExecWait '$R1' $0
+ ${Else}
+ ReadRegStr $4 SHCTX "${MANUPRODUCTKEY}" ""
+ ReadRegStr $R1 SHCTX "${UNINSTKEY}" "UninstallString"
+ ExecWait '$R1 /P _?=$4' $0
+ ${EndIf}
+
+ BringToFront
+
+ ${IfThen} ${Errors} ${|} StrCpy $0 2 ${|} ; ExecWait failed, set fake exit code
+
+ ${If} $0 <> 0
+ ${OrIf} ${FileExists} "$INSTDIR\${MAINBINARYNAME}.exe"
+ ${If} $0 = 1 ; User aborted uninstaller?
+ StrCmp $R5 "2" 0 +2 ; Is the existing install the same version?
+ Quit ; ...yes, already installed, we are done
+ Abort
+ ${EndIf}
+ MessageBox MB_ICONEXCLAMATION "$(unableToUninstall)"
+ Abort
+ ${Else}
+ StrCpy $0 $R1 1
+ ${IfThen} $0 == '"' ${|} StrCpy $R1 $R1 -1 1 ${|} ; Strip quotes from UninstallString
+ Delete $R1
+ RMDir $INSTDIR
+ ${EndIf}
+ reinst_done:
+FunctionEnd
+
+; 5. Choose install directory page
+!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+!insertmacro MUI_PAGE_DIRECTORY
+
+; 6. Start menu shortcut page
+!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+Var AppStartMenuFolder
+!insertmacro MUI_PAGE_STARTMENU Application $AppStartMenuFolder
+
+; 7. Installation page
+!insertmacro MUI_PAGE_INSTFILES
+
+; 8. Finish page
+;
+; Don't auto jump to finish page after installation page,
+; because the installation page has useful info that can be used debug any issues with the installer.
+!define MUI_FINISHPAGE_NOAUTOCLOSE
+; Use show readme button in the finish page as a button create a desktop shortcut
+!define MUI_FINISHPAGE_SHOWREADME
+!define MUI_FINISHPAGE_SHOWREADME_TEXT "$(createDesktop)"
+!define MUI_FINISHPAGE_SHOWREADME_FUNCTION CreateDesktopShortcut
+; Show run app after installation.
+!define MUI_FINISHPAGE_RUN "$INSTDIR\${MAINBINARYNAME}.exe"
+!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller Pages
+; 1. Confirm uninstall page
+Var DeleteAppDataCheckbox
+Var DeleteAppDataCheckboxState
+!define /ifndef WS_EX_LAYOUTRTL 0x00400000
+!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.ConfirmShow
+Function un.ConfirmShow
+ FindWindow $1 "#32770" "" $HWNDPARENT ; Find inner dialog
+ ${If} $(^RTL) == 1
+ System::Call 'USER32::CreateWindowEx(i${__NSD_CheckBox_EXSTYLE}|${WS_EX_LAYOUTRTL},t"${__NSD_CheckBox_CLASS}",t "$(deleteAppData)",i${__NSD_CheckBox_STYLE},i 50,i 100,i 400, i 25,i$1,i0,i0,i0)i.s'
+ ${Else}
+ System::Call 'USER32::CreateWindowEx(i${__NSD_CheckBox_EXSTYLE},t"${__NSD_CheckBox_CLASS}",t "$(deleteAppData)",i${__NSD_CheckBox_STYLE},i 0,i 100,i 400, i 25,i$1,i0,i0,i0)i.s'
+ ${EndIf}
+ Pop $DeleteAppDataCheckbox
+ SendMessage $HWNDPARENT ${WM_GETFONT} 0 0 $1
+ SendMessage $DeleteAppDataCheckbox ${WM_SETFONT} $1 1
+FunctionEnd
+!define MUI_PAGE_CUSTOMFUNCTION_LEAVE un.ConfirmLeave
+Function un.ConfirmLeave
+ SendMessage $DeleteAppDataCheckbox ${BM_GETCHECK} 0 0 $DeleteAppDataCheckboxState
+FunctionEnd
+!insertmacro MUI_UNPAGE_CONFIRM
+
+; 2. Uninstalling Page
+!insertmacro MUI_UNPAGE_INSTFILES
+
+;Languages
+{{#each languages}}
+!insertmacro MUI_LANGUAGE "{{this}}"
+{{/each}}
+!insertmacro MUI_RESERVEFILE_LANGDLL
+{{#each language_files}}
+ !include "{{this}}"
+{{/each}}
+
+!macro SetContext
+ !if "${INSTALLMODE}" == "currentUser"
+ SetShellVarContext current
+ !else if "${INSTALLMODE}" == "perMachine"
+ SetShellVarContext all
+ !endif
+
+ ${If} ${RunningX64}
+ !if "${ARCH}" == "x64"
+ SetRegView 64
+ !else if "${ARCH}" == "arm64"
+ SetRegView 64
+ !else
+ SetRegView 32
+ !endif
+ ${EndIf}
+!macroend
+
+Var PassiveMode
+Function .onInit
+ ${GetOptions} $CMDLINE "/P" $PassiveMode
+ IfErrors +2 0
+ StrCpy $PassiveMode 1
+
+ !if "${DISPLAYLANGUAGESELECTOR}" == "true"
+ !insertmacro MUI_LANGDLL_DISPLAY
+ !endif
+
+ !insertmacro SetContext
+
+ ${If} $INSTDIR == "${PLACEHOLDER_INSTALL_DIR}"
+ ; Set default install location
+ !if "${INSTALLMODE}" == "perMachine"
+ ${If} ${RunningX64}
+ !if "${ARCH}" == "x64"
+ StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCTNAME}"
+ !else if "${ARCH}" == "arm64"
+ StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCTNAME}"
+ !else
+ StrCpy $INSTDIR "$PROGRAMFILES\${PRODUCTNAME}"
+ !endif
+ ${Else}
+ StrCpy $INSTDIR "$PROGRAMFILES\${PRODUCTNAME}"
+ ${EndIf}
+ !else if "${INSTALLMODE}" == "currentUser"
+ StrCpy $INSTDIR "$LOCALAPPDATA\${PRODUCTNAME}"
+ !endif
+
+ Call RestorePreviousInstallLocation
+ ${EndIf}
+
+
+ !if "${INSTALLMODE}" == "both"
+ !insertmacro MULTIUSER_INIT
+ !endif
+FunctionEnd
+
+
+Section EarlyChecks
+ ; Abort silent installer if downgrades is disabled
+ !if "${ALLOWDOWNGRADES}" == "false"
+ IfSilent 0 silent_downgrades_done
+ ; If downgrading
+ ${If} $R0 == -1
+ System::Call 'kernel32::AttachConsole(i -1)i.r0'
+ ${If} $0 != 0
+ System::Call 'kernel32::GetStdHandle(i -11)i.r0'
+ System::call 'kernel32::SetConsoleTextAttribute(i r0, i 0x0004)' ; set red color
+ FileWrite $0 "$(silentDowngrades)"
+ ${EndIf}
+ Abort
+ ${EndIf}
+ silent_downgrades_done:
+ !endif
+
+SectionEnd
+
+Section WebView2
+ ; Check if Webview2 is already installed and skip this section
+ ${If} ${RunningX64}
+ ReadRegStr $4 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
+ ${Else}
+ ReadRegStr $4 HKLM "SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
+ ${EndIf}
+ ReadRegStr $5 HKCU "SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
+
+ StrCmp $4 "" 0 webview2_done
+ StrCmp $5 "" 0 webview2_done
+
+ ; Webview2 install modes
+ !if "${INSTALLWEBVIEW2MODE}" == "downloadBootstrapper"
+ Delete "$TEMP\MicrosoftEdgeWebview2Setup.exe"
+ DetailPrint "$(webview2Downloading)"
+ nsis_tauri_utils::download "https://go.microsoft.com/fwlink/p/?LinkId=2124703" "$TEMP\MicrosoftEdgeWebview2Setup.exe"
+ Pop $0
+ ${If} $0 == 0
+ DetailPrint "$(webview2DownloadSuccess)"
+ ${Else}
+ DetailPrint "$(webview2DownloadError)"
+ Abort "$(webview2AbortError)"
+ ${EndIf}
+ StrCpy $6 "$TEMP\MicrosoftEdgeWebview2Setup.exe"
+ Goto install_webview2
+ !endif
+
+ !if "${INSTALLWEBVIEW2MODE}" == "embedBootstrapper"
+ Delete "$TEMP\MicrosoftEdgeWebview2Setup.exe"
+ File "/oname=$TEMP\MicrosoftEdgeWebview2Setup.exe" "${WEBVIEW2BOOTSTRAPPERPATH}"
+ DetailPrint "$(installingWebview2)"
+ StrCpy $6 "$TEMP\MicrosoftEdgeWebview2Setup.exe"
+ Goto install_webview2
+ !endif
+
+ !if "${INSTALLWEBVIEW2MODE}" == "offlineInstaller"
+ Delete "$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe"
+ File "/oname=$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe" "${WEBVIEW2INSTALLERPATH}"
+ DetailPrint "$(installingWebview2)"
+ StrCpy $6 "$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe"
+ Goto install_webview2
+ !endif
+
+ Goto webview2_done
+
+ install_webview2:
+ DetailPrint "$(installingWebview2)"
+ ; $6 holds the path to the webview2 installer
+ ExecWait "$6 ${WEBVIEW2INSTALLERARGS} /install" $1
+ ${If} $1 == 0
+ DetailPrint "$(webview2InstallSuccess)"
+ ${Else}
+ DetailPrint "$(webview2InstallError)"
+ Abort "$(webview2AbortError)"
+ ${EndIf}
+ webview2_done:
+SectionEnd
+
+!macro CheckIfAppIsRunning
+ !if "${INSTALLMODE}" == "currentUser"
+ nsis_tauri_utils::FindProcessCurrentUser "${MAINBINARYNAME}.exe"
+ !else
+ nsis_tauri_utils::FindProcess "${MAINBINARYNAME}.exe"
+ !endif
+ Pop $R0
+ ${If} $R0 = 0
+ IfSilent kill 0
+ ${IfThen} $PassiveMode != 1 ${|} MessageBox MB_OKCANCEL "$(appRunningOkKill)" IDOK kill IDCANCEL cancel ${|}
+ kill:
+ !if "${INSTALLMODE}" == "currentUser"
+ nsis_tauri_utils::KillProcessCurrentUser "${MAINBINARYNAME}.exe"
+ !else
+ nsis_tauri_utils::KillProcess "${MAINBINARYNAME}.exe"
+ !endif
+ Pop $R0
+ Sleep 500
+ ${If} $R0 = 0
+ Goto app_check_done
+ ${Else}
+ IfSilent silent ui
+ silent:
+ System::Call 'kernel32::AttachConsole(i -1)i.r0'
+ ${If} $0 != 0
+ System::Call 'kernel32::GetStdHandle(i -11)i.r0'
+ System::call 'kernel32::SetConsoleTextAttribute(i r0, i 0x0004)' ; set red color
+ FileWrite $0 "$(appRunning)$\n"
+ ${EndIf}
+ Abort
+ ui:
+ Abort "$(failedToKillApp)"
+ ${EndIf}
+ cancel:
+ Abort "$(appRunning)"
+ ${EndIf}
+ app_check_done:
+!macroend
+
+Section Install
+ SetOutPath $INSTDIR
+
+ !insertmacro CheckIfAppIsRunning
+
+ ; Copy main executable
+ File "${MAINBINARYSRCPATH}"
+
+ ; Copy resources
+ {{#each resources_dirs}}
+ CreateDirectory "$INSTDIR\\{{this}}"
+ {{/each}}
+ {{#each resources}}
+ File /a "/oname={{this.[1]}}" "{{@key}}"
+ {{/each}}
+
+ ; Copy external binaries
+ {{#each binaries}}
+ File /a "/oname={{this}}" "{{@key}}"
+ {{/each}}
+
+ ; Create file associations
+ {{#each file_associations as |association| ~}}
+ {{#each association.ext as |ext| ~}}
+ !insertmacro APP_ASSOCIATE "{{ext}}" "{{or association.name ext}}" "{{association-description association.description ext}}" "$INSTDIR\${MAINBINARYNAME}.exe,0" "Open with ${PRODUCTNAME}" "$INSTDIR\${MAINBINARYNAME}.exe $\"%1$\""
+ {{/each}}
+ {{/each}}
+
+ ; Register deep links
+ {{#each deep_link_protocol as |protocol| ~}}
+ WriteRegStr SHCTX "Software\Classes\{{protocol}}" "URL Protocol" ""
+ WriteRegStr SHCTX "Software\Classes\{{protocol}}" "" "URL:${BUNDLEID} protocol"
+ WriteRegStr SHCTX "Software\Classes\{{protocol}}\DefaultIcon" "" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\",0"
+ WriteRegStr SHCTX "Software\Classes\{{protocol}}\shell\open\command" "" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\" $\"%1$\""
+ {{/each}}
+
+ ; Create uninstaller
+ WriteUninstaller "$INSTDIR\uninstall.exe"
+
+ ; Save $INSTDIR in registry for future installations
+ WriteRegStr SHCTX "${MANUPRODUCTKEY}" "" $INSTDIR
+
+ !if "${INSTALLMODE}" == "both"
+ ; Save install mode to be selected by default for the next installation such as updating
+ ; or when uninstalling
+ WriteRegStr SHCTX "${UNINSTKEY}" $MultiUser.InstallMode 1
+ !endif
+
+ ExecWait '"$INSTDIR\portmaster-start.exe" install core-service --data="$INSTDIR\data"'
+
+ ; Registry information for add/remove programs
+ WriteRegStr SHCTX "${UNINSTKEY}" "DisplayName" "${PRODUCTNAME}"
+ WriteRegStr SHCTX "${UNINSTKEY}" "DisplayIcon" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\""
+ WriteRegStr SHCTX "${UNINSTKEY}" "DisplayVersion" "${VERSION}"
+ WriteRegStr SHCTX "${UNINSTKEY}" "Publisher" "${MANUFACTURER}"
+ WriteRegStr SHCTX "${UNINSTKEY}" "InstallLocation" "$\"$INSTDIR$\""
+ WriteRegStr SHCTX "${UNINSTKEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
+ WriteRegDWORD SHCTX "${UNINSTKEY}" "NoModify" "1"
+ WriteRegDWORD SHCTX "${UNINSTKEY}" "NoRepair" "1"
+ WriteRegDWORD SHCTX "${UNINSTKEY}" "EstimatedSize" "${ESTIMATEDSIZE}"
+
+ ; Create start menu shortcut (GUI)
+ !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+ Call CreateStartMenuShortcut
+ !insertmacro MUI_STARTMENU_WRITE_END
+
+ ; Create shortcuts for silent and passive installers, which
+ ; can be disabled by passing `/NS` flag
+ ; GUI installer has buttons for users to control creating them
+ IfSilent check_ns_flag 0
+ ${IfThen} $PassiveMode == 1 ${|} Goto check_ns_flag ${|}
+ Goto shortcuts_done
+ check_ns_flag:
+ ${GetOptions} $CMDLINE "/NS" $R0
+ IfErrors 0 shortcuts_done
+ Call CreateDesktopShortcut
+ Call CreateStartMenuShortcut
+ shortcuts_done:
+
+ ; Auto close this page for passive mode
+ ${IfThen} $PassiveMode == 1 ${|} SetAutoClose true ${|}
+SectionEnd
+
+Function .onInstSuccess
+ ; Check for `/R` flag only in silent and passive installers because
+ ; GUI installer has a toggle for the user to (re)start the app
+ IfSilent check_r_flag 0
+ ${IfThen} $PassiveMode == 1 ${|} Goto check_r_flag ${|}
+ Goto run_done
+ check_r_flag:
+ ${GetOptions} $CMDLINE "/R" $R0
+ IfErrors run_done 0
+ ${GetOptions} $CMDLINE "/ARGS" $R0
+ Exec '"$INSTDIR\${MAINBINARYNAME}.exe" $R0'
+ run_done:
+FunctionEnd
+
+Function un.onInit
+ !insertmacro SetContext
+
+ !if "${INSTALLMODE}" == "both"
+ !insertmacro MULTIUSER_UNINIT
+ !endif
+
+ !insertmacro MUI_UNGETLANGUAGE
+FunctionEnd
+
+!macro DeleteAppUserModelId
+ !insertmacro ComHlpr_CreateInProcInstance ${CLSID_DestinationList} ${IID_ICustomDestinationList} r1 ""
+ ${If} $1 P<> 0
+ ${ICustomDestinationList::DeleteList} $1 '("${BUNDLEID}")'
+ ${IUnknown::Release} $1 ""
+ ${EndIf}
+ !insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationDestinations} ${IID_IApplicationDestinations} r1 ""
+ ${If} $1 P<> 0
+ ${IApplicationDestinations::SetAppID} $1 '("${BUNDLEID}")i.r0'
+ ${If} $0 >= 0
+ ${IApplicationDestinations::RemoveAllDestinations} $1 ''
+ ${EndIf}
+ ${IUnknown::Release} $1 ""
+ ${EndIf}
+!macroend
+
+; From https://stackoverflow.com/a/42816728/16993372
+!macro UnpinShortcut shortcut
+ !insertmacro ComHlpr_CreateInProcInstance ${CLSID_StartMenuPin} ${IID_IStartMenuPinnedList} r0 ""
+ ${If} $0 P<> 0
+ System::Call 'SHELL32::SHCreateItemFromParsingName(ws, p0, g "${IID_IShellItem}", *p0r1)' "${shortcut}"
+ ${If} $1 P<> 0
+ ${IStartMenuPinnedList::RemoveFromList} $0 '(r1)'
+ ${IUnknown::Release} $1 ""
+ ${EndIf}
+ ${IUnknown::Release} $0 ""
+ ${EndIf}
+!macroend
+
+Section Uninstall
+ !insertmacro CheckIfAppIsRunning
+
+ ExecWait 'sc.exe stop PortmasterCore'
+ ExecWait 'sc.exe delete PortmasterCore'
+
+ ; Delete the app directory and its content from disk
+ ; Copy main executable
+ Delete "$INSTDIR\${MAINBINARYNAME}.exe"
+
+ ; Delete resources
+ {{#each resources}}
+ Delete "$INSTDIR\\{{this.[1]}}"
+ {{/each}}
+
+ ; Delete external binaries
+ {{#each binaries}}
+ Delete "$INSTDIR\\{{this}}"
+ {{/each}}
+
+ ; Delete app associations
+ {{#each file_associations as |association| ~}}
+ {{#each association.ext as |ext| ~}}
+ !insertmacro APP_UNASSOCIATE "{{ext}}" "{{or association.name ext}}"
+ {{/each}}
+ {{/each}}
+
+ ; Delete deep links
+ {{#each deep_link_protocol as |protocol| ~}}
+ ReadRegStr $R7 SHCTX "Software\Classes\{{protocol}}\shell\open\command" ""
+ !if $R7 == "$\"$INSTDIR\${MAINBINARYNAME}.exe$\" $\"%1$\""
+ DeleteRegKey SHCTX "Software\Classes\{{protocol}}"
+ !endif
+ {{/each}}
+
+
+ ; Delete uninstaller
+ Delete "$INSTDIR\uninstall.exe"
+
+ {{#each resources_ancestors}}
+ RMDir /REBOOTOK "$INSTDIR\\{{this}}"
+ {{/each}}
+ RMDir "$INSTDIR"
+
+ !insertmacro DeleteAppUserModelId
+ !insertmacro UnpinShortcut "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
+ !insertmacro UnpinShortcut "$DESKTOP\${MAINBINARYNAME}.lnk"
+
+ ; Remove start menu shortcut
+ !insertmacro MUI_STARTMENU_GETFOLDER Application $AppStartMenuFolder
+ Delete "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
+ RMDir "$SMPROGRAMS\$AppStartMenuFolder"
+
+ ; Remove desktop shortcuts
+ Delete "$DESKTOP\${MAINBINARYNAME}.lnk"
+
+ ; Remove registry information for add/remove programs
+ !if "${INSTALLMODE}" == "both"
+ DeleteRegKey SHCTX "${UNINSTKEY}"
+ !else if "${INSTALLMODE}" == "perMachine"
+ DeleteRegKey HKLM "${UNINSTKEY}"
+ !else
+ DeleteRegKey HKCU "${UNINSTKEY}"
+ !endif
+
+ DeleteRegValue HKCU "${MANUPRODUCTKEY}" "Installer Language"
+
+ ; Delete app data
+ ${If} $DeleteAppDataCheckboxState == 1
+ SetShellVarContext current
+ RmDir /r "$APPDATA\${BUNDLEID}"
+ RmDir /r "$LOCALAPPDATA\${BUNDLEID}"
+ ${EndIf}
+
+ ${GetOptions} $CMDLINE "/P" $R0
+ IfErrors +2 0
+ SetAutoClose true
+SectionEnd
+
+Function RestorePreviousInstallLocation
+ ReadRegStr $4 SHCTX "${MANUPRODUCTKEY}" ""
+ StrCmp $4 "" +2 0
+ StrCpy $INSTDIR $4
+FunctionEnd
+
+Function SkipIfPassive
+ ${IfThen} $PassiveMode == 1 ${|} Abort ${|}
+FunctionEnd
+
+!macro SetLnkAppUserModelId shortcut
+ !insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 ""
+ ${If} $0 P<> 0
+ ${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}",.r1)'
+ ${If} $1 P<> 0
+ ${IPersistFile::Load} $1 '("${shortcut}", ${STGM_READWRITE})'
+ ${IUnknown::QueryInterface} $0 '("${IID_IPropertyStore}",.r2)'
+ ${If} $2 P<> 0
+ System::Call 'Oleaut32::SysAllocString(w "${BUNDLEID}") i.r3'
+ System::Call '*${SYSSTRUCT_PROPERTYKEY}(${PKEY_AppUserModel_ID})p.r4'
+ System::Call '*${SYSSTRUCT_PROPVARIANT}(${VT_BSTR},,&i4 $3)p.r5'
+ ${IPropertyStore::SetValue} $2 '($4,$5)'
+
+ System::Call 'Oleaut32::SysFreeString($3)'
+ System::Free $4
+ System::Free $5
+ ${IPropertyStore::Commit} $2 ""
+ ${IUnknown::Release} $2 ""
+ ${IPersistFile::Save} $1 '("${shortcut}",1)'
+ ${EndIf}
+ ${IUnknown::Release} $1 ""
+ ${EndIf}
+ ${IUnknown::Release} $0 ""
+ ${EndIf}
+!macroend
+
+Function CreateDesktopShortcut
+ CreateShortcut "$DESKTOP\${MAINBINARYNAME}.lnk" "$INSTDIR\${MAINBINARYNAME}.exe"
+ !insertmacro SetLnkAppUserModelId "$DESKTOP\${MAINBINARYNAME}.lnk"
+FunctionEnd
+
+Function CreateStartMenuShortcut
+ CreateDirectory "$SMPROGRAMS\$AppStartMenuFolder"
+ CreateShortcut "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk" "$INSTDIR\${MAINBINARYNAME}.exe"
+ !insertmacro SetLnkAppUserModelId "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
+FunctionEnd
diff --git a/desktop/tauri/src-tauri/templates/installer_original.nsi b/desktop/tauri/src-tauri/templates/installer_original.nsi
new file mode 100644
index 00000000..906f2e17
--- /dev/null
+++ b/desktop/tauri/src-tauri/templates/installer_original.nsi
@@ -0,0 +1,799 @@
+Unicode true
+ManifestDPIAware true
+; Set the compression algorithm. Default is LZMA.
+!if "{{compression}}" == ""
+ SetCompressor /SOLID lzma
+!else
+ SetCompressor /SOLID "{{compression}}"
+!endif
+
+!include MUI2.nsh
+!include FileFunc.nsh
+!include x64.nsh
+!include WordFunc.nsh
+!include "FileAssociation.nsh"
+!include "StrFunc.nsh"
+!include "Win\COM.nsh"
+!include "Win\Propkey.nsh"
+${StrCase}
+${StrLoc}
+
+!define MANUFACTURER "{{manufacturer}}"
+!define PRODUCTNAME "{{product_name}}"
+!define VERSION "{{version}}"
+!define VERSIONWITHBUILD "{{version_with_build}}"
+!define SHORTDESCRIPTION "{{short_description}}"
+!define INSTALLMODE "{{install_mode}}"
+!define LICENSE "{{license}}"
+!define INSTALLERICON "{{installer_icon}}"
+!define SIDEBARIMAGE "{{sidebar_image}}"
+!define HEADERIMAGE "{{header_image}}"
+!define MAINBINARYNAME "{{main_binary_name}}"
+!define MAINBINARYSRCPATH "{{main_binary_path}}"
+!define BUNDLEID "{{bundle_id}}"
+!define COPYRIGHT "{{copyright}}"
+!define OUTFILE "{{out_file}}"
+!define ARCH "{{arch}}"
+!define PLUGINSPATH "{{additional_plugins_path}}"
+!define ALLOWDOWNGRADES "{{allow_downgrades}}"
+!define DISPLAYLANGUAGESELECTOR "{{display_language_selector}}"
+!define INSTALLWEBVIEW2MODE "{{install_webview2_mode}}"
+!define WEBVIEW2INSTALLERARGS "{{webview2_installer_args}}"
+!define WEBVIEW2BOOTSTRAPPERPATH "{{webview2_bootstrapper_path}}"
+!define WEBVIEW2INSTALLERPATH "{{webview2_installer_path}}"
+!define UNINSTKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}"
+!define MANUPRODUCTKEY "Software\${MANUFACTURER}\${PRODUCTNAME}"
+!define UNINSTALLERSIGNCOMMAND "{{uninstaller_sign_cmd}}"
+!define ESTIMATEDSIZE "{{estimated_size}}"
+
+Name "${PRODUCTNAME}"
+BrandingText "${COPYRIGHT}"
+OutFile "${OUTFILE}"
+
+; We don't actually use this value as default install path,
+; it's just for nsis to append the product name folder in the directory selector
+; https://nsis.sourceforge.io/Reference/InstallDir
+!define PLACEHOLDER_INSTALL_DIR "placeholder\${PRODUCTNAME}"
+InstallDir "${PLACEHOLDER_INSTALL_DIR}"
+
+VIProductVersion "${VERSIONWITHBUILD}"
+VIAddVersionKey "ProductName" "${PRODUCTNAME}"
+VIAddVersionKey "FileDescription" "${SHORTDESCRIPTION}"
+VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
+VIAddVersionKey "FileVersion" "${VERSION}"
+VIAddVersionKey "ProductVersion" "${VERSION}"
+
+; Plugins path, currently exists for linux only
+!if "${PLUGINSPATH}" != ""
+ !addplugindir "${PLUGINSPATH}"
+!endif
+
+!if "${UNINSTALLERSIGNCOMMAND}" != ""
+ !uninstfinalize '${UNINSTALLERSIGNCOMMAND}'
+!endif
+
+; Handle install mode, `perUser`, `perMachine` or `both`
+!if "${INSTALLMODE}" == "perMachine"
+ RequestExecutionLevel highest
+!endif
+
+!if "${INSTALLMODE}" == "currentUser"
+ RequestExecutionLevel user
+!endif
+
+!if "${INSTALLMODE}" == "both"
+ !define MULTIUSER_MUI
+ !define MULTIUSER_INSTALLMODE_INSTDIR "${PRODUCTNAME}"
+ !define MULTIUSER_INSTALLMODE_COMMANDLINE
+ !if "${ARCH}" == "x64"
+ !define MULTIUSER_USE_PROGRAMFILES64
+ !else if "${ARCH}" == "arm64"
+ !define MULTIUSER_USE_PROGRAMFILES64
+ !endif
+ !define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY "${UNINSTKEY}"
+ !define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME "CurrentUser"
+ !define MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAME
+ !define MULTIUSER_INSTALLMODE_FUNCTION RestorePreviousInstallLocation
+ !define MULTIUSER_EXECUTIONLEVEL Highest
+ !include MultiUser.nsh
+!endif
+
+; installer icon
+!if "${INSTALLERICON}" != ""
+ !define MUI_ICON "${INSTALLERICON}"
+!endif
+
+; installer sidebar image
+!if "${SIDEBARIMAGE}" != ""
+ !define MUI_WELCOMEFINISHPAGE_BITMAP "${SIDEBARIMAGE}"
+!endif
+
+; installer header image
+!if "${HEADERIMAGE}" != ""
+ !define MUI_HEADERIMAGE
+ !define MUI_HEADERIMAGE_BITMAP "${HEADERIMAGE}"
+!endif
+
+; Define registry key to store installer language
+!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
+!define MUI_LANGDLL_REGISTRY_KEY "${MANUPRODUCTKEY}"
+!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
+
+; Installer pages, must be ordered as they appear
+; 1. Welcome Page
+!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+!insertmacro MUI_PAGE_WELCOME
+
+; 2. License Page (if defined)
+!if "${LICENSE}" != ""
+ !define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+ !insertmacro MUI_PAGE_LICENSE "${LICENSE}"
+!endif
+
+; 3. Install mode (if it is set to `both`)
+!if "${INSTALLMODE}" == "both"
+ !define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+ !insertmacro MULTIUSER_PAGE_INSTALLMODE
+!endif
+
+
+; 4. Custom page to ask user if he wants to reinstall/uninstall
+; only if a previous installation was detected
+Var ReinstallPageCheck
+Page custom PageReinstall PageLeaveReinstall
+Function PageReinstall
+ ; Uninstall previous WiX installation if exists.
+ ;
+ ; A WiX installer stores the installation info in registry
+ ; using a UUID and so we have to loop through all keys under
+ ; `HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall`
+ ; and check if `DisplayName` and `Publisher` keys match ${PRODUCTNAME} and ${MANUFACTURER}
+ ;
+ ; This has a potential issue that there maybe another installation that matches
+ ; our ${PRODUCTNAME} and ${MANUFACTURER} but wasn't installed by our WiX installer,
+ ; however, this should be fine since the user will have to confirm the uninstallation
+ ; and they can chose to abort it if doesn't make sense.
+ StrCpy $0 0
+ wix_loop:
+ EnumRegKey $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" $0
+ StrCmp $1 "" wix_done ; Exit loop if there is no more keys to loop on
+ IntOp $0 $0 + 1
+ ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "DisplayName"
+ ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "Publisher"
+ StrCmp "$R0$R1" "${PRODUCTNAME}${MANUFACTURER}" 0 wix_loop
+ ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1" "UninstallString"
+ ${StrCase} $R1 $R0 "L"
+ ${StrLoc} $R0 $R1 "msiexec" ">"
+ StrCmp $R0 0 0 wix_done
+ StrCpy $R7 "wix"
+ StrCpy $R6 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$1"
+ Goto compare_version
+ wix_done:
+
+ ; Check if there is an existing installation, if not, abort the reinstall page
+ ReadRegStr $R0 SHCTX "${UNINSTKEY}" ""
+ ReadRegStr $R1 SHCTX "${UNINSTKEY}" "UninstallString"
+ ${IfThen} "$R0$R1" == "" ${|} Abort ${|}
+
+ ; Compare this installar version with the existing installation
+ ; and modify the messages presented to the user accordingly
+ compare_version:
+ StrCpy $R4 "$(older)"
+ ${If} $R7 == "wix"
+ ReadRegStr $R0 HKLM "$R6" "DisplayVersion"
+ ${Else}
+ ReadRegStr $R0 SHCTX "${UNINSTKEY}" "DisplayVersion"
+ ${EndIf}
+ ${IfThen} $R0 == "" ${|} StrCpy $R4 "$(unknown)" ${|}
+
+ nsis_tauri_utils::SemverCompare "${VERSION}" $R0
+ Pop $R0
+ ; Reinstalling the same version
+ ${If} $R0 == 0
+ StrCpy $R1 "$(alreadyInstalledLong)"
+ StrCpy $R2 "$(addOrReinstall)"
+ StrCpy $R3 "$(uninstallApp)"
+ !insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(chooseMaintenanceOption)"
+ StrCpy $R5 "2"
+ ; Upgrading
+ ${ElseIf} $R0 == 1
+ StrCpy $R1 "$(olderOrUnknownVersionInstalled)"
+ StrCpy $R2 "$(uninstallBeforeInstalling)"
+ StrCpy $R3 "$(dontUninstall)"
+ !insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(choowHowToInstall)"
+ StrCpy $R5 "1"
+ ; Downgrading
+ ${ElseIf} $R0 == -1
+ StrCpy $R1 "$(newerVersionInstalled)"
+ StrCpy $R2 "$(uninstallBeforeInstalling)"
+ !if "${ALLOWDOWNGRADES}" == "true"
+ StrCpy $R3 "$(dontUninstall)"
+ !else
+ StrCpy $R3 "$(dontUninstallDowngrade)"
+ !endif
+ !insertmacro MUI_HEADER_TEXT "$(alreadyInstalled)" "$(choowHowToInstall)"
+ StrCpy $R5 "1"
+ ${Else}
+ Abort
+ ${EndIf}
+
+ Call SkipIfPassive
+
+ nsDialogs::Create 1018
+ Pop $R4
+ ${IfThen} $(^RTL) == 1 ${|} nsDialogs::SetRTL $(^RTL) ${|}
+
+ ${NSD_CreateLabel} 0 0 100% 24u $R1
+ Pop $R1
+
+ ${NSD_CreateRadioButton} 30u 50u -30u 8u $R2
+ Pop $R2
+ ${NSD_OnClick} $R2 PageReinstallUpdateSelection
+
+ ${NSD_CreateRadioButton} 30u 70u -30u 8u $R3
+ Pop $R3
+ ; disable this radio button if downgrading and downgrades are disabled
+ !if "${ALLOWDOWNGRADES}" == "false"
+ ${IfThen} $R0 == -1 ${|} EnableWindow $R3 0 ${|}
+ !endif
+ ${NSD_OnClick} $R3 PageReinstallUpdateSelection
+
+ ; Check the first radio button if this the first time
+ ; we enter this page or if the second button wasn't
+ ; selected the last time we were on this page
+ ${If} $ReinstallPageCheck != 2
+ SendMessage $R2 ${BM_SETCHECK} ${BST_CHECKED} 0
+ ${Else}
+ SendMessage $R3 ${BM_SETCHECK} ${BST_CHECKED} 0
+ ${EndIf}
+
+ ${NSD_SetFocus} $R2
+ nsDialogs::Show
+FunctionEnd
+Function PageReinstallUpdateSelection
+ ${NSD_GetState} $R2 $R1
+ ${If} $R1 == ${BST_CHECKED}
+ StrCpy $ReinstallPageCheck 1
+ ${Else}
+ StrCpy $ReinstallPageCheck 2
+ ${EndIf}
+FunctionEnd
+Function PageLeaveReinstall
+ ${NSD_GetState} $R2 $R1
+
+ ; $R5 holds whether we are reinstalling the same version or not
+ ; $R5 == "1" -> different versions
+ ; $R5 == "2" -> same version
+ ;
+ ; $R1 holds the radio buttons state. its meaning is dependent on the context
+ StrCmp $R5 "1" 0 +2 ; Existing install is not the same version?
+ StrCmp $R1 "1" reinst_uninstall reinst_done ; $R1 == "1", then user chose to uninstall existing version, otherwise skip uninstalling
+ StrCmp $R1 "1" reinst_done ; Same version? skip uninstalling
+
+ reinst_uninstall:
+ HideWindow
+ ClearErrors
+
+ ${If} $R7 == "wix"
+ ReadRegStr $R1 HKLM "$R6" "UninstallString"
+ ExecWait '$R1' $0
+ ${Else}
+ ReadRegStr $4 SHCTX "${MANUPRODUCTKEY}" ""
+ ReadRegStr $R1 SHCTX "${UNINSTKEY}" "UninstallString"
+ ExecWait '$R1 /P _?=$4' $0
+ ${EndIf}
+
+ BringToFront
+
+ ${IfThen} ${Errors} ${|} StrCpy $0 2 ${|} ; ExecWait failed, set fake exit code
+
+ ${If} $0 <> 0
+ ${OrIf} ${FileExists} "$INSTDIR\${MAINBINARYNAME}.exe"
+ ${If} $0 = 1 ; User aborted uninstaller?
+ StrCmp $R5 "2" 0 +2 ; Is the existing install the same version?
+ Quit ; ...yes, already installed, we are done
+ Abort
+ ${EndIf}
+ MessageBox MB_ICONEXCLAMATION "$(unableToUninstall)"
+ Abort
+ ${Else}
+ StrCpy $0 $R1 1
+ ${IfThen} $0 == '"' ${|} StrCpy $R1 $R1 -1 1 ${|} ; Strip quotes from UninstallString
+ Delete $R1
+ RMDir $INSTDIR
+ ${EndIf}
+ reinst_done:
+FunctionEnd
+
+; 5. Choose install directory page
+!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+!insertmacro MUI_PAGE_DIRECTORY
+
+; 6. Start menu shortcut page
+!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+Var AppStartMenuFolder
+!insertmacro MUI_PAGE_STARTMENU Application $AppStartMenuFolder
+
+; 7. Installation page
+!insertmacro MUI_PAGE_INSTFILES
+
+; 8. Finish page
+;
+; Don't auto jump to finish page after installation page,
+; because the installation page has useful info that can be used debug any issues with the installer.
+!define MUI_FINISHPAGE_NOAUTOCLOSE
+; Use show readme button in the finish page as a button create a desktop shortcut
+!define MUI_FINISHPAGE_SHOWREADME
+!define MUI_FINISHPAGE_SHOWREADME_TEXT "$(createDesktop)"
+!define MUI_FINISHPAGE_SHOWREADME_FUNCTION CreateDesktopShortcut
+; Show run app after installation.
+!define MUI_FINISHPAGE_RUN "$INSTDIR\${MAINBINARYNAME}.exe"
+!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller Pages
+; 1. Confirm uninstall page
+Var DeleteAppDataCheckbox
+Var DeleteAppDataCheckboxState
+!define /ifndef WS_EX_LAYOUTRTL 0x00400000
+!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.ConfirmShow
+Function un.ConfirmShow
+ FindWindow $1 "#32770" "" $HWNDPARENT ; Find inner dialog
+ ${If} $(^RTL) == 1
+ System::Call 'USER32::CreateWindowEx(i${__NSD_CheckBox_EXSTYLE}|${WS_EX_LAYOUTRTL},t"${__NSD_CheckBox_CLASS}",t "$(deleteAppData)",i${__NSD_CheckBox_STYLE},i 50,i 100,i 400, i 25,i$1,i0,i0,i0)i.s'
+ ${Else}
+ System::Call 'USER32::CreateWindowEx(i${__NSD_CheckBox_EXSTYLE},t"${__NSD_CheckBox_CLASS}",t "$(deleteAppData)",i${__NSD_CheckBox_STYLE},i 0,i 100,i 400, i 25,i$1,i0,i0,i0)i.s'
+ ${EndIf}
+ Pop $DeleteAppDataCheckbox
+ SendMessage $HWNDPARENT ${WM_GETFONT} 0 0 $1
+ SendMessage $DeleteAppDataCheckbox ${WM_SETFONT} $1 1
+FunctionEnd
+!define MUI_PAGE_CUSTOMFUNCTION_LEAVE un.ConfirmLeave
+Function un.ConfirmLeave
+ SendMessage $DeleteAppDataCheckbox ${BM_GETCHECK} 0 0 $DeleteAppDataCheckboxState
+FunctionEnd
+!insertmacro MUI_UNPAGE_CONFIRM
+
+; 2. Uninstalling Page
+!insertmacro MUI_UNPAGE_INSTFILES
+
+;Languages
+{{#each languages}}
+!insertmacro MUI_LANGUAGE "{{this}}"
+{{/each}}
+!insertmacro MUI_RESERVEFILE_LANGDLL
+{{#each language_files}}
+ !include "{{this}}"
+{{/each}}
+
+!macro SetContext
+ !if "${INSTALLMODE}" == "currentUser"
+ SetShellVarContext current
+ !else if "${INSTALLMODE}" == "perMachine"
+ SetShellVarContext all
+ !endif
+
+ ${If} ${RunningX64}
+ !if "${ARCH}" == "x64"
+ SetRegView 64
+ !else if "${ARCH}" == "arm64"
+ SetRegView 64
+ !else
+ SetRegView 32
+ !endif
+ ${EndIf}
+!macroend
+
+Var PassiveMode
+Function .onInit
+ ${GetOptions} $CMDLINE "/P" $PassiveMode
+ IfErrors +2 0
+ StrCpy $PassiveMode 1
+
+ !if "${DISPLAYLANGUAGESELECTOR}" == "true"
+ !insertmacro MUI_LANGDLL_DISPLAY
+ !endif
+
+ !insertmacro SetContext
+
+ ${If} $INSTDIR == "${PLACEHOLDER_INSTALL_DIR}"
+ ; Set default install location
+ !if "${INSTALLMODE}" == "perMachine"
+ ${If} ${RunningX64}
+ !if "${ARCH}" == "x64"
+ StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCTNAME}"
+ !else if "${ARCH}" == "arm64"
+ StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCTNAME}"
+ !else
+ StrCpy $INSTDIR "$PROGRAMFILES\${PRODUCTNAME}"
+ !endif
+ ${Else}
+ StrCpy $INSTDIR "$PROGRAMFILES\${PRODUCTNAME}"
+ ${EndIf}
+ !else if "${INSTALLMODE}" == "currentUser"
+ StrCpy $INSTDIR "$LOCALAPPDATA\${PRODUCTNAME}"
+ !endif
+
+ Call RestorePreviousInstallLocation
+ ${EndIf}
+
+
+ !if "${INSTALLMODE}" == "both"
+ !insertmacro MULTIUSER_INIT
+ !endif
+FunctionEnd
+
+
+Section EarlyChecks
+ ; Abort silent installer if downgrades is disabled
+ !if "${ALLOWDOWNGRADES}" == "false"
+ IfSilent 0 silent_downgrades_done
+ ; If downgrading
+ ${If} $R0 == -1
+ System::Call 'kernel32::AttachConsole(i -1)i.r0'
+ ${If} $0 != 0
+ System::Call 'kernel32::GetStdHandle(i -11)i.r0'
+ System::call 'kernel32::SetConsoleTextAttribute(i r0, i 0x0004)' ; set red color
+ FileWrite $0 "$(silentDowngrades)"
+ ${EndIf}
+ Abort
+ ${EndIf}
+ silent_downgrades_done:
+ !endif
+
+SectionEnd
+
+Section WebView2
+ ; Check if Webview2 is already installed and skip this section
+ ${If} ${RunningX64}
+ ReadRegStr $4 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
+ ${Else}
+ ReadRegStr $4 HKLM "SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
+ ${EndIf}
+ ReadRegStr $5 HKCU "SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
+
+ StrCmp $4 "" 0 webview2_done
+ StrCmp $5 "" 0 webview2_done
+
+ ; Webview2 install modes
+ !if "${INSTALLWEBVIEW2MODE}" == "downloadBootstrapper"
+ Delete "$TEMP\MicrosoftEdgeWebview2Setup.exe"
+ DetailPrint "$(webview2Downloading)"
+ NSISdl::download "https://go.microsoft.com/fwlink/p/?LinkId=2124703" "$TEMP\MicrosoftEdgeWebview2Setup.exe"
+ Pop $0
+ ${If} $0 == 0
+ DetailPrint "$(webview2DownloadSuccess)"
+ ${Else}
+ DetailPrint "$(webview2DownloadError)"
+ Abort "$(webview2AbortError)"
+ ${EndIf}
+ StrCpy $6 "$TEMP\MicrosoftEdgeWebview2Setup.exe"
+ Goto install_webview2
+ !endif
+
+ !if "${INSTALLWEBVIEW2MODE}" == "embedBootstrapper"
+ Delete "$TEMP\MicrosoftEdgeWebview2Setup.exe"
+ File "/oname=$TEMP\MicrosoftEdgeWebview2Setup.exe" "${WEBVIEW2BOOTSTRAPPERPATH}"
+ DetailPrint "$(installingWebview2)"
+ StrCpy $6 "$TEMP\MicrosoftEdgeWebview2Setup.exe"
+ Goto install_webview2
+ !endif
+
+ !if "${INSTALLWEBVIEW2MODE}" == "offlineInstaller"
+ Delete "$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe"
+ File "/oname=$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe" "${WEBVIEW2INSTALLERPATH}"
+ DetailPrint "$(installingWebview2)"
+ StrCpy $6 "$TEMP\MicrosoftEdgeWebView2RuntimeInstaller.exe"
+ Goto install_webview2
+ !endif
+
+ Goto webview2_done
+
+ install_webview2:
+ DetailPrint "$(installingWebview2)"
+ ; $6 holds the path to the webview2 installer
+ ExecWait "$6 ${WEBVIEW2INSTALLERARGS} /install" $1
+ ${If} $1 == 0
+ DetailPrint "$(webview2InstallSuccess)"
+ ${Else}
+ DetailPrint "$(webview2InstallError)"
+ Abort "$(webview2AbortError)"
+ ${EndIf}
+ webview2_done:
+SectionEnd
+
+!macro CheckIfAppIsRunning
+ !if "${INSTALLMODE}" == "currentUser"
+ nsis_tauri_utils::FindProcessCurrentUser "${MAINBINARYNAME}.exe"
+ !else
+ nsis_tauri_utils::FindProcess "${MAINBINARYNAME}.exe"
+ !endif
+ Pop $R0
+ ${If} $R0 = 0
+ IfSilent kill 0
+ ${IfThen} $PassiveMode != 1 ${|} MessageBox MB_OKCANCEL "$(appRunningOkKill)" IDOK kill IDCANCEL cancel ${|}
+ kill:
+ !if "${INSTALLMODE}" == "currentUser"
+ nsis_tauri_utils::KillProcessCurrentUser "${MAINBINARYNAME}.exe"
+ !else
+ nsis_tauri_utils::KillProcess "${MAINBINARYNAME}.exe"
+ !endif
+ Pop $R0
+ Sleep 500
+ ${If} $R0 = 0
+ Goto app_check_done
+ ${Else}
+ IfSilent silent ui
+ silent:
+ System::Call 'kernel32::AttachConsole(i -1)i.r0'
+ ${If} $0 != 0
+ System::Call 'kernel32::GetStdHandle(i -11)i.r0'
+ System::call 'kernel32::SetConsoleTextAttribute(i r0, i 0x0004)' ; set red color
+ FileWrite $0 "$(appRunning)$\n"
+ ${EndIf}
+ Abort
+ ui:
+ Abort "$(failedToKillApp)"
+ ${EndIf}
+ cancel:
+ Abort "$(appRunning)"
+ ${EndIf}
+ app_check_done:
+!macroend
+
+Section Install
+ SetOutPath $INSTDIR
+
+ !insertmacro CheckIfAppIsRunning
+
+ ; Copy main executable
+ File "${MAINBINARYSRCPATH}"
+
+ ; Copy resources
+ {{#each resources_dirs}}
+ CreateDirectory "$INSTDIR\\{{this}}"
+ {{/each}}
+ {{#each resources}}
+ File /a "/oname={{this.[1]}}" "{{@key}}"
+ {{/each}}
+
+ ; Copy external binaries
+ {{#each binaries}}
+ File /a "/oname={{this}}" "{{@key}}"
+ {{/each}}
+
+ ; Create file associations
+ {{#each file_associations as |association| ~}}
+ {{#each association.ext as |ext| ~}}
+ !insertmacro APP_ASSOCIATE "{{ext}}" "{{or association.name ext}}" "{{association-description association.description ext}}" "$INSTDIR\${MAINBINARYNAME}.exe,0" "Open with ${PRODUCTNAME}" "$INSTDIR\${MAINBINARYNAME}.exe $\"%1$\""
+ {{/each}}
+ {{/each}}
+
+ ; Register deep links
+ {{#each deep_link_protocol as |protocol| ~}}
+ WriteRegStr SHCTX "Software\Classes\{{protocol}}" "URL Protocol" ""
+ WriteRegStr SHCTX "Software\Classes\{{protocol}}" "" "URL:${BUNDLEID} protocol"
+ WriteRegStr SHCTX "Software\Classes\{{protocol}}\DefaultIcon" "" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\",0"
+ WriteRegStr SHCTX "Software\Classes\{{protocol}}\shell\open\command" "" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\" $\"%1$\""
+ {{/each}}
+
+ ; Create uninstaller
+ WriteUninstaller "$INSTDIR\uninstall.exe"
+
+ ; Save $INSTDIR in registry for future installations
+ WriteRegStr SHCTX "${MANUPRODUCTKEY}" "" $INSTDIR
+
+ !if "${INSTALLMODE}" == "both"
+ ; Save install mode to be selected by default for the next installation such as updating
+ ; or when uninstalling
+ WriteRegStr SHCTX "${UNINSTKEY}" $MultiUser.InstallMode 1
+ !endif
+
+ ; Registry information for add/remove programs
+ WriteRegStr SHCTX "${UNINSTKEY}" "DisplayName" "${PRODUCTNAME}"
+ WriteRegStr SHCTX "${UNINSTKEY}" "DisplayIcon" "$\"$INSTDIR\${MAINBINARYNAME}.exe$\""
+ WriteRegStr SHCTX "${UNINSTKEY}" "DisplayVersion" "${VERSION}"
+ WriteRegStr SHCTX "${UNINSTKEY}" "Publisher" "${MANUFACTURER}"
+ WriteRegStr SHCTX "${UNINSTKEY}" "InstallLocation" "$\"$INSTDIR$\""
+ WriteRegStr SHCTX "${UNINSTKEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
+ WriteRegDWORD SHCTX "${UNINSTKEY}" "NoModify" "1"
+ WriteRegDWORD SHCTX "${UNINSTKEY}" "NoRepair" "1"
+ WriteRegDWORD SHCTX "${UNINSTKEY}" "EstimatedSize" "${ESTIMATEDSIZE}"
+
+ ; Create start menu shortcut (GUI)
+ !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+ Call CreateStartMenuShortcut
+ !insertmacro MUI_STARTMENU_WRITE_END
+
+ ; Create shortcuts for silent and passive installers, which
+ ; can be disabled by passing `/NS` flag
+ ; GUI installer has buttons for users to control creating them
+ IfSilent check_ns_flag 0
+ ${IfThen} $PassiveMode == 1 ${|} Goto check_ns_flag ${|}
+ Goto shortcuts_done
+ check_ns_flag:
+ ${GetOptions} $CMDLINE "/NS" $R0
+ IfErrors 0 shortcuts_done
+ Call CreateDesktopShortcut
+ Call CreateStartMenuShortcut
+ shortcuts_done:
+
+ ; Auto close this page for passive mode
+ ${IfThen} $PassiveMode == 1 ${|} SetAutoClose true ${|}
+SectionEnd
+
+Function .onInstSuccess
+ ; Check for `/R` flag only in silent and passive installers because
+ ; GUI installer has a toggle for the user to (re)start the app
+ IfSilent check_r_flag 0
+ ${IfThen} $PassiveMode == 1 ${|} Goto check_r_flag ${|}
+ Goto run_done
+ check_r_flag:
+ ${GetOptions} $CMDLINE "/R" $R0
+ IfErrors run_done 0
+ ${GetOptions} $CMDLINE "/ARGS" $R0
+ Exec '"$INSTDIR\${MAINBINARYNAME}.exe" $R0'
+ run_done:
+FunctionEnd
+
+Function un.onInit
+ !insertmacro SetContext
+
+ !if "${INSTALLMODE}" == "both"
+ !insertmacro MULTIUSER_UNINIT
+ !endif
+
+ !insertmacro MUI_UNGETLANGUAGE
+FunctionEnd
+
+!macro DeleteAppUserModelId
+ !insertmacro ComHlpr_CreateInProcInstance ${CLSID_DestinationList} ${IID_ICustomDestinationList} r1 ""
+ ${If} $1 P<> 0
+ ${ICustomDestinationList::DeleteList} $1 '("${BUNDLEID}")'
+ ${IUnknown::Release} $1 ""
+ ${EndIf}
+ !insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationDestinations} ${IID_IApplicationDestinations} r1 ""
+ ${If} $1 P<> 0
+ ${IApplicationDestinations::SetAppID} $1 '("${BUNDLEID}")i.r0'
+ ${If} $0 >= 0
+ ${IApplicationDestinations::RemoveAllDestinations} $1 ''
+ ${EndIf}
+ ${IUnknown::Release} $1 ""
+ ${EndIf}
+!macroend
+
+; From https://stackoverflow.com/a/42816728/16993372
+!macro UnpinShortcut shortcut
+ !insertmacro ComHlpr_CreateInProcInstance ${CLSID_StartMenuPin} ${IID_IStartMenuPinnedList} r0 ""
+ ${If} $0 P<> 0
+ System::Call 'SHELL32::SHCreateItemFromParsingName(ws, p0, g "${IID_IShellItem}", *p0r1)' "${shortcut}"
+ ${If} $1 P<> 0
+ ${IStartMenuPinnedList::RemoveFromList} $0 '(r1)'
+ ${IUnknown::Release} $1 ""
+ ${EndIf}
+ ${IUnknown::Release} $0 ""
+ ${EndIf}
+!macroend
+
+Section Uninstall
+ !insertmacro CheckIfAppIsRunning
+
+ ; Delete the app directory and its content from disk
+ ; Copy main executable
+ Delete "$INSTDIR\${MAINBINARYNAME}.exe"
+
+ ; Delete resources
+ {{#each resources}}
+ Delete "$INSTDIR\\{{this.[1]}}"
+ {{/each}}
+
+ ; Delete external binaries
+ {{#each binaries}}
+ Delete "$INSTDIR\\{{this}}"
+ {{/each}}
+
+ ; Delete app associations
+ {{#each file_associations as |association| ~}}
+ {{#each association.ext as |ext| ~}}
+ !insertmacro APP_UNASSOCIATE "{{ext}}" "{{or association.name ext}}"
+ {{/each}}
+ {{/each}}
+
+ ; Delete deep links
+ {{#each deep_link_protocol as |protocol| ~}}
+ ReadRegStr $R7 SHCTX "Software\Classes\{{protocol}}\shell\open\command" ""
+ !if $R7 == "$\"$INSTDIR\${MAINBINARYNAME}.exe$\" $\"%1$\""
+ DeleteRegKey SHCTX "Software\Classes\{{protocol}}"
+ !endif
+ {{/each}}
+
+
+ ; Delete uninstaller
+ Delete "$INSTDIR\uninstall.exe"
+
+ {{#each resources_ancestors}}
+ RMDir /REBOOTOK "$INSTDIR\\{{this}}"
+ {{/each}}
+ RMDir "$INSTDIR"
+
+ !insertmacro DeleteAppUserModelId
+ !insertmacro UnpinShortcut "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
+ !insertmacro UnpinShortcut "$DESKTOP\${MAINBINARYNAME}.lnk"
+
+ ; Remove start menu shortcut
+ !insertmacro MUI_STARTMENU_GETFOLDER Application $AppStartMenuFolder
+ Delete "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
+ RMDir "$SMPROGRAMS\$AppStartMenuFolder"
+
+ ; Remove desktop shortcuts
+ Delete "$DESKTOP\${MAINBINARYNAME}.lnk"
+
+ ; Remove registry information for add/remove programs
+ !if "${INSTALLMODE}" == "both"
+ DeleteRegKey SHCTX "${UNINSTKEY}"
+ !else if "${INSTALLMODE}" == "perMachine"
+ DeleteRegKey HKLM "${UNINSTKEY}"
+ !else
+ DeleteRegKey HKCU "${UNINSTKEY}"
+ !endif
+
+ DeleteRegValue HKCU "${MANUPRODUCTKEY}" "Installer Language"
+
+ ; Delete app data
+ ${If} $DeleteAppDataCheckboxState == 1
+ SetShellVarContext current
+ RmDir /r "$APPDATA\${BUNDLEID}"
+ RmDir /r "$LOCALAPPDATA\${BUNDLEID}"
+ ${EndIf}
+
+ ${GetOptions} $CMDLINE "/P" $R0
+ IfErrors +2 0
+ SetAutoClose true
+SectionEnd
+
+Function RestorePreviousInstallLocation
+ ReadRegStr $4 SHCTX "${MANUPRODUCTKEY}" ""
+ StrCmp $4 "" +2 0
+ StrCpy $INSTDIR $4
+FunctionEnd
+
+Function SkipIfPassive
+ ${IfThen} $PassiveMode == 1 ${|} Abort ${|}
+FunctionEnd
+
+!macro SetLnkAppUserModelId shortcut
+ !insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 ""
+ ${If} $0 P<> 0
+ ${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}",.r1)'
+ ${If} $1 P<> 0
+ ${IPersistFile::Load} $1 '("${shortcut}", ${STGM_READWRITE})'
+ ${IUnknown::QueryInterface} $0 '("${IID_IPropertyStore}",.r2)'
+ ${If} $2 P<> 0
+ System::Call 'Oleaut32::SysAllocString(w "${BUNDLEID}") i.r3'
+ System::Call '*${SYSSTRUCT_PROPERTYKEY}(${PKEY_AppUserModel_ID})p.r4'
+ System::Call '*${SYSSTRUCT_PROPVARIANT}(${VT_BSTR},,&i4 $3)p.r5'
+ ${IPropertyStore::SetValue} $2 '($4,$5)'
+
+ System::Call 'Oleaut32::SysFreeString($3)'
+ System::Free $4
+ System::Free $5
+ ${IPropertyStore::Commit} $2 ""
+ ${IUnknown::Release} $2 ""
+ ${IPersistFile::Save} $1 '("${shortcut}",1)'
+ ${EndIf}
+ ${IUnknown::Release} $1 ""
+ ${EndIf}
+ ${IUnknown::Release} $0 ""
+ ${EndIf}
+!macroend
+
+Function CreateDesktopShortcut
+ CreateShortcut "$DESKTOP\${MAINBINARYNAME}.lnk" "$INSTDIR\${MAINBINARYNAME}.exe"
+ !insertmacro SetLnkAppUserModelId "$DESKTOP\${MAINBINARYNAME}.lnk"
+FunctionEnd
+
+Function CreateStartMenuShortcut
+ CreateDirectory "$SMPROGRAMS\$AppStartMenuFolder"
+ CreateShortcut "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk" "$INSTDIR\${MAINBINARYNAME}.exe"
+ !insertmacro SetLnkAppUserModelId "$SMPROGRAMS\$AppStartMenuFolder\${MAINBINARYNAME}.lnk"
+FunctionEnd
\ No newline at end of file
diff --git a/desktop/tauri/src-tauri/templates/main.wxs b/desktop/tauri/src-tauri/templates/main.wxs
new file mode 100644
index 00000000..6777f396
--- /dev/null
+++ b/desktop/tauri/src-tauri/templates/main.wxs
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{#if allow_downgrades}}
+
+ {{else}}
+
+ {{/if}}
+
+
+ Installed AND NOT UPGRADINGPRODUCTCODE
+
+
+
+
+ {{#if banner_path}}
+
+ {{/if}}
+ {{#if dialog_image_path}}
+
+ {{/if}}
+ {{#if license}}
+
+ {{/if}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed
+
+
+
+ {{#unless license}}
+
+ 1
+ 1
+ {{/unless}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{#each deep_link_protocols as |protocol| ~}}
+
+
+
+
+
+
+
+
+
+
+ {{/each~}}
+
+
+
+ {{#each file_associations as |association| ~}}
+ {{#each association.ext as |ext| ~}}
+
+
+
+
+
+ {{/each~}}
+ {{/each~}}
+
+ {{#each binaries as |bin| ~}}
+
+
+
+ {{/each~}}
+ {{#if enable_elevated_update_task}}
+
+
+
+
+
+
+
+
+
+ {{/if}}
+ {{resources}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{#each merge_modules as |msm| ~}}
+
+
+
+
+
+
+
+ {{/each~}}
+
+
+
+
+
+ {{#each resource_file_ids as |resource_file_id| ~}}
+
+ {{/each~}}
+
+ {{#if enable_elevated_update_task}}
+
+
+
+ {{/if}}
+
+
+
+
+
+
+
+
+
+
+ {{#each binaries as |bin| ~}}
+
+ {{/each~}}
+
+
+
+
+ {{#each component_group_refs as |id| ~}}
+
+ {{/each~}}
+ {{#each component_refs as |id| ~}}
+
+ {{/each~}}
+ {{#each feature_group_refs as |id| ~}}
+
+ {{/each~}}
+ {{#each feature_refs as |id| ~}}
+
+ {{/each~}}
+ {{#each merge_refs as |id| ~}}
+
+ {{/each~}}
+
+
+ {{#if install_webview}}
+
+
+
+
+
+
+ {{#if download_bootstrapper}}
+
+
+
+
+
+
+ {{/if}}
+
+
+ {{#if webview2_bootstrapper_path}}
+
+
+
+
+
+
+
+ {{/if}}
+
+
+ {{#if webview2_installer_path}}
+
+
+
+
+
+
+
+ {{/if}}
+
+ {{/if}}
+
+ {{#if enable_elevated_update_task}}
+
+
+
+
+ NOT(REMOVE)
+
+
+
+
+
+
+ (REMOVE = "ALL") AND NOT UPGRADINGPRODUCTCODE
+
+
+ {{/if}}
+
+
+
+
+
+
+
diff --git a/desktop/tauri/src-tauri/templates/main_original.wxs b/desktop/tauri/src-tauri/templates/main_original.wxs
new file mode 100644
index 00000000..9a985b86
--- /dev/null
+++ b/desktop/tauri/src-tauri/templates/main_original.wxs
@@ -0,0 +1,333 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{#if allow_downgrades}}
+
+ {{else}}
+
+ {{/if}}
+
+
+ Installed AND NOT UPGRADINGPRODUCTCODE
+
+
+
+
+ {{#if banner_path}}
+
+ {{/if}}
+ {{#if dialog_image_path}}
+
+ {{/if}}
+ {{#if license}}
+
+ {{/if}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed
+
+
+
+ {{#unless license}}
+
+ 1
+ 1
+ {{/unless}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{#each deep_link_protocols as |protocol| ~}}
+
+
+
+
+
+
+
+
+
+
+ {{/each~}}
+
+
+
+ {{#each file_associations as |association| ~}}
+ {{#each association.ext as |ext| ~}}
+
+
+
+
+
+ {{/each~}}
+ {{/each~}}
+
+ {{#each binaries as |bin| ~}}
+
+
+
+ {{/each~}}
+ {{#if enable_elevated_update_task}}
+
+
+
+
+
+
+
+
+
+ {{/if}}
+ {{resources}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{#each merge_modules as |msm| ~}}
+
+
+
+
+
+
+
+ {{/each~}}
+
+
+
+
+
+ {{#each resource_file_ids as |resource_file_id| ~}}
+
+ {{/each~}}
+
+ {{#if enable_elevated_update_task}}
+
+
+
+ {{/if}}
+
+
+
+
+
+
+
+
+
+
+ {{#each binaries as |bin| ~}}
+
+ {{/each~}}
+
+
+
+
+ {{#each component_group_refs as |id| ~}}
+
+ {{/each~}}
+ {{#each component_refs as |id| ~}}
+
+ {{/each~}}
+ {{#each feature_group_refs as |id| ~}}
+
+ {{/each~}}
+ {{#each feature_refs as |id| ~}}
+
+ {{/each~}}
+ {{#each merge_refs as |id| ~}}
+
+ {{/each~}}
+
+
+ {{#if install_webview}}
+
+
+
+
+
+
+ {{#if download_bootstrapper}}
+
+
+
+
+
+
+ {{/if}}
+
+
+ {{#if webview2_bootstrapper_path}}
+
+
+
+
+
+
+
+ {{/if}}
+
+
+ {{#if webview2_installer_path}}
+
+
+
+
+
+
+
+ {{/if}}
+
+ {{/if}}
+
+ {{#if enable_elevated_update_task}}
+
+
+
+
+ NOT(REMOVE)
+
+
+
+
+
+
+ (REMOVE = "ALL") AND NOT UPGRADINGPRODUCTCODE
+
+
+ {{/if}}
+
+
+
+
diff --git a/desktop/tauri/src-tauri/templates/service.wxs b/desktop/tauri/src-tauri/templates/service.wxs
new file mode 100644
index 00000000..88bd9062
--- /dev/null
+++ b/desktop/tauri/src-tauri/templates/service.wxs
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+ REMOVE
+
+
+ REMOVE
+
+
+
+