From 896e3d583157bf63d17386437580ffca2fde586d Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Sat, 4 May 2024 14:14:19 -0700 Subject: [PATCH] Upgrade to Tauri 2.0 (#23) --- package-lock.json | 2839 ++++--- package.json | 18 +- src-tauri/.cargo/config.toml | 4 + src-tauri/Cargo.lock | 2685 +++++-- src-tauri/Cargo.toml | 44 +- src-tauri/capabilities/main.json | 49 + src-tauri/gen/apple/.gitignore | 3 + .../AppIcon.appiconset/AppIcon-20x20@1x.png | Bin 0 -> 844 bytes .../AppIcon.appiconset/AppIcon-20x20@2x-1.png | Bin 0 -> 2199 bytes .../AppIcon.appiconset/AppIcon-20x20@2x.png | Bin 0 -> 2199 bytes .../AppIcon.appiconset/AppIcon-20x20@3x.png | Bin 0 -> 3622 bytes .../AppIcon.appiconset/AppIcon-29x29@1x.png | Bin 0 -> 1419 bytes .../AppIcon.appiconset/AppIcon-29x29@2x-1.png | Bin 0 -> 3509 bytes .../AppIcon.appiconset/AppIcon-29x29@2x.png | Bin 0 -> 3509 bytes .../AppIcon.appiconset/AppIcon-29x29@3x.png | Bin 0 -> 5618 bytes .../AppIcon.appiconset/AppIcon-40x40@1x.png | Bin 0 -> 2199 bytes .../AppIcon.appiconset/AppIcon-40x40@2x-1.png | Bin 0 -> 5143 bytes .../AppIcon.appiconset/AppIcon-40x40@2x.png | Bin 0 -> 5143 bytes .../AppIcon.appiconset/AppIcon-40x40@3x.png | Bin 0 -> 7879 bytes .../AppIcon.appiconset/AppIcon-512@2x.png | Bin 0 -> 155248 bytes .../AppIcon.appiconset/AppIcon-512x512@2x.png | Bin 0 -> 15001 bytes .../AppIcon.appiconset/AppIcon-60x60@2x.png | Bin 0 -> 7879 bytes .../AppIcon.appiconset/AppIcon-60x60@3x.png | Bin 0 -> 12188 bytes .../AppIcon.appiconset/AppIcon-76x76@1x.png | Bin 0 -> 4789 bytes .../AppIcon.appiconset/AppIcon-76x76@2x.png | Bin 0 -> 10113 bytes .../AppIcon-83.5x83.5@2x.png | Bin 0 -> 11189 bytes .../AppIcon.appiconset/Contents.json | 116 + .../gen/apple/Assets.xcassets/Contents.json | 6 + src-tauri/gen/apple/ExportOptions.plist | 8 + src-tauri/gen/apple/Podfile | 21 + .../Sources/yaak-app/bindings/bindings.h | 8 + src-tauri/gen/apple/Sources/yaak-app/main.mm | 6 + src-tauri/gen/apple/project.yml | 90 + .../apple/yaak-app.xcodeproj/project.pbxproj | 481 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 10 + .../xcschemes/yaak-app_iOS.xcscheme | 123 + src-tauri/gen/apple/yaak-app_iOS/Info.plist | 44 + .../yaak-app_iOS/yaak-app_iOS.entitlements | 5 + src-tauri/gen/schemas/acl-manifests.json | 1 + src-tauri/gen/schemas/capabilities.json | 1 + src-tauri/gen/schemas/desktop-schema.json | 6701 +++++++++++++++++ src-tauri/gen/schemas/macOS-schema.json | 6701 +++++++++++++++++ src-tauri/grpc/Cargo.toml | 3 +- src-tauri/grpc/src/proto.rs | 26 +- src-tauri/src/analytics.rs | 2 +- src-tauri/src/http.rs | 11 +- src-tauri/src/lib.rs | 1721 +++++ src-tauri/src/main.rs | 1682 +---- src-tauri/src/models.rs | 241 +- src-tauri/src/plugin.rs | 15 +- src-tauri/src/render.rs | 5 +- src-tauri/src/updates.rs | 54 +- src-tauri/src/window_ext.rs | 4 +- src-tauri/src/window_menu.rs | 270 +- src-tauri/tauri-dev.conf.json | 24 +- src-tauri/tauri.conf.json | 124 +- src-web/components/BinaryFileEditor.tsx | 2 +- src-web/components/ExportDataDialog.tsx | 4 +- src-web/components/GlobalHooks.tsx | 136 +- src-web/components/GrpcProtoSelection.tsx | 8 +- src-web/components/RequestMethodDropdown.tsx | 2 +- src-web/components/ResponseHeaders.tsx | 4 +- src-web/components/SettingsDropdown.tsx | 26 +- src-web/components/Workspace.tsx | 2 +- .../components/WorkspaceActionsDropdown.tsx | 2 +- src-web/components/WorkspaceHeader.tsx | 17 +- src-web/components/core/PairEditor.tsx | 2 +- .../responseViewers/ImageViewer.tsx | 2 +- src-web/hooks/useAppInfo.ts | 2 +- src-web/hooks/useCheckForUpdates.ts | 2 +- src-web/hooks/useCookieJars.ts | 2 +- src-web/hooks/useCreateCookieJar.ts | 2 +- src-web/hooks/useCreateEnvironment.ts | 2 +- src-web/hooks/useCreateFolder.ts | 2 +- src-web/hooks/useCreateGrpcRequest.ts | 2 +- src-web/hooks/useCreateHttpRequest.ts | 2 +- src-web/hooks/useDeleteAnyGrpcRequest.tsx | 2 +- src-web/hooks/useDeleteAnyHttpRequest.tsx | 2 +- src-web/hooks/useDeleteCookieJar.tsx | 2 +- src-web/hooks/useDeleteEnvironment.tsx | 2 +- src-web/hooks/useDeleteFolder.tsx | 2 +- src-web/hooks/useDeleteGrpcConnection.ts | 2 +- src-web/hooks/useDeleteGrpcConnections.ts | 2 +- src-web/hooks/useDeleteHttpResponse.ts | 2 +- src-web/hooks/useDeleteHttpResponses.ts | 2 +- src-web/hooks/useDeleteWorkspace.tsx | 2 +- src-web/hooks/useDuplicateGrpcRequest.ts | 2 +- src-web/hooks/useDuplicateHttpRequest.ts | 2 +- src-web/hooks/useEnvironments.ts | 2 +- src-web/hooks/useFilterResponse.ts | 2 +- src-web/hooks/useFolders.ts | 2 +- src-web/hooks/useGlobalCommands.ts | 2 +- src-web/hooks/useGrpc.ts | 2 +- src-web/hooks/useGrpcConnections.ts | 2 +- src-web/hooks/useGrpcEvents.ts | 2 +- src-web/hooks/useGrpcRequests.ts | 2 +- src-web/hooks/useHotKey.ts | 10 +- src-web/hooks/useHttpRequests.ts | 2 +- src-web/hooks/useHttpResponses.ts | 7 +- src-web/hooks/useImportData.tsx | 19 +- src-web/hooks/useIntrospectGraphQL.ts | 10 +- src-web/hooks/useIsFullscreen.ts | 4 +- src-web/hooks/useListenToTauriEvent.ts | 17 +- src-web/hooks/useOsInfo.ts | 4 +- src-web/hooks/useSendAnyRequest.ts | 4 +- src-web/hooks/useSettings.ts | 2 +- src-web/hooks/useSyncWindowTitle.ts | 2 +- src-web/hooks/useUpdateAnyFolder.ts | 2 +- src-web/hooks/useUpdateAnyGrpcRequest.ts | 2 +- src-web/hooks/useUpdateAnyHttpRequest.ts | 2 +- src-web/hooks/useUpdateCookieJar.ts | 2 +- src-web/hooks/useUpdateEnvironment.ts | 2 +- src-web/hooks/useUpdateSettings.ts | 2 +- src-web/hooks/useUpdateWorkspace.ts | 2 +- src-web/hooks/useVariables.ts | 2 +- src-web/hooks/useWindowFocus.ts | 4 +- src-web/hooks/useWorkspaces.ts | 2 +- src-web/lib/analytics.ts | 2 +- src-web/lib/keyValueStore.ts | 2 +- src-web/lib/models.ts | 1 + src-web/lib/persistPathname.ts | 4 +- src-web/lib/responseBody.ts | 4 +- src-web/lib/sendEphemeralRequest.ts | 2 +- src-web/lib/store.ts | 2 +- src-web/main.tsx | 8 +- vite.config.ts | 39 +- 128 files changed, 20477 insertions(+), 4114 deletions(-) create mode 100644 src-tauri/.cargo/config.toml create mode 100644 src-tauri/capabilities/main.json create mode 100644 src-tauri/gen/apple/.gitignore create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-512x512@2x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png create mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 src-tauri/gen/apple/Assets.xcassets/Contents.json create mode 100644 src-tauri/gen/apple/ExportOptions.plist create mode 100644 src-tauri/gen/apple/Podfile create mode 100644 src-tauri/gen/apple/Sources/yaak-app/bindings/bindings.h create mode 100644 src-tauri/gen/apple/Sources/yaak-app/main.mm create mode 100644 src-tauri/gen/apple/project.yml create mode 100644 src-tauri/gen/apple/yaak-app.xcodeproj/project.pbxproj create mode 100644 src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 src-tauri/gen/apple/yaak-app.xcodeproj/xcshareddata/xcschemes/yaak-app_iOS.xcscheme create mode 100644 src-tauri/gen/apple/yaak-app_iOS/Info.plist create mode 100644 src-tauri/gen/apple/yaak-app_iOS/yaak-app_iOS.entitlements create mode 100644 src-tauri/gen/schemas/acl-manifests.json create mode 100644 src-tauri/gen/schemas/capabilities.json create mode 100644 src-tauri/gen/schemas/desktop-schema.json create mode 100644 src-tauri/gen/schemas/macOS-schema.json create mode 100644 src-tauri/src/lib.rs diff --git a/package-lock.json b/package-lock.json index 154b7639..359abd70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,11 @@ "@tanstack/react-query": "^4.28.0", "@tanstack/react-query-devtools": "^4.28.0", "@tanstack/react-query-persist-client": "^4.28.0", - "@tauri-apps/api": "^1.5.3", + "@tauri-apps/api": ">=2.0.0-beta.0", + "@tauri-apps/plugin-dialog": ">=2.0.0-beta.0", + "@tauri-apps/plugin-fs": ">=2.0.0-beta.0", + "@tauri-apps/plugin-os": ">=2.0.0-beta.0", + "@tauri-apps/plugin-shell": ">=2.0.0-beta.0", "buffer": "^6.0.3", "classnames": "^2.3.2", "cm6-graphql": "^0.0.9", @@ -33,6 +37,7 @@ "focus-trap-react": "^10.1.1", "format-graphql": "^1.4.0", "framer-motion": "^9.0.4", + "internal-ip": "^8.0.0", "lucide-react": "^0.309.0", "mime": "^4.0.1", "papaparse": "^5.4.1", @@ -45,13 +50,13 @@ "react-router-dom": "^6.8.1", "react-use": "^17.4.0", "slugify": "^1.6.6", - "tauri-plugin-log-api": "github:tauri-apps/tauri-plugin-log#v1", + "tauri-plugin-log-api": "github:tauri-apps/tauri-plugin-log#v2", "uuid": "^9.0.0", "xml-formatter": "^3.6.2" }, "devDependencies": { "@tailwindcss/nesting": "^0.0.0-insiders.565cd3e", - "@tauri-apps/cli": "^1.5.10", + "@tauri-apps/cli": "^2.0.0-beta.13", "@types/node": "^18.7.10", "@types/papaparse": "^5.3.7", "@types/parse-color": "^1.0.1", @@ -84,15 +89,6 @@ "vitest": "^1.3.0" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -105,56 +101,56 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -179,14 +175,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -253,28 +249,28 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -284,51 +280,51 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -344,37 +340,38 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dev": true, "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -384,12 +381,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.5.tgz", + "integrity": "sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -399,12 +396,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", + "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -414,9 +411,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -425,33 +422,33 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -460,13 +457,13 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -498,9 +495,9 @@ "integrity": "sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==" }, "node_modules/@codemirror/autocomplete": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.12.0.tgz", - "integrity": "sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.16.0.tgz", + "integrity": "sha512-P/LeCTtZHRTCU4xQsa89vSKWecYv1ZqwzOd5topheGRf+qtacFgBeIMQi3eL8Kt/BUNvxUWkx+5qP2jlGoARrg==", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -515,9 +512,9 @@ } }, "node_modules/@codemirror/commands": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.3.3.tgz", - "integrity": "sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.5.0.tgz", + "integrity": "sha512-rK+sj4fCAN/QfcY9BEzYMgp4wwL/q5aj/VfNSoH1RWPF9XS/dUwBkvlL3hpWgEjOqlpdN1uLC9UkjJ4tmyjJYg==", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.4.0", @@ -526,9 +523,9 @@ } }, "node_modules/@codemirror/lang-javascript": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.1.tgz", - "integrity": "sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz", + "integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", @@ -549,13 +546,14 @@ } }, "node_modules/@codemirror/lang-xml": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.0.2.tgz", - "integrity": "sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz", + "integrity": "sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", "@lezer/common": "^1.0.0", "@lezer/xml": "^1.0.0" } @@ -574,9 +572,9 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.5.0.tgz", - "integrity": "sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.7.0.tgz", + "integrity": "sha512-LTLOL2nT41ADNSCCCCw8Q/UmdAFzB23OUYSjsHTdsVaH0XEo+orhuqbDNWzrzodm14w6FOxqxpmy4LF8Lixqjw==", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", @@ -594,14 +592,14 @@ } }, "node_modules/@codemirror/state": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.0.tgz", - "integrity": "sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", + "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==" }, "node_modules/@codemirror/view": { - "version": "6.24.0", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.24.0.tgz", - "integrity": "sha512-zK6m5pNkdhdJl8idPP1gA4N8JKTiSsOz8U/Iw+C1ChMwyLG7+MLiNXnH/wFuAk6KeGEe33/adOiAh5jMqee03w==", + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.26.3.tgz", + "integrity": "sha512-gmqxkPALZjkgSxIeeweY/wGQXBfwTUaLs8h7OKtSwfbj9Ct3L11lD+u1sS7XHppxFQoMDiMDp07P9f3I2jWOHw==", "dependencies": { "@codemirror/state": "^6.4.0", "style-mod": "^4.1.0", @@ -670,9 +668,9 @@ "optional": true }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", "cpu": [ "ppc64" ], @@ -686,9 +684,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -702,9 +700,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], @@ -718,9 +716,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ "x64" ], @@ -734,9 +732,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], @@ -750,9 +748,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "cpu": [ "x64" ], @@ -766,9 +764,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "cpu": [ "arm64" ], @@ -782,9 +780,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "cpu": [ "x64" ], @@ -798,9 +796,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "cpu": [ "arm" ], @@ -814,9 +812,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "cpu": [ "arm64" ], @@ -830,9 +828,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "cpu": [ "ia32" ], @@ -846,9 +844,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -862,9 +860,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "cpu": [ "mips64el" ], @@ -878,9 +876,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "cpu": [ "ppc64" ], @@ -894,9 +892,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "cpu": [ "riscv64" ], @@ -910,9 +908,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "cpu": [ "s390x" ], @@ -926,9 +924,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "cpu": [ "x64" ], @@ -942,9 +940,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "cpu": [ "x64" ], @@ -958,9 +956,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ "x64" ], @@ -974,9 +972,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ "x64" ], @@ -990,9 +988,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], @@ -1006,9 +1004,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ "ia32" ], @@ -1022,9 +1020,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ "x64" ], @@ -1084,6 +1082,16 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -1099,6 +1107,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -1112,9 +1132,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1134,6 +1154,28 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1148,9 +1190,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -1250,13 +1292,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -1271,9 +1313,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -1284,9 +1326,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1303,9 +1345,9 @@ "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==" }, "node_modules/@lezer/generator": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@lezer/generator/-/generator-1.6.0.tgz", - "integrity": "sha512-mDwFNchv4jBEoZBaZbr5GlKR7BM6W/ZanTOZN6p4avuzcmYHTZ0nIbwtBqvXoeBrqmFSvL2zHL5TX9FWkXKc2w==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@lezer/generator/-/generator-1.7.0.tgz", + "integrity": "sha512-IJ16tx3biLKlCXUzcK4v8S10AVa2BSM2rB12rtAL6f1hL2TS/HQQlGCoWRvanlL2J4mCYEEIv9uG7n4kVMkVDA==", "dependencies": { "@lezer/common": "^1.1.0", "@lezer/lr": "^1.3.0" @@ -1323,9 +1365,9 @@ } }, "node_modules/@lezer/javascript": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.13.tgz", - "integrity": "sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==", + "version": "1.4.16", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.16.tgz", + "integrity": "sha512-84UXR3N7s11MPQHWgMnjb9571fr19MmXnr5zTv2XX0gHXXUvW3uPJ8GCjKrfTXmSdfktjRK0ayKklw+A13rk4g==", "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.1.3", @@ -1351,9 +1393,9 @@ } }, "node_modules/@lezer/xml": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.4.tgz", - "integrity": "sha512-WmXKb5eX8+rRfZYSNRR5TPee/ZoDgBdVS/rj1VCJGDKa5gNldIctQYibCoFVyNhvZsyL/8nHbZJZPM4gnXN2Vw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.5.tgz", + "integrity": "sha512-VFouqOzmUWfIg+tfmpcdV33ewtK+NSwd4ngSe1aG7HFb4BN0ExyY1b8msp+ndFrnlG4V4iC8yXacjFtrwERnaw==", "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.0.0", @@ -1446,9 +1488,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.1.tgz", - "integrity": "sha512-zcU0gM3z+3iqj8UX45AmWY810l3oUmXM7uH4dt5xtzvMhRtYVhKGOmgOd1877dOPPepfCjUv57w+syamWIYe7w==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.0.tgz", + "integrity": "sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==", "engines": { "node": ">=14.0.0" } @@ -1493,9 +1535,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", - "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", "cpu": [ "arm" ], @@ -1506,9 +1548,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", "cpu": [ "arm64" ], @@ -1519,9 +1561,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", - "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", "cpu": [ "arm64" ], @@ -1532,9 +1574,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", - "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", "cpu": [ "x64" ], @@ -1545,9 +1587,22 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", - "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", + "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", "cpu": [ "arm" ], @@ -1558,9 +1613,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", - "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", "cpu": [ "arm64" ], @@ -1571,9 +1626,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", - "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", "cpu": [ "arm64" ], @@ -1583,10 +1638,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", + "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", - "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", "cpu": [ "riscv64" ], @@ -1596,10 +1664,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", + "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", - "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", + "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", "cpu": [ "x64" ], @@ -1610,9 +1691,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", - "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", + "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", "cpu": [ "x64" ], @@ -1623,9 +1704,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", - "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", "cpu": [ "arm64" ], @@ -1636,9 +1717,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", - "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", "cpu": [ "ia32" ], @@ -1649,9 +1730,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", - "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", "cpu": [ "x64" ], @@ -1662,16 +1743,16 @@ ] }, "node_modules/@sagold/json-pointer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@sagold/json-pointer/-/json-pointer-5.1.1.tgz", - "integrity": "sha512-/iskWuyGNu09qy09HYmyLnvzpKryymH9T+vTBi2LdFp1TuKvERDADvPMv2ZkQKsrRklOzivmOz9QXof0dKqvgA==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@sagold/json-pointer/-/json-pointer-5.1.2.tgz", + "integrity": "sha512-+wAhJZBXa6MNxRScg6tkqEbChEHMgVZAhTHVJ60Y7sbtXtu9XA49KfUkdWlS2x78D6H9nryiKePiYozumauPfA==" }, "node_modules/@sagold/json-query": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sagold/json-query/-/json-query-6.1.1.tgz", - "integrity": "sha512-5/Wu0rTnXmO5Uvtm9Of16Vx3mKjSnYA0Um9LgBtyPhIucYlppKgKC4N3g8gD0Fk00a5kizQTs4gwxKPXCpmeww==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@sagold/json-query/-/json-query-6.2.0.tgz", + "integrity": "sha512-7bOIdUE6eHeoWtFm8TvHQHfTVSZuCs+3RpOKmZCDBIOrxpvF/rNFTeuvIyjHva/RR0yVS3kQtr+9TW72LQEZjA==", "dependencies": { - "@sagold/json-pointer": "^5.1.1", + "@sagold/json-pointer": "^5.1.2", "ebnf": "^1.9.1" } }, @@ -1919,9 +2000,9 @@ } }, "node_modules/@swc/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.1.tgz", - "integrity": "sha512-3y+Y8js+e7BbM16iND+6Rcs3jdiL28q3iVtYsCviYSSpP2uUVKkp5sJnCY4pg8AaVvyN7CGQHO7gLEZQ5ByozQ==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.17.tgz", + "integrity": "sha512-tq+mdWvodMBNBBZbwFIMTVGYHe9N7zvEaycVVjfvAx20k1XozHbHhRv+9pEVFJjwRxLdXmtvFZd3QZHRAOpoNQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -1936,16 +2017,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.4.1", - "@swc/core-darwin-x64": "1.4.1", - "@swc/core-linux-arm-gnueabihf": "1.4.1", - "@swc/core-linux-arm64-gnu": "1.4.1", - "@swc/core-linux-arm64-musl": "1.4.1", - "@swc/core-linux-x64-gnu": "1.4.1", - "@swc/core-linux-x64-musl": "1.4.1", - "@swc/core-win32-arm64-msvc": "1.4.1", - "@swc/core-win32-ia32-msvc": "1.4.1", - "@swc/core-win32-x64-msvc": "1.4.1" + "@swc/core-darwin-arm64": "1.4.17", + "@swc/core-darwin-x64": "1.4.17", + "@swc/core-linux-arm-gnueabihf": "1.4.17", + "@swc/core-linux-arm64-gnu": "1.4.17", + "@swc/core-linux-arm64-musl": "1.4.17", + "@swc/core-linux-x64-gnu": "1.4.17", + "@swc/core-linux-x64-musl": "1.4.17", + "@swc/core-win32-arm64-msvc": "1.4.17", + "@swc/core-win32-ia32-msvc": "1.4.17", + "@swc/core-win32-x64-msvc": "1.4.17" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -1957,9 +2038,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.1.tgz", - "integrity": "sha512-ePyfx0348UbR4DOAW24TedeJbafnzha8liXFGuQ4bdXtEVXhLfPngprrxKrAddCuv42F9aTxydlF6+adD3FBhA==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.17.tgz", + "integrity": "sha512-HVl+W4LezoqHBAYg2JCqR+s9ife9yPfgWSj37iIawLWzOmuuJ7jVdIB7Ee2B75bEisSEKyxRlTl6Y1Oq3owBgw==", "cpu": [ "arm64" ], @@ -1973,9 +2054,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.1.tgz", - "integrity": "sha512-eLf4JSe6VkCMdDowjM8XNC5rO+BrgfbluEzAVtKR8L2HacNYukieumN7EzpYCi0uF1BYwu1ku6tLyG2r0VcGxA==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.17.tgz", + "integrity": "sha512-WYRO9Fdzq4S/he8zjW5I95G1zcvyd9yyD3Tgi4/ic84P5XDlSMpBDpBLbr/dCPjmSg7aUXxNQqKqGkl6dQxYlA==", "cpu": [ "x64" ], @@ -1989,9 +2070,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.1.tgz", - "integrity": "sha512-K8VtTLWMw+rkN/jDC9o/Q9SMmzdiHwYo2CfgkwVT29NsGccwmNhCQx6XoYiPKyKGIFKt4tdQnJHKUFzxUqQVtQ==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.17.tgz", + "integrity": "sha512-cgbvpWOvtMH0XFjvwppUCR+Y+nf6QPaGu6AQ5hqCP+5Lv2zO5PG0RfasC4zBIjF53xgwEaaWmGP5/361P30X8Q==", "cpu": [ "arm" ], @@ -2005,9 +2086,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.1.tgz", - "integrity": "sha512-0e8p4g0Bfkt8lkiWgcdiENH3RzkcqKtpRXIVNGOmVc0OBkvc2tpm2WTx/eoCnes2HpTT4CTtR3Zljj4knQ4Fvw==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.17.tgz", + "integrity": "sha512-l7zHgaIY24cF9dyQ/FOWbmZDsEj2a9gRFbmgx2u19e3FzOPuOnaopFj0fRYXXKCmtdx+anD750iBIYnTR+pq/Q==", "cpu": [ "arm64" ], @@ -2021,9 +2102,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.1.tgz", - "integrity": "sha512-b/vWGQo2n7lZVUnSQ7NBq3Qrj85GrAPPiRbpqaIGwOytiFSk8VULFihbEUwDe0rXgY4LDm8z8wkgADZcLnmdUA==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.17.tgz", + "integrity": "sha512-qhH4gr9gAlVk8MBtzXbzTP3BJyqbAfUOATGkyUtohh85fPXQYuzVlbExix3FZXTwFHNidGHY8C+ocscI7uDaYw==", "cpu": [ "arm64" ], @@ -2037,9 +2118,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.1.tgz", - "integrity": "sha512-AFMQlvkKEdNi1Vk2GFTxxJzbICttBsOQaXa98kFTeWTnFFIyiIj2w7Sk8XRTEJ/AjF8ia8JPKb1zddBWr9+bEQ==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.17.tgz", + "integrity": "sha512-vRDFATL1oN5oZMImkwbgSHEkp8xG1ofEASBypze01W1Tqto8t+yo6gsp69wzCZBlxldsvPpvFZW55Jq0Rn+UnA==", "cpu": [ "x64" ], @@ -2053,9 +2134,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.1.tgz", - "integrity": "sha512-QX2MxIECX1gfvUVZY+jk528/oFkS9MAl76e3ZRvG2KC/aKlCQL0KSzcTSm13mOxkDKS30EaGRDRQWNukGpMeRg==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.17.tgz", + "integrity": "sha512-zQNPXAXn3nmPqv54JVEN8k2JMEcMTQ6veVuU0p5O+A7KscJq+AGle/7ZQXzpXSfUCXlLMX4wvd+rwfGhh3J4cw==", "cpu": [ "x64" ], @@ -2069,9 +2150,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.1.tgz", - "integrity": "sha512-OklkJYXXI/tntD2zaY8i3iZldpyDw5q+NAP3k9OlQ7wXXf37djRsHLV0NW4+ZNHBjE9xp2RsXJ0jlOJhfgGoFA==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.17.tgz", + "integrity": "sha512-z86n7EhOwyzxwm+DLE5NoLkxCTme2lq7QZlDjbQyfCxOt6isWz8rkW5QowTX8w9Rdmk34ncrjSLvnHOeLY17+w==", "cpu": [ "arm64" ], @@ -2085,9 +2166,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.1.tgz", - "integrity": "sha512-MBuc3/QfKX9FnLOU7iGN+6yHRTQaPQ9WskiC8s8JFiKQ+7I2p25tay2RplR9dIEEGgVAu6L7auv96LbNTh+FaA==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.17.tgz", + "integrity": "sha512-JBwuSTJIgiJJX6wtr4wmXbfvOswHFj223AumUrK544QV69k60FJ9q2adPW9Csk+a8wm1hLxq4HKa2K334UHJ/g==", "cpu": [ "ia32" ], @@ -2101,9 +2182,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.1.tgz", - "integrity": "sha512-lu4h4wFBb/bOK6N2MuZwg7TrEpwYXgpQf5R7ObNSXL65BwZ9BG8XRzD+dLJmALu8l5N08rP/TrpoKRoGT4WSxw==", + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.17.tgz", + "integrity": "sha512-jFkOnGQamtVDBm3MF5Kq1lgW8vx4Rm1UvJWRUfg+0gx7Uc3Jp3QMFeMNw/rDNQYRDYPG3yunCC+2463ycd5+dg==", "cpu": [ "x64" ], @@ -2123,10 +2204,13 @@ "dev": true }, "node_modules/@swc/types": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", - "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", - "dev": true + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.6.tgz", + "integrity": "sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", @@ -2161,11 +2245,11 @@ } }, "node_modules/@tanstack/match-sorter-utils": { - "version": "8.11.8", - "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.11.8.tgz", - "integrity": "sha512-3VPh0SYMGCa5dWQEqNab87UpCMk+ANWHDP4ALs5PeEW9EpfTAbrezzaOk/OiM52IESViefkoAOYuxdoa04p6aA==", + "version": "8.15.1", + "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.15.1.tgz", + "integrity": "sha512-PnVV3d2poenUM31ZbZi/yXkBu3J7kd5k2u51CGwwNojag451AjTH9N6n41yjXz2fpLeewleyLBmNS6+HcGDlXw==", "dependencies": { - "remove-accents": "0.4.2" + "remove-accents": "0.5.0" }, "engines": { "node": ">=12" @@ -2269,11 +2353,11 @@ } }, "node_modules/@tauri-apps/api": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.5.3.tgz", - "integrity": "sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==", + "version": "2.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.0.0-beta.11.tgz", + "integrity": "sha512-wJRY+fBUm3KpqZDHMIz5HRv+1vlnvRJ/dFxiyY3NlINTx2qXqDou5qWYcP1CuZXsd39InWVPV3FAZvno/kGCkA==", "engines": { - "node": ">= 14.6.0", + "node": ">= 18", "npm": ">= 6.6.0", "yarn": ">= 1.19.1" }, @@ -2283,9 +2367,9 @@ } }, "node_modules/@tauri-apps/cli": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.5.10.tgz", - "integrity": "sha512-8+6NJgqSXqsFAEuUERDDRWrLh24TMT4aisn1qpADvKVX4KlBAKE17KTXHI54XQFR8qLbkUFNzprU4M9PV8ighw==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.0.0-beta.15.tgz", + "integrity": "sha512-3pCvc54QfsRY+i9B7w3Q5jPAGtf8p+g7N/BamWPeiW6YqDqbHi9rNVI3SzrHkRRNOJnzMW8E5a8G0HziOluZGg==", "dev": true, "bin": { "tauri": "tauri.js" @@ -2298,22 +2382,22 @@ "url": "https://opencollective.com/tauri" }, "optionalDependencies": { - "@tauri-apps/cli-darwin-arm64": "1.5.10", - "@tauri-apps/cli-darwin-x64": "1.5.10", - "@tauri-apps/cli-linux-arm-gnueabihf": "1.5.10", - "@tauri-apps/cli-linux-arm64-gnu": "1.5.10", - "@tauri-apps/cli-linux-arm64-musl": "1.5.10", - "@tauri-apps/cli-linux-x64-gnu": "1.5.10", - "@tauri-apps/cli-linux-x64-musl": "1.5.10", - "@tauri-apps/cli-win32-arm64-msvc": "1.5.10", - "@tauri-apps/cli-win32-ia32-msvc": "1.5.10", - "@tauri-apps/cli-win32-x64-msvc": "1.5.10" + "@tauri-apps/cli-darwin-arm64": "2.0.0-beta.15", + "@tauri-apps/cli-darwin-x64": "2.0.0-beta.15", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.0.0-beta.15", + "@tauri-apps/cli-linux-arm64-gnu": "2.0.0-beta.15", + "@tauri-apps/cli-linux-arm64-musl": "2.0.0-beta.15", + "@tauri-apps/cli-linux-x64-gnu": "2.0.0-beta.15", + "@tauri-apps/cli-linux-x64-musl": "2.0.0-beta.15", + "@tauri-apps/cli-win32-arm64-msvc": "2.0.0-beta.15", + "@tauri-apps/cli-win32-ia32-msvc": "2.0.0-beta.15", + "@tauri-apps/cli-win32-x64-msvc": "2.0.0-beta.15" } }, "node_modules/@tauri-apps/cli-darwin-arm64": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.10.tgz", - "integrity": "sha512-8dqHaGFKFUEMv3CfEyRP0Ebq28X4Oz74bdi393nBZVqbZM8SN6JdB7kXNb3o3W1TMNSu0M71e6x06YvXSNWvXQ==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0-beta.15.tgz", + "integrity": "sha512-M4owBLoRdJb2/IK48KOQDU3j5xrjqGxa539rDXMjvaKydBk8x+aLdk3xZNsk/owHTI1GnrQZsPCMQaOgetYHaw==", "cpu": [ "arm64" ], @@ -2327,9 +2411,9 @@ } }, "node_modules/@tauri-apps/cli-darwin-x64": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.5.10.tgz", - "integrity": "sha512-qb/9H2FgGRAZPlPj5ingwgpI9B1BUWBUjJpjP+XzSkgjfSQVs3mbdCFz+knGIfrbpw/rBfdOt9BM7biWqIml3Q==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.0.0-beta.15.tgz", + "integrity": "sha512-ECpatfJdT4xKyFoE7tNEtTUIRxjQ2XSXa0TQkP3g7Kn7H/jRse+7pYe69jASA7shixajatAwmD4bXNT8jYRyNA==", "cpu": [ "x64" ], @@ -2343,9 +2427,9 @@ } }, "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.5.10.tgz", - "integrity": "sha512-iYwfKHGQU0Ezvj5OOhILDiv9VSNm3oouctsvUC4ygOLhpVKXDqQ6nQwJzUZey1KjpBPeM7spOOEYZYxNUgAdZA==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.0.0-beta.15.tgz", + "integrity": "sha512-GQz2nnPwIamzDbmmfGWvmmoLthOkOBs0RO5u72KYAa78ZRFTx7S6AovnxJv48Fq+zeGGdDKoD9+ZG2Ue+sCL4w==", "cpu": [ "arm" ], @@ -2359,9 +2443,9 @@ } }, "node_modules/@tauri-apps/cli-linux-arm64-gnu": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.5.10.tgz", - "integrity": "sha512-kz4tI6Rr8wRuSVrDYpT6mAzHDW/rwPosb2wGatnhKRPb5v9LGPAZflUUUj+AAXnyl6XmD86Rbu7ekkm9BGm1Vw==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.0.0-beta.15.tgz", + "integrity": "sha512-YBIfq0GbmIsWmRy6dVuDv3oMJN7a3R8HGVPMsa1W526AdCxoZDiPOQpSQN4VihJlbebUHxS/HyYF6maCY8uGzA==", "cpu": [ "arm64" ], @@ -2375,9 +2459,9 @@ } }, "node_modules/@tauri-apps/cli-linux-arm64-musl": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.10.tgz", - "integrity": "sha512-HswFaeTplIVY6YSjx+awXfLqB4zwzW3D/8WpmxHY3kyxaE4VnXBhKT86YnlA+qX0qZxgsYr0L0EXxk940lHtKQ==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0-beta.15.tgz", + "integrity": "sha512-2ZBXoShz7UfqVGmc85mhwjI6ckdtrk15V69adxt/x+VS68yK6Ddbj+yqlffpeFNL90fZrsVhFoRIDqgkxtwksQ==", "cpu": [ "arm64" ], @@ -2391,9 +2475,9 @@ } }, "node_modules/@tauri-apps/cli-linux-x64-gnu": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.5.10.tgz", - "integrity": "sha512-sOh7slboFQxJCBH5QFNe1Iw3JF2GPWYsq2TlQ6T8GgFh/cb13bK/a1TJG/gOrsRA7/pkIweaSufjpKpPBzAoGQ==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.0.0-beta.15.tgz", + "integrity": "sha512-cwJqIIdc4Kq9sBl/vYc+Y95iMe+mlTYUj7ZnSn4YAbLKFz432bGg6uBn2qHXFN5jzwXtEOVZiB1zDZ2kveVoAQ==", "cpu": [ "x64" ], @@ -2407,9 +2491,9 @@ } }, "node_modules/@tauri-apps/cli-linux-x64-musl": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.10.tgz", - "integrity": "sha512-fbTZa3Q01ttIKg6s9rhWGRfdOI23zIPa6loVz6YafHAzr3WLLEXSuG2fI/+01TdX9xdr6glttu8j3H5xE5oDgw==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0-beta.15.tgz", + "integrity": "sha512-nNuxZ8/qs0vQbdLO2hovskZGxwGn2z4x1QFJuL4xwd6Tryy9vVcznvyZS+t/72dCLoIkY9pKZQq5nYtAHYfTEg==", "cpu": [ "x64" ], @@ -2423,9 +2507,9 @@ } }, "node_modules/@tauri-apps/cli-win32-arm64-msvc": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.5.10.tgz", - "integrity": "sha512-Hntd66+Rrjn2dPPHqCVhZSXotNn5u7lfSff/1riIFbR4hZysB1OPlMOEjh51lBYhmcrvhseMfGfwH6D9i7WYKg==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.0.0-beta.15.tgz", + "integrity": "sha512-DXiXMTE00INjBkTgq1CYduMWgUwQ0NvLw+uXfu8BUupA+aOlv9ODhsGu7bZSaxKx4/glwxNAGZum4kQ0E0AxUg==", "cpu": [ "arm64" ], @@ -2439,9 +2523,9 @@ } }, "node_modules/@tauri-apps/cli-win32-ia32-msvc": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.5.10.tgz", - "integrity": "sha512-Kgd3qojNhH7qRsS2RKD1rKgUzk4y/v+SWW8Yr/xNo6FIYZzJChawW+WrYyBBtRoftrhLwm09LSnkR21KlGZxbA==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.0.0-beta.15.tgz", + "integrity": "sha512-ajEQdW2jx2raPp7eDYryJkbBrgI8PIY1dz5ro8FweRrRmbotaUlclsro1kfNMQrfDah8+qfwnRvW3MahOBE5Wg==", "cpu": [ "ia32" ], @@ -2455,9 +2539,9 @@ } }, "node_modules/@tauri-apps/cli-win32-x64-msvc": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.5.10.tgz", - "integrity": "sha512-pvuot24ZeLqQYD3rQHSzHJvUDX/kE18F98yl2mO9IHrHQyasdqlLhr/6kkmOWIvFDqyQNhpFXDzGNPm7yRbB1g==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.0.0-beta.15.tgz", + "integrity": "sha512-yzsSgoiY0PmFiR5LvVOFr1b7h9l3aLPPQFlDG6+kRMrxCo7x7Pbyh4D5cqiMUuZO0QacwSP38EH6w0F88Y+4OA==", "cpu": [ "x64" ], @@ -2470,6 +2554,38 @@ "node": ">= 10" } }, + "node_modules/@tauri-apps/plugin-dialog": { + "version": "2.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.0.0-beta.3.tgz", + "integrity": "sha512-B3KxLjFxCVB3AIYWN/xY9HM6tO7m4u6aQk1t0ZrBToXThowRU9f62527EO0oj0uNlyKlXx20up68NkpdlER0yg==", + "dependencies": { + "@tauri-apps/api": "2.0.0-beta.11" + } + }, + "node_modules/@tauri-apps/plugin-fs": { + "version": "2.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.0.0-beta.3.tgz", + "integrity": "sha512-LBgA7S10NwcitHaugIfmCSkewz45vSz1VOpMHhzvE38i1r1KpuTSHlr3MZ0LLq93tH/lvhYZ+3LAml4Sriwthw==", + "dependencies": { + "@tauri-apps/api": "2.0.0-beta.11" + } + }, + "node_modules/@tauri-apps/plugin-os": { + "version": "2.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-os/-/plugin-os-2.0.0-beta.3.tgz", + "integrity": "sha512-kuTfns6z7z/RKAqij3293fnSsgRHlogO/SzNWziFDGHpijGUm/peH70Cv45LKvHw+7kEMX+nfHFWOZm8UEVy/w==", + "dependencies": { + "@tauri-apps/api": "2.0.0-beta.11" + } + }, + "node_modules/@tauri-apps/plugin-shell": { + "version": "2.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-shell/-/plugin-shell-2.0.0-beta.3.tgz", + "integrity": "sha512-iSFKUJzmdBE194J0q2O3nWgO86tApVsB9kKD4UkB4YNGTIz09hgeXsOIEo3bMfJEmQe54H/zPBzPo9TeuZZFGA==", + "dependencies": { + "@tauri-apps/api": "2.0.0-beta.11" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2561,9 +2677,9 @@ } }, "node_modules/@types/node": { - "version": "18.19.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.17.tgz", - "integrity": "sha512-SzyGKgwPzuWp2SHhlpXKzCX0pIOfcI4V2eF37nNBJOhwlegQ83omtVQ1XxZpDE06V/d6AQvfQdPfnw0tRC//Ng==", + "version": "18.19.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz", + "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==", "devOptional": true, "dependencies": { "undici-types": "~5.26.4" @@ -2591,26 +2707,25 @@ "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", "devOptional": true }, "node_modules/@types/react": { - "version": "18.2.56", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.56.tgz", - "integrity": "sha512-NpwHDMkS/EFZF2dONFQHgkPRwhvgq/OAvIaGQzxGSBmaeR++kTg6njr15Vatz0/2VcCEwJQFi6Jf4Q0qBu0rLA==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", + "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", "devOptional": true, "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", - "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "dependencies": { "@types/react": "*" @@ -2625,12 +2740,6 @@ "@types/node": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "devOptional": true - }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", @@ -2654,25 +2763,25 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.2.tgz", - "integrity": "sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", + "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/type-utils": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2689,19 +2798,19 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.2.tgz", - "integrity": "sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2717,16 +2826,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz", - "integrity": "sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2" + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2734,18 +2843,18 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.0.2.tgz", - "integrity": "sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/utils": "7.0.2", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2761,12 +2870,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.2.tgz", - "integrity": "sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2774,22 +2883,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz", - "integrity": "sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2801,46 +2910,22 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.2.tgz", - "integrity": "sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2851,16 +2936,16 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz", - "integrity": "sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.0.2", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2893,13 +2978,13 @@ } }, "node_modules/@vitest/expect": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.0.tgz", - "integrity": "sha512-7bWt0vBTZj08B+Ikv70AnLRicohYwFgzNjFqo9SxxqHHxSlUJGSXmCRORhOnRMisiUryKMdvsi1n27Bc6jL9DQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", "dev": true, "dependencies": { - "@vitest/spy": "1.3.0", - "@vitest/utils": "1.3.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "chai": "^4.3.10" }, "funding": { @@ -2907,12 +2992,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.3.0.tgz", - "integrity": "sha512-1Jb15Vo/Oy7mwZ5bXi7zbgszsdIBNjc4IqP8Jpr/8RdBC4nF1CTzIAn2dxYvpF1nGSseeL39lfLQ2uvs5u1Y9A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", + "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", "dev": true, "dependencies": { - "@vitest/utils": "1.3.0", + "@vitest/utils": "1.6.0", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -2948,9 +3033,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.0.tgz", - "integrity": "sha512-swmktcviVVPYx9U4SEQXLV6AEY51Y6bZ14jA2yo6TgMxQ3h+ZYiO0YhAHGJNp0ohCFbPAis1R9kK0cvN6lDPQA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", + "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -2962,9 +3047,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.0.tgz", - "integrity": "sha512-AkCU0ThZunMvblDpPKgjIi025UxR8V7MZ/g/EwmAGpjIujLVV2X6rGYGmxE2D4FJbAy0/ijdROHMWa2M/6JVMw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -2974,9 +3059,9 @@ } }, "node_modules/@vitest/utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.0.tgz", - "integrity": "sha512-/LibEY/fkaXQufi4GDlQZhikQsPO2entBKtfuyIpr1jV4DpaeasqkeHjhdOhU24vSHshcSuEyVlWdzvv2XmYCw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -3101,13 +3186,10 @@ } }, "node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "dev": true, - "dependencies": { - "type-fest": "^3.0.0" - }, "engines": { "node": ">=14.16" }, @@ -3189,15 +3271,16 @@ } }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -3216,17 +3299,18 @@ "node": ">=8" } }, - "node_modules/array.prototype.filter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", - "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3236,15 +3320,16 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", - "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", + "es-abstract": "^1.23.2", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -3290,6 +3375,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, "node_modules/array.prototype.tosorted": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", @@ -3340,19 +3437,10 @@ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "dev": true, "funding": [ { @@ -3369,8 +3457,8 @@ } ], "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -3387,10 +3475,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -3441,11 +3532,14 @@ ] }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/boolean": { @@ -3517,13 +3611,11 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -3698,9 +3790,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001587", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", - "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", + "version": "1.0.30001615", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz", + "integrity": "sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==", "dev": true, "funding": [ { @@ -3813,6 +3905,31 @@ "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, + "node_modules/cidr-regex": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-4.0.3.tgz", + "integrity": "sha512-HOwDIy/rhKeMf6uOzxtv7FAbrz8zPjmVKfSpM+U7/bNBXC5rtOyr758jxcptiSx6ZZn5LOhPJT5WWxPAGDV8dw==", + "dependencies": { + "ip-regex": "^5.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cidr-tools": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/cidr-tools/-/cidr-tools-6.4.2.tgz", + "integrity": "sha512-KZC8t2ipCqU2M+ISmTxRDGu9bku5MRU3V1cWyGEFJTZEzRhGvBJvVsbpZO5UAu12fExRFihtYGXAlgFFpmK9jw==", + "dependencies": { + "cidr-regex": "4.0.3", + "ip-bigint": "7.3.0", + "ip-regex": "5.0.0", + "string-natural-compare": "3.0.1" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", @@ -3937,6 +4054,20 @@ "node": ">=8" } }, + "node_modules/clone-regexp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz", + "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==", + "dependencies": { + "is-regexp": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -4006,9 +4137,9 @@ } }, "node_modules/codemirror-json-schema/node_modules/@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "version": "20.12.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", + "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", "dependencies": { "undici-types": "~5.26.4" } @@ -4064,6 +4195,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, "node_modules/configstore": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", @@ -4081,6 +4218,17 @@ "node": ">=4" } }, + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -4234,15 +4382,66 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dataloader": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" }, "node_modules/date-fns": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz", - "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -4335,6 +4534,17 @@ "node": ">=0.10.0" } }, + "node_modules/default-gateway": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-7.2.2.tgz", + "integrity": "sha512-AD7TrdNNPXRZIGw63dw+lnGmT4v7ggZC5NHNJgAYWm5njrwoze1q5JSAW9YuLy2tjnoLUG/r8FEB93MCh9QJPg==", + "dependencies": { + "execa": "^7.1.1" + }, + "engines": { + "node": ">= 16" + } + }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -4520,15 +4730,15 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.673", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", - "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==", + "version": "1.4.756", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.756.tgz", + "integrity": "sha512-RJKZ9+vEBMeiPAvKNWyZjuYyUqMndcP1f335oHqn3BEQbs2NFtVrnK5+6Xg5wSM9TknNNpWghGDUCKGYF+xWXw==", "dev": true }, "node_modules/electron/node_modules/@types/node": { - "version": "16.18.82", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.82.tgz", - "integrity": "sha512-pcDZtkx9z8XYV+ius2P3Ot2VVrcYOfXffBQUBuiszrlUzKSmoDYqo+mV+IoL8iIiIjjtOMvNSmH1hwJ+Q+f96Q==", + "version": "16.18.96", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.96.tgz", + "integrity": "sha512-84iSqGXoO+Ha16j8pRZ/L90vDMKX04QTYMTfYeE1WrjWaZXuchBehGUZEpNgx7JnmlrIHdnABmpjrQjhCnNldQ==", "dev": true }, "node_modules/emoji-regex": { @@ -4584,18 +4794,22 @@ } }, "node_modules/es-abstract": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", - "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.6", + "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", @@ -4603,15 +4817,16 @@ "globalthis": "^1.0.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.1", + "hasown": "^2.0.2", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", @@ -4619,17 +4834,17 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", + "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.1", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -4638,12 +4853,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -4666,40 +4875,51 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", - "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, "dependencies": { - "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.4", + "es-abstract": "^1.23.3", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", + "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -4739,9 +4959,9 @@ "optional": true }, "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, "bin": { @@ -4751,29 +4971,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/escalade": { @@ -4795,16 +5015,16 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -4882,9 +5102,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4938,6 +5158,16 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -4959,6 +5189,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4998,28 +5240,52 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", + "es-iterator-helpers": "^1.0.17", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.10" }, "engines": { "node": ">=4" @@ -5029,9 +5295,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "engines": { "node": ">=10" @@ -5040,6 +5306,16 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -5052,6 +5328,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -5078,6 +5366,22 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -5105,6 +5409,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5151,22 +5465,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -5191,6 +5489,18 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5287,23 +5597,22 @@ "dev": true }, "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^4.1.0", + "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=16.17" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" @@ -5345,9 +5654,9 @@ } }, "node_modules/fast-copy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz", - "integrity": "sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==" }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -5478,9 +5787,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/focus-trap": { @@ -5529,10 +5838,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/format-graphql": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/format-graphql/-/format-graphql-1.4.0.tgz", - "integrity": "sha512-RyhM4rJAqgJ2nb9X7VzCPt+LuhPDjd2W4JtAsSWFzKd4RReVARE00SILdSgA8eDSby8jB3LclhKPFQF7YTQxfg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/format-graphql/-/format-graphql-1.5.0.tgz", + "integrity": "sha512-ZZWcjwJ1IMdnW9l3CeYccC/J7skqOB18tY3autO5OUQuGVZpQu6Es3SThRm25SfiMeZO1+UbzIqnGbjAURu/UA==", "dependencies": { "graphql": "^15.1.0", "yargs": "^15.3.1" @@ -5621,6 +5941,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz", + "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/function.prototype.name": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", @@ -5706,12 +6037,11 @@ } }, "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { - "node": ">=16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5765,6 +6095,28 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/global-agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", @@ -5805,12 +6157,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5943,9 +6296,9 @@ } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -5982,9 +6335,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -6026,12 +6379,11 @@ } }, "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "engines": { - "node": ">=16.17.0" + "node": ">=14.18.0" } }, "node_modules/husky": { @@ -6147,6 +6499,23 @@ "fast-loops": "^1.1.3" } }, + "node_modules/internal-ip": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-8.0.0.tgz", + "integrity": "sha512-e6c3zxr9COnnc29PIz9LffmALOt0XhIJdR7f83DyHcQksL3B40KGmU3Sr1lrHja3i7Zyqo+AbwKZ+nZiMvg/OA==", + "dependencies": { + "cidr-tools": "^6.4.1", + "default-gateway": "^7.2.2", + "is-ip": "^5.0.0", + "p-event": "^5.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sindresorhus/internal-ip?sponsor=1" + } + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -6175,6 +6544,25 @@ "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==", "dev": true }, + "node_modules/ip-bigint": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ip-bigint/-/ip-bigint-7.3.0.tgz", + "integrity": "sha512-2qVAe0Q9+Y+5nGvmogwK9y4kefD5Ks5l/IG0Jo1lhU9gIF34jifhqrwXwzkIl+LC594Q6SyAlngs4p890xsXVw==", + "engines": { + "node": ">=16" + } + }, + "node_modules/ip-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", + "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -6286,6 +6674,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -6384,19 +6787,37 @@ "node": ">=0.10.0" } }, + "node_modules/is-ip": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz", + "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==", + "dependencies": { + "ip-regex": "^5.0.0", + "super-regex": "^0.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -6480,6 +6901,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", @@ -6490,21 +6922,27 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6514,7 +6952,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6568,10 +7005,13 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6589,13 +7029,16 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6719,14 +7162,14 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-library": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/json-schema-library/-/json-schema-library-9.1.2.tgz", - "integrity": "sha512-uQnFb2V+VakLl6XIGGtUQzfjkP31f/dCT5lJq9NOUdypSSpjbWL/V0R2KvoNJp3hU8VErwh9DqVoZPqlC+B3IA==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/json-schema-library/-/json-schema-library-9.3.4.tgz", + "integrity": "sha512-220lm9RVt9BUeF2QhBT711aX4IogUHhPT8Tjhkksc4CUw8WmChFMuf0mJdpDAHDfJDkI064jcZIH8P70HdPAOA==", "dependencies": { - "@sagold/json-pointer": "^5.1.1", - "@sagold/json-query": "^6.1.1", + "@sagold/json-pointer": "^5.1.2", + "@sagold/json-query": "^6.1.3", "deepmerge": "^4.3.1", - "fast-copy": "^3.0.1", + "fast-copy": "^3.0.2", "fast-deep-equal": "^3.1.3", "smtp-address-parser": "1.0.10", "valid-url": "^1.0.9" @@ -6763,12 +7206,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -6906,6 +7343,62 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/listr2": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", @@ -7120,15 +7613,12 @@ } }, "node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" } }, "node_modules/make-dir": { @@ -7186,8 +7676,7 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", @@ -7210,9 +7699,9 @@ } }, "node_modules/mime": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.1.tgz", - "integrity": "sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.3.tgz", + "integrity": "sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ==", "funding": [ "https://github.com/sponsors/broofa" ], @@ -7227,7 +7716,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, "engines": { "node": ">=12" }, @@ -7245,15 +7733,17 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -7266,23 +7756,23 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", + "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/mlly": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", - "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.0.tgz", + "integrity": "sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==", "dev": true, "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" + "pkg-types": "^1.1.0", + "ufo": "^1.5.3" } }, "node_modules/moo": { @@ -7490,6 +7980,16 @@ "node": ">= 4" } }, + "node_modules/npm-run-all/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/npm-run-all/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -7506,6 +8006,18 @@ "node": ">=4.8" } }, + "node_modules/npm-run-all/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/npm-run-all/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -7570,10 +8082,9 @@ } }, "node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", - "dev": true, + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dependencies": { "path-key": "^4.0.0" }, @@ -7588,7 +8099,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, "engines": { "node": ">=12" }, @@ -7654,28 +8164,29 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7685,40 +8196,45 @@ } }, "node_modules/object.groupby": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", - "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "dependencies": { - "array.prototype.filter": "^1.0.3", - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0" + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", "dev": true, "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7740,7 +8256,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, "dependencies": { "mimic-fn": "^4.0.0" }, @@ -7752,17 +8267,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -7777,6 +8292,20 @@ "node": ">=8" } }, + "node_modules/p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "dependencies": { + "p-timeout": "^5.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -7816,6 +8345,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -7977,11 +8517,11 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -7992,9 +8532,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "engines": { "node": "14 || >=16.14" } @@ -8075,20 +8615,29 @@ } }, "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", + "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", "dev": true, "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" + "confbox": "^0.1.7", + "mlly": "^1.6.1", + "pathe": "^1.1.2" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -8106,7 +8655,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -8226,9 +8775,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8302,9 +8851,9 @@ } }, "node_modules/pretty-format/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, "node_modules/progress": { @@ -8424,9 +8973,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -8559,15 +9108,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-fast-compare": { @@ -8597,20 +9146,20 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/react-router": { - "version": "6.22.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.1.tgz", - "integrity": "sha512-0pdoRGwLtemnJqn1K0XHUbnKiX0S4X8CgvVVmHGOWmofESj31msHo/1YiqcJWK7Wxfq2a4uvvtS01KAQyWK/CQ==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.0.tgz", + "integrity": "sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==", "dependencies": { - "@remix-run/router": "1.15.1" + "@remix-run/router": "1.16.0" }, "engines": { "node": ">=14.0.0" @@ -8620,12 +9169,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.1.tgz", - "integrity": "sha512-iwMyyyrbL7zkKY7MRjOVRy+TMnS/OPusaFVxM2P11x9dzSzGmLsebkCvYirGq0DWB9K9hOspHYYtDz33gE5Duw==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.0.tgz", + "integrity": "sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==", "dependencies": { - "@remix-run/router": "1.15.1", - "react-router": "6.22.1" + "@remix-run/router": "1.16.0", + "react-router": "6.23.0" }, "engines": { "node": ">=14.0.0" @@ -8731,16 +9280,16 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", - "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0", - "get-intrinsic": "^1.2.3", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -8797,9 +9346,9 @@ } }, "node_modules/remove-accents": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", - "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" }, "node_modules/require-directory": { "version": "2.1.1", @@ -8902,12 +9451,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -8965,9 +9508,9 @@ } }, "node_modules/rollup": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", - "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -8980,19 +9523,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.12.0", - "@rollup/rollup-android-arm64": "4.12.0", - "@rollup/rollup-darwin-arm64": "4.12.0", - "@rollup/rollup-darwin-x64": "4.12.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", - "@rollup/rollup-linux-arm64-gnu": "4.12.0", - "@rollup/rollup-linux-arm64-musl": "4.12.0", - "@rollup/rollup-linux-riscv64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-musl": "4.12.0", - "@rollup/rollup-win32-arm64-msvc": "4.12.0", - "@rollup/rollup-win32-ia32-msvc": "4.12.0", - "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@rollup/rollup-android-arm-eabi": "4.17.2", + "@rollup/rollup-android-arm64": "4.17.2", + "@rollup/rollup-darwin-arm64": "4.17.2", + "@rollup/rollup-darwin-x64": "4.17.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", + "@rollup/rollup-linux-arm-musleabihf": "4.17.2", + "@rollup/rollup-linux-arm64-gnu": "4.17.2", + "@rollup/rollup-linux-arm64-musl": "4.17.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", + "@rollup/rollup-linux-riscv64-gnu": "4.17.2", + "@rollup/rollup-linux-s390x-gnu": "4.17.2", + "@rollup/rollup-linux-x64-gnu": "4.17.2", + "@rollup/rollup-linux-x64-musl": "4.17.2", + "@rollup/rollup-win32-arm64-msvc": "4.17.2", + "@rollup/rollup-win32-ia32-msvc": "4.17.2", + "@rollup/rollup-win32-x64-msvc": "4.17.2", "fsevents": "~2.3.2" } }, @@ -9027,13 +9573,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -9082,9 +9628,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -9177,50 +9723,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9268,12 +9802,12 @@ } }, "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" @@ -9292,15 +9826,9 @@ "dev": true }, "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/slash": { "version": "3.0.0", @@ -9377,9 +9905,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -9484,6 +10012,11 @@ "node": ">=0.6.19" } }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, "node_modules/string-width": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", @@ -9562,34 +10095,41 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.padend": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", - "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9599,14 +10139,15 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9616,28 +10157,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9688,7 +10232,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, "engines": { "node": ">=12" }, @@ -9709,32 +10252,32 @@ } }, "node_modules/strip-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", - "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", "dev": true, "dependencies": { - "js-tokens": "^8.0.2" + "js-tokens": "^9.0.0" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/strip-literal/node_modules/js-tokens": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", - "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", "dev": true }, "node_modules/style-mod": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz", - "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==" + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==" }, "node_modules/stylis": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", - "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" }, "node_modules/sucrase": { "version": "3.35.0", @@ -9757,14 +10300,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -9774,15 +10309,15 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -9794,20 +10329,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -9820,6 +10341,22 @@ "node": ">= 8.0" } }, + "node_modules/super-regex": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz", + "integrity": "sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==", + "dependencies": { + "clone-regexp": "^3.0.0", + "function-timeout": "^0.1.0", + "time-span": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/superjson": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/superjson/-/superjson-1.13.3.tgz", @@ -9866,9 +10403,9 @@ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" }, "node_modules/tailwindcss": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", - "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -9878,7 +10415,7 @@ "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.19.1", + "jiti": "^1.21.0", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", @@ -9928,11 +10465,12 @@ } }, "node_modules/tauri-plugin-log-api": { - "version": "0.0.0", - "resolved": "git+ssh://git@github.com/tauri-apps/tauri-plugin-log.git#19f5dcc0425e9127d2c591780e5047b83e77a7c2", + "name": "@tauri-apps/plugin-log", + "version": "2.0.0-beta.4", + "resolved": "git+ssh://git@github.com/tauri-apps/tauri-plugin-log.git#1dc096891b697dc9af1241450c4608cbc33695da", "license": "MIT or APACHE-2.0", "dependencies": { - "@tauri-apps/api": "1.5.3" + "@tauri-apps/api": "2.0.0-beta.11" } }, "node_modules/term-size": { @@ -10046,12 +10584,6 @@ "node": ">=0.10.0" } }, - "node_modules/term-size/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/term-size/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -10103,6 +10635,20 @@ "node": ">=10" } }, + "node_modules/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", + "dependencies": { + "convert-hrtime": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -10113,15 +10659,15 @@ } }, "node_modules/tinybench": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", - "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", + "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", "dev": true }, "node_modules/tinypool": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", - "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", "dev": true, "engines": { "node": ">=14.0.0" @@ -10167,9 +10713,9 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/ts-api-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", - "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { "node": ">=16" @@ -10239,24 +10785,25 @@ } }, "node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true, + "optional": true, "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typed-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", - "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "is-typed-array": "^1.1.13" }, @@ -10265,15 +10812,16 @@ } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -10283,16 +10831,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -10302,23 +10851,29 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -10329,9 +10884,9 @@ } }, "node_modules/ufo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", - "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, "node_modules/unbox-primitive": { @@ -10385,9 +10940,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", "dev": true, "funding": [ { @@ -10404,7 +10959,7 @@ } ], "dependencies": { - "escalade": "^3.1.1", + "escalade": "^3.1.2", "picocolors": "^1.0.0" }, "bin": { @@ -10457,9 +11012,9 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -10497,14 +11052,14 @@ } }, "node_modules/vite": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.3.tgz", - "integrity": "sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", "dev": true, "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" @@ -10552,9 +11107,9 @@ } }, "node_modules/vite-node": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.3.0.tgz", - "integrity": "sha512-D/oiDVBw75XMnjAXne/4feCkCEwcbr2SU1bjAhCcfI5Bq3VoOHji8/wCPAfUkDIeohJ5nSZ39fNxM3dNZ6OBOA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -10602,16 +11157,16 @@ } }, "node_modules/vitest": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.3.0.tgz", - "integrity": "sha512-V9qb276J1jjSx9xb75T2VoYXdO1UKi+qfflY7V7w93jzX7oA/+RtYE6TcifxksxsZvygSSMwu2Uw6di7yqDMwg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", + "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", "dev": true, "dependencies": { - "@vitest/expect": "1.3.0", - "@vitest/runner": "1.3.0", - "@vitest/snapshot": "1.3.0", - "@vitest/spy": "1.3.0", - "@vitest/utils": "1.3.0", + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -10623,9 +11178,9 @@ "std-env": "^3.5.0", "strip-literal": "^2.0.0", "tinybench": "^2.5.1", - "tinypool": "^0.8.2", + "tinypool": "^0.8.3", "vite": "^5.0.0", - "vite-node": "1.3.0", + "vite-node": "1.6.0", "why-is-node-running": "^2.2.2" }, "bin": { @@ -10640,8 +11195,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.3.0", - "@vitest/ui": "1.3.0", + "@vitest/browser": "1.6.0", + "@vitest/ui": "1.6.0", "happy-dom": "*", "jsdom": "*" }, @@ -10666,6 +11221,62 @@ } } }, + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/vitest/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/vscode-languageserver-types": { "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", @@ -10747,15 +11358,18 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10767,16 +11381,16 @@ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10856,6 +11470,15 @@ "node": ">=4" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -11002,12 +11625,6 @@ "signal-exit": "^3.0.2" } }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", diff --git a/package.json b/package.json index 3b51d80d..229767b1 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,9 @@ "version": "0.0.0", "type": "module", "scripts": { - "start": "npm run build:plugins && npm run tauri-dev", - "tauri-dev": "tauri dev --no-watch --config ./src-tauri/tauri-dev.conf.json", + "start": "npm run build:plugins && npm run tauri-dev:desktop", + "tauri-dev:desktop": "tauri dev --no-watch --config ./src-tauri/tauri-dev.conf.json", + "tauri-dev:ios": "tauri ios dev --no-watch --config ./src-tauri/tauri-dev.conf.json", "tauri-build": "tauri build", "tauri": "tauri", "build": "npm run build:frontend", @@ -40,7 +41,11 @@ "@tanstack/react-query": "^4.28.0", "@tanstack/react-query-devtools": "^4.28.0", "@tanstack/react-query-persist-client": "^4.28.0", - "@tauri-apps/api": "^1.5.3", + "@tauri-apps/api": ">=2.0.0-beta.0", + "@tauri-apps/plugin-dialog": ">=2.0.0-beta.0", + "@tauri-apps/plugin-fs": ">=2.0.0-beta.0", + "@tauri-apps/plugin-os": ">=2.0.0-beta.0", + "@tauri-apps/plugin-shell": ">=2.0.0-beta.0", "buffer": "^6.0.3", "classnames": "^2.3.2", "cm6-graphql": "^0.0.9", @@ -62,17 +67,18 @@ "react-router-dom": "^6.8.1", "react-use": "^17.4.0", "slugify": "^1.6.6", - "tauri-plugin-log-api": "github:tauri-apps/tauri-plugin-log#v1", + "tauri-plugin-log-api": "github:tauri-apps/tauri-plugin-log#v2", "uuid": "^9.0.0", "xml-formatter": "^3.6.2" }, "devDependencies": { "@tailwindcss/nesting": "^0.0.0-insiders.565cd3e", - "@tauri-apps/cli": "^1.5.10", + "@tauri-apps/cli": ">=2.0.0-beta.0", "@types/node": "^18.7.10", "@types/papaparse": "^5.3.7", "@types/parse-color": "^1.0.1", "@types/parse-json": "^4.0.0", + "internal-ip": "^8.0.0", "@types/react": "^18.0.31", "@types/react-dom": "^18.0.11", "@types/uuid": "^9.0.1", @@ -95,7 +101,7 @@ "react-devtools": "^4.27.2", "tailwindcss": "^3.2.7", "typescript": "^5.3.3", - "vite": "^5.1.1", + "vite": "^5.0.0", "vite-plugin-svgr": "^4.2.0", "vite-plugin-top-level-await": "^1.4.1", "vitest": "^1.3.0" diff --git a/src-tauri/.cargo/config.toml b/src-tauri/.cargo/config.toml new file mode 100644 index 00000000..886913ab --- /dev/null +++ b/src-tauri/.cargo/config.toml @@ -0,0 +1,4 @@ +[build] +target = "aarch64-apple-darwin" + +[target] diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index e07bcd6a..5b197e7c 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -17,6 +17,28 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.11", + "once_cell", + "version_check 0.9.4", +] + [[package]] name = "ahash" version = "0.8.11" @@ -66,6 +88,24 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +[[package]] +name = "android_log-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" + +[[package]] +name = "android_logger" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c494134f746c14dc653a35a4ea5aca24ac368529da5370ecf41fe0341c35772f" +dependencies = [ + "android_log-sys", + "env_logger", + "log", + "once_cell", +] + [[package]] name = "android_system_properties" version = "0.1.5" @@ -81,6 +121,54 @@ version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ashpd" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd884d7c72877a94102c3715f3b1cd09ff4fac28221add3e57cfbe25c236d093" +dependencies = [ + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.8.5", + "serde", + "serde_repr", + "tokio", + "url", + "zbus", +] + +[[package]] +name = "async-broadcast" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb" +dependencies = [ + "event-listener 5.3.0", + "event-listener-strategy 0.5.1", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" +dependencies = [ + "concurrent-queue", + "event-listener 5.3.0", + "event-listener-strategy 0.5.1", + "futures-core", + "pin-project-lite", +] + [[package]] name = "async-compression" version = "0.4.6" @@ -95,6 +183,85 @@ dependencies = [ "tokio", ] +[[package]] +name = "async-io" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.3.0", + "futures-lite", + "rustix", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-recursion" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c5ef0ede93efbf733c1a727f3b6b5a1060bbedd5600183e66f6e4be4af0ec5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "async-signal" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afe66191c335039c7bb78f99dc7520b0cbb166b3a1cb33a03f53d8a1c6f2afda" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.52.0", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -114,9 +281,15 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] +[[package]] +name = "async-task" +version = "4.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" + [[package]] name = "async-trait" version = "0.1.77" @@ -125,31 +298,30 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] name = "atk" -version = "0.15.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +checksum = "b4af014b17dd80e8af9fa689b2d4a211ddba6eb583c1622f35d0cb543f6b17e4" dependencies = [ "atk-sys", - "bitflags 1.3.2", "glib", "libc", ] [[package]] name = "atk-sys" -version = "0.15.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.0", + "system-deps", ] [[package]] @@ -161,6 +333,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.1.0" @@ -178,9 +356,9 @@ dependencies = [ "bitflags 1.3.2", "bytes", "futures-util", - "http", - "http-body", - "hyper", + "http 0.2.10", + "http-body 0.4.5", + "hyper 0.14.27", "itoa 1.0.9", "matchit", "memchr", @@ -204,8 +382,8 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 0.2.10", + "http-body 0.4.5", "mime", "rustversion", "tower-layer", @@ -227,12 +405,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.5" @@ -251,15 +423,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -268,13 +431,25 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" dependencies = [ "serde", ] +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block" version = "0.1.6" @@ -290,16 +465,32 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +dependencies = [ + "async-channel", + "async-lock", + "async-task", + "fastrand", + "futures-io", + "futures-lite", + "piper", + "tracing", +] + [[package]] name = "boa_ast" version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73498e9b2f0aa7db74977afa4d594657611e90587abf0dd564c0b55b4a130163" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "boa_interner", "boa_macros", - "indexmap 2.1.0", + "indexmap 2.2.6", "num-bigint", "rustc-hash", ] @@ -310,7 +501,7 @@ version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16377479d5d6d33896e7acdd1cc698d04a8f72004025bbbddf47558cd29146a6" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "boa_ast", "boa_gc", "boa_icu_provider", @@ -322,7 +513,7 @@ dependencies = [ "dashmap", "fast-float", "icu_normalizer", - "indexmap 2.1.0", + "indexmap 2.2.6", "itertools", "num-bigint", "num-integer", @@ -378,7 +569,7 @@ dependencies = [ "boa_gc", "boa_macros", "hashbrown 0.14.3", - "indexmap 2.1.0", + "indexmap 2.2.6", "once_cell", "phf 0.11.2", "rustc-hash", @@ -393,7 +584,7 @@ checksum = "005fa0c5bd20805466dda55eb34cd709bb31a2592bb26927b47714eeed6914d8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "synstructure", ] @@ -403,7 +594,7 @@ version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e09afb035377a9044443b598187a7d34cd13164617182a4d7c348522ee3f052" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "boa_ast", "boa_icu_provider", "boa_interner", @@ -439,6 +630,30 @@ dependencies = [ "rustc-hash", ] +[[package]] +name = "borsh" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d4d6dafc1a3bb54687538972158f07b2c948bc57d5890df22c0739098b3028" +dependencies = [ + "borsh-derive", + "cfg_aliases 0.1.1", +] + +[[package]] +name = "borsh-derive" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4918709cc4dd777ad2b6303ed03cb37f3ca0ccede8c1b0d28ac6db8f4710e0" +dependencies = [ + "once_cell", + "proc-macro-crate 2.0.2", + "proc-macro2", + "quote", + "syn 2.0.58", + "syn_derive", +] + [[package]] name = "brotli" version = "3.4.0" @@ -460,16 +675,6 @@ dependencies = [ "alloc-stdlib", ] -[[package]] -name = "bstr" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "bumpalo" version = "3.14.0" @@ -478,19 +683,42 @@ checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byte-unit" -version = "4.0.19" +version = "5.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da78b32057b8fdfc352504708feeba7216dcd65a2c9ab02978cbd288d1279b6c" +checksum = "33ac19bdf0b2665407c39d82dbc937e951e7e2001609f0fb32edd0af45a2d63e" dependencies = [ + "rust_decimal", "serde", "utf8-width", ] [[package]] -name = "bytemuck" -version = "1.14.0" +name = "bytecheck" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytemuck" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" [[package]] name = "byteorder" @@ -508,37 +736,91 @@ dependencies = [ ] [[package]] -name = "cairo-rs" -version = "0.15.12" +name = "bzip2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" dependencies = [ - "bitflags 1.3.2", + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.5.0", "cairo-sys-rs", "glib", "libc", + "once_cell", "thiserror", ] [[package]] name = "cairo-sys-rs" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" dependencies = [ "glib-sys", "libc", - "system-deps 6.2.0", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", ] [[package]] name = "cargo_toml" -version = "0.15.3" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" dependencies = [ "serde", - "toml 0.7.8", + "toml 0.8.2", ] [[package]] @@ -547,6 +829,7 @@ version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ + "jobserver", "libc", ] @@ -567,15 +850,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "cfg-expr" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" -dependencies = [ - "smallvec", -] - [[package]] name = "cfg-expr" version = "0.15.5" @@ -592,6 +866,18 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cfg_aliases" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e53693616d3075149f4ead59bdeecd204ac6b8192d8969757601b74bddf00f" + [[package]] name = "chrono" version = "0.4.31" @@ -607,28 +893,22 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "cobs" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" -[[package]] -name = "cocoa" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation", - "core-foundation", - "core-graphics 0.22.3", - "foreign-types 0.3.2", - "libc", - "objc", -] - [[package]] name = "cocoa" version = "0.25.0" @@ -639,7 +919,7 @@ dependencies = [ "block", "cocoa-foundation", "core-foundation", - "core-graphics 0.23.1", + "core-graphics", "foreign-types 0.5.0", "libc", "objc", @@ -659,12 +939,6 @@ dependencies = [ "objc", ] -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - [[package]] name = "colored" version = "1.9.4" @@ -686,12 +960,27 @@ dependencies = [ "memchr", ] +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "const-oid" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "convert_case" version = "0.4.0" @@ -780,19 +1069,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" -[[package]] -name = "core-graphics" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", - "foreign-types 0.3.2", - "libc", -] - [[package]] name = "core-graphics" version = "0.23.1" @@ -919,7 +1195,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -929,7 +1205,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -953,7 +1229,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -964,7 +1240,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -1015,6 +1291,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -1075,7 +1362,39 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.3", +] + +[[package]] +name = "dlopen2" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", ] [[package]] @@ -1084,6 +1403,15 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +dependencies = [ + "serde", +] + [[package]] name = "dtoa" version = "1.0.9" @@ -1105,6 +1433,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + [[package]] name = "either" version = "1.9.0" @@ -1123,7 +1457,7 @@ dependencies = [ "cc", "memchr", "rustc_version", - "toml 0.8.8", + "toml 0.8.2", "vswhom", "winreg 0.51.0", ] @@ -1149,6 +1483,43 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enumflags2" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "log", + "regex", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -1182,6 +1553,48 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" +dependencies = [ + "event-listener 5.3.0", + "pin-project-lite", +] + [[package]] name = "fast-float" version = "0.2.0" @@ -1225,14 +1638,14 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", - "windows-sys 0.48.0", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", ] [[package]] @@ -1295,7 +1708,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -1319,6 +1732,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futf" version = "0.1.5" @@ -1388,6 +1807,19 @@ version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.29" @@ -1396,7 +1828,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -1440,11 +1872,10 @@ dependencies = [ [[package]] name = "gdk" -version = "0.15.4" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +checksum = "f5ba081bdef3b75ebcdbfc953699ed2d7417d6bd853347a42a37d76406a33646" dependencies = [ - "bitflags 1.3.2", "cairo-rs", "gdk-pixbuf", "gdk-sys", @@ -1456,35 +1887,35 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.15.11" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" dependencies = [ - "bitflags 1.3.2", "gdk-pixbuf-sys", "gio", "glib", "libc", + "once_cell", ] [[package]] name = "gdk-pixbuf-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" dependencies = [ "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.0", + "system-deps", ] [[package]] name = "gdk-sys" -version = "0.15.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -1494,33 +1925,47 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 6.2.0", + "system-deps", ] [[package]] name = "gdkwayland-sys" -version = "0.15.3" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +checksum = "a90fbf5c033c65d93792192a49a8efb5bb1e640c419682a58bb96f5ae77f3d4a" dependencies = [ "gdk-sys", "glib-sys", "gobject-sys", "libc", "pkg-config", - "system-deps 6.2.0", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2ea8a4909d530f79921290389cbd7c34cb9d623bfe970eaae65ca5f9cd9cce" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", ] [[package]] name = "gdkx11-sys" -version = "0.15.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +checksum = "fee8f00f4ee46cad2939b8990f5c70c94ff882c3028f3cc5abf950fa4ab53043" dependencies = [ "gdk-sys", "glib-sys", "libc", - "system-deps 6.2.0", + "system-deps", "x11", ] @@ -1547,6 +1992,16 @@ dependencies = [ "version_check 0.9.4", ] +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + [[package]] name = "getrandom" version = "0.1.16" @@ -1577,49 +2032,54 @@ checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "gio" -version = "0.15.12" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" dependencies = [ - "bitflags 1.3.2", "futures-channel", "futures-core", "futures-io", + "futures-util", "gio-sys", "glib", "libc", "once_cell", + "pin-project-lite", + "smallvec", "thiserror", ] [[package]] name = "gio-sys" -version = "0.15.10" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.0", + "system-deps", "winapi", ] [[package]] name = "glib" -version = "0.15.12" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "futures-channel", "futures-core", "futures-executor", "futures-task", + "futures-util", + "gio-sys", "glib-macros", "glib-sys", "gobject-sys", "libc", + "memchr", "once_cell", "smallvec", "thiserror", @@ -1627,27 +2087,26 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.15.13" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ - "anyhow", "heck 0.4.1", - "proc-macro-crate", + "proc-macro-crate 2.0.2", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.58", ] [[package]] name = "glib-sys" -version = "0.15.10" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" dependencies = [ "libc", - "system-deps 6.2.0", + "system-deps", ] [[package]] @@ -1656,28 +2115,15 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" -[[package]] -name = "globset" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" -dependencies = [ - "aho-corasick", - "bstr", - "fnv", - "log", - "regex", -] - [[package]] name = "gobject-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" dependencies = [ "glib-sys", "libc", - "system-deps 6.2.0", + "system-deps", ] [[package]] @@ -1685,8 +2131,8 @@ name = "grpc" version = "0.1.0" dependencies = [ "anyhow", - "hyper", - "hyper-rustls", + "hyper 0.14.27", + "hyper-rustls 0.24.2", "log", "once_cell", "prost", @@ -1696,6 +2142,7 @@ dependencies = [ "serde", "serde_json", "tauri", + "tauri-plugin-shell", "tokio", "tokio-stream", "tonic", @@ -1705,12 +2152,11 @@ dependencies = [ [[package]] name = "gtk" -version = "0.15.5" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +checksum = "93c4f5e0e20b60e10631a5f06da7fe3dda744b05ad0ea71fee2f47adf865890c" dependencies = [ "atk", - "bitflags 1.3.2", "cairo-rs", "field-offset", "futures-channel", @@ -1721,16 +2167,15 @@ dependencies = [ "gtk-sys", "gtk3-macros", "libc", - "once_cell", "pango", "pkg-config", ] [[package]] name = "gtk-sys" -version = "0.15.3" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722" dependencies = [ "atk-sys", "cairo-sys-rs", @@ -1741,21 +2186,20 @@ dependencies = [ "gobject-sys", "libc", "pango-sys", - "system-deps 6.2.0", + "system-deps", ] [[package]] name = "gtk3-macros" -version = "0.15.6" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e" dependencies = [ - "anyhow", - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.58", ] [[package]] @@ -1769,8 +2213,8 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", - "indexmap 2.1.0", + "http 0.2.10", + "indexmap 2.2.6", "slab", "tokio", "tokio-util", @@ -1782,6 +2226,9 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] [[package]] name = "hashbrown" @@ -1789,7 +2236,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash", + "ahash 0.8.11", ] [[package]] @@ -1798,7 +2245,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash", + "ahash 0.8.11", "allocator-api2", ] @@ -1811,15 +2258,6 @@ dependencies = [ "hashbrown 0.14.3", ] -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "heck" version = "0.4.1" @@ -1830,10 +2268,16 @@ dependencies = [ ] [[package]] -name = "hermit-abi" -version = "0.3.3" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -1893,6 +2337,17 @@ dependencies = [ "itoa 1.0.9", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.9", +] + [[package]] name = "http-body" version = "0.4.5" @@ -1900,15 +2355,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", - "http", + "http 0.2.10", "pin-project-lite", ] [[package]] -name = "http-range" -version = "0.1.5" +name = "http-body" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", + "pin-project-lite", +] [[package]] name = "httparse" @@ -1933,8 +2405,8 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", - "http-body", + "http 0.2.10", + "http-body 0.4.5", "httparse", "httpdate", "itoa 1.0.9", @@ -1946,6 +2418,25 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "itoa 1.0.9", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -1953,13 +2444,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.10", + "hyper 0.14.27", "log", - "rustls", + "rustls 0.21.8", "rustls-native-certs", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.3.1", + "hyper-util", + "rustls 0.22.4", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.25.0", + "tower-service", ] [[package]] @@ -1968,7 +2476,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.27", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -1981,12 +2489,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.27", "native-tls", "tokio", "tokio-native-tls", ] +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.3.1", + "pin-project-lite", + "socket2 0.5.5", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.58" @@ -1998,7 +2526,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.51.1", ] [[package]] @@ -2173,36 +2701,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "ignore" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" -dependencies = [ - "globset", - "lazy_static", - "log", - "memchr", - "regex", - "same-file", - "thread_local", - "walkdir", - "winapi-util", -] - -[[package]] -name = "image" -version = "0.24.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "num-rational", - "num-traits", -] - [[package]] name = "indexmap" version = "1.9.3" @@ -2216,9 +2714,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -2227,13 +2725,22 @@ dependencies = [ [[package]] name = "infer" -version = "0.13.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" +checksum = "cb33622da908807a06f9513c19b3c1ad50fab3e4137d82a78107d502075aa199" dependencies = [ "cfb", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "instant" version = "0.1.12" @@ -2249,6 +2756,15 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + [[package]] name = "is-terminal" version = "0.4.9" @@ -2260,6 +2776,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + [[package]] name = "iso8601" version = "0.3.0" @@ -2292,9 +2818,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "javascriptcore-rs" -version = "0.16.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" dependencies = [ "bitflags 1.3.2", "glib", @@ -2303,28 +2829,30 @@ dependencies = [ [[package]] name = "javascriptcore-rs-sys" -version = "0.4.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 5.0.0", + "system-deps", ] [[package]] name = "jni" -version = "0.20.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", + "cfg-if", "combine", "jni-sys", "log", "thiserror", "walkdir", + "windows-sys 0.45.0", ] [[package]] @@ -2333,6 +2861,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.65" @@ -2354,6 +2891,17 @@ dependencies = [ "treediff", ] +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.5.0", + "serde", + "unicode-segmentation", +] + [[package]] name = "kuchikiki" version = "0.8.2" @@ -2376,12 +2924,56 @@ dependencies = [ "spin 0.5.2", ] +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading 0.7.4", + "once_cell", +] + [[package]] name = "libc" version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets 0.52.5", +] + [[package]] name = "libm" version = "0.2.8" @@ -2394,7 +2986,7 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "libc", "redox_syscall 0.4.1", ] @@ -2452,9 +3044,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" dependencies = [ "value-bag", ] @@ -2598,6 +3190,25 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "muda" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f428b4e9db3d17e2f809dfb1ff9ddfbbf16c71790d1656d10aee320877e1392f" +dependencies = [ + "cocoa", + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc", + "once_cell", + "png", + "serde", + "thiserror", + "windows-sys 0.52.0", +] + [[package]] name = "native-tls" version = "0.2.11" @@ -2618,14 +3229,15 @@ dependencies = [ [[package]] name = "ndk" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" dependencies = [ "bitflags 1.3.2", "jni-sys", "ndk-sys", "num_enum 0.5.11", + "raw-window-handle 0.5.2", "thiserror", ] @@ -2637,9 +3249,9 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-sys" -version = "0.3.0" +version = "0.4.1+23.1.7779620" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" dependencies = [ "jni-sys", ] @@ -2650,6 +3262,18 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "libc", + "memoffset", +] + [[package]] name = "nodrop" version = "0.1.14" @@ -2716,12 +3340,17 @@ dependencies = [ ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] @@ -2736,22 +3365,11 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", "libm", @@ -2791,7 +3409,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -2803,10 +3421,10 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -2878,12 +3496,13 @@ dependencies = [ [[package]] name = "open" -version = "3.2.0" +version = "5.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" +checksum = "449f0ff855d85ddbf1edd5b646d65249ead3f5e422aaa86b7d2d0b049b103e32" dependencies = [ + "is-wsl", + "libc", "pathdiff", - "windows-sys 0.42.0", ] [[package]] @@ -2892,7 +3511,7 @@ version = "0.10.59" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -2909,7 +3528,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -2950,14 +3569,24 @@ dependencies = [ ] [[package]] -name = "os_info" -version = "3.7.0" +name = "ordered-stream" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "os_info" +version = "3.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae99c7fa6dd38c7cafe1ec085e804f8f555a2f8659b0dbe03f1f9963a9b51092" dependencies = [ "log", "serde", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -2987,11 +3616,11 @@ dependencies = [ [[package]] name = "pango" -version = "0.15.10" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" dependencies = [ - "bitflags 1.3.2", + "gio", "glib", "libc", "once_cell", @@ -3000,16 +3629,22 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.0", + "system-deps", ] +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" version = "0.12.1" @@ -3033,6 +3668,17 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "paste" version = "1.0.14" @@ -3045,6 +3691,18 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", + "hmac", + "password-hash", + "sha2", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -3164,7 +3822,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -3211,7 +3869,7 @@ checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -3226,6 +3884,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkcs1" version = "0.7.5" @@ -3260,7 +3929,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef" dependencies = [ "base64 0.21.5", - "indexmap 2.1.0", + "indexmap 2.2.6", "line-wrap", "quick-xml", "serde", @@ -3280,6 +3949,21 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polling" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "pollster" version = "0.3.0" @@ -3331,6 +4015,16 @@ dependencies = [ "toml_edit 0.19.15", ] +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime", + "toml_edit 0.20.2", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -3390,7 +4084,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -3416,7 +4110,7 @@ checksum = "172da1212c02be2c94901440cb27183cd92bff00ebacca5c323bf7520b8f9c04" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -3484,6 +4178,26 @@ version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "publicsuffix" version = "2.2.3" @@ -3512,6 +4226,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.7.3" @@ -3599,21 +4319,18 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +[[package]] +name = "raw-window-handle" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc3bcbdb1ddfc11e700e62968e6b4cc9c75bb466464ad28fb61c5b2c964418b" + [[package]] name = "redox_syscall" version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -3623,6 +4340,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "redox_users" version = "0.4.4" @@ -3688,6 +4414,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" version = "0.11.23" @@ -3703,9 +4438,9 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", - "http-body", - "hyper", + "http 0.2.10", + "http-body 0.4.5", + "hyper 0.14.27", "hyper-tls", "ipnet", "js-sys", @@ -3727,11 +4462,53 @@ dependencies = [ "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams", "web-sys", "winreg 0.50.0", ] +[[package]] +name = "reqwest" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +dependencies = [ + "base64 0.22.0", + "bytes", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.3.1", + "hyper-rustls 0.26.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.22.4", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls 0.25.0", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 0.26.1", + "winreg 0.52.0", +] + [[package]] name = "reqwest_cookie_store" version = "0.6.0" @@ -3740,32 +4517,32 @@ checksum = "ba529055ea150e42e4eb9c11dcd380a41025ad4d594b0cb4904ef28b037e1061" dependencies = [ "bytes", "cookie_store 0.20.0", - "reqwest", + "reqwest 0.11.23", "url", ] [[package]] name = "rfd" -version = "0.10.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" +checksum = "25a73a7337fc24366edfca76ec521f51877b114e42dab584008209cca6719251" dependencies = [ + "ashpd", "block", "dispatch", "glib-sys", "gobject-sys", "gtk-sys", "js-sys", - "lazy_static", "log", "objc", "objc-foundation", "objc_id", - "raw-window-handle", + "raw-window-handle 0.6.1", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows 0.37.0", + "windows-sys 0.48.0", ] [[package]] @@ -3782,6 +4559,35 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "rkyv" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rsa" version = "0.9.3" @@ -3802,6 +4608,22 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rust_decimal" +version = "1.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -3829,7 +4651,7 @@ version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", @@ -3844,10 +4666,24 @@ checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" dependencies = [ "log", "ring", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.3", + "subtle", + "zeroize", +] + [[package]] name = "rustls-native-certs" version = "0.6.3" @@ -3855,7 +4691,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "schannel", "security-framework", ] @@ -3869,6 +4705,22 @@ dependencies = [ "base64 0.21.5", ] +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.0", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -3879,6 +4731,17 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.102.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -3921,6 +4784,32 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "schemars" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", +] + +[[package]] +name = "schemars_derive" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -3943,6 +4832,12 @@ dependencies = [ "untrusted", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "security-framework" version = "2.9.2" @@ -3997,9 +4892,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.196" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] @@ -4016,20 +4911,31 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa 1.0.9", "ryu", @@ -4044,7 +4950,7 @@ checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -4078,7 +4984,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.1.0", + "indexmap 2.2.6", "serde", "serde_json", "serde_with_macros", @@ -4094,7 +5000,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -4170,6 +5076,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "2.1.0" @@ -4186,6 +5101,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "siphasher" version = "0.3.11" @@ -4228,31 +5149,51 @@ dependencies = [ ] [[package]] -name = "soup2" -version = "0.2.1" +name = "softbuffer" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +checksum = "61d5d17f23326fe0d9b0af282f73f3af666699420fd5f42629efd9c6e7dc166f" dependencies = [ - "bitflags 1.3.2", - "gio", - "glib", - "libc", - "once_cell", - "soup2-sys", + "bytemuck", + "cfg_aliases 0.2.0", + "cocoa", + "core-graphics", + "foreign-types 0.5.0", + "js-sys", + "log", + "objc", + "raw-window-handle 0.6.1", + "redox_syscall 0.5.1", + "wasm-bindgen", + "wayland-sys", + "web-sys", + "windows-sys 0.52.0", ] [[package]] -name = "soup2-sys" -version = "0.2.0" +name = "soup3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" dependencies = [ - "bitflags 1.3.2", "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps 5.0.0", + "system-deps", ] [[package]] @@ -4316,7 +5257,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" dependencies = [ - "ahash", + "ahash 0.8.11", "atoi", "byteorder", "bytes", @@ -4324,7 +5265,7 @@ dependencies = [ "crc", "crossbeam-queue", "either", - "event-listener", + "event-listener 2.5.3", "futures-channel", "futures-core", "futures-intrusive", @@ -4332,14 +5273,14 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.1.0", + "indexmap 2.2.6", "log", "memchr", "once_cell", "paste", "percent-encoding", - "rustls", - "rustls-pemfile", + "rustls 0.21.8", + "rustls-pemfile 1.0.4", "serde", "serde_json", "sha2", @@ -4351,7 +5292,7 @@ dependencies = [ "tokio-stream", "tracing", "url", - "webpki-roots", + "webpki-roots 0.25.4", ] [[package]] @@ -4401,7 +5342,7 @@ checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", "base64 0.21.5", - "bitflags 2.4.1", + "bitflags 2.5.0", "byteorder", "bytes", "chrono", @@ -4445,7 +5386,7 @@ checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", "base64 0.21.5", - "bitflags 2.4.1", + "bitflags 2.5.0", "byteorder", "chrono", "crc", @@ -4510,9 +5451,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "state" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" dependencies = [ "loom", ] @@ -4572,6 +5513,17 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +[[package]] +name = "swift-rs" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bbdb58577b6301f8d17ae2561f32002a5bae056d444e0f69e611e504a276204" +dependencies = [ + "base64 0.21.5", + "serde", + "serde_json", +] + [[package]] name = "syn" version = "1.0.109" @@ -4585,15 +5537,27 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.58", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -4608,21 +5572,17 @@ checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "unicode-xid", ] [[package]] name = "sys-locale" -version = "0.2.4" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a11bd9c338fdba09f7881ab41551932ad42e405f61d01e8406baea71c07aee" +checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0" dependencies = [ - "js-sys", "libc", - "wasm-bindgen", - "web-sys", - "windows-sys 0.45.0", ] [[package]] @@ -4646,56 +5606,36 @@ dependencies = [ "libc", ] -[[package]] -name = "system-deps" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" -dependencies = [ - "cfg-expr 0.9.1", - "heck 0.3.3", - "pkg-config", - "toml 0.5.11", - "version-compare 0.0.11", -] - [[package]] name = "system-deps" version = "6.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331" dependencies = [ - "cfg-expr 0.15.5", + "cfg-expr", "heck 0.4.1", "pkg-config", - "toml 0.8.8", - "version-compare 0.1.1", + "toml 0.8.2", + "version-compare", ] [[package]] name = "tao" -version = "0.16.5" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f5aefd6be4cd3ad3f047442242fd9f57cbfb3e565379f66b5e14749364fa4f" +checksum = "92bcf8885e147b56d6e26751263b45876284f32ca404703f6d3b8f80d16ff4dd" dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "cc", - "cocoa 0.24.1", + "bitflags 2.5.0", + "cocoa", "core-foundation", - "core-graphics 0.22.3", + "core-graphics", "crossbeam-channel", "dispatch", - "gdk", - "gdk-pixbuf", - "gdk-sys", + "dlopen2", + "dpi", "gdkwayland-sys", "gdkx11-sys", - "gio", - "glib", - "glib-sys", "gtk", - "image", "instant", "jni", "lazy_static", @@ -4707,15 +5647,14 @@ dependencies = [ "objc", "once_cell", "parking_lot", - "png", - "raw-window-handle", + "raw-window-handle 0.6.1", "scopeguard", - "serde", "tao-macros", "unicode-segmentation", - "uuid", - "windows 0.39.0", - "windows-implement", + "url", + "windows 0.56.0", + "windows-core 0.56.0", + "windows-version", "x11-dl", ] @@ -4755,88 +5694,82 @@ checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" [[package]] name = "tauri" -version = "1.5.4" +version = "2.0.0-beta.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd27c04b9543776a972c86ccf70660b517ecabbeced9fb58d8b961a13ad129af" +checksum = "5fedd5490eddf117253945f0baedafded43474c971cba546a818f527d5c26266" dependencies = [ "anyhow", - "base64 0.21.5", "bytes", - "cocoa 0.24.1", + "cocoa", "dirs-next", + "dunce", "embed_plist", - "encoding_rs", - "flate2", "futures-util", - "glib", + "getrandom 0.2.11", "glob", "gtk", - "heck 0.4.1", - "http", - "ignore", - "minisign-verify", + "heck 0.5.0", + "http 1.1.0", + "jni", + "libc", + "log", + "mime", + "muda", "objc", - "once_cell", - "open", - "os_info", - "os_pipe", "percent-encoding", - "rand 0.8.5", - "raw-window-handle", - "regex", - "reqwest", - "rfd", - "semver", + "raw-window-handle 0.6.1", + "reqwest 0.12.4", "serde", "serde_json", "serde_repr", "serialize-to-javascript", - "shared_child", "state", - "sys-locale", - "tar", + "swift-rs", + "tauri-build", "tauri-macros", "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "tempfile", "thiserror", - "time", "tokio", + "tray-icon", "url", - "uuid", + "urlpattern", "webkit2gtk", "webview2-com", - "windows 0.39.0", - "zip", + "window-vibrancy", + "windows 0.56.0", ] [[package]] name = "tauri-build" -version = "1.5.1" +version = "2.0.0-beta.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9914a4715e0b75d9f387a285c7e26b5bbfeb1249ad9f842675a82481565c532" +checksum = "abcf98a9b4527567c3e5ca9723431d121e001c2145651b3fa044d22b5e025a7e" dependencies = [ "anyhow", "cargo_toml", "dirs-next", - "heck 0.4.1", + "glob", + "heck 0.5.0", "json-patch", + "schemars", "semver", "serde", "serde_json", "tauri-utils", "tauri-winres", + "toml 0.8.2", "walkdir", ] [[package]] name = "tauri-codegen" -version = "1.4.2" +version = "2.0.0-beta.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1554c5857f65dbc377cefb6b97c8ac77b1cb2a90d30d3448114d5d6b48a77fc" +checksum = "b383f341efb803852b0235a2f330ca90c4c113f422dd6d646b888685b372cace" dependencies = [ - "base64 0.21.5", + "base64 0.22.0", "brotli", "ico", "json-patch", @@ -4844,113 +5777,237 @@ dependencies = [ "png", "proc-macro2", "quote", - "regex", "semver", "serde", "serde_json", "sha2", + "syn 2.0.58", "tauri-utils", "thiserror", "time", + "url", "uuid", "walkdir", ] [[package]] name = "tauri-macros" -version = "1.4.3" +version = "2.0.0-beta.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "277abf361a3a6993ec16bcbb179de0d6518009b851090a01adfea12ac89fa875" +checksum = "71be71718cfe48b149507157bfbad0e2ba0e98ea51658be26c7c677eb188fb0c" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.58", "tauri-codegen", "tauri-utils", ] [[package]] -name = "tauri-plugin-log" -version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#84a2a11c4dc6a6b5569ef2e38bb6c2a4e04a7219" +name = "tauri-plugin" +version = "2.0.0-beta.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6baaee0a083db1e04a1b7a3b0670d86a4d95dd2a54e7cbfb5547762b8ed098d9" dependencies = [ - "byte-unit", - "fern", + "anyhow", + "glob", + "plist", + "schemars", + "serde", + "serde_json", + "tauri-utils", + "toml 0.8.2", + "walkdir", +] + +[[package]] +name = "tauri-plugin-dialog" +version = "2.0.0-beta.6" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#21387ac1997cf8b8b10c90a57b2109bb32e72cea" +dependencies = [ + "dunce", "log", + "raw-window-handle 0.6.1", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.0.0-beta.6" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#21387ac1997cf8b8b10c90a57b2109bb32e72cea" +dependencies = [ + "anyhow", + "glob", + "schemars", "serde", "serde_json", "serde_repr", "tauri", + "tauri-plugin", + "thiserror", + "url", + "uuid", +] + +[[package]] +name = "tauri-plugin-log" +version = "2.0.0-beta.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#21387ac1997cf8b8b10c90a57b2109bb32e72cea" +dependencies = [ + "android_logger", + "byte-unit", + "cocoa", + "fern", + "log", + "objc", + "serde", + "serde_json", + "serde_repr", + "swift-rs", + "tauri", + "tauri-plugin", "time", ] [[package]] -name = "tauri-plugin-window-state" -version = "0.1.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#84a2a11c4dc6a6b5569ef2e38bb6c2a4e04a7219" +name = "tauri-plugin-os" +version = "2.0.0-beta.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#21387ac1997cf8b8b10c90a57b2109bb32e72cea" dependencies = [ - "bincode", - "bitflags 2.4.1", + "gethostname", + "log", + "os_info", + "serde", + "serde_json", + "serialize-to-javascript", + "sys-locale", + "tauri", + "tauri-plugin", + "thiserror", +] + +[[package]] +name = "tauri-plugin-shell" +version = "2.0.0-beta.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#21387ac1997cf8b8b10c90a57b2109bb32e72cea" +dependencies = [ + "encoding_rs", + "log", + "open", + "os_pipe", + "regex", + "schemars", + "serde", + "serde_json", + "shared_child", + "tauri", + "tauri-plugin", + "thiserror", +] + +[[package]] +name = "tauri-plugin-updater" +version = "2.0.0-beta.4" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#21387ac1997cf8b8b10c90a57b2109bb32e72cea" +dependencies = [ + "base64 0.22.0", + "dirs-next", + "flate2", + "futures-util", + "http 1.1.0", + "minisign-verify", + "reqwest 0.12.4", + "semver", + "serde", + "serde_json", + "tar", + "tauri", + "tauri-plugin", + "tempfile", + "thiserror", + "time", + "tokio", + "url", + "windows-sys 0.52.0", + "zip", +] + +[[package]] +name = "tauri-plugin-window-state" +version = "2.0.0-beta.5" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#21387ac1997cf8b8b10c90a57b2109bb32e72cea" +dependencies = [ + "bitflags 2.5.0", "log", "serde", "serde_json", "tauri", + "tauri-plugin", "thiserror", ] [[package]] name = "tauri-runtime" -version = "0.14.2" +version = "2.0.0-beta.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2d0652aa2891ff3e9caa2401405257ea29ab8372cce01f186a5825f1bd0e76" +checksum = "148b6e6aff8e63fe5d4ae1d50159d50cfc0b4309abdeca64833c887c6b5631ef" dependencies = [ + "dpi", "gtk", - "http", - "http-range", - "rand 0.8.5", - "raw-window-handle", + "http 1.1.0", + "jni", + "raw-window-handle 0.6.1", "serde", "serde_json", "tauri-utils", "thiserror", "url", - "uuid", - "webview2-com", - "windows 0.39.0", + "windows 0.56.0", ] [[package]] name = "tauri-runtime-wry" -version = "0.14.3" +version = "2.0.0-beta.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cae61fbc731f690a4899681c9052dde6d05b159b44563ace8186fc1bfb7d158" +checksum = "398d065c6e0fbf3c4304583759b6e153bc1e0daeb033bede6834ebe4df371fc3" dependencies = [ - "cocoa 0.24.1", + "cocoa", "gtk", + "http 1.1.0", + "jni", + "log", "percent-encoding", - "rand 0.8.5", - "raw-window-handle", + "raw-window-handle 0.6.1", + "softbuffer", + "tao", "tauri-runtime", "tauri-utils", - "uuid", + "url", "webkit2gtk", "webview2-com", - "windows 0.39.0", + "windows 0.56.0", "wry", ] [[package]] name = "tauri-utils" -version = "1.5.2" +version = "2.0.0-beta.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece74810b1d3d44f29f732a7ae09a63183d63949bbdd59c61f8ed2a1b70150db" +checksum = "d4709765385f035338ecc330f3fba753b8ee283c659c235da9768949cdb25469" dependencies = [ "brotli", + "cargo_metadata", "ctor", "dunce", "glob", - "heck 0.4.1", + "heck 0.5.0", "html5ever", "infer", "json-patch", @@ -4960,15 +6017,18 @@ dependencies = [ "phf 0.11.2", "proc-macro2", "quote", + "regex", + "schemars", "semver", "serde", "serde_json", "serde_with", + "swift-rs", "thiserror", - "toml 0.7.8", + "toml 0.8.2", "url", + "urlpattern", "walkdir", - "windows-version", ] [[package]] @@ -5018,22 +6078,22 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -5048,13 +6108,14 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa 1.0.9", "libc", + "num-conv", "num_threads", "powerfmt", "serde", @@ -5070,10 +6131,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] @@ -5115,8 +6177,10 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", + "signal-hook-registry", "socket2 0.5.5", "tokio-macros", + "tracing", "windows-sys 0.48.0", ] @@ -5138,7 +6202,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -5157,7 +6221,18 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.8", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.4", + "rustls-pki-types", "tokio", ] @@ -5186,15 +6261,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - [[package]] name = "toml" version = "0.7.8" @@ -5209,21 +6275,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.8" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.21.0", + "toml_edit 0.20.2", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" dependencies = [ "serde", ] @@ -5234,7 +6300,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", @@ -5243,11 +6309,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", @@ -5266,9 +6332,9 @@ dependencies = [ "base64 0.21.5", "bytes", "h2", - "http", - "http-body", - "hyper", + "http 0.2.10", + "http-body 0.4.5", + "hyper 0.14.27", "hyper-timeout", "percent-encoding", "pin-project", @@ -5346,7 +6412,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -5388,6 +6454,26 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tray-icon" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97ec55956c54569e74209ae9d29a7a79193b252d17a6ac28bcffd4c11a384ad" +dependencies = [ + "cocoa", + "core-graphics", + "crossbeam-channel", + "dirs-next", + "libappindicator", + "muda", + "objc", + "once_cell", + "png", + "serde", + "thiserror", + "windows-sys 0.52.0", +] + [[package]] name = "treediff" version = "4.0.2" @@ -5409,6 +6495,58 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + [[package]] name = "unicase" version = "2.7.0" @@ -5441,9 +6579,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" @@ -5487,6 +6625,19 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "urlpattern" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9bd5ff03aea02fa45b13a7980151fe45009af1980ba69f651ec367121a31609" +dependencies = [ + "derive_more", + "regex", + "serde", + "unic-ucd-ident", + "url", +] + [[package]] name = "utf-8" version = "0.7.6" @@ -5528,9 +6679,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.4.2" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" +checksum = "74797339c3b98616c009c7c3eb53a0ce41e85c8ec66bd3db96ed132d20cfdee8" [[package]] name = "vcpkg" @@ -5538,12 +6689,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "version-compare" -version = "0.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" - [[package]] name = "version-compare" version = "0.1.1" @@ -5634,7 +6779,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "wasm-bindgen-shared", ] @@ -5668,7 +6813,7 @@ checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5681,9 +6826,9 @@ checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" dependencies = [ "futures-util", "js-sys", @@ -5692,6 +6837,17 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wayland-sys" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + [[package]] name = "web-sys" version = "0.3.65" @@ -5704,9 +6860,9 @@ dependencies = [ [[package]] name = "webkit2gtk" -version = "0.18.2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" dependencies = [ "bitflags 1.3.2", "cairo-rs", @@ -5722,20 +6878,18 @@ dependencies = [ "javascriptcore-rs", "libc", "once_cell", - "soup2", + "soup3", "webkit2gtk-sys", ] [[package]] name = "webkit2gtk-sys" -version = "0.18.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" dependencies = [ - "atk-sys", "bitflags 1.3.2", "cairo-sys-rs", - "gdk-pixbuf-sys", "gdk-sys", "gio-sys", "glib-sys", @@ -5743,10 +6897,9 @@ dependencies = [ "gtk-sys", "javascriptcore-rs-sys", "libc", - "pango-sys", "pkg-config", - "soup2-sys", - "system-deps 6.2.0", + "soup3-sys", + "system-deps", ] [[package]] @@ -5756,41 +6909,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] -name = "webview2-com" -version = "0.19.1" +name = "webpki-roots" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webview2-com" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c914dd492a52f0377bef56fd1b6e74a79090f9ee631d625d5b505a00e4538b6" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.39.0", + "windows 0.56.0", + "windows-core 0.56.0", "windows-implement", + "windows-interface", ] [[package]] name = "webview2-com-macros" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +checksum = "ac1345798ecd8122468840bcdf1b95e5dc6d2206c5e4b0eafa078d061f59c9bc" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.58", ] [[package]] name = "webview2-com-sys" -version = "0.19.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +checksum = "2a46bcf03482ec28eeb764ca788f67998cde4213adfbbfa90462622058530f5e" dependencies = [ - "regex", - "serde", - "serde_json", "thiserror", - "windows 0.39.0", - "windows-bindgen", - "windows-metadata", + "windows 0.56.0", + "windows-core 0.56.0", ] [[package]] @@ -5836,37 +6996,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67ff424735b1ac21293b0492b069394b0a189c8a463fb015a16dea7c2e221c08" dependencies = [ - "cocoa 0.25.0", + "cocoa", "objc", - "raw-window-handle", + "raw-window-handle 0.5.2", "windows-sys 0.48.0", ] [[package]] -name = "windows" -version = "0.37.0" +name = "window-vibrancy" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +checksum = "33082acd404763b315866e14a0d5193f3422c81086657583937a750cdd3ec340" dependencies = [ - "windows_aarch64_msvc 0.37.0", - "windows_i686_gnu 0.37.0", - "windows_i686_msvc 0.37.0", - "windows_x86_64_gnu 0.37.0", - "windows_x86_64_msvc 0.37.0", -] - -[[package]] -name = "windows" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" -dependencies = [ - "windows-implement", - "windows_aarch64_msvc 0.39.0", - "windows_i686_gnu 0.39.0", - "windows_i686_msvc 0.39.0", - "windows_x86_64_gnu 0.39.0", - "windows_x86_64_msvc 0.39.0", + "cocoa", + "objc", + "raw-window-handle 0.6.1", + "windows-sys 0.52.0", + "windows-version", ] [[package]] @@ -5879,13 +7025,13 @@ dependencies = [ ] [[package]] -name = "windows-bindgen" -version = "0.39.0" +name = "windows" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" dependencies = [ - "windows-metadata", - "windows-tokens", + "windows-core 0.56.0", + "windows-targets 0.52.5", ] [[package]] @@ -5898,34 +7044,46 @@ dependencies = [ ] [[package]] -name = "windows-implement" -version = "0.39.0" +name = "windows-core" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" dependencies = [ - "syn 1.0.109", - "windows-tokens", + "windows-implement", + "windows-interface", + "windows-result", + "windows-targets 0.52.5", ] [[package]] -name = "windows-metadata" -version = "0.39.0" +name = "windows-implement" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" +checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] [[package]] -name = "windows-sys" -version = "0.42.0" +name = "windows-interface" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "windows-result" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "749f0da9cc72d82e600d8d2e44cadd0b9eedb9038f71a1c58556ac1c5791813b" +dependencies = [ + "windows-targets 0.52.5", ] [[package]] @@ -5952,7 +7110,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.5", ] [[package]] @@ -5987,32 +7145,27 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] -[[package]] -name = "windows-tokens" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" - [[package]] name = "windows-version" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.5", ] [[package]] @@ -6029,21 +7182,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -6059,21 +7200,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" - -[[package]] -name = "windows_i686_gnu" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" - -[[package]] -name = "windows_i686_gnu" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -6089,21 +7218,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" [[package]] -name = "windows_i686_msvc" -version = "0.37.0" +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" - -[[package]] -name = "windows_i686_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -6119,21 +7242,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -6149,9 +7260,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -6167,21 +7278,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -6197,9 +7296,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" @@ -6230,6 +7329,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -6244,40 +7353,53 @@ checksum = "dad7bb64b8ef9c0aa27b6da38b452b0ee9fd82beaf276a87dd796fb55cbae14e" [[package]] name = "wry" -version = "0.24.7" +version = "0.39.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ad85d0e067359e409fcb88903c3eac817c392e5d638258abfb3da5ad8ba6fc4" +checksum = "6e180ac2740d6cb4d5cec0abf63eacbea90f1b7e5e3803043b13c1c84c4b7884" dependencies = [ - "base64 0.13.1", + "base64 0.22.0", "block", - "cocoa 0.24.1", - "core-graphics 0.22.3", + "cocoa", + "core-graphics", "crossbeam-channel", + "dpi", "dunce", - "gdk", - "gio", - "glib", + "gdkx11", "gtk", "html5ever", - "http", + "http 1.1.0", + "javascriptcore-rs", + "jni", "kuchikiki", "libc", - "log", + "ndk", + "ndk-context", + "ndk-sys", "objc", "objc_id", "once_cell", - "serde", - "serde_json", + "percent-encoding", + "raw-window-handle 0.6.1", "sha2", - "soup2", - "tao", + "soup3", + "tao-macros", "thiserror", - "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.39.0", - "windows-implement", + "windows 0.56.0", + "windows-core 0.56.0", + "windows-version", + "x11-dl", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", ] [[package]] @@ -6303,11 +7425,23 @@ dependencies = [ [[package]] name = "xattr" -version = "1.0.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", + "linux-raw-sys", + "rustix", +] + +[[package]] +name = "xdg-home" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e5a325c3cb8398ad6cf859c1135b25dd29e186679cf2da7581d9679f63b38e" +dependencies = [ + "libc", + "winapi", ] [[package]] @@ -6318,24 +7452,30 @@ dependencies = [ "boa_engine", "boa_runtime", "chrono", - "cocoa 0.25.0", + "cocoa", "cookie 0.18.0", "datetime", "futures", "grpc", - "http", + "http 0.2.10", "log", "objc", "openssl-sys", "rand 0.8.5", - "reqwest", + "regex", + "reqwest 0.11.23", "reqwest_cookie_store", "serde", "serde_json", "sqlx", "tauri", "tauri-build", + "tauri-plugin-dialog", + "tauri-plugin-fs", "tauri-plugin-log", + "tauri-plugin-os", + "tauri-plugin-shell", + "tauri-plugin-updater", "tauri-plugin-window-state", "tokio", "tokio-stream", @@ -6363,10 +7503,69 @@ checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "synstructure", ] +[[package]] +name = "zbus" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030" +dependencies = [ + "async-broadcast", + "async-process", + "async-recursion", + "async-trait", + "derivative", + "enumflags2", + "event-listener 5.3.0", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tokio", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + [[package]] name = "zerocopy" version = "0.7.32" @@ -6384,7 +7583,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -6404,7 +7603,7 @@ checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "synstructure", ] @@ -6434,7 +7633,7 @@ checksum = "7a4a1638a1934450809c2266a70362bfc96cd90550c073f5b8a55014d1010157" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -6443,7 +7642,83 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" dependencies = [ + "aes", "byteorder", + "bzip2", + "constant_time_eq", "crc32fast", "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.10+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "zvariant" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "url", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index a235d122..2e2d2e49 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,4 +1,5 @@ workspace = { members = ["grpc"] } + [package] name = "yaak-app" version = "0.0.0" @@ -8,11 +9,16 @@ license = "MIT" repository = "https://github.com/gschier/yaak-app" edition = "2021" +# Produce a library for mobile support +[lib] +name = "tauri_app_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + [profile.release] strip = true # Automatically strip symbols from the binary. [build-dependencies] -tauri-build = { version = "1.5", features = [] } +tauri-build = { version = "2.0.0-beta", features = [] } [target.'cfg(target_os = "macos")'.dependencies] objc = "0.2.7" @@ -34,28 +40,17 @@ cookie = { version = "0.18.0" } serde = { version = "1.0.195", features = ["derive"] } serde_json = { version = "1.0.111", features = ["raw_value"] } sqlx = { version = "0.7.4", features = ["sqlite", "runtime-tokio-rustls", "json", "chrono", "time"] } -tauri = { version = "1.5.4", features = [ +tauri = { version = "2.0.0-beta.17", features = [ "config-toml", - "path-all", "devtools", - "dialog-open", - "dialog-save", - "fs-read-file", - "os-all", - "protocol-asset", - "shell-open", - "shell-sidecar", - "updater", - "window-close", - "window-maximize", - "window-minimize", - "window-set-decorations", - "window-set-title", - "window-start-dragging", - "window-unmaximize", ] } -tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } -tauri-plugin-log = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1", features = ["colored"] } +tauri-plugin-dialog = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-log = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2", features = ["colored"] } +tauri-plugin-shell = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-os = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-updater = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-fs = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tokio = { version = "1.36.0", features = ["sync"] } uuid = "1.3.0" log = "0.4.20" @@ -64,11 +59,4 @@ window-shadows = "0.2.2" reqwest_cookie_store = "0.6.0" grpc = { path = "./grpc" } tokio-stream = "0.1.15" - -[features] -# by default Tauri runs in production mode -# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL -default = ["custom-protocol"] -# this feature is used used for production builds where `devPath` points to the filesystem -# DO NOT remove this -custom-protocol = ["tauri/custom-protocol"] +regex = "1.10.2" diff --git a/src-tauri/capabilities/main.json b/src-tauri/capabilities/main.json new file mode 100644 index 00000000..65634278 --- /dev/null +++ b/src-tauri/capabilities/main.json @@ -0,0 +1,49 @@ +{ + "$schema": "../gen/schemas/capabilities.json", + "identifier": "main", + "description": "Main permissions", + "local": true, + "windows": [ + "*" + ], + "permissions": [ + "os:allow-os-type", + "menu:allow-create-default", + "dialog:allow-open", + "dialog:allow-save", + "event:allow-listen", + "event:allow-unlisten", + "fs:allow-read-file", + "fs:allow-read-text-file", + { + "identifier": "fs:scope", + "allow": [ + { + "path": "$APPDATA" + }, + { + "path": "$APPDATA/**" + } + ] + }, + "shell:allow-open", + { + "identifier": "shell:allow-execute", + "allow": [ + { + "name": "protoc", + "sidecar": true, + "args": true + } + ] + }, + "window:allow-close", + "window:allow-is-fullscreen", + "window:allow-maximize", + "window:allow-minimize", + "window:allow-set-decorations", + "window:allow-set-title", + "window:allow-start-dragging", + "window:allow-unmaximize" + ] +} diff --git a/src-tauri/gen/apple/.gitignore b/src-tauri/gen/apple/.gitignore new file mode 100644 index 00000000..6726e2f8 --- /dev/null +++ b/src-tauri/gen/apple/.gitignore @@ -0,0 +1,3 @@ +xcuserdata/ +build/ +Externals/ diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b128e3c0f8eaf9fe7842259829ba458adb636b GIT binary patch literal 844 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 literal 0 HcmV?d00001 diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e92f781f349240e58858d92db3ab3be0c9b8d8 GIT binary patch literal 1419 zcmV;61$6p}P)2M+4;In-AX01*Od+&6b8-92;r=KKEd z|7V$`hBY@@qL(=jGY{ist#+>+Owi^ode|ycEHhrBv9g(JFmC_MK_)K&3uAzl0z4tG zz->U~W-#Y)`r$Xh)IPnG1a|dvu<4UvscT@?0u37G(iH>(?GR1Rfo*(}z**5j*T&QV zTnGafUja+>n~l_lt^g$SfQbxYr;V)CFKQkFyYmQ`yK+U~(xCPNNv!Zk7uezr(@l(I z!&5-jHUbV(|14ze9N6S{VA*LpKo&C83EXv@&fzOC+kb+ZiF&a28L(Ing~$id{5)9u z0rJsuBgw@$74b2xd~Ku%#!B zoIIcpwIWk>dKUr2a~2MbT}K6>Q-tv8mW{ZtI+#C{Bv_`@Xz7OVHG;+e1UBpfui9>; zhh zHUoY0cp+wcz((IS4zFkcYkb-+L%djChj?@`hpXwFN(}6*3g{w`r4uMKoguKUfeB)5 zRC%wxUdP$^fMS|ULQZ@I7CuVy(_yF{ODZJXy>8ic$C1w-=y;}t(49>cZWNB4Ala1% z8>zq2&2gOGwL-8f*Z48;%ZCYYQRl4Ke3;~aWX1cnC}mVk^{JKlL~%)O@p+K61Txe= zmlGOX=d`vKwahdG-Lt~q3Rl}};5GLb#c>&^V~-6UH*O&o5h|pqWdDB23ORGF0W>RqXz zgn0j26p#NkhMngI5Kd<_L#xC!U38xc+gUFRM(}+!i3$RHtR{#f?G5npmG6c($7XOe z5+ehW<3oP@*trS7zpw2wK$VN1=o`l%#Za+qA=7l#hj4EwfNHmk3}xYbB8?L>aSSYE z_2wHq94EK7;8vekE5RAcV_I17RnERRIEk}!DgCbcgY?74jnqk@?VT~Q%;-u349YNu%|YJmm1gW0#Xj(s-VuD>PSQm zMc;fHmr2S5td0Nx literal 0 HcmV?d00001 diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1c607d5c35ea3f4d5111a1542341d7df7c9c2ba7 GIT binary patch literal 3509 zcmV;m4NCHfP)d<{Fcu{w0#9mv?=eJ zpAeun-w4Eu9|aC?hST>tgiHc%1%D3bcxK|Qb3n^6fZmqTR`~O8hgh<~c-T+#u+Ya0 zR4q`2AwPP@Uxah`mvGXGWqlozmPwUIyivZV?D3BEr9H-p((~okFu{2QVml$?`wj3= zP1eKOU@6*Z6yEC12+g~BN?|-ZK&^GXkA4QX<2MA^YCQ%6GR@Eqxs6^n}U zrzB{9@IB!8@8O*KJA)usqHlj>zSS7pJ>^|mRst?|RyWp&N*epXWG$5HX8P9_D#=3#s_rQ%GU?>M*$=s=a zc=K3#RzFS<@{HG6v_*jI`7B)#SBX)(Uai z3y|dt4T%LMCR_)n`_GVrJ1oh`x$>wf0dkB2;O(^#UIH@G#6o|*RyTg-GPn!Ard1D0 zT704ioVeQ%jyLo^oSnDvdTvhc55a4?3C_h&ozbh)mw?JXT$?<(6{2!Eu;31$?n*Lg zyIyiA7f7K6Oq6vKmsj zDUT2S$J|SZ*(W2<_q7L<{d&ezc&eihU)JNzp+dp5!y-bJP! zB$4&N?b!ygs(+=Ynjz4=jnkIk{t(TS(PaW^Wb6rE| zN_i-E9n^u+`)4!2M*2^Kt{hQ#g*=k5EuRhxMsufmE z1@bVYYqg*312T1b7Ch=%knfL-;-=ll@Y9ZdB)FdDa0n6pUQMv-^XZXfE#32)$~JTB zKq9J_Olbgu^->PJnD}-eU@9&{!>G?Ge;w6<)Y+2Qg=15rQuv(B?w4RyY z-R0kdrkO3bqH6qCXwe@%YI>`2QEDJq4Y@JBGRYrwmoN3-= zasZ<54W3+?Jx+O)(o+QCEvDhoz%jq>90&qOUq=}r$`8-1Xqy1C0J-G(GUpRRQxChM zE!iaTQA8J;*33V?1@3rfw&zuB>oPZ+u0QQAlg?4;o1OdOW7r-W)%7tbFN$67ZLh=X z%Ce#$)%l*Ep&BzV%d3lSjw#I4uoOsdct4zu=joc-Y-lU;s=pde<@v@?CAyd5K&>zS z);~hRks6>{@E8#+in_SFt=@!00gwuyA}kf+3C}|;l{Voj1PTkg(k+@yQ#Q5#;}?CcV~PYDWY2x z4dJe~I^5h;bLPQE<`D)#vb*tjZ-ARPXr*6v!XR62fzxnRY4R!sG+4+mK^+=PX{Dp{ zTo@v{p{}xEMg$;t#1dHl;Ry_~&{n!8XgX8l_{YAJcw})B_b+TRsZo@i&1_iqzXh@X zhj2Nq$bxkBa9eT!Czd}n>4y|0f%YWR7$DfdYf2#0ha6l`5jAn2<4xU<3X_Kq9_~S0 zD*bDSN^QzmRc;86QyX7bTY)QTDvE&h*}?2FQ$VGQ9XAUSriD{-&%fw#xY6cGPXUYQ zF!MG@kSZsGwWv_7BT!Xl3XzZ6-WrNyUm~f=OUXk&Lqz6g%2=6-I7_(Y2ZREm@XgL0-VIYU8J;G{i3AQRCAj+c4?dGGiZKMi^FwONlwBb3AQ@ zL*eTxub)h&^U4=;5p~$z zL^(`6$Qr8h_OuIG_gur=TUr*<$|-D1lId*~DHan2nB1bQ%$w0Y_0oud^KbMxm*TlDBl8N@R_!6j?Ym3#wRZgpYTQ6FGCyw=DFO8x?eMvNoJ6oG@yA>LuKuOVXITMyw z{E76=(J6aOS05{pd8#(et?0Nj5Ccyh>&0Uo18AamRq0SnI**@UzjQGwLvF$1AJkK| z_0o%~#I&)y5keFlSL?cIg?e_{YmPq2;agiYf|+bi@g3$?pKGW>CB5m{Qc=c!REdZ! z-Gdo}ponKR@ep7;7pXu7lS5IEuhn@@#)Ha0+gOHfzbvULYNX*30LYMQ}xR8P?R4vv&<=i~xV;wQ|mY zW=IOAi7r$IWDem>49Gycx^oC{R)J3Ru$j1ujPl7hh`F631kM7!xdB=X{OP_t``euV j^T5XqFxbwSe+T(L?uD8#1zeE%00000NkvXXu0mjfQHZ$R literal 0 HcmV?d00001 diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1c607d5c35ea3f4d5111a1542341d7df7c9c2ba7 GIT binary patch literal 3509 zcmV;m4NCHfP)d<{Fcu{w0#9mv?=eJ zpAeun-w4Eu9|aC?hST>tgiHc%1%D3bcxK|Qb3n^6fZmqTR`~O8hgh<~c-T+#u+Ya0 zR4q`2AwPP@Uxah`mvGXGWqlozmPwUIyivZV?D3BEr9H-p((~okFu{2QVml$?`wj3= zP1eKOU@6*Z6yEC12+g~BN?|-ZK&^GXkA4QX<2MA^YCQ%6GR@Eqxs6^n}U zrzB{9@IB!8@8O*KJA)usqHlj>zSS7pJ>^|mRst?|RyWp&N*epXWG$5HX8P9_D#=3#s_rQ%GU?>M*$=s=a zc=K3#RzFS<@{HG6v_*jI`7B)#SBX)(Uai z3y|dt4T%LMCR_)n`_GVrJ1oh`x$>wf0dkB2;O(^#UIH@G#6o|*RyTg-GPn!Ard1D0 zT704ioVeQ%jyLo^oSnDvdTvhc55a4?3C_h&ozbh)mw?JXT$?<(6{2!Eu;31$?n*Lg zyIyiA7f7K6Oq6vKmsj zDUT2S$J|SZ*(W2<_q7L<{d&ezc&eihU)JNzp+dp5!y-bJP! zB$4&N?b!ygs(+=Ynjz4=jnkIk{t(TS(PaW^Wb6rE| zN_i-E9n^u+`)4!2M*2^Kt{hQ#g*=k5EuRhxMsufmE z1@bVYYqg*312T1b7Ch=%knfL-;-=ll@Y9ZdB)FdDa0n6pUQMv-^XZXfE#32)$~JTB zKq9J_Olbgu^->PJnD}-eU@9&{!>G?Ge;w6<)Y+2Qg=15rQuv(B?w4RyY z-R0kdrkO3bqH6qCXwe@%YI>`2QEDJq4Y@JBGRYrwmoN3-= zasZ<54W3+?Jx+O)(o+QCEvDhoz%jq>90&qOUq=}r$`8-1Xqy1C0J-G(GUpRRQxChM zE!iaTQA8J;*33V?1@3rfw&zuB>oPZ+u0QQAlg?4;o1OdOW7r-W)%7tbFN$67ZLh=X z%Ce#$)%l*Ep&BzV%d3lSjw#I4uoOsdct4zu=joc-Y-lU;s=pde<@v@?CAyd5K&>zS z);~hRks6>{@E8#+in_SFt=@!00gwuyA}kf+3C}|;l{Voj1PTkg(k+@yQ#Q5#;}?CcV~PYDWY2x z4dJe~I^5h;bLPQE<`D)#vb*tjZ-ARPXr*6v!XR62fzxnRY4R!sG+4+mK^+=PX{Dp{ zTo@v{p{}xEMg$;t#1dHl;Ry_~&{n!8XgX8l_{YAJcw})B_b+TRsZo@i&1_iqzXh@X zhj2Nq$bxkBa9eT!Czd}n>4y|0f%YWR7$DfdYf2#0ha6l`5jAn2<4xU<3X_Kq9_~S0 zD*bDSN^QzmRc;86QyX7bTY)QTDvE&h*}?2FQ$VGQ9XAUSriD{-&%fw#xY6cGPXUYQ zF!MG@kSZsGwWv_7BT!Xl3XzZ6-WrNyUm~f=OUXk&Lqz6g%2=6-I7_(Y2ZREm@XgL0-VIYU8J;G{i3AQRCAj+c4?dGGiZKMi^FwONlwBb3AQ@ zL*eTxub)h&^U4=;5p~$z zL^(`6$Qr8h_OuIG_gur=TUr*<$|-D1lId*~DHan2nB1bQ%$w0Y_0oud^KbMxm*TlDBl8N@R_!6j?Ym3#wRZgpYTQ6FGCyw=DFO8x?eMvNoJ6oG@yA>LuKuOVXITMyw z{E76=(J6aOS05{pd8#(et?0Nj5Ccyh>&0Uo18AamRq0SnI**@UzjQGwLvF$1AJkK| z_0o%~#I&)y5keFlSL?cIg?e_{YmPq2;agiYf|+bi@g3$?pKGW>CB5m{Qc=c!REdZ! z-Gdo}ponKR@ep7;7pXu7lS5IEuhn@@#)Ha0+gOHfzbvULYNX*30LYMQ}xR8P?R4vv&<=i~xV;wQ|mY zW=IOAi7r$IWDem>49Gycx^oC{R)J3Ru$j1ujPl7hh`F631kM7!xdB=X{OP_t``euV j^T5XqFxbwSe+T(L?uD8#1zeE%00000NkvXXu0mjfQHZ$R literal 0 HcmV?d00001 diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..60e93a6a1e666cc452bb8ee700f8f43bf8fff19b GIT binary patch literal 5618 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 FV1g=}>J|V1 literal 0 HcmV?d00001 diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..819410f9ffac0496b0801c65fc3920ac8ebd56e4 GIT binary patch literal 5143 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 FV1g=}>J|V1 literal 0 HcmV?d00001 diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e00ae5a6a44bd40c58d4d0dd5339a56260638c46 GIT binary patch literal 7879 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 literal 0 HcmV?d00001 diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f5301f37d539dec93a855f5330a94743f797041c GIT binary patch literal 155248 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%0A(a>@^on~< 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 BiC6#t literal 0 HcmV?d00001 diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-512x512@2x.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-512x512@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5e9add73161e79c11efd1e2c4e4ee64f243c99e7 GIT binary patch literal 15001 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 literal 0 HcmV?d00001 diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3546ca10cd77fb1309190807db42bb23b56bf2a5 GIT binary patch literal 12188 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

czx#jF#6mJLj~w)_{zG8b6!^vNY{U+x}olE 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 YT4AfGt7r@P&$-+%78`+i(W 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 J)_yYy`yUONfA|0Z literal 0 HcmV?d00001 diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/Contents.json b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..90eea7ec --- /dev/null +++ b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "AppIcon-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "AppIcon-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "AppIcon-29x29@2x-1.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "AppIcon-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "AppIcon-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "AppIcon-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "AppIcon-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "AppIcon-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "AppIcon-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "AppIcon-20x20@2x-1.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "AppIcon-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "AppIcon-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "AppIcon-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "AppIcon-40x40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "AppIcon-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "AppIcon-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "AppIcon-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "AppIcon-512@2x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/src-tauri/gen/apple/Assets.xcassets/Contents.json b/src-tauri/gen/apple/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/src-tauri/gen/apple/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/src-tauri/gen/apple/ExportOptions.plist b/src-tauri/gen/apple/ExportOptions.plist new file mode 100644 index 00000000..b69cf1de --- /dev/null +++ b/src-tauri/gen/apple/ExportOptions.plist @@ -0,0 +1,8 @@ + + + + + method + development + + diff --git a/src-tauri/gen/apple/Podfile b/src-tauri/gen/apple/Podfile new file mode 100644 index 00000000..e3cff877 --- /dev/null +++ b/src-tauri/gen/apple/Podfile @@ -0,0 +1,21 @@ +# Uncomment the next line to define a global platform for your project + +target 'yaak-app_iOS' do +platform :ios, '13.0' + # Pods for yaak-app_iOS +end + +target 'yaak-app_macOS' do +platform :osx, '11.0' + # Pods for yaak-app_macOS +end + +# Delete the deployment target for iOS and macOS, causing it to be inherited from the Podfile +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET' + config.build_settings.delete 'MACOSX_DEPLOYMENT_TARGET' + end + end +end diff --git a/src-tauri/gen/apple/Sources/yaak-app/bindings/bindings.h b/src-tauri/gen/apple/Sources/yaak-app/bindings/bindings.h new file mode 100644 index 00000000..51522007 --- /dev/null +++ b/src-tauri/gen/apple/Sources/yaak-app/bindings/bindings.h @@ -0,0 +1,8 @@ +#pragma once + +namespace ffi { + extern "C" { + void start_app(); + } +} + diff --git a/src-tauri/gen/apple/Sources/yaak-app/main.mm b/src-tauri/gen/apple/Sources/yaak-app/main.mm new file mode 100644 index 00000000..7793a9d5 --- /dev/null +++ b/src-tauri/gen/apple/Sources/yaak-app/main.mm @@ -0,0 +1,6 @@ +#include "bindings/bindings.h" + +int main(int argc, char * argv[]) { + ffi::start_app(); + return 0; +} diff --git a/src-tauri/gen/apple/project.yml b/src-tauri/gen/apple/project.yml new file mode 100644 index 00000000..9d5d67f4 --- /dev/null +++ b/src-tauri/gen/apple/project.yml @@ -0,0 +1,90 @@ +name: yaak-app +options: + bundleIdPrefix: app.yaak + deploymentTarget: + iOS: 13.0 +fileGroups: [../../src] +configs: + debug: debug + release: release +settingGroups: + app: + base: + PRODUCT_NAME: Yaak + PRODUCT_BUNDLE_IDENTIFIER: app.yaak.yaak-app + DEVELOPMENT_TEAM: 7PU3P6ELJ8 +targetTemplates: + app: + type: application + sources: + - path: Sources + scheme: + environmentVariables: + RUST_BACKTRACE: full + RUST_LOG: info + settings: + groups: [app] +targets: + yaak-app_iOS: + type: application + platform: iOS + sources: + - path: Sources + - path: Assets.xcassets + - path: Externals + - path: yaak-app_iOS + - path: assets + buildPhase: resources + type: folder + info: + path: yaak-app_iOS/Info.plist + properties: + LSRequiresIPhoneOS: true + UILaunchStoryboardName: LaunchScreen + UIRequiredDeviceCapabilities: [arm64, metal] + UISupportedInterfaceOrientations: + - UIInterfaceOrientationPortrait + - UIInterfaceOrientationLandscapeLeft + - UIInterfaceOrientationLandscapeRight + UISupportedInterfaceOrientations~ipad: + - UIInterfaceOrientationPortrait + - UIInterfaceOrientationPortraitUpsideDown + - UIInterfaceOrientationLandscapeLeft + - UIInterfaceOrientationLandscapeRight + CFBundleShortVersionString: 2024.3.10 + CFBundleVersion: 2024.3.10 + entitlements: + path: yaak-app_iOS/yaak-app_iOS.entitlements + scheme: + environmentVariables: + RUST_BACKTRACE: full + RUST_LOG: info + settings: + base: + ENABLE_BITCODE: false + ARCHS: [arm64, arm64-sim] + VALID_ARCHS: arm64 arm64-sim + LIBRARY_SEARCH_PATHS[arch=x86_64]: $(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) + LIBRARY_SEARCH_PATHS[arch=arm64]: $(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) + LIBRARY_SEARCH_PATHS[arch=arm64-sim]: $(inherited) $(PROJECT_DIR)/Externals/arm64-sim/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES: true + EXCLUDED_ARCHS[sdk=iphonesimulator*]: arm64 + EXCLUDED_ARCHS[sdk=iphoneos*]: arm64-sim x86_64 + groups: [app] + dependencies: + - framework: libapp_lib.a + embed: false + - sdk: CoreGraphics.framework + - sdk: Metal.framework + - sdk: MetalKit.framework + - sdk: QuartzCore.framework + - sdk: Security.framework + - sdk: UIKit.framework + - sdk: WebKit.framework + preBuildScripts: + - script: node tauri ios xcode-script -v --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths "${FRAMEWORK_SEARCH_PATHS:?}" --header-search-paths "${HEADER_SEARCH_PATHS:?}" --gcc-preprocessor-definitions "${GCC_PREPROCESSOR_DEFINITIONS:-}" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?} + name: Build Rust Code + basedOnDependencyAnalysis: false + outputFiles: + - $(SRCROOT)/target/aarch64-apple-ios/${CONFIGURATION}/deps/libapp_lib.a + - $(SRCROOT)/target/x86_64-apple-ios/${CONFIGURATION}/deps/libapp_lib.a \ No newline at end of file diff --git a/src-tauri/gen/apple/yaak-app.xcodeproj/project.pbxproj b/src-tauri/gen/apple/yaak-app.xcodeproj/project.pbxproj new file mode 100644 index 00000000..b076dfd1 --- /dev/null +++ b/src-tauri/gen/apple/yaak-app.xcodeproj/project.pbxproj @@ -0,0 +1,481 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 0AC23E163631EF3775908406 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDEF0D2E01608E7F464F71B6 /* WebKit.framework */; }; + 1B1BFDF8BC345D0D980E4427 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EF0B8CF73BE8166011E2CEAB /* QuartzCore.framework */; }; + 36588BE1A75B386BB2FEDAC5 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A93A95F6B2F31FA92AA099E0 /* MetalKit.framework */; }; + 38E2C1B0E9FCC9A5FDE8876D /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF2908761467DF191C2A8939 /* Metal.framework */; }; + 8D518C1A67069BD7D339D055 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F34A96C5084EFDF1802A634 /* CoreGraphics.framework */; }; + 8DF67739DC49E577EB0FAE3F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 396F45DCFBE2C71866817528 /* Assets.xcassets */; }; + A1D932F0E7399066AD07DC6D /* libapp_lib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 75D938BE0FA8770BA965AE1E /* libapp_lib.a */; }; + AF0EEC868306E1D1C85994D0 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B5BF2E39256494269E65F8E /* Security.framework */; }; + BE9FFDF51EB7DEBF707BB39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5415A3F2D217A47DD3BA40B3 /* UIKit.framework */; }; + F0627C04787F4E187EF416F4 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 2A615609009B3AE2728043E4 /* assets */; }; + FEE5934F5FFB0FBE10883AF2 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = C754460F1DAF2D414038A7EA /* main.mm */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 106BE62BE01A35403424018C /* main.rs */ = {isa = PBXFileReference; path = main.rs; sourceTree = ""; }; + 14F240DAC31C5C52D7B4BB96 /* window_ext.rs */ = {isa = PBXFileReference; path = window_ext.rs; sourceTree = ""; }; + 1B5226A88D8B805E878524C8 /* updates.rs */ = {isa = PBXFileReference; path = updates.rs; sourceTree = ""; }; + 1F34A96C5084EFDF1802A634 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 1F5A647F82A24722F3C830BB /* plugin.rs */ = {isa = PBXFileReference; path = plugin.rs; sourceTree = ""; }; + 2A615609009B3AE2728043E4 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = SOURCE_ROOT; }; + 396F45DCFBE2C71866817528 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53872C1120171EDC4A6DFEDD /* analytics.rs */ = {isa = PBXFileReference; path = analytics.rs; sourceTree = ""; }; + 5415A3F2D217A47DD3BA40B3 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 5C1B6610F62B56E1947BEBBD /* http.rs */ = {isa = PBXFileReference; path = http.rs; sourceTree = ""; }; + 6286C385ABAD2E04237679D7 /* yaak-app_iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "yaak-app_iOS.entitlements"; sourceTree = ""; }; + 75D938BE0FA8770BA965AE1E /* libapp_lib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libapp_lib.a; sourceTree = ""; }; + 7B5BF2E39256494269E65F8E /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; + A2CC02313D71CECB68031D53 /* grpc.rs */ = {isa = PBXFileReference; path = grpc.rs; sourceTree = ""; }; + A6DA9B210723CA84891876F8 /* bindings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bindings.h; sourceTree = ""; }; + A93A95F6B2F31FA92AA099E0 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; }; + C754460F1DAF2D414038A7EA /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; + D69BFB768591FDEEF65198EE /* yaak-app_iOS.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "yaak-app_iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + DDDE197D9C6BC5680EEEEA00 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + DF2908761467DF191C2A8939 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; + DF45D08D97DE587CABF9537E /* window_menu.rs */ = {isa = PBXFileReference; path = window_menu.rs; sourceTree = ""; }; + E1E84E267D81D6437901B1C6 /* render.rs */ = {isa = PBXFileReference; path = render.rs; sourceTree = ""; }; + E964D3637BAED49E34B91739 /* models.rs */ = {isa = PBXFileReference; path = models.rs; sourceTree = ""; }; + EDEF0D2E01608E7F464F71B6 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + EF0B8CF73BE8166011E2CEAB /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + FB34CB48BB9F25D49F80D513 /* lib.rs */ = {isa = PBXFileReference; path = lib.rs; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D8E8888B0F3E4411B98AE8EE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A1D932F0E7399066AD07DC6D /* libapp_lib.a in Frameworks */, + 8D518C1A67069BD7D339D055 /* CoreGraphics.framework in Frameworks */, + 38E2C1B0E9FCC9A5FDE8876D /* Metal.framework in Frameworks */, + 36588BE1A75B386BB2FEDAC5 /* MetalKit.framework in Frameworks */, + 1B1BFDF8BC345D0D980E4427 /* QuartzCore.framework in Frameworks */, + AF0EEC868306E1D1C85994D0 /* Security.framework in Frameworks */, + BE9FFDF51EB7DEBF707BB39A /* UIKit.framework in Frameworks */, + 0AC23E163631EF3775908406 /* WebKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0844ACEFE550685042AC6029 /* Products */ = { + isa = PBXGroup; + children = ( + D69BFB768591FDEEF65198EE /* yaak-app_iOS.app */, + ); + name = Products; + sourceTree = ""; + }; + 6D0B6FF641B88DAF74C78B00 /* Externals */ = { + isa = PBXGroup; + children = ( + ); + path = Externals; + sourceTree = ""; + }; + 8A07575CB8654BB9107F9A32 /* bindings */ = { + isa = PBXGroup; + children = ( + A6DA9B210723CA84891876F8 /* bindings.h */, + ); + path = bindings; + sourceTree = ""; + }; + 8F0B46911FBEF2B246BE3385 /* yaak-app */ = { + isa = PBXGroup; + children = ( + C754460F1DAF2D414038A7EA /* main.mm */, + 8A07575CB8654BB9107F9A32 /* bindings */, + ); + path = "yaak-app"; + sourceTree = ""; + }; + 90E982C0E9B45CBAAE66E16D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1F34A96C5084EFDF1802A634 /* CoreGraphics.framework */, + 75D938BE0FA8770BA965AE1E /* libapp_lib.a */, + DF2908761467DF191C2A8939 /* Metal.framework */, + A93A95F6B2F31FA92AA099E0 /* MetalKit.framework */, + EF0B8CF73BE8166011E2CEAB /* QuartzCore.framework */, + 7B5BF2E39256494269E65F8E /* Security.framework */, + 5415A3F2D217A47DD3BA40B3 /* UIKit.framework */, + EDEF0D2E01608E7F464F71B6 /* WebKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + C88F9D29DC52F052255C35A3 = { + isa = PBXGroup; + children = ( + 2A615609009B3AE2728043E4 /* assets */, + 396F45DCFBE2C71866817528 /* Assets.xcassets */, + 6D0B6FF641B88DAF74C78B00 /* Externals */, + EBC83899FBFA4A3D0A92837F /* Sources */, + F3A6B45E25E23922AB1BDB34 /* src */, + D49CF68C9105CE84E2084C14 /* yaak-app_iOS */, + 90E982C0E9B45CBAAE66E16D /* Frameworks */, + 0844ACEFE550685042AC6029 /* Products */, + ); + sourceTree = ""; + }; + D49CF68C9105CE84E2084C14 /* yaak-app_iOS */ = { + isa = PBXGroup; + children = ( + DDDE197D9C6BC5680EEEEA00 /* Info.plist */, + 6286C385ABAD2E04237679D7 /* yaak-app_iOS.entitlements */, + ); + path = "yaak-app_iOS"; + sourceTree = ""; + }; + EBC83899FBFA4A3D0A92837F /* Sources */ = { + isa = PBXGroup; + children = ( + 8F0B46911FBEF2B246BE3385 /* yaak-app */, + ); + path = Sources; + sourceTree = ""; + }; + F3A6B45E25E23922AB1BDB34 /* src */ = { + isa = PBXGroup; + children = ( + 53872C1120171EDC4A6DFEDD /* analytics.rs */, + A2CC02313D71CECB68031D53 /* grpc.rs */, + 5C1B6610F62B56E1947BEBBD /* http.rs */, + FB34CB48BB9F25D49F80D513 /* lib.rs */, + 106BE62BE01A35403424018C /* main.rs */, + E964D3637BAED49E34B91739 /* models.rs */, + 1F5A647F82A24722F3C830BB /* plugin.rs */, + E1E84E267D81D6437901B1C6 /* render.rs */, + 1B5226A88D8B805E878524C8 /* updates.rs */, + 14F240DAC31C5C52D7B4BB96 /* window_ext.rs */, + DF45D08D97DE587CABF9537E /* window_menu.rs */, + ); + name = src; + path = ../../src; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7C3E2AC18A0A227C2DF356E2 /* yaak-app_iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = C05E07AE7C7B25CACFADCDD4 /* Build configuration list for PBXNativeTarget "yaak-app_iOS" */; + buildPhases = ( + 5454ED506FC51D41C81A0318 /* Build Rust Code */, + C3495A2849227C6276D3876E /* Sources */, + E148188313FB67F061AB4E59 /* Resources */, + D8E8888B0F3E4411B98AE8EE /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "yaak-app_iOS"; + productName = "yaak-app_iOS"; + productReference = D69BFB768591FDEEF65198EE /* yaak-app_iOS.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + A8F6206BC76F061F1FEFD439 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1430; + TargetAttributes = { + 7C3E2AC18A0A227C2DF356E2 = { + DevelopmentTeam = 7PU3P6ELJ8; + }; + }; + }; + buildConfigurationList = 24EF8D1B948FFF6B275FB0F4 /* Build configuration list for PBXProject "yaak-app" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + Base, + en, + ); + mainGroup = C88F9D29DC52F052255C35A3; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7C3E2AC18A0A227C2DF356E2 /* yaak-app_iOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + E148188313FB67F061AB4E59 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8DF67739DC49E577EB0FAE3F /* Assets.xcassets in Resources */, + F0627C04787F4E187EF416F4 /* assets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 5454ED506FC51D41C81A0318 /* Build Rust Code */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Build Rust Code"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(SRCROOT)/target/aarch64-apple-ios/${CONFIGURATION}/deps/libapp_lib.a", + "$(SRCROOT)/target/x86_64-apple-ios/${CONFIGURATION}/deps/libapp_lib.a", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "node tauri ios xcode-script -v --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths \"${FRAMEWORK_SEARCH_PATHS:?}\" --header-search-paths \"${HEADER_SEARCH_PATHS:?}\" --gcc-preprocessor-definitions \"${GCC_PREPROCESSOR_DEFINITIONS:-}\" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?}"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C3495A2849227C6276D3876E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FEE5934F5FFB0FBE10883AF2 /* main.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 35D1DB294FFD067C835186C7 /* debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DEBUG=1", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = debug; + }; + 368BB1E364597E7675463634 /* release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ARCHS = ( + arm64, + "arm64-sim", + ); + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = "yaak-app_iOS/yaak-app_iOS.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + DEVELOPMENT_TEAM = 7PU3P6ELJ8; + ENABLE_BITCODE = NO; + "EXCLUDED_ARCHS[sdk=iphoneos*]" = "arm64-sim x86_64"; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\".\"", + ); + INFOPLIST_FILE = "yaak-app_iOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + "LIBRARY_SEARCH_PATHS[arch=arm64-sim]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64-sim/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; + "LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; + "LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = "app.yaak.yaak-app"; + PRODUCT_NAME = Yaak; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALID_ARCHS = "arm64 arm64-sim"; + }; + name = release; + }; + 45382E89556BF93E8D1F1C2D /* debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ARCHS = ( + arm64, + "arm64-sim", + ); + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = "yaak-app_iOS/yaak-app_iOS.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + DEVELOPMENT_TEAM = 7PU3P6ELJ8; + ENABLE_BITCODE = NO; + "EXCLUDED_ARCHS[sdk=iphoneos*]" = "arm64-sim x86_64"; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\".\"", + ); + INFOPLIST_FILE = "yaak-app_iOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + "LIBRARY_SEARCH_PATHS[arch=arm64-sim]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64-sim/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; + "LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; + "LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = "app.yaak.yaak-app"; + PRODUCT_NAME = Yaak; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALID_ARCHS = "arm64 arm64-sim"; + }; + name = debug; + }; + ABD0A3DD3D5C66C839496F44 /* release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + }; + name = release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 24EF8D1B948FFF6B275FB0F4 /* Build configuration list for PBXProject "yaak-app" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 35D1DB294FFD067C835186C7 /* debug */, + ABD0A3DD3D5C66C839496F44 /* release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = debug; + }; + C05E07AE7C7B25CACFADCDD4 /* Build configuration list for PBXNativeTarget "yaak-app_iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 45382E89556BF93E8D1F1C2D /* debug */, + 368BB1E364597E7675463634 /* release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = A8F6206BC76F061F1FEFD439 /* Project object */; +} diff --git a/src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..ac90d5ac --- /dev/null +++ b/src-tauri/gen/apple/yaak-app.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + BuildSystemType + Original + DisableBuildSystemDeprecationDiagnostic + + + diff --git a/src-tauri/gen/apple/yaak-app.xcodeproj/xcshareddata/xcschemes/yaak-app_iOS.xcscheme b/src-tauri/gen/apple/yaak-app.xcodeproj/xcshareddata/xcschemes/yaak-app_iOS.xcscheme new file mode 100644 index 00000000..ceed736e --- /dev/null +++ b/src-tauri/gen/apple/yaak-app.xcodeproj/xcshareddata/xcschemes/yaak-app_iOS.xcscheme @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src-tauri/gen/apple/yaak-app_iOS/Info.plist b/src-tauri/gen/apple/yaak-app_iOS/Info.plist new file mode 100644 index 00000000..449b577a --- /dev/null +++ b/src-tauri/gen/apple/yaak-app_iOS/Info.plist @@ -0,0 +1,44 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 2024.3.10 + CFBundleVersion + 2024.3.10 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + arm64 + metal + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/src-tauri/gen/apple/yaak-app_iOS/yaak-app_iOS.entitlements b/src-tauri/gen/apple/yaak-app_iOS/yaak-app_iOS.entitlements new file mode 100644 index 00000000..0c67376e --- /dev/null +++ b/src-tauri/gen/apple/yaak-app_iOS/yaak-app_iOS.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/src-tauri/gen/schemas/acl-manifests.json b/src-tauri/gen/schemas/acl-manifests.json new file mode 100644 index 00000000..47fc0a56 --- /dev/null +++ b/src-tauri/gen/schemas/acl-manifests.json @@ -0,0 +1 @@ +{"app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"dialog":{"default_permission":null,"permissions":{"allow-ask":{"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope.","commands":{"allow":["ask"],"deny":[]}},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope.","commands":{"allow":["confirm"],"deny":[]}},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope.","commands":{"allow":[],"deny":["ask"]}},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope.","commands":{"allow":[],"deny":["confirm"]}},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}}},"permission_sets":{},"global_scope_schema":null},"event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"fs":{"default_permission":{"identifier":"default","description":"# Tauri `fs` default permissions\n\nThis configuration file defines the default permissions granted\nto the filesystem.\n\n### Granted Permissions\n\nThis default permission set enables all read-related commands and\nallows access to the `$APP` folder and sub directories created in it.\nThe location of the `$APP` folder depends on the operating system,\nwhere the application is run.\n\nIn general the `$APP` folder needs to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\n### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n","permissions":["read-all","scope-app-recursive","deny-default"]},"permissions":{"allow-copy-file":{"identifier":"allow-copy-file","description":"Enables the copy_file command without any pre-configured scope.","commands":{"allow":["copy_file"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-exists":{"identifier":"allow-exists","description":"Enables the exists command without any pre-configured scope.","commands":{"allow":["exists"],"deny":[]}},"allow-fstat":{"identifier":"allow-fstat","description":"Enables the fstat command without any pre-configured scope.","commands":{"allow":["fstat"],"deny":[]}},"allow-ftruncate":{"identifier":"allow-ftruncate","description":"Enables the ftruncate command without any pre-configured scope.","commands":{"allow":["ftruncate"],"deny":[]}},"allow-lstat":{"identifier":"allow-lstat","description":"Enables the lstat command without any pre-configured scope.","commands":{"allow":["lstat"],"deny":[]}},"allow-mkdir":{"identifier":"allow-mkdir","description":"Enables the mkdir command without any pre-configured scope.","commands":{"allow":["mkdir"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-read":{"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]}},"allow-read-dir":{"identifier":"allow-read-dir","description":"Enables the read_dir command without any pre-configured scope.","commands":{"allow":["read_dir"],"deny":[]}},"allow-read-file":{"identifier":"allow-read-file","description":"Enables the read_file command without any pre-configured scope.","commands":{"allow":["read_file"],"deny":[]}},"allow-read-text-file":{"identifier":"allow-read-text-file","description":"Enables the read_text_file command without any pre-configured scope.","commands":{"allow":["read_text_file"],"deny":[]}},"allow-read-text-file-lines":{"identifier":"allow-read-text-file-lines","description":"Enables the read_text_file_lines command without any pre-configured scope.","commands":{"allow":["read_text_file_lines"],"deny":[]}},"allow-read-text-file-lines-next":{"identifier":"allow-read-text-file-lines-next","description":"Enables the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":["read_text_file_lines_next"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-rename":{"identifier":"allow-rename","description":"Enables the rename command without any pre-configured scope.","commands":{"allow":["rename"],"deny":[]}},"allow-seek":{"identifier":"allow-seek","description":"Enables the seek command without any pre-configured scope.","commands":{"allow":["seek"],"deny":[]}},"allow-stat":{"identifier":"allow-stat","description":"Enables the stat command without any pre-configured scope.","commands":{"allow":["stat"],"deny":[]}},"allow-truncate":{"identifier":"allow-truncate","description":"Enables the truncate command without any pre-configured scope.","commands":{"allow":["truncate"],"deny":[]}},"allow-unwatch":{"identifier":"allow-unwatch","description":"Enables the unwatch command without any pre-configured scope.","commands":{"allow":["unwatch"],"deny":[]}},"allow-watch":{"identifier":"allow-watch","description":"Enables the watch command without any pre-configured scope.","commands":{"allow":["watch"],"deny":[]}},"allow-write":{"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]}},"allow-write-file":{"identifier":"allow-write-file","description":"Enables the write_file command without any pre-configured scope.","commands":{"allow":["write_file"],"deny":[]}},"allow-write-text-file":{"identifier":"allow-write-text-file","description":"Enables the write_text_file command without any pre-configured scope.","commands":{"allow":["write_text_file"],"deny":[]}},"deny-copy-file":{"identifier":"deny-copy-file","description":"Denies the copy_file command without any pre-configured scope.","commands":{"allow":[],"deny":["copy_file"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-exists":{"identifier":"deny-exists","description":"Denies the exists command without any pre-configured scope.","commands":{"allow":[],"deny":["exists"]}},"deny-fstat":{"identifier":"deny-fstat","description":"Denies the fstat command without any pre-configured scope.","commands":{"allow":[],"deny":["fstat"]}},"deny-ftruncate":{"identifier":"deny-ftruncate","description":"Denies the ftruncate command without any pre-configured scope.","commands":{"allow":[],"deny":["ftruncate"]}},"deny-lstat":{"identifier":"deny-lstat","description":"Denies the lstat command without any pre-configured scope.","commands":{"allow":[],"deny":["lstat"]}},"deny-mkdir":{"identifier":"deny-mkdir","description":"Denies the mkdir command without any pre-configured scope.","commands":{"allow":[],"deny":["mkdir"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-read":{"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]}},"deny-read-dir":{"identifier":"deny-read-dir","description":"Denies the read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["read_dir"]}},"deny-read-file":{"identifier":"deny-read-file","description":"Denies the read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file"]}},"deny-read-text-file":{"identifier":"deny-read-text-file","description":"Denies the read_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file"]}},"deny-read-text-file-lines":{"identifier":"deny-read-text-file-lines","description":"Denies the read_text_file_lines command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines"]}},"deny-read-text-file-lines-next":{"identifier":"deny-read-text-file-lines-next","description":"Denies the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines_next"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-rename":{"identifier":"deny-rename","description":"Denies the rename command without any pre-configured scope.","commands":{"allow":[],"deny":["rename"]}},"deny-seek":{"identifier":"deny-seek","description":"Denies the seek command without any pre-configured scope.","commands":{"allow":[],"deny":["seek"]}},"deny-stat":{"identifier":"deny-stat","description":"Denies the stat command without any pre-configured scope.","commands":{"allow":[],"deny":["stat"]}},"deny-truncate":{"identifier":"deny-truncate","description":"Denies the truncate command without any pre-configured scope.","commands":{"allow":[],"deny":["truncate"]}},"deny-unwatch":{"identifier":"deny-unwatch","description":"Denies the unwatch command without any pre-configured scope.","commands":{"allow":[],"deny":["unwatch"]}},"deny-watch":{"identifier":"deny-watch","description":"Denies the watch command without any pre-configured scope.","commands":{"allow":[],"deny":["watch"]}},"deny-webview-data-linux":{"identifier":"deny-webview-data-linux","description":"This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-webview-data-windows":{"identifier":"deny-webview-data-windows","description":"This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-write":{"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]}},"deny-write-file":{"identifier":"deny-write-file","description":"Denies the write_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_file"]}},"deny-write-text-file":{"identifier":"deny-write-text-file","description":"Denies the write_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text_file"]}},"read-all":{"identifier":"read-all","description":"This enables all read related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists","watch","unwatch"],"deny":[]}},"read-dirs":{"identifier":"read-dirs","description":"This enables directory read and file metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"read-files":{"identifier":"read-files","description":"This enables file read related commands without any pre-configured accessible paths.","commands":{"allow":["read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists"],"deny":[]}},"read-meta":{"identifier":"read-meta","description":"This enables all index or metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"scope":{"identifier":"scope","description":"An empty permission you can use to modify the global scope.","commands":{"allow":[],"deny":[]}},"scope-app":{"identifier":"scope-app","description":"This scope permits access to all files and list content of top level directories in the `$APP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APP/*"}]}},"scope-app-index":{"identifier":"scope-app-index","description":"This scope permits to list all files and folders in the `$APP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APP/"}]}},"scope-app-recursive":{"identifier":"scope-app-recursive","description":"This scope recursive access to the complete `$APP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APP/**"}]}},"scope-appcache":{"identifier":"scope-appcache","description":"This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE/*"}]}},"scope-appcache-index":{"identifier":"scope-appcache-index","description":"This scope permits to list all files and folders in the `$APPCACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE/"}]}},"scope-appcache-recursive":{"identifier":"scope-appcache-recursive","description":"This scope recursive access to the complete `$APPCACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE/**"}]}},"scope-appconfig":{"identifier":"scope-appconfig","description":"This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG/*"}]}},"scope-appconfig-index":{"identifier":"scope-appconfig-index","description":"This scope permits to list all files and folders in the `$APPCONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG/"}]}},"scope-appconfig-recursive":{"identifier":"scope-appconfig-recursive","description":"This scope recursive access to the complete `$APPCONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG/**"}]}},"scope-appdata":{"identifier":"scope-appdata","description":"This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA/*"}]}},"scope-appdata-index":{"identifier":"scope-appdata-index","description":"This scope permits to list all files and folders in the `$APPDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA/"}]}},"scope-appdata-recursive":{"identifier":"scope-appdata-recursive","description":"This scope recursive access to the complete `$APPDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA/**"}]}},"scope-applocaldata":{"identifier":"scope-applocaldata","description":"This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA/*"}]}},"scope-applocaldata-index":{"identifier":"scope-applocaldata-index","description":"This scope permits to list all files and folders in the `$APPLOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA/"}]}},"scope-applocaldata-recursive":{"identifier":"scope-applocaldata-recursive","description":"This scope recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA/**"}]}},"scope-applog":{"identifier":"scope-applog","description":"This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG/*"}]}},"scope-applog-index":{"identifier":"scope-applog-index","description":"This scope permits to list all files and folders in the `$APPLOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG/"}]}},"scope-applog-recursive":{"identifier":"scope-applog-recursive","description":"This scope recursive access to the complete `$APPLOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG/**"}]}},"scope-audio":{"identifier":"scope-audio","description":"This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO/*"}]}},"scope-audio-index":{"identifier":"scope-audio-index","description":"This scope permits to list all files and folders in the `$AUDIO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO/"}]}},"scope-audio-recursive":{"identifier":"scope-audio-recursive","description":"This scope recursive access to the complete `$AUDIO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO/**"}]}},"scope-cache":{"identifier":"scope-cache","description":"This scope permits access to all files and list content of top level directories in the `$CACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE/*"}]}},"scope-cache-index":{"identifier":"scope-cache-index","description":"This scope permits to list all files and folders in the `$CACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE/"}]}},"scope-cache-recursive":{"identifier":"scope-cache-recursive","description":"This scope recursive access to the complete `$CACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE/**"}]}},"scope-config":{"identifier":"scope-config","description":"This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG/*"}]}},"scope-config-index":{"identifier":"scope-config-index","description":"This scope permits to list all files and folders in the `$CONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG/"}]}},"scope-config-recursive":{"identifier":"scope-config-recursive","description":"This scope recursive access to the complete `$CONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG/**"}]}},"scope-data":{"identifier":"scope-data","description":"This scope permits access to all files and list content of top level directories in the `$DATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA/*"}]}},"scope-data-index":{"identifier":"scope-data-index","description":"This scope permits to list all files and folders in the `$DATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA/"}]}},"scope-data-recursive":{"identifier":"scope-data-recursive","description":"This scope recursive access to the complete `$DATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA/**"}]}},"scope-desktop":{"identifier":"scope-desktop","description":"This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP/*"}]}},"scope-desktop-index":{"identifier":"scope-desktop-index","description":"This scope permits to list all files and folders in the `$DESKTOP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP/"}]}},"scope-desktop-recursive":{"identifier":"scope-desktop-recursive","description":"This scope recursive access to the complete `$DESKTOP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP/**"}]}},"scope-document":{"identifier":"scope-document","description":"This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT/*"}]}},"scope-document-index":{"identifier":"scope-document-index","description":"This scope permits to list all files and folders in the `$DOCUMENT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT/"}]}},"scope-document-recursive":{"identifier":"scope-document-recursive","description":"This scope recursive access to the complete `$DOCUMENT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT/**"}]}},"scope-download":{"identifier":"scope-download","description":"This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD/*"}]}},"scope-download-index":{"identifier":"scope-download-index","description":"This scope permits to list all files and folders in the `$DOWNLOAD`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD/"}]}},"scope-download-recursive":{"identifier":"scope-download-recursive","description":"This scope recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD/**"}]}},"scope-exe":{"identifier":"scope-exe","description":"This scope permits access to all files and list content of top level directories in the `$EXE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE/*"}]}},"scope-exe-index":{"identifier":"scope-exe-index","description":"This scope permits to list all files and folders in the `$EXE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE/"}]}},"scope-exe-recursive":{"identifier":"scope-exe-recursive","description":"This scope recursive access to the complete `$EXE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE/**"}]}},"scope-font":{"identifier":"scope-font","description":"This scope permits access to all files and list content of top level directories in the `$FONT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT/*"}]}},"scope-font-index":{"identifier":"scope-font-index","description":"This scope permits to list all files and folders in the `$FONT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT/"}]}},"scope-font-recursive":{"identifier":"scope-font-recursive","description":"This scope recursive access to the complete `$FONT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT/**"}]}},"scope-home":{"identifier":"scope-home","description":"This scope permits access to all files and list content of top level directories in the `$HOME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME/*"}]}},"scope-home-index":{"identifier":"scope-home-index","description":"This scope permits to list all files and folders in the `$HOME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME/"}]}},"scope-home-recursive":{"identifier":"scope-home-recursive","description":"This scope recursive access to the complete `$HOME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME/**"}]}},"scope-localdata":{"identifier":"scope-localdata","description":"This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA/*"}]}},"scope-localdata-index":{"identifier":"scope-localdata-index","description":"This scope permits to list all files and folders in the `$LOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA/"}]}},"scope-localdata-recursive":{"identifier":"scope-localdata-recursive","description":"This scope recursive access to the complete `$LOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA/**"}]}},"scope-log":{"identifier":"scope-log","description":"This scope permits access to all files and list content of top level directories in the `$LOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG/*"}]}},"scope-log-index":{"identifier":"scope-log-index","description":"This scope permits to list all files and folders in the `$LOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG/"}]}},"scope-log-recursive":{"identifier":"scope-log-recursive","description":"This scope recursive access to the complete `$LOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG/**"}]}},"scope-picture":{"identifier":"scope-picture","description":"This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE/*"}]}},"scope-picture-index":{"identifier":"scope-picture-index","description":"This scope permits to list all files and folders in the `$PICTURE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE/"}]}},"scope-picture-recursive":{"identifier":"scope-picture-recursive","description":"This scope recursive access to the complete `$PICTURE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE/**"}]}},"scope-public":{"identifier":"scope-public","description":"This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC/*"}]}},"scope-public-index":{"identifier":"scope-public-index","description":"This scope permits to list all files and folders in the `$PUBLIC`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC/"}]}},"scope-public-recursive":{"identifier":"scope-public-recursive","description":"This scope recursive access to the complete `$PUBLIC` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC/**"}]}},"scope-resource":{"identifier":"scope-resource","description":"This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE/*"}]}},"scope-resource-index":{"identifier":"scope-resource-index","description":"This scope permits to list all files and folders in the `$RESOURCE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE/"}]}},"scope-resource-recursive":{"identifier":"scope-resource-recursive","description":"This scope recursive access to the complete `$RESOURCE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE/**"}]}},"scope-runtime":{"identifier":"scope-runtime","description":"This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME/*"}]}},"scope-runtime-index":{"identifier":"scope-runtime-index","description":"This scope permits to list all files and folders in the `$RUNTIME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME/"}]}},"scope-runtime-recursive":{"identifier":"scope-runtime-recursive","description":"This scope recursive access to the complete `$RUNTIME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME/**"}]}},"scope-temp":{"identifier":"scope-temp","description":"This scope permits access to all files and list content of top level directories in the `$TEMP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP/*"}]}},"scope-temp-index":{"identifier":"scope-temp-index","description":"This scope permits to list all files and folders in the `$TEMP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP/"}]}},"scope-temp-recursive":{"identifier":"scope-temp-recursive","description":"This scope recursive access to the complete `$TEMP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP/**"}]}},"scope-template":{"identifier":"scope-template","description":"This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE/*"}]}},"scope-template-index":{"identifier":"scope-template-index","description":"This scope permits to list all files and folders in the `$TEMPLATE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE/"}]}},"scope-template-recursive":{"identifier":"scope-template-recursive","description":"This scope recursive access to the complete `$TEMPLATE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE/**"}]}},"scope-video":{"identifier":"scope-video","description":"This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO/*"}]}},"scope-video-index":{"identifier":"scope-video-index","description":"This scope permits to list all files and folders in the `$VIDEO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO/"}]}},"scope-video-recursive":{"identifier":"scope-video-recursive","description":"This scope recursive access to the complete `$VIDEO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO/**"}]}},"write-all":{"identifier":"write-all","description":"This enables all write related commands without any pre-configured accessible paths.","commands":{"allow":["mkdir","create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}},"write-files":{"identifier":"write-files","description":"This enables all file write related commands without any pre-configured accessible paths.","commands":{"allow":["create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}}},"permission_sets":{"allow-app-meta":{"identifier":"allow-app-meta","description":"This allows read access to metadata of the `$APP` folder, including file listing and statistics.","permissions":["read-meta","scope-app-index"]},"allow-app-meta-recursive":{"identifier":"allow-app-meta-recursive","description":"This allows read access to metadata of the `$APP` folder, including file listing and statistics.","permissions":["read-meta","scope-app-recursive"]},"allow-app-read":{"identifier":"allow-app-read","description":"This allows non-recursive read access to the `$APP` folder.","permissions":["read-all","scope-app"]},"allow-app-read-recursive":{"identifier":"allow-app-read-recursive","description":"This allows full recursive read access to the complete `$APP` folder, files and subdirectories.","permissions":["read-all","scope-app-recursive"]},"allow-app-write":{"identifier":"allow-app-write","description":"This allows non-recursive write access to the `$APP` folder.","permissions":["write-all","scope-app"]},"allow-app-write-recursive":{"identifier":"allow-app-write-recursive","description":"This allows full recursive write access to the complete `$APP` folder, files and subdirectories.","permissions":["write-all","scope-app-recursive"]},"allow-appcache-meta":{"identifier":"allow-appcache-meta","description":"This allows read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-index"]},"allow-appcache-meta-recursive":{"identifier":"allow-appcache-meta-recursive","description":"This allows read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-recursive"]},"allow-appcache-read":{"identifier":"allow-appcache-read","description":"This allows non-recursive read access to the `$APPCACHE` folder.","permissions":["read-all","scope-appcache"]},"allow-appcache-read-recursive":{"identifier":"allow-appcache-read-recursive","description":"This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["read-all","scope-appcache-recursive"]},"allow-appcache-write":{"identifier":"allow-appcache-write","description":"This allows non-recursive write access to the `$APPCACHE` folder.","permissions":["write-all","scope-appcache"]},"allow-appcache-write-recursive":{"identifier":"allow-appcache-write-recursive","description":"This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["write-all","scope-appcache-recursive"]},"allow-appconfig-meta":{"identifier":"allow-appconfig-meta","description":"This allows read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-index"]},"allow-appconfig-meta-recursive":{"identifier":"allow-appconfig-meta-recursive","description":"This allows read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-recursive"]},"allow-appconfig-read":{"identifier":"allow-appconfig-read","description":"This allows non-recursive read access to the `$APPCONFIG` folder.","permissions":["read-all","scope-appconfig"]},"allow-appconfig-read-recursive":{"identifier":"allow-appconfig-read-recursive","description":"This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["read-all","scope-appconfig-recursive"]},"allow-appconfig-write":{"identifier":"allow-appconfig-write","description":"This allows non-recursive write access to the `$APPCONFIG` folder.","permissions":["write-all","scope-appconfig"]},"allow-appconfig-write-recursive":{"identifier":"allow-appconfig-write-recursive","description":"This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["write-all","scope-appconfig-recursive"]},"allow-appdata-meta":{"identifier":"allow-appdata-meta","description":"This allows read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-index"]},"allow-appdata-meta-recursive":{"identifier":"allow-appdata-meta-recursive","description":"This allows read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-recursive"]},"allow-appdata-read":{"identifier":"allow-appdata-read","description":"This allows non-recursive read access to the `$APPDATA` folder.","permissions":["read-all","scope-appdata"]},"allow-appdata-read-recursive":{"identifier":"allow-appdata-read-recursive","description":"This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["read-all","scope-appdata-recursive"]},"allow-appdata-write":{"identifier":"allow-appdata-write","description":"This allows non-recursive write access to the `$APPDATA` folder.","permissions":["write-all","scope-appdata"]},"allow-appdata-write-recursive":{"identifier":"allow-appdata-write-recursive","description":"This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["write-all","scope-appdata-recursive"]},"allow-applocaldata-meta":{"identifier":"allow-applocaldata-meta","description":"This allows read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-index"]},"allow-applocaldata-meta-recursive":{"identifier":"allow-applocaldata-meta-recursive","description":"This allows read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-recursive"]},"allow-applocaldata-read":{"identifier":"allow-applocaldata-read","description":"This allows non-recursive read access to the `$APPLOCALDATA` folder.","permissions":["read-all","scope-applocaldata"]},"allow-applocaldata-read-recursive":{"identifier":"allow-applocaldata-read-recursive","description":"This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-applocaldata-recursive"]},"allow-applocaldata-write":{"identifier":"allow-applocaldata-write","description":"This allows non-recursive write access to the `$APPLOCALDATA` folder.","permissions":["write-all","scope-applocaldata"]},"allow-applocaldata-write-recursive":{"identifier":"allow-applocaldata-write-recursive","description":"This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-applocaldata-recursive"]},"allow-applog-meta":{"identifier":"allow-applog-meta","description":"This allows read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-index"]},"allow-applog-meta-recursive":{"identifier":"allow-applog-meta-recursive","description":"This allows read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-recursive"]},"allow-applog-read":{"identifier":"allow-applog-read","description":"This allows non-recursive read access to the `$APPLOG` folder.","permissions":["read-all","scope-applog"]},"allow-applog-read-recursive":{"identifier":"allow-applog-read-recursive","description":"This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["read-all","scope-applog-recursive"]},"allow-applog-write":{"identifier":"allow-applog-write","description":"This allows non-recursive write access to the `$APPLOG` folder.","permissions":["write-all","scope-applog"]},"allow-applog-write-recursive":{"identifier":"allow-applog-write-recursive","description":"This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["write-all","scope-applog-recursive"]},"allow-audio-meta":{"identifier":"allow-audio-meta","description":"This allows read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-index"]},"allow-audio-meta-recursive":{"identifier":"allow-audio-meta-recursive","description":"This allows read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-recursive"]},"allow-audio-read":{"identifier":"allow-audio-read","description":"This allows non-recursive read access to the `$AUDIO` folder.","permissions":["read-all","scope-audio"]},"allow-audio-read-recursive":{"identifier":"allow-audio-read-recursive","description":"This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["read-all","scope-audio-recursive"]},"allow-audio-write":{"identifier":"allow-audio-write","description":"This allows non-recursive write access to the `$AUDIO` folder.","permissions":["write-all","scope-audio"]},"allow-audio-write-recursive":{"identifier":"allow-audio-write-recursive","description":"This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["write-all","scope-audio-recursive"]},"allow-cache-meta":{"identifier":"allow-cache-meta","description":"This allows read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-index"]},"allow-cache-meta-recursive":{"identifier":"allow-cache-meta-recursive","description":"This allows read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-recursive"]},"allow-cache-read":{"identifier":"allow-cache-read","description":"This allows non-recursive read access to the `$CACHE` folder.","permissions":["read-all","scope-cache"]},"allow-cache-read-recursive":{"identifier":"allow-cache-read-recursive","description":"This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.","permissions":["read-all","scope-cache-recursive"]},"allow-cache-write":{"identifier":"allow-cache-write","description":"This allows non-recursive write access to the `$CACHE` folder.","permissions":["write-all","scope-cache"]},"allow-cache-write-recursive":{"identifier":"allow-cache-write-recursive","description":"This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.","permissions":["write-all","scope-cache-recursive"]},"allow-config-meta":{"identifier":"allow-config-meta","description":"This allows read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-index"]},"allow-config-meta-recursive":{"identifier":"allow-config-meta-recursive","description":"This allows read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-recursive"]},"allow-config-read":{"identifier":"allow-config-read","description":"This allows non-recursive read access to the `$CONFIG` folder.","permissions":["read-all","scope-config"]},"allow-config-read-recursive":{"identifier":"allow-config-read-recursive","description":"This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["read-all","scope-config-recursive"]},"allow-config-write":{"identifier":"allow-config-write","description":"This allows non-recursive write access to the `$CONFIG` folder.","permissions":["write-all","scope-config"]},"allow-config-write-recursive":{"identifier":"allow-config-write-recursive","description":"This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["write-all","scope-config-recursive"]},"allow-data-meta":{"identifier":"allow-data-meta","description":"This allows read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-index"]},"allow-data-meta-recursive":{"identifier":"allow-data-meta-recursive","description":"This allows read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-recursive"]},"allow-data-read":{"identifier":"allow-data-read","description":"This allows non-recursive read access to the `$DATA` folder.","permissions":["read-all","scope-data"]},"allow-data-read-recursive":{"identifier":"allow-data-read-recursive","description":"This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.","permissions":["read-all","scope-data-recursive"]},"allow-data-write":{"identifier":"allow-data-write","description":"This allows non-recursive write access to the `$DATA` folder.","permissions":["write-all","scope-data"]},"allow-data-write-recursive":{"identifier":"allow-data-write-recursive","description":"This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.","permissions":["write-all","scope-data-recursive"]},"allow-desktop-meta":{"identifier":"allow-desktop-meta","description":"This allows read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-index"]},"allow-desktop-meta-recursive":{"identifier":"allow-desktop-meta-recursive","description":"This allows read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-recursive"]},"allow-desktop-read":{"identifier":"allow-desktop-read","description":"This allows non-recursive read access to the `$DESKTOP` folder.","permissions":["read-all","scope-desktop"]},"allow-desktop-read-recursive":{"identifier":"allow-desktop-read-recursive","description":"This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["read-all","scope-desktop-recursive"]},"allow-desktop-write":{"identifier":"allow-desktop-write","description":"This allows non-recursive write access to the `$DESKTOP` folder.","permissions":["write-all","scope-desktop"]},"allow-desktop-write-recursive":{"identifier":"allow-desktop-write-recursive","description":"This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["write-all","scope-desktop-recursive"]},"allow-document-meta":{"identifier":"allow-document-meta","description":"This allows read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-index"]},"allow-document-meta-recursive":{"identifier":"allow-document-meta-recursive","description":"This allows read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-recursive"]},"allow-document-read":{"identifier":"allow-document-read","description":"This allows non-recursive read access to the `$DOCUMENT` folder.","permissions":["read-all","scope-document"]},"allow-document-read-recursive":{"identifier":"allow-document-read-recursive","description":"This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["read-all","scope-document-recursive"]},"allow-document-write":{"identifier":"allow-document-write","description":"This allows non-recursive write access to the `$DOCUMENT` folder.","permissions":["write-all","scope-document"]},"allow-document-write-recursive":{"identifier":"allow-document-write-recursive","description":"This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["write-all","scope-document-recursive"]},"allow-download-meta":{"identifier":"allow-download-meta","description":"This allows read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-index"]},"allow-download-meta-recursive":{"identifier":"allow-download-meta-recursive","description":"This allows read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-recursive"]},"allow-download-read":{"identifier":"allow-download-read","description":"This allows non-recursive read access to the `$DOWNLOAD` folder.","permissions":["read-all","scope-download"]},"allow-download-read-recursive":{"identifier":"allow-download-read-recursive","description":"This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["read-all","scope-download-recursive"]},"allow-download-write":{"identifier":"allow-download-write","description":"This allows non-recursive write access to the `$DOWNLOAD` folder.","permissions":["write-all","scope-download"]},"allow-download-write-recursive":{"identifier":"allow-download-write-recursive","description":"This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["write-all","scope-download-recursive"]},"allow-exe-meta":{"identifier":"allow-exe-meta","description":"This allows read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-index"]},"allow-exe-meta-recursive":{"identifier":"allow-exe-meta-recursive","description":"This allows read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-recursive"]},"allow-exe-read":{"identifier":"allow-exe-read","description":"This allows non-recursive read access to the `$EXE` folder.","permissions":["read-all","scope-exe"]},"allow-exe-read-recursive":{"identifier":"allow-exe-read-recursive","description":"This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.","permissions":["read-all","scope-exe-recursive"]},"allow-exe-write":{"identifier":"allow-exe-write","description":"This allows non-recursive write access to the `$EXE` folder.","permissions":["write-all","scope-exe"]},"allow-exe-write-recursive":{"identifier":"allow-exe-write-recursive","description":"This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.","permissions":["write-all","scope-exe-recursive"]},"allow-font-meta":{"identifier":"allow-font-meta","description":"This allows read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-index"]},"allow-font-meta-recursive":{"identifier":"allow-font-meta-recursive","description":"This allows read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-recursive"]},"allow-font-read":{"identifier":"allow-font-read","description":"This allows non-recursive read access to the `$FONT` folder.","permissions":["read-all","scope-font"]},"allow-font-read-recursive":{"identifier":"allow-font-read-recursive","description":"This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.","permissions":["read-all","scope-font-recursive"]},"allow-font-write":{"identifier":"allow-font-write","description":"This allows non-recursive write access to the `$FONT` folder.","permissions":["write-all","scope-font"]},"allow-font-write-recursive":{"identifier":"allow-font-write-recursive","description":"This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.","permissions":["write-all","scope-font-recursive"]},"allow-home-meta":{"identifier":"allow-home-meta","description":"This allows read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-index"]},"allow-home-meta-recursive":{"identifier":"allow-home-meta-recursive","description":"This allows read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-recursive"]},"allow-home-read":{"identifier":"allow-home-read","description":"This allows non-recursive read access to the `$HOME` folder.","permissions":["read-all","scope-home"]},"allow-home-read-recursive":{"identifier":"allow-home-read-recursive","description":"This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.","permissions":["read-all","scope-home-recursive"]},"allow-home-write":{"identifier":"allow-home-write","description":"This allows non-recursive write access to the `$HOME` folder.","permissions":["write-all","scope-home"]},"allow-home-write-recursive":{"identifier":"allow-home-write-recursive","description":"This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.","permissions":["write-all","scope-home-recursive"]},"allow-localdata-meta":{"identifier":"allow-localdata-meta","description":"This allows read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-index"]},"allow-localdata-meta-recursive":{"identifier":"allow-localdata-meta-recursive","description":"This allows read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-recursive"]},"allow-localdata-read":{"identifier":"allow-localdata-read","description":"This allows non-recursive read access to the `$LOCALDATA` folder.","permissions":["read-all","scope-localdata"]},"allow-localdata-read-recursive":{"identifier":"allow-localdata-read-recursive","description":"This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-localdata-recursive"]},"allow-localdata-write":{"identifier":"allow-localdata-write","description":"This allows non-recursive write access to the `$LOCALDATA` folder.","permissions":["write-all","scope-localdata"]},"allow-localdata-write-recursive":{"identifier":"allow-localdata-write-recursive","description":"This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-localdata-recursive"]},"allow-log-meta":{"identifier":"allow-log-meta","description":"This allows read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-index"]},"allow-log-meta-recursive":{"identifier":"allow-log-meta-recursive","description":"This allows read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-recursive"]},"allow-log-read":{"identifier":"allow-log-read","description":"This allows non-recursive read access to the `$LOG` folder.","permissions":["read-all","scope-log"]},"allow-log-read-recursive":{"identifier":"allow-log-read-recursive","description":"This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.","permissions":["read-all","scope-log-recursive"]},"allow-log-write":{"identifier":"allow-log-write","description":"This allows non-recursive write access to the `$LOG` folder.","permissions":["write-all","scope-log"]},"allow-log-write-recursive":{"identifier":"allow-log-write-recursive","description":"This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.","permissions":["write-all","scope-log-recursive"]},"allow-picture-meta":{"identifier":"allow-picture-meta","description":"This allows read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-index"]},"allow-picture-meta-recursive":{"identifier":"allow-picture-meta-recursive","description":"This allows read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-recursive"]},"allow-picture-read":{"identifier":"allow-picture-read","description":"This allows non-recursive read access to the `$PICTURE` folder.","permissions":["read-all","scope-picture"]},"allow-picture-read-recursive":{"identifier":"allow-picture-read-recursive","description":"This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["read-all","scope-picture-recursive"]},"allow-picture-write":{"identifier":"allow-picture-write","description":"This allows non-recursive write access to the `$PICTURE` folder.","permissions":["write-all","scope-picture"]},"allow-picture-write-recursive":{"identifier":"allow-picture-write-recursive","description":"This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["write-all","scope-picture-recursive"]},"allow-public-meta":{"identifier":"allow-public-meta","description":"This allows read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-index"]},"allow-public-meta-recursive":{"identifier":"allow-public-meta-recursive","description":"This allows read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-recursive"]},"allow-public-read":{"identifier":"allow-public-read","description":"This allows non-recursive read access to the `$PUBLIC` folder.","permissions":["read-all","scope-public"]},"allow-public-read-recursive":{"identifier":"allow-public-read-recursive","description":"This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["read-all","scope-public-recursive"]},"allow-public-write":{"identifier":"allow-public-write","description":"This allows non-recursive write access to the `$PUBLIC` folder.","permissions":["write-all","scope-public"]},"allow-public-write-recursive":{"identifier":"allow-public-write-recursive","description":"This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["write-all","scope-public-recursive"]},"allow-resource-meta":{"identifier":"allow-resource-meta","description":"This allows read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-index"]},"allow-resource-meta-recursive":{"identifier":"allow-resource-meta-recursive","description":"This allows read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-recursive"]},"allow-resource-read":{"identifier":"allow-resource-read","description":"This allows non-recursive read access to the `$RESOURCE` folder.","permissions":["read-all","scope-resource"]},"allow-resource-read-recursive":{"identifier":"allow-resource-read-recursive","description":"This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["read-all","scope-resource-recursive"]},"allow-resource-write":{"identifier":"allow-resource-write","description":"This allows non-recursive write access to the `$RESOURCE` folder.","permissions":["write-all","scope-resource"]},"allow-resource-write-recursive":{"identifier":"allow-resource-write-recursive","description":"This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["write-all","scope-resource-recursive"]},"allow-runtime-meta":{"identifier":"allow-runtime-meta","description":"This allows read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-index"]},"allow-runtime-meta-recursive":{"identifier":"allow-runtime-meta-recursive","description":"This allows read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-recursive"]},"allow-runtime-read":{"identifier":"allow-runtime-read","description":"This allows non-recursive read access to the `$RUNTIME` folder.","permissions":["read-all","scope-runtime"]},"allow-runtime-read-recursive":{"identifier":"allow-runtime-read-recursive","description":"This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["read-all","scope-runtime-recursive"]},"allow-runtime-write":{"identifier":"allow-runtime-write","description":"This allows non-recursive write access to the `$RUNTIME` folder.","permissions":["write-all","scope-runtime"]},"allow-runtime-write-recursive":{"identifier":"allow-runtime-write-recursive","description":"This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["write-all","scope-runtime-recursive"]},"allow-temp-meta":{"identifier":"allow-temp-meta","description":"This allows read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-index"]},"allow-temp-meta-recursive":{"identifier":"allow-temp-meta-recursive","description":"This allows read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-recursive"]},"allow-temp-read":{"identifier":"allow-temp-read","description":"This allows non-recursive read access to the `$TEMP` folder.","permissions":["read-all","scope-temp"]},"allow-temp-read-recursive":{"identifier":"allow-temp-read-recursive","description":"This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.","permissions":["read-all","scope-temp-recursive"]},"allow-temp-write":{"identifier":"allow-temp-write","description":"This allows non-recursive write access to the `$TEMP` folder.","permissions":["write-all","scope-temp"]},"allow-temp-write-recursive":{"identifier":"allow-temp-write-recursive","description":"This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.","permissions":["write-all","scope-temp-recursive"]},"allow-template-meta":{"identifier":"allow-template-meta","description":"This allows read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-index"]},"allow-template-meta-recursive":{"identifier":"allow-template-meta-recursive","description":"This allows read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-recursive"]},"allow-template-read":{"identifier":"allow-template-read","description":"This allows non-recursive read access to the `$TEMPLATE` folder.","permissions":["read-all","scope-template"]},"allow-template-read-recursive":{"identifier":"allow-template-read-recursive","description":"This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["read-all","scope-template-recursive"]},"allow-template-write":{"identifier":"allow-template-write","description":"This allows non-recursive write access to the `$TEMPLATE` folder.","permissions":["write-all","scope-template"]},"allow-template-write-recursive":{"identifier":"allow-template-write-recursive","description":"This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["write-all","scope-template-recursive"]},"allow-video-meta":{"identifier":"allow-video-meta","description":"This allows read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-index"]},"allow-video-meta-recursive":{"identifier":"allow-video-meta-recursive","description":"This allows read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-recursive"]},"allow-video-read":{"identifier":"allow-video-read","description":"This allows non-recursive read access to the `$VIDEO` folder.","permissions":["read-all","scope-video"]},"allow-video-read-recursive":{"identifier":"allow-video-read-recursive","description":"This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["read-all","scope-video-recursive"]},"allow-video-write":{"identifier":"allow-video-write","description":"This allows non-recursive write access to the `$VIDEO` folder.","permissions":["write-all","scope-video"]},"allow-video-write-recursive":{"identifier":"allow-video-write-recursive","description":"This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["write-all","scope-video-recursive"]},"deny-default":{"identifier":"deny-default","description":"This denies access to dangerous Tauri relevant files and folders by default.","permissions":["deny-webview-data-linux","deny-webview-data-windows"]}},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"FS scope path.","type":"string"},{"properties":{"path":{"description":"FS scope path.","type":"string"}},"required":["path"],"type":"object"}],"description":"FS scope entry.","title":"FsScopeEntry"}},"image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"log":{"default_permission":{"identifier":"default","description":"Allows the log command","permissions":["allow-log"]},"permissions":{"allow-log":{"identifier":"allow-log","description":"Enables the log command without any pre-configured scope.","commands":{"allow":["log"],"deny":[]}},"deny-log":{"identifier":"deny-log","description":"Denies the log command without any pre-configured scope.","commands":{"allow":[],"deny":["log"]}}},"permission_sets":{},"global_scope_schema":null},"menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":[]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"os":{"default_permission":null,"permissions":{"allow-arch":{"identifier":"allow-arch","description":"Enables the arch command without any pre-configured scope.","commands":{"allow":["arch"],"deny":[]}},"allow-exe-extension":{"identifier":"allow-exe-extension","description":"Enables the exe_extension command without any pre-configured scope.","commands":{"allow":["exe_extension"],"deny":[]}},"allow-family":{"identifier":"allow-family","description":"Enables the family command without any pre-configured scope.","commands":{"allow":["family"],"deny":[]}},"allow-hostname":{"identifier":"allow-hostname","description":"Enables the hostname command without any pre-configured scope.","commands":{"allow":["hostname"],"deny":[]}},"allow-locale":{"identifier":"allow-locale","description":"Enables the locale command without any pre-configured scope.","commands":{"allow":["locale"],"deny":[]}},"allow-os-type":{"identifier":"allow-os-type","description":"Enables the os_type command without any pre-configured scope.","commands":{"allow":["os_type"],"deny":[]}},"allow-platform":{"identifier":"allow-platform","description":"Enables the platform command without any pre-configured scope.","commands":{"allow":["platform"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-arch":{"identifier":"deny-arch","description":"Denies the arch command without any pre-configured scope.","commands":{"allow":[],"deny":["arch"]}},"deny-exe-extension":{"identifier":"deny-exe-extension","description":"Denies the exe_extension command without any pre-configured scope.","commands":{"allow":[],"deny":["exe_extension"]}},"deny-family":{"identifier":"deny-family","description":"Denies the family command without any pre-configured scope.","commands":{"allow":[],"deny":["family"]}},"deny-hostname":{"identifier":"deny-hostname","description":"Denies the hostname command without any pre-configured scope.","commands":{"allow":[],"deny":["hostname"]}},"deny-locale":{"identifier":"deny-locale","description":"Denies the locale command without any pre-configured scope.","commands":{"allow":[],"deny":["locale"]}},"deny-os-type":{"identifier":"deny-os-type","description":"Denies the os_type command without any pre-configured scope.","commands":{"allow":[],"deny":["os_type"]}},"deny-platform":{"identifier":"deny-platform","description":"Denies the platform command without any pre-configured scope.","commands":{"allow":[],"deny":["platform"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":null,"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"ShellAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","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"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellAllowedArgs":{"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.","items":{"$ref":"#/definitions/ShellAllowedArg"},"type":"array"}],"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."}},"description":"A command allowed to be executed by the webview API.","properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellAllowedArgs"}],"description":"The allowed arguments for the command execution."},"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"}},"required":["args","cmd","name","sidecar"],"title":"Entry","type":"object"}},"tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":[]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"updater":{"default_permission":{"identifier":"default","description":"Allows checking for new updates and installing them","permissions":["allow-check","allow-download-and-install"]},"permissions":{"allow-check":{"identifier":"allow-check","description":"Enables the check command without any pre-configured scope.","commands":{"allow":["check"],"deny":[]}},"allow-download-and-install":{"identifier":"allow-download-and-install","description":"Enables the download_and_install command without any pre-configured scope.","commands":{"allow":["download_and_install"],"deny":[]}},"deny-check":{"identifier":"deny-check","description":"Denies the check command without any pre-configured scope.","commands":{"allow":[],"deny":["check"]}},"deny-download-and-install":{"identifier":"deny-download-and-install","description":"Denies the download_and_install command without any pre-configured scope.","commands":{"allow":[],"deny":["download_and_install"]}}},"permission_sets":{},"global_scope_schema":null},"webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-title","allow-current-monitor","allow-primary-monitor","allow-available-monitors","allow-cursor-position","allow-theme","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"window-state":{"default_permission":null,"permissions":{"allow-filename":{"identifier":"allow-filename","description":"Enables the filename command without any pre-configured scope.","commands":{"allow":["filename"],"deny":[]}},"allow-restore-state":{"identifier":"allow-restore-state","description":"Enables the restore_state command without any pre-configured scope.","commands":{"allow":["restore_state"],"deny":[]}},"allow-save-window-state":{"identifier":"allow-save-window-state","description":"Enables the save_window_state command without any pre-configured scope.","commands":{"allow":["save_window_state"],"deny":[]}},"deny-filename":{"identifier":"deny-filename","description":"Denies the filename command without any pre-configured scope.","commands":{"allow":[],"deny":["filename"]}},"deny-restore-state":{"identifier":"deny-restore-state","description":"Denies the restore_state command without any pre-configured scope.","commands":{"allow":[],"deny":["restore_state"]}},"deny-save-window-state":{"identifier":"deny-save-window-state","description":"Denies the save_window_state command without any pre-configured scope.","commands":{"allow":[],"deny":["save_window_state"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file diff --git a/src-tauri/gen/schemas/capabilities.json b/src-tauri/gen/schemas/capabilities.json new file mode 100644 index 00000000..1eb9091b --- /dev/null +++ b/src-tauri/gen/schemas/capabilities.json @@ -0,0 +1 @@ +{"main":{"identifier":"main","description":"Main permissions","local":true,"windows":["*"],"permissions":["os:allow-os-type","menu:allow-create-default","dialog:allow-open","dialog:allow-save","event:allow-listen","event:allow-unlisten","fs:allow-read-file","fs:allow-read-text-file",{"identifier":"fs:scope","allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]},"shell:allow-open",{"identifier":"shell:allow-execute","allow":[{"args":true,"name":"protoc","sidecar":true}]},"window:allow-close","window:allow-is-fullscreen","window:allow-maximize","window:allow-minimize","window:allow-set-decorations","window:allow-set-title","window:allow-start-dragging","window:allow-unmaximize"]}} \ No newline at end of file diff --git a/src-tauri/gen/schemas/desktop-schema.json b/src-tauri/gen/schemas/desktop-schema.json new file mode 100644 index 00000000..25378ff6 --- /dev/null +++ b/src-tauri/gen/schemas/desktop-schema.json @@ -0,0 +1,6701 @@ +{ + "$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": [ + { + "description": "fs:default -> # Tauri `fs` default permissions\n\nThis configuration file defines the default permissions granted\nto the filesystem.\n\n### Granted Permissions\n\nThis default permission set enables all read-related commands and\nallows access to the `$APP` folder and sub directories created in it.\nThe location of the `$APP` folder depends on the operating system,\nwhere the application is run.\n\nIn general the `$APP` folder needs to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\n### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n", + "type": "string", + "enum": [ + "fs:default" + ] + }, + { + "description": "fs:allow-app-meta -> This allows read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta" + ] + }, + { + "description": "fs:allow-app-meta-recursive -> This allows read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta-recursive" + ] + }, + { + "description": "fs:allow-app-read -> This allows non-recursive read access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-read" + ] + }, + { + "description": "fs:allow-app-read-recursive -> This allows full recursive read access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-read-recursive" + ] + }, + { + "description": "fs:allow-app-write -> This allows non-recursive write access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-write" + ] + }, + { + "description": "fs:allow-app-write-recursive -> This allows full recursive write access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-write-recursive" + ] + }, + { + "description": "fs:allow-appcache-meta -> This allows read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta" + ] + }, + { + "description": "fs:allow-appcache-meta-recursive -> This allows read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta-recursive" + ] + }, + { + "description": "fs:allow-appcache-read -> This allows non-recursive read access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-read" + ] + }, + { + "description": "fs:allow-appcache-read-recursive -> This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-read-recursive" + ] + }, + { + "description": "fs:allow-appcache-write -> This allows non-recursive write access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-write" + ] + }, + { + "description": "fs:allow-appcache-write-recursive -> This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-write-recursive" + ] + }, + { + "description": "fs:allow-appconfig-meta -> This allows read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta" + ] + }, + { + "description": "fs:allow-appconfig-meta-recursive -> This allows read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta-recursive" + ] + }, + { + "description": "fs:allow-appconfig-read -> This allows non-recursive read access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read" + ] + }, + { + "description": "fs:allow-appconfig-read-recursive -> This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read-recursive" + ] + }, + { + "description": "fs:allow-appconfig-write -> This allows non-recursive write access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write" + ] + }, + { + "description": "fs:allow-appconfig-write-recursive -> This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write-recursive" + ] + }, + { + "description": "fs:allow-appdata-meta -> This allows read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta" + ] + }, + { + "description": "fs:allow-appdata-meta-recursive -> This allows read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta-recursive" + ] + }, + { + "description": "fs:allow-appdata-read -> This allows non-recursive read access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-read" + ] + }, + { + "description": "fs:allow-appdata-read-recursive -> This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-read-recursive" + ] + }, + { + "description": "fs:allow-appdata-write -> This allows non-recursive write access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-write" + ] + }, + { + "description": "fs:allow-appdata-write-recursive -> This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-write-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-meta -> This allows read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta" + ] + }, + { + "description": "fs:allow-applocaldata-meta-recursive -> This allows read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-read -> This allows non-recursive read access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read" + ] + }, + { + "description": "fs:allow-applocaldata-read-recursive -> This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-write -> This allows non-recursive write access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write" + ] + }, + { + "description": "fs:allow-applocaldata-write-recursive -> This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write-recursive" + ] + }, + { + "description": "fs:allow-applog-meta -> This allows read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta" + ] + }, + { + "description": "fs:allow-applog-meta-recursive -> This allows read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta-recursive" + ] + }, + { + "description": "fs:allow-applog-read -> This allows non-recursive read access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-read" + ] + }, + { + "description": "fs:allow-applog-read-recursive -> This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-read-recursive" + ] + }, + { + "description": "fs:allow-applog-write -> This allows non-recursive write access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-write" + ] + }, + { + "description": "fs:allow-applog-write-recursive -> This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-write-recursive" + ] + }, + { + "description": "fs:allow-audio-meta -> This allows read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta" + ] + }, + { + "description": "fs:allow-audio-meta-recursive -> This allows read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta-recursive" + ] + }, + { + "description": "fs:allow-audio-read -> This allows non-recursive read access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-read" + ] + }, + { + "description": "fs:allow-audio-read-recursive -> This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-read-recursive" + ] + }, + { + "description": "fs:allow-audio-write -> This allows non-recursive write access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-write" + ] + }, + { + "description": "fs:allow-audio-write-recursive -> This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-write-recursive" + ] + }, + { + "description": "fs:allow-cache-meta -> This allows read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta" + ] + }, + { + "description": "fs:allow-cache-meta-recursive -> This allows read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta-recursive" + ] + }, + { + "description": "fs:allow-cache-read -> This allows non-recursive read access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-read" + ] + }, + { + "description": "fs:allow-cache-read-recursive -> This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-read-recursive" + ] + }, + { + "description": "fs:allow-cache-write -> This allows non-recursive write access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-write" + ] + }, + { + "description": "fs:allow-cache-write-recursive -> This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-write-recursive" + ] + }, + { + "description": "fs:allow-config-meta -> This allows read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta" + ] + }, + { + "description": "fs:allow-config-meta-recursive -> This allows read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta-recursive" + ] + }, + { + "description": "fs:allow-config-read -> This allows non-recursive read access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-read" + ] + }, + { + "description": "fs:allow-config-read-recursive -> This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-read-recursive" + ] + }, + { + "description": "fs:allow-config-write -> This allows non-recursive write access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-write" + ] + }, + { + "description": "fs:allow-config-write-recursive -> This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-write-recursive" + ] + }, + { + "description": "fs:allow-data-meta -> This allows read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta" + ] + }, + { + "description": "fs:allow-data-meta-recursive -> This allows read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta-recursive" + ] + }, + { + "description": "fs:allow-data-read -> This allows non-recursive read access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-read" + ] + }, + { + "description": "fs:allow-data-read-recursive -> This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-read-recursive" + ] + }, + { + "description": "fs:allow-data-write -> This allows non-recursive write access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-write" + ] + }, + { + "description": "fs:allow-data-write-recursive -> This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-write-recursive" + ] + }, + { + "description": "fs:allow-desktop-meta -> This allows read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta" + ] + }, + { + "description": "fs:allow-desktop-meta-recursive -> This allows read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta-recursive" + ] + }, + { + "description": "fs:allow-desktop-read -> This allows non-recursive read access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-read" + ] + }, + { + "description": "fs:allow-desktop-read-recursive -> This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-read-recursive" + ] + }, + { + "description": "fs:allow-desktop-write -> This allows non-recursive write access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-write" + ] + }, + { + "description": "fs:allow-desktop-write-recursive -> This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-write-recursive" + ] + }, + { + "description": "fs:allow-document-meta -> This allows read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta" + ] + }, + { + "description": "fs:allow-document-meta-recursive -> This allows read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta-recursive" + ] + }, + { + "description": "fs:allow-document-read -> This allows non-recursive read access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-read" + ] + }, + { + "description": "fs:allow-document-read-recursive -> This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-read-recursive" + ] + }, + { + "description": "fs:allow-document-write -> This allows non-recursive write access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-write" + ] + }, + { + "description": "fs:allow-document-write-recursive -> This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-write-recursive" + ] + }, + { + "description": "fs:allow-download-meta -> This allows read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta" + ] + }, + { + "description": "fs:allow-download-meta-recursive -> This allows read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta-recursive" + ] + }, + { + "description": "fs:allow-download-read -> This allows non-recursive read access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-read" + ] + }, + { + "description": "fs:allow-download-read-recursive -> This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-read-recursive" + ] + }, + { + "description": "fs:allow-download-write -> This allows non-recursive write access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-write" + ] + }, + { + "description": "fs:allow-download-write-recursive -> This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-write-recursive" + ] + }, + { + "description": "fs:allow-exe-meta -> This allows read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta" + ] + }, + { + "description": "fs:allow-exe-meta-recursive -> This allows read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta-recursive" + ] + }, + { + "description": "fs:allow-exe-read -> This allows non-recursive read access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-read" + ] + }, + { + "description": "fs:allow-exe-read-recursive -> This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-read-recursive" + ] + }, + { + "description": "fs:allow-exe-write -> This allows non-recursive write access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-write" + ] + }, + { + "description": "fs:allow-exe-write-recursive -> This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-write-recursive" + ] + }, + { + "description": "fs:allow-font-meta -> This allows read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta" + ] + }, + { + "description": "fs:allow-font-meta-recursive -> This allows read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta-recursive" + ] + }, + { + "description": "fs:allow-font-read -> This allows non-recursive read access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-read" + ] + }, + { + "description": "fs:allow-font-read-recursive -> This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-read-recursive" + ] + }, + { + "description": "fs:allow-font-write -> This allows non-recursive write access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-write" + ] + }, + { + "description": "fs:allow-font-write-recursive -> This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-write-recursive" + ] + }, + { + "description": "fs:allow-home-meta -> This allows read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta" + ] + }, + { + "description": "fs:allow-home-meta-recursive -> This allows read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta-recursive" + ] + }, + { + "description": "fs:allow-home-read -> This allows non-recursive read access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-read" + ] + }, + { + "description": "fs:allow-home-read-recursive -> This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-read-recursive" + ] + }, + { + "description": "fs:allow-home-write -> This allows non-recursive write access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-write" + ] + }, + { + "description": "fs:allow-home-write-recursive -> This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-write-recursive" + ] + }, + { + "description": "fs:allow-localdata-meta -> This allows read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta" + ] + }, + { + "description": "fs:allow-localdata-meta-recursive -> This allows read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta-recursive" + ] + }, + { + "description": "fs:allow-localdata-read -> This allows non-recursive read access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-read" + ] + }, + { + "description": "fs:allow-localdata-read-recursive -> This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-read-recursive" + ] + }, + { + "description": "fs:allow-localdata-write -> This allows non-recursive write access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-write" + ] + }, + { + "description": "fs:allow-localdata-write-recursive -> This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-write-recursive" + ] + }, + { + "description": "fs:allow-log-meta -> This allows read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta" + ] + }, + { + "description": "fs:allow-log-meta-recursive -> This allows read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta-recursive" + ] + }, + { + "description": "fs:allow-log-read -> This allows non-recursive read access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-read" + ] + }, + { + "description": "fs:allow-log-read-recursive -> This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-read-recursive" + ] + }, + { + "description": "fs:allow-log-write -> This allows non-recursive write access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-write" + ] + }, + { + "description": "fs:allow-log-write-recursive -> This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-write-recursive" + ] + }, + { + "description": "fs:allow-picture-meta -> This allows read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta" + ] + }, + { + "description": "fs:allow-picture-meta-recursive -> This allows read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta-recursive" + ] + }, + { + "description": "fs:allow-picture-read -> This allows non-recursive read access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-read" + ] + }, + { + "description": "fs:allow-picture-read-recursive -> This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-read-recursive" + ] + }, + { + "description": "fs:allow-picture-write -> This allows non-recursive write access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-write" + ] + }, + { + "description": "fs:allow-picture-write-recursive -> This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-write-recursive" + ] + }, + { + "description": "fs:allow-public-meta -> This allows read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta" + ] + }, + { + "description": "fs:allow-public-meta-recursive -> This allows read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta-recursive" + ] + }, + { + "description": "fs:allow-public-read -> This allows non-recursive read access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-read" + ] + }, + { + "description": "fs:allow-public-read-recursive -> This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-read-recursive" + ] + }, + { + "description": "fs:allow-public-write -> This allows non-recursive write access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-write" + ] + }, + { + "description": "fs:allow-public-write-recursive -> This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-write-recursive" + ] + }, + { + "description": "fs:allow-resource-meta -> This allows read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta" + ] + }, + { + "description": "fs:allow-resource-meta-recursive -> This allows read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta-recursive" + ] + }, + { + "description": "fs:allow-resource-read -> This allows non-recursive read access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-read" + ] + }, + { + "description": "fs:allow-resource-read-recursive -> This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-read-recursive" + ] + }, + { + "description": "fs:allow-resource-write -> This allows non-recursive write access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-write" + ] + }, + { + "description": "fs:allow-resource-write-recursive -> This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-write-recursive" + ] + }, + { + "description": "fs:allow-runtime-meta -> This allows read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta" + ] + }, + { + "description": "fs:allow-runtime-meta-recursive -> This allows read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta-recursive" + ] + }, + { + "description": "fs:allow-runtime-read -> This allows non-recursive read access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-read" + ] + }, + { + "description": "fs:allow-runtime-read-recursive -> This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-read-recursive" + ] + }, + { + "description": "fs:allow-runtime-write -> This allows non-recursive write access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-write" + ] + }, + { + "description": "fs:allow-runtime-write-recursive -> This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-write-recursive" + ] + }, + { + "description": "fs:allow-temp-meta -> This allows read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta" + ] + }, + { + "description": "fs:allow-temp-meta-recursive -> This allows read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta-recursive" + ] + }, + { + "description": "fs:allow-temp-read -> This allows non-recursive read access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-read" + ] + }, + { + "description": "fs:allow-temp-read-recursive -> This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-read-recursive" + ] + }, + { + "description": "fs:allow-temp-write -> This allows non-recursive write access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-write" + ] + }, + { + "description": "fs:allow-temp-write-recursive -> This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-write-recursive" + ] + }, + { + "description": "fs:allow-template-meta -> This allows read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta" + ] + }, + { + "description": "fs:allow-template-meta-recursive -> This allows read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta-recursive" + ] + }, + { + "description": "fs:allow-template-read -> This allows non-recursive read access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-read" + ] + }, + { + "description": "fs:allow-template-read-recursive -> This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-read-recursive" + ] + }, + { + "description": "fs:allow-template-write -> This allows non-recursive write access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-write" + ] + }, + { + "description": "fs:allow-template-write-recursive -> This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-write-recursive" + ] + }, + { + "description": "fs:allow-video-meta -> This allows read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta" + ] + }, + { + "description": "fs:allow-video-meta-recursive -> This allows read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta-recursive" + ] + }, + { + "description": "fs:allow-video-read -> This allows non-recursive read access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-read" + ] + }, + { + "description": "fs:allow-video-read-recursive -> This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-read-recursive" + ] + }, + { + "description": "fs:allow-video-write -> This allows non-recursive write access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-write" + ] + }, + { + "description": "fs:allow-video-write-recursive -> This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-write-recursive" + ] + }, + { + "description": "fs:deny-default -> This denies access to dangerous Tauri relevant files and folders by default.", + "type": "string", + "enum": [ + "fs:deny-default" + ] + }, + { + "description": "fs:allow-copy-file -> Enables the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-copy-file" + ] + }, + { + "description": "fs:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-create" + ] + }, + { + "description": "fs:allow-exists -> Enables the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-exists" + ] + }, + { + "description": "fs:allow-fstat -> Enables the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-fstat" + ] + }, + { + "description": "fs:allow-ftruncate -> Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-ftruncate" + ] + }, + { + "description": "fs:allow-lstat -> Enables the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-lstat" + ] + }, + { + "description": "fs:allow-mkdir -> Enables the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-mkdir" + ] + }, + { + "description": "fs:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-open" + ] + }, + { + "description": "fs:allow-read -> Enables the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read" + ] + }, + { + "description": "fs:allow-read-dir -> Enables the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-dir" + ] + }, + { + "description": "fs:allow-read-file -> Enables the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-file" + ] + }, + { + "description": "fs:allow-read-text-file -> Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file" + ] + }, + { + "description": "fs:allow-read-text-file-lines -> Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines" + ] + }, + { + "description": "fs:allow-read-text-file-lines-next -> Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines-next" + ] + }, + { + "description": "fs:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-remove" + ] + }, + { + "description": "fs:allow-rename -> Enables the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-rename" + ] + }, + { + "description": "fs:allow-seek -> Enables the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-seek" + ] + }, + { + "description": "fs:allow-stat -> Enables the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-stat" + ] + }, + { + "description": "fs:allow-truncate -> Enables the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-truncate" + ] + }, + { + "description": "fs:allow-unwatch -> Enables the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-unwatch" + ] + }, + { + "description": "fs:allow-watch -> Enables the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-watch" + ] + }, + { + "description": "fs:allow-write -> Enables the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write" + ] + }, + { + "description": "fs:allow-write-file -> Enables the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-file" + ] + }, + { + "description": "fs:allow-write-text-file -> Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-text-file" + ] + }, + { + "description": "fs:deny-copy-file -> Denies the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-copy-file" + ] + }, + { + "description": "fs:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-create" + ] + }, + { + "description": "fs:deny-exists -> Denies the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-exists" + ] + }, + { + "description": "fs:deny-fstat -> Denies the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-fstat" + ] + }, + { + "description": "fs:deny-ftruncate -> Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-ftruncate" + ] + }, + { + "description": "fs:deny-lstat -> Denies the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-lstat" + ] + }, + { + "description": "fs:deny-mkdir -> Denies the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-mkdir" + ] + }, + { + "description": "fs:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-open" + ] + }, + { + "description": "fs:deny-read -> Denies the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read" + ] + }, + { + "description": "fs:deny-read-dir -> Denies the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-dir" + ] + }, + { + "description": "fs:deny-read-file -> Denies the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-file" + ] + }, + { + "description": "fs:deny-read-text-file -> Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file" + ] + }, + { + "description": "fs:deny-read-text-file-lines -> Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines" + ] + }, + { + "description": "fs:deny-read-text-file-lines-next -> Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines-next" + ] + }, + { + "description": "fs:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-remove" + ] + }, + { + "description": "fs:deny-rename -> Denies the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-rename" + ] + }, + { + "description": "fs:deny-seek -> Denies the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-seek" + ] + }, + { + "description": "fs:deny-stat -> Denies the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-stat" + ] + }, + { + "description": "fs:deny-truncate -> Denies the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-truncate" + ] + }, + { + "description": "fs:deny-unwatch -> Denies the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-unwatch" + ] + }, + { + "description": "fs:deny-watch -> Denies the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-watch" + ] + }, + { + "description": "fs:deny-webview-data-linux -> This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-linux" + ] + }, + { + "description": "fs:deny-webview-data-windows -> This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-windows" + ] + }, + { + "description": "fs:deny-write -> Denies the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write" + ] + }, + { + "description": "fs:deny-write-file -> Denies the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-file" + ] + }, + { + "description": "fs:deny-write-text-file -> Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-text-file" + ] + }, + { + "description": "fs:read-all -> This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-all" + ] + }, + { + "description": "fs:read-dirs -> This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-dirs" + ] + }, + { + "description": "fs:read-files -> This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-files" + ] + }, + { + "description": "fs:read-meta -> This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-meta" + ] + }, + { + "description": "fs:scope -> An empty permission you can use to modify the global scope.", + "type": "string", + "enum": [ + "fs:scope" + ] + }, + { + "description": "fs:scope-app -> This scope permits access to all files and list content of top level directories in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app" + ] + }, + { + "description": "fs:scope-app-index -> This scope permits to list all files and folders in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app-index" + ] + }, + { + "description": "fs:scope-app-recursive -> This scope recursive access to the complete `$APP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-app-recursive" + ] + }, + { + "description": "fs:scope-appcache -> This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache" + ] + }, + { + "description": "fs:scope-appcache-index -> This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache-index" + ] + }, + { + "description": "fs:scope-appcache-recursive -> This scope recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appcache-recursive" + ] + }, + { + "description": "fs:scope-appconfig -> This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig" + ] + }, + { + "description": "fs:scope-appconfig-index -> This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig-index" + ] + }, + { + "description": "fs:scope-appconfig-recursive -> This scope recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appconfig-recursive" + ] + }, + { + "description": "fs:scope-appdata -> This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata" + ] + }, + { + "description": "fs:scope-appdata-index -> This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata-index" + ] + }, + { + "description": "fs:scope-appdata-recursive -> This scope recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appdata-recursive" + ] + }, + { + "description": "fs:scope-applocaldata -> This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata" + ] + }, + { + "description": "fs:scope-applocaldata-index -> This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-index" + ] + }, + { + "description": "fs:scope-applocaldata-recursive -> This scope recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-recursive" + ] + }, + { + "description": "fs:scope-applog -> This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog" + ] + }, + { + "description": "fs:scope-applog-index -> This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog-index" + ] + }, + { + "description": "fs:scope-applog-recursive -> This scope recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applog-recursive" + ] + }, + { + "description": "fs:scope-audio -> This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio" + ] + }, + { + "description": "fs:scope-audio-index -> This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio-index" + ] + }, + { + "description": "fs:scope-audio-recursive -> This scope recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-audio-recursive" + ] + }, + { + "description": "fs:scope-cache -> This scope permits access to all files and list content of top level directories in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache" + ] + }, + { + "description": "fs:scope-cache-index -> This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache-index" + ] + }, + { + "description": "fs:scope-cache-recursive -> This scope recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-cache-recursive" + ] + }, + { + "description": "fs:scope-config -> This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config" + ] + }, + { + "description": "fs:scope-config-index -> This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config-index" + ] + }, + { + "description": "fs:scope-config-recursive -> This scope recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-config-recursive" + ] + }, + { + "description": "fs:scope-data -> This scope permits access to all files and list content of top level directories in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data" + ] + }, + { + "description": "fs:scope-data-index -> This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data-index" + ] + }, + { + "description": "fs:scope-data-recursive -> This scope recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-data-recursive" + ] + }, + { + "description": "fs:scope-desktop -> This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop" + ] + }, + { + "description": "fs:scope-desktop-index -> This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop-index" + ] + }, + { + "description": "fs:scope-desktop-recursive -> This scope recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-desktop-recursive" + ] + }, + { + "description": "fs:scope-document -> This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document" + ] + }, + { + "description": "fs:scope-document-index -> This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document-index" + ] + }, + { + "description": "fs:scope-document-recursive -> This scope recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-document-recursive" + ] + }, + { + "description": "fs:scope-download -> This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download" + ] + }, + { + "description": "fs:scope-download-index -> This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download-index" + ] + }, + { + "description": "fs:scope-download-recursive -> This scope recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-download-recursive" + ] + }, + { + "description": "fs:scope-exe -> This scope permits access to all files and list content of top level directories in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe" + ] + }, + { + "description": "fs:scope-exe-index -> This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe-index" + ] + }, + { + "description": "fs:scope-exe-recursive -> This scope recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-exe-recursive" + ] + }, + { + "description": "fs:scope-font -> This scope permits access to all files and list content of top level directories in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font" + ] + }, + { + "description": "fs:scope-font-index -> This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font-index" + ] + }, + { + "description": "fs:scope-font-recursive -> This scope recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-font-recursive" + ] + }, + { + "description": "fs:scope-home -> This scope permits access to all files and list content of top level directories in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home" + ] + }, + { + "description": "fs:scope-home-index -> This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home-index" + ] + }, + { + "description": "fs:scope-home-recursive -> This scope recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-home-recursive" + ] + }, + { + "description": "fs:scope-localdata -> This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata" + ] + }, + { + "description": "fs:scope-localdata-index -> This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata-index" + ] + }, + { + "description": "fs:scope-localdata-recursive -> This scope recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-localdata-recursive" + ] + }, + { + "description": "fs:scope-log -> This scope permits access to all files and list content of top level directories in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log" + ] + }, + { + "description": "fs:scope-log-index -> This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log-index" + ] + }, + { + "description": "fs:scope-log-recursive -> This scope recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-log-recursive" + ] + }, + { + "description": "fs:scope-picture -> This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture" + ] + }, + { + "description": "fs:scope-picture-index -> This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture-index" + ] + }, + { + "description": "fs:scope-picture-recursive -> This scope recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-picture-recursive" + ] + }, + { + "description": "fs:scope-public -> This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public" + ] + }, + { + "description": "fs:scope-public-index -> This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public-index" + ] + }, + { + "description": "fs:scope-public-recursive -> This scope recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-public-recursive" + ] + }, + { + "description": "fs:scope-resource -> This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource" + ] + }, + { + "description": "fs:scope-resource-index -> This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource-index" + ] + }, + { + "description": "fs:scope-resource-recursive -> This scope recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-resource-recursive" + ] + }, + { + "description": "fs:scope-runtime -> This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime" + ] + }, + { + "description": "fs:scope-runtime-index -> This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime-index" + ] + }, + { + "description": "fs:scope-runtime-recursive -> This scope recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-runtime-recursive" + ] + }, + { + "description": "fs:scope-temp -> This scope permits access to all files and list content of top level directories in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp" + ] + }, + { + "description": "fs:scope-temp-index -> This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp-index" + ] + }, + { + "description": "fs:scope-temp-recursive -> This scope recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-temp-recursive" + ] + }, + { + "description": "fs:scope-template -> This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template" + ] + }, + { + "description": "fs:scope-template-index -> This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template-index" + ] + }, + { + "description": "fs:scope-template-recursive -> This scope recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-template-recursive" + ] + }, + { + "description": "fs:scope-video -> This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video" + ] + }, + { + "description": "fs:scope-video-index -> This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video-index" + ] + }, + { + "description": "fs:scope-video-recursive -> This scope recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-video-recursive" + ] + }, + { + "description": "fs:write-all -> This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-all" + ] + }, + { + "description": "fs:write-files -> This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-files" + ] + } + ] + }, + "allow": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "FS scope path.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "FS scope path.", + "type": "string" + } + } + } + ] + } + }, + "deny": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "FS scope path.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "FS scope path.", + "type": "string" + } + } + } + ] + } + } + } + }, + { + "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" + ] + }, + { + "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": "fs:allow-app-meta -> This allows read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta" + ] + }, + { + "description": "fs:allow-app-meta-recursive -> This allows read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta-recursive" + ] + }, + { + "description": "fs:allow-app-read -> This allows non-recursive read access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-read" + ] + }, + { + "description": "fs:allow-app-read-recursive -> This allows full recursive read access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-read-recursive" + ] + }, + { + "description": "fs:allow-app-write -> This allows non-recursive write access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-write" + ] + }, + { + "description": "fs:allow-app-write-recursive -> This allows full recursive write access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-write-recursive" + ] + }, + { + "description": "fs:allow-appcache-meta -> This allows read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta" + ] + }, + { + "description": "fs:allow-appcache-meta-recursive -> This allows read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta-recursive" + ] + }, + { + "description": "fs:allow-appcache-read -> This allows non-recursive read access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-read" + ] + }, + { + "description": "fs:allow-appcache-read-recursive -> This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-read-recursive" + ] + }, + { + "description": "fs:allow-appcache-write -> This allows non-recursive write access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-write" + ] + }, + { + "description": "fs:allow-appcache-write-recursive -> This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-write-recursive" + ] + }, + { + "description": "fs:allow-appconfig-meta -> This allows read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta" + ] + }, + { + "description": "fs:allow-appconfig-meta-recursive -> This allows read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta-recursive" + ] + }, + { + "description": "fs:allow-appconfig-read -> This allows non-recursive read access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read" + ] + }, + { + "description": "fs:allow-appconfig-read-recursive -> This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read-recursive" + ] + }, + { + "description": "fs:allow-appconfig-write -> This allows non-recursive write access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write" + ] + }, + { + "description": "fs:allow-appconfig-write-recursive -> This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write-recursive" + ] + }, + { + "description": "fs:allow-appdata-meta -> This allows read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta" + ] + }, + { + "description": "fs:allow-appdata-meta-recursive -> This allows read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta-recursive" + ] + }, + { + "description": "fs:allow-appdata-read -> This allows non-recursive read access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-read" + ] + }, + { + "description": "fs:allow-appdata-read-recursive -> This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-read-recursive" + ] + }, + { + "description": "fs:allow-appdata-write -> This allows non-recursive write access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-write" + ] + }, + { + "description": "fs:allow-appdata-write-recursive -> This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-write-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-meta -> This allows read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta" + ] + }, + { + "description": "fs:allow-applocaldata-meta-recursive -> This allows read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-read -> This allows non-recursive read access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read" + ] + }, + { + "description": "fs:allow-applocaldata-read-recursive -> This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-write -> This allows non-recursive write access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write" + ] + }, + { + "description": "fs:allow-applocaldata-write-recursive -> This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write-recursive" + ] + }, + { + "description": "fs:allow-applog-meta -> This allows read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta" + ] + }, + { + "description": "fs:allow-applog-meta-recursive -> This allows read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta-recursive" + ] + }, + { + "description": "fs:allow-applog-read -> This allows non-recursive read access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-read" + ] + }, + { + "description": "fs:allow-applog-read-recursive -> This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-read-recursive" + ] + }, + { + "description": "fs:allow-applog-write -> This allows non-recursive write access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-write" + ] + }, + { + "description": "fs:allow-applog-write-recursive -> This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-write-recursive" + ] + }, + { + "description": "fs:allow-audio-meta -> This allows read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta" + ] + }, + { + "description": "fs:allow-audio-meta-recursive -> This allows read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta-recursive" + ] + }, + { + "description": "fs:allow-audio-read -> This allows non-recursive read access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-read" + ] + }, + { + "description": "fs:allow-audio-read-recursive -> This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-read-recursive" + ] + }, + { + "description": "fs:allow-audio-write -> This allows non-recursive write access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-write" + ] + }, + { + "description": "fs:allow-audio-write-recursive -> This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-write-recursive" + ] + }, + { + "description": "fs:allow-cache-meta -> This allows read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta" + ] + }, + { + "description": "fs:allow-cache-meta-recursive -> This allows read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta-recursive" + ] + }, + { + "description": "fs:allow-cache-read -> This allows non-recursive read access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-read" + ] + }, + { + "description": "fs:allow-cache-read-recursive -> This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-read-recursive" + ] + }, + { + "description": "fs:allow-cache-write -> This allows non-recursive write access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-write" + ] + }, + { + "description": "fs:allow-cache-write-recursive -> This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-write-recursive" + ] + }, + { + "description": "fs:allow-config-meta -> This allows read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta" + ] + }, + { + "description": "fs:allow-config-meta-recursive -> This allows read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta-recursive" + ] + }, + { + "description": "fs:allow-config-read -> This allows non-recursive read access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-read" + ] + }, + { + "description": "fs:allow-config-read-recursive -> This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-read-recursive" + ] + }, + { + "description": "fs:allow-config-write -> This allows non-recursive write access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-write" + ] + }, + { + "description": "fs:allow-config-write-recursive -> This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-write-recursive" + ] + }, + { + "description": "fs:allow-data-meta -> This allows read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta" + ] + }, + { + "description": "fs:allow-data-meta-recursive -> This allows read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta-recursive" + ] + }, + { + "description": "fs:allow-data-read -> This allows non-recursive read access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-read" + ] + }, + { + "description": "fs:allow-data-read-recursive -> This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-read-recursive" + ] + }, + { + "description": "fs:allow-data-write -> This allows non-recursive write access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-write" + ] + }, + { + "description": "fs:allow-data-write-recursive -> This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-write-recursive" + ] + }, + { + "description": "fs:allow-desktop-meta -> This allows read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta" + ] + }, + { + "description": "fs:allow-desktop-meta-recursive -> This allows read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta-recursive" + ] + }, + { + "description": "fs:allow-desktop-read -> This allows non-recursive read access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-read" + ] + }, + { + "description": "fs:allow-desktop-read-recursive -> This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-read-recursive" + ] + }, + { + "description": "fs:allow-desktop-write -> This allows non-recursive write access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-write" + ] + }, + { + "description": "fs:allow-desktop-write-recursive -> This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-write-recursive" + ] + }, + { + "description": "fs:allow-document-meta -> This allows read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta" + ] + }, + { + "description": "fs:allow-document-meta-recursive -> This allows read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta-recursive" + ] + }, + { + "description": "fs:allow-document-read -> This allows non-recursive read access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-read" + ] + }, + { + "description": "fs:allow-document-read-recursive -> This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-read-recursive" + ] + }, + { + "description": "fs:allow-document-write -> This allows non-recursive write access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-write" + ] + }, + { + "description": "fs:allow-document-write-recursive -> This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-write-recursive" + ] + }, + { + "description": "fs:allow-download-meta -> This allows read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta" + ] + }, + { + "description": "fs:allow-download-meta-recursive -> This allows read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta-recursive" + ] + }, + { + "description": "fs:allow-download-read -> This allows non-recursive read access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-read" + ] + }, + { + "description": "fs:allow-download-read-recursive -> This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-read-recursive" + ] + }, + { + "description": "fs:allow-download-write -> This allows non-recursive write access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-write" + ] + }, + { + "description": "fs:allow-download-write-recursive -> This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-write-recursive" + ] + }, + { + "description": "fs:allow-exe-meta -> This allows read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta" + ] + }, + { + "description": "fs:allow-exe-meta-recursive -> This allows read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta-recursive" + ] + }, + { + "description": "fs:allow-exe-read -> This allows non-recursive read access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-read" + ] + }, + { + "description": "fs:allow-exe-read-recursive -> This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-read-recursive" + ] + }, + { + "description": "fs:allow-exe-write -> This allows non-recursive write access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-write" + ] + }, + { + "description": "fs:allow-exe-write-recursive -> This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-write-recursive" + ] + }, + { + "description": "fs:allow-font-meta -> This allows read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta" + ] + }, + { + "description": "fs:allow-font-meta-recursive -> This allows read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta-recursive" + ] + }, + { + "description": "fs:allow-font-read -> This allows non-recursive read access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-read" + ] + }, + { + "description": "fs:allow-font-read-recursive -> This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-read-recursive" + ] + }, + { + "description": "fs:allow-font-write -> This allows non-recursive write access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-write" + ] + }, + { + "description": "fs:allow-font-write-recursive -> This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-write-recursive" + ] + }, + { + "description": "fs:allow-home-meta -> This allows read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta" + ] + }, + { + "description": "fs:allow-home-meta-recursive -> This allows read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta-recursive" + ] + }, + { + "description": "fs:allow-home-read -> This allows non-recursive read access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-read" + ] + }, + { + "description": "fs:allow-home-read-recursive -> This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-read-recursive" + ] + }, + { + "description": "fs:allow-home-write -> This allows non-recursive write access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-write" + ] + }, + { + "description": "fs:allow-home-write-recursive -> This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-write-recursive" + ] + }, + { + "description": "fs:allow-localdata-meta -> This allows read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta" + ] + }, + { + "description": "fs:allow-localdata-meta-recursive -> This allows read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta-recursive" + ] + }, + { + "description": "fs:allow-localdata-read -> This allows non-recursive read access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-read" + ] + }, + { + "description": "fs:allow-localdata-read-recursive -> This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-read-recursive" + ] + }, + { + "description": "fs:allow-localdata-write -> This allows non-recursive write access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-write" + ] + }, + { + "description": "fs:allow-localdata-write-recursive -> This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-write-recursive" + ] + }, + { + "description": "fs:allow-log-meta -> This allows read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta" + ] + }, + { + "description": "fs:allow-log-meta-recursive -> This allows read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta-recursive" + ] + }, + { + "description": "fs:allow-log-read -> This allows non-recursive read access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-read" + ] + }, + { + "description": "fs:allow-log-read-recursive -> This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-read-recursive" + ] + }, + { + "description": "fs:allow-log-write -> This allows non-recursive write access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-write" + ] + }, + { + "description": "fs:allow-log-write-recursive -> This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-write-recursive" + ] + }, + { + "description": "fs:allow-picture-meta -> This allows read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta" + ] + }, + { + "description": "fs:allow-picture-meta-recursive -> This allows read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta-recursive" + ] + }, + { + "description": "fs:allow-picture-read -> This allows non-recursive read access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-read" + ] + }, + { + "description": "fs:allow-picture-read-recursive -> This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-read-recursive" + ] + }, + { + "description": "fs:allow-picture-write -> This allows non-recursive write access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-write" + ] + }, + { + "description": "fs:allow-picture-write-recursive -> This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-write-recursive" + ] + }, + { + "description": "fs:allow-public-meta -> This allows read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta" + ] + }, + { + "description": "fs:allow-public-meta-recursive -> This allows read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta-recursive" + ] + }, + { + "description": "fs:allow-public-read -> This allows non-recursive read access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-read" + ] + }, + { + "description": "fs:allow-public-read-recursive -> This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-read-recursive" + ] + }, + { + "description": "fs:allow-public-write -> This allows non-recursive write access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-write" + ] + }, + { + "description": "fs:allow-public-write-recursive -> This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-write-recursive" + ] + }, + { + "description": "fs:allow-resource-meta -> This allows read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta" + ] + }, + { + "description": "fs:allow-resource-meta-recursive -> This allows read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta-recursive" + ] + }, + { + "description": "fs:allow-resource-read -> This allows non-recursive read access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-read" + ] + }, + { + "description": "fs:allow-resource-read-recursive -> This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-read-recursive" + ] + }, + { + "description": "fs:allow-resource-write -> This allows non-recursive write access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-write" + ] + }, + { + "description": "fs:allow-resource-write-recursive -> This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-write-recursive" + ] + }, + { + "description": "fs:allow-runtime-meta -> This allows read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta" + ] + }, + { + "description": "fs:allow-runtime-meta-recursive -> This allows read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta-recursive" + ] + }, + { + "description": "fs:allow-runtime-read -> This allows non-recursive read access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-read" + ] + }, + { + "description": "fs:allow-runtime-read-recursive -> This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-read-recursive" + ] + }, + { + "description": "fs:allow-runtime-write -> This allows non-recursive write access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-write" + ] + }, + { + "description": "fs:allow-runtime-write-recursive -> This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-write-recursive" + ] + }, + { + "description": "fs:allow-temp-meta -> This allows read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta" + ] + }, + { + "description": "fs:allow-temp-meta-recursive -> This allows read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta-recursive" + ] + }, + { + "description": "fs:allow-temp-read -> This allows non-recursive read access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-read" + ] + }, + { + "description": "fs:allow-temp-read-recursive -> This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-read-recursive" + ] + }, + { + "description": "fs:allow-temp-write -> This allows non-recursive write access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-write" + ] + }, + { + "description": "fs:allow-temp-write-recursive -> This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-write-recursive" + ] + }, + { + "description": "fs:allow-template-meta -> This allows read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta" + ] + }, + { + "description": "fs:allow-template-meta-recursive -> This allows read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta-recursive" + ] + }, + { + "description": "fs:allow-template-read -> This allows non-recursive read access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-read" + ] + }, + { + "description": "fs:allow-template-read-recursive -> This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-read-recursive" + ] + }, + { + "description": "fs:allow-template-write -> This allows non-recursive write access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-write" + ] + }, + { + "description": "fs:allow-template-write-recursive -> This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-write-recursive" + ] + }, + { + "description": "fs:allow-video-meta -> This allows read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta" + ] + }, + { + "description": "fs:allow-video-meta-recursive -> This allows read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta-recursive" + ] + }, + { + "description": "fs:allow-video-read -> This allows non-recursive read access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-read" + ] + }, + { + "description": "fs:allow-video-read-recursive -> This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-read-recursive" + ] + }, + { + "description": "fs:allow-video-write -> This allows non-recursive write access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-write" + ] + }, + { + "description": "fs:allow-video-write-recursive -> This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-write-recursive" + ] + }, + { + "description": "fs:deny-default -> This denies access to dangerous Tauri relevant files and folders by default.", + "type": "string", + "enum": [ + "fs:deny-default" + ] + }, + { + "description": "fs:default -> # Tauri `fs` default permissions\n\nThis configuration file defines the default permissions granted\nto the filesystem.\n\n### Granted Permissions\n\nThis default permission set enables all read-related commands and\nallows access to the `$APP` folder and sub directories created in it.\nThe location of the `$APP` folder depends on the operating system,\nwhere the application is run.\n\nIn general the `$APP` folder needs to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\n### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n", + "type": "string", + "enum": [ + "fs:default" + ] + }, + { + "description": "fs:allow-copy-file -> Enables the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-copy-file" + ] + }, + { + "description": "fs:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-create" + ] + }, + { + "description": "fs:allow-exists -> Enables the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-exists" + ] + }, + { + "description": "fs:allow-fstat -> Enables the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-fstat" + ] + }, + { + "description": "fs:allow-ftruncate -> Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-ftruncate" + ] + }, + { + "description": "fs:allow-lstat -> Enables the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-lstat" + ] + }, + { + "description": "fs:allow-mkdir -> Enables the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-mkdir" + ] + }, + { + "description": "fs:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-open" + ] + }, + { + "description": "fs:allow-read -> Enables the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read" + ] + }, + { + "description": "fs:allow-read-dir -> Enables the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-dir" + ] + }, + { + "description": "fs:allow-read-file -> Enables the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-file" + ] + }, + { + "description": "fs:allow-read-text-file -> Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file" + ] + }, + { + "description": "fs:allow-read-text-file-lines -> Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines" + ] + }, + { + "description": "fs:allow-read-text-file-lines-next -> Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines-next" + ] + }, + { + "description": "fs:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-remove" + ] + }, + { + "description": "fs:allow-rename -> Enables the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-rename" + ] + }, + { + "description": "fs:allow-seek -> Enables the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-seek" + ] + }, + { + "description": "fs:allow-stat -> Enables the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-stat" + ] + }, + { + "description": "fs:allow-truncate -> Enables the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-truncate" + ] + }, + { + "description": "fs:allow-unwatch -> Enables the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-unwatch" + ] + }, + { + "description": "fs:allow-watch -> Enables the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-watch" + ] + }, + { + "description": "fs:allow-write -> Enables the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write" + ] + }, + { + "description": "fs:allow-write-file -> Enables the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-file" + ] + }, + { + "description": "fs:allow-write-text-file -> Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-text-file" + ] + }, + { + "description": "fs:deny-copy-file -> Denies the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-copy-file" + ] + }, + { + "description": "fs:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-create" + ] + }, + { + "description": "fs:deny-exists -> Denies the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-exists" + ] + }, + { + "description": "fs:deny-fstat -> Denies the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-fstat" + ] + }, + { + "description": "fs:deny-ftruncate -> Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-ftruncate" + ] + }, + { + "description": "fs:deny-lstat -> Denies the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-lstat" + ] + }, + { + "description": "fs:deny-mkdir -> Denies the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-mkdir" + ] + }, + { + "description": "fs:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-open" + ] + }, + { + "description": "fs:deny-read -> Denies the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read" + ] + }, + { + "description": "fs:deny-read-dir -> Denies the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-dir" + ] + }, + { + "description": "fs:deny-read-file -> Denies the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-file" + ] + }, + { + "description": "fs:deny-read-text-file -> Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file" + ] + }, + { + "description": "fs:deny-read-text-file-lines -> Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines" + ] + }, + { + "description": "fs:deny-read-text-file-lines-next -> Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines-next" + ] + }, + { + "description": "fs:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-remove" + ] + }, + { + "description": "fs:deny-rename -> Denies the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-rename" + ] + }, + { + "description": "fs:deny-seek -> Denies the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-seek" + ] + }, + { + "description": "fs:deny-stat -> Denies the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-stat" + ] + }, + { + "description": "fs:deny-truncate -> Denies the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-truncate" + ] + }, + { + "description": "fs:deny-unwatch -> Denies the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-unwatch" + ] + }, + { + "description": "fs:deny-watch -> Denies the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-watch" + ] + }, + { + "description": "fs:deny-webview-data-linux -> This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-linux" + ] + }, + { + "description": "fs:deny-webview-data-windows -> This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-windows" + ] + }, + { + "description": "fs:deny-write -> Denies the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write" + ] + }, + { + "description": "fs:deny-write-file -> Denies the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-file" + ] + }, + { + "description": "fs:deny-write-text-file -> Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-text-file" + ] + }, + { + "description": "fs:read-all -> This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-all" + ] + }, + { + "description": "fs:read-dirs -> This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-dirs" + ] + }, + { + "description": "fs:read-files -> This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-files" + ] + }, + { + "description": "fs:read-meta -> This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-meta" + ] + }, + { + "description": "fs:scope -> An empty permission you can use to modify the global scope.", + "type": "string", + "enum": [ + "fs:scope" + ] + }, + { + "description": "fs:scope-app -> This scope permits access to all files and list content of top level directories in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app" + ] + }, + { + "description": "fs:scope-app-index -> This scope permits to list all files and folders in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app-index" + ] + }, + { + "description": "fs:scope-app-recursive -> This scope recursive access to the complete `$APP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-app-recursive" + ] + }, + { + "description": "fs:scope-appcache -> This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache" + ] + }, + { + "description": "fs:scope-appcache-index -> This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache-index" + ] + }, + { + "description": "fs:scope-appcache-recursive -> This scope recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appcache-recursive" + ] + }, + { + "description": "fs:scope-appconfig -> This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig" + ] + }, + { + "description": "fs:scope-appconfig-index -> This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig-index" + ] + }, + { + "description": "fs:scope-appconfig-recursive -> This scope recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appconfig-recursive" + ] + }, + { + "description": "fs:scope-appdata -> This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata" + ] + }, + { + "description": "fs:scope-appdata-index -> This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata-index" + ] + }, + { + "description": "fs:scope-appdata-recursive -> This scope recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appdata-recursive" + ] + }, + { + "description": "fs:scope-applocaldata -> This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata" + ] + }, + { + "description": "fs:scope-applocaldata-index -> This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-index" + ] + }, + { + "description": "fs:scope-applocaldata-recursive -> This scope recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-recursive" + ] + }, + { + "description": "fs:scope-applog -> This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog" + ] + }, + { + "description": "fs:scope-applog-index -> This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog-index" + ] + }, + { + "description": "fs:scope-applog-recursive -> This scope recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applog-recursive" + ] + }, + { + "description": "fs:scope-audio -> This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio" + ] + }, + { + "description": "fs:scope-audio-index -> This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio-index" + ] + }, + { + "description": "fs:scope-audio-recursive -> This scope recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-audio-recursive" + ] + }, + { + "description": "fs:scope-cache -> This scope permits access to all files and list content of top level directories in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache" + ] + }, + { + "description": "fs:scope-cache-index -> This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache-index" + ] + }, + { + "description": "fs:scope-cache-recursive -> This scope recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-cache-recursive" + ] + }, + { + "description": "fs:scope-config -> This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config" + ] + }, + { + "description": "fs:scope-config-index -> This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config-index" + ] + }, + { + "description": "fs:scope-config-recursive -> This scope recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-config-recursive" + ] + }, + { + "description": "fs:scope-data -> This scope permits access to all files and list content of top level directories in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data" + ] + }, + { + "description": "fs:scope-data-index -> This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data-index" + ] + }, + { + "description": "fs:scope-data-recursive -> This scope recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-data-recursive" + ] + }, + { + "description": "fs:scope-desktop -> This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop" + ] + }, + { + "description": "fs:scope-desktop-index -> This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop-index" + ] + }, + { + "description": "fs:scope-desktop-recursive -> This scope recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-desktop-recursive" + ] + }, + { + "description": "fs:scope-document -> This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document" + ] + }, + { + "description": "fs:scope-document-index -> This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document-index" + ] + }, + { + "description": "fs:scope-document-recursive -> This scope recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-document-recursive" + ] + }, + { + "description": "fs:scope-download -> This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download" + ] + }, + { + "description": "fs:scope-download-index -> This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download-index" + ] + }, + { + "description": "fs:scope-download-recursive -> This scope recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-download-recursive" + ] + }, + { + "description": "fs:scope-exe -> This scope permits access to all files and list content of top level directories in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe" + ] + }, + { + "description": "fs:scope-exe-index -> This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe-index" + ] + }, + { + "description": "fs:scope-exe-recursive -> This scope recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-exe-recursive" + ] + }, + { + "description": "fs:scope-font -> This scope permits access to all files and list content of top level directories in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font" + ] + }, + { + "description": "fs:scope-font-index -> This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font-index" + ] + }, + { + "description": "fs:scope-font-recursive -> This scope recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-font-recursive" + ] + }, + { + "description": "fs:scope-home -> This scope permits access to all files and list content of top level directories in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home" + ] + }, + { + "description": "fs:scope-home-index -> This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home-index" + ] + }, + { + "description": "fs:scope-home-recursive -> This scope recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-home-recursive" + ] + }, + { + "description": "fs:scope-localdata -> This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata" + ] + }, + { + "description": "fs:scope-localdata-index -> This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata-index" + ] + }, + { + "description": "fs:scope-localdata-recursive -> This scope recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-localdata-recursive" + ] + }, + { + "description": "fs:scope-log -> This scope permits access to all files and list content of top level directories in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log" + ] + }, + { + "description": "fs:scope-log-index -> This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log-index" + ] + }, + { + "description": "fs:scope-log-recursive -> This scope recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-log-recursive" + ] + }, + { + "description": "fs:scope-picture -> This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture" + ] + }, + { + "description": "fs:scope-picture-index -> This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture-index" + ] + }, + { + "description": "fs:scope-picture-recursive -> This scope recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-picture-recursive" + ] + }, + { + "description": "fs:scope-public -> This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public" + ] + }, + { + "description": "fs:scope-public-index -> This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public-index" + ] + }, + { + "description": "fs:scope-public-recursive -> This scope recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-public-recursive" + ] + }, + { + "description": "fs:scope-resource -> This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource" + ] + }, + { + "description": "fs:scope-resource-index -> This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource-index" + ] + }, + { + "description": "fs:scope-resource-recursive -> This scope recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-resource-recursive" + ] + }, + { + "description": "fs:scope-runtime -> This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime" + ] + }, + { + "description": "fs:scope-runtime-index -> This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime-index" + ] + }, + { + "description": "fs:scope-runtime-recursive -> This scope recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-runtime-recursive" + ] + }, + { + "description": "fs:scope-temp -> This scope permits access to all files and list content of top level directories in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp" + ] + }, + { + "description": "fs:scope-temp-index -> This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp-index" + ] + }, + { + "description": "fs:scope-temp-recursive -> This scope recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-temp-recursive" + ] + }, + { + "description": "fs:scope-template -> This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template" + ] + }, + { + "description": "fs:scope-template-index -> This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template-index" + ] + }, + { + "description": "fs:scope-template-recursive -> This scope recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-template-recursive" + ] + }, + { + "description": "fs:scope-video -> This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video" + ] + }, + { + "description": "fs:scope-video-index -> This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video-index" + ] + }, + { + "description": "fs:scope-video-recursive -> This scope recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-video-recursive" + ] + }, + { + "description": "fs:write-all -> This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-all" + ] + }, + { + "description": "fs:write-files -> This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-files" + ] + }, + { + "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": "log:default -> Allows the log command", + "type": "string", + "enum": [ + "log:default" + ] + }, + { + "description": "log:allow-log -> Enables the log command without any pre-configured scope.", + "type": "string", + "enum": [ + "log:allow-log" + ] + }, + { + "description": "log:deny-log -> Denies the log command without any pre-configured scope.", + "type": "string", + "enum": [ + "log:deny-log" + ] + }, + { + "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" + ] + }, + { + "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": "updater:default -> Allows checking for new updates and installing them", + "type": "string", + "enum": [ + "updater:default" + ] + }, + { + "description": "updater:allow-check -> Enables the check command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-check" + ] + }, + { + "description": "updater:allow-download-and-install -> Enables the download_and_install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-download-and-install" + ] + }, + { + "description": "updater:deny-check -> Denies the check command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-check" + ] + }, + { + "description": "updater:deny-download-and-install -> Denies the download_and_install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-download-and-install" + ] + }, + { + "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-cursor-position -> Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-cursor-position" + ] + }, + { + "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-cursor-position -> Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-cursor-position" + ] + }, + { + "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" + ] + }, + { + "type": "string", + "enum": [ + "window-state:default" + ] + }, + { + "description": "window-state:allow-filename -> Enables the filename command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:allow-filename" + ] + }, + { + "description": "window-state:allow-restore-state -> Enables the restore_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:allow-restore-state" + ] + }, + { + "description": "window-state:allow-save-window-state -> Enables the save_window_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:allow-save-window-state" + ] + }, + { + "description": "window-state:deny-filename -> Denies the filename command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:deny-filename" + ] + }, + { + "description": "window-state:deny-restore-state -> Denies the restore_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:deny-restore-state" + ] + }, + { + "description": "window-state:deny-save-window-state -> Denies the save_window_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:deny-save-window-state" + ] + } + ] + }, + "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/src-tauri/gen/schemas/macOS-schema.json b/src-tauri/gen/schemas/macOS-schema.json new file mode 100644 index 00000000..25378ff6 --- /dev/null +++ b/src-tauri/gen/schemas/macOS-schema.json @@ -0,0 +1,6701 @@ +{ + "$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": [ + { + "description": "fs:default -> # Tauri `fs` default permissions\n\nThis configuration file defines the default permissions granted\nto the filesystem.\n\n### Granted Permissions\n\nThis default permission set enables all read-related commands and\nallows access to the `$APP` folder and sub directories created in it.\nThe location of the `$APP` folder depends on the operating system,\nwhere the application is run.\n\nIn general the `$APP` folder needs to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\n### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n", + "type": "string", + "enum": [ + "fs:default" + ] + }, + { + "description": "fs:allow-app-meta -> This allows read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta" + ] + }, + { + "description": "fs:allow-app-meta-recursive -> This allows read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta-recursive" + ] + }, + { + "description": "fs:allow-app-read -> This allows non-recursive read access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-read" + ] + }, + { + "description": "fs:allow-app-read-recursive -> This allows full recursive read access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-read-recursive" + ] + }, + { + "description": "fs:allow-app-write -> This allows non-recursive write access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-write" + ] + }, + { + "description": "fs:allow-app-write-recursive -> This allows full recursive write access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-write-recursive" + ] + }, + { + "description": "fs:allow-appcache-meta -> This allows read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta" + ] + }, + { + "description": "fs:allow-appcache-meta-recursive -> This allows read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta-recursive" + ] + }, + { + "description": "fs:allow-appcache-read -> This allows non-recursive read access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-read" + ] + }, + { + "description": "fs:allow-appcache-read-recursive -> This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-read-recursive" + ] + }, + { + "description": "fs:allow-appcache-write -> This allows non-recursive write access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-write" + ] + }, + { + "description": "fs:allow-appcache-write-recursive -> This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-write-recursive" + ] + }, + { + "description": "fs:allow-appconfig-meta -> This allows read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta" + ] + }, + { + "description": "fs:allow-appconfig-meta-recursive -> This allows read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta-recursive" + ] + }, + { + "description": "fs:allow-appconfig-read -> This allows non-recursive read access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read" + ] + }, + { + "description": "fs:allow-appconfig-read-recursive -> This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read-recursive" + ] + }, + { + "description": "fs:allow-appconfig-write -> This allows non-recursive write access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write" + ] + }, + { + "description": "fs:allow-appconfig-write-recursive -> This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write-recursive" + ] + }, + { + "description": "fs:allow-appdata-meta -> This allows read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta" + ] + }, + { + "description": "fs:allow-appdata-meta-recursive -> This allows read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta-recursive" + ] + }, + { + "description": "fs:allow-appdata-read -> This allows non-recursive read access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-read" + ] + }, + { + "description": "fs:allow-appdata-read-recursive -> This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-read-recursive" + ] + }, + { + "description": "fs:allow-appdata-write -> This allows non-recursive write access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-write" + ] + }, + { + "description": "fs:allow-appdata-write-recursive -> This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-write-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-meta -> This allows read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta" + ] + }, + { + "description": "fs:allow-applocaldata-meta-recursive -> This allows read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-read -> This allows non-recursive read access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read" + ] + }, + { + "description": "fs:allow-applocaldata-read-recursive -> This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-write -> This allows non-recursive write access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write" + ] + }, + { + "description": "fs:allow-applocaldata-write-recursive -> This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write-recursive" + ] + }, + { + "description": "fs:allow-applog-meta -> This allows read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta" + ] + }, + { + "description": "fs:allow-applog-meta-recursive -> This allows read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta-recursive" + ] + }, + { + "description": "fs:allow-applog-read -> This allows non-recursive read access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-read" + ] + }, + { + "description": "fs:allow-applog-read-recursive -> This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-read-recursive" + ] + }, + { + "description": "fs:allow-applog-write -> This allows non-recursive write access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-write" + ] + }, + { + "description": "fs:allow-applog-write-recursive -> This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-write-recursive" + ] + }, + { + "description": "fs:allow-audio-meta -> This allows read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta" + ] + }, + { + "description": "fs:allow-audio-meta-recursive -> This allows read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta-recursive" + ] + }, + { + "description": "fs:allow-audio-read -> This allows non-recursive read access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-read" + ] + }, + { + "description": "fs:allow-audio-read-recursive -> This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-read-recursive" + ] + }, + { + "description": "fs:allow-audio-write -> This allows non-recursive write access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-write" + ] + }, + { + "description": "fs:allow-audio-write-recursive -> This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-write-recursive" + ] + }, + { + "description": "fs:allow-cache-meta -> This allows read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta" + ] + }, + { + "description": "fs:allow-cache-meta-recursive -> This allows read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta-recursive" + ] + }, + { + "description": "fs:allow-cache-read -> This allows non-recursive read access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-read" + ] + }, + { + "description": "fs:allow-cache-read-recursive -> This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-read-recursive" + ] + }, + { + "description": "fs:allow-cache-write -> This allows non-recursive write access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-write" + ] + }, + { + "description": "fs:allow-cache-write-recursive -> This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-write-recursive" + ] + }, + { + "description": "fs:allow-config-meta -> This allows read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta" + ] + }, + { + "description": "fs:allow-config-meta-recursive -> This allows read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta-recursive" + ] + }, + { + "description": "fs:allow-config-read -> This allows non-recursive read access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-read" + ] + }, + { + "description": "fs:allow-config-read-recursive -> This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-read-recursive" + ] + }, + { + "description": "fs:allow-config-write -> This allows non-recursive write access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-write" + ] + }, + { + "description": "fs:allow-config-write-recursive -> This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-write-recursive" + ] + }, + { + "description": "fs:allow-data-meta -> This allows read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta" + ] + }, + { + "description": "fs:allow-data-meta-recursive -> This allows read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta-recursive" + ] + }, + { + "description": "fs:allow-data-read -> This allows non-recursive read access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-read" + ] + }, + { + "description": "fs:allow-data-read-recursive -> This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-read-recursive" + ] + }, + { + "description": "fs:allow-data-write -> This allows non-recursive write access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-write" + ] + }, + { + "description": "fs:allow-data-write-recursive -> This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-write-recursive" + ] + }, + { + "description": "fs:allow-desktop-meta -> This allows read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta" + ] + }, + { + "description": "fs:allow-desktop-meta-recursive -> This allows read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta-recursive" + ] + }, + { + "description": "fs:allow-desktop-read -> This allows non-recursive read access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-read" + ] + }, + { + "description": "fs:allow-desktop-read-recursive -> This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-read-recursive" + ] + }, + { + "description": "fs:allow-desktop-write -> This allows non-recursive write access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-write" + ] + }, + { + "description": "fs:allow-desktop-write-recursive -> This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-write-recursive" + ] + }, + { + "description": "fs:allow-document-meta -> This allows read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta" + ] + }, + { + "description": "fs:allow-document-meta-recursive -> This allows read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta-recursive" + ] + }, + { + "description": "fs:allow-document-read -> This allows non-recursive read access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-read" + ] + }, + { + "description": "fs:allow-document-read-recursive -> This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-read-recursive" + ] + }, + { + "description": "fs:allow-document-write -> This allows non-recursive write access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-write" + ] + }, + { + "description": "fs:allow-document-write-recursive -> This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-write-recursive" + ] + }, + { + "description": "fs:allow-download-meta -> This allows read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta" + ] + }, + { + "description": "fs:allow-download-meta-recursive -> This allows read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta-recursive" + ] + }, + { + "description": "fs:allow-download-read -> This allows non-recursive read access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-read" + ] + }, + { + "description": "fs:allow-download-read-recursive -> This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-read-recursive" + ] + }, + { + "description": "fs:allow-download-write -> This allows non-recursive write access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-write" + ] + }, + { + "description": "fs:allow-download-write-recursive -> This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-write-recursive" + ] + }, + { + "description": "fs:allow-exe-meta -> This allows read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta" + ] + }, + { + "description": "fs:allow-exe-meta-recursive -> This allows read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta-recursive" + ] + }, + { + "description": "fs:allow-exe-read -> This allows non-recursive read access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-read" + ] + }, + { + "description": "fs:allow-exe-read-recursive -> This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-read-recursive" + ] + }, + { + "description": "fs:allow-exe-write -> This allows non-recursive write access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-write" + ] + }, + { + "description": "fs:allow-exe-write-recursive -> This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-write-recursive" + ] + }, + { + "description": "fs:allow-font-meta -> This allows read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta" + ] + }, + { + "description": "fs:allow-font-meta-recursive -> This allows read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta-recursive" + ] + }, + { + "description": "fs:allow-font-read -> This allows non-recursive read access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-read" + ] + }, + { + "description": "fs:allow-font-read-recursive -> This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-read-recursive" + ] + }, + { + "description": "fs:allow-font-write -> This allows non-recursive write access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-write" + ] + }, + { + "description": "fs:allow-font-write-recursive -> This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-write-recursive" + ] + }, + { + "description": "fs:allow-home-meta -> This allows read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta" + ] + }, + { + "description": "fs:allow-home-meta-recursive -> This allows read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta-recursive" + ] + }, + { + "description": "fs:allow-home-read -> This allows non-recursive read access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-read" + ] + }, + { + "description": "fs:allow-home-read-recursive -> This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-read-recursive" + ] + }, + { + "description": "fs:allow-home-write -> This allows non-recursive write access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-write" + ] + }, + { + "description": "fs:allow-home-write-recursive -> This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-write-recursive" + ] + }, + { + "description": "fs:allow-localdata-meta -> This allows read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta" + ] + }, + { + "description": "fs:allow-localdata-meta-recursive -> This allows read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta-recursive" + ] + }, + { + "description": "fs:allow-localdata-read -> This allows non-recursive read access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-read" + ] + }, + { + "description": "fs:allow-localdata-read-recursive -> This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-read-recursive" + ] + }, + { + "description": "fs:allow-localdata-write -> This allows non-recursive write access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-write" + ] + }, + { + "description": "fs:allow-localdata-write-recursive -> This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-write-recursive" + ] + }, + { + "description": "fs:allow-log-meta -> This allows read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta" + ] + }, + { + "description": "fs:allow-log-meta-recursive -> This allows read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta-recursive" + ] + }, + { + "description": "fs:allow-log-read -> This allows non-recursive read access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-read" + ] + }, + { + "description": "fs:allow-log-read-recursive -> This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-read-recursive" + ] + }, + { + "description": "fs:allow-log-write -> This allows non-recursive write access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-write" + ] + }, + { + "description": "fs:allow-log-write-recursive -> This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-write-recursive" + ] + }, + { + "description": "fs:allow-picture-meta -> This allows read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta" + ] + }, + { + "description": "fs:allow-picture-meta-recursive -> This allows read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta-recursive" + ] + }, + { + "description": "fs:allow-picture-read -> This allows non-recursive read access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-read" + ] + }, + { + "description": "fs:allow-picture-read-recursive -> This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-read-recursive" + ] + }, + { + "description": "fs:allow-picture-write -> This allows non-recursive write access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-write" + ] + }, + { + "description": "fs:allow-picture-write-recursive -> This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-write-recursive" + ] + }, + { + "description": "fs:allow-public-meta -> This allows read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta" + ] + }, + { + "description": "fs:allow-public-meta-recursive -> This allows read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta-recursive" + ] + }, + { + "description": "fs:allow-public-read -> This allows non-recursive read access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-read" + ] + }, + { + "description": "fs:allow-public-read-recursive -> This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-read-recursive" + ] + }, + { + "description": "fs:allow-public-write -> This allows non-recursive write access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-write" + ] + }, + { + "description": "fs:allow-public-write-recursive -> This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-write-recursive" + ] + }, + { + "description": "fs:allow-resource-meta -> This allows read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta" + ] + }, + { + "description": "fs:allow-resource-meta-recursive -> This allows read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta-recursive" + ] + }, + { + "description": "fs:allow-resource-read -> This allows non-recursive read access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-read" + ] + }, + { + "description": "fs:allow-resource-read-recursive -> This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-read-recursive" + ] + }, + { + "description": "fs:allow-resource-write -> This allows non-recursive write access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-write" + ] + }, + { + "description": "fs:allow-resource-write-recursive -> This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-write-recursive" + ] + }, + { + "description": "fs:allow-runtime-meta -> This allows read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta" + ] + }, + { + "description": "fs:allow-runtime-meta-recursive -> This allows read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta-recursive" + ] + }, + { + "description": "fs:allow-runtime-read -> This allows non-recursive read access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-read" + ] + }, + { + "description": "fs:allow-runtime-read-recursive -> This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-read-recursive" + ] + }, + { + "description": "fs:allow-runtime-write -> This allows non-recursive write access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-write" + ] + }, + { + "description": "fs:allow-runtime-write-recursive -> This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-write-recursive" + ] + }, + { + "description": "fs:allow-temp-meta -> This allows read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta" + ] + }, + { + "description": "fs:allow-temp-meta-recursive -> This allows read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta-recursive" + ] + }, + { + "description": "fs:allow-temp-read -> This allows non-recursive read access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-read" + ] + }, + { + "description": "fs:allow-temp-read-recursive -> This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-read-recursive" + ] + }, + { + "description": "fs:allow-temp-write -> This allows non-recursive write access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-write" + ] + }, + { + "description": "fs:allow-temp-write-recursive -> This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-write-recursive" + ] + }, + { + "description": "fs:allow-template-meta -> This allows read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta" + ] + }, + { + "description": "fs:allow-template-meta-recursive -> This allows read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta-recursive" + ] + }, + { + "description": "fs:allow-template-read -> This allows non-recursive read access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-read" + ] + }, + { + "description": "fs:allow-template-read-recursive -> This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-read-recursive" + ] + }, + { + "description": "fs:allow-template-write -> This allows non-recursive write access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-write" + ] + }, + { + "description": "fs:allow-template-write-recursive -> This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-write-recursive" + ] + }, + { + "description": "fs:allow-video-meta -> This allows read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta" + ] + }, + { + "description": "fs:allow-video-meta-recursive -> This allows read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta-recursive" + ] + }, + { + "description": "fs:allow-video-read -> This allows non-recursive read access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-read" + ] + }, + { + "description": "fs:allow-video-read-recursive -> This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-read-recursive" + ] + }, + { + "description": "fs:allow-video-write -> This allows non-recursive write access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-write" + ] + }, + { + "description": "fs:allow-video-write-recursive -> This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-write-recursive" + ] + }, + { + "description": "fs:deny-default -> This denies access to dangerous Tauri relevant files and folders by default.", + "type": "string", + "enum": [ + "fs:deny-default" + ] + }, + { + "description": "fs:allow-copy-file -> Enables the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-copy-file" + ] + }, + { + "description": "fs:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-create" + ] + }, + { + "description": "fs:allow-exists -> Enables the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-exists" + ] + }, + { + "description": "fs:allow-fstat -> Enables the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-fstat" + ] + }, + { + "description": "fs:allow-ftruncate -> Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-ftruncate" + ] + }, + { + "description": "fs:allow-lstat -> Enables the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-lstat" + ] + }, + { + "description": "fs:allow-mkdir -> Enables the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-mkdir" + ] + }, + { + "description": "fs:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-open" + ] + }, + { + "description": "fs:allow-read -> Enables the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read" + ] + }, + { + "description": "fs:allow-read-dir -> Enables the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-dir" + ] + }, + { + "description": "fs:allow-read-file -> Enables the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-file" + ] + }, + { + "description": "fs:allow-read-text-file -> Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file" + ] + }, + { + "description": "fs:allow-read-text-file-lines -> Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines" + ] + }, + { + "description": "fs:allow-read-text-file-lines-next -> Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines-next" + ] + }, + { + "description": "fs:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-remove" + ] + }, + { + "description": "fs:allow-rename -> Enables the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-rename" + ] + }, + { + "description": "fs:allow-seek -> Enables the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-seek" + ] + }, + { + "description": "fs:allow-stat -> Enables the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-stat" + ] + }, + { + "description": "fs:allow-truncate -> Enables the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-truncate" + ] + }, + { + "description": "fs:allow-unwatch -> Enables the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-unwatch" + ] + }, + { + "description": "fs:allow-watch -> Enables the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-watch" + ] + }, + { + "description": "fs:allow-write -> Enables the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write" + ] + }, + { + "description": "fs:allow-write-file -> Enables the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-file" + ] + }, + { + "description": "fs:allow-write-text-file -> Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-text-file" + ] + }, + { + "description": "fs:deny-copy-file -> Denies the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-copy-file" + ] + }, + { + "description": "fs:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-create" + ] + }, + { + "description": "fs:deny-exists -> Denies the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-exists" + ] + }, + { + "description": "fs:deny-fstat -> Denies the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-fstat" + ] + }, + { + "description": "fs:deny-ftruncate -> Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-ftruncate" + ] + }, + { + "description": "fs:deny-lstat -> Denies the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-lstat" + ] + }, + { + "description": "fs:deny-mkdir -> Denies the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-mkdir" + ] + }, + { + "description": "fs:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-open" + ] + }, + { + "description": "fs:deny-read -> Denies the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read" + ] + }, + { + "description": "fs:deny-read-dir -> Denies the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-dir" + ] + }, + { + "description": "fs:deny-read-file -> Denies the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-file" + ] + }, + { + "description": "fs:deny-read-text-file -> Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file" + ] + }, + { + "description": "fs:deny-read-text-file-lines -> Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines" + ] + }, + { + "description": "fs:deny-read-text-file-lines-next -> Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines-next" + ] + }, + { + "description": "fs:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-remove" + ] + }, + { + "description": "fs:deny-rename -> Denies the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-rename" + ] + }, + { + "description": "fs:deny-seek -> Denies the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-seek" + ] + }, + { + "description": "fs:deny-stat -> Denies the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-stat" + ] + }, + { + "description": "fs:deny-truncate -> Denies the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-truncate" + ] + }, + { + "description": "fs:deny-unwatch -> Denies the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-unwatch" + ] + }, + { + "description": "fs:deny-watch -> Denies the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-watch" + ] + }, + { + "description": "fs:deny-webview-data-linux -> This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-linux" + ] + }, + { + "description": "fs:deny-webview-data-windows -> This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-windows" + ] + }, + { + "description": "fs:deny-write -> Denies the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write" + ] + }, + { + "description": "fs:deny-write-file -> Denies the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-file" + ] + }, + { + "description": "fs:deny-write-text-file -> Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-text-file" + ] + }, + { + "description": "fs:read-all -> This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-all" + ] + }, + { + "description": "fs:read-dirs -> This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-dirs" + ] + }, + { + "description": "fs:read-files -> This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-files" + ] + }, + { + "description": "fs:read-meta -> This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-meta" + ] + }, + { + "description": "fs:scope -> An empty permission you can use to modify the global scope.", + "type": "string", + "enum": [ + "fs:scope" + ] + }, + { + "description": "fs:scope-app -> This scope permits access to all files and list content of top level directories in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app" + ] + }, + { + "description": "fs:scope-app-index -> This scope permits to list all files and folders in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app-index" + ] + }, + { + "description": "fs:scope-app-recursive -> This scope recursive access to the complete `$APP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-app-recursive" + ] + }, + { + "description": "fs:scope-appcache -> This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache" + ] + }, + { + "description": "fs:scope-appcache-index -> This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache-index" + ] + }, + { + "description": "fs:scope-appcache-recursive -> This scope recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appcache-recursive" + ] + }, + { + "description": "fs:scope-appconfig -> This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig" + ] + }, + { + "description": "fs:scope-appconfig-index -> This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig-index" + ] + }, + { + "description": "fs:scope-appconfig-recursive -> This scope recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appconfig-recursive" + ] + }, + { + "description": "fs:scope-appdata -> This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata" + ] + }, + { + "description": "fs:scope-appdata-index -> This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata-index" + ] + }, + { + "description": "fs:scope-appdata-recursive -> This scope recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appdata-recursive" + ] + }, + { + "description": "fs:scope-applocaldata -> This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata" + ] + }, + { + "description": "fs:scope-applocaldata-index -> This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-index" + ] + }, + { + "description": "fs:scope-applocaldata-recursive -> This scope recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-recursive" + ] + }, + { + "description": "fs:scope-applog -> This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog" + ] + }, + { + "description": "fs:scope-applog-index -> This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog-index" + ] + }, + { + "description": "fs:scope-applog-recursive -> This scope recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applog-recursive" + ] + }, + { + "description": "fs:scope-audio -> This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio" + ] + }, + { + "description": "fs:scope-audio-index -> This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio-index" + ] + }, + { + "description": "fs:scope-audio-recursive -> This scope recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-audio-recursive" + ] + }, + { + "description": "fs:scope-cache -> This scope permits access to all files and list content of top level directories in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache" + ] + }, + { + "description": "fs:scope-cache-index -> This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache-index" + ] + }, + { + "description": "fs:scope-cache-recursive -> This scope recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-cache-recursive" + ] + }, + { + "description": "fs:scope-config -> This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config" + ] + }, + { + "description": "fs:scope-config-index -> This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config-index" + ] + }, + { + "description": "fs:scope-config-recursive -> This scope recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-config-recursive" + ] + }, + { + "description": "fs:scope-data -> This scope permits access to all files and list content of top level directories in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data" + ] + }, + { + "description": "fs:scope-data-index -> This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data-index" + ] + }, + { + "description": "fs:scope-data-recursive -> This scope recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-data-recursive" + ] + }, + { + "description": "fs:scope-desktop -> This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop" + ] + }, + { + "description": "fs:scope-desktop-index -> This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop-index" + ] + }, + { + "description": "fs:scope-desktop-recursive -> This scope recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-desktop-recursive" + ] + }, + { + "description": "fs:scope-document -> This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document" + ] + }, + { + "description": "fs:scope-document-index -> This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document-index" + ] + }, + { + "description": "fs:scope-document-recursive -> This scope recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-document-recursive" + ] + }, + { + "description": "fs:scope-download -> This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download" + ] + }, + { + "description": "fs:scope-download-index -> This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download-index" + ] + }, + { + "description": "fs:scope-download-recursive -> This scope recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-download-recursive" + ] + }, + { + "description": "fs:scope-exe -> This scope permits access to all files and list content of top level directories in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe" + ] + }, + { + "description": "fs:scope-exe-index -> This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe-index" + ] + }, + { + "description": "fs:scope-exe-recursive -> This scope recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-exe-recursive" + ] + }, + { + "description": "fs:scope-font -> This scope permits access to all files and list content of top level directories in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font" + ] + }, + { + "description": "fs:scope-font-index -> This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font-index" + ] + }, + { + "description": "fs:scope-font-recursive -> This scope recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-font-recursive" + ] + }, + { + "description": "fs:scope-home -> This scope permits access to all files and list content of top level directories in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home" + ] + }, + { + "description": "fs:scope-home-index -> This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home-index" + ] + }, + { + "description": "fs:scope-home-recursive -> This scope recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-home-recursive" + ] + }, + { + "description": "fs:scope-localdata -> This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata" + ] + }, + { + "description": "fs:scope-localdata-index -> This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata-index" + ] + }, + { + "description": "fs:scope-localdata-recursive -> This scope recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-localdata-recursive" + ] + }, + { + "description": "fs:scope-log -> This scope permits access to all files and list content of top level directories in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log" + ] + }, + { + "description": "fs:scope-log-index -> This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log-index" + ] + }, + { + "description": "fs:scope-log-recursive -> This scope recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-log-recursive" + ] + }, + { + "description": "fs:scope-picture -> This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture" + ] + }, + { + "description": "fs:scope-picture-index -> This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture-index" + ] + }, + { + "description": "fs:scope-picture-recursive -> This scope recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-picture-recursive" + ] + }, + { + "description": "fs:scope-public -> This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public" + ] + }, + { + "description": "fs:scope-public-index -> This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public-index" + ] + }, + { + "description": "fs:scope-public-recursive -> This scope recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-public-recursive" + ] + }, + { + "description": "fs:scope-resource -> This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource" + ] + }, + { + "description": "fs:scope-resource-index -> This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource-index" + ] + }, + { + "description": "fs:scope-resource-recursive -> This scope recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-resource-recursive" + ] + }, + { + "description": "fs:scope-runtime -> This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime" + ] + }, + { + "description": "fs:scope-runtime-index -> This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime-index" + ] + }, + { + "description": "fs:scope-runtime-recursive -> This scope recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-runtime-recursive" + ] + }, + { + "description": "fs:scope-temp -> This scope permits access to all files and list content of top level directories in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp" + ] + }, + { + "description": "fs:scope-temp-index -> This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp-index" + ] + }, + { + "description": "fs:scope-temp-recursive -> This scope recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-temp-recursive" + ] + }, + { + "description": "fs:scope-template -> This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template" + ] + }, + { + "description": "fs:scope-template-index -> This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template-index" + ] + }, + { + "description": "fs:scope-template-recursive -> This scope recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-template-recursive" + ] + }, + { + "description": "fs:scope-video -> This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video" + ] + }, + { + "description": "fs:scope-video-index -> This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video-index" + ] + }, + { + "description": "fs:scope-video-recursive -> This scope recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-video-recursive" + ] + }, + { + "description": "fs:write-all -> This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-all" + ] + }, + { + "description": "fs:write-files -> This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-files" + ] + } + ] + }, + "allow": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "FS scope path.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "FS scope path.", + "type": "string" + } + } + } + ] + } + }, + "deny": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "FS scope path.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "FS scope path.", + "type": "string" + } + } + } + ] + } + } + } + }, + { + "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" + ] + }, + { + "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": "fs:allow-app-meta -> This allows read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta" + ] + }, + { + "description": "fs:allow-app-meta-recursive -> This allows read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta-recursive" + ] + }, + { + "description": "fs:allow-app-read -> This allows non-recursive read access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-read" + ] + }, + { + "description": "fs:allow-app-read-recursive -> This allows full recursive read access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-read-recursive" + ] + }, + { + "description": "fs:allow-app-write -> This allows non-recursive write access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-write" + ] + }, + { + "description": "fs:allow-app-write-recursive -> This allows full recursive write access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-write-recursive" + ] + }, + { + "description": "fs:allow-appcache-meta -> This allows read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta" + ] + }, + { + "description": "fs:allow-appcache-meta-recursive -> This allows read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta-recursive" + ] + }, + { + "description": "fs:allow-appcache-read -> This allows non-recursive read access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-read" + ] + }, + { + "description": "fs:allow-appcache-read-recursive -> This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-read-recursive" + ] + }, + { + "description": "fs:allow-appcache-write -> This allows non-recursive write access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-write" + ] + }, + { + "description": "fs:allow-appcache-write-recursive -> This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-write-recursive" + ] + }, + { + "description": "fs:allow-appconfig-meta -> This allows read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta" + ] + }, + { + "description": "fs:allow-appconfig-meta-recursive -> This allows read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta-recursive" + ] + }, + { + "description": "fs:allow-appconfig-read -> This allows non-recursive read access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read" + ] + }, + { + "description": "fs:allow-appconfig-read-recursive -> This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read-recursive" + ] + }, + { + "description": "fs:allow-appconfig-write -> This allows non-recursive write access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write" + ] + }, + { + "description": "fs:allow-appconfig-write-recursive -> This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write-recursive" + ] + }, + { + "description": "fs:allow-appdata-meta -> This allows read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta" + ] + }, + { + "description": "fs:allow-appdata-meta-recursive -> This allows read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta-recursive" + ] + }, + { + "description": "fs:allow-appdata-read -> This allows non-recursive read access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-read" + ] + }, + { + "description": "fs:allow-appdata-read-recursive -> This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-read-recursive" + ] + }, + { + "description": "fs:allow-appdata-write -> This allows non-recursive write access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-write" + ] + }, + { + "description": "fs:allow-appdata-write-recursive -> This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-write-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-meta -> This allows read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta" + ] + }, + { + "description": "fs:allow-applocaldata-meta-recursive -> This allows read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-read -> This allows non-recursive read access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read" + ] + }, + { + "description": "fs:allow-applocaldata-read-recursive -> This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-write -> This allows non-recursive write access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write" + ] + }, + { + "description": "fs:allow-applocaldata-write-recursive -> This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write-recursive" + ] + }, + { + "description": "fs:allow-applog-meta -> This allows read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta" + ] + }, + { + "description": "fs:allow-applog-meta-recursive -> This allows read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta-recursive" + ] + }, + { + "description": "fs:allow-applog-read -> This allows non-recursive read access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-read" + ] + }, + { + "description": "fs:allow-applog-read-recursive -> This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-read-recursive" + ] + }, + { + "description": "fs:allow-applog-write -> This allows non-recursive write access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-write" + ] + }, + { + "description": "fs:allow-applog-write-recursive -> This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-write-recursive" + ] + }, + { + "description": "fs:allow-audio-meta -> This allows read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta" + ] + }, + { + "description": "fs:allow-audio-meta-recursive -> This allows read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta-recursive" + ] + }, + { + "description": "fs:allow-audio-read -> This allows non-recursive read access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-read" + ] + }, + { + "description": "fs:allow-audio-read-recursive -> This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-read-recursive" + ] + }, + { + "description": "fs:allow-audio-write -> This allows non-recursive write access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-write" + ] + }, + { + "description": "fs:allow-audio-write-recursive -> This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-write-recursive" + ] + }, + { + "description": "fs:allow-cache-meta -> This allows read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta" + ] + }, + { + "description": "fs:allow-cache-meta-recursive -> This allows read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta-recursive" + ] + }, + { + "description": "fs:allow-cache-read -> This allows non-recursive read access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-read" + ] + }, + { + "description": "fs:allow-cache-read-recursive -> This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-read-recursive" + ] + }, + { + "description": "fs:allow-cache-write -> This allows non-recursive write access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-write" + ] + }, + { + "description": "fs:allow-cache-write-recursive -> This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-write-recursive" + ] + }, + { + "description": "fs:allow-config-meta -> This allows read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta" + ] + }, + { + "description": "fs:allow-config-meta-recursive -> This allows read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta-recursive" + ] + }, + { + "description": "fs:allow-config-read -> This allows non-recursive read access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-read" + ] + }, + { + "description": "fs:allow-config-read-recursive -> This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-read-recursive" + ] + }, + { + "description": "fs:allow-config-write -> This allows non-recursive write access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-write" + ] + }, + { + "description": "fs:allow-config-write-recursive -> This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-write-recursive" + ] + }, + { + "description": "fs:allow-data-meta -> This allows read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta" + ] + }, + { + "description": "fs:allow-data-meta-recursive -> This allows read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta-recursive" + ] + }, + { + "description": "fs:allow-data-read -> This allows non-recursive read access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-read" + ] + }, + { + "description": "fs:allow-data-read-recursive -> This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-read-recursive" + ] + }, + { + "description": "fs:allow-data-write -> This allows non-recursive write access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-write" + ] + }, + { + "description": "fs:allow-data-write-recursive -> This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-write-recursive" + ] + }, + { + "description": "fs:allow-desktop-meta -> This allows read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta" + ] + }, + { + "description": "fs:allow-desktop-meta-recursive -> This allows read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta-recursive" + ] + }, + { + "description": "fs:allow-desktop-read -> This allows non-recursive read access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-read" + ] + }, + { + "description": "fs:allow-desktop-read-recursive -> This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-read-recursive" + ] + }, + { + "description": "fs:allow-desktop-write -> This allows non-recursive write access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-write" + ] + }, + { + "description": "fs:allow-desktop-write-recursive -> This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-write-recursive" + ] + }, + { + "description": "fs:allow-document-meta -> This allows read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta" + ] + }, + { + "description": "fs:allow-document-meta-recursive -> This allows read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta-recursive" + ] + }, + { + "description": "fs:allow-document-read -> This allows non-recursive read access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-read" + ] + }, + { + "description": "fs:allow-document-read-recursive -> This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-read-recursive" + ] + }, + { + "description": "fs:allow-document-write -> This allows non-recursive write access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-write" + ] + }, + { + "description": "fs:allow-document-write-recursive -> This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-write-recursive" + ] + }, + { + "description": "fs:allow-download-meta -> This allows read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta" + ] + }, + { + "description": "fs:allow-download-meta-recursive -> This allows read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta-recursive" + ] + }, + { + "description": "fs:allow-download-read -> This allows non-recursive read access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-read" + ] + }, + { + "description": "fs:allow-download-read-recursive -> This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-read-recursive" + ] + }, + { + "description": "fs:allow-download-write -> This allows non-recursive write access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-write" + ] + }, + { + "description": "fs:allow-download-write-recursive -> This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-write-recursive" + ] + }, + { + "description": "fs:allow-exe-meta -> This allows read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta" + ] + }, + { + "description": "fs:allow-exe-meta-recursive -> This allows read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta-recursive" + ] + }, + { + "description": "fs:allow-exe-read -> This allows non-recursive read access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-read" + ] + }, + { + "description": "fs:allow-exe-read-recursive -> This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-read-recursive" + ] + }, + { + "description": "fs:allow-exe-write -> This allows non-recursive write access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-write" + ] + }, + { + "description": "fs:allow-exe-write-recursive -> This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-write-recursive" + ] + }, + { + "description": "fs:allow-font-meta -> This allows read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta" + ] + }, + { + "description": "fs:allow-font-meta-recursive -> This allows read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta-recursive" + ] + }, + { + "description": "fs:allow-font-read -> This allows non-recursive read access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-read" + ] + }, + { + "description": "fs:allow-font-read-recursive -> This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-read-recursive" + ] + }, + { + "description": "fs:allow-font-write -> This allows non-recursive write access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-write" + ] + }, + { + "description": "fs:allow-font-write-recursive -> This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-write-recursive" + ] + }, + { + "description": "fs:allow-home-meta -> This allows read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta" + ] + }, + { + "description": "fs:allow-home-meta-recursive -> This allows read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta-recursive" + ] + }, + { + "description": "fs:allow-home-read -> This allows non-recursive read access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-read" + ] + }, + { + "description": "fs:allow-home-read-recursive -> This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-read-recursive" + ] + }, + { + "description": "fs:allow-home-write -> This allows non-recursive write access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-write" + ] + }, + { + "description": "fs:allow-home-write-recursive -> This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-write-recursive" + ] + }, + { + "description": "fs:allow-localdata-meta -> This allows read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta" + ] + }, + { + "description": "fs:allow-localdata-meta-recursive -> This allows read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta-recursive" + ] + }, + { + "description": "fs:allow-localdata-read -> This allows non-recursive read access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-read" + ] + }, + { + "description": "fs:allow-localdata-read-recursive -> This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-read-recursive" + ] + }, + { + "description": "fs:allow-localdata-write -> This allows non-recursive write access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-write" + ] + }, + { + "description": "fs:allow-localdata-write-recursive -> This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-write-recursive" + ] + }, + { + "description": "fs:allow-log-meta -> This allows read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta" + ] + }, + { + "description": "fs:allow-log-meta-recursive -> This allows read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta-recursive" + ] + }, + { + "description": "fs:allow-log-read -> This allows non-recursive read access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-read" + ] + }, + { + "description": "fs:allow-log-read-recursive -> This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-read-recursive" + ] + }, + { + "description": "fs:allow-log-write -> This allows non-recursive write access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-write" + ] + }, + { + "description": "fs:allow-log-write-recursive -> This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-write-recursive" + ] + }, + { + "description": "fs:allow-picture-meta -> This allows read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta" + ] + }, + { + "description": "fs:allow-picture-meta-recursive -> This allows read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta-recursive" + ] + }, + { + "description": "fs:allow-picture-read -> This allows non-recursive read access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-read" + ] + }, + { + "description": "fs:allow-picture-read-recursive -> This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-read-recursive" + ] + }, + { + "description": "fs:allow-picture-write -> This allows non-recursive write access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-write" + ] + }, + { + "description": "fs:allow-picture-write-recursive -> This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-write-recursive" + ] + }, + { + "description": "fs:allow-public-meta -> This allows read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta" + ] + }, + { + "description": "fs:allow-public-meta-recursive -> This allows read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta-recursive" + ] + }, + { + "description": "fs:allow-public-read -> This allows non-recursive read access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-read" + ] + }, + { + "description": "fs:allow-public-read-recursive -> This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-read-recursive" + ] + }, + { + "description": "fs:allow-public-write -> This allows non-recursive write access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-write" + ] + }, + { + "description": "fs:allow-public-write-recursive -> This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-write-recursive" + ] + }, + { + "description": "fs:allow-resource-meta -> This allows read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta" + ] + }, + { + "description": "fs:allow-resource-meta-recursive -> This allows read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta-recursive" + ] + }, + { + "description": "fs:allow-resource-read -> This allows non-recursive read access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-read" + ] + }, + { + "description": "fs:allow-resource-read-recursive -> This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-read-recursive" + ] + }, + { + "description": "fs:allow-resource-write -> This allows non-recursive write access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-write" + ] + }, + { + "description": "fs:allow-resource-write-recursive -> This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-write-recursive" + ] + }, + { + "description": "fs:allow-runtime-meta -> This allows read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta" + ] + }, + { + "description": "fs:allow-runtime-meta-recursive -> This allows read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta-recursive" + ] + }, + { + "description": "fs:allow-runtime-read -> This allows non-recursive read access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-read" + ] + }, + { + "description": "fs:allow-runtime-read-recursive -> This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-read-recursive" + ] + }, + { + "description": "fs:allow-runtime-write -> This allows non-recursive write access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-write" + ] + }, + { + "description": "fs:allow-runtime-write-recursive -> This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-write-recursive" + ] + }, + { + "description": "fs:allow-temp-meta -> This allows read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta" + ] + }, + { + "description": "fs:allow-temp-meta-recursive -> This allows read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta-recursive" + ] + }, + { + "description": "fs:allow-temp-read -> This allows non-recursive read access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-read" + ] + }, + { + "description": "fs:allow-temp-read-recursive -> This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-read-recursive" + ] + }, + { + "description": "fs:allow-temp-write -> This allows non-recursive write access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-write" + ] + }, + { + "description": "fs:allow-temp-write-recursive -> This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-write-recursive" + ] + }, + { + "description": "fs:allow-template-meta -> This allows read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta" + ] + }, + { + "description": "fs:allow-template-meta-recursive -> This allows read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta-recursive" + ] + }, + { + "description": "fs:allow-template-read -> This allows non-recursive read access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-read" + ] + }, + { + "description": "fs:allow-template-read-recursive -> This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-read-recursive" + ] + }, + { + "description": "fs:allow-template-write -> This allows non-recursive write access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-write" + ] + }, + { + "description": "fs:allow-template-write-recursive -> This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-write-recursive" + ] + }, + { + "description": "fs:allow-video-meta -> This allows read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta" + ] + }, + { + "description": "fs:allow-video-meta-recursive -> This allows read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta-recursive" + ] + }, + { + "description": "fs:allow-video-read -> This allows non-recursive read access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-read" + ] + }, + { + "description": "fs:allow-video-read-recursive -> This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-read-recursive" + ] + }, + { + "description": "fs:allow-video-write -> This allows non-recursive write access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-write" + ] + }, + { + "description": "fs:allow-video-write-recursive -> This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-write-recursive" + ] + }, + { + "description": "fs:deny-default -> This denies access to dangerous Tauri relevant files and folders by default.", + "type": "string", + "enum": [ + "fs:deny-default" + ] + }, + { + "description": "fs:default -> # Tauri `fs` default permissions\n\nThis configuration file defines the default permissions granted\nto the filesystem.\n\n### Granted Permissions\n\nThis default permission set enables all read-related commands and\nallows access to the `$APP` folder and sub directories created in it.\nThe location of the `$APP` folder depends on the operating system,\nwhere the application is run.\n\nIn general the `$APP` folder needs to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\n### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n", + "type": "string", + "enum": [ + "fs:default" + ] + }, + { + "description": "fs:allow-copy-file -> Enables the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-copy-file" + ] + }, + { + "description": "fs:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-create" + ] + }, + { + "description": "fs:allow-exists -> Enables the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-exists" + ] + }, + { + "description": "fs:allow-fstat -> Enables the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-fstat" + ] + }, + { + "description": "fs:allow-ftruncate -> Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-ftruncate" + ] + }, + { + "description": "fs:allow-lstat -> Enables the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-lstat" + ] + }, + { + "description": "fs:allow-mkdir -> Enables the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-mkdir" + ] + }, + { + "description": "fs:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-open" + ] + }, + { + "description": "fs:allow-read -> Enables the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read" + ] + }, + { + "description": "fs:allow-read-dir -> Enables the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-dir" + ] + }, + { + "description": "fs:allow-read-file -> Enables the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-file" + ] + }, + { + "description": "fs:allow-read-text-file -> Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file" + ] + }, + { + "description": "fs:allow-read-text-file-lines -> Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines" + ] + }, + { + "description": "fs:allow-read-text-file-lines-next -> Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines-next" + ] + }, + { + "description": "fs:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-remove" + ] + }, + { + "description": "fs:allow-rename -> Enables the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-rename" + ] + }, + { + "description": "fs:allow-seek -> Enables the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-seek" + ] + }, + { + "description": "fs:allow-stat -> Enables the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-stat" + ] + }, + { + "description": "fs:allow-truncate -> Enables the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-truncate" + ] + }, + { + "description": "fs:allow-unwatch -> Enables the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-unwatch" + ] + }, + { + "description": "fs:allow-watch -> Enables the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-watch" + ] + }, + { + "description": "fs:allow-write -> Enables the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write" + ] + }, + { + "description": "fs:allow-write-file -> Enables the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-file" + ] + }, + { + "description": "fs:allow-write-text-file -> Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-text-file" + ] + }, + { + "description": "fs:deny-copy-file -> Denies the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-copy-file" + ] + }, + { + "description": "fs:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-create" + ] + }, + { + "description": "fs:deny-exists -> Denies the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-exists" + ] + }, + { + "description": "fs:deny-fstat -> Denies the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-fstat" + ] + }, + { + "description": "fs:deny-ftruncate -> Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-ftruncate" + ] + }, + { + "description": "fs:deny-lstat -> Denies the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-lstat" + ] + }, + { + "description": "fs:deny-mkdir -> Denies the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-mkdir" + ] + }, + { + "description": "fs:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-open" + ] + }, + { + "description": "fs:deny-read -> Denies the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read" + ] + }, + { + "description": "fs:deny-read-dir -> Denies the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-dir" + ] + }, + { + "description": "fs:deny-read-file -> Denies the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-file" + ] + }, + { + "description": "fs:deny-read-text-file -> Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file" + ] + }, + { + "description": "fs:deny-read-text-file-lines -> Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines" + ] + }, + { + "description": "fs:deny-read-text-file-lines-next -> Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines-next" + ] + }, + { + "description": "fs:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-remove" + ] + }, + { + "description": "fs:deny-rename -> Denies the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-rename" + ] + }, + { + "description": "fs:deny-seek -> Denies the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-seek" + ] + }, + { + "description": "fs:deny-stat -> Denies the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-stat" + ] + }, + { + "description": "fs:deny-truncate -> Denies the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-truncate" + ] + }, + { + "description": "fs:deny-unwatch -> Denies the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-unwatch" + ] + }, + { + "description": "fs:deny-watch -> Denies the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-watch" + ] + }, + { + "description": "fs:deny-webview-data-linux -> This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-linux" + ] + }, + { + "description": "fs:deny-webview-data-windows -> This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-windows" + ] + }, + { + "description": "fs:deny-write -> Denies the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write" + ] + }, + { + "description": "fs:deny-write-file -> Denies the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-file" + ] + }, + { + "description": "fs:deny-write-text-file -> Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-text-file" + ] + }, + { + "description": "fs:read-all -> This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-all" + ] + }, + { + "description": "fs:read-dirs -> This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-dirs" + ] + }, + { + "description": "fs:read-files -> This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-files" + ] + }, + { + "description": "fs:read-meta -> This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-meta" + ] + }, + { + "description": "fs:scope -> An empty permission you can use to modify the global scope.", + "type": "string", + "enum": [ + "fs:scope" + ] + }, + { + "description": "fs:scope-app -> This scope permits access to all files and list content of top level directories in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app" + ] + }, + { + "description": "fs:scope-app-index -> This scope permits to list all files and folders in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app-index" + ] + }, + { + "description": "fs:scope-app-recursive -> This scope recursive access to the complete `$APP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-app-recursive" + ] + }, + { + "description": "fs:scope-appcache -> This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache" + ] + }, + { + "description": "fs:scope-appcache-index -> This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache-index" + ] + }, + { + "description": "fs:scope-appcache-recursive -> This scope recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appcache-recursive" + ] + }, + { + "description": "fs:scope-appconfig -> This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig" + ] + }, + { + "description": "fs:scope-appconfig-index -> This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig-index" + ] + }, + { + "description": "fs:scope-appconfig-recursive -> This scope recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appconfig-recursive" + ] + }, + { + "description": "fs:scope-appdata -> This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata" + ] + }, + { + "description": "fs:scope-appdata-index -> This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata-index" + ] + }, + { + "description": "fs:scope-appdata-recursive -> This scope recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appdata-recursive" + ] + }, + { + "description": "fs:scope-applocaldata -> This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata" + ] + }, + { + "description": "fs:scope-applocaldata-index -> This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-index" + ] + }, + { + "description": "fs:scope-applocaldata-recursive -> This scope recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-recursive" + ] + }, + { + "description": "fs:scope-applog -> This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog" + ] + }, + { + "description": "fs:scope-applog-index -> This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog-index" + ] + }, + { + "description": "fs:scope-applog-recursive -> This scope recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applog-recursive" + ] + }, + { + "description": "fs:scope-audio -> This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio" + ] + }, + { + "description": "fs:scope-audio-index -> This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio-index" + ] + }, + { + "description": "fs:scope-audio-recursive -> This scope recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-audio-recursive" + ] + }, + { + "description": "fs:scope-cache -> This scope permits access to all files and list content of top level directories in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache" + ] + }, + { + "description": "fs:scope-cache-index -> This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache-index" + ] + }, + { + "description": "fs:scope-cache-recursive -> This scope recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-cache-recursive" + ] + }, + { + "description": "fs:scope-config -> This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config" + ] + }, + { + "description": "fs:scope-config-index -> This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config-index" + ] + }, + { + "description": "fs:scope-config-recursive -> This scope recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-config-recursive" + ] + }, + { + "description": "fs:scope-data -> This scope permits access to all files and list content of top level directories in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data" + ] + }, + { + "description": "fs:scope-data-index -> This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data-index" + ] + }, + { + "description": "fs:scope-data-recursive -> This scope recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-data-recursive" + ] + }, + { + "description": "fs:scope-desktop -> This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop" + ] + }, + { + "description": "fs:scope-desktop-index -> This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop-index" + ] + }, + { + "description": "fs:scope-desktop-recursive -> This scope recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-desktop-recursive" + ] + }, + { + "description": "fs:scope-document -> This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document" + ] + }, + { + "description": "fs:scope-document-index -> This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document-index" + ] + }, + { + "description": "fs:scope-document-recursive -> This scope recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-document-recursive" + ] + }, + { + "description": "fs:scope-download -> This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download" + ] + }, + { + "description": "fs:scope-download-index -> This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download-index" + ] + }, + { + "description": "fs:scope-download-recursive -> This scope recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-download-recursive" + ] + }, + { + "description": "fs:scope-exe -> This scope permits access to all files and list content of top level directories in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe" + ] + }, + { + "description": "fs:scope-exe-index -> This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe-index" + ] + }, + { + "description": "fs:scope-exe-recursive -> This scope recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-exe-recursive" + ] + }, + { + "description": "fs:scope-font -> This scope permits access to all files and list content of top level directories in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font" + ] + }, + { + "description": "fs:scope-font-index -> This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font-index" + ] + }, + { + "description": "fs:scope-font-recursive -> This scope recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-font-recursive" + ] + }, + { + "description": "fs:scope-home -> This scope permits access to all files and list content of top level directories in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home" + ] + }, + { + "description": "fs:scope-home-index -> This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home-index" + ] + }, + { + "description": "fs:scope-home-recursive -> This scope recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-home-recursive" + ] + }, + { + "description": "fs:scope-localdata -> This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata" + ] + }, + { + "description": "fs:scope-localdata-index -> This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata-index" + ] + }, + { + "description": "fs:scope-localdata-recursive -> This scope recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-localdata-recursive" + ] + }, + { + "description": "fs:scope-log -> This scope permits access to all files and list content of top level directories in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log" + ] + }, + { + "description": "fs:scope-log-index -> This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log-index" + ] + }, + { + "description": "fs:scope-log-recursive -> This scope recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-log-recursive" + ] + }, + { + "description": "fs:scope-picture -> This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture" + ] + }, + { + "description": "fs:scope-picture-index -> This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture-index" + ] + }, + { + "description": "fs:scope-picture-recursive -> This scope recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-picture-recursive" + ] + }, + { + "description": "fs:scope-public -> This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public" + ] + }, + { + "description": "fs:scope-public-index -> This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public-index" + ] + }, + { + "description": "fs:scope-public-recursive -> This scope recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-public-recursive" + ] + }, + { + "description": "fs:scope-resource -> This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource" + ] + }, + { + "description": "fs:scope-resource-index -> This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource-index" + ] + }, + { + "description": "fs:scope-resource-recursive -> This scope recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-resource-recursive" + ] + }, + { + "description": "fs:scope-runtime -> This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime" + ] + }, + { + "description": "fs:scope-runtime-index -> This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime-index" + ] + }, + { + "description": "fs:scope-runtime-recursive -> This scope recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-runtime-recursive" + ] + }, + { + "description": "fs:scope-temp -> This scope permits access to all files and list content of top level directories in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp" + ] + }, + { + "description": "fs:scope-temp-index -> This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp-index" + ] + }, + { + "description": "fs:scope-temp-recursive -> This scope recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-temp-recursive" + ] + }, + { + "description": "fs:scope-template -> This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template" + ] + }, + { + "description": "fs:scope-template-index -> This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template-index" + ] + }, + { + "description": "fs:scope-template-recursive -> This scope recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-template-recursive" + ] + }, + { + "description": "fs:scope-video -> This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video" + ] + }, + { + "description": "fs:scope-video-index -> This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video-index" + ] + }, + { + "description": "fs:scope-video-recursive -> This scope recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-video-recursive" + ] + }, + { + "description": "fs:write-all -> This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-all" + ] + }, + { + "description": "fs:write-files -> This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-files" + ] + }, + { + "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": "log:default -> Allows the log command", + "type": "string", + "enum": [ + "log:default" + ] + }, + { + "description": "log:allow-log -> Enables the log command without any pre-configured scope.", + "type": "string", + "enum": [ + "log:allow-log" + ] + }, + { + "description": "log:deny-log -> Denies the log command without any pre-configured scope.", + "type": "string", + "enum": [ + "log:deny-log" + ] + }, + { + "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" + ] + }, + { + "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": "updater:default -> Allows checking for new updates and installing them", + "type": "string", + "enum": [ + "updater:default" + ] + }, + { + "description": "updater:allow-check -> Enables the check command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-check" + ] + }, + { + "description": "updater:allow-download-and-install -> Enables the download_and_install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-download-and-install" + ] + }, + { + "description": "updater:deny-check -> Denies the check command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-check" + ] + }, + { + "description": "updater:deny-download-and-install -> Denies the download_and_install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-download-and-install" + ] + }, + { + "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-cursor-position -> Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-cursor-position" + ] + }, + { + "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-cursor-position -> Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-cursor-position" + ] + }, + { + "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" + ] + }, + { + "type": "string", + "enum": [ + "window-state:default" + ] + }, + { + "description": "window-state:allow-filename -> Enables the filename command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:allow-filename" + ] + }, + { + "description": "window-state:allow-restore-state -> Enables the restore_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:allow-restore-state" + ] + }, + { + "description": "window-state:allow-save-window-state -> Enables the save_window_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:allow-save-window-state" + ] + }, + { + "description": "window-state:deny-filename -> Denies the filename command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:deny-filename" + ] + }, + { + "description": "window-state:deny-restore-state -> Denies the restore_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:deny-restore-state" + ] + }, + { + "description": "window-state:deny-save-window-state -> Denies the save_window_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "window-state:deny-save-window-state" + ] + } + ] + }, + "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/src-tauri/grpc/Cargo.toml b/src-tauri/grpc/Cargo.toml index 3de6213c..8ba233fa 100644 --- a/src-tauri/grpc/Cargo.toml +++ b/src-tauri/grpc/Cargo.toml @@ -20,4 +20,5 @@ hyper = { version = "0.14" } hyper-rustls = { version = "0.24.0", features = ["http2"] } protoc-bin-vendored = "3.0.0" uuid = { version = "1.7.0", features = ["v4"] } -tauri = { version = "1.5.4", features = ["process-command-api"]} +tauri = { version = "2.0.0-beta.16" } +tauri-plugin-shell = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } diff --git a/src-tauri/grpc/src/proto.rs b/src-tauri/grpc/src/proto.rs index 1046145c..0260d52a 100644 --- a/src-tauri/grpc/src/proto.rs +++ b/src-tauri/grpc/src/proto.rs @@ -1,7 +1,7 @@ use std::env::temp_dir; use std::ops::Deref; use std::path::PathBuf; -use std::str::FromStr; +use std::str::{from_utf8, FromStr}; use anyhow::anyhow; use hyper::client::HttpConnector; @@ -11,8 +11,10 @@ use log::{debug, info, warn}; use prost::Message; use prost_reflect::{DescriptorPool, MethodDescriptor}; use prost_types::{FileDescriptorProto, FileDescriptorSet}; -use tauri::api::process::{Command, CommandEvent}; -use tauri::AppHandle; +use tauri::path::BaseDirectory; +use tauri::{AppHandle, Manager}; +use tauri_plugin_shell::process::CommandEvent; +use tauri_plugin_shell::ShellExt; use tokio::fs; use tokio_stream::StreamExt; use tonic::body::BoxBody; @@ -32,8 +34,8 @@ pub async fn fill_pool_from_files( let random_file_name = format!("{}.desc", uuid::Uuid::new_v4()); let desc_path = temp_dir().join(random_file_name); let global_import_dir = app_handle - .path_resolver() - .resolve_resource("protoc-vendored/include") + .path() + .resolve("protoc-vendored/include", BaseDirectory::Resource) .expect("failed to resolve protoc include directory"); let mut args = vec![ @@ -63,7 +65,9 @@ pub async fn fill_pool_from_files( } } - let (mut rx, _child) = Command::new_sidecar("protoc") + let (mut rx, _child) = app_handle + .shell() + .sidecar("protoc") .expect("protoc not found") .args(args) .spawn() @@ -72,10 +76,16 @@ pub async fn fill_pool_from_files( while let Some(event) = rx.recv().await { match event { CommandEvent::Stdout(line) => { - info!("protoc stdout: {}", line); + info!( + "protoc stdout: {}", + from_utf8(line.as_slice()).unwrap_or_default().to_string() + ); } CommandEvent::Stderr(line) => { - info!("protoc stderr: {}", line); + info!( + "protoc stderr: {}", + from_utf8(line.as_slice()).unwrap_or_default().to_string() + ); } CommandEvent::Error(e) => { return Err(e.to_string()); diff --git a/src-tauri/src/analytics.rs b/src-tauri/src/analytics.rs index 145a5bde..2771d5dd 100644 --- a/src-tauri/src/analytics.rs +++ b/src-tauri/src/analytics.rs @@ -208,7 +208,7 @@ fn get_os() -> &'static str { } fn get_window_size(app_handle: &AppHandle) -> String { - let window = match app_handle.windows().into_values().next() { + let window = match app_handle.webview_windows().into_values().next() { Some(w) => w, None => return "unknown".to_string(), }; diff --git a/src-tauri/src/http.rs b/src-tauri/src/http.rs index 8a696405..a0ba324d 100644 --- a/src-tauri/src/http.rs +++ b/src-tauri/src/http.rs @@ -7,20 +7,20 @@ use std::sync::Arc; use std::time::Duration; use base64::Engine; -use http::header::{ACCEPT, USER_AGENT}; use http::{HeaderMap, HeaderName, HeaderValue, Method}; +use http::header::{ACCEPT, USER_AGENT}; use log::{error, info, warn}; -use reqwest::redirect::Policy; use reqwest::{multipart, Url}; +use reqwest::redirect::Policy; use sqlx::types::{Json, JsonValue}; -use tauri::{Manager, Window}; +use tauri::{Manager, WebviewWindow}; use tokio::sync::oneshot; use tokio::sync::watch::Receiver; use crate::{models, render, response_err}; pub async fn send_http_request( - window: &Window, + window: &WebviewWindow, request: models::HttpRequest, response: &models::HttpResponse, environment: Option, @@ -112,7 +112,6 @@ pub async fn send_http_request( // everything manually to know that). // if let Some(cookie_store) = maybe_cookie_store.clone() { // let values1 = cookie_store.get_request_values(&url); - // println!("COOKIE VLUAES: {:?}", values1.collect::>()); // let raw_value = cookie_store.get_request_values(&url) // .map(|(name, value)| format!("{}={}", name, value)) // .collect::>() @@ -401,7 +400,7 @@ pub async fn send_http_request( { // Write body to FS - let dir = window.app_handle().path_resolver().app_data_dir().unwrap(); + let dir = window.app_handle().path().app_data_dir().unwrap(); let base_dir = dir.join("responses"); create_dir_all(base_dir.clone()).expect("Failed to create responses dir"); let body_path = match response.id.is_empty() { diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 00000000..555b79f6 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,1721 @@ +extern crate core; +#[cfg(target_os = "macos")] +#[macro_use] +extern crate objc; + +use std::collections::HashMap; +use std::env::current_dir; +use std::fs::{create_dir_all, read_to_string, File}; +use std::path::PathBuf; +use std::process::exit; +use std::str::FromStr; + +use ::http::uri::InvalidUri; +use ::http::Uri; +use base64::Engine; +use fern::colors::ColoredLevelConfig; +use log::{debug, error, info, warn}; +use rand::random; +use serde_json::{json, Value}; +use sqlx::migrate::Migrator; +use sqlx::sqlite::SqliteConnectOptions; +use sqlx::types::Json; +use sqlx::{Pool, Sqlite, SqlitePool}; +use tauri::path::BaseDirectory; +#[cfg(target_os = "macos")] +use tauri::TitleBarStyle; +use tauri::{AppHandle, RunEvent, State, WebviewUrl, WebviewWindow}; +use tauri::{Manager, WindowEvent}; +use tauri_plugin_log::{fern, Target, TargetKind}; +use tauri_plugin_shell::ShellExt; +use tokio::sync::Mutex; +use tokio::time::sleep; + +use ::grpc::manager::{DynamicMessage, GrpcHandle}; +use ::grpc::{deserialize_message, serialize_message, Code, ServiceDefinition}; +use window_ext::TrafficLightWindowExt; + +use crate::analytics::{AnalyticsAction, AnalyticsResource}; +use crate::grpc::metadata_to_map; +use crate::http::send_http_request; +use crate::models::{ + cancel_pending_grpc_connections, cancel_pending_responses, create_http_response, + delete_all_grpc_connections, delete_all_http_responses, delete_cookie_jar, delete_environment, + delete_folder, delete_grpc_connection, delete_grpc_request, delete_http_request, + delete_http_response, delete_workspace, duplicate_grpc_request, duplicate_http_request, + get_cookie_jar, get_environment, get_folder, get_grpc_connection, get_grpc_request, + get_http_request, get_http_response, get_key_value_raw, get_or_create_settings, get_workspace, + get_workspace_export_resources, list_cookie_jars, list_environments, list_folders, + list_grpc_connections, list_grpc_events, list_grpc_requests, list_http_requests, + list_responses, list_workspaces, set_key_value_raw, update_response_if_id, update_settings, + upsert_cookie_jar, upsert_environment, upsert_folder, upsert_grpc_connection, + upsert_grpc_event, upsert_grpc_request, upsert_http_request, upsert_workspace, CookieJar, + Environment, EnvironmentVariable, Folder, GrpcConnection, GrpcEvent, GrpcEventType, + GrpcRequest, HttpRequest, HttpRequestHeader, HttpResponse, KeyValue, Settings, Workspace, + WorkspaceExportResources, +}; +use crate::plugin::ImportResult; +use crate::updates::{update_mode_from_str, UpdateMode, YaakUpdater}; +use crate::window_menu::app_menu; + +mod analytics; +mod grpc; +mod http; +mod models; +mod plugin; +mod render; +mod updates; +mod window_ext; +mod window_menu; + +async fn migrate_db(app_handle: &AppHandle, db: &Mutex>) -> Result<(), String> { + let pool = &*db.lock().await; + let p = app_handle + .path() + .resolve("migrations", BaseDirectory::Resource) + .expect("failed to resolve resource"); + info!("Running migrations at {}", p.to_string_lossy()); + let mut m = Migrator::new(p).await.expect("Failed to load migrations"); + m.set_ignore_missing(true); // So we can rollback versions and not crash + m.run(pool).await.expect("Failed to run migrations"); + info!("Migrations complete!"); + Ok(()) +} + +#[derive(serde::Serialize)] +#[serde(default, rename_all = "camelCase")] +struct AppMetaData { + is_dev: bool, + version: String, + name: String, + app_data_dir: String, +} + +#[tauri::command] +async fn cmd_metadata(app_handle: AppHandle) -> Result { + let app_data_dir = app_handle.path().app_data_dir().unwrap(); + return Ok(AppMetaData { + is_dev: is_dev(), + version: app_handle.package_info().version.to_string(), + name: app_handle.package_info().name.to_string(), + app_data_dir: app_data_dir.to_string_lossy().to_string(), + }); +} + +#[tauri::command] +async fn cmd_grpc_reflect( + request_id: &str, + proto_files: Vec, + window: WebviewWindow, + grpc_handle: State<'_, Mutex>, +) -> Result, String> { + let req = get_grpc_request(&window, request_id) + .await + .map_err(|e| e.to_string())?; + let uri = safe_uri(&req.url).map_err(|e| e.to_string())?; + if proto_files.len() > 0 { + grpc_handle + .lock() + .await + .services_from_files( + &req.id, + &uri, + proto_files + .iter() + .map(|p| PathBuf::from_str(p).unwrap()) + .collect(), + ) + .await + } else { + grpc_handle + .lock() + .await + .services_from_reflection(&req.id, &uri) + .await + } +} + +#[tauri::command] +async fn cmd_grpc_go( + request_id: &str, + environment_id: Option<&str>, + proto_files: Vec, + w: WebviewWindow, + grpc_handle: State<'_, Mutex>, +) -> Result { + let req = get_grpc_request(&w, request_id) + .await + .map_err(|e| e.to_string())?; + let environment = match environment_id { + Some(id) => Some(get_environment(&w, id).await.map_err(|e| e.to_string())?), + None => None, + }; + let workspace = get_workspace(&w, &req.workspace_id) + .await + .map_err(|e| e.to_string())?; + let mut metadata = HashMap::new(); + + // Add rest of metadata + for h in req.clone().metadata.0 { + if h.name.is_empty() && h.value.is_empty() { + continue; + } + + if !h.enabled { + continue; + } + + let name = render::render(&h.name, &workspace, environment.as_ref()); + let value = render::render(&h.value, &workspace, environment.as_ref()); + + metadata.insert(name, value); + } + + if let Some(b) = &req.authentication_type { + let req = req.clone(); + let environment_ref = environment.as_ref(); + let empty_value = &serde_json::to_value("").unwrap(); + let a = req.authentication.0; + + if b == "basic" { + let raw_username = a + .get("username") + .unwrap_or(empty_value) + .as_str() + .unwrap_or(""); + let raw_password = a + .get("password") + .unwrap_or(empty_value) + .as_str() + .unwrap_or(""); + let username = render::render(raw_username, &workspace, environment_ref); + let password = render::render(raw_password, &workspace, environment_ref); + + let auth = format!("{username}:{password}"); + let encoded = base64::engine::general_purpose::STANDARD_NO_PAD.encode(auth); + metadata.insert("Authorization".to_string(), format!("Basic {}", encoded)); + } else if b == "bearer" { + let raw_token = a.get("token").unwrap_or(empty_value).as_str().unwrap_or(""); + let token = render::render(raw_token, &workspace, environment_ref); + metadata.insert("Authorization".to_string(), format!("Bearer {token}")); + } + } + + let conn = { + let req = req.clone(); + upsert_grpc_connection( + &w, + &GrpcConnection { + workspace_id: req.workspace_id, + request_id: req.id, + status: -1, + url: req.url.clone(), + ..Default::default() + }, + ) + .await + .map_err(|e| e.to_string())? + }; + let conn_id = conn.id.clone(); + + let base_msg = GrpcEvent { + workspace_id: req.clone().workspace_id, + request_id: req.clone().id, + connection_id: conn.clone().id, + ..Default::default() + }; + + let (in_msg_tx, in_msg_rx) = tauri::async_runtime::channel::(16); + let maybe_in_msg_tx = std::sync::Mutex::new(Some(in_msg_tx.clone())); + let (cancelled_tx, mut cancelled_rx) = tokio::sync::watch::channel(false); + + let uri = safe_uri(&req.url).map_err(|e| e.to_string())?; + + let in_msg_stream = tokio_stream::wrappers::ReceiverStream::new(in_msg_rx); + + let (service, method) = { + let req = req.clone(); + match (req.service, req.method) { + (Some(service), Some(method)) => (service, method), + _ => return Err("Service and method are required".to_string()), + } + }; + + let start = std::time::Instant::now(); + let connection = grpc_handle + .lock() + .await + .connect( + &req.clone().id, + uri, + proto_files + .iter() + .map(|p| PathBuf::from_str(p).unwrap()) + .collect(), + ) + .await?; + + let method_desc = connection + .method(&service, &method) + .expect("Service not found"); + + #[derive(serde::Deserialize)] + enum IncomingMsg { + Message(String), + Cancel, + Commit, + } + + let cb = { + let cancelled_rx = cancelled_rx.clone(); + let environment = environment.clone(); + let workspace = workspace.clone(); + let w = w.clone(); + let base_msg = base_msg.clone(); + let method_desc = method_desc.clone(); + + move |ev: tauri::Event| { + if *cancelled_rx.borrow() { + // Stream is cancelled + return; + } + + let mut maybe_in_msg_tx = maybe_in_msg_tx + .lock() + .expect("previous holder not to panic"); + let in_msg_tx = if let Some(in_msg_tx) = maybe_in_msg_tx.as_ref() { + in_msg_tx + } else { + // This would mean that the stream is already committed because + // we have already dropped the sending half + return; + }; + + match serde_json::from_str::(ev.payload()) { + Ok(IncomingMsg::Message(raw_msg)) => { + let w = w.clone(); + let base_msg = base_msg.clone(); + let environment_ref = environment.as_ref(); + let method_desc = method_desc.clone(); + let msg = render::render(raw_msg.as_str(), &workspace, environment_ref); + let d_msg: DynamicMessage = match deserialize_message(msg.as_str(), method_desc) + { + Ok(d_msg) => d_msg, + Err(e) => { + tauri::async_runtime::spawn(async move { + upsert_grpc_event( + &w, + &GrpcEvent { + event_type: GrpcEventType::Error, + content: e.to_string(), + ..base_msg.clone() + }, + ) + .await + .unwrap(); + }); + return; + } + }; + in_msg_tx.try_send(d_msg).unwrap(); + tauri::async_runtime::spawn(async move { + upsert_grpc_event( + &w, + &GrpcEvent { + content: msg, + event_type: GrpcEventType::ClientMessage, + ..base_msg.clone() + }, + ) + .await + .unwrap(); + }); + } + Ok(IncomingMsg::Commit) => { + maybe_in_msg_tx.take(); + } + Ok(IncomingMsg::Cancel) => { + cancelled_tx.send_replace(true); + } + Err(e) => { + error!("Failed to parse gRPC message: {:?}", e); + } + } + } + }; + let event_handler = w.listen_any(format!("grpc_client_msg_{}", conn.id).as_str(), cb); + + let grpc_listen = { + let w = w.clone(); + let base_event = base_msg.clone(); + let req = req.clone(); + let workspace = workspace.clone(); + let environment = environment.clone(); + let raw_msg = if req.message.is_empty() { + "{}".to_string() + } else { + req.message + }; + let msg = render::render(&raw_msg, &workspace, environment.as_ref()); + + upsert_grpc_event( + &w, + &GrpcEvent { + content: format!("Connecting to {}", req.url), + event_type: GrpcEventType::ConnectionStart, + metadata: Json(metadata.clone()), + ..base_event.clone() + }, + ) + .await + .unwrap(); + + async move { + let (maybe_stream, maybe_msg) = match ( + method_desc.is_client_streaming(), + method_desc.is_server_streaming(), + ) { + (true, true) => ( + Some( + connection + .streaming(&service, &method, in_msg_stream, metadata) + .await, + ), + None, + ), + (true, false) => ( + None, + Some( + connection + .client_streaming(&service, &method, in_msg_stream, metadata) + .await, + ), + ), + (false, true) => ( + Some( + connection + .server_streaming(&service, &method, &msg, metadata) + .await, + ), + None, + ), + (false, false) => ( + None, + Some(connection.unary(&service, &method, &msg, metadata).await), + ), + }; + + if !method_desc.is_client_streaming() { + upsert_grpc_event( + &w, + &GrpcEvent { + event_type: GrpcEventType::ClientMessage, + content: msg, + ..base_event.clone() + }, + ) + .await + .unwrap(); + } + + match maybe_msg { + Some(Ok(msg)) => { + upsert_grpc_event( + &w, + &GrpcEvent { + metadata: Json(metadata_to_map(msg.metadata().clone())), + content: if msg.metadata().len() == 0 { + "Received response" + } else { + "Received response with metadata" + } + .to_string(), + event_type: GrpcEventType::Info, + ..base_event.clone() + }, + ) + .await + .unwrap(); + upsert_grpc_event( + &w, + &GrpcEvent { + content: serialize_message(&msg.into_inner()).unwrap(), + event_type: GrpcEventType::ServerMessage, + ..base_event.clone() + }, + ) + .await + .unwrap(); + upsert_grpc_event( + &w, + &GrpcEvent { + content: "Connection complete".to_string(), + event_type: GrpcEventType::ConnectionEnd, + status: Some(Code::Ok as i64), + ..base_event.clone() + }, + ) + .await + .unwrap(); + } + Some(Err(e)) => { + upsert_grpc_event( + &w, + &(match e.status { + Some(s) => GrpcEvent { + error: Some(s.message().to_string()), + status: Some(s.code() as i64), + content: "Failed to connect".to_string(), + metadata: Json(metadata_to_map(s.metadata().clone())), + event_type: GrpcEventType::ConnectionEnd, + ..base_event.clone() + }, + None => GrpcEvent { + error: Some(e.message), + status: Some(Code::Unknown as i64), + content: "Failed to connect".to_string(), + event_type: GrpcEventType::ConnectionEnd, + ..base_event.clone() + }, + }), + ) + .await + .unwrap(); + } + None => { + // Server streaming doesn't return initial message + } + } + + let mut stream = match maybe_stream { + Some(Ok(stream)) => { + upsert_grpc_event( + &w, + &GrpcEvent { + metadata: Json(metadata_to_map(stream.metadata().clone())), + content: if stream.metadata().len() == 0 { + "Received response" + } else { + "Received response with metadata" + } + .to_string(), + event_type: GrpcEventType::Info, + ..base_event.clone() + }, + ) + .await + .unwrap(); + stream.into_inner() + } + Some(Err(e)) => { + upsert_grpc_event( + &w, + &(match e.status { + Some(s) => GrpcEvent { + error: Some(s.message().to_string()), + status: Some(s.code() as i64), + content: "Failed to connect".to_string(), + metadata: Json(metadata_to_map(s.metadata().clone())), + event_type: GrpcEventType::ConnectionEnd, + ..base_event.clone() + }, + None => GrpcEvent { + error: Some(e.message), + status: Some(Code::Unknown as i64), + content: "Failed to connect".to_string(), + event_type: GrpcEventType::ConnectionEnd, + ..base_event.clone() + }, + }), + ) + .await + .unwrap(); + return; + } + None => return, + }; + + loop { + match stream.message().await { + Ok(Some(msg)) => { + let message = serialize_message(&msg).unwrap(); + upsert_grpc_event( + &w, + &GrpcEvent { + content: message, + event_type: GrpcEventType::ServerMessage, + ..base_event.clone() + }, + ) + .await + .unwrap(); + } + Ok(None) => { + let trailers = stream + .trailers() + .await + .unwrap_or_default() + .unwrap_or_default(); + upsert_grpc_event( + &w, + &GrpcEvent { + content: "Connection complete".to_string(), + status: Some(Code::Unavailable as i64), + metadata: Json(metadata_to_map(trailers)), + event_type: GrpcEventType::ConnectionEnd, + ..base_event.clone() + }, + ) + .await + .unwrap(); + break; + } + Err(status) => { + upsert_grpc_event( + &w, + &GrpcEvent { + content: status.to_string(), + status: Some(status.code() as i64), + metadata: Json(metadata_to_map(status.metadata().clone())), + event_type: GrpcEventType::ConnectionEnd, + ..base_event.clone() + }, + ) + .await + .unwrap(); + } + } + } + } + }; + + { + let conn_id = conn_id.clone(); + tauri::async_runtime::spawn(async move { + let w = w.clone(); + tokio::select! { + _ = grpc_listen => { + let events = list_grpc_events(&w, &conn_id) + .await + .unwrap(); + let closed_event = events + .iter() + .find(|e| GrpcEventType::ConnectionEnd == e.event_type); + let closed_status = closed_event.and_then(|e| e.status).unwrap_or(Code::Unavailable as i64); + upsert_grpc_connection( + &w, + &GrpcConnection{ + elapsed: start.elapsed().as_millis() as i64, + status: closed_status, + ..get_grpc_connection(&w, &conn_id).await.unwrap().clone() + }, + ).await.unwrap(); + }, + _ = cancelled_rx.changed() => { + upsert_grpc_event( + &w, + &GrpcEvent { + content: "Cancelled".to_string(), + event_type: GrpcEventType::ConnectionEnd, + status: Some(Code::Cancelled as i64), + ..base_msg.clone() + }, + ).await.unwrap(); + upsert_grpc_connection( + &w, + &GrpcConnection { + elapsed: start.elapsed().as_millis() as i64, + status: Code::Cancelled as i64, + ..get_grpc_connection(&w, &conn_id).await.unwrap().clone() + }, + ) + .await + .unwrap(); + }, + } + w.unlisten(event_handler); + }); + }; + + Ok(conn.id) +} + +#[tauri::command] +async fn cmd_send_ephemeral_request( + mut request: HttpRequest, + environment_id: Option<&str>, + cookie_jar_id: Option<&str>, + window: WebviewWindow, +) -> Result { + let response = HttpResponse::new(); + request.id = "".to_string(); + let environment = match environment_id { + Some(id) => Some( + get_environment(&window, id) + .await + .expect("Failed to get environment"), + ), + None => None, + }; + let cookie_jar = match cookie_jar_id { + Some(id) => Some( + get_cookie_jar(&window, id) + .await + .expect("Failed to get cookie jar"), + ), + None => None, + }; + + let (cancel_tx, mut cancel_rx) = tokio::sync::watch::channel(false); + window.listen_any( + format!("cancel_http_response_{}", response.id), + move |_event| { + let _ = cancel_tx.send(true); + }, + ); + + send_http_request( + &window, + request, + &response, + environment, + cookie_jar, + None, + &mut cancel_rx, + ) + .await +} + +#[tauri::command] +async fn cmd_filter_response( + w: WebviewWindow, + response_id: &str, + filter: &str, +) -> Result { + let response = get_http_response(&w, response_id) + .await + .expect("Failed to get response"); + + if let None = response.body_path { + return Err("Response body not found".to_string()); + } + + let mut content_type = "".to_string(); + for header in response.headers.iter() { + if header.name.to_lowercase() == "content-type" { + content_type = header.value.to_string().to_lowercase(); + break; + } + } + + // TODO: Have plugins register their own content type (regex?) + let plugin_name = if content_type.contains("json") { + "filter-jsonpath" + } else { + "filter-xpath" + }; + + let body = read_to_string(response.body_path.unwrap()).unwrap(); + let filter_result = plugin::run_plugin_filter(&w.app_handle(), plugin_name, filter, &body) + .await + .expect("Failed to run filter"); + Ok(filter_result.filtered) +} + +#[tauri::command] +async fn cmd_import_data( + w: WebviewWindow, + file_path: &str, + _workspace_id: &str, +) -> Result { + let mut result: Option = None; + let plugins = vec![ + "importer-yaak", + "importer-insomnia", + "importer-postman", + "importer-curl", + ]; + for plugin_name in plugins { + let v = plugin::run_plugin_import(&w.app_handle(), plugin_name, file_path) + .await + .map_err(|e| e.to_string())?; + if let Some(r) = v { + info!("Imported data using {}", plugin_name); + analytics::track_event( + &w.app_handle(), + AnalyticsResource::App, + AnalyticsAction::Import, + Some(json!({ "plugin": plugin_name })), + ) + .await; + result = Some(r); + break; + } + } + + match result { + None => Err("No import handlers found".to_string()), + Some(r) => { + let mut imported_resources = WorkspaceExportResources::default(); + + info!("Importing resources"); + for v in r.resources.workspaces { + let x = upsert_workspace(&w, v).await.map_err(|e| e.to_string())?; + imported_resources.workspaces.push(x.clone()); + info!("Imported workspace: {}", x.name); + } + + for v in r.resources.environments { + let x = upsert_environment(&w, v).await.map_err(|e| e.to_string())?; + imported_resources.environments.push(x.clone()); + info!("Imported environment: {}", x.name); + } + + for v in r.resources.folders { + let x = upsert_folder(&w, v).await.map_err(|e| e.to_string())?; + imported_resources.folders.push(x.clone()); + info!("Imported folder: {}", x.name); + } + + for v in r.resources.http_requests { + let x = upsert_http_request(&w, v) + .await + .map_err(|e| e.to_string())?; + imported_resources.http_requests.push(x.clone()); + info!("Imported request: {}", x.name); + } + + for v in r.resources.grpc_requests { + let x = upsert_grpc_request(&w, &v) + .await + .map_err(|e| e.to_string())?; + imported_resources.grpc_requests.push(x.clone()); + info!("Imported request: {}", x.name); + } + + Ok(imported_resources) + } + } +} + +#[tauri::command] +async fn cmd_export_data( + window: WebviewWindow, + export_path: &str, + workspace_ids: Vec<&str>, +) -> Result<(), String> { + let export_data = get_workspace_export_resources(&window, workspace_ids).await; + let f = File::options() + .create(true) + .truncate(true) + .write(true) + .open(export_path) + .expect("Unable to create file"); + serde_json::to_writer_pretty(&f, &export_data) + .map_err(|e| e.to_string()) + .expect("Failed to write"); + + f.sync_all().expect("Failed to sync"); + + analytics::track_event( + &window.app_handle(), + AnalyticsResource::App, + AnalyticsAction::Export, + None, + ) + .await; + + Ok(()) +} + +#[tauri::command] +async fn cmd_send_http_request( + window: WebviewWindow, + request_id: &str, + environment_id: Option<&str>, + cookie_jar_id: Option<&str>, + download_dir: Option<&str>, +) -> Result { + let request = get_http_request(&window, request_id) + .await + .expect("Failed to get request"); + + let environment = match environment_id { + Some(id) => match get_environment(&window, id).await { + Ok(env) => Some(env), + Err(e) => { + warn!("Failed to find environment by id {id} {}", e); + None + } + }, + None => None, + }; + + let cookie_jar = match cookie_jar_id { + Some(id) => Some( + get_cookie_jar(&window, id) + .await + .expect("Failed to get cookie jar"), + ), + None => None, + }; + + let response = create_http_response( + &window, + &request.id, + 0, + 0, + "", + 0, + None, + None, + None, + vec![], + None, + None, + ) + .await + .expect("Failed to create response"); + + let download_path = if let Some(p) = download_dir { + Some(std::path::Path::new(p).to_path_buf()) + } else { + None + }; + + let (cancel_tx, mut cancel_rx) = tokio::sync::watch::channel(false); + window.listen_any( + format!("cancel_http_response_{}", response.id), + move |_event| { + let _ = cancel_tx.send(true); + }, + ); + + send_http_request( + &window, + request.clone(), + &response, + environment, + cookie_jar, + download_path, + &mut cancel_rx, + ) + .await +} + +async fn response_err( + response: &HttpResponse, + error: String, + w: &WebviewWindow, +) -> Result { + let mut response = response.clone(); + response.elapsed = -1; + response.error = Some(error.clone()); + response = update_response_if_id(w, &response) + .await + .expect("Failed to update response"); + Ok(response) +} + +#[tauri::command] +async fn cmd_track_event( + window: WebviewWindow, + resource: &str, + action: &str, + attributes: Option, +) -> Result<(), String> { + match ( + AnalyticsResource::from_str(resource), + AnalyticsAction::from_str(action), + ) { + (Ok(resource), Ok(action)) => { + analytics::track_event(&window.app_handle(), resource, action, attributes).await; + } + (r, a) => { + error!( + "Invalid action/resource for track_event: {resource}.{action} = {:?}.{:?}", + r, a + ); + return Err("Invalid analytics event".to_string()); + } + }; + Ok(()) +} + +#[tauri::command] +async fn cmd_set_update_mode(update_mode: &str, w: WebviewWindow) -> Result { + cmd_set_key_value("app", "update_mode", update_mode, w) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_get_key_value( + namespace: &str, + key: &str, + w: WebviewWindow, +) -> Result, ()> { + let result = get_key_value_raw(&w, namespace, key).await; + Ok(result) +} + +#[tauri::command] +async fn cmd_set_key_value( + namespace: &str, + key: &str, + value: &str, + w: WebviewWindow, +) -> Result { + let (key_value, _created) = set_key_value_raw(&w, namespace, key, value).await; + Ok(key_value) +} + +#[tauri::command] +async fn cmd_create_workspace(name: &str, w: WebviewWindow) -> Result { + upsert_workspace(&w, Workspace::new(name.to_string())) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_update_cookie_jar( + cookie_jar: CookieJar, + w: WebviewWindow, +) -> Result { + upsert_cookie_jar(&w, &cookie_jar) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_delete_cookie_jar(w: WebviewWindow, cookie_jar_id: &str) -> Result { + delete_cookie_jar(&w, cookie_jar_id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_create_cookie_jar( + workspace_id: &str, + name: &str, + w: WebviewWindow, +) -> Result { + upsert_cookie_jar( + &w, + &CookieJar { + name: name.to_string(), + workspace_id: workspace_id.to_string(), + ..Default::default() + }, + ) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_create_environment( + workspace_id: &str, + name: &str, + variables: Vec, + w: WebviewWindow, +) -> Result { + upsert_environment( + &w, + Environment { + workspace_id: workspace_id.to_string(), + name: name.to_string(), + variables: Json(variables), + ..Default::default() + }, + ) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_create_grpc_request( + workspace_id: &str, + name: &str, + sort_priority: f64, + folder_id: Option<&str>, + w: WebviewWindow, +) -> Result { + upsert_grpc_request( + &w, + &GrpcRequest { + workspace_id: workspace_id.to_string(), + name: name.to_string(), + folder_id: folder_id.map(|s| s.to_string()), + sort_priority, + ..Default::default() + }, + ) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_duplicate_grpc_request(id: &str, w: WebviewWindow) -> Result { + duplicate_grpc_request(&w, id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_create_http_request( + workspace_id: &str, + name: &str, + sort_priority: f64, + folder_id: Option<&str>, + method: Option<&str>, + headers: Option>, + body_type: Option<&str>, + w: WebviewWindow, +) -> Result { + upsert_http_request( + &w, + HttpRequest { + workspace_id: workspace_id.to_string(), + name: name.to_string(), + folder_id: folder_id.map(|s| s.to_string()), + body_type: body_type.map(|s| s.to_string()), + method: method.map(|s| s.to_string()).unwrap_or("GET".to_string()), + headers: Json(headers.unwrap_or_default()), + sort_priority, + ..Default::default() + }, + ) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_duplicate_http_request(id: &str, w: WebviewWindow) -> Result { + duplicate_http_request(&w, id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_update_workspace(workspace: Workspace, w: WebviewWindow) -> Result { + upsert_workspace(&w, workspace) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_update_environment( + environment: Environment, + w: WebviewWindow, +) -> Result { + upsert_environment(&w, environment) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_update_grpc_request( + request: GrpcRequest, + w: WebviewWindow, +) -> Result { + upsert_grpc_request(&w, &request) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_update_http_request( + request: HttpRequest, + window: WebviewWindow, +) -> Result { + upsert_http_request(&window, request) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_delete_grpc_request( + w: WebviewWindow, + request_id: &str, +) -> Result { + delete_grpc_request(&w, request_id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_delete_http_request( + w: WebviewWindow, + request_id: &str, +) -> Result { + delete_http_request(&w, request_id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_list_folders(workspace_id: &str, w: WebviewWindow) -> Result, String> { + list_folders(&w, workspace_id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_create_folder( + workspace_id: &str, + name: &str, + sort_priority: f64, + folder_id: Option<&str>, + w: WebviewWindow, +) -> Result { + upsert_folder( + &w, + Folder { + workspace_id: workspace_id.to_string(), + name: name.to_string(), + folder_id: folder_id.map(|s| s.to_string()), + sort_priority, + ..Default::default() + }, + ) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_update_folder(folder: Folder, w: WebviewWindow) -> Result { + upsert_folder(&w, folder).await.map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_delete_folder(w: WebviewWindow, folder_id: &str) -> Result { + delete_folder(&w, folder_id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_delete_environment( + w: WebviewWindow, + environment_id: &str, +) -> Result { + delete_environment(&w, environment_id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_list_grpc_connections( + request_id: &str, + w: WebviewWindow, +) -> Result, String> { + list_grpc_connections(&w, request_id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_list_grpc_events( + connection_id: &str, + w: WebviewWindow, +) -> Result, String> { + list_grpc_events(&w, connection_id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_list_grpc_requests( + workspace_id: &str, + w: WebviewWindow, +) -> Result, String> { + let requests = list_grpc_requests(&w, workspace_id) + .await + .map_err(|e| e.to_string())?; + Ok(requests) +} + +#[tauri::command] +async fn cmd_list_http_requests( + workspace_id: &str, + w: WebviewWindow, +) -> Result, String> { + let requests = list_http_requests(&w, workspace_id) + .await + .expect("Failed to find requests"); + // .map_err(|e| e.to_string()) + Ok(requests) +} + +#[tauri::command] +async fn cmd_list_environments( + workspace_id: &str, + w: WebviewWindow, +) -> Result, String> { + let environments = list_environments(&w, workspace_id) + .await + .expect("Failed to find environments"); + + Ok(environments) +} + +#[tauri::command] +async fn cmd_get_settings(w: WebviewWindow) -> Result { + Ok(get_or_create_settings(&w).await) +} + +#[tauri::command] +async fn cmd_update_settings(settings: Settings, w: WebviewWindow) -> Result { + update_settings(&w, settings) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_get_folder(id: &str, w: WebviewWindow) -> Result { + get_folder(&w, id).await.map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_get_grpc_request(id: &str, w: WebviewWindow) -> Result { + get_grpc_request(&w, id).await.map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_get_http_request(id: &str, w: WebviewWindow) -> Result { + get_http_request(&w, id).await.map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_get_cookie_jar(id: &str, w: WebviewWindow) -> Result { + get_cookie_jar(&w, id).await.map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_list_cookie_jars( + workspace_id: &str, + w: WebviewWindow, +) -> Result, String> { + let cookie_jars = list_cookie_jars(&w, workspace_id) + .await + .expect("Failed to find cookie jars"); + + if cookie_jars.is_empty() { + let cookie_jar = upsert_cookie_jar( + &w, + &CookieJar { + name: "Default".to_string(), + workspace_id: workspace_id.to_string(), + ..Default::default() + }, + ) + .await + .expect("Failed to create CookieJar"); + Ok(vec![cookie_jar]) + } else { + Ok(cookie_jars) + } +} + +#[tauri::command] +async fn cmd_get_environment(id: &str, w: WebviewWindow) -> Result { + get_environment(&w, id).await.map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_get_workspace(id: &str, w: WebviewWindow) -> Result { + get_workspace(&w, id).await.map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_list_http_responses( + request_id: &str, + limit: Option, + w: WebviewWindow, +) -> Result, String> { + list_responses(&w, request_id, limit) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_delete_http_response(id: &str, w: WebviewWindow) -> Result { + delete_http_response(&w, id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_delete_grpc_connection(id: &str, w: WebviewWindow) -> Result { + delete_grpc_connection(&w, id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_delete_all_grpc_connections(request_id: &str, w: WebviewWindow) -> Result<(), String> { + delete_all_grpc_connections(&w, request_id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_delete_all_http_responses(request_id: &str, w: WebviewWindow) -> Result<(), String> { + delete_all_http_responses(&w, request_id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_list_workspaces(w: WebviewWindow) -> Result, String> { + let workspaces = list_workspaces(&w) + .await + .expect("Failed to find workspaces"); + if workspaces.is_empty() { + let workspace = upsert_workspace( + &w, + Workspace { + name: "Yaak".to_string(), + ..Default::default() + }, + ) + .await + .expect("Failed to create Workspace"); + Ok(vec![workspace]) + } else { + Ok(workspaces) + } +} + +#[tauri::command] +async fn cmd_new_window(window: WebviewWindow, url: &str) -> Result<(), String> { + create_window(&window.app_handle(), Some(url)); + Ok(()) +} + +#[tauri::command] +async fn cmd_delete_workspace(w: WebviewWindow, workspace_id: &str) -> Result { + delete_workspace(&w, workspace_id) + .await + .map_err(|e| e.to_string()) +} + +#[tauri::command] +async fn cmd_check_for_updates( + app_handle: AppHandle, + yaak_updater: State<'_, Mutex>, +) -> Result { + let update_mode = get_update_mode(&app_handle).await; + yaak_updater + .lock() + .await + .force_check(&app_handle, update_mode) + .await + .map_err(|e| e.to_string()) +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_window_state::Builder::default().build()) + .plugin(tauri_plugin_shell::init()) + .plugin(tauri_plugin_updater::Builder::new().build()) + .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_os::init()) + .plugin(tauri_plugin_fs::init()) + .plugin( + tauri_plugin_log::Builder::default() + .targets([ + Target::new(TargetKind::Stdout), + Target::new(TargetKind::LogDir { file_name: None }), + Target::new(TargetKind::Webview), + ]) + .level_for("cookie_store", log::LevelFilter::Info) + .level_for("h2", log::LevelFilter::Info) + .level_for("hyper", log::LevelFilter::Info) + .level_for("hyper_rustls", log::LevelFilter::Info) + .level_for("reqwest", log::LevelFilter::Info) + .level_for("sqlx", log::LevelFilter::Warn) + .level_for("tao", log::LevelFilter::Info) + .level_for("tokio_util", log::LevelFilter::Info) + .level_for("tonic", log::LevelFilter::Info) + .level_for("tower", log::LevelFilter::Info) + .level_for("tracing", log::LevelFilter::Info) + .with_colors(ColoredLevelConfig::default()) + .level(if is_dev() { + log::LevelFilter::Trace + } else { + log::LevelFilter::Info + }) + .build(), + ) + .setup(|app| { + let app_data_dir = app.path().app_data_dir().unwrap(); + let app_config_dir = app.path().app_config_dir().unwrap(); + info!( + "App Config Dir: {}", + app_config_dir.as_path().to_string_lossy(), + ); + info!("App Data Dir: {}", app_data_dir.as_path().to_string_lossy()); + let dir = match is_dev() { + true => current_dir().unwrap(), + false => app_data_dir, + }; + + create_dir_all(dir.clone()).expect("Problem creating App directory!"); + let p = dir.join("db.sqlite"); + File::options() + .write(true) + .create(true) + .open(&p) + .expect("Problem creating database file!"); + + let p_string = p.to_string_lossy().replace(' ', "%20"); + let url = format!("sqlite://{}?mode=rwc", p_string); + info!("Connecting to database at {}", url); + + // Add updater + let yaak_updater = YaakUpdater::new(); + app.manage(Mutex::new(yaak_updater)); + + // Add GRPC manager + let grpc_handle = GrpcHandle::new(&app.app_handle()); + app.manage(Mutex::new(grpc_handle)); + + // Add DB handle + tauri::async_runtime::block_on(async move { + let opts = SqliteConnectOptions::from_str(p.to_str().unwrap()).unwrap(); + let pool = SqlitePool::connect_with(opts) + .await + .expect("Failed to connect to database"); + let m = Mutex::new(pool.clone()); + migrate_db(app.handle(), &m) + .await + .expect("Failed to migrate database"); + app.manage(m); + let h = app.handle(); + let _ = cancel_pending_responses(h).await; + let _ = cancel_pending_grpc_connections(h).await; + }); + + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + cmd_check_for_updates, + cmd_create_cookie_jar, + cmd_create_environment, + cmd_create_folder, + cmd_create_grpc_request, + cmd_create_http_request, + cmd_create_workspace, + cmd_delete_all_grpc_connections, + cmd_delete_all_http_responses, + cmd_delete_cookie_jar, + cmd_delete_environment, + cmd_delete_folder, + cmd_delete_grpc_connection, + cmd_delete_grpc_request, + cmd_delete_http_request, + cmd_delete_http_response, + cmd_delete_workspace, + cmd_duplicate_grpc_request, + cmd_duplicate_http_request, + cmd_export_data, + cmd_filter_response, + cmd_get_cookie_jar, + cmd_get_environment, + cmd_get_folder, + cmd_get_grpc_request, + cmd_get_http_request, + cmd_get_key_value, + cmd_get_settings, + cmd_get_workspace, + cmd_grpc_go, + cmd_grpc_reflect, + cmd_import_data, + cmd_list_cookie_jars, + cmd_list_environments, + cmd_list_folders, + cmd_list_grpc_connections, + cmd_list_grpc_events, + cmd_list_grpc_requests, + cmd_list_http_requests, + cmd_list_http_responses, + cmd_list_workspaces, + cmd_metadata, + cmd_new_window, + cmd_send_ephemeral_request, + cmd_send_http_request, + cmd_set_key_value, + cmd_set_update_mode, + cmd_track_event, + cmd_update_cookie_jar, + cmd_update_environment, + cmd_update_folder, + cmd_update_grpc_request, + cmd_update_http_request, + cmd_update_settings, + cmd_update_workspace, + ]) + .build(tauri::generate_context!()) + .expect("error while running tauri application") + .run(|app_handle, event| { + match event { + RunEvent::Ready => { + let w = create_window(app_handle, None); + // if let Err(e) = w.restore_state(StateFlags::all()) { + // error!("Failed to restore window state {}", e); + // } + + let h = app_handle.clone(); + tauri::async_runtime::spawn(async move { + let info = analytics::track_launch_event(&h).await; + debug!("Launched Yaak {:?}", info); + + // Wait for window render and give a chance for the user to notice + if info.launched_after_update && info.num_launches > 1 { + sleep(std::time::Duration::from_secs(5)).await; + let _ = w.emit("show_changelog", true); + } + }); + } + RunEvent::WindowEvent { + label: _label, + event: WindowEvent::Focused(true), + .. + } => { + let h = app_handle.clone(); + // Run update check whenever window is focused + tauri::async_runtime::spawn(async move { + let val: State<'_, Mutex> = h.state(); + let update_mode = get_update_mode(&h).await; + _ = val.lock().await.check(&h, update_mode).await; + }); + } + _ => {} + }; + }); +} + +fn is_dev() -> bool { + #[cfg(dev)] + { + return true; + } + #[cfg(not(dev))] + { + return false; + } +} + +fn create_window(handle: &AppHandle, url: Option<&str>) -> WebviewWindow { + let menu = app_menu(handle).unwrap(); + handle.set_menu(menu).expect("Failed to set app menu"); + + let window_num = handle.webview_windows().len(); + let window_id = format!("wnd_{}", window_num); + let mut win_builder = tauri::WebviewWindowBuilder::new( + handle, + window_id, + WebviewUrl::App(url.unwrap_or_default().into()), + ) + .resizable(true) + .fullscreen(false) + .disable_drag_drop_handler() // Required for frontend Dnd on windows + .inner_size(1100.0, 600.0) + .position( + // Randomly offset so windows don't stack exactly + 100.0 + random::() * 30.0, + 100.0 + random::() * 30.0, + ) + .title(handle.package_info().name.to_string()); + + // Add macOS-only things + #[cfg(target_os = "macos")] + { + win_builder = win_builder + // .menu(app_menu) + .hidden_title(true) + .title_bar_style(TitleBarStyle::Overlay); + } + + // Add non-MacOS things + #[cfg(not(target_os = "macos"))] + { + // Doesn't seem to work from Rust, here, so we do it in JS + win_builder = win_builder.decorations(false); + } + + let win = win_builder.build().expect("failed to build window"); + + // Tauri doesn't support shadows when hiding decorations, so we add our own + // #[cfg(any(windows, target_os = "macos"))] + // set_shadow(&win, true).unwrap(); + + let win2 = win.clone(); + win.on_menu_event(move |w, event| { + if !w.is_focused().unwrap() { + return; + } + + match event.id().0.as_str() { + "quit" => exit(0), + "close" => w.close().unwrap(), + "zoom_reset" => w.emit("zoom", 0).unwrap(), + "zoom_in" => w.emit("zoom", 1).unwrap(), + "zoom_out" => w.emit("zoom", -1).unwrap(), + "settings" => w.emit("settings", true).unwrap(), + "duplicate_request" => w.emit("duplicate_request", true).unwrap(), + "refresh" => win2.eval("location.reload()").unwrap(), + "open_feedback" => { + _ = win2 + .app_handle() + .shell() + .open("https://yaak.canny.io", None) + } + "toggle_devtools" => { + if win2.is_devtools_open() { + win2.close_devtools(); + } else { + win2.open_devtools(); + } + } + _ => {} + } + }); + + let win3 = win.clone(); + win.on_window_event(move |e| { + let apply_offset = || { + win3.position_traffic_lights(); + }; + + match e { + WindowEvent::Resized(..) => apply_offset(), + WindowEvent::ThemeChanged(..) => apply_offset(), + WindowEvent::Focused(..) => apply_offset(), + WindowEvent::ScaleFactorChanged { .. } => apply_offset(), + WindowEvent::CloseRequested { .. } => { + // api.prevent_close(); + } + _ => {} + } + }); + + win.position_traffic_lights(); + win +} + +async fn get_update_mode(h: &AppHandle) -> UpdateMode { + let settings = get_or_create_settings(h).await; + update_mode_from_str(settings.update_channel.as_str()) +} + +fn safe_uri(endpoint: &str) -> Result { + let uri = if endpoint.starts_with("http://") || endpoint.starts_with("https://") { + Uri::from_str(endpoint)? + } else { + Uri::from_str(&format!("http://{}", endpoint))? + }; + Ok(uri) +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index b0b66d40..f657cdb2 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,1683 +1,5 @@ -#![cfg_attr( - all(not(debug_assertions), target_os = "windows"), - windows_subsystem = "windows" -)] - -extern crate core; -#[cfg(target_os = "macos")] -#[macro_use] -extern crate objc; - -use std::collections::HashMap; -use std::env::current_dir; -use std::fs::{create_dir_all, read_to_string, File}; -use std::path::PathBuf; -use std::process::exit; -use std::str::FromStr; - -use ::http::uri::InvalidUri; -use ::http::Uri; -use base64::Engine; -use fern::colors::ColoredLevelConfig; -use log::{debug, error, info, warn}; -use rand::random; -use serde_json::{json, Value}; -use sqlx::migrate::Migrator; -use sqlx::sqlite::{SqliteConnectOptions}; -use sqlx::types::Json; -use sqlx::{Pool, Sqlite, SqlitePool}; -#[cfg(target_os = "macos")] -use tauri::TitleBarStyle; -use tauri::{AppHandle, RunEvent, State, Window, WindowUrl}; -use tauri::{Manager, WindowEvent}; -use tauri_plugin_log::{fern, LogTarget}; -use tauri_plugin_window_state::{StateFlags, WindowExt}; -use tokio::sync::Mutex; -use tokio::time::sleep; -use window_shadows::set_shadow; - -use ::grpc::manager::{DynamicMessage, GrpcHandle}; -use ::grpc::{deserialize_message, serialize_message, Code, ServiceDefinition}; -use window_ext::TrafficLightWindowExt; - -use crate::analytics::{AnalyticsAction, AnalyticsResource}; -use crate::grpc::metadata_to_map; -use crate::http::send_http_request; -use crate::models::{ - cancel_pending_grpc_connections, cancel_pending_responses, create_http_response, - delete_all_grpc_connections, delete_all_http_responses, delete_cookie_jar, delete_environment, - delete_folder, delete_grpc_connection, delete_grpc_request, delete_http_request, - delete_http_response, delete_workspace, duplicate_grpc_request, duplicate_http_request, - get_cookie_jar, get_environment, get_folder, get_grpc_connection, get_grpc_request, - get_http_request, get_http_response, get_key_value_raw, get_or_create_settings, get_workspace, - get_workspace_export_resources, list_cookie_jars, list_environments, list_folders, - list_grpc_connections, list_grpc_events, list_grpc_requests, list_http_requests, - list_responses, list_workspaces, set_key_value_raw, update_response_if_id, update_settings, - upsert_cookie_jar, upsert_environment, upsert_folder, upsert_grpc_connection, - upsert_grpc_event, upsert_grpc_request, upsert_http_request, upsert_workspace, CookieJar, - Environment, EnvironmentVariable, Folder, GrpcConnection, GrpcEvent, GrpcEventType, - GrpcRequest, HttpRequest, HttpRequestHeader, HttpResponse, KeyValue, Settings, Workspace, - WorkspaceExportResources, -}; -use crate::plugin::ImportResult; -use crate::updates::{update_mode_from_str, UpdateMode, YaakUpdater}; - -mod analytics; -mod grpc; -mod http; -mod models; -mod plugin; -mod render; -mod updates; -mod window_ext; -mod window_menu; - -async fn migrate_db(app_handle: AppHandle, db: &Mutex>) -> Result<(), String> { - let pool = &*db.lock().await; - let p = app_handle - .path_resolver() - .resolve_resource("migrations") - .expect("failed to resolve resource"); - info!("Running migrations at {}", p.to_string_lossy()); - let mut m = Migrator::new(p).await.expect("Failed to load migrations"); - m.set_ignore_missing(true); // So we can rollback versions and not crash - m.run(pool).await.expect("Failed to run migrations"); - info!("Migrations complete!"); - Ok(()) -} - -#[derive(serde::Serialize)] -#[serde(default, rename_all = "camelCase")] -struct AppMetaData { - is_dev: bool, - version: String, - name: String, - app_data_dir: String, -} - -#[tauri::command] -async fn cmd_metadata(app_handle: AppHandle) -> Result { - let p = app_handle.path_resolver(); - return Ok(AppMetaData { - is_dev: is_dev(), - version: app_handle.package_info().version.to_string(), - name: app_handle.package_info().name.to_string(), - app_data_dir: p.app_data_dir().unwrap().to_string_lossy().to_string(), - }); -} - -#[tauri::command] -async fn cmd_grpc_reflect( - request_id: &str, - proto_files: Vec, - window: Window, - grpc_handle: State<'_, Mutex>, -) -> Result, String> { - let req = get_grpc_request(&window, request_id) - .await - .map_err(|e| e.to_string())?; - let uri = safe_uri(&req.url).map_err(|e| e.to_string())?; - if proto_files.len() > 0 { - grpc_handle - .lock() - .await - .services_from_files( - &req.id, - &uri, - proto_files - .iter() - .map(|p| PathBuf::from_str(p).unwrap()) - .collect(), - ) - .await - } else { - grpc_handle - .lock() - .await - .services_from_reflection(&req.id, &uri) - .await - } -} - -#[tauri::command] -async fn cmd_grpc_go( - request_id: &str, - environment_id: Option<&str>, - proto_files: Vec, - w: Window, - grpc_handle: State<'_, Mutex>, -) -> Result { - let req = get_grpc_request(&w, request_id) - .await - .map_err(|e| e.to_string())?; - let environment = match environment_id { - Some(id) => Some(get_environment(&w, id).await.map_err(|e| e.to_string())?), - None => None, - }; - let workspace = get_workspace(&w, &req.workspace_id) - .await - .map_err(|e| e.to_string())?; - let mut metadata = HashMap::new(); - - // Add rest of metadata - for h in req.clone().metadata.0 { - if h.name.is_empty() && h.value.is_empty() { - continue; - } - - if !h.enabled { - continue; - } - - let name = render::render(&h.name, &workspace, environment.as_ref()); - let value = render::render(&h.value, &workspace, environment.as_ref()); - - metadata.insert(name, value); - } - - if let Some(b) = &req.authentication_type { - let req = req.clone(); - let environment_ref = environment.as_ref(); - let empty_value = &serde_json::to_value("").unwrap(); - let a = req.authentication.0; - - if b == "basic" { - let raw_username = a - .get("username") - .unwrap_or(empty_value) - .as_str() - .unwrap_or(""); - let raw_password = a - .get("password") - .unwrap_or(empty_value) - .as_str() - .unwrap_or(""); - let username = render::render(raw_username, &workspace, environment_ref); - let password = render::render(raw_password, &workspace, environment_ref); - - let auth = format!("{username}:{password}"); - let encoded = base64::engine::general_purpose::STANDARD_NO_PAD.encode(auth); - metadata.insert("Authorization".to_string(), format!("Basic {}", encoded)); - } else if b == "bearer" { - let raw_token = a.get("token").unwrap_or(empty_value).as_str().unwrap_or(""); - let token = render::render(raw_token, &workspace, environment_ref); - metadata.insert("Authorization".to_string(), format!("Bearer {token}")); - } - } - - let conn = { - let req = req.clone(); - upsert_grpc_connection( - &w, - &GrpcConnection { - workspace_id: req.workspace_id, - request_id: req.id, - status: -1, - url: req.url.clone(), - ..Default::default() - }, - ) - .await - .map_err(|e| e.to_string())? - }; - let conn_id = conn.id.clone(); - - let base_msg = GrpcEvent { - workspace_id: req.clone().workspace_id, - request_id: req.clone().id, - connection_id: conn.clone().id, - ..Default::default() - }; - - let (in_msg_tx, in_msg_rx) = tauri::async_runtime::channel::(16); - let maybe_in_msg_tx = std::sync::Mutex::new(Some(in_msg_tx.clone())); - let (cancelled_tx, mut cancelled_rx) = tokio::sync::watch::channel(false); - - let uri = safe_uri(&req.url).map_err(|e| e.to_string())?; - - let in_msg_stream = tokio_stream::wrappers::ReceiverStream::new(in_msg_rx); - - let (service, method) = { - let req = req.clone(); - match (req.service, req.method) { - (Some(service), Some(method)) => (service, method), - _ => return Err("Service and method are required".to_string()), - } - }; - - let start = std::time::Instant::now(); - let connection = grpc_handle - .lock() - .await - .connect( - &req.clone().id, - uri, - proto_files - .iter() - .map(|p| PathBuf::from_str(p).unwrap()) - .collect(), - ) - .await?; - - let method_desc = connection - .method(&service, &method) - .expect("Service not found"); - - #[derive(serde::Deserialize)] - enum IncomingMsg { - Message(String), - Cancel, - Commit, - } - - let cb = { - let cancelled_rx = cancelled_rx.clone(); - let environment = environment.clone(); - let workspace = workspace.clone(); - let w = w.clone(); - let base_msg = base_msg.clone(); - let method_desc = method_desc.clone(); - - move |ev: tauri::Event| { - if *cancelled_rx.borrow() { - // Stream is cancelled - return; - } - - let mut maybe_in_msg_tx = maybe_in_msg_tx - .lock() - .expect("previous holder not to panic"); - let in_msg_tx = if let Some(in_msg_tx) = maybe_in_msg_tx.as_ref() { - in_msg_tx - } else { - // This would mean that the stream is already committed because - // we have already dropped the sending half - return; - }; - - match serde_json::from_str::(ev.payload().unwrap()) { - Ok(IncomingMsg::Message(raw_msg)) => { - let w = w.clone(); - let base_msg = base_msg.clone(); - let environment_ref = environment.as_ref(); - let method_desc = method_desc.clone(); - let msg = render::render(raw_msg.as_str(), &workspace, environment_ref); - let d_msg: DynamicMessage = match deserialize_message(msg.as_str(), method_desc) - { - Ok(d_msg) => d_msg, - Err(e) => { - tauri::async_runtime::spawn(async move { - upsert_grpc_event( - &w, - &GrpcEvent { - event_type: GrpcEventType::Error, - content: e.to_string(), - ..base_msg.clone() - }, - ) - .await - .unwrap(); - }); - return; - } - }; - in_msg_tx.try_send(d_msg).unwrap(); - tauri::async_runtime::spawn(async move { - upsert_grpc_event( - &w, - &GrpcEvent { - content: msg, - event_type: GrpcEventType::ClientMessage, - ..base_msg.clone() - }, - ) - .await - .unwrap(); - }); - } - Ok(IncomingMsg::Commit) => { - maybe_in_msg_tx.take(); - } - Ok(IncomingMsg::Cancel) => { - cancelled_tx.send_replace(true); - } - Err(e) => { - error!("Failed to parse gRPC message: {:?}", e); - } - } - } - }; - let event_handler = w.listen_global(format!("grpc_client_msg_{}", conn.id).as_str(), cb); - - let grpc_listen = { - let w = w.clone(); - let base_event = base_msg.clone(); - let req = req.clone(); - let workspace = workspace.clone(); - let environment = environment.clone(); - let raw_msg = if req.message.is_empty() { - "{}".to_string() - } else { - req.message - }; - let msg = render::render(&raw_msg, &workspace, environment.as_ref()); - - upsert_grpc_event( - &w, - &GrpcEvent { - content: format!("Connecting to {}", req.url), - event_type: GrpcEventType::ConnectionStart, - metadata: Json(metadata.clone()), - ..base_event.clone() - }, - ) - .await - .unwrap(); - - async move { - let (maybe_stream, maybe_msg) = match ( - method_desc.is_client_streaming(), - method_desc.is_server_streaming(), - ) { - (true, true) => ( - Some( - connection - .streaming(&service, &method, in_msg_stream, metadata) - .await, - ), - None, - ), - (true, false) => ( - None, - Some( - connection - .client_streaming(&service, &method, in_msg_stream, metadata) - .await, - ), - ), - (false, true) => ( - Some( - connection - .server_streaming(&service, &method, &msg, metadata) - .await, - ), - None, - ), - (false, false) => ( - None, - Some(connection.unary(&service, &method, &msg, metadata).await), - ), - }; - - if !method_desc.is_client_streaming() { - upsert_grpc_event( - &w, - &GrpcEvent { - event_type: GrpcEventType::ClientMessage, - content: msg, - ..base_event.clone() - }, - ) - .await - .unwrap(); - } - - match maybe_msg { - Some(Ok(msg)) => { - upsert_grpc_event( - &w, - &GrpcEvent { - metadata: Json(metadata_to_map(msg.metadata().clone())), - content: if msg.metadata().len() == 0 { - "Received response" - } else { - "Received response with metadata" - } - .to_string(), - event_type: GrpcEventType::Info, - ..base_event.clone() - }, - ) - .await - .unwrap(); - upsert_grpc_event( - &w, - &GrpcEvent { - content: serialize_message(&msg.into_inner()).unwrap(), - event_type: GrpcEventType::ServerMessage, - ..base_event.clone() - }, - ) - .await - .unwrap(); - upsert_grpc_event( - &w, - &GrpcEvent { - content: "Connection complete".to_string(), - event_type: GrpcEventType::ConnectionEnd, - status: Some(Code::Ok as i64), - ..base_event.clone() - }, - ) - .await - .unwrap(); - } - Some(Err(e)) => { - upsert_grpc_event( - &w, - &(match e.status { - Some(s) => GrpcEvent { - error: Some(s.message().to_string()), - status: Some(s.code() as i64), - content: "Failed to connect".to_string(), - metadata: Json(metadata_to_map(s.metadata().clone())), - event_type: GrpcEventType::ConnectionEnd, - ..base_event.clone() - }, - None => GrpcEvent { - error: Some(e.message), - status: Some(Code::Unknown as i64), - content: "Failed to connect".to_string(), - event_type: GrpcEventType::ConnectionEnd, - ..base_event.clone() - }, - }), - ) - .await - .unwrap(); - } - None => { - // Server streaming doesn't return initial message - } - } - - let mut stream = match maybe_stream { - Some(Ok(stream)) => { - upsert_grpc_event( - &w, - &GrpcEvent { - metadata: Json(metadata_to_map(stream.metadata().clone())), - content: if stream.metadata().len() == 0 { - "Received response" - } else { - "Received response with metadata" - } - .to_string(), - event_type: GrpcEventType::Info, - ..base_event.clone() - }, - ) - .await - .unwrap(); - stream.into_inner() - } - Some(Err(e)) => { - upsert_grpc_event( - &w, - &(match e.status { - Some(s) => GrpcEvent { - error: Some(s.message().to_string()), - status: Some(s.code() as i64), - content: "Failed to connect".to_string(), - metadata: Json(metadata_to_map(s.metadata().clone())), - event_type: GrpcEventType::ConnectionEnd, - ..base_event.clone() - }, - None => GrpcEvent { - error: Some(e.message), - status: Some(Code::Unknown as i64), - content: "Failed to connect".to_string(), - event_type: GrpcEventType::ConnectionEnd, - ..base_event.clone() - }, - }), - ) - .await - .unwrap(); - return; - } - None => return, - }; - - loop { - match stream.message().await { - Ok(Some(msg)) => { - let message = serialize_message(&msg).unwrap(); - upsert_grpc_event( - &w, - &GrpcEvent { - content: message, - event_type: GrpcEventType::ServerMessage, - ..base_event.clone() - }, - ) - .await - .unwrap(); - } - Ok(None) => { - let trailers = stream - .trailers() - .await - .unwrap_or_default() - .unwrap_or_default(); - upsert_grpc_event( - &w, - &GrpcEvent { - content: "Connection complete".to_string(), - status: Some(Code::Unavailable as i64), - metadata: Json(metadata_to_map(trailers)), - event_type: GrpcEventType::ConnectionEnd, - ..base_event.clone() - }, - ) - .await - .unwrap(); - break; - } - Err(status) => { - upsert_grpc_event( - &w, - &GrpcEvent { - content: status.to_string(), - status: Some(status.code() as i64), - metadata: Json(metadata_to_map(status.metadata().clone())), - event_type: GrpcEventType::ConnectionEnd, - ..base_event.clone() - }, - ) - .await - .unwrap(); - } - } - } - } - }; - - { - let conn_id = conn_id.clone(); - tauri::async_runtime::spawn(async move { - let w = w.clone(); - tokio::select! { - _ = grpc_listen => { - let events = list_grpc_events(&w, &conn_id) - .await - .unwrap(); - let closed_event = events - .iter() - .find(|e| GrpcEventType::ConnectionEnd == e.event_type); - let closed_status = closed_event.and_then(|e| e.status).unwrap_or(Code::Unavailable as i64); - upsert_grpc_connection( - &w, - &GrpcConnection{ - elapsed: start.elapsed().as_millis() as i64, - status: closed_status, - ..get_grpc_connection(&w, &conn_id).await.unwrap().clone() - }, - ).await.unwrap(); - }, - _ = cancelled_rx.changed() => { - upsert_grpc_event( - &w, - &GrpcEvent { - content: "Cancelled".to_string(), - event_type: GrpcEventType::ConnectionEnd, - status: Some(Code::Cancelled as i64), - ..base_msg.clone() - }, - ).await.unwrap(); - upsert_grpc_connection( - &w, - &GrpcConnection { - elapsed: start.elapsed().as_millis() as i64, - status: Code::Cancelled as i64, - ..get_grpc_connection(&w, &conn_id).await.unwrap().clone() - }, - ) - .await - .unwrap(); - }, - } - w.unlisten(event_handler); - }); - }; - - Ok(conn.id) -} - -#[tauri::command] -async fn cmd_send_ephemeral_request( - mut request: HttpRequest, - environment_id: Option<&str>, - cookie_jar_id: Option<&str>, - window: Window, -) -> Result { - let response = HttpResponse::new(); - request.id = "".to_string(); - let environment = match environment_id { - Some(id) => Some( - get_environment(&window, id) - .await - .expect("Failed to get environment"), - ), - None => None, - }; - let cookie_jar = match cookie_jar_id { - Some(id) => Some( - get_cookie_jar(&window, id) - .await - .expect("Failed to get cookie jar"), - ), - None => None, - }; - - let (cancel_tx, mut cancel_rx) = tokio::sync::watch::channel(false); - window.listen_global( - format!("cancel_http_response_{}", response.id), - move |_event| { - let _ = cancel_tx.send(true); - }, - ); - - send_http_request( - &window, - request, - &response, - environment, - cookie_jar, - None, - &mut cancel_rx, - ) - .await -} - -#[tauri::command] -async fn cmd_filter_response(w: Window, response_id: &str, filter: &str) -> Result { - let response = get_http_response(&w, response_id) - .await - .expect("Failed to get response"); - - if let None = response.body_path { - return Err("Response body not found".to_string()); - } - - let mut content_type = "".to_string(); - for header in response.headers.iter() { - if header.name.to_lowercase() == "content-type" { - content_type = header.value.to_string().to_lowercase(); - break; - } - } - - // TODO: Have plugins register their own content type (regex?) - let plugin_name = if content_type.contains("json") { - "filter-jsonpath" - } else { - "filter-xpath" - }; - - let body = read_to_string(response.body_path.unwrap()).unwrap(); - let filter_result = plugin::run_plugin_filter(&w.app_handle(), plugin_name, filter, &body) - .await - .expect("Failed to run filter"); - Ok(filter_result.filtered) -} - -#[tauri::command] -async fn cmd_import_data( - w: Window, - file_path: &str, - _workspace_id: &str, -) -> Result { - let mut result: Option = None; - let plugins = vec!["importer-yaak", "importer-insomnia", "importer-postman"]; - for plugin_name in plugins { - if let Some(r) = plugin::run_plugin_import(&w.app_handle(), plugin_name, file_path).await { - analytics::track_event( - &w.app_handle(), - AnalyticsResource::App, - AnalyticsAction::Import, - Some(json!({ "plugin": plugin_name })), - ) - .await; - result = Some(r); - break; - } - } - - match result { - None => Err("No import handlers found".to_string()), - Some(r) => { - let mut imported_resources = WorkspaceExportResources::default(); - - info!("Importing resources"); - for v in r.resources.workspaces { - let x = upsert_workspace(&w, v).await.map_err(|e| e.to_string())?; - imported_resources.workspaces.push(x.clone()); - info!("Imported workspace: {}", x.name); - } - - for v in r.resources.environments { - let x = upsert_environment(&w, v).await.map_err(|e| e.to_string())?; - imported_resources.environments.push(x.clone()); - info!("Imported environment: {}", x.name); - } - - for v in r.resources.folders { - let x = upsert_folder(&w, v).await.map_err(|e| e.to_string())?; - imported_resources.folders.push(x.clone()); - info!("Imported folder: {}", x.name); - } - - for v in r.resources.http_requests { - let x = upsert_http_request(&w, v) - .await - .map_err(|e| e.to_string())?; - imported_resources.http_requests.push(x.clone()); - info!("Imported request: {}", x.name); - } - - for v in r.resources.grpc_requests { - let x = upsert_grpc_request(&w, &v) - .await - .map_err(|e| e.to_string())?; - imported_resources.grpc_requests.push(x.clone()); - info!("Imported request: {}", x.name); - } - - Ok(imported_resources) - } - } -} - -#[tauri::command] -async fn cmd_export_data( - app_handle: AppHandle, - export_path: &str, - workspace_ids: Vec<&str>, -) -> Result<(), String> { - let export_data = get_workspace_export_resources(&app_handle, workspace_ids).await; - let f = File::options() - .create(true) - .truncate(true) - .write(true) - .open(export_path) - .expect("Unable to create file"); - serde_json::to_writer_pretty(&f, &export_data) - .map_err(|e| e.to_string()) - .expect("Failed to write"); - - f.sync_all().expect("Failed to sync"); - - analytics::track_event( - &app_handle, - AnalyticsResource::App, - AnalyticsAction::Export, - None, - ) - .await; - - Ok(()) -} - -#[tauri::command] -async fn cmd_send_http_request( - window: Window, - request_id: &str, - environment_id: Option<&str>, - cookie_jar_id: Option<&str>, - download_dir: Option<&str>, -) -> Result { - let request = get_http_request(&window, request_id) - .await - .expect("Failed to get request"); - - let environment = match environment_id { - Some(id) => match get_environment(&window, id).await { - Ok(env) => Some(env), - Err(e) => { - warn!("Failed to find environment by id {id} {}", e); - None - } - }, - None => None, - }; - - let cookie_jar = match cookie_jar_id { - Some(id) => Some( - get_cookie_jar(&window, id) - .await - .expect("Failed to get cookie jar"), - ), - None => None, - }; - - let response = create_http_response( - &window, - &request.id, - 0, - 0, - "", - 0, - None, - None, - None, - vec![], - None, - None, - ) - .await - .expect("Failed to create response"); - - let download_path = if let Some(p) = download_dir { - Some(std::path::Path::new(p).to_path_buf()) - } else { - None - }; - - let (cancel_tx, mut cancel_rx) = tokio::sync::watch::channel(false); - window.listen_global( - format!("cancel_http_response_{}", response.id), - move |_event| { - let _ = cancel_tx.send(true); - }, - ); - - send_http_request( - &window, - request.clone(), - &response, - environment, - cookie_jar, - download_path, - &mut cancel_rx, - ) - .await -} - -async fn response_err( - response: &HttpResponse, - error: String, - w: &Window, -) -> Result { - let mut response = response.clone(); - response.elapsed = -1; - response.error = Some(error.clone()); - response = update_response_if_id(w, &response) - .await - .expect("Failed to update response"); - Ok(response) -} - -#[tauri::command] -async fn cmd_track_event( - window: Window, - resource: &str, - action: &str, - attributes: Option, -) -> Result<(), String> { - match ( - AnalyticsResource::from_str(resource), - AnalyticsAction::from_str(action), - ) { - (Ok(resource), Ok(action)) => { - analytics::track_event(&window.app_handle(), resource, action, attributes).await; - } - (r, a) => { - error!( - "Invalid action/resource for track_event: {resource}.{action} = {:?}.{:?}", - r, a - ); - return Err("Invalid analytics event".to_string()); - } - }; - Ok(()) -} - -#[tauri::command] -async fn cmd_set_update_mode(update_mode: &str, w: Window) -> Result { - cmd_set_key_value("app", "update_mode", update_mode, w) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_get_key_value(namespace: &str, key: &str, w: Window) -> Result, ()> { - let result = get_key_value_raw(&w, namespace, key).await; - Ok(result) -} - -#[tauri::command] -async fn cmd_set_key_value( - namespace: &str, - key: &str, - value: &str, - w: Window, -) -> Result { - let (key_value, _created) = set_key_value_raw(&w, namespace, key, value).await; - Ok(key_value) -} - -#[tauri::command] -async fn cmd_create_workspace(name: &str, w: Window) -> Result { - upsert_workspace(&w, Workspace::new(name.to_string())) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_update_cookie_jar(cookie_jar: CookieJar, w: Window) -> Result { - upsert_cookie_jar(&w, &cookie_jar) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_delete_cookie_jar(w: Window, cookie_jar_id: &str) -> Result { - delete_cookie_jar(&w, cookie_jar_id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_create_cookie_jar( - workspace_id: &str, - name: &str, - w: Window, -) -> Result { - upsert_cookie_jar( - &w, - &CookieJar { - name: name.to_string(), - workspace_id: workspace_id.to_string(), - ..Default::default() - }, - ) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_create_environment( - workspace_id: &str, - name: &str, - variables: Vec, - w: Window, -) -> Result { - upsert_environment( - &w, - Environment { - workspace_id: workspace_id.to_string(), - name: name.to_string(), - variables: Json(variables), - ..Default::default() - }, - ) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_create_grpc_request( - workspace_id: &str, - name: &str, - sort_priority: f64, - folder_id: Option<&str>, - w: Window, -) -> Result { - upsert_grpc_request( - &w, - &GrpcRequest { - workspace_id: workspace_id.to_string(), - name: name.to_string(), - folder_id: folder_id.map(|s| s.to_string()), - sort_priority, - ..Default::default() - }, - ) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_duplicate_grpc_request(id: &str, w: Window) -> Result { - duplicate_grpc_request(&w, id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_create_http_request( - workspace_id: &str, - name: &str, - sort_priority: f64, - folder_id: Option<&str>, - method: Option<&str>, - headers: Option>, - body_type: Option<&str>, - w: Window, -) -> Result { - upsert_http_request( - &w, - HttpRequest { - workspace_id: workspace_id.to_string(), - name: name.to_string(), - folder_id: folder_id.map(|s| s.to_string()), - body_type: body_type.map(|s| s.to_string()), - method: method.map(|s| s.to_string()).unwrap_or("GET".to_string()), - headers: Json(headers.unwrap_or_default()), - sort_priority, - ..Default::default() - }, - ) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_duplicate_http_request(id: &str, w: Window) -> Result { - duplicate_http_request(&w, id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_update_workspace(workspace: Workspace, w: Window) -> Result { - upsert_workspace(&w, workspace) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_update_environment( - environment: Environment, - w: Window, -) -> Result { - upsert_environment(&w, environment) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_update_grpc_request(request: GrpcRequest, w: Window) -> Result { - upsert_grpc_request(&w, &request) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_update_http_request( - request: HttpRequest, - window: Window, -) -> Result { - upsert_http_request(&window, request) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_delete_grpc_request(w: Window, request_id: &str) -> Result { - delete_grpc_request(&w, request_id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_delete_http_request(w: Window, request_id: &str) -> Result { - delete_http_request(&w, request_id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_list_folders(workspace_id: &str, w: Window) -> Result, String> { - list_folders(&w, workspace_id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_create_folder( - workspace_id: &str, - name: &str, - sort_priority: f64, - folder_id: Option<&str>, - w: Window, -) -> Result { - upsert_folder( - &w, - Folder { - workspace_id: workspace_id.to_string(), - name: name.to_string(), - folder_id: folder_id.map(|s| s.to_string()), - sort_priority, - ..Default::default() - }, - ) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_update_folder(folder: Folder, w: Window) -> Result { - upsert_folder(&w, folder).await.map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_delete_folder(w: Window, folder_id: &str) -> Result { - delete_folder(&w, folder_id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_delete_environment(w: Window, environment_id: &str) -> Result { - delete_environment(&w, environment_id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_list_grpc_connections( - request_id: &str, - w: Window, -) -> Result, String> { - list_grpc_connections(&w, request_id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_list_grpc_events(connection_id: &str, w: Window) -> Result, String> { - list_grpc_events(&w, connection_id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_list_grpc_requests(workspace_id: &str, w: Window) -> Result, String> { - let requests = list_grpc_requests(&w, workspace_id) - .await - .map_err(|e| e.to_string())?; - Ok(requests) -} - -#[tauri::command] -async fn cmd_list_http_requests(workspace_id: &str, w: Window) -> Result, String> { - let requests = list_http_requests(&w, workspace_id) - .await - .expect("Failed to find requests"); - // .map_err(|e| e.to_string()) - Ok(requests) -} - -#[tauri::command] -async fn cmd_list_environments(workspace_id: &str, w: Window) -> Result, String> { - let environments = list_environments(&w, workspace_id) - .await - .expect("Failed to find environments"); - - Ok(environments) -} - -#[tauri::command] -async fn cmd_get_settings(w: Window) -> Result { - Ok(get_or_create_settings(&w).await) -} - -#[tauri::command] -async fn cmd_update_settings(settings: Settings, w: Window) -> Result { - update_settings(&w, settings) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_get_folder(id: &str, w: Window) -> Result { - get_folder(&w, id).await.map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_get_grpc_request(id: &str, w: Window) -> Result { - get_grpc_request(&w, id).await.map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_get_http_request(id: &str, w: Window) -> Result { - get_http_request(&w, id).await.map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_get_cookie_jar(id: &str, w: Window) -> Result { - get_cookie_jar(&w, id).await.map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_list_cookie_jars(workspace_id: &str, w: Window) -> Result, String> { - let cookie_jars = list_cookie_jars(&w, workspace_id) - .await - .expect("Failed to find cookie jars"); - - if cookie_jars.is_empty() { - let cookie_jar = upsert_cookie_jar( - &w, - &CookieJar { - name: "Default".to_string(), - workspace_id: workspace_id.to_string(), - ..Default::default() - }, - ) - .await - .expect("Failed to create CookieJar"); - Ok(vec![cookie_jar]) - } else { - Ok(cookie_jars) - } -} - -#[tauri::command] -async fn cmd_get_environment(id: &str, w: Window) -> Result { - get_environment(&w, id).await.map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_get_workspace(id: &str, w: Window) -> Result { - get_workspace(&w, id).await.map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_list_http_responses( - request_id: &str, - limit: Option, - w: Window, -) -> Result, String> { - list_responses(&w, request_id, limit) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_delete_http_response(id: &str, w: Window) -> Result { - delete_http_response(&w, id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_delete_grpc_connection(id: &str, w: Window) -> Result { - delete_grpc_connection(&w, id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_delete_all_grpc_connections(request_id: &str, w: Window) -> Result<(), String> { - delete_all_grpc_connections(&w, request_id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_delete_all_http_responses(request_id: &str, w: Window) -> Result<(), String> { - delete_all_http_responses(&w, request_id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_list_workspaces(w: Window) -> Result, String> { - let workspaces = list_workspaces(&w) - .await - .expect("Failed to find workspaces"); - if workspaces.is_empty() { - let workspace = upsert_workspace( - &w, - Workspace { - name: "Yaak".to_string(), - ..Default::default() - }, - ) - .await - .expect("Failed to create Workspace"); - Ok(vec![workspace]) - } else { - Ok(workspaces) - } -} - -#[tauri::command] -async fn cmd_new_window(window: Window, url: &str) -> Result<(), String> { - create_window(&window.app_handle(), Some(url)); - Ok(()) -} - -#[tauri::command] -async fn cmd_delete_workspace(w: Window, workspace_id: &str) -> Result { - delete_workspace(&w, workspace_id) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn cmd_check_for_updates( - app_handle: AppHandle, - yaak_updater: State<'_, Mutex>, -) -> Result { - let update_mode = get_update_mode(&app_handle).await; - yaak_updater - .lock() - .await - .force_check(&app_handle, update_mode) - .await - .map_err(|e| e.to_string()) -} +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] fn main() { - tauri::Builder::default() - .plugin(tauri_plugin_window_state::Builder::default().build()) - .plugin( - tauri_plugin_log::Builder::default() - .targets([LogTarget::LogDir, LogTarget::Stdout, LogTarget::Webview]) - .level_for("cookie_store", log::LevelFilter::Info) - .level_for("h2", log::LevelFilter::Info) - .level_for("hyper", log::LevelFilter::Info) - .level_for("hyper_rustls", log::LevelFilter::Info) - .level_for("reqwest", log::LevelFilter::Info) - .level_for("sqlx", log::LevelFilter::Warn) - .level_for("tao", log::LevelFilter::Info) - .level_for("tokio_util", log::LevelFilter::Info) - .level_for("tonic", log::LevelFilter::Info) - .level_for("tower", log::LevelFilter::Info) - .level_for("tracing", log::LevelFilter::Info) - .with_colors(ColoredLevelConfig::default()) - .level(if is_dev() { - log::LevelFilter::Trace - } else { - log::LevelFilter::Info - }) - .build(), - ) - .setup(|app| { - let app_data_dir = app.path_resolver().app_data_dir().unwrap(); - let app_config_dir = app.path_resolver().app_config_dir().unwrap(); - info!( - "App Config Dir: {}", - app_config_dir.as_path().to_string_lossy(), - ); - info!("App Data Dir: {}", app_data_dir.as_path().to_string_lossy()); - let dir = match is_dev() { - true => current_dir().unwrap(), - false => app_data_dir, - }; - - create_dir_all(dir.clone()).expect("Problem creating App directory!"); - let p = dir.join("db.sqlite"); - File::options() - .write(true) - .create(true) - .open(&p) - .expect("Problem creating database file!"); - - let p_string = p.to_string_lossy().replace(' ', "%20"); - let url = format!("sqlite://{}?mode=rwc", p_string); - info!("Connecting to database at {}", url); - - // Add updater - let yaak_updater = YaakUpdater::new(); - app.manage(Mutex::new(yaak_updater)); - - // Add GRPC manager - let grpc_handle = GrpcHandle::new(&app.app_handle()); - app.manage(Mutex::new(grpc_handle)); - - // Add DB handle - tauri::async_runtime::block_on(async move { - let opts = SqliteConnectOptions::from_str(p.to_str().unwrap()).unwrap(); - let pool = SqlitePool::connect_with(opts) - .await - .expect("Failed to connect to database"); - let m = Mutex::new(pool.clone()); - migrate_db(app.handle(), &m) - .await - .expect("Failed to migrate database"); - app.manage(m); - let h = app.handle(); - let _ = cancel_pending_responses(&h).await; - let _ = cancel_pending_grpc_connections(&h).await; - }); - - Ok(()) - }) - .invoke_handler(tauri::generate_handler![ - cmd_check_for_updates, - cmd_create_cookie_jar, - cmd_create_environment, - cmd_create_folder, - cmd_create_grpc_request, - cmd_create_http_request, - cmd_create_workspace, - cmd_delete_all_grpc_connections, - cmd_delete_all_http_responses, - cmd_delete_cookie_jar, - cmd_delete_environment, - cmd_delete_folder, - cmd_delete_grpc_connection, - cmd_delete_grpc_request, - cmd_delete_http_request, - cmd_delete_http_response, - cmd_delete_workspace, - cmd_duplicate_grpc_request, - cmd_duplicate_http_request, - cmd_export_data, - cmd_filter_response, - cmd_get_cookie_jar, - cmd_get_environment, - cmd_get_folder, - cmd_get_grpc_request, - cmd_get_http_request, - cmd_get_key_value, - cmd_get_settings, - cmd_get_workspace, - cmd_grpc_go, - cmd_grpc_reflect, - cmd_import_data, - cmd_list_cookie_jars, - cmd_list_environments, - cmd_list_folders, - cmd_list_grpc_connections, - cmd_list_grpc_events, - cmd_list_grpc_requests, - cmd_list_http_requests, - cmd_list_http_responses, - cmd_list_workspaces, - cmd_metadata, - cmd_new_window, - cmd_send_ephemeral_request, - cmd_send_http_request, - cmd_set_key_value, - cmd_set_update_mode, - cmd_track_event, - cmd_update_cookie_jar, - cmd_update_environment, - cmd_update_folder, - cmd_update_grpc_request, - cmd_update_http_request, - cmd_update_settings, - cmd_update_workspace, - ]) - .build(tauri::generate_context!()) - .expect("error while running tauri application") - .run(|app_handle, event| { - match event { - RunEvent::Updater(updater_event) => match updater_event { - tauri::UpdaterEvent::Pending => { - debug!("Updater pending"); - } - tauri::UpdaterEvent::Updated => { - debug!("Updater updated"); - } - tauri::UpdaterEvent::UpdateAvailable { - body, - version, - date: _, - } => { - debug!("Updater update available body={} version={}", body, version); - } - tauri::UpdaterEvent::Downloaded => { - debug!("Updater downloaded"); - } - tauri::UpdaterEvent::Error(e) => { - warn!("Updater received error: {:?}", e); - } - _ => {} - }, - RunEvent::Ready => { - let w = create_window(app_handle, None); - if let Err(e) = w.restore_state(StateFlags::all()) { - error!("Failed to restore window state {}", e); - } - - let h = app_handle.clone(); - tauri::async_runtime::spawn(async move { - let info = analytics::track_launch_event(&h).await; - debug!("Launched Yaak {:?}", info); - - // Wait for window render and give a chance for the user to notice - if info.launched_after_update && info.num_launches > 1 { - sleep(std::time::Duration::from_secs(5)).await; - let _ = w.emit("show_changelog", true); - } - }); - } - RunEvent::WindowEvent { - label: _label, - event: WindowEvent::Focused(true), - .. - } => { - let h = app_handle.clone(); - // Run update check whenever window is focused - tauri::async_runtime::spawn(async move { - let val: State<'_, Mutex> = h.state(); - let update_mode = get_update_mode(&h).await; - _ = val.lock().await.check(&h, update_mode).await; - }); - } - _ => {} - }; - }); -} - -fn is_dev() -> bool { - #[cfg(dev)] - { - return true; - } - #[cfg(not(dev))] - { - return false; - } -} - -fn create_window(handle: &AppHandle, url: Option<&str>) -> Window { - let app_menu = window_menu::os_default("Yaak".to_string().as_str()); - let window_num = handle.windows().len(); - let window_id = format!("wnd_{}", window_num); - let mut win_builder = tauri::WindowBuilder::new( - handle, - window_id, - WindowUrl::App(url.unwrap_or_default().into()), - ) - .fullscreen(false) - .resizable(true) - .disable_file_drop_handler() // Required for frontend Dnd on windows - .inner_size(1100.0, 600.0) - .position( - // Randomly offset so windows don't stack exactly - 100.0 + random::() * 30.0, - 100.0 + random::() * 30.0, - ) - .title(handle.package_info().name.to_string()); - - // Add macOS-only things - #[cfg(target_os = "macos")] - { - win_builder = win_builder - .menu(app_menu) - .hidden_title(true) - .title_bar_style(TitleBarStyle::Overlay); - } - - // Add non-MacOS things - #[cfg(not(target_os = "macos"))] - { - // Doesn't seem to work from Rust, here, so we do it in JS - win_builder = win_builder.decorations(false); - } - - let win = win_builder.build().expect("failed to build window"); - - // Tauri doesn't support shadows when hiding decorations, so we add our own - #[cfg(any(windows, target_os = "macos"))] - set_shadow(&win, true).unwrap(); - - let win2 = win.clone(); - let handle2 = handle.clone(); - win.on_menu_event(move |event| match event.menu_item_id() { - "quit" => exit(0), - "close" => win2.close().unwrap(), - "zoom_reset" => win2.emit("zoom", 0).unwrap(), - "zoom_in" => win2.emit("zoom", 1).unwrap(), - "zoom_out" => win2.emit("zoom", -1).unwrap(), - "toggle_sidebar" => win2.emit("toggle_sidebar", true).unwrap(), - "focus_url" => win2.emit("focus_url", true).unwrap(), - "focus_sidebar" => win2.emit("focus_sidebar", true).unwrap(), - "send_request" => win2.emit("send_request", true).unwrap(), - "new_request" => win2.emit("new_request", true).unwrap(), - "toggle_settings" => win2.emit("toggle_settings", true).unwrap(), - "duplicate_request" => win2.emit("duplicate_request", true).unwrap(), - "refresh" => win2.eval("location.reload()").unwrap(), - "new_window" => _ = create_window(&handle2, None), - "toggle_devtools" => { - if win2.is_devtools_open() { - win2.close_devtools(); - } else { - win2.open_devtools(); - } - } - _ => {} - }); - - let win3 = win.clone(); - win.on_window_event(move |e| { - let apply_offset = || { - win3.position_traffic_lights(); - }; - - match e { - WindowEvent::Resized(..) => apply_offset(), - WindowEvent::ThemeChanged(..) => apply_offset(), - WindowEvent::Focused(..) => apply_offset(), - WindowEvent::ScaleFactorChanged { .. } => apply_offset(), - WindowEvent::CloseRequested { .. } => { - // api.prevent_close(); - } - _ => {} - } - }); - - win.position_traffic_lights(); - win -} - -async fn get_update_mode(h: &AppHandle) -> UpdateMode { - let settings = get_or_create_settings(h).await; - update_mode_from_str(settings.update_channel.as_str()) -} - -fn safe_uri(endpoint: &str) -> Result { - let uri = if endpoint.starts_with("http://") || endpoint.starts_with("https://") { - Uri::from_str(endpoint)? - } else { - Uri::from_str(&format!("http://{}", endpoint))? - }; - Ok(uri) + tauri_app_lib::run(); } diff --git a/src-tauri/src/models.rs b/src-tauri/src/models.rs index 06288ab1..de82ca40 100644 --- a/src-tauri/src/models.rs +++ b/src-tauri/src/models.rs @@ -4,10 +4,10 @@ use std::fs; use log::error; use rand::distributions::{Alphanumeric, DistString}; use serde::{Deserialize, Serialize}; -use sqlx::types::chrono::NaiveDateTime; -use sqlx::types::{Json, JsonValue}; use sqlx::{Pool, Sqlite}; -use tauri::{AppHandle, Manager, Wry}; +use sqlx::types::{Json, JsonValue}; +use sqlx::types::chrono::NaiveDateTime; +use tauri::{AppHandle, Manager, WebviewWindow, Wry}; use tokio::sync::Mutex; fn default_true() -> bool { @@ -426,9 +426,9 @@ pub async fn get_workspace(mgr: &impl Manager, id: &str) -> Result, id: &str) -> Result { - let db = get_db(mgr).await; - let workspace = get_workspace(mgr, id).await?; +pub async fn delete_workspace(window: &WebviewWindow, id: &str) -> Result { + let db = get_db(window).await; + let workspace = get_workspace(window, id).await?; let _ = sqlx::query!( r#" DELETE FROM workspaces @@ -439,11 +439,11 @@ pub async fn delete_workspace(mgr: &impl Manager, id: &str) -> Result, id: &str) -> Result { @@ -482,11 +482,11 @@ pub async fn list_cookie_jars( } pub async fn delete_cookie_jar( - mgr: &impl Manager, + window: &WebviewWindow, id: &str, ) -> Result { - let cookie_jar = get_cookie_jar(mgr, id).await?; - let db = get_db(mgr).await; + let cookie_jar = get_cookie_jar(window, id).await?; + let db = get_db(window).await; let _ = sqlx::query!( r#" @@ -498,23 +498,23 @@ pub async fn delete_cookie_jar( .execute(&db) .await; - emit_deleted_model(mgr, cookie_jar) + emit_deleted_model(window, cookie_jar) } pub async fn duplicate_grpc_request( - mgr: &impl Manager, + window: &WebviewWindow, id: &str, ) -> Result { - let mut request = get_grpc_request(mgr, id).await?.clone(); + let mut request = get_grpc_request(window, id).await?.clone(); request.id = "".to_string(); - upsert_grpc_request(mgr, &request).await + upsert_grpc_request(window, &request).await } pub async fn upsert_grpc_request( - mgr: &impl Manager, + window: &WebviewWindow, request: &GrpcRequest, ) -> Result { - let db = get_db(mgr).await; + let db = get_db(window).await; let id = match request.id.as_str() { "" => generate_id(Some("gr")), _ => request.id.to_string(), @@ -556,8 +556,8 @@ pub async fn upsert_grpc_request( .execute(&db) .await?; - match get_grpc_request(mgr, &id).await { - Ok(m) => Ok(emit_upserted_model(mgr, m)), + match get_grpc_request(window, &id).await { + Ok(m) => Ok(emit_upserted_model(window, m)), Err(e) => Err(e), } } @@ -607,10 +607,10 @@ pub async fn list_grpc_requests( } pub async fn upsert_grpc_connection( - mgr: &impl Manager, + window: &WebviewWindow, connection: &GrpcConnection, ) -> Result { - let db = get_db(mgr).await; + let db = get_db(window).await; let id = match connection.id.as_str() { "" => generate_id(Some("gc")), _ => connection.id.to_string(), @@ -646,8 +646,8 @@ pub async fn upsert_grpc_connection( .execute(&db) .await?; - match get_grpc_connection(mgr, &id).await { - Ok(m) => Ok(emit_upserted_model(mgr, m)), + match get_grpc_connection(window, &id).await { + Ok(m) => Ok(emit_upserted_model(window, m)), Err(e) => Err(e), } } @@ -696,10 +696,10 @@ pub async fn list_grpc_connections( } pub async fn upsert_grpc_event( - mgr: &impl Manager, + window: &WebviewWindow, event: &GrpcEvent, ) -> Result { - let db = get_db(mgr).await; + let db = get_db(window).await; let id = match event.id.as_str() { "" => generate_id(Some("ge")), _ => event.id.to_string(), @@ -732,8 +732,8 @@ pub async fn upsert_grpc_event( .execute(&db) .await?; - match get_grpc_event(mgr, &id).await { - Ok(m) => Ok(emit_upserted_model(mgr, m)), + match get_grpc_event(window, &id).await { + Ok(m) => Ok(emit_upserted_model(window, m)), Err(e) => Err(e), } } @@ -778,7 +778,7 @@ pub async fn list_grpc_events( } pub async fn upsert_cookie_jar( - mgr: &impl Manager, + window: &WebviewWindow, cookie_jar: &CookieJar, ) -> Result { let id = match cookie_jar.id.as_str() { @@ -787,7 +787,7 @@ pub async fn upsert_cookie_jar( }; let trimmed_name = cookie_jar.name.trim(); - let db = get_db(mgr).await; + let db = get_db(window).await; sqlx::query!( r#" INSERT INTO cookie_jars ( @@ -807,8 +807,8 @@ pub async fn upsert_cookie_jar( .execute(&db) .await?; - match get_cookie_jar(mgr, &id).await { - Ok(m) => Ok(emit_upserted_model(mgr, m)), + match get_cookie_jar(window, &id).await { + Ok(m) => Ok(emit_upserted_model(window, m)), Err(e) => Err(e), } } @@ -833,11 +833,11 @@ pub async fn list_environments( } pub async fn delete_environment( - mgr: &impl Manager, + window: &WebviewWindow, id: &str, ) -> Result { - let db = get_db(mgr).await; - let env = get_environment(mgr, id).await?; + let db = get_db(window).await; + let env = get_environment(window, id).await?; let _ = sqlx::query!( r#" DELETE FROM environments @@ -848,7 +848,7 @@ pub async fn delete_environment( .execute(&db) .await; - emit_deleted_model(mgr, env) + emit_deleted_model(window, env) } async fn get_settings(mgr: &impl Manager) -> Result { @@ -886,10 +886,10 @@ pub async fn get_or_create_settings(mgr: &impl Manager) -> Settings { } pub async fn update_settings( - mgr: &impl Manager, + window: &WebviewWindow, settings: Settings, ) -> Result { - let db = get_db(mgr).await; + let db = get_db(window).await; sqlx::query!( r#" UPDATE settings SET ( @@ -903,14 +903,14 @@ pub async fn update_settings( .execute(&db) .await?; - match get_settings(mgr).await { - Ok(m) => Ok(emit_upserted_model(mgr, m)), + match get_settings(window).await { + Ok(m) => Ok(emit_upserted_model(window, m)), Err(e) => Err(e), } } pub async fn upsert_environment( - mgr: &impl Manager, + window: &WebviewWindow, environment: Environment, ) -> Result { let id = match environment.id.as_str() { @@ -918,7 +918,7 @@ pub async fn upsert_environment( _ => environment.id.to_string(), }; let trimmed_name = environment.name.trim(); - let db = get_db(mgr).await; + let db = get_db(window).await; sqlx::query!( r#" INSERT INTO environments ( @@ -938,8 +938,8 @@ pub async fn upsert_environment( .execute(&db) .await?; - match get_environment(mgr, &id).await { - Ok(m) => Ok(emit_upserted_model(mgr, m)), + match get_environment(window, &id).await { + Ok(m) => Ok(emit_upserted_model(window, m)), Err(e) => Err(e), } } @@ -999,9 +999,9 @@ pub async fn list_folders( .await } -pub async fn delete_folder(mgr: &impl Manager, id: &str) -> Result { - let folder = get_folder(mgr, id).await?; - let db = get_db(mgr).await; +pub async fn delete_folder(window: &WebviewWindow, id: &str) -> Result { + let folder = get_folder(window, id).await?; + let db = get_db(window).await; let _ = sqlx::query!( r#" DELETE FROM folders @@ -1012,17 +1012,17 @@ pub async fn delete_folder(mgr: &impl Manager, id: &str) -> Result, r: Folder) -> Result { +pub async fn upsert_folder(window: &WebviewWindow, r: Folder) -> Result { let id = match r.id.as_str() { "" => generate_id(Some("fl")), _ => r.id.to_string(), }; let trimmed_name = r.name.trim(); - let db = get_db(mgr).await; + let db = get_db(window).await; sqlx::query!( r#" INSERT INTO folders ( @@ -1044,23 +1044,23 @@ pub async fn upsert_folder(mgr: &impl Manager, r: Folder) -> Result Ok(emit_upserted_model(mgr, m)), + match get_folder(window, &id).await { + Ok(m) => Ok(emit_upserted_model(window, m)), Err(e) => Err(e), } } pub async fn duplicate_http_request( - mgr: &impl Manager, + window: &WebviewWindow, id: &str, ) -> Result { - let mut request = get_http_request(mgr, id).await?.clone(); + let mut request = get_http_request(window, id).await?.clone(); request.id = "".to_string(); - upsert_http_request(mgr, request).await + upsert_http_request(window, request).await } pub async fn upsert_http_request( - mgr: &impl Manager, + window: &WebviewWindow, r: HttpRequest, ) -> Result { let id = match r.id.as_str() { @@ -1069,7 +1069,7 @@ pub async fn upsert_http_request( }; let trimmed_name = r.name.trim(); - let db = get_db(mgr).await; + let db = get_db(window).await; sqlx::query!( r#" @@ -1109,8 +1109,8 @@ pub async fn upsert_http_request( .execute(&db) .await?; - match get_http_request(mgr, &id).await { - Ok(m) => Ok(emit_upserted_model(mgr, m)), + match get_http_request(window, &id).await { + Ok(m) => Ok(emit_upserted_model(window, m)), Err(e) => Err(e), } } @@ -1165,15 +1165,15 @@ pub async fn get_http_request( } pub async fn delete_http_request( - mgr: &impl Manager, + window: &WebviewWindow, id: &str, ) -> Result { - let req = get_http_request(mgr, id).await?; + let req = get_http_request(window, id).await?; // DB deletes will cascade but this will delete the files - delete_all_http_responses(mgr, id).await?; + delete_all_http_responses(window, id).await?; - let db = get_db(mgr).await; + let db = get_db(window).await; let _ = sqlx::query!( r#" DELETE FROM http_requests @@ -1184,12 +1184,12 @@ pub async fn delete_http_request( .execute(&db) .await; - emit_deleted_model(mgr, req) + emit_deleted_model(window, req) } #[allow(clippy::too_many_arguments)] pub async fn create_http_response( - mgr: &impl Manager, + window: &WebviewWindow, request_id: &str, elapsed: i64, elapsed_headers: i64, @@ -1202,10 +1202,10 @@ pub async fn create_http_response( version: Option<&str>, remote_addr: Option<&str>, ) -> Result { - let req = get_http_request(mgr, request_id).await?; + let req = get_http_request(window, request_id).await?; let id = generate_id(Some("rp")); let headers_json = Json(headers); - let db = get_db(mgr).await; + let db = get_db(window).await; sqlx::query!( r#" INSERT INTO http_responses ( @@ -1231,14 +1231,14 @@ pub async fn create_http_response( .execute(&db) .await?; - match get_http_response(mgr, &id).await { - Ok(m) => Ok(emit_upserted_model(mgr, m)), + match get_http_response(window, &id).await { + Ok(m) => Ok(emit_upserted_model(window, m)), Err(e) => Err(e), } } -pub async fn cancel_pending_grpc_connections(mgr: &impl Manager) -> Result<(), sqlx::Error> { - let db = get_db(mgr).await; +pub async fn cancel_pending_grpc_connections(app: &AppHandle) -> Result<(), sqlx::Error> { + let db = get_db(app).await; sqlx::query!( r#" UPDATE grpc_connections @@ -1251,8 +1251,8 @@ pub async fn cancel_pending_grpc_connections(mgr: &impl Manager) -> Result< Ok(()) } -pub async fn cancel_pending_responses(mgr: &impl Manager) -> Result<(), sqlx::Error> { - let db = get_db(mgr).await; +pub async fn cancel_pending_responses(app: &AppHandle) -> Result<(), sqlx::Error> { + let db = get_db(app).await; sqlx::query!( r#" UPDATE http_responses @@ -1266,18 +1266,18 @@ pub async fn cancel_pending_responses(mgr: &impl Manager) -> Result<(), sql } pub async fn update_response_if_id( - mgr: &impl Manager, + window: &WebviewWindow, response: &HttpResponse, ) -> Result { if response.id.is_empty() { Ok(response.clone()) } else { - update_response(mgr, response).await + update_response(window, response).await } } pub async fn upsert_workspace( - mgr: &impl Manager, + window: &WebviewWindow, workspace: Workspace, ) -> Result { let id = match workspace.id.as_str() { @@ -1286,7 +1286,7 @@ pub async fn upsert_workspace( }; let trimmed_name = workspace.name.trim(); - let db = get_db(mgr).await; + let db = get_db(window).await; sqlx::query!( r#" INSERT INTO workspaces ( @@ -1314,17 +1314,17 @@ pub async fn upsert_workspace( .execute(&db) .await?; - match get_workspace(mgr, &id).await { - Ok(m) => Ok(emit_upserted_model(mgr, m)), + match get_workspace(window, &id).await { + Ok(m) => Ok(emit_upserted_model(window, m)), Err(e) => Err(e), } } pub async fn update_response( - mgr: &impl Manager, + window: &WebviewWindow, response: &HttpResponse, ) -> Result { - let db = get_db(mgr).await; + let db = get_db(window).await; sqlx::query!( r#" UPDATE http_responses SET ( @@ -1348,8 +1348,8 @@ pub async fn update_response( .execute(&db) .await?; - match get_http_response(mgr, &response.id).await { - Ok(m) => Ok(emit_upserted_model(mgr, m)), + match get_http_response(window, &response.id).await { + Ok(m) => Ok(emit_upserted_model(window, m)), Err(e) => Err(e), } } @@ -1427,12 +1427,12 @@ pub async fn list_responses_by_workspace_id( } pub async fn delete_grpc_request( - mgr: &impl Manager, + window: &WebviewWindow, id: &str, ) -> Result { - let req = get_grpc_request(mgr, id).await?; + let req = get_grpc_request(window, id).await?; - let db = get_db(mgr).await; + let db = get_db(window).await; let _ = sqlx::query!( r#" DELETE FROM grpc_requests @@ -1443,16 +1443,16 @@ pub async fn delete_grpc_request( .execute(&db) .await; - emit_deleted_model(mgr, req) + emit_deleted_model(window, req) } pub async fn delete_grpc_connection( - mgr: &impl Manager, + window: &WebviewWindow, id: &str, ) -> Result { - let resp = get_grpc_connection(mgr, id).await?; + let resp = get_grpc_connection(window, id).await?; - let db = get_db(mgr).await; + let db = get_db(window).await; let _ = sqlx::query!( r#" DELETE FROM grpc_connections @@ -1463,14 +1463,14 @@ pub async fn delete_grpc_connection( .execute(&db) .await; - emit_deleted_model(mgr, resp) + emit_deleted_model(window, resp) } pub async fn delete_http_response( - mgr: &impl Manager, + window: &WebviewWindow, id: &str, ) -> Result { - let resp = get_http_response(mgr, id).await?; + let resp = get_http_response(window, id).await?; // Delete the body file if it exists if let Some(p) = resp.body_path.clone() { @@ -1479,7 +1479,7 @@ pub async fn delete_http_response( }; } - let db = get_db(mgr).await; + let db = get_db(window).await; let _ = sqlx::query!( r#" DELETE FROM http_responses @@ -1490,25 +1490,25 @@ pub async fn delete_http_response( .execute(&db) .await; - emit_deleted_model(mgr, resp) + emit_deleted_model(window, resp) } pub async fn delete_all_grpc_connections( - mgr: &impl Manager, + window: &WebviewWindow, request_id: &str, ) -> Result<(), sqlx::Error> { - for r in list_grpc_connections(mgr, request_id).await? { - delete_grpc_connection(mgr, &r.id).await?; + for r in list_grpc_connections(window, request_id).await? { + delete_grpc_connection(window, &r.id).await?; } Ok(()) } pub async fn delete_all_http_responses( - mgr: &impl Manager, + window: &WebviewWindow, request_id: &str, ) -> Result<(), sqlx::Error> { - for r in list_responses(mgr, request_id, None).await? { - delete_http_response(mgr, &r.id).await?; + for r in list_responses(window, request_id, None).await? { + delete_http_response(window, &r.id).await?; } Ok(()) } @@ -1541,9 +1541,10 @@ pub struct WorkspaceExportResources { } pub async fn get_workspace_export_resources( - app_handle: &AppHandle, + window: &WebviewWindow, workspace_ids: Vec<&str>, ) -> WorkspaceExport { + let app_handle = window.app_handle(); let mut data = WorkspaceExport { yaak_version: app_handle.package_info().version.clone().to_string(), yaak_schema: 2, @@ -1559,42 +1560,58 @@ pub async fn get_workspace_export_resources( for workspace_id in workspace_ids { data.resources.workspaces.push( - get_workspace(app_handle, workspace_id) + get_workspace(window, workspace_id) .await .expect("Failed to get workspace"), ); data.resources.environments.append( - &mut list_environments(app_handle, workspace_id) + &mut list_environments(window, workspace_id) .await .expect("Failed to get environments"), ); data.resources.folders.append( - &mut list_folders(app_handle, workspace_id) + &mut list_folders(window, workspace_id) .await .expect("Failed to get folders"), ); data.resources.http_requests.append( - &mut list_http_requests(app_handle, workspace_id) + &mut list_http_requests(window, workspace_id) .await .expect("Failed to get http requests"), ); data.resources.grpc_requests.append( - &mut list_grpc_requests(app_handle, workspace_id) + &mut list_grpc_requests(window, workspace_id) .await .expect("Failed to get grpc requests"), ); } - + return data; } -fn emit_upserted_model(mgr: &impl Manager, model: S) -> S { - mgr.emit_all("upserted_model", model.clone()).unwrap(); +#[derive(Clone, Serialize)] +#[serde(default, rename_all = "camelCase")] +struct ModelPayload { + pub model: M, + pub window_label: String, +} + +fn emit_upserted_model(window: &WebviewWindow, model: M) -> M { + let payload = ModelPayload{ + model: model.clone(), + window_label: window.label().to_string(), + }; + + window.emit("upserted_model", payload).unwrap(); model } -fn emit_deleted_model(mgr: &impl Manager, model: S) -> Result { - mgr.emit_all("deleted_model", model.clone()).unwrap(); +fn emit_deleted_model(window: &WebviewWindow, model: M) -> Result { + let payload = ModelPayload{ + model: model.clone(), + window_label: window.label().to_string(), + }; + window.emit("deleted_model", payload).unwrap(); Ok(model) } diff --git a/src-tauri/src/plugin.rs b/src-tauri/src/plugin.rs index 59d651c7..7775444c 100644 --- a/src-tauri/src/plugin.rs +++ b/src-tauri/src/plugin.rs @@ -10,7 +10,8 @@ use boa_runtime::Console; use log::{debug, error}; use serde::{Deserialize, Serialize}; use serde_json::json; -use tauri::AppHandle; +use tauri::{AppHandle, Manager}; +use tauri::path::BaseDirectory; use crate::models::{WorkspaceExportResources}; @@ -51,7 +52,7 @@ pub async fn run_plugin_import( app_handle: &AppHandle, plugin_name: &str, file_path: &str, -) -> Option { +) -> Result, String> { let file = fs::read_to_string(file_path) .unwrap_or_else(|_| panic!("Unable to read file {}", file_path)); let file_contents = file.as_str(); @@ -63,12 +64,12 @@ pub async fn run_plugin_import( ); if result_json.is_null() { - return None; + return Ok(None); } let resources: ImportResult = - serde_json::from_value(result_json).expect("failed to parse result json"); - Some(resources) + serde_json::from_value(result_json).map_err(|e| e.to_string())?; + Ok(Some(resources)) } fn run_plugin( @@ -78,8 +79,8 @@ fn run_plugin( js_args: &[JsValue], ) -> serde_json::Value { let plugin_dir = app_handle - .path_resolver() - .resolve_resource("plugins") + .path() + .resolve("plugins", BaseDirectory::Resource) .expect("failed to resolve plugin directory resource") .join(plugin_name); let plugin_index_file = plugin_dir.join("index.mjs"); diff --git a/src-tauri/src/render.rs b/src-tauri/src/render.rs index 0562b1ae..744005e3 100644 --- a/src-tauri/src/render.rs +++ b/src-tauri/src/render.rs @@ -1,6 +1,7 @@ use crate::models::{Environment, Workspace}; use std::collections::HashMap; -use tauri::regex::Regex; +use regex::Regex; + pub fn render(template: &str, workspace: &Workspace, environment: Option<&Environment>) -> String { let mut map = HashMap::new(); @@ -24,7 +25,7 @@ pub fn render(template: &str, workspace: &Workspace, environment: Option<&Enviro Regex::new(r"\$\{\[\s*([^]\s]+)\s*]}") .expect("Failed to create regex") - .replace_all(template, |caps: &tauri::regex::Captures| { + .replace_all(template, |caps: ®ex::Captures| { let key = caps.get(1).unwrap().as_str(); map.get(key).unwrap_or(&"") }) diff --git a/src-tauri/src/updates.rs b/src-tauri/src/updates.rs index 074d973b..01ddb92a 100644 --- a/src-tauri/src/updates.rs +++ b/src-tauri/src/updates.rs @@ -1,8 +1,9 @@ use std::time::SystemTime; use log::info; -use tauri::api::dialog; -use tauri::{updater, AppHandle, Window}; +use tauri::{AppHandle}; +use tauri_plugin_dialog::DialogExt; +use tauri_plugin_updater::UpdaterExt; use crate::is_dev; @@ -29,7 +30,7 @@ impl YaakUpdater { &mut self, app_handle: &AppHandle, mode: UpdateMode, - ) -> Result { + ) -> Result { self.last_update_check = SystemTime::now(); let update_mode = get_update_mode_str(mode); @@ -44,49 +45,48 @@ impl YaakUpdater { } match app_handle - .updater() + .updater_builder() .header("X-Update-Mode", update_mode)? + .build()? .check() .await { - Ok(update) => { + Ok(Some(update)) => { let h = app_handle.clone(); - dialog::ask( - None::<&Window>, - "Update Available", - format!( + app_handle + .dialog() + .message(format!( "{} is available. Would you like to download and install it now?", - update.latest_version() - ), - |confirmed| { + update.version + )) + .title("Update Available") + .show(|confirmed| { if !confirmed { return; } tauri::async_runtime::spawn(async move { - match update.download_and_install().await { + match update.download_and_install(|_, _| {}, || {}).await { Ok(_) => { - if dialog::blocking::ask( - None::<&Window>, - "Update Installed", - "Would you like to restart the app?", - ) { + if h + .dialog() + .message("Would you like to restart the app?") + .title("Update Installed") + .blocking_show() + { h.restart(); } } Err(e) => { - dialog::message( - None::<&Window>, - "Update Failed", - format!("The update failed to install: {}", e), - ); + h + .dialog() + .message(format!("The update failed to install: {}", e)); } } }); - }, - ); + }); Ok(true) } - Err(updater::Error::UpToDate) => Ok(false), + Ok(None) => Ok(false), Err(e) => Err(e), } } @@ -94,7 +94,7 @@ impl YaakUpdater { &mut self, app_handle: &AppHandle, mode: UpdateMode, - ) -> Result { + ) -> Result { let ignore_check = self.last_update_check.elapsed().unwrap().as_secs() < MAX_UPDATE_CHECK_SECONDS; if ignore_check { diff --git a/src-tauri/src/window_ext.rs b/src-tauri/src/window_ext.rs index 85040ba7..a1cb614d 100644 --- a/src-tauri/src/window_ext.rs +++ b/src-tauri/src/window_ext.rs @@ -1,4 +1,4 @@ -use tauri::{Runtime, Window}; +use tauri::{WebviewWindow}; const TRAFFIC_LIGHT_OFFSET_X: f64 = 13.0; const TRAFFIC_LIGHT_OFFSET_Y: f64 = 18.0; @@ -7,7 +7,7 @@ pub trait TrafficLightWindowExt { fn position_traffic_lights(&self); } -impl TrafficLightWindowExt for Window { +impl TrafficLightWindowExt for WebviewWindow { #[cfg(not(target_os = "macos"))] fn position_traffic_lights(&self) { // No-op on other platforms diff --git a/src-tauri/src/window_menu.rs b/src-tauri/src/window_menu.rs index 52054eea..0062c7a6 100644 --- a/src-tauri/src/window_menu.rs +++ b/src-tauri/src/window_menu.rs @@ -1,140 +1,142 @@ -use tauri::{AboutMetadata, CustomMenuItem, Menu, MenuItem, Submenu}; -use crate::is_dev; +use tauri::menu::{ + AboutMetadata, Menu, MenuItemBuilder, PredefinedMenuItem, Submenu, HELP_SUBMENU_ID, + WINDOW_SUBMENU_ID, +}; +pub use tauri::AppHandle; +use tauri::Wry; -pub fn os_default(#[allow(unused)] app_name: &str) -> Menu { - let mut menu = Menu::new(); - #[cfg(target_os = "macos")] - { - menu = menu.add_submenu(Submenu::new( - app_name, - Menu::new() - .add_native_item(MenuItem::About( - app_name.to_string(), - AboutMetadata::default(), - )) - .add_native_item(MenuItem::Separator) - .add_item( - CustomMenuItem::new("toggle_settings".to_string(), "Settings") - .accelerator("CmdOrCtrl+,"), - ) - .add_native_item(MenuItem::Separator) - .add_native_item(MenuItem::Services) - .add_native_item(MenuItem::Separator) - .add_native_item(MenuItem::Hide) - .add_native_item(MenuItem::HideOthers) - .add_native_item(MenuItem::ShowAll) - .add_native_item(MenuItem::Separator) - .add_native_item(MenuItem::Quit), - )); - } +pub fn app_menu(app_handle: &AppHandle) -> tauri::Result> { + let pkg_info = app_handle.package_info(); + let config = app_handle.config(); + let about_metadata = AboutMetadata { + name: Some(pkg_info.name.clone()), + version: Some(pkg_info.version.to_string()), + copyright: config.bundle.copyright.clone(), + authors: config.bundle.publisher.clone().map(|p| vec![p]), + ..Default::default() + }; - let mut file_menu = Menu::new(); - file_menu = file_menu.add_native_item(MenuItem::CloseWindow); - #[cfg(not(target_os = "macos"))] - { - file_menu = file_menu.add_native_item(MenuItem::Quit); - } - menu = menu.add_submenu(Submenu::new("File", file_menu)); + let window_menu = Submenu::with_id_and_items( + app_handle, + WINDOW_SUBMENU_ID, + "Window", + true, + &[ + &PredefinedMenuItem::minimize(app_handle, None)?, + &PredefinedMenuItem::maximize(app_handle, None)?, + #[cfg(target_os = "macos")] + &PredefinedMenuItem::separator(app_handle)?, + &PredefinedMenuItem::close_window(app_handle, None)?, + ], + )?; - #[cfg(not(target_os = "linux"))] - let mut edit_menu = Menu::new(); - #[cfg(target_os = "macos")] - { - edit_menu = edit_menu.add_native_item(MenuItem::Undo); - edit_menu = edit_menu.add_native_item(MenuItem::Redo); - edit_menu = edit_menu.add_native_item(MenuItem::Separator); - } - #[cfg(not(target_os = "linux"))] - { - edit_menu = edit_menu.add_native_item(MenuItem::Cut); - edit_menu = edit_menu.add_native_item(MenuItem::Copy); - edit_menu = edit_menu.add_native_item(MenuItem::Paste); - } - #[cfg(target_os = "macos")] - { - edit_menu = edit_menu.add_native_item(MenuItem::SelectAll); - } - #[cfg(not(target_os = "linux"))] - { - menu = menu.add_submenu(Submenu::new("Edit", edit_menu)); - } - let mut view_menu = Menu::new(); - #[cfg(target_os = "macos")] - { - view_menu = view_menu - .add_native_item(MenuItem::EnterFullScreen) - .add_native_item(MenuItem::Separator); - } - view_menu = view_menu - .add_item( - CustomMenuItem::new("zoom_reset".to_string(), "Zoom to Actual Size") - .accelerator("CmdOrCtrl+0"), - ) - .add_item( - CustomMenuItem::new("zoom_in".to_string(), "Zoom In").accelerator("CmdOrCtrl+Plus"), - ) - .add_item( - CustomMenuItem::new("zoom_out".to_string(), "Zoom Out").accelerator("CmdOrCtrl+-"), - ); - // .add_native_item(MenuItem::Separator) - // .add_item( - // CustomMenuItem::new("toggle_sidebar".to_string(), "Toggle Sidebar") - // .accelerator("CmdOrCtrl+b"), - // ) - // .add_item( - // CustomMenuItem::new("focus_sidebar".to_string(), "Focus Sidebar") - // .accelerator("CmdOrCtrl+1"), - // ) - // .add_item( - // CustomMenuItem::new("toggle_settings".to_string(), "Toggle Settings") - // .accelerator("CmdOrCtrl+,"), - // ) - // .add_item( - // CustomMenuItem::new("focus_url".to_string(), "Focus URL").accelerator("CmdOrCtrl+l"), - // ); - menu = menu.add_submenu(Submenu::new("View", view_menu)); + let help_menu = Submenu::with_id_and_items( + app_handle, + HELP_SUBMENU_ID, + "Help", + true, + &[ + #[cfg(not(target_os = "macos"))] + &PredefinedMenuItem::about(app_handle, None, Some(about_metadata))?, + #[cfg(target_os = "macos")] + &MenuItemBuilder::with_id("open_feedback".to_string(), "Give Feedback") + .build(app_handle)?, + ], + )?; - let mut window_menu = Menu::new(); - window_menu = window_menu.add_native_item(MenuItem::Minimize); - #[cfg(target_os = "macos")] - { - window_menu = window_menu.add_native_item(MenuItem::Zoom); - window_menu = window_menu.add_native_item(MenuItem::Separator); - } - window_menu = window_menu.add_native_item(MenuItem::CloseWindow); - menu = menu.add_submenu(Submenu::new("Window", window_menu)); + let menu = Menu::with_items( + app_handle, + &[ + #[cfg(target_os = "macos")] + &Submenu::with_items( + app_handle, + pkg_info.name.clone(), + true, + &[ + &PredefinedMenuItem::about(app_handle, None, Some(about_metadata))?, + &PredefinedMenuItem::separator(app_handle)?, + &MenuItemBuilder::with_id("settings".to_string(), "Settings") + .accelerator("CmdOrCtrl+,") + .build(app_handle)?, + &PredefinedMenuItem::separator(app_handle)?, + &PredefinedMenuItem::services(app_handle, None)?, + &PredefinedMenuItem::separator(app_handle)?, + &PredefinedMenuItem::hide(app_handle, None)?, + &PredefinedMenuItem::hide_others(app_handle, None)?, + &PredefinedMenuItem::separator(app_handle)?, + &PredefinedMenuItem::quit(app_handle, None)?, + ], + )?, + #[cfg(not(any( + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" + )))] + &Submenu::with_items( + app_handle, + "File", + true, + &[ + &PredefinedMenuItem::close_window(app_handle, None)?, + #[cfg(not(target_os = "macos"))] + &PredefinedMenuItem::quit(app_handle, None)?, + ], + )?, + &Submenu::with_items( + app_handle, + "Edit", + true, + &[ + &PredefinedMenuItem::undo(app_handle, None)?, + &PredefinedMenuItem::redo(app_handle, None)?, + &PredefinedMenuItem::separator(app_handle)?, + &PredefinedMenuItem::cut(app_handle, None)?, + &PredefinedMenuItem::copy(app_handle, None)?, + &PredefinedMenuItem::paste(app_handle, None)?, + &PredefinedMenuItem::select_all(app_handle, None)?, + ], + )?, + &Submenu::with_items( + app_handle, + "View", + true, + &[ + #[cfg(target_os = "macos")] + &PredefinedMenuItem::fullscreen(app_handle, None)?, + #[cfg(target_os = "macos")] + &PredefinedMenuItem::separator(app_handle)?, + + &MenuItemBuilder::with_id("zoom_reset".to_string(), "Zoom to Actual Size") + .accelerator("CmdOrCtrl+0") + .build(app_handle)?, + &MenuItemBuilder::with_id("zoom_in".to_string(), "Zoom In") + .accelerator("CmdOrCtrl+=") + .build(app_handle)?, + &MenuItemBuilder::with_id("zoom_out".to_string(), "Zoom Out") + .accelerator("CmdOrCtrl+-") + .build(app_handle)?, + ], + )?, + &window_menu, + &help_menu, + #[cfg(dev)] + &Submenu::with_items( + app_handle, + "Develop", + true, + &[ + &MenuItemBuilder::with_id("refresh".to_string(), "Refresh") + .accelerator("CmdOrCtrl+Shift+r") + .build(app_handle)?, + &MenuItemBuilder::with_id("toggle_devtools".to_string(), "Open Devtools") + .accelerator("CmdOrCtrl+Option+i") + .build(app_handle)?, + ], + )?, + ], + )?; - // menu = menu.add_submenu(Submenu::new( - // "Workspace", - // Menu::new() - // .add_item( - // CustomMenuItem::new("send_request".to_string(), "Send Request") - // .accelerator("CmdOrCtrl+r"), - // ) - // .add_item( - // CustomMenuItem::new("new_request".to_string(), "New Request") - // .accelerator("CmdOrCtrl+n"), - // ) - // .add_item( - // CustomMenuItem::new("duplicate_request".to_string(), "Duplicate Request") - // .accelerator("CmdOrCtrl+d"), - // ), - // )); - - if is_dev() { - menu = menu.add_submenu(Submenu::new( - "Developer", - Menu::new() - .add_item( - CustomMenuItem::new("refresh".to_string(), "Refresh") - .accelerator("CmdOrCtrl + Shift + r"), - ) - .add_item( - CustomMenuItem::new("toggle_devtools".to_string(), "Open Devtools") - .accelerator("CmdOrCtrl + Option + i"), - ), - )); - } - - menu + Ok(menu) } diff --git a/src-tauri/tauri-dev.conf.json b/src-tauri/tauri-dev.conf.json index 37040e87..2ad1fa5e 100644 --- a/src-tauri/tauri-dev.conf.json +++ b/src-tauri/tauri-dev.conf.json @@ -1,17 +1,13 @@ { - "package": { - "productName": "Daak" - }, - "tauri": { - "bundle": { - "icon": [ - "icons/dev/32x32.png", - "icons/dev/128x128.png", - "icons/dev/128x128@2x.png", - "icons/dev/icon.icns", - "icons/dev/icon.ico" - ], - "identifier": "app.yaak.desktop.dev" - } + "productName": "Daak", + "identifier": "app.yaak.desktop.dev", + "bundle": { + "icon": [ + "icons/dev/32x32.png", + "icons/dev/128x128.png", + "icons/dev/128x128@2x.png", + "icons/dev/icon.icns", + "icons/dev/icon.ico" + ] } } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index ce31a47f..332e5981 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -2,40 +2,49 @@ "build": { "beforeBuildCommand": "npm run build", "beforeDevCommand": "npm run dev", - "devPath": "http://localhost:1420", - "distDir": "../dist", - "withGlobalTauri": false + "devUrl": "http://localhost:1420", + "frontendDist": "../dist" }, - "package": { - "productName": "Yaak", - "version": "2024.3.10" + "productName": "Yaak", + "version": "2024.3.10", + "identifier": "app.yaak.desktop", + "app": { + "withGlobalTauri": false, + "security": { + "assetProtocol": { + "scope": [ + "$APPDATA/responses/*" + ] + } + } }, - "tauri": { - "windows": [], + "plugins": { + "updater": { + "endpoints": [ + "https://update.yaak.app/check/{{target}}/{{arch}}/{{current_version}}" + ], + "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEMxRDJFREQ1MjExQjdGN0IKUldSN2Z4c2gxZTNTd1FHNCtmYnFXMHVVQzhuNkJOM1cwOFBodmdLall3ckhKenpKUytHSTR1MlkK" + }, "allowlist": { "all": false, "os": { - "all": true - }, - "protocol": { - "assetScope": [ - "$APPDATA/responses/*" - ], - "asset": true + "allow-os-type": true }, "fs": { "readFile": true, "scope": [ "$RESOURCE/*", "$APPDATA/responses/*" -] + ] }, "shell": { "all": false, "open": true, "sidecar": true, "scope": [ - { "name": "protoc", "sidecar": true, + { + "name": "protoc", + "sidecar": true, "args": true } ] @@ -57,58 +66,37 @@ "path": { "all": true } + } + }, + "bundle": { + "active": true, + "category": "DeveloperTool", + "externalBin": [ + "protoc-vendored/protoc" + ], + "icon": [ + "icons/release/32x32.png", + "icons/release/128x128.png", + "icons/release/128x128@2x.png", + "icons/release/icon.icns", + "icons/release/icon.ico" + ], + "longDescription": "The best cross-platform visual API client", + "resources": [ + "migrations/*", + "plugins/*", + "protoc-vendored/include/*" + ], + "shortDescription": "The best API client", + "targets": "all", + "macOS": { + "exceptionDomain": "", + "entitlements": "macos/entitlements.plist", + "frameworks": [] }, - "bundle": { - "active": true, - "category": "DeveloperTool", - "copyright": "", - "externalBin": [ - "protoc-vendored/protoc" - ], - "icon": [ - "icons/release/32x32.png", - "icons/release/128x128.png", - "icons/release/128x128@2x.png", - "icons/release/icon.icns", - "icons/release/icon.ico" - ], - "identifier": "app.yaak.desktop", - "longDescription": "The best cross-platform visual API client", - "resources": [ - "migrations/*", - "plugins/*", - "protoc-vendored/include/*" - ], - "shortDescription": "The best API client", - "targets": [ - "deb", - "appimage", - "nsis", - "app", - "dmg", - "updater" - ], - "deb": { - "depends": [] - }, - "macOS": { - "exceptionDomain": "", - "entitlements": "macos/entitlements.plist", - "frameworks": [] - }, - "windows": { - "digestAlgorithm": "sha256", - "timestampUrl": "" - } - }, - "security": {}, - "updater": { - "active": true, - "dialog": false, - "endpoints": [ - "https://update.yaak.app/check/{{target}}/{{arch}}/{{current_version}}" - ], - "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEMxRDJFREQ1MjExQjdGN0IKUldSN2Z4c2gxZTNTd1FHNCtmYnFXMHVVQzhuNkJOM1cwOFBodmdLall3ckhKenpKUytHSTR1MlkK" + "windows": { + "digestAlgorithm": "sha256", + "timestampUrl": "" } } } diff --git a/src-web/components/BinaryFileEditor.tsx b/src-web/components/BinaryFileEditor.tsx index 1117b25e..e1f94df0 100644 --- a/src-web/components/BinaryFileEditor.tsx +++ b/src-web/components/BinaryFileEditor.tsx @@ -1,4 +1,4 @@ -import { open } from '@tauri-apps/api/dialog'; +import { open } from '@tauri-apps/plugin-dialog'; import mime from 'mime'; import { useKeyValue } from '../hooks/useKeyValue'; import type { HttpRequest } from '../lib/models'; diff --git a/src-web/components/ExportDataDialog.tsx b/src-web/components/ExportDataDialog.tsx index 1a3be623..960c3819 100644 --- a/src-web/components/ExportDataDialog.tsx +++ b/src-web/components/ExportDataDialog.tsx @@ -1,5 +1,5 @@ -import { invoke } from '@tauri-apps/api'; -import { save } from '@tauri-apps/api/dialog'; +import { invoke } from '@tauri-apps/api/core'; +import { save } from '@tauri-apps/plugin-dialog'; import { useState } from 'react'; import slugify from 'slugify'; import type { Workspace } from '../lib/models'; diff --git a/src-web/components/GlobalHooks.tsx b/src-web/components/GlobalHooks.tsx index 09cae818..c43c78dd 100644 --- a/src-web/components/GlobalHooks.tsx +++ b/src-web/components/GlobalHooks.tsx @@ -1,9 +1,10 @@ import { useQueryClient } from '@tanstack/react-query'; -import { appWindow } from '@tauri-apps/api/window'; +import { getCurrent } from '@tauri-apps/api/webviewWindow'; import { useEffect } from 'react'; import { useLocation } from 'react-router-dom'; import { useCommandPalette } from '../hooks/useCommandPalette'; import { cookieJarsQueryKey } from '../hooks/useCookieJars'; +import { foldersQueryKey } from '../hooks/useFolders'; import { useGlobalCommands } from '../hooks/useGlobalCommands'; import { grpcConnectionsQueryKey } from '../hooks/useGrpcConnections'; import { grpcEventsQueryKey } from '../hooks/useGrpcEvents'; @@ -47,93 +48,110 @@ export function GlobalHooks() { setPathname(location.pathname).catch(console.error); }, [location.pathname]); - useListenToTauriEvent('upserted_model', ({ payload, windowLabel }) => { + interface ModelPayload { + model: Model; + windowLabel: string; + } + + useListenToTauriEvent('upserted_model', ({ payload }) => { + const { model, windowLabel } = payload; const queryKey = - payload.model === 'http_request' - ? httpRequestsQueryKey(payload) - : payload.model === 'http_response' - ? httpResponsesQueryKey(payload) - : payload.model === 'grpc_connection' - ? grpcConnectionsQueryKey(payload) - : payload.model === 'grpc_event' - ? grpcEventsQueryKey(payload) - : payload.model === 'grpc_request' - ? grpcRequestsQueryKey(payload) - : payload.model === 'workspace' - ? workspacesQueryKey(payload) - : payload.model === 'key_value' - ? keyValueQueryKey(payload) - : payload.model === 'cookie_jar' - ? cookieJarsQueryKey(payload) - : payload.model === 'settings' + model.model === 'http_request' + ? httpRequestsQueryKey(model) + : model.model === 'http_response' + ? httpResponsesQueryKey(model) + : model.model === 'folder' + ? foldersQueryKey(model) + : model.model === 'grpc_connection' + ? grpcConnectionsQueryKey(model) + : model.model === 'grpc_event' + ? grpcEventsQueryKey(model) + : model.model === 'grpc_request' + ? grpcRequestsQueryKey(model) + : model.model === 'workspace' + ? workspacesQueryKey(model) + : model.model === 'key_value' + ? keyValueQueryKey(model) + : model.model === 'cookie_jar' + ? cookieJarsQueryKey(model) + : model.model === 'settings' ? settingsQueryKey() : null; if (queryKey === null) { - console.log('Unrecognized updated model:', payload); + console.log('Unrecognized updated model:', model); return; } - if (payload.model === 'http_request' && windowLabel !== appWindow.label) { - wasUpdatedExternally(payload.id); + if (model.model === 'http_request' && windowLabel !== getCurrent().label) { + wasUpdatedExternally(model.id); } const pushToFront = (['http_response', 'grpc_connection'] as Model['model'][]).includes( - payload.model, + model.model, ); - if (shouldIgnoreModel(payload)) return; + if (shouldIgnoreModel(model)) return; queryClient.setQueryData(queryKey, (values = []) => { - const index = values.findIndex((v) => modelsEq(v, payload)) ?? -1; + const index = values.findIndex((v) => modelsEq(v, model)) ?? -1; if (index >= 0) { // console.log('UPDATED', payload); - return [...values.slice(0, index), payload, ...values.slice(index + 1)]; + return [...values.slice(0, index), model, ...values.slice(index + 1)]; } else { // console.log('CREATED', payload); - return pushToFront ? [payload, ...(values ?? [])] : [...(values ?? []), payload]; + return pushToFront ? [model, ...(values ?? [])] : [...(values ?? []), model]; } }); }); - useListenToTauriEvent('deleted_model', ({ payload }) => { - if (shouldIgnoreModel(payload)) return; + useListenToTauriEvent('deleted_model', ({ payload }) => { + const { model } = payload; + if (shouldIgnoreModel(model)) return; - if (payload.model === 'workspace') { - queryClient.setQueryData(workspacesQueryKey(), removeById(payload)); - } else if (payload.model === 'http_request') { - queryClient.setQueryData(httpRequestsQueryKey(payload), removeById(payload)); - } else if (payload.model === 'http_response') { - queryClient.setQueryData(httpResponsesQueryKey(payload), removeById(payload)); - } else if (payload.model === 'grpc_request') { - queryClient.setQueryData(grpcRequestsQueryKey(payload), removeById(payload)); - } else if (payload.model === 'grpc_connection') { - queryClient.setQueryData(grpcConnectionsQueryKey(payload), removeById(payload)); - } else if (payload.model === 'grpc_event') { - queryClient.setQueryData(grpcEventsQueryKey(payload), removeById(payload)); - } else if (payload.model === 'key_value') { - queryClient.setQueryData(keyValueQueryKey(payload), undefined); - } else if (payload.model === 'cookie_jar') { - queryClient.setQueryData(cookieJarsQueryKey(payload), undefined); - } else if (payload.model === 'settings') { + if (model.model === 'workspace') { + queryClient.setQueryData(workspacesQueryKey(), removeById(model)); + } else if (model.model === 'http_request') { + queryClient.setQueryData(httpRequestsQueryKey(model), removeById(model)); + } else if (model.model === 'http_response') { + queryClient.setQueryData(httpResponsesQueryKey(model), removeById(model)); + } else if (model.model === 'folder') { + queryClient.setQueryData(foldersQueryKey(model), removeById(model)); + } else if (model.model === 'grpc_request') { + queryClient.setQueryData(grpcRequestsQueryKey(model), removeById(model)); + } else if (model.model === 'grpc_connection') { + queryClient.setQueryData(grpcConnectionsQueryKey(model), removeById(model)); + } else if (model.model === 'grpc_event') { + queryClient.setQueryData(grpcEventsQueryKey(model), removeById(model)); + } else if (model.model === 'key_value') { + queryClient.setQueryData(keyValueQueryKey(model), undefined); + } else if (model.model === 'cookie_jar') { + queryClient.setQueryData(cookieJarsQueryKey(model), undefined); + } else if (model.model === 'settings') { queryClient.setQueryData(settingsQueryKey(), undefined); } }); - useListenToTauriEvent('zoom', ({ payload: zoomDelta, windowLabel }) => { - if (windowLabel !== appWindow.label) return; - const fontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize); - let newFontSize; - if (zoomDelta === 0) { - newFontSize = DEFAULT_FONT_SIZE; - } else if (zoomDelta > 0) { - newFontSize = Math.min(fontSize * 1.1, DEFAULT_FONT_SIZE * 5); - } else if (zoomDelta < 0) { - newFontSize = Math.max(fontSize * 0.9, DEFAULT_FONT_SIZE * 0.4); - } + useListenToTauriEvent( + 'zoom', + ({ payload: zoomDelta }) => { + const fontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize); - document.documentElement.style.fontSize = `${newFontSize}px`; - }); + let newFontSize; + if (zoomDelta === 0) { + newFontSize = DEFAULT_FONT_SIZE; + } else if (zoomDelta > 0) { + newFontSize = Math.min(fontSize * 1.1, DEFAULT_FONT_SIZE * 5); + } else if (zoomDelta < 0) { + newFontSize = Math.max(fontSize * 0.9, DEFAULT_FONT_SIZE * 0.4); + } + + document.documentElement.style.fontSize = `${newFontSize}px`; + }, + { + target: { kind: 'WebviewWindow', label: getCurrent().label }, + }, + ); return null; } diff --git a/src-web/components/GrpcProtoSelection.tsx b/src-web/components/GrpcProtoSelection.tsx index 27a783b2..a609b34f 100644 --- a/src-web/components/GrpcProtoSelection.tsx +++ b/src-web/components/GrpcProtoSelection.tsx @@ -1,4 +1,4 @@ -import { open } from '@tauri-apps/api/dialog'; +import { open } from '@tauri-apps/plugin-dialog'; import { useGrpc } from '../hooks/useGrpc'; import { useGrpcProtoFiles } from '../hooks/useGrpcProtoFiles'; import { useGrpcRequest } from '../hooks/useGrpcRequest'; @@ -47,8 +47,10 @@ export function GrpcProtoSelection({ requestId }: Props) { multiple: true, filters: [{ name: 'Proto Files', extensions: ['proto'] }], }); - if (files == null || typeof files === 'string') return; - const newFiles = files.filter((f) => !protoFiles.includes(f)); + if (files == null) { + return; + } + const newFiles = files.map((f) => f.path).filter((p) => !protoFiles.includes(p)); await protoFilesKv.set([...protoFiles, ...newFiles]); await grpc.reflect.refetch(); }} diff --git a/src-web/components/RequestMethodDropdown.tsx b/src-web/components/RequestMethodDropdown.tsx index 170bc28b..b0b88b0f 100644 --- a/src-web/components/RequestMethodDropdown.tsx +++ b/src-web/components/RequestMethodDropdown.tsx @@ -19,6 +19,7 @@ const radioItems: RadioDropdownItem[] = [ 'PATCH', 'DELETE', 'OPTIONS', + 'QUERY', 'HEAD', ].map((m) => ({ value: m, @@ -33,7 +34,6 @@ export const RequestMethodDropdown = memo(function RequestMethodDropdown({ const prompt = usePrompt(); const extraItems = useMemo( () => [ - { type: 'separator' }, { key: 'custom', label: 'CUSTOM', diff --git a/src-web/components/ResponseHeaders.tsx b/src-web/components/ResponseHeaders.tsx index 92b9e849..27ff0e9e 100644 --- a/src-web/components/ResponseHeaders.tsx +++ b/src-web/components/ResponseHeaders.tsx @@ -1,4 +1,4 @@ -import { shell } from '@tauri-apps/api'; +import { open } from '@tauri-apps/plugin-shell'; import type { HttpResponse } from '../lib/models'; import { IconButton } from './core/IconButton'; import { KeyValueRow, KeyValueRows } from './core/KeyValueRow'; @@ -28,7 +28,7 @@ export function ResponseHeaders({ response }: Props) { iconSize="sm" className="inline-block w-auto ml-1 !h-auto opacity-50 hover:opacity-100" icon="externalLink" - onClick={() => shell.open(response.url)} + onClick={() => open(response.url)} title="Open in browser" /> diff --git a/src-web/components/SettingsDropdown.tsx b/src-web/components/SettingsDropdown.tsx index a0158d49..400fee9d 100644 --- a/src-web/components/SettingsDropdown.tsx +++ b/src-web/components/SettingsDropdown.tsx @@ -1,4 +1,4 @@ -import { shell } from '@tauri-apps/api'; +import { open } from '@tauri-apps/plugin-shell'; import { useRef, useState } from 'react'; import { useAppInfo } from '../hooks/useAppInfo'; import { useCheckForUpdates } from '../hooks/useCheckForUpdates'; @@ -26,6 +26,17 @@ export function SettingsDropdown() { setShowChangelog(true); }); + const showSettings = () => { + dialog.show({ + id: 'settings', + size: 'md', + title: 'Settings', + render: () => , + }); + }; + + useListenToTauriEvent('settings', showSettings); + return ( , - onSelect: () => { - dialog.show({ - id: 'settings', - size: 'md', - title: 'Settings', - render: () => , - }); - }, + onSelect: showSettings, }, { key: 'hotkeys', @@ -83,7 +87,7 @@ export function SettingsDropdown() { label: 'Feedback', leftSlot: , rightSlot: , - onSelect: () => shell.open('https://yaak.canny.io'), + onSelect: () => open('https://yaak.canny.io'), }, { key: 'changelog', @@ -91,7 +95,7 @@ export function SettingsDropdown() { variant: showChangelog ? 'notify' : 'default', leftSlot: , rightSlot: , - onSelect: () => shell.open(`https://yaak.app/changelog/${appInfo.data?.version}`), + onSelect: () => open(`https://yaak.app/changelog/${appInfo.data?.version}`), }, ]} > diff --git a/src-web/components/Workspace.tsx b/src-web/components/Workspace.tsx index 844e434c..7780bf84 100644 --- a/src-web/components/Workspace.tsx +++ b/src-web/components/Workspace.tsx @@ -211,7 +211,7 @@ interface HeaderSizeProps extends HTMLAttributes { function HeaderSize({ className, style, ...props }: HeaderSizeProps) { const platform = useOsInfo(); const fullscreen = useIsFullscreen(); - const stoplightsVisible = platform?.osType === 'Darwin' && !fullscreen; + const stoplightsVisible = platform?.osType === 'macos' && !fullscreen; return (

- {(osInfo?.osType === 'Linux' || osInfo?.osType === 'Windows_NT') && ( + {(osInfo?.osType === 'linux' || osInfo?.osType === 'windows') && (