diff --git a/.gitignore b/.gitignore
index 2031331b..3864ca7c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,8 +29,9 @@ dist/
# Debug
-*.log*
+*.log.*
# Misc
.DS_Store
*.pem
+.vscode/
diff --git a/README.md b/README.md
index 5f8881bc..1a1a8260 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,30 @@
-### Introduction
+_Note_: Lume is under rewrite to using Rust Nostr as back-end and more lightweight front-end. If you need stable version, you can download v3 and below.
-Lume is a nostr client
+Source code for v3 is stored here: https://github.com/lumehq/lume/tree/old
-### Usage
+--
-Download Lume for your platform here: [https://github.com/lumehq/lume/releases](https://github.com/lumehq/lume/releases)
+## Introduction
+
+Lume is a Nostr client for desktop include Linux, Windows and macOS. It is free and open source, you can look at source code on Github. Lume is actively improving the app and adding new features, you can expect new update every month.
+
+## Usage
+
+Download Lume v3 (v3.0.1-stable) for your platform here: [https://github.com/lumehq/lume/releases](https://github.com/lumehq/lume/releases)
Supported platform: macOS, Windows and Linux
-### Prerequisites
+## Prerequisites
-- PNPM or Bun (experiment)
+- Node.js >= 18: https://nodejs.org/en
-- Tauri: https://tauri.app/v1/guides/getting-started/prerequisites#setting-up-macos
+- Rust: https://rustup.rs/
-### Develop
+- PNPM: https://pnpm.io
+
+- Tauri v2: https://beta.tauri.app/guides/prerequisites/
+
+## Develop
Clone project
@@ -40,7 +50,7 @@ Generate production build
pnpm tauri build
```
-#### Nix
+## Nix
Requirements:
@@ -53,8 +63,8 @@ Requirements:
Copyright (C) 2023-2024 Ren Amamiya & other Lume contributors (see AUTHORS.md)
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-You should have received a copy of the GNU Affero General Public License along with this program. If not, see https://www.gnu.org/licenses/.
+You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.
diff --git a/apps/desktop/index.html b/apps/desktop/index.html
deleted file mode 100644
index 39bb9c2f..00000000
--- a/apps/desktop/index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
- Lume
-
-
-
-
-
-
diff --git a/apps/desktop/package.json b/apps/desktop/package.json
deleted file mode 100644
index c8980376..00000000
--- a/apps/desktop/package.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "name": "lume",
- "private": true,
- "version": "3.0.0",
- "scripts": {
- "dev": "vite",
- "build": "vite build"
- },
- "dependencies": {
- "@columns/antenas": "workspace:^",
- "@columns/default": "workspace:^",
- "@columns/foryou": "workspace:^",
- "@columns/global": "workspace:^",
- "@columns/group": "workspace:^",
- "@columns/hashtag": "workspace:^",
- "@columns/thread": "workspace:^",
- "@columns/timeline": "workspace:^",
- "@columns/trending-notes": "workspace:^",
- "@columns/user": "workspace:^",
- "@columns/waifu": "workspace:^",
- "@getalby/sdk": "^3.2.3",
- "@lume/ark": "workspace:^",
- "@lume/icons": "workspace:^",
- "@lume/storage": "workspace:^",
- "@lume/ui": "workspace:^",
- "@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@radix-ui/react-accordion": "^1.1.2",
- "@radix-ui/react-alert-dialog": "^1.0.5",
- "@radix-ui/react-avatar": "^1.0.4",
- "@radix-ui/react-checkbox": "^1.0.4",
- "@radix-ui/react-collapsible": "^1.0.3",
- "@radix-ui/react-dialog": "^1.0.5",
- "@radix-ui/react-dropdown-menu": "^2.0.6",
- "@radix-ui/react-hover-card": "^1.0.7",
- "@radix-ui/react-popover": "^1.0.7",
- "@radix-ui/react-select": "^2.0.0",
- "@radix-ui/react-switch": "^1.0.3",
- "@radix-ui/react-tooltip": "^1.0.7",
- "@tanstack/react-query": "^5.17.19",
- "framer-motion": "^11.0.3",
- "i18next": "^23.8.1",
- "i18next-resources-to-backend": "^1.2.0",
- "jotai": "^2.6.3",
- "minidenticons": "^4.2.0",
- "nanoid": "^5.0.4",
- "nostr-fetch": "^0.15.0",
- "nostr-tools": "^1.17.0",
- "react": "^18.2.0",
- "react-currency-input-field": "^3.6.14",
- "react-dom": "^18.2.0",
- "react-hook-form": "^7.49.3",
- "react-i18next": "^14.0.1",
- "react-router-dom": "^6.21.3",
- "smol-toml": "^1.1.4",
- "sonner": "^1.4.0",
- "virtua": "^0.23.0"
- },
- "devDependencies": {
- "@lume/tailwindcss": "workspace:^",
- "@lume/tsconfig": "workspace:^",
- "@lume/types": "workspace:^",
- "@types/node": "^20.11.10",
- "@types/react": "^18.2.48",
- "@types/react-dom": "^18.2.18",
- "@vitejs/plugin-react-swc": "^3.5.0",
- "autoprefixer": "^10.4.17",
- "cross-env": "^7.0.3",
- "encoding": "^0.1.13",
- "postcss": "^8.4.33",
- "tailwindcss": "^3.4.1",
- "typescript": "^5.3.3",
- "vite": "^5.0.12",
- "vite-plugin-top-level-await": "^1.4.1",
- "vite-tsconfig-paths": "^4.3.1"
- }
-}
diff --git a/apps/desktop/postcss.config.js b/apps/desktop/postcss.config.js
deleted file mode 100644
index e873f1a4..00000000
--- a/apps/desktop/postcss.config.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
- plugins: {
- tailwindcss: {},
- autoprefixer: {},
- },
-};
diff --git a/apps/desktop/public/anime.jpg b/apps/desktop/public/anime.jpg
deleted file mode 100644
index f7f8eeab..00000000
Binary files a/apps/desktop/public/anime.jpg and /dev/null differ
diff --git a/apps/desktop/public/art.jpg b/apps/desktop/public/art.jpg
deleted file mode 100644
index efc36ab3..00000000
Binary files a/apps/desktop/public/art.jpg and /dev/null differ
diff --git a/apps/desktop/public/clapping_hands.png b/apps/desktop/public/clapping_hands.png
deleted file mode 100644
index 593056a4..00000000
Binary files a/apps/desktop/public/clapping_hands.png and /dev/null differ
diff --git a/apps/desktop/public/clown_face.png b/apps/desktop/public/clown_face.png
deleted file mode 100644
index 3c650616..00000000
Binary files a/apps/desktop/public/clown_face.png and /dev/null differ
diff --git a/apps/desktop/public/columns/antenas.jpg b/apps/desktop/public/columns/antenas.jpg
deleted file mode 100644
index 7be430dd..00000000
Binary files a/apps/desktop/public/columns/antenas.jpg and /dev/null differ
diff --git a/apps/desktop/public/columns/antenas@2x.jpg b/apps/desktop/public/columns/antenas@2x.jpg
deleted file mode 100644
index 4b38bb86..00000000
Binary files a/apps/desktop/public/columns/antenas@2x.jpg and /dev/null differ
diff --git a/apps/desktop/public/columns/global.jpg b/apps/desktop/public/columns/global.jpg
deleted file mode 100644
index 2288bfaf..00000000
Binary files a/apps/desktop/public/columns/global.jpg and /dev/null differ
diff --git a/apps/desktop/public/columns/global@2x.jpg b/apps/desktop/public/columns/global@2x.jpg
deleted file mode 100644
index e079bfe1..00000000
Binary files a/apps/desktop/public/columns/global@2x.jpg and /dev/null differ
diff --git a/apps/desktop/public/columns/group.jpg b/apps/desktop/public/columns/group.jpg
deleted file mode 100644
index 49a01657..00000000
Binary files a/apps/desktop/public/columns/group.jpg and /dev/null differ
diff --git a/apps/desktop/public/columns/group@2x.jpg b/apps/desktop/public/columns/group@2x.jpg
deleted file mode 100644
index 3718db40..00000000
Binary files a/apps/desktop/public/columns/group@2x.jpg and /dev/null differ
diff --git a/apps/desktop/public/columns/trending-notes.jpg b/apps/desktop/public/columns/trending-notes.jpg
deleted file mode 100644
index 0ae75021..00000000
Binary files a/apps/desktop/public/columns/trending-notes.jpg and /dev/null differ
diff --git a/apps/desktop/public/columns/trending-notes@2x.jpg b/apps/desktop/public/columns/trending-notes@2x.jpg
deleted file mode 100644
index b99e5849..00000000
Binary files a/apps/desktop/public/columns/trending-notes@2x.jpg and /dev/null differ
diff --git a/apps/desktop/public/columns/waifu.jpg b/apps/desktop/public/columns/waifu.jpg
deleted file mode 100644
index 3af7c137..00000000
Binary files a/apps/desktop/public/columns/waifu.jpg and /dev/null differ
diff --git a/apps/desktop/public/columns/waifu@2x.jpg b/apps/desktop/public/columns/waifu@2x.jpg
deleted file mode 100644
index 67b4556a..00000000
Binary files a/apps/desktop/public/columns/waifu@2x.jpg and /dev/null differ
diff --git a/apps/desktop/public/crying_face.png b/apps/desktop/public/crying_face.png
deleted file mode 100644
index 47bfc717..00000000
Binary files a/apps/desktop/public/crying_face.png and /dev/null differ
diff --git a/apps/desktop/public/face_with_open_mouth.png b/apps/desktop/public/face_with_open_mouth.png
deleted file mode 100644
index 4b6f5c57..00000000
Binary files a/apps/desktop/public/face_with_open_mouth.png and /dev/null differ
diff --git a/apps/desktop/public/face_with_tongue.png b/apps/desktop/public/face_with_tongue.png
deleted file mode 100644
index b6bf2b8e..00000000
Binary files a/apps/desktop/public/face_with_tongue.png and /dev/null differ
diff --git a/apps/desktop/public/fallback-image.jpg b/apps/desktop/public/fallback-image.jpg
deleted file mode 100644
index 1490c0b7..00000000
Binary files a/apps/desktop/public/fallback-image.jpg and /dev/null differ
diff --git a/apps/desktop/public/gaming.jpg b/apps/desktop/public/gaming.jpg
deleted file mode 100644
index de58aeeb..00000000
Binary files a/apps/desktop/public/gaming.jpg and /dev/null differ
diff --git a/apps/desktop/public/ghost.png b/apps/desktop/public/ghost.png
deleted file mode 100644
index 8cf4548c..00000000
Binary files a/apps/desktop/public/ghost.png and /dev/null differ
diff --git a/apps/desktop/public/icon.png b/apps/desktop/public/icon.png
deleted file mode 100644
index 0e62e01a..00000000
Binary files a/apps/desktop/public/icon.png and /dev/null differ
diff --git a/apps/desktop/public/movie.jpg b/apps/desktop/public/movie.jpg
deleted file mode 100644
index bcb36809..00000000
Binary files a/apps/desktop/public/movie.jpg and /dev/null differ
diff --git a/apps/desktop/public/music.jpg b/apps/desktop/public/music.jpg
deleted file mode 100644
index 1c533c15..00000000
Binary files a/apps/desktop/public/music.jpg and /dev/null differ
diff --git a/apps/desktop/public/nsfw.jpg b/apps/desktop/public/nsfw.jpg
deleted file mode 100644
index f9e183d2..00000000
Binary files a/apps/desktop/public/nsfw.jpg and /dev/null differ
diff --git a/apps/desktop/public/photography.jpg b/apps/desktop/public/photography.jpg
deleted file mode 100644
index 6f117830..00000000
Binary files a/apps/desktop/public/photography.jpg and /dev/null differ
diff --git a/apps/desktop/public/technology.jpg b/apps/desktop/public/technology.jpg
deleted file mode 100644
index cfd733f0..00000000
Binary files a/apps/desktop/public/technology.jpg and /dev/null differ
diff --git a/apps/desktop/public/translate.jpg b/apps/desktop/public/translate.jpg
deleted file mode 100644
index 2b43e2d7..00000000
Binary files a/apps/desktop/public/translate.jpg and /dev/null differ
diff --git a/apps/desktop/public/translate@2x.jpg b/apps/desktop/public/translate@2x.jpg
deleted file mode 100644
index 8cfde295..00000000
Binary files a/apps/desktop/public/translate@2x.jpg and /dev/null differ
diff --git a/apps/desktop/public/tutorial-1.gif b/apps/desktop/public/tutorial-1.gif
deleted file mode 100644
index a536c39b..00000000
Binary files a/apps/desktop/public/tutorial-1.gif and /dev/null differ
diff --git a/apps/desktop/public/tutorial-2.gif b/apps/desktop/public/tutorial-2.gif
deleted file mode 100644
index 16f74d34..00000000
Binary files a/apps/desktop/public/tutorial-2.gif and /dev/null differ
diff --git a/apps/desktop/public/tutorial-3.gif b/apps/desktop/public/tutorial-3.gif
deleted file mode 100644
index 37ba9f6e..00000000
Binary files a/apps/desktop/public/tutorial-3.gif and /dev/null differ
diff --git a/apps/desktop/public/zap.png b/apps/desktop/public/zap.png
deleted file mode 100644
index d0747151..00000000
Binary files a/apps/desktop/public/zap.png and /dev/null differ
diff --git a/apps/desktop/src/app.tsx b/apps/desktop/src/app.tsx
deleted file mode 100644
index 4cb8af63..00000000
--- a/apps/desktop/src/app.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { ColumnProvider, LumeProvider } from "@lume/ark";
-import { StorageProvider } from "@lume/storage";
-import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
-import { I18nextProvider } from "react-i18next";
-import { Toaster } from "sonner";
-import i18n from "./i18n";
-import Router from "./router";
-
-const queryClient = new QueryClient({
- defaultOptions: {
- queries: {
- retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000), // 10 seconds
- },
- },
-});
-
-export default function App() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/main.jsx b/apps/desktop/src/main.jsx
deleted file mode 100644
index 01e6aed0..00000000
--- a/apps/desktop/src/main.jsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import { createRoot } from "react-dom/client";
-import App from "./app";
-import "./app.css";
-
-const container = document.getElementById("root");
-const root = createRoot(container);
-
-root.render( );
diff --git a/apps/desktop/src/router.tsx b/apps/desktop/src/router.tsx
deleted file mode 100644
index 23844d38..00000000
--- a/apps/desktop/src/router.tsx
+++ /dev/null
@@ -1,285 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { AppLayout, AuthLayout, HomeLayout, SettingsLayout } from "@lume/ui";
-import { fetch } from "@tauri-apps/plugin-http";
-import {
- RouterProvider,
- createBrowserRouter,
- defer,
- redirect,
-} from "react-router-dom";
-import { ErrorScreen } from "./routes/error";
-
-export default function Router() {
- const ark = useArk();
- const storage = useStorage();
-
- const router = createBrowserRouter([
- {
- element: ,
- children: [
- {
- path: "/",
- element: ,
- errorElement: ,
- loader: async () => {
- if (!ark.account) return redirect("auth");
- return null;
- },
- children: [
- {
- index: true,
- async lazy() {
- const { HomeScreen } = await import("./routes/home");
- return { Component: HomeScreen };
- },
- },
- ],
- },
- {
- path: "settings",
- element: ,
- children: [
- {
- index: true,
- async lazy() {
- const { GeneralSettingScreen } = await import(
- "./routes/settings/general"
- );
- return { Component: GeneralSettingScreen };
- },
- },
- {
- path: "profile",
- async lazy() {
- const { ProfileSettingScreen } = await import(
- "./routes/settings/profile"
- );
- return { Component: ProfileSettingScreen };
- },
- },
- {
- path: "backup",
- async lazy() {
- const { BackupSettingScreen } = await import(
- "./routes/settings/backup"
- );
- return { Component: BackupSettingScreen };
- },
- },
- {
- path: "advanced",
- async lazy() {
- const { AdvancedSettingScreen } = await import(
- "./routes/settings/advanced"
- );
- return { Component: AdvancedSettingScreen };
- },
- },
- {
- path: "nwc",
- async lazy() {
- const { NWCScreen } = await import("./routes/settings/nwc");
- return { Component: NWCScreen };
- },
- },
- {
- path: "about",
- async lazy() {
- const { AboutScreen } = await import("./routes/settings/about");
- return { Component: AboutScreen };
- },
- },
- ],
- },
- {
- path: "activity",
- async lazy() {
- const { ActivityScreen } = await import("./routes/activty");
- return { Component: ActivityScreen };
- },
- children: [
- {
- path: ":id",
- async lazy() {
- const { ActivityIdScreen } = await import(
- "./routes/activty/id"
- );
- return { Component: ActivityIdScreen };
- },
- },
- ],
- },
- {
- path: "relays",
- async lazy() {
- const { RelaysScreen } = await import("./routes/relays");
- return { Component: RelaysScreen };
- },
- children: [
- {
- index: true,
- async lazy() {
- const { RelayGlobalScreen } = await import(
- "./routes/relays/global"
- );
- return { Component: RelayGlobalScreen };
- },
- },
- {
- path: "follows",
- async lazy() {
- const { RelayFollowsScreen } = await import(
- "./routes/relays/follows"
- );
- return { Component: RelayFollowsScreen };
- },
- },
- {
- path: ":url",
- loader: async ({ request, params }) => {
- return defer({
- relay: fetch(`https://${params.url}`, {
- method: "GET",
- headers: {
- Accept: "application/nostr+json",
- },
- signal: request.signal,
- }).then((res) => res.json()),
- });
- },
- async lazy() {
- const { RelayUrlScreen } = await import("./routes/relays/url");
- return { Component: RelayUrlScreen };
- },
- },
- ],
- },
- {
- path: "depot",
- children: [
- {
- index: true,
- loader: () => {
- const depot = storage.checkDepot();
- if (!depot) return redirect("/depot/onboarding/");
- return null;
- },
- async lazy() {
- const { DepotScreen } = await import("./routes/depot");
- return { Component: DepotScreen };
- },
- },
- {
- path: "onboarding",
- async lazy() {
- const { DepotOnboardingScreen } = await import(
- "./routes/depot/onboarding"
- );
- return { Component: DepotOnboardingScreen };
- },
- },
- ],
- },
- ],
- },
- {
- path: "auth",
- element: ,
- errorElement: ,
- children: [
- {
- index: true,
- async lazy() {
- const { WelcomeScreen } = await import("./routes/auth/welcome");
- return { Component: WelcomeScreen };
- },
- },
- {
- path: "create",
- async lazy() {
- const { CreateAccountScreen } = await import(
- "./routes/auth/create"
- );
- return { Component: CreateAccountScreen };
- },
- },
- {
- path: "create-keys",
- async lazy() {
- const { CreateAccountKeys } = await import(
- "./routes/auth/create-keys"
- );
- return { Component: CreateAccountKeys };
- },
- },
- {
- path: "create-address",
- loader: async () => {
- return await ark.getOAuthServices();
- },
- async lazy() {
- const { CreateAccountAddress } = await import(
- "./routes/auth/create-address"
- );
- return { Component: CreateAccountAddress };
- },
- },
- {
- path: "login",
- async lazy() {
- const { LoginScreen } = await import("./routes/auth/login");
- return { Component: LoginScreen };
- },
- },
- {
- path: "login-key",
- async lazy() {
- const { LoginWithKey } = await import("./routes/auth/login-key");
- return { Component: LoginWithKey };
- },
- },
- {
- path: "login-nsecbunker",
- async lazy() {
- const { LoginWithNsecbunker } = await import(
- "./routes/auth/login-nsecbunker"
- );
- return { Component: LoginWithNsecbunker };
- },
- },
- {
- path: "login-oauth",
- async lazy() {
- const { LoginWithOAuth } = await import(
- "./routes/auth/login-oauth"
- );
- return { Component: LoginWithOAuth };
- },
- },
- {
- path: "onboarding",
- async lazy() {
- const { OnboardingScreen } = await import(
- "./routes/auth/onboarding"
- );
- return { Component: OnboardingScreen };
- },
- },
- ],
- },
- ]);
-
- return (
-
-
-
- }
- future={{ v7_startTransition: true }}
- />
- );
-}
diff --git a/apps/desktop/src/routes/activty/components/activityRepost.tsx b/apps/desktop/src/routes/activty/components/activityRepost.tsx
deleted file mode 100644
index cc577bd0..00000000
--- a/apps/desktop/src/routes/activty/components/activityRepost.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { User } from "@lume/ark";
-import { NDKEvent } from "@nostr-dev-kit/ndk";
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-
-export function ActivityRepost({ event }: { event: NDKEvent }) {
- const { t } = useTranslation();
-
- return (
-
-
-
-
-
-
-
-
{t("activity.repost")}
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/activty/components/activityText.tsx b/apps/desktop/src/routes/activty/components/activityText.tsx
deleted file mode 100644
index 7a0e4cb3..00000000
--- a/apps/desktop/src/routes/activty/components/activityText.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { User } from "@lume/ark";
-import { NDKEvent } from "@nostr-dev-kit/ndk";
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-
-export function ActivityText({ event }: { event: NDKEvent }) {
- const { t } = useTranslation();
-
- return (
-
-
-
-
-
-
-
-
{t("activity.mention")}
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/activty/components/activityZap.tsx b/apps/desktop/src/routes/activty/components/activityZap.tsx
deleted file mode 100644
index 2085900f..00000000
--- a/apps/desktop/src/routes/activty/components/activityZap.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { User } from "@lume/ark";
-import { compactNumber } from "@lume/utils";
-import { NDKEvent, zapInvoiceFromEvent } from "@nostr-dev-kit/ndk";
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-
-export function ActivityZap({ event }: { event: NDKEvent }) {
- const { t } = useTranslation();
- const invoice = zapInvoiceFromEvent(event);
-
- return (
-
-
-
-
-
-
-
-
- {t("activity.zap")} {compactNumber.format(invoice.amount)} sats
-
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/activty/components/list.tsx b/apps/desktop/src/routes/activty/components/list.tsx
deleted file mode 100644
index 02d6ff2f..00000000
--- a/apps/desktop/src/routes/activty/components/list.tsx
+++ /dev/null
@@ -1,117 +0,0 @@
-import { useArk } from "@lume/ark";
-import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons";
-import { FETCH_LIMIT } from "@lume/utils";
-import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
-import { useInfiniteQuery, useQueryClient } from "@tanstack/react-query";
-import { useCallback, useMemo } from "react";
-import { useTranslation } from "react-i18next";
-import { ActivityRepost } from "./activityRepost";
-import { ActivityText } from "./activityText";
-import { ActivityZap } from "./activityZap";
-
-export function ActivityList() {
- const ark = useArk();
- const queryClient = useQueryClient();
-
- const { t } = useTranslation();
- const { data, hasNextPage, isLoading, isFetchingNextPage, fetchNextPage } =
- useInfiniteQuery({
- queryKey: ["activity"],
- initialPageParam: 0,
- queryFn: async ({
- signal,
- pageParam,
- }: {
- signal: AbortSignal;
- pageParam: number;
- }) => {
- const events = await ark.getInfiniteEvents({
- filter: {
- kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Zap],
- "#p": [ark.account.pubkey],
- },
- limit: FETCH_LIMIT,
- pageParam,
- signal,
- });
-
- return events;
- },
- getNextPageParam: (lastPage) => {
- const lastEvent = lastPage.at(-1);
- if (!lastEvent) return;
- return lastEvent.created_at - 1;
- },
- initialData: () => {
- const queryCacheData = queryClient.getQueryState(["activity"])
- ?.data as NDKEvent[];
- if (queryCacheData) {
- return {
- pageParams: [undefined, 1],
- pages: [queryCacheData],
- };
- }
- },
- staleTime: 360 * 1000,
- refetchOnWindowFocus: false,
- refetchOnMount: false,
- });
-
- const allEvents = useMemo(
- () => (data ? data.pages.flatMap((page) => page) : []),
- [data],
- );
-
- const renderEvenKind = useCallback(
- (event: NDKEvent) => {
- if (event.pubkey === ark.account.pubkey) return null;
- switch (event.kind) {
- case NDKKind.Text:
- return ;
- case NDKKind.Repost:
- return ;
- case NDKKind.Zap:
- return ;
- default:
- return ;
- }
- },
- [data],
- );
-
- return (
-
- {isLoading ? (
-
-
-
- ) : !allEvents.length ? (
-
-
🎉
-
{t("activity.empty")}
-
- ) : (
- allEvents.map((event) => renderEvenKind(event))
- )}
-
- {hasNextPage ? (
-
fetchNextPage()}
- disabled={!hasNextPage || isFetchingNextPage}
- className="inline-flex items-center justify-center w-full h-12 gap-2 font-medium bg-black/10 hover:bg-black/20 dark:bg-white/10 dark:hover:bg-white/20 rounded-xl focus:outline-none"
- >
- {isFetchingNextPage ? (
-
- ) : (
- <>
-
- {t("global.loadMore")}
- >
- )}
-
- ) : null}
-
-
- );
-}
diff --git a/apps/desktop/src/routes/activty/components/rootNote.tsx b/apps/desktop/src/routes/activty/components/rootNote.tsx
deleted file mode 100644
index 5ba7e589..00000000
--- a/apps/desktop/src/routes/activty/components/rootNote.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { Note, useEvent } from "@lume/ark";
-
-export function ActivityRootNote({ eventId }: { eventId: string }) {
- const { isLoading, isError, data } = useEvent(eventId);
-
- if (isLoading) {
- return (
-
- );
- }
-
- if (isError) {
- return (
-
-
- Failed to fetch event
-
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/activty/components/singleRepost.tsx b/apps/desktop/src/routes/activty/components/singleRepost.tsx
deleted file mode 100644
index c97e876b..00000000
--- a/apps/desktop/src/routes/activty/components/singleRepost.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { User } from "@lume/ark";
-import { NDKEvent } from "@nostr-dev-kit/ndk";
-import { useTranslation } from "react-i18next";
-import { ActivityRootNote } from "./rootNote";
-
-export function ActivitySingleRepost({ event }: { event: NDKEvent }) {
- const { t } = useTranslation();
- const repostId = event.tags.find((el) => el[0] === "e")[1];
-
- return (
-
-
-
- {t("activity.boost")}
-
-
- {t("activity.boostSubtitle")}
-
-
-
-
-
-
-
-
-
-
-
-
{t("activity.repost")}
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/activty/components/singleText.tsx b/apps/desktop/src/routes/activty/components/singleText.tsx
deleted file mode 100644
index d0c6d734..00000000
--- a/apps/desktop/src/routes/activty/components/singleText.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import { Note, useArk } from "@lume/ark";
-import { NDKEvent } from "@nostr-dev-kit/ndk";
-import { useTranslation } from "react-i18next";
-import { ActivityRootNote } from "./rootNote";
-
-export function ActivitySingleText({ event }: { event: NDKEvent }) {
- const ark = useArk();
- const thread = ark.getEventThread({
- content: event.content,
- tags: event.tags,
- });
-
- const { t } = useTranslation();
-
- return (
-
-
-
- {t("activity.conversation")}
-
-
- {t("activity.conversationSubtitle")}
-
-
-
-
- {thread ? (
-
- {thread.rootEventId ? (
-
- ) : null}
- {thread.replyEventId ? (
-
- ) : null}
-
- ) : null}
-
-
-
- {t("activity.newReply")}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/activty/components/singleZap.tsx b/apps/desktop/src/routes/activty/components/singleZap.tsx
deleted file mode 100644
index 59e25c42..00000000
--- a/apps/desktop/src/routes/activty/components/singleZap.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { User } from "@lume/ark";
-import { compactNumber } from "@lume/utils";
-import { NDKEvent, zapInvoiceFromEvent } from "@nostr-dev-kit/ndk";
-import { ActivityRootNote } from "./rootNote";
-
-export function ActivitySingleZap({ event }: { event: NDKEvent }) {
- const zapEventId = event.tags.find((el) => el[0] === "e")[1];
- const invoice = zapInvoiceFromEvent(event);
-
- return (
-
-
-
- Conversation
-
-
- @ Someone has replied to your note
-
-
-
-
-
-
-
-
-
-
-
-
- Zap you {compactNumber.format(invoice.amount)} sats for
-
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/activty/id.tsx b/apps/desktop/src/routes/activty/id.tsx
deleted file mode 100644
index 53350b55..00000000
--- a/apps/desktop/src/routes/activty/id.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import { useEvent } from "@lume/ark";
-import { LoaderIcon } from "@lume/icons";
-import { NDKKind } from "@nostr-dev-kit/ndk";
-import { useParams } from "react-router-dom";
-import { ActivitySingleRepost } from "./components/singleRepost";
-import { ActivitySingleText } from "./components/singleText";
-import { ActivitySingleZap } from "./components/singleZap";
-
-export function ActivityIdScreen() {
- const { id } = useParams();
- const { isLoading, data } = useEvent(id);
-
- if (isLoading || !data) {
- return (
-
-
-
- );
- }
-
- if (data.kind === NDKKind.Text) return ;
- if (data.kind === NDKKind.Zap) return ;
- if (data.kind === NDKKind.Repost)
- return ;
-
- return ;
-}
diff --git a/apps/desktop/src/routes/activty/index.tsx b/apps/desktop/src/routes/activty/index.tsx
deleted file mode 100644
index 1dc3e54c..00000000
--- a/apps/desktop/src/routes/activty/index.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { activityUnreadAtom } from "@lume/utils";
-import { useSetAtom } from "jotai";
-import { useEffect } from "react";
-import { useTranslation } from "react-i18next";
-import { Outlet } from "react-router-dom";
-import { ActivityList } from "./components/list";
-
-export function ActivityScreen() {
- const { t } = useTranslation();
- const setUnreadActivity = useSetAtom(activityUnreadAtom);
-
- useEffect(() => {
- setUnreadActivity(0);
- }, []);
-
- return (
-
-
-
- {t("activity.title")}
-
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/auth/create-address.tsx b/apps/desktop/src/routes/auth/create-address.tsx
deleted file mode 100644
index dcf8833a..00000000
--- a/apps/desktop/src/routes/auth/create-address.tsx
+++ /dev/null
@@ -1,264 +0,0 @@
-import { useArk } from "@lume/ark";
-import { CheckIcon, ChevronDownIcon, LoaderIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { onboardingAtom } from "@lume/utils";
-import NDK, {
- NDKEvent,
- NDKKind,
- NDKNip46Signer,
- NDKPrivateKeySigner,
-} from "@nostr-dev-kit/ndk";
-import * as Select from "@radix-ui/react-select";
-import { UnlistenFn } from "@tauri-apps/api/event";
-import { Window } from "@tauri-apps/api/window";
-import { useSetAtom } from "jotai";
-import { useState } from "react";
-import { useForm } from "react-hook-form";
-import { useTranslation } from "react-i18next";
-import { useLoaderData, useNavigate } from "react-router-dom";
-import { toast } from "sonner";
-
-const Item = ({ event }: { event: NDKEvent }) => {
- const domain = JSON.parse(event.content).nip05.replace("_@", "");
-
- return (
-
- @{domain}
-
-
-
-
- );
-};
-
-export function CreateAccountAddress() {
- const ark = useArk();
- const storage = useStorage();
- const services = useLoaderData() as NDKEvent[];
- const setOnboarding = useSetAtom(onboardingAtom);
- const navigate = useNavigate();
-
- const [serviceId, setServiceId] = useState(services?.[0]?.id);
- const [loading, setIsLoading] = useState(false);
-
- const { t } = useTranslation();
- const {
- register,
- handleSubmit,
- formState: { isValid },
- } = useForm();
-
- const getDomainName = (id: string) => {
- const event = services.find((ev) => ev.id === id);
- return JSON.parse(event.content).nip05.replace("_@", "") as string;
- };
-
- const onSubmit = async (data: { username: string; email: string }) => {
- try {
- setIsLoading(true);
-
- const domain = getDomainName(serviceId);
- const service = services.find((ev) => ev.id === serviceId);
-
- // generate ndk for nsecbunker
- const localSigner = NDKPrivateKeySigner.generate();
- const bunker = new NDK({
- explicitRelayUrls: [
- "wss://relay.nsecbunker.com/",
- "wss://nostr.vulpem.com/",
- ],
- });
- await bunker.connect(2000);
-
- // generate tmp remote singer for create account
- const remoteSigner = new NDKNip46Signer(
- bunker,
- service.pubkey,
- localSigner,
- );
-
- // handle auth url request
- let unlisten: UnlistenFn;
- let authWindow: Window;
- let account: string = undefined;
-
- remoteSigner.addListener("authUrl", async (authUrl: string) => {
- authWindow = new Window(`auth-${serviceId}`, {
- url: authUrl,
- title: domain,
- titleBarStyle: "overlay",
- width: 600,
- height: 650,
- center: true,
- closable: false,
- });
- unlisten = await authWindow.onCloseRequested(() => {
- if (!account) {
- setIsLoading(false);
- unlisten();
-
- return authWindow.close();
- }
- });
- });
-
- // create new account
- account = await remoteSigner.createAccount(
- data.username,
- domain,
- data.email,
- );
-
- if (!account) {
- unlisten();
- setIsLoading(false);
-
- authWindow.close();
-
- return toast.error("Failed to create new account, try again later");
- }
-
- unlisten();
- authWindow.close();
-
- // add account to storage
- await storage.createSetting("nsecbunker", "1");
- const newAccount = await storage.createAccount({
- pubkey: account,
- privkey: localSigner.privateKey,
- });
- ark.account = newAccount;
-
- // get final signer with newly created account
- const finalSigner = new NDKNip46Signer(bunker, account, localSigner);
- await finalSigner.blockUntilReady();
-
- // update main ndk instance signer
- ark.updateNostrSigner({ signer: finalSigner });
-
- // remove default nsecbunker profile and contact list
- // await ark.createEvent({ kind: NDKKind.Metadata, content: "", tags: [] });
- await ark.createEvent({ kind: NDKKind.Contacts, content: "", tags: [] });
-
- setIsLoading(false);
- setOnboarding({ open: true, newUser: true });
-
- return navigate("/auth/onboarding", { replace: true });
- } catch (e) {
- setIsLoading(false);
- toast.error(String(e));
- }
- };
-
- return (
-
-
-
-
- {t("signupWithProvider.title")}
-
-
- {!services ? (
-
-
-
- ) : (
-
- )}
-
-
- );
-}
diff --git a/apps/desktop/src/routes/auth/create-keys.tsx b/apps/desktop/src/routes/auth/create-keys.tsx
deleted file mode 100644
index b0bd4358..00000000
--- a/apps/desktop/src/routes/auth/create-keys.tsx
+++ /dev/null
@@ -1,187 +0,0 @@
-import { useArk } from "@lume/ark";
-import { CheckIcon, EyeOffIcon, EyeOnIcon, LoaderIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { onboardingAtom } from "@lume/utils";
-import { NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
-import * as Checkbox from "@radix-ui/react-checkbox";
-import { desktopDir } from "@tauri-apps/api/path";
-import { save } from "@tauri-apps/plugin-dialog";
-import { writeTextFile } from "@tauri-apps/plugin-fs";
-import { useSetAtom } from "jotai";
-import { nanoid } from "nanoid";
-import { getPublicKey, nip19 } from "nostr-tools";
-import { useEffect, useState } from "react";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-import { toast } from "sonner";
-
-export function CreateAccountKeys() {
- const ark = useArk();
- const storage = useStorage();
- const setOnboarding = useSetAtom(onboardingAtom);
- const navigate = useNavigate();
-
- const [t] = useTranslation();
- const [key, setKey] = useState("");
- const [loading, setLoading] = useState(false);
- const [showKey, setShowKey] = useState(false);
- const [confirm, setConfirm] = useState({ c1: false, c2: false, c3: false });
-
- const submit = async () => {
- try {
- setLoading(true);
-
- const privkey = nip19.decode(key).data as string;
- const signer = new NDKPrivateKeySigner(privkey);
- const pubkey = getPublicKey(privkey);
-
- ark.updateNostrSigner({ signer });
-
- const downloadPath = await desktopDir();
- const fileName = `nostr_keys_${nanoid(4)}.txt`;
- const filePath = await save({
- defaultPath: `${downloadPath}/${fileName}`,
- });
-
- if (!filePath) {
- return toast.info("You need to save account keys before continue.");
- }
-
- await writeTextFile(
- filePath,
- `Nostr Account\nGenerated by Lume (lume.nu)\n---\nPrivate key: ${key}`,
- );
-
- const newAccount = await storage.createAccount({
- pubkey: pubkey,
- privkey: privkey,
- });
- ark.account = newAccount;
-
- setLoading(false);
- setOnboarding({ open: true, newUser: true });
-
- return navigate("/auth/onboarding", { replace: true });
- } catch (e) {
- setLoading(false);
- toast.error(String(e));
- }
- };
-
- useEffect(() => {
- const privkey = NDKPrivateKeySigner.generate().privateKey;
- setKey(nip19.nsecEncode(privkey));
- }, []);
-
- return (
-
-
-
-
- {t("signupWithSelfManage.title")}
-
-
- {t("signupWithSelfManage.subtitle")}
-
-
-
-
-
-
- setShowKey((state) => !state)}
- className="absolute right-2 top-2 size-10 inline-flex items-center justify-center rounded-lg text-white bg-neutral-800 hover:bg-neutral-700"
- >
- {showKey ? (
-
- ) : (
-
- )}
-
-
-
-
-
- setConfirm((state) => ({ ...state, c1: !state.c1 }))
- }
- className="flex size-7 appearance-none items-center justify-center rounded-lg bg-neutral-900 outline-none"
- id="confirm1"
- >
-
-
-
-
-
- {t("signupWithSelfManage.confirm1")}
-
-
-
-
- setConfirm((state) => ({ ...state, c2: !state.c2 }))
- }
- className="flex size-7 appearance-none items-center justify-center rounded-lg bg-neutral-900 outline-none"
- id="confirm2"
- >
-
-
-
-
-
- {t("signupWithSelfManage.confirm2")}
-
-
-
-
- setConfirm((state) => ({ ...state, c3: !state.c3 }))
- }
- className="flex size-7 appearance-none items-center justify-center rounded-lg bg-neutral-900 outline-none"
- id="confirm3"
- >
-
-
-
-
-
- {t("signupWithSelfManage.confirm3")}
-
-
-
-
-
- {loading ? (
-
- ) : (
- t("signupWithSelfManage.button")
- )}
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/auth/create.tsx b/apps/desktop/src/routes/auth/create.tsx
deleted file mode 100644
index 5623022e..00000000
--- a/apps/desktop/src/routes/auth/create.tsx
+++ /dev/null
@@ -1,109 +0,0 @@
-import { LoaderIcon } from "@lume/icons";
-import { cn } from "@lume/utils";
-import { useState } from "react";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-
-export function CreateAccountScreen() {
- const navigate = useNavigate();
-
- const [t] = useTranslation();
- const [method, setMethod] = useState<"self" | "managed">("self");
- const [loading, setLoading] = useState(false);
-
- const next = () => {
- setLoading(true);
-
- if (method === "self") {
- navigate("/auth/create-keys");
- } else {
- navigate("/auth/create-address");
- }
- };
-
- return (
-
-
-
-
{t("signup.title")}
-
- {t("signup.subtitle")}
-
-
-
-
setMethod("self")}
- className={cn(
- "flex flex-col items-start px-4 py-3.5 bg-neutral-900 rounded-xl hover:bg-neutral-800",
- method === "self"
- ? "ring-1 ring-offset-4 ring-offset-black ring-blue-500"
- : "",
- )}
- >
- {t("signup.selfManageMethod")}
-
- {t("signup.selfManageMethodDescription")}
-
-
-
setMethod("managed")}
- className={cn(
- "flex flex-col items-start px-4 py-3.5 bg-neutral-900 rounded-xl hover:bg-neutral-800",
- method === "managed"
- ? "ring-1 ring-offset-4 ring-offset-black ring-blue-500"
- : "",
- )}
- >
-
-
{t("signup.providerMethod")}
-
- Beta
-
-
-
- {t("signup.providerMethodDescription")}
-
-
-
-
- {loading ? (
-
- ) : (
- t("global.continue")
- )}
-
- {method === "managed" ? (
-
-
- Attention:
-
-
- You're chosing Managed by Provider, this feature still in
- "Beta".
-
-
- Some functions still missing or not work as expected, you
- shouldn't create your main account with this method
-
-
- Learn more
-
-
- ) : null}
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/auth/login-key.tsx b/apps/desktop/src/routes/auth/login-key.tsx
deleted file mode 100644
index 7de52444..00000000
--- a/apps/desktop/src/routes/auth/login-key.tsx
+++ /dev/null
@@ -1,122 +0,0 @@
-import { useArk } from "@lume/ark";
-import { EyeOffIcon, EyeOnIcon, LoaderIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { getPublicKey, nip19 } from "nostr-tools";
-import { useState } from "react";
-import { useForm } from "react-hook-form";
-import { Trans, useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-import { toast } from "sonner";
-
-export function LoginWithKey() {
- const ark = useArk();
- const storage = useStorage();
- const navigate = useNavigate();
-
- const [showKey, setShowKey] = useState(false);
- const [loading, setLoading] = useState(false);
-
- const { t } = useTranslation("loginWithPrivkey.subtitle");
- const {
- register,
- handleSubmit,
- setError,
- formState: { errors, isValid },
- } = useForm();
-
- const onSubmit = async (data: { nsec: string }) => {
- try {
- if (!data.nsec.startsWith("nsec1"))
- return toast.error("You need to enter a private key start with nsec1");
-
- setLoading(true);
-
- const privkey = nip19.decode(data.nsec).data as string;
- const pubkey = getPublicKey(privkey);
-
- const account = await storage.createAccount({
- pubkey: pubkey,
- privkey: privkey,
- });
- ark.account = account;
-
- return navigate("/auth/onboarding", { replace: true });
- } catch (e) {
- setLoading(false);
- setError("nsec", {
- type: "manual",
- message: String(e),
- });
- }
- };
-
- return (
-
-
-
-
- {t("loginWithPrivkey.title")}
-
-
-
- Lume will put your private key to{" "}
-
- {storage.platform === "macos"
- ? "Apple Keychain"
- : storage.platform === "windows"
- ? "Credential Manager"
- : "Secret Service"}
-
- . It will be secured by your OS.
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/auth/login-nsecbunker.tsx b/apps/desktop/src/routes/auth/login-nsecbunker.tsx
deleted file mode 100644
index fb38b39d..00000000
--- a/apps/desktop/src/routes/auth/login-nsecbunker.tsx
+++ /dev/null
@@ -1,114 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import NDK, { NDKNip46Signer, NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
-import { nip19 } from "nostr-tools";
-import { useState } from "react";
-import { useForm } from "react-hook-form";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-import { toast } from "sonner";
-
-export function LoginWithNsecbunker() {
- const ark = useArk();
- const storage = useStorage();
- const navigate = useNavigate();
-
- const [loading, setLoading] = useState(false);
-
- const { t } = useTranslation();
- const {
- register,
- handleSubmit,
- setError,
- formState: { errors, isValid },
- } = useForm();
-
- const onSubmit = async (data: { npub: string }) => {
- try {
- if (!data.npub.startsWith("npub1"))
- return toast.info("You need to enter a token start with npub1");
-
- if (!data.npub.includes("#"))
- return toast.info("Token must include #secret");
-
- setLoading(true);
-
- const bunker = new NDK({
- explicitRelayUrls: [
- "wss://relay.nsecbunker.com",
- "wss://nostr.vulpem.com",
- ],
- });
- await bunker.connect(2000);
-
- const pubkey = nip19.decode(data.npub.split("#")[0]).data as string;
- const localSigner = NDKPrivateKeySigner.generate();
- const remoteSigner = new NDKNip46Signer(bunker, data.npub, localSigner);
- await remoteSigner.blockUntilReady();
-
- ark.updateNostrSigner({ signer: remoteSigner });
-
- await storage.createSetting("nsecbunker", "1");
- const account = await storage.createAccount({
- pubkey: pubkey,
- privkey: localSigner.privateKey,
- });
- ark.account = account;
-
- return navigate("/auth/onboarding", { replace: true });
- } catch (e) {
- setLoading(false);
- setError("npub", {
- type: "manual",
- message: String(e),
- });
- }
- };
-
- return (
-
-
-
-
- {t("loginWithBunker.title")}
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/auth/login-oauth.tsx b/apps/desktop/src/routes/auth/login-oauth.tsx
deleted file mode 100644
index 60981a82..00000000
--- a/apps/desktop/src/routes/auth/login-oauth.tsx
+++ /dev/null
@@ -1,176 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { NIP05 } from "@lume/types";
-import NDK, { NDKNip46Signer, NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
-import { Window } from "@tauri-apps/api/window";
-import { fetch } from "@tauri-apps/plugin-http";
-import { useState } from "react";
-import { useForm } from "react-hook-form";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-import { toast } from "sonner";
-
-const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
-
-export function LoginWithOAuth() {
- const ark = useArk();
- const storage = useStorage();
- const navigate = useNavigate();
-
- const [loading, setLoading] = useState(false);
-
- const { t } = useTranslation();
- const {
- register,
- handleSubmit,
- setError,
- formState: { errors, isValid },
- } = useForm();
-
- const onSubmit = async (data: { nip05: string }) => {
- try {
- setLoading(true);
-
- if (!emailRegex.test(data.nip05)) {
- setLoading(false);
- return toast.error(
- "Cannot verify your NIP-05 address, please try again later.",
- );
- }
-
- const localPath = data.nip05.split("@")[0];
- const service = data.nip05.split("@")[1];
-
- const verifyURL = `https://${service}/.well-known/nostr.json?name=${localPath}`;
-
- const req = await fetch(verifyURL, {
- method: "GET",
- headers: {
- "Content-Type": "application/json; charset=utf-8",
- },
- });
-
- if (!req.ok) {
- setLoading(false);
- return toast.error(
- "Cannot verify your NIP-05 address, please try again later.",
- );
- }
-
- const res: NIP05 = await req.json();
-
- if (!res.names[localPath.toLowerCase()] || !res.names[localPath]) {
- setLoading(false);
- return toast.error(
- "Cannot verify your NIP-05 address, please try again later.",
- );
- }
-
- const pubkey =
- (res.names[localPath] as string) ||
- (res.names[localPath.toLowerCase()] as string);
-
- if (!res.nip46[pubkey]) {
- setLoading(false);
- return toast.error("Cannot found NIP-46 with this address");
- }
-
- const nip46Relays = res.nip46[pubkey] as unknown as string[];
-
- const bunker = new NDK({
- explicitRelayUrls: nip46Relays || [
- "wss://relay.nsecbunker.com",
- "wss://nostr.vulpem.com",
- ],
- });
- await bunker.connect(2000);
-
- const localSigner = NDKPrivateKeySigner.generate();
- const remoteSigner = new NDKNip46Signer(bunker, pubkey, localSigner);
-
- // handle auth url request
- let authWindow: Window;
- remoteSigner.addListener("authUrl", (authUrl: string) => {
- authWindow = new Window(`auth-${pubkey}`, {
- url: authUrl,
- title: "Login",
- titleBarStyle: "overlay",
- width: 415,
- height: 600,
- center: true,
- closable: false,
- });
- });
-
- const remoteUser = await remoteSigner.blockUntilReady();
-
- if (remoteUser) {
- authWindow.close();
-
- ark.updateNostrSigner({ signer: remoteSigner });
-
- await storage.createSetting("nsecbunker", "1");
- const account = await storage.createAccount({
- pubkey,
- privkey: localSigner.privateKey,
- });
- ark.account = account;
-
- return navigate("/auth/onboarding", { replace: true });
- }
- } catch (e) {
- setLoading(false);
- setError("nip05", {
- type: "manual",
- message: String(e),
- });
- }
- };
-
- return (
-
-
-
-
- {t("loginWithAddress.title")}
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/auth/login.tsx b/apps/desktop/src/routes/auth/login.tsx
deleted file mode 100644
index a08c9c84..00000000
--- a/apps/desktop/src/routes/auth/login.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-
-export function LoginScreen() {
- const { t } = useTranslation();
-
- return (
-
-
-
-
{t("login.title")}
-
-
-
-
- {t("login.loginWithAddress")}
-
-
- {t("login.loginWithBunker")}
-
-
-
-
-
-
-
- {t("login.or")}
-
-
-
-
-
- {t("login.loginWithPrivkey")}
-
-
- {t("login.footer")}
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/auth/onboarding.tsx b/apps/desktop/src/routes/auth/onboarding.tsx
deleted file mode 100644
index d6e8ca00..00000000
--- a/apps/desktop/src/routes/auth/onboarding.tsx
+++ /dev/null
@@ -1,198 +0,0 @@
-import { useArk } from "@lume/ark";
-import { InfoIcon, LoaderIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { TranslateRegisterModal } from "@lume/ui";
-import * as Switch from "@radix-ui/react-switch";
-import {
- isPermissionGranted,
- requestPermission,
-} from "@tauri-apps/plugin-notification";
-import { useEffect, useState } from "react";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-import { toast } from "sonner";
-
-export function OnboardingScreen() {
- const ark = useArk();
- const storage = useStorage();
- const navigate = useNavigate();
-
- const [t] = useTranslation();
- const [loading, setLoading] = useState(false);
- const [apiKey, setAPIKey] = useState("");
- const [settings, setSettings] = useState({
- notification: false,
- lowPower: false,
- translation: false,
- });
-
- const toggleLowPower = async () => {
- await storage.createSetting("lowPower", String(+!settings.lowPower));
- setSettings((state) => ({ ...state, lowPower: !settings.lowPower }));
- };
-
- const toggleTranslation = async () => {
- await storage.createSetting("translation", String(+!settings.translation));
- setSettings((state) => ({ ...state, translation: !settings.translation }));
- };
-
- const toggleNofitication = async () => {
- await requestPermission();
- setSettings((state) => ({
- ...state,
- notification: !settings.notification,
- }));
- };
-
- const completeAuth = async () => {
- if (settings.translation) {
- if (!apiKey.length)
- return toast.warning(
- "You need to provide Translate API if enable translation",
- );
-
- await storage.createSetting("translateApiKey", apiKey);
- }
-
- setLoading(true);
-
- // get account contacts
- await ark.getUserContacts();
-
- navigate("/", { replace: true });
- };
-
- useEffect(() => {
- async function loadSettings() {
- // get notification permission
- const permissionGranted = await isPermissionGranted();
- setSettings((prev) => ({ ...prev, notification: permissionGranted }));
-
- // get other settings
- const data = await storage.getAllSettings();
- for (const item of data) {
- if (item.key === "lowPower")
- setSettings((prev) => ({
- ...prev,
- lowPower: !!parseInt(item.value),
- }));
-
- if (item.key === "translation")
- setSettings((prev) => ({
- ...prev,
- translation: !!parseInt(item.value),
- }));
- }
- }
-
- loadSettings();
- }, []);
-
- return (
-
-
-
-
- {t("onboardingSettings.title")}
-
-
- {t("onboardingSettings.subtitle")}
-
-
-
-
-
toggleNofitication()}
- className="relative mt-1 h-7 w-12 shrink-0 cursor-default rounded-full outline-none data-[state=checked]:bg-blue-500 bg-neutral-800"
- >
-
-
-
-
- {t("onboardingSettings.notification.title")}
-
-
- {t("onboardingSettings.notification.subtitle")}
-
-
-
-
-
toggleLowPower()}
- className="relative mt-1 h-7 w-12 shrink-0 cursor-default rounded-full outline-none data-[state=checked]:bg-blue-500 bg-neutral-800"
- >
-
-
-
-
- {t("onboardingSettings.lowPower.title")}
-
-
- {t("onboardingSettings.lowPower.subtitle")}
-
-
-
-
-
toggleTranslation()}
- className="relative mt-1 h-7 w-12 shrink-0 cursor-default rounded-full outline-none data-[state=checked]:bg-blue-500 bg-neutral-800"
- >
-
-
-
-
- {t("onboardingSettings.translation.title")}
-
-
- {t("onboardingSettings.translation.subtitle")}
-
-
-
- {settings.translation ? (
-
-
Translate API Key
-
setAPIKey(e.target.value)}
- className="w-full text-xl border-transparent outline-none focus:outline-none focus:ring-0 focus:border-none h-11 rounded-lg ring-0 placeholder:text-neutral-600 bg-neutral-900"
- />
-
-
-
-
-
- Don't have an API key?
-
-
-
-
-
-
- ) : null}
-
-
-
{t("onboardingSettings.footer")}
-
-
- {loading ? (
-
- ) : (
- t("global.continue")
- )}
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/auth/welcome.tsx b/apps/desktop/src/routes/auth/welcome.tsx
deleted file mode 100644
index 2ca0437a..00000000
--- a/apps/desktop/src/routes/auth/welcome.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-
-export function WelcomeScreen() {
- const { t } = useTranslation();
-
- return (
-
-
-
-
-
-
- {t("welcome.title")}
-
-
-
-
- {t("welcome.signup")}
-
-
- {t("welcome.login")}
-
-
-
-
-
- {t("welcome.footer")}{" "}
-
- here
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/depot/components/contact.tsx b/apps/desktop/src/routes/depot/components/contact.tsx
deleted file mode 100644
index eee12604..00000000
--- a/apps/desktop/src/routes/depot/components/contact.tsx
+++ /dev/null
@@ -1,72 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon, RunIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { User } from "@lume/ui";
-import { NDKKind } from "@nostr-dev-kit/ndk";
-import { useState } from "react";
-import { toast } from "sonner";
-
-export function DepotContactCard() {
- const ark = useArk();
- const storage = useStorage();
-
- const [status, setStatus] = useState(false);
-
- const backupContact = async () => {
- try {
- setStatus(true);
-
- const event = await ark.getEventByFilter({
- filter: {
- authors: [ark.account.pubkey],
- kinds: [NDKKind.Contacts],
- },
- });
-
- // broadcast to depot
- const publish = await event.publish();
-
- if (publish) {
- setStatus(false);
- toast.success("Backup contact list successfully.");
- }
- } catch (e) {
- setStatus(false);
- toast.error(String(e));
- }
- };
-
- return (
-
-
-
- {ark.account.contacts?.slice(0, 8).map((item) => (
-
- ))}
- {ark.account.contacts?.length > 8 ? (
-
-
- +{ark.account.contacts?.length - 8}
-
-
- ) : null}
-
-
-
-
Contacts
-
- {status ? (
-
- ) : (
-
- )}
- Backup
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/depot/components/members.tsx b/apps/desktop/src/routes/depot/components/members.tsx
deleted file mode 100644
index d09802d8..00000000
--- a/apps/desktop/src/routes/depot/components/members.tsx
+++ /dev/null
@@ -1,151 +0,0 @@
-import { CancelIcon, PlusIcon, UserAddIcon, UserRemoveIcon } from "@lume/icons";
-import { User } from "@lume/ui";
-import * as Dialog from "@radix-ui/react-dialog";
-import { resolveResource, resolve } from "@tauri-apps/api/path";
-import { readTextFile, writeTextFile } from "@tauri-apps/plugin-fs";
-import { nip19 } from "nostr-tools";
-import { useEffect, useState } from "react";
-import { parse, stringify } from "smol-toml";
-import { toast } from "sonner";
-import { VITE_FLATPAK_RESOURCE } from "@lume/utils";
-
-export function DepotMembers() {
- const [members, setMembers] = useState>(null);
- const [tmpMembers, setTmpMembers] = useState>([]);
- const [newMember, setNewMember] = useState("");
-
- const addMember = async () => {
- if (!newMember.startsWith("npub1"))
- return toast.error("You need to enter a valid npub");
-
- try {
- const pubkey = nip19.decode(newMember).data as string;
- setTmpMembers((prev) => [...prev, pubkey]);
- } catch (e) {
- console.error(e);
- }
- };
-
- const removeMember = (member: string) => {
- setTmpMembers((prev) => prev.filter((item) => item !== member));
- };
-
- const updateMembers = async () => {
- setMembers(new Set(tmpMembers));
-
- const defaultConfig = VITE_FLATPAK_RESOURCE !== null ? await resolve("/",VITE_FLATPAK_RESOURCE) : await resolveResource("resources/config.toml");
- const config = await readTextFile(defaultConfig);
- const configContent = parse(config);
-
- // biome-ignore lint/complexity/useLiteralKeys:
- configContent.authorization["pubkey_whitelist"] = [...members];
-
- const newConfig = stringify(configContent);
-
- return await writeTextFile(defaultConfig, newConfig);
- };
-
- useEffect(() => {
- async function loadConfig() {
- const defaultConfig = VITE_FLATPAK_RESOURCE !== null ? await resolve("/",VITE_FLATPAK_RESOURCE) : await resolveResource("resources/config.toml");
- const config = await readTextFile(defaultConfig);
- const configContent = parse(config);
- setTmpMembers(
- // biome-ignore lint/complexity/useLiteralKeys:
- Array.from(configContent.authorization["pubkey_whitelist"]),
- );
- }
-
- loadConfig();
- }, []);
-
- return (
-
-
-
-
Members
-
- Only allowed users can publish event to your Depot
-
-
-
-
- {tmpMembers.slice(0, 5).map((item) => (
-
- ))}
- {tmpMembers.length > 5 ? (
-
-
- +{tmpMembers.length}
-
-
- ) : null}
-
-
-
- Manage
-
-
-
-
-
-
-
-
-
- Manage member
-
-
-
- Update
-
-
-
-
-
-
-
-
-
setNewMember(e.target.value)}
- placeholder="npub1..."
- className="h-11 w-full rounded-lg border-transparent bg-neutral-100 pl-3 pr-20 placeholder:text-neutral-500 focus:border-blue-500 focus:ring focus:ring-blue-200 dark:bg-neutral-900 dark:placeholder:text-neutral-400 dark:focus:ring-blue-800"
- />
-
-
- Add
-
-
- {tmpMembers.map((member) => (
-
-
- removeMember(member)}
- className="hidden size-6 items-center justify-center rounded-md bg-neutral-200 group-hover:inline-flex hover:bg-red-200 dark:bg-neutral-800 dark:hover:bg-red-800 dark:hover:text-red-200"
- >
-
-
-
- ))}
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/depot/components/profile.tsx b/apps/desktop/src/routes/depot/components/profile.tsx
deleted file mode 100644
index a44c478a..00000000
--- a/apps/desktop/src/routes/depot/components/profile.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon, RunIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { User } from "@lume/ui";
-import { NDKKind } from "@nostr-dev-kit/ndk";
-import { useState } from "react";
-import { toast } from "sonner";
-
-export function DepotProfileCard() {
- const ark = useArk();
- const storage = useStorage();
-
- const [status, setStatus] = useState(false);
-
- const backupProfile = async () => {
- try {
- setStatus(true);
-
- const event = await ark.getEventByFilter({
- filter: {
- authors: [ark.account.pubkey],
- kinds: [NDKKind.Metadata],
- },
- });
-
- // broadcast to depot
- const publish = await event.publish();
-
- if (publish) {
- setStatus(false);
- toast.success("Backup profile successfully.");
- }
- } catch (e) {
- setStatus(false);
- toast.error(JSON.stringify(e));
- }
- };
-
- return (
-
-
-
-
-
-
Profile
-
- {status ? (
-
- ) : (
-
- )}
- Backup
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/depot/components/relays.tsx b/apps/desktop/src/routes/depot/components/relays.tsx
deleted file mode 100644
index 0ef3cdee..00000000
--- a/apps/desktop/src/routes/depot/components/relays.tsx
+++ /dev/null
@@ -1,75 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon, RunIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { NDKKind } from "@nostr-dev-kit/ndk";
-import { useEffect, useState } from "react";
-import { toast } from "sonner";
-
-export function DepotRelaysCard() {
- const ark = useArk();
- const storage = useStorage();
-
- const [status, setStatus] = useState(false);
- const [relaySize, setRelaySize] = useState(0);
-
- const backupRelays = async () => {
- try {
- setStatus(true);
-
- const event = await ark.getEventByFilter({
- filter: {
- authors: [ark.account.pubkey],
- kinds: [NDKKind.RelayList],
- },
- });
-
- // broadcast to depot
- const publish = await event.publish();
-
- if (publish) {
- setStatus(false);
- toast.success("Backup profile successfully.");
- }
- } catch (e) {
- setStatus(false);
- toast.error(JSON.stringify(e));
- }
- };
-
- useEffect(() => {
- async function loadRelays() {
- const event = await ark.getEventByFilter({
- filter: {
- authors: [ark.account.pubkey],
- kinds: [NDKKind.RelayList],
- },
- });
- if (event) setRelaySize(event.tags.length);
- }
-
- loadRelays();
- }, []);
-
- return (
-
-
-
-
Relay List
-
- {status ? (
-
- ) : (
-
- )}
- Backup
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/depot/index.tsx b/apps/desktop/src/routes/depot/index.tsx
deleted file mode 100644
index c9dac648..00000000
--- a/apps/desktop/src/routes/depot/index.tsx
+++ /dev/null
@@ -1,222 +0,0 @@
-import { useArk } from "@lume/ark";
-import { ChevronDownIcon, DepotIcon, GossipIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { NDKKind } from "@nostr-dev-kit/ndk";
-import * as Collapsible from "@radix-ui/react-collapsible";
-import { invoke } from "@tauri-apps/api/core";
-import { appConfigDir } from "@tauri-apps/api/path";
-import { useEffect, useState } from "react";
-import { toast } from "sonner";
-import { DepotContactCard } from "./components/contact";
-import { DepotMembers } from "./components/members";
-import { DepotProfileCard } from "./components/profile";
-import { DepotRelaysCard } from "./components/relays";
-
-export function DepotScreen() {
- const ark = useArk();
- const storage = useStorage();
-
- const [dataPath, setDataPath] = useState("");
- const [tunnelUrl, setTunnelUrl] = useState("");
-
- const openFolder = async () => {
- await invoke("show_in_folder", {
- path: `${dataPath}/nostr.db`,
- });
- };
-
- const updateRelayList = async () => {
- try {
- if (tunnelUrl.length < 1)
- return toast.info("Please enter a valid relay url");
- if (!tunnelUrl.startsWith("ws"))
- return toast.info("Please enter a valid relay url");
-
- const relayUrl = new URL(tunnelUrl.replace(/\s/g, ""));
- if (!/^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/.test(relayUrl.host)) return;
-
- const relayEvent = await ark.getEventByFilter({
- filter: {
- authors: [ark.account.pubkey],
- kinds: [NDKKind.RelayList],
- },
- });
-
- let publish: { id: string; seens: string[] };
-
- if (!relayEvent) {
- publish = await ark.createEvent({
- kind: NDKKind.RelayList,
- tags: [["r", tunnelUrl, ""]],
- });
- }
-
- const newTags = relayEvent.tags ?? [];
- newTags.push(["r", tunnelUrl, ""]);
-
- publish = await ark.createEvent({
- kind: NDKKind.RelayList,
- tags: newTags,
- });
-
- if (publish) {
- await storage.createSetting("tunnel_url", tunnelUrl);
- toast.success("Update relay list successfully.");
-
- setTunnelUrl("");
- }
- } catch (e) {
- console.error(e);
- toast.error("Error");
- }
- };
-
- useEffect(() => {
- async function loadConfig() {
- const appDir = await appConfigDir();
- setDataPath(appDir);
- }
-
- loadConfig();
- }, []);
-
- return (
-
-
-
-
-
-
Relay URL
-
- ws://localhost:6090
-
-
-
-
Database
-
-
nostr.db (SQLite)
-
- Open
-
-
-
-
-
-
-
-
- Actions
-
-
-
-
-
-
-
Expose
-
- Make your Depot visible in the Internet, everyone can connect
- into it.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Support Gossip Model (Recommended)
-
-
-
-
-
- By adding to Relay List, other Nostr Client which support
- Gossip Model will automatically connect to your Depot and
- improve the discoverability.
-
-
- setTunnelUrl(e.target.value)}
- spellCheck={false}
- placeholder="wss://"
- className="h-10 flex-1 rounded-lg border-transparent bg-neutral-100 px-3 placeholder:text-neutral-500 focus:border-blue-500 focus:ring focus:ring-blue-200 dark:bg-neutral-900 dark:placeholder:text-neutral-400 dark:focus:ring-blue-800"
- />
-
- Update
-
-
-
-
-
-
-
-
-
-
-
Backup (Recommended)
-
- Backup all your data to Depot, it always live on your machine.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/depot/onboarding.tsx b/apps/desktop/src/routes/depot/onboarding.tsx
deleted file mode 100644
index 95030d25..00000000
--- a/apps/desktop/src/routes/depot/onboarding.tsx
+++ /dev/null
@@ -1,101 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon } from "@lume/icons";
-import { delay, VITE_FLATPAK_RESOURCE } from "@lume/utils";
-import { resolve, resolveResource } from "@tauri-apps/api/path";
-import { useStorage } from "@lume/storage";
-import { readTextFile, writeTextFile } from "@tauri-apps/plugin-fs";
-import { useState } from "react";
-import { useNavigate } from "react-router-dom";
-import { parse, stringify } from "smol-toml";
-import { toast } from "sonner";
-
-export function DepotOnboardingScreen() {
- const ark = useArk();
- const storage = useStorage();
- const navigate = useNavigate();
-
- const [loading, setLoading] = useState(false);
-
- const launchDepot = async () => {
- try {
- setLoading(true);
-
- // get default config
- const defaultConfig =
- VITE_FLATPAK_RESOURCE !== null
- ? await resolve("/", VITE_FLATPAK_RESOURCE)
- : await resolveResource("resources/config.toml");
- const config = await readTextFile(defaultConfig);
- const parsedConfig = parse(config);
-
- // add current user to whitelist
- // biome-ignore lint/complexity/useLiteralKeys:
- parsedConfig.authorization["pubkey_whitelist"].push(ark.account.pubkey);
-
- // update new config
- const newConfig = stringify(parsedConfig);
- await writeTextFile(defaultConfig, newConfig);
-
- // launch depot
- await storage.launchDepot();
- await storage.createSetting("depot", "1");
- await delay(2000); // delay 2s to make sure depot is running
-
- // default depot url: ws://localhost:6090
- // #TODO: user can custom depot url
- const connect = await ark.connectDepot();
-
- if (connect) {
- toast.success("Your Depot is successfully launch.");
- setLoading(false);
-
- navigate("/depot/");
- }
- } catch (e) {
- toast.error(String(e));
- }
- };
-
- return (
-
-
-
-
- Run your Personal Nostr Relay inside Lume
-
- Your Relay, Your Control.
-
-
-
- {loading ? (
- <>
-
- Launching...
- >
- ) : (
- <>
-
-
-
- Launch
- >
- )}
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/error.tsx b/apps/desktop/src/routes/error.tsx
deleted file mode 100644
index 7ade36bb..00000000
--- a/apps/desktop/src/routes/error.tsx
+++ /dev/null
@@ -1,159 +0,0 @@
-import { useArk } from "@lume/ark";
-import { useStorage } from "@lume/storage";
-import { downloadDir } from "@tauri-apps/api/path";
-import { message, save } from "@tauri-apps/plugin-dialog";
-import { writeTextFile } from "@tauri-apps/plugin-fs";
-import { relaunch } from "@tauri-apps/plugin-process";
-import { useRouteError } from "react-router-dom";
-
-interface RouteError {
- statusText: string;
- message: string;
-}
-
-export function ErrorScreen() {
- const ark = useArk();
- const storage = useStorage();
- const error = useRouteError() as RouteError;
-
- const restart = async () => {
- await relaunch();
- };
-
- const download = async () => {
- try {
- const downloadPath = await downloadDir();
- const fileName = `nostr_keys_${new Date().toISOString()}.txt`;
- const filePath = await save({
- defaultPath: `${downloadPath}/${fileName}`,
- });
- const nsec = await storage.loadPrivkey(ark.account.pubkey);
-
- if (filePath) {
- if (nsec) {
- await writeTextFile(
- filePath,
- `Nostr account, generated by Lume (lume.nu)\nPublic key: ${ark.account.id}\nPrivate key: ${nsec}`,
- );
- } else {
- await writeTextFile(
- filePath,
- `Nostr account, generated by Lume (lume.nu)\nPublic key: ${ark.account.id}`,
- );
- }
- } // else { user cancel action }
- } catch (e) {
- await message(e, {
- title: "Cannot download account keys",
- type: "error",
- });
- }
- };
-
- return (
-
-
-
-
- Sorry, an unexpected error has occurred.
-
-
- Don't panic, your account is safe.
-
- Here are what things you can do:
-
-
-
-
-
- 1. Try to close and re-open the app
-
-
restart()}
- className="h-9 w-28 rounded-lg bg-blue-800 px-3 font-medium text-white hover:bg-blue-900"
- >
- Restart
-
-
-
-
- 2. Backup Nostr account
-
-
download()}
- className="h-9 w-28 rounded-lg bg-blue-800 px-3 font-medium text-white hover:bg-blue-900"
- >
- Download
-
-
-
-
-
-
-
- {error.statusText || error.message}
-
-
-
-
-
-
-
- 4. Use another Nostr client
-
-
-
- While waiting for Lume release the bug fixes, you always can
- use other Nostr clients with your account:
-
-
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/home/index.tsx b/apps/desktop/src/routes/home/index.tsx
deleted file mode 100644
index 17725662..00000000
--- a/apps/desktop/src/routes/home/index.tsx
+++ /dev/null
@@ -1,201 +0,0 @@
-import { Antenas } from "@columns/antenas";
-import { Default } from "@columns/default";
-import { ForYou } from "@columns/foryou";
-import { Global } from "@columns/global";
-import { Group } from "@columns/group";
-import { Hashtag } from "@columns/hashtag";
-import { Thread } from "@columns/thread";
-import { Timeline } from "@columns/timeline";
-import { TrendingNotes } from "@columns/trending-notes";
-import { User } from "@columns/user";
-import { Waifu } from "@columns/waifu";
-import { useColumnContext } from "@lume/ark";
-import {
- ArrowLeftIcon,
- ArrowRightIcon,
- PlusIcon,
- PlusSquareIcon,
-} from "@lume/icons";
-import { IColumn } from "@lume/types";
-import { TutorialModal } from "@lume/ui/src/tutorial/modal";
-import { COL_TYPES } from "@lume/utils";
-import * as Tooltip from "@radix-ui/react-tooltip";
-import { useState } from "react";
-import { useTranslation } from "react-i18next";
-import { VList } from "virtua";
-
-export function HomeScreen() {
- const { t } = useTranslation();
- const { columns, vlistRef, addColumn } = useColumnContext();
-
- const [selectedIndex, setSelectedIndex] = useState(-1);
-
- const renderItem = (column: IColumn) => {
- switch (column.kind) {
- case COL_TYPES.default:
- return ;
- case COL_TYPES.newsfeed:
- return ;
- case COL_TYPES.foryou:
- return ;
- case COL_TYPES.thread:
- return ;
- case COL_TYPES.user:
- return ;
- case COL_TYPES.hashtag:
- return ;
- case COL_TYPES.group:
- return ;
- case COL_TYPES.antenas:
- return ;
- case COL_TYPES.global:
- return ;
- case COL_TYPES.trendingNotes:
- return ;
- case COL_TYPES.waifu:
- return ;
- default:
- return ;
- }
- };
-
- return (
-
-
{
- if (!vlistRef.current) return;
- switch (e.code) {
- case "ArrowUp":
- case "ArrowLeft": {
- e.preventDefault();
- const prevIndex = Math.max(selectedIndex - 1, 0);
- setSelectedIndex(prevIndex);
- vlistRef.current.scrollToIndex(prevIndex, {
- align: "center",
- smooth: true,
- });
- break;
- }
- case "ArrowDown":
- case "ArrowRight": {
- e.preventDefault();
- const nextIndex = Math.min(selectedIndex + 1, columns.length - 1);
- setSelectedIndex(nextIndex);
- vlistRef.current.scrollToIndex(nextIndex, {
- align: "center",
- smooth: true,
- });
- break;
- }
- default:
- break;
- }
- }}
- >
- {columns.map((column) => renderItem(column))}
-
-
- await addColumn({
- kind: COL_TYPES.default,
- title: "",
- content: "",
- })
- }
- className="size-16 inline-flex items-center justify-center hover:bg-neutral-100 dark:hover:bg-neutral-900 rounded-2xl"
- >
-
-
-
-
-
-
-
-
-
- {
- const prevIndex = Math.max(selectedIndex - 1, 0);
- setSelectedIndex(prevIndex);
- vlistRef.current.scrollToIndex(prevIndex, {
- align: "center",
- smooth: true,
- });
- }}
- className="inline-flex items-center justify-center rounded-lg text-white/70 hover:text-white hover:bg-black/30 size-10"
- >
-
-
-
-
-
- {t("global.moveLeft")}
-
-
-
-
-
-
- {
- const nextIndex = Math.min(
- selectedIndex + 1,
- columns.length - 1,
- );
- setSelectedIndex(nextIndex);
- vlistRef.current.scrollToIndex(nextIndex, {
- align: "center",
- smooth: true,
- });
- }}
- className="inline-flex items-center justify-center rounded-lg text-white/70 hover:text-white hover:bg-black/30 size-10"
- >
-
-
-
-
-
- {t("global.moveRight")}
-
-
-
-
-
-
-
- await addColumn({
- kind: COL_TYPES.default,
- title: "",
- content: "",
- })
- }
- className="inline-flex items-center justify-center rounded-lg text-white/70 hover:text-white hover:bg-black/30 size-10"
- >
-
-
-
-
-
- {t("global.newColumn")}
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/relays/components/relayEventList.tsx b/apps/desktop/src/routes/relays/components/relayEventList.tsx
deleted file mode 100644
index bc637764..00000000
--- a/apps/desktop/src/routes/relays/components/relayEventList.tsx
+++ /dev/null
@@ -1,89 +0,0 @@
-import { NoteSkeleton, RepostNote, TextNote, useArk } from "@lume/ark";
-import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons";
-import { FETCH_LIMIT } from "@lume/utils";
-import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
-import { useInfiniteQuery } from "@tanstack/react-query";
-import { useCallback, useMemo } from "react";
-import { useTranslation } from "react-i18next";
-import { VList } from "virtua";
-
-export function RelayEventList({ relayUrl }: { relayUrl: string }) {
- const ark = useArk();
-
- const { t } = useTranslation();
- const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } =
- useInfiniteQuery({
- queryKey: ["relay-events", relayUrl],
- initialPageParam: 0,
- queryFn: async ({
- signal,
- pageParam,
- }: {
- signal: AbortSignal;
- pageParam: number;
- }) => {
- const url = `wss://${relayUrl}`;
- const events = await ark.getRelayEvents({
- relayUrl: url,
- filter: {
- kinds: [NDKKind.Text, NDKKind.Repost],
- },
- limit: FETCH_LIMIT,
- pageParam,
- signal,
- });
-
- return events;
- },
- getNextPageParam: (lastPage) => {
- const lastEvent = lastPage.at(-1);
- if (!lastEvent) return;
- return lastEvent.created_at - 1;
- },
- select: (data) => data?.pages.flatMap((page) => page),
- refetchOnWindowFocus: false,
- });
-
- const renderItem = useCallback(
- (event: NDKEvent) => {
- switch (event.kind) {
- case NDKKind.Text:
- return ;
- case NDKKind.Repost:
- return ;
- default:
- return ;
- }
- },
- [data],
- );
-
- return (
-
- {status === "pending" ? (
-
- ) : (
- data.map((item) => renderItem(item))
- )}
-
- {hasNextPage ? (
-
fetchNextPage()}
- disabled={!hasNextPage || isFetchingNextPage}
- className="inline-flex h-10 w-max items-center justify-center gap-2 rounded-full bg-blue-500 px-6 font-medium text-white hover:bg-blue-600 focus:outline-none"
- >
- {isFetchingNextPage ? (
-
- ) : (
- <>
-
- {t("global.loading")}
- >
- )}
-
- ) : null}
-
-
- );
-}
diff --git a/apps/desktop/src/routes/relays/components/relayForm.tsx b/apps/desktop/src/routes/relays/components/relayForm.tsx
deleted file mode 100644
index 27808861..00000000
--- a/apps/desktop/src/routes/relays/components/relayForm.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import { useRelaylist } from "@lume/ark";
-import { PlusIcon } from "@lume/icons";
-import { normalizeRelayUrl } from "nostr-fetch";
-import { useState } from "react";
-import { toast } from "sonner";
-
-export function RelayForm() {
- const { connectRelay } = useRelaylist();
-
- const [relay, setRelay] = useState<{
- url: WebSocket["url"];
- purpose: "read" | "write" | undefined;
- }>({ url: "", purpose: undefined });
-
- const create = () => {
- if (relay.url.length < 1) return toast.info("Please enter relay url");
- try {
- const relayUrl = new URL(relay.url.replace(/\s/g, ""));
-
- if (relayUrl.protocol === "wss:" || relayUrl.protocol === "ws:") {
- connectRelay.mutate(normalizeRelayUrl(relay.url));
- setRelay({ url: "", purpose: undefined });
- } else {
- return toast.error(
- "URL is invalid, a relay must use websocket protocol (start with wss:// or ws://). Please check again",
- );
- }
- } catch {
- return toast.error("Relay URL is not valid. Please check again");
- }
- };
-
- return (
-
-
setRelay((prev) => ({ ...prev, url: e.target.value }))}
- />
-
create()}
- className="inline-flex size-11 shrink-0 items-center justify-center rounded-lg bg-blue-500 text-white hover:bg-blue-600"
- >
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/relays/components/relayItem.tsx b/apps/desktop/src/routes/relays/components/relayItem.tsx
deleted file mode 100644
index 001c73a2..00000000
--- a/apps/desktop/src/routes/relays/components/relayItem.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { User, useRelaylist } from "@lume/ark";
-import { PlusIcon, SearchIcon } from "@lume/icons";
-import { normalizeRelayUrl } from "nostr-fetch";
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-
-export function RelayItem({ url, users }: { url: string; users?: string[] }) {
- const domain = new URL(url).hostname;
-
- const { t } = useTranslation();
- const { connectRelay } = useRelaylist();
-
- return (
-
-
-
- {t("global.relay")}:{" "}
-
-
- {url}
-
-
-
- {users ? (
-
- {users.slice(0, 4).map((item) => (
-
-
-
-
-
- ))}
- {users.length > 4 ? (
-
- +{users.length - 4}
-
- ) : null}
-
- ) : null}
-
-
- {t("global.inspect")}
-
-
connectRelay.mutate(normalizeRelayUrl(url))}
- className="inline-flex size-8 items-center justify-center rounded-lg bg-blue-100 text-blue-500 hover:bg-blue-200 dark:bg-blue-900 hover:dark:bg-blue-800"
- >
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/relays/components/sidebar.tsx b/apps/desktop/src/routes/relays/components/sidebar.tsx
deleted file mode 100644
index b92c2381..00000000
--- a/apps/desktop/src/routes/relays/components/sidebar.tsx
+++ /dev/null
@@ -1,111 +0,0 @@
-import { useArk, useRelaylist } from "@lume/ark";
-import { CancelIcon, LoaderIcon, RefreshIcon } from "@lume/icons";
-import { cn } from "@lume/utils";
-import { NDKKind, NDKSubscriptionCacheUsage } from "@nostr-dev-kit/ndk";
-import { useQuery } from "@tanstack/react-query";
-import { useTranslation } from "react-i18next";
-import { RelayForm } from "./relayForm";
-
-export function RelaySidebar({ className }: { className?: string }) {
- const ark = useArk();
-
- const { t } = useTranslation();
- const { removeRelay } = useRelaylist();
- const { status, data, isRefetching, refetch } = useQuery({
- queryKey: ["relay-personal"],
- queryFn: async () => {
- const event = await ark.getEventByFilter({
- filter: {
- kinds: [NDKKind.RelayList],
- authors: [ark.account.pubkey],
- },
- cache: NDKSubscriptionCacheUsage.ONLY_RELAY,
- });
- if (!event) return [];
- return event.tags.filter((tag) => tag[0] === "r");
- },
- refetchOnWindowFocus: false,
- refetchOnMount: false,
- refetchOnReconnect: false,
- staleTime: Infinity,
- });
-
- const currentRelays = new Set(
- ark.ndk.pool.connectedRelays().map((item) => item.url),
- );
-
- return (
-
-
-
{t("relays.sidebar.title")}
- refetch()}
- className="inline-flex items-center justify-center w-6 h-6 rounded-md shrink-0 hover:bg-neutral-100 dark:hover:bg-neutral-900"
- >
-
-
-
-
- {status === "pending" ? (
-
-
-
- ) : !data.length ? (
-
-
{t("relays.sidebar.empty")}
-
- ) : (
- data.map((item) => (
-
-
- {currentRelays.has(item[1]) ? (
-
-
-
-
- ) : (
-
-
-
-
- )}
-
- {item[1]
- .replace("wss://", "")
- .replace("ws://", "")
- .replace("/", "")}
-
-
-
- {item[2]?.length ? (
-
- {item[2]}
-
- ) : null}
-
removeRelay.mutate(item[1])}
- className="items-center justify-center hidden size-6 rounded group-hover:inline-flex hover:bg-neutral-300 dark:hover:bg-neutral-700"
- >
-
-
-
-
- ))
- )}
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/relays/follows.tsx b/apps/desktop/src/routes/relays/follows.tsx
deleted file mode 100644
index 6b1a31e4..00000000
--- a/apps/desktop/src/routes/relays/follows.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon } from "@lume/icons";
-import { useQuery } from "@tanstack/react-query";
-import { VList } from "virtua";
-import { RelayItem } from "./components/relayItem";
-
-export function RelayFollowsScreen() {
- const ark = useArk();
- const {
- isLoading,
- isError,
- data: relays,
- } = useQuery({
- queryKey: ["relay-follows"],
- queryFn: async ({ signal }: { signal: AbortSignal }) => {
- const data = await ark.getAllRelaysFromContacts({ signal });
- if (!data) throw new Error("Failed to get relay list from contacts");
- return data;
- },
- refetchOnMount: false,
- refetchOnWindowFocus: false,
- refetchOnReconnect: false,
- });
-
- if (isLoading) {
- return (
-
-
-
- );
- }
-
- if (isError || !relays) {
- return (
-
- );
- }
-
- return (
-
- {[...relays].map(([key, value]) => (
-
- ))}
-
- );
-}
diff --git a/apps/desktop/src/routes/relays/global.tsx b/apps/desktop/src/routes/relays/global.tsx
deleted file mode 100644
index dba51189..00000000
--- a/apps/desktop/src/routes/relays/global.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { LoaderIcon } from "@lume/icons";
-import { useQuery } from "@tanstack/react-query";
-import { fetch } from "@tauri-apps/plugin-http";
-import { VList } from "virtua";
-import { RelayItem } from "./components/relayItem";
-
-export function RelayGlobalScreen() {
- const { isLoading, data: relays } = useQuery({
- queryKey: ["relay-global"],
- queryFn: async ({ signal }: { signal: AbortSignal }) => {
- const res = await fetch("https://api.nostr.watch/v1/online", { signal });
- if (!res.ok) throw new Error("Failed to get online relays");
- return (await res.json()) as string[];
- },
- refetchOnMount: false,
- refetchOnWindowFocus: false,
- refetchOnReconnect: false,
- });
-
- if (isLoading) {
- return (
-
-
-
- );
- }
-
- return (
-
- {relays.map((item: string) => (
-
- ))}
-
- );
-}
diff --git a/apps/desktop/src/routes/relays/index.tsx b/apps/desktop/src/routes/relays/index.tsx
deleted file mode 100644
index 7e9a7af1..00000000
--- a/apps/desktop/src/routes/relays/index.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { cn } from "@lume/utils";
-import { useTranslation } from "react-i18next";
-import { NavLink, Outlet } from "react-router-dom";
-import { RelaySidebar } from "./components/sidebar";
-
-export function RelaysScreen() {
- const { t } = useTranslation();
-
- return (
-
-
-
-
-
- cn(
- "h-9 w-24 rounded-lg inline-flex items-center justify-center font-medium",
- isActive
- ? "bg-neutral-100 hover:bg-neutral-200 dark:bg-neutral-950 dark:hover:bg-neutral-900"
- : "",
- )
- }
- >
- {t("relays.global")}
-
-
- cn(
- "h-9 w-24 rounded-lg inline-flex items-center justify-center font-medium",
- isActive
- ? "bg-neutral-100 hover:bg-neutral-200 dark:bg-neutral-950 dark:hover:bg-neutral-900"
- : "",
- )
- }
- >
- {t("relays.follows")}
-
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/relays/url.tsx b/apps/desktop/src/routes/relays/url.tsx
deleted file mode 100644
index 7c5a7ee0..00000000
--- a/apps/desktop/src/routes/relays/url.tsx
+++ /dev/null
@@ -1,160 +0,0 @@
-import { LoaderIcon } from "@lume/icons";
-import { NIP11 } from "@lume/types";
-import { User } from "@lume/ui";
-import { Suspense } from "react";
-import { useTranslation } from "react-i18next";
-import { Await, useLoaderData, useParams } from "react-router-dom";
-import { RelayEventList } from "./components/relayEventList";
-
-export function RelayUrlScreen() {
- const { t } = useTranslation();
- const { url } = useParams();
-
- const data: { relay?: { [key: string]: string } } = useLoaderData();
-
- const getSoftwareName = (url: string) => {
- const filename = url.substring(url.lastIndexOf("/") + 1);
- return filename.replace(".git", "");
- };
-
- const titleCase = (s: string) => {
- return s
- .replace(/^[-_]*(.)/, (_, c) => c.toUpperCase())
- .replace(/[-_]+(.)/g, (_, c) => ` ${c.toUpperCase()}`);
- };
-
- return (
-
-
-
-
-
-
-
- {t("global.loading")}
-
- }
- >
-
- {t("relays.relayView.empty")}
-
- }
- >
- {(resolvedRelay: NIP11) => (
-
-
-
{resolvedRelay.name}
-
- {resolvedRelay.description}
-
-
- {resolvedRelay.pubkey ? (
-
-
- {t("relays.relayView.owner")}:
-
-
-
-
-
- ) : null}
- {resolvedRelay.contact ? (
-
- ) : null}
-
-
-
- {t("relays.relayView.nips")}:
-
-
- {resolvedRelay.supported_nips.map((item) => (
-
- {item}
-
- ))}
-
-
- {resolvedRelay.limitation ? (
-
-
- {t("relays.relayView.limit")}
-
-
- {Object.keys(resolvedRelay.limitation).map((key) => {
- return (
-
-
- {titleCase(key)}:
-
-
- {resolvedRelay.limitation[key].toString()}
-
-
- );
- })}
-
-
- ) : null}
- {resolvedRelay.payments_url ? (
-
- ) : null}
-
- )}
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/settings/about.tsx b/apps/desktop/src/routes/settings/about.tsx
deleted file mode 100644
index 5cbb23f5..00000000
--- a/apps/desktop/src/routes/settings/about.tsx
+++ /dev/null
@@ -1,75 +0,0 @@
-import { getVersion } from "@tauri-apps/api/app";
-import { relaunch } from "@tauri-apps/plugin-process";
-import { Update, check } from "@tauri-apps/plugin-updater";
-import { useEffect, useState } from "react";
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-import { toast } from "sonner";
-
-export function AboutScreen() {
- const [t] = useTranslation();
- const [version, setVersion] = useState("");
- const [newUpdate, setNewUpdate] = useState(null);
-
- const checkUpdate = async () => {
- const update = await check();
- if (!update) toast.info("There is no update available");
- setNewUpdate(update);
- };
-
- const installUpdate = async () => {
- await newUpdate.downloadAndInstall();
- await relaunch();
- };
-
- useEffect(() => {
- async function loadVersion() {
- const appVersion = await getVersion();
- setVersion(appVersion);
- }
-
- loadVersion();
- }, []);
-
- return (
-
-
-
Lume
-
- {t("settings.about.version")} {version}
-
-
-
- {!newUpdate ? (
- checkUpdate()}
- className="inline-flex h-9 w-full items-center justify-center rounded-lg bg-blue-500 text-sm font-medium text-white hover:bg-blue-600"
- >
- {t("settings.about.checkUpdate")}
-
- ) : (
- installUpdate()}
- className="inline-flex h-9 w-full items-center justify-center rounded-lg bg-blue-500 text-sm font-medium text-white hover:bg-blue-600"
- >
- {t("settings.about.installUpdate")} {newUpdate.version}
-
- )}
-
- Website
-
-
- Report a issue
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/settings/advanced.tsx b/apps/desktop/src/routes/settings/advanced.tsx
deleted file mode 100644
index 710189e4..00000000
--- a/apps/desktop/src/routes/settings/advanced.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { useStorage } from "@lume/storage";
-import { useTranslation } from "react-i18next";
-
-export function AdvancedSettingScreen() {
- const storage = useStorage();
- const { t } = useTranslation();
-
- const clearCache = async () => {
- await storage.clearCache();
- };
-
- return (
-
-
-
-
-
- {t("settings.advanced.cache.title")}
-
-
- {t("settings.advanced.cache.subtitle")}
-
-
-
clearCache()}
- className="h-8 w-max rounded-lg px-3 text-sm font-semibold text-blue-500 bg-blue-100 hover:bg-blue-200"
- >
- {t("settings.advanced.cache.button")}
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/settings/backup.tsx b/apps/desktop/src/routes/settings/backup.tsx
deleted file mode 100644
index aa095b44..00000000
--- a/apps/desktop/src/routes/settings/backup.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import { useArk } from "@lume/ark";
-import { EyeOffIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { nip19 } from "nostr-tools";
-import { useEffect, useState } from "react";
-import { useTranslation } from "react-i18next";
-
-export function BackupSettingScreen() {
- const ark = useArk();
- const storage = useStorage();
-
- const [t] = useTranslation();
- const [privkey, setPrivkey] = useState(null);
- const [showPassword, setShowPassword] = useState(false);
-
- const removePrivkey = async () => {
- await storage.removePrivkey(ark.account.pubkey);
- };
-
- useEffect(() => {
- async function loadPrivkey() {
- const key = await storage.loadPrivkey(ark.account.pubkey);
- if (key) setPrivkey(key);
- }
-
- loadPrivkey();
- }, []);
-
- return (
-
-
- {privkey ? (
-
-
- {t("settings.backup.privkey.title")}
-
-
-
- setShowPassword(!showPassword)}
- className="absolute right-1.5 top-1/2 inline-flex h-8 w-8 -translate-y-1/2 transform items-center justify-center rounded-lg bg-neutral-50 dark:bg-neutral-950"
- >
-
-
-
-
removePrivkey()}
- className="mt-2 inline-flex h-11 w-full items-center justify-center gap-2 rounded-lg bg-red-200 dark:bg-red-800 px-6 font-medium text-red-500 hover:bg-red-500 hover:text-white focus:outline-none dark:hover:text-white"
- >
- {t("settings.backup.privkey.button")}
-
-
- ) : null}
-
-
- );
-}
diff --git a/apps/desktop/src/routes/settings/components/avatarUpload.tsx b/apps/desktop/src/routes/settings/components/avatarUpload.tsx
deleted file mode 100644
index 601f43f6..00000000
--- a/apps/desktop/src/routes/settings/components/avatarUpload.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon } from "@lume/icons";
-import { useState } from "react";
-import { useTranslation } from "react-i18next";
-import { toast } from "sonner";
-
-export function AvatarUpload({ setPicture }) {
- const ark = useArk();
-
- const [t] = useTranslation();
- const [loading, setLoading] = useState(false);
-
- const upload = async () => {
- try {
- setLoading(true);
-
- // upload image to nostr.build server
- // #TODO: support multiple server
- const image = await ark.upload({ fileExts: [] });
-
- if (!image)
- toast.error("Failed to upload image, please try again later.");
-
- setPicture(image);
- setLoading(false);
- } catch (e) {
- setLoading(false);
- toast.error("Failed to upload image, please try again later.");
- }
- };
-
- return (
-
- {loading ? (
-
- ) : (
- t("user.avatarButton")
- )}
-
- );
-}
diff --git a/apps/desktop/src/routes/settings/components/coverUpload.tsx b/apps/desktop/src/routes/settings/components/coverUpload.tsx
deleted file mode 100644
index bdeb7868..00000000
--- a/apps/desktop/src/routes/settings/components/coverUpload.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon } from "@lume/icons";
-import { useState } from "react";
-import { useTranslation } from "react-i18next";
-import { toast } from "sonner";
-
-export function CoverUpload({ setBanner }) {
- const ark = useArk();
-
- const [t] = useTranslation();
- const [loading, setLoading] = useState(false);
-
- const upload = async () => {
- try {
- setLoading(true);
-
- // upload image to nostr.build server
- // #TODO: support multiple server
- const image = await ark.upload({ fileExts: [] });
-
- if (!image)
- toast.error("Failed to upload image, please try again later.");
-
- setBanner(image);
- setLoading(false);
- } catch (e) {
- setLoading(false);
- toast.error("Failed to upload image, please try again later.");
- }
- };
-
- return (
-
- {loading ? (
-
- ) : (
- t("user.coverButton")
- )}
-
- );
-}
diff --git a/apps/desktop/src/routes/settings/general.tsx b/apps/desktop/src/routes/settings/general.tsx
deleted file mode 100644
index c9b4d699..00000000
--- a/apps/desktop/src/routes/settings/general.tsx
+++ /dev/null
@@ -1,320 +0,0 @@
-import { DarkIcon, LightIcon, SystemModeIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { cn } from "@lume/utils";
-import * as Switch from "@radix-ui/react-switch";
-import { invoke } from "@tauri-apps/api/core";
-import { getCurrent } from "@tauri-apps/api/window";
-import { disable, enable, isEnabled } from "@tauri-apps/plugin-autostart";
-import {
- isPermissionGranted,
- requestPermission,
-} from "@tauri-apps/plugin-notification";
-import { useEffect, useState } from "react";
-import { useTranslation } from "react-i18next";
-
-export function GeneralSettingScreen() {
- const storage = useStorage();
-
- const [t] = useTranslation();
- const [apiKey, setAPIKey] = useState("");
- const [settings, setSettings] = useState({
- ...storage.settings,
- notification: false,
- autolaunch: false,
- appearance: "system",
- });
-
- const changeTheme = async (theme: "light" | "dark" | "auto") => {
- await invoke("plugin:theme|set_theme", { theme });
- // update state
- setSettings((prev) => ({ ...prev, appearance: theme }));
- };
-
- const toggleLowPower = async () => {
- await storage.createSetting("lowPower", String(+!settings.lowPower));
- setSettings((state) => ({ ...state, lowPower: !settings.lowPower }));
- };
-
- const toggleAutolaunch = async () => {
- if (!settings.autolaunch) {
- await enable();
- // update state
- setSettings((prev) => ({ ...prev, autolaunch: true }));
- } else {
- await disable();
- // update state
- setSettings((prev) => ({ ...prev, autolaunch: false }));
- }
- };
-
- const toggleMedia = async () => {
- await storage.createSetting("media", String(+!settings.media));
- storage.settings.media = !settings.media;
- // update state
- setSettings((prev) => ({ ...prev, media: !settings.media }));
- };
-
- const toggleHashtag = async () => {
- await storage.createSetting("hashtag", String(+!settings.hashtag));
- storage.settings.hashtag = !settings.hashtag;
- // update state
- setSettings((prev) => ({ ...prev, hashtag: !settings.hashtag }));
- };
-
- const toggleAutoupdate = async () => {
- await storage.createSetting("autoupdate", String(+!settings.autoupdate));
- storage.settings.autoupdate = !settings.autoupdate;
- // update state
- setSettings((prev) => ({ ...prev, autoupdate: !settings.autoupdate }));
- };
-
- const toggleNofitication = async () => {
- if (settings.notification) return;
-
- await requestPermission();
- // update state
- setSettings((prev) => ({ ...prev, notification: !settings.notification }));
- };
-
- const toggleTranslation = async () => {
- await storage.createSetting("translation", String(+!settings.translation));
- storage.settings.translation = !settings.translation;
- // update state
- setSettings((prev) => ({ ...prev, translation: !settings.translation }));
- };
-
- const saveApi = async () => {
- await storage.createSetting("translateApiKey", apiKey);
- };
-
- useEffect(() => {
- async function loadSettings() {
- const theme = await getCurrent().theme();
- setSettings((prev) => ({ ...prev, appearance: theme }));
-
- const autostart = await isEnabled();
- setSettings((prev) => ({ ...prev, autolaunch: autostart }));
-
- const permissionGranted = await isPermissionGranted();
- setSettings((prev) => ({ ...prev, notification: permissionGranted }));
- }
-
- loadSettings();
- }, []);
-
- return (
-
-
-
-
-
- {t("settings.general.update.title")}
-
-
- {t("settings.general.update.subtitle")}
-
-
-
toggleAutoupdate()}
- className="relative h-7 w-12 cursor-default rounded-full bg-neutral-200 outline-none data-[state=checked]:bg-blue-500 dark:bg-neutral-800"
- >
-
-
-
-
-
-
- {t("settings.general.lowPower.title")}
-
-
- {t("settings.general.lowPower.subtitle")}
-
-
-
toggleLowPower()}
- className="relative h-7 w-12 cursor-default rounded-full bg-neutral-200 outline-none data-[state=checked]:bg-blue-500 dark:bg-neutral-800"
- >
-
-
-
-
-
-
- {t("settings.general.startup.title")}
-
-
- {t("settings.general.startup.subtitle")}
-
-
-
toggleAutolaunch()}
- className="relative h-7 w-12 cursor-default rounded-full bg-neutral-200 outline-none data-[state=checked]:bg-blue-500 dark:bg-neutral-800"
- >
-
-
-
-
-
-
- {t("settings.general.media.title")}
-
-
- {t("settings.general.media.subtitle")}
-
-
-
toggleMedia()}
- className="relative h-7 w-12 cursor-default rounded-full bg-neutral-200 outline-none data-[state=checked]:bg-blue-500 dark:bg-neutral-800"
- >
-
-
-
-
-
-
- {t("settings.general.hashtag.title")}
-
-
- {t("settings.general.hashtag.subtitle")}
-
-
-
toggleHashtag()}
- className="relative h-7 w-12 cursor-default rounded-full bg-neutral-200 outline-none data-[state=checked]:bg-blue-500 dark:bg-neutral-800"
- >
-
-
-
-
-
-
- {t("settings.general.notification.title")}
-
-
- {t("settings.general.notification.subtitle")}
-
-
-
toggleNofitication()}
- className="relative h-7 w-12 cursor-default rounded-full bg-neutral-200 outline-none data-[state=checked]:bg-blue-500 dark:bg-neutral-800"
- >
-
-
-
-
-
-
- {t("settings.general.translation.title")}
-
-
- {t("settings.general.translation.subtitle")}
-
-
-
toggleTranslation()}
- className="relative h-7 w-12 cursor-default rounded-full bg-neutral-200 outline-none data-[state=checked]:bg-blue-500 dark:bg-neutral-800"
- >
-
-
-
- {settings.translation ? (
-
-
- {t("global.apiKey")}
-
-
-
setAPIKey(e.target.value)}
- className="w-full border-transparent outline-none focus:outline-none focus:ring-0 focus:border-none h-9 rounded-lg ring-0 placeholder:text-neutral-600 bg-neutral-100 dark:bg-neutral-900"
- />
-
-
- {t("global.save")}
-
-
-
-
- ) : null}
-
-
- {t("settings.general.appearance.title")}
-
-
-
changeTheme("light")}
- className="flex flex-col items-center justify-center gap-0.5"
- >
-
-
-
-
- {t("settings.general.appearance.light")}
-
-
-
changeTheme("dark")}
- className="flex flex-col items-center justify-center gap-0.5"
- >
-
-
-
-
- {t("settings.general.appearance.dark")}
-
-
-
changeTheme("auto")}
- className="flex flex-col items-center justify-center gap-0.5"
- >
-
-
-
-
- {t("settings.general.appearance.system")}
-
-
-
-
-
-
- );
-}
diff --git a/apps/desktop/src/routes/settings/nwc.tsx b/apps/desktop/src/routes/settings/nwc.tsx
deleted file mode 100644
index 114e8644..00000000
--- a/apps/desktop/src/routes/settings/nwc.tsx
+++ /dev/null
@@ -1,157 +0,0 @@
-import { useArk } from "@lume/ark";
-import { useStorage } from "@lume/storage";
-import * as Switch from "@radix-ui/react-switch";
-import { useEffect, useState } from "react";
-import { useTranslation } from "react-i18next";
-import { toast } from "sonner";
-
-export function NWCScreen() {
- const ark = useArk();
- const storage = useStorage();
-
- const [t] = useTranslation();
- const [settings, setSettings] = useState({
- nwc: false,
- instantZap: storage.settings.instantZap,
- });
- const [walletConnectURL, setWalletConnectURL] = useState(null);
- const [amount, setAmount] = useState("21");
-
- const saveNWC = async () => {
- try {
- if (!walletConnectURL.startsWith("nostr+walletconnect:")) {
- return toast.error(
- "Connect URI is required and must start with format nostr+walletconnect:, please check again",
- );
- }
-
- const uriObj = new URL(walletConnectURL);
- const params = new URLSearchParams(uriObj.search);
-
- if (params.has("relay") && params.has("secret")) {
- await storage.createPrivkey(
- `${ark.account.pubkey}.nwc`,
- walletConnectURL,
- );
-
- storage.nwc = walletConnectURL;
-
- setWalletConnectURL(walletConnectURL);
- setSettings((state) => ({ ...state, nwc: true }));
- } else {
- return toast.error("Connect URI is not valid, please check again");
- }
- } catch (e) {
- toast.error(String(e));
- }
- };
-
- const toggleInstantZap = async () => {
- await storage.createSetting("instantZap", String(+!settings.instantZap));
- setSettings((state) => ({ ...state, instantZap: !settings.instantZap }));
- };
-
- const saveAmount = async () => {
- await storage.createSetting("zapAmount", amount);
- };
-
- const remove = async () => {
- await storage.removePrivkey(`${ark.account.pubkey}.nwc`);
-
- setWalletConnectURL("");
- setSettings((state) => ({ ...state, nwc: false }));
- storage.nwc = null;
- };
-
- useEffect(() => {
- if (storage.nwc) {
- setSettings((state) => ({ ...state, nwc: true }));
- setWalletConnectURL(storage.nwc);
- }
- }, []);
-
- return (
-
-
-
-
-
- {t("settings.zap.nwc")}
-
-
-
-
-
- {settings.nwc ? (
- <>
-
-
-
- {t("settings.zap.instant.title")}
-
-
- {t("settings.zap.instant.subtitle")}
-
-
-
toggleInstantZap()}
- className="relative h-7 w-12 cursor-default rounded-full bg-neutral-200 outline-none data-[state=checked]:bg-blue-500 dark:bg-neutral-800"
- >
-
-
-
-
-
-
- {t("settings.zap.defaultAmount")}
-
-
-
setAmount(e.target.value)}
- className="w-full border-transparent outline-none focus:outline-none focus:ring-0 focus:border-none h-9 rounded-lg ring-0 placeholder:text-neutral-600 bg-neutral-100 dark:bg-neutral-900"
- />
-
-
- {t("global.save")}
-
-
-
-
-
- >
- ) : null}
-
-
- );
-}
diff --git a/apps/desktop/src/routes/settings/profile.tsx b/apps/desktop/src/routes/settings/profile.tsx
deleted file mode 100644
index 7a405e3f..00000000
--- a/apps/desktop/src/routes/settings/profile.tsx
+++ /dev/null
@@ -1,248 +0,0 @@
-import { useArk } from "@lume/ark";
-import { CheckCircleIcon, LoaderIcon, UnverifiedIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { NDKKind, NDKUserProfile } from "@nostr-dev-kit/ndk";
-import { useQueryClient } from "@tanstack/react-query";
-import { useState } from "react";
-import { useForm } from "react-hook-form";
-import { useTranslation } from "react-i18next";
-import { toast } from "sonner";
-import { AvatarUpload } from "./components/avatarUpload";
-import { CoverUpload } from "./components/coverUpload";
-
-export function ProfileSettingScreen() {
- const ark = useArk();
- const storage = useStorage();
- const queryClient = useQueryClient();
-
- const [loading, setLoading] = useState(false);
- const [picture, setPicture] = useState("");
- const [banner, setBanner] = useState("");
- const [nip05, setNIP05] = useState({ verified: true, text: "" });
-
- const { t } = useTranslation();
- const {
- register,
- handleSubmit,
- setError,
- formState: { isValid, errors },
- } = useForm({
- defaultValues: async () => {
- const res: NDKUserProfile = queryClient.getQueryData([
- "user",
- ark.account.pubkey,
- ]);
- if (res.image) {
- setPicture(res.image);
- }
- if (res.banner) {
- setBanner(res.banner);
- }
- if (res.nip05) {
- setNIP05((prev) => ({ ...prev, text: res.nip05 }));
- }
- return res;
- },
- });
-
- const onSubmit = async (data: NDKUserProfile) => {
- // start loading
- setLoading(true);
-
- let content = {
- ...data,
- picture,
- banner,
- };
-
- if (data.nip05) {
- const verify = ark.validateNIP05({
- pubkey: ark.account.pubkey,
- nip05: data.nip05,
- });
-
- if (verify) {
- content = { ...content, nip05: data.nip05 };
- } else {
- setNIP05((prev) => ({ ...prev, verified: false }));
- setError("nip05", {
- type: "manual",
- message: "Can't verify your NIP-05, please check again",
- });
- }
- }
-
- const publish = await ark.createEvent({
- kind: NDKKind.Metadata,
- tags: [],
- content: JSON.stringify(content),
- });
-
- if (publish) {
- // invalid cache
- await storage.clearProfileCache(ark.account.pubkey);
- await queryClient.setQueryData(["user", ark.account.pubkey], () => {
- return content;
- });
-
- // notify
- toast.success("You've updated profile successfully.");
-
- // reset state
- setPicture(null);
- setBanner(null);
- }
-
- setLoading(false);
- };
-
- return (
-
- );
-}
diff --git a/apps/desktop/tailwind.config.js b/apps/desktop/tailwind.config.js
deleted file mode 100644
index 45f371ba..00000000
--- a/apps/desktop/tailwind.config.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import sharedConfig from "@lume/tailwindcss";
-
-const config = {
- content: [
- "./src/**/*.{js,ts,jsx,tsx}",
- "../../packages/@columns/**/*{.js,.ts,.jsx,.tsx}",
- "../../packages/ark/**/*{.js,.ts,.jsx,.tsx}",
- "../../packages/ui/**/*{.js,.ts,.jsx,.tsx}",
- "index.html",
- ],
- presets: [sharedConfig],
-};
-
-export default config;
diff --git a/apps/desktop/tsconfig.json b/apps/desktop/tsconfig.json
deleted file mode 100644
index 34a32891..00000000
--- a/apps/desktop/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "extends": "@lume/tsconfig/base.json",
- "compilerOptions": {
- "outDir": "dist"
- },
- "include": ["src"],
- "exclude": ["node_modules", "dist"]
-}
diff --git a/apps/desktop/vite.config.ts b/apps/desktop/vite.config.ts
deleted file mode 100644
index d0be4dc5..00000000
--- a/apps/desktop/vite.config.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import react from "@vitejs/plugin-react-swc";
-import million from "million/compiler";
-import { defineConfig } from "vite";
-import topLevelAwait from "vite-plugin-top-level-await";
-import viteTsconfigPaths from "vite-tsconfig-paths";
-
-export default defineConfig({
- plugins: [
- million.vite({
- auto: {
- threshold: 0.05,
- },
- mute: true,
- }),
- react(),
- viteTsconfigPaths(),
- topLevelAwait({
- // The export name of top-level await promise for each chunk module
- promiseExportName: "__tla",
- // The function to generate import names of top-level await promise in each chunk module
- promiseImportName: (i) => `__tla_${i}`,
- }),
- ],
- envPrefix: ["VITE_", "TAURI_"],
- build: {
- target: process.env.TAURI_PLATFORM === "windows" ? "chrome105" : "safari13",
- minify: !process.env.TAURI_DEBUG ? "esbuild" : false,
- sourcemap: !!process.env.TAURI_DEBUG,
- outDir: "../../dist",
- },
- server: {
- strictPort: true,
- port: 3000,
- },
- clearScreen: false,
-});
diff --git a/apps/desktop2/.gitignore b/apps/desktop2/.gitignore
new file mode 100644
index 00000000..42a97193
--- /dev/null
+++ b/apps/desktop2/.gitignore
@@ -0,0 +1,26 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+src/router.gen.ts
diff --git a/apps/desktop2/index.html b/apps/desktop2/index.html
new file mode 100644
index 00000000..9f289e37
--- /dev/null
+++ b/apps/desktop2/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+ Lume Desktop
+
+
+
+
+
+
diff --git a/apps/desktop2/package.json b/apps/desktop2/package.json
new file mode 100644
index 00000000..71ba191b
--- /dev/null
+++ b/apps/desktop2/package.json
@@ -0,0 +1,52 @@
+{
+ "name": "@lume/desktop2",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@lume/ark": "workspace:^",
+ "@lume/icons": "workspace:^",
+ "@lume/ui": "workspace:^",
+ "@lume/utils": "workspace:^",
+ "@radix-ui/react-checkbox": "^1.0.4",
+ "@radix-ui/react-collapsible": "^1.0.3",
+ "@radix-ui/react-dropdown-menu": "^2.0.6",
+ "@radix-ui/react-popover": "^1.0.7",
+ "@tanstack/query-sync-storage-persister": "^5.24.1",
+ "@tanstack/react-query": "^5.24.1",
+ "@tanstack/react-query-persist-client": "^5.24.1",
+ "@tanstack/react-router": "^1.17.4",
+ "i18next": "^23.10.0",
+ "i18next-resources-to-backend": "^1.2.0",
+ "nostr-tools": "^2.3.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-i18next": "^14.0.5",
+ "slate": "^0.101.5",
+ "slate-react": "^0.101.6",
+ "sonner": "^1.4.2",
+ "virtua": "^0.27.5"
+ },
+ "devDependencies": {
+ "@lume/tailwindcss": "workspace:^",
+ "@lume/tsconfig": "workspace:^",
+ "@lume/types": "workspace:^",
+ "@tanstack/router-devtools": "^1.17.4",
+ "@tanstack/router-vite-plugin": "^1.16.5",
+ "@types/react": "^18.2.60",
+ "@types/react-dom": "^18.2.19",
+ "@vitejs/plugin-react-swc": "^3.6.0",
+ "autoprefixer": "^10.4.17",
+ "postcss": "^8.4.35",
+ "tailwindcss": "^3.4.1",
+ "typescript": "^5.3.3",
+ "vite": "^5.1.4",
+ "vite-plugin-top-level-await": "^1.4.1",
+ "vite-tsconfig-paths": "^4.3.1"
+ }
+}
diff --git a/apps/desktop2/postcss.config.cjs b/apps/desktop2/postcss.config.cjs
new file mode 100644
index 00000000..12a703d9
--- /dev/null
+++ b/apps/desktop2/postcss.config.cjs
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/src-tauri/bin/.keep b/apps/desktop2/public/.keep
similarity index 100%
rename from src-tauri/bin/.keep
rename to apps/desktop2/public/.keep
diff --git a/apps/desktop/public/heading.png b/apps/desktop2/public/heading-en.png
similarity index 100%
rename from apps/desktop/public/heading.png
rename to apps/desktop2/public/heading-en.png
diff --git a/apps/desktop/public/heading@2x.png b/apps/desktop2/public/heading-en@2x.png
similarity index 100%
rename from apps/desktop/public/heading@2x.png
rename to apps/desktop2/public/heading-en@2x.png
diff --git a/apps/desktop2/public/heading-fr.png b/apps/desktop2/public/heading-fr.png
new file mode 100644
index 00000000..9a1cf82a
Binary files /dev/null and b/apps/desktop2/public/heading-fr.png differ
diff --git a/apps/desktop2/public/heading-fr@2x.png b/apps/desktop2/public/heading-fr@2x.png
new file mode 100644
index 00000000..16bf43fd
Binary files /dev/null and b/apps/desktop2/public/heading-fr@2x.png differ
diff --git a/apps/desktop2/public/heading-ja.png b/apps/desktop2/public/heading-ja.png
new file mode 100644
index 00000000..19134a08
Binary files /dev/null and b/apps/desktop2/public/heading-ja.png differ
diff --git a/apps/desktop2/public/heading-ja@2x.png b/apps/desktop2/public/heading-ja@2x.png
new file mode 100644
index 00000000..606cb59c
Binary files /dev/null and b/apps/desktop2/public/heading-ja@2x.png differ
diff --git a/apps/desktop2/public/lock-screen.jpg b/apps/desktop2/public/lock-screen.jpg
new file mode 100644
index 00000000..d65317bd
Binary files /dev/null and b/apps/desktop2/public/lock-screen.jpg differ
diff --git a/apps/desktop2/public/lock-screen@2x.jpg b/apps/desktop2/public/lock-screen@2x.jpg
new file mode 100644
index 00000000..922f81ad
Binary files /dev/null and b/apps/desktop2/public/lock-screen@2x.jpg differ
diff --git a/apps/desktop/src/app.css b/apps/desktop2/src/app.css
similarity index 58%
rename from apps/desktop/src/app.css
rename to apps/desktop2/src/app.css
index 4c25b06a..4511c0a5 100644
--- a/apps/desktop/src/app.css
+++ b/apps/desktop2/src/app.css
@@ -2,22 +2,6 @@
@tailwind components;
@tailwind utilities;
-@layer utilities {
- .break-p {
- word-break: break-word;
- word-wrap: break-word;
- overflow-wrap: break-word;
- }
-
- .prose :where(iframe):not(:where([class~='not-prose'] *)) {
- @apply w-full h-auto mx-auto aspect-video;
- }
-
- .shadow-toolbar {
- box-shadow: 0 0 #0000, 0 0 #0000, 0 8px 24px 0 rgba(0, 0, 0, .2), 0 2px 8px 0 rgba(0, 0, 0, .08), inset 0 0 0 1px rgba(0, 0, 0, .2), inset 0 0 0 2px hsla(0, 0%, 100%, .14)
- }
-}
-
html {
font-size: 14px;
}
@@ -39,10 +23,24 @@ input::-ms-clear {
line-height: normal;
}
-.border {
- background-clip: padding-box;
-}
-
media-controller {
@apply w-full;
-}
\ No newline at end of file
+}
+
+@layer utilities {
+ .content-break {
+ word-break: break-word;
+ word-wrap: break-word;
+ overflow-wrap: break-word;
+ }
+
+ .shadow-toolbar {
+ box-shadow:
+ 0 0 #0000,
+ 0 0 #0000,
+ 0 8px 24px 0 rgba(0, 0, 0, 0.2),
+ 0 2px 8px 0 rgba(0, 0, 0, 0.08),
+ inset 0 0 0 1px rgba(0, 0, 0, 0.2),
+ inset 0 0 0 2px hsla(0, 0%, 100%, 0.14);
+ }
+}
diff --git a/apps/desktop2/src/app.tsx b/apps/desktop2/src/app.tsx
new file mode 100644
index 00000000..07b62724
--- /dev/null
+++ b/apps/desktop2/src/app.tsx
@@ -0,0 +1,81 @@
+import { useArk } from "@lume/ark";
+import { ArkProvider } from "./ark";
+import { QueryClient } from "@tanstack/react-query";
+import { RouterProvider, createRouter } from "@tanstack/react-router";
+import React, { StrictMode } from "react";
+import ReactDOM from "react-dom/client";
+import { I18nextProvider } from "react-i18next";
+import "./app.css";
+import i18n from "./locale";
+import { Toaster } from "sonner";
+import { locale, platform } from "@tauri-apps/plugin-os";
+import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client";
+import { createSyncStoragePersister } from "@tanstack/query-sync-storage-persister";
+import { routeTree } from "./router.gen"; // auto generated file
+
+const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: {
+ gcTime: 1000 * 60 * 60 * 24, // 24 hours
+ staleTime: 1000 * 60 * 5, // 5 minutes
+ },
+ },
+});
+
+const persister = createSyncStoragePersister({
+ storage: window.localStorage,
+});
+
+const platformName = await platform();
+const osLocale = (await locale()).slice(0, 2);
+
+// Set up a Router instance
+const router = createRouter({
+ routeTree,
+ context: {
+ ark: undefined!,
+ platform: platformName,
+ locale: osLocale,
+ queryClient,
+ },
+});
+
+// Register things for typesafety
+declare module "@tanstack/react-router" {
+ interface Register {
+ router: typeof router;
+ }
+}
+
+function InnerApp() {
+ const ark = useArk();
+ return ;
+}
+
+function App() {
+ return (
+
+
+
+ );
+}
+
+// biome-ignore lint/style/noNonNullAssertion: idk
+const rootElement = document.getElementById("root")!;
+
+if (!rootElement.innerHTML) {
+ const root = ReactDOM.createRoot(rootElement);
+ root.render(
+
+
+
+
+
+
+
+ ,
+ );
+}
diff --git a/apps/desktop2/src/ark.tsx b/apps/desktop2/src/ark.tsx
new file mode 100644
index 00000000..bb844efb
--- /dev/null
+++ b/apps/desktop2/src/ark.tsx
@@ -0,0 +1,7 @@
+import { Ark, ArkContext } from "@lume/ark";
+import { PropsWithChildren, useMemo } from "react";
+
+export const ArkProvider = ({ children }: PropsWithChildren) => {
+ const ark = useMemo(() => new Ark(), []);
+ return {children} ;
+};
diff --git a/apps/desktop2/src/components/accounts.tsx b/apps/desktop2/src/components/accounts.tsx
new file mode 100644
index 00000000..dbf134fd
--- /dev/null
+++ b/apps/desktop2/src/components/accounts.tsx
@@ -0,0 +1,158 @@
+import { useArk } from "@lume/ark";
+import { Account } from "@lume/types";
+import { User } from "@lume/ui";
+import { useNavigate, useParams, useSearch } from "@tanstack/react-router";
+import { useEffect, useState } from "react";
+import * as Popover from "@radix-ui/react-popover";
+import { Link } from "@tanstack/react-router";
+import { useTranslation } from "react-i18next";
+import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
+
+export function Accounts() {
+ const ark = useArk();
+ const params = useParams({ strict: false });
+
+ const [accounts, setAccounts] = useState(null);
+
+ useEffect(() => {
+ async function getAllAccounts() {
+ const data = await ark.get_all_accounts();
+ if (data) setAccounts(data);
+ }
+
+ getAllAccounts();
+ }, []);
+
+ return (
+
+ {accounts
+ ? accounts.map((account) =>
+ // @ts-ignore, useless
+ account.npub === params.account ? (
+
+ ) : (
+
+ ),
+ )
+ : null}
+
+ );
+}
+
+function Inactive({ pubkey }: { pubkey: string }) {
+ const ark = useArk();
+ const navigate = useNavigate();
+
+ const changeAccount = async (npub: string) => {
+ const select = await ark.load_selected_account(npub);
+ if (select) navigate({ to: "/$account/home", params: { account: npub } });
+ };
+
+ return (
+ changeAccount(pubkey)}>
+
+
+
+
+
+
+ );
+}
+
+function Active({ pubkey }: { pubkey: string }) {
+ const [open, setOpen] = useState(true);
+ // @ts-ignore, magic !!!
+ const { guest } = useSearch({ strict: false });
+ const { t } = useTranslation();
+
+ if (guest) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
You're using guest account
+
+ You can continue by claim and backup this account, or you can
+ import your own account key.
+
+
+
+
+ Claim & Backup
+
+
+ {t("welcome.login")}
+
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ Add account
+
+ ⌘+Shift+N
+
+
+
+ Profile
+
+ ⌘+Shift+P
+
+
+
+ Settings
+
+ ⌘+Shift+S
+
+
+
+ Logout
+
+ ⌘+Shift+L
+
+
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/components/repost.tsx b/apps/desktop2/src/components/repost.tsx
new file mode 100644
index 00000000..cca86d0f
--- /dev/null
+++ b/apps/desktop2/src/components/repost.tsx
@@ -0,0 +1,113 @@
+import { RepostIcon } from "@lume/icons";
+import { Event } from "@lume/types";
+import { cn } from "@lume/utils";
+import { useQuery } from "@tanstack/react-query";
+import { useTranslation } from "react-i18next";
+import { useArk } from "@lume/ark";
+import { Note, User } from "@lume/ui";
+
+export function RepostNote({
+ event,
+ className,
+}: {
+ event: Event;
+ className?: string;
+}) {
+ const ark = useArk();
+
+ const { t } = useTranslation();
+ const {
+ isLoading,
+ isError,
+ data: repostEvent,
+ } = useQuery({
+ queryKey: ["repost", event.id],
+ queryFn: async () => {
+ try {
+ if (event.content.length > 50) {
+ const embed: Event = JSON.parse(event.content);
+ return embed;
+ }
+ const id = event.tags.find((el) => el[0] === "e")[1];
+ return await ark.get_event(id);
+ } catch {
+ throw new Error("Failed to get repost event");
+ }
+ },
+ refetchOnWindowFocus: false,
+ refetchOnMount: false,
+ });
+
+ if (isLoading) {
+ return Loading...
;
+ }
+
+ if (isError || !repostEvent) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ {t("note.reposted")}
+
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {t("note.reposted")}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/components/suggest.tsx b/apps/desktop2/src/components/suggest.tsx
new file mode 100644
index 00000000..2844fa4d
--- /dev/null
+++ b/apps/desktop2/src/components/suggest.tsx
@@ -0,0 +1,56 @@
+import { LoaderIcon } from "@lume/icons";
+import { useQuery } from "@tanstack/react-query";
+import { useTranslation } from "react-i18next";
+import { User } from "@lume/ui";
+
+export function Suggest() {
+ const { t } = useTranslation();
+ const { isLoading, isError, data } = useQuery({
+ queryKey: ["trending-users"],
+ queryFn: async ({ signal }: { signal: AbortSignal }) => {
+ const res = await fetch("https://api.nostr.band/v0/trending/profiles", {
+ signal,
+ });
+ if (!res.ok) {
+ throw new Error("Failed to fetch trending users from nostr.band API.");
+ }
+ return res.json();
+ },
+ });
+
+ return (
+
+
+ Suggested Follows
+
+ {isLoading ? (
+
+
+
+ ) : isError ? (
+
+ {t("suggestion.error")}
+
+ ) : (
+ data?.profiles.map((item: { pubkey: string }) => (
+
+ ))
+ )}
+
+ );
+}
diff --git a/apps/desktop2/src/components/text.tsx b/apps/desktop2/src/components/text.tsx
new file mode 100644
index 00000000..fab9e334
--- /dev/null
+++ b/apps/desktop2/src/components/text.tsx
@@ -0,0 +1,39 @@
+import { Event } from "@lume/types";
+import { Note } from "@lume/ui";
+import { cn } from "@lume/utils";
+
+export function TextNote({
+ event,
+ className,
+}: {
+ event: Event;
+ className?: string;
+}) {
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/apps/desktop/src/i18n.ts b/apps/desktop2/src/locale.ts
similarity index 82%
rename from apps/desktop/src/i18n.ts
rename to apps/desktop2/src/locale.ts
index 080f7339..fb75d366 100644
--- a/apps/desktop/src/i18n.ts
+++ b/apps/desktop2/src/locale.ts
@@ -1,12 +1,9 @@
import { resolveResource } from "@tauri-apps/api/path";
import { readTextFile } from "@tauri-apps/plugin-fs";
-import { locale } from "@tauri-apps/plugin-os";
import i18n from "i18next";
import resourcesToBackend from "i18next-resources-to-backend";
import { initReactI18next } from "react-i18next";
-const currentLocale = (await locale()).slice(0, 2);
-
i18n
.use(
resourcesToBackend(async (language: string) => {
@@ -16,7 +13,7 @@ i18n
)
.use(initReactI18next)
.init({
- lng: currentLocale,
+ lng: "en",
fallbackLng: "en",
interpolation: {
escapeValue: false,
diff --git a/apps/desktop2/src/routes/$account.tsx b/apps/desktop2/src/routes/$account.tsx
new file mode 100644
index 00000000..546d0a3d
--- /dev/null
+++ b/apps/desktop2/src/routes/$account.tsx
@@ -0,0 +1,123 @@
+import {
+ BellFilledIcon,
+ BellIcon,
+ ComposeFilledIcon,
+ HomeFilledIcon,
+ HomeIcon,
+ HorizontalDotsIcon,
+ SpaceFilledIcon,
+ SpaceIcon,
+} from "@lume/icons";
+import { Link } from "@tanstack/react-router";
+import { Outlet, createFileRoute } from "@tanstack/react-router";
+import { cn } from "@lume/utils";
+import { Accounts } from "@/components/accounts";
+import { useArk } from "@lume/ark";
+import { Box } from "@lume/ui";
+
+export const Route = createFileRoute("/$account")({
+ component: App,
+});
+
+function App() {
+ const ark = useArk();
+ const context = Route.useRouteContext();
+
+ return (
+
+
+
+
+
+
ark.open_editor()}
+ className="inline-flex h-8 w-max items-center justify-center gap-1 rounded-full bg-blue-500 px-3 text-sm font-medium text-white hover:bg-blue-600"
+ >
+
+ New post
+
+
+
+
+
+
+
+ );
+}
+
+function Navigation() {
+ // @ts-ignore, useless
+ const { account } = Route.useParams();
+
+ return (
+
+
+ {({ isActive }) => (
+
+ {isActive ? (
+
+ ) : (
+
+ )}
+ Home
+
+ )}
+
+
+ {({ isActive }) => (
+
+ {isActive ? (
+
+ ) : (
+
+ )}
+ Space
+
+ )}
+
+
+ {({ isActive }) => (
+
+ {isActive ? (
+
+ ) : (
+
+ )}
+ Activity
+
+ )}
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/$account/activity.lazy.tsx b/apps/desktop2/src/routes/$account/activity.lazy.tsx
new file mode 100644
index 00000000..9ae4e2cf
--- /dev/null
+++ b/apps/desktop2/src/routes/$account/activity.lazy.tsx
@@ -0,0 +1,13 @@
+import { createLazyFileRoute } from "@tanstack/react-router";
+
+export const Route = createLazyFileRoute("/$account/activity")({
+ component: Activity,
+});
+
+function Activity() {
+ return (
+
+ );
+}
diff --git a/apps/desktop2/src/routes/$account/home.lazy.tsx b/apps/desktop2/src/routes/$account/home.lazy.tsx
new file mode 100644
index 00000000..a2995d2c
--- /dev/null
+++ b/apps/desktop2/src/routes/$account/home.lazy.tsx
@@ -0,0 +1,133 @@
+import { RepostNote } from "@/components/repost";
+import { Suggest } from "@/components/suggest";
+import { TextNote } from "@/components/text";
+import { useArk } from "@lume/ark";
+import {
+ LoaderIcon,
+ ArrowRightCircleIcon,
+ RefreshIcon,
+ InfoIcon,
+} from "@lume/icons";
+import { Event, Kind } from "@lume/types";
+import { EmptyFeed } from "@lume/ui";
+import { FETCH_LIMIT } from "@lume/utils";
+import { useInfiniteQuery } from "@tanstack/react-query";
+import { createLazyFileRoute } from "@tanstack/react-router";
+import { Virtualizer } from "virtua";
+
+export const Route = createLazyFileRoute("/$account/home")({
+ component: Home,
+});
+
+function Home() {
+ const ark = useArk();
+ const currentDate = new Date().toLocaleString("default", {
+ weekday: "long",
+ month: "long",
+ day: "numeric",
+ });
+
+ const { account } = Route.useParams();
+ const {
+ data,
+ hasNextPage,
+ isLoading,
+ isRefetching,
+ isFetchingNextPage,
+ fetchNextPage,
+ refetch,
+ } = useInfiniteQuery({
+ queryKey: ["local_newsfeed", account],
+ initialPageParam: 0,
+ queryFn: async ({ pageParam }: { pageParam: number }) => {
+ const events = await ark.get_events(
+ "local",
+ FETCH_LIMIT,
+ pageParam,
+ true,
+ );
+ return events;
+ },
+ getNextPageParam: (lastPage) => {
+ const lastEvent = lastPage?.at(-1);
+ if (!lastEvent) return;
+ return lastEvent.created_at - 1;
+ },
+ select: (data) => data?.pages.flatMap((page) => page),
+ refetchOnWindowFocus: false,
+ });
+
+ const renderItem = (event: Event) => {
+ if (!event) return;
+ switch (event.kind) {
+ case Kind.Repost:
+ return ;
+ default:
+ return ;
+ }
+ };
+
+ return (
+
+
+
+ {currentDate}
+
+
+ refetch()}
+ className="text-neutral-700 hover:text-blue-500 dark:text-neutral-300"
+ >
+
+
+
+
+
+
+ {isLoading || isRefetching ? (
+
+
+
+ ) : !data.length ? (
+
+
+
+
+ Empty newsfeed. Or you can go to{" "}
+
+ Discover
+
+
+
+
+
+ ) : (
+
+ {data.map((item) => renderItem(item))}
+
+ )}
+
+ {hasNextPage ? (
+
fetchNextPage()}
+ disabled={!hasNextPage || isFetchingNextPage}
+ className="inline-flex h-12 w-36 items-center justify-center gap-2 rounded-full bg-neutral-100 px-3 font-medium hover:bg-neutral-200 focus:outline-none dark:bg-neutral-900 dark:hover:bg-neutral-800"
+ >
+ {isFetchingNextPage ? (
+
+ ) : (
+ <>
+
+ Load more
+ >
+ )}
+
+ ) : null}
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/$account/space.lazy.tsx b/apps/desktop2/src/routes/$account/space.lazy.tsx
new file mode 100644
index 00000000..857a601e
--- /dev/null
+++ b/apps/desktop2/src/routes/$account/space.lazy.tsx
@@ -0,0 +1,13 @@
+import { createLazyFileRoute } from "@tanstack/react-router";
+
+export const Route = createLazyFileRoute("/$account/space")({
+ component: Space,
+});
+
+function Space() {
+ return (
+
+ );
+}
diff --git a/apps/desktop2/src/routes/__root.tsx b/apps/desktop2/src/routes/__root.tsx
new file mode 100644
index 00000000..649e9ad0
--- /dev/null
+++ b/apps/desktop2/src/routes/__root.tsx
@@ -0,0 +1,35 @@
+import { LoaderIcon } from "@lume/icons";
+import {
+ Outlet,
+ ScrollRestoration,
+ createRootRouteWithContext,
+} from "@tanstack/react-router";
+import { type Ark } from "@lume/ark";
+import { type QueryClient } from "@tanstack/react-query";
+import { type Platform } from "@tauri-apps/plugin-os";
+
+interface RouterContext {
+ ark: Ark;
+ queryClient: QueryClient;
+ platform: Platform;
+ locale: string;
+}
+
+export const Route = createRootRouteWithContext()({
+ component: () => (
+ <>
+
+
+ >
+ ),
+ pendingComponent: Pending,
+ wrapInSuspense: true,
+});
+
+function Pending() {
+ return (
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/auth/create/index.lazy.tsx b/apps/desktop2/src/routes/auth/create/index.lazy.tsx
new file mode 100644
index 00000000..fed2597e
--- /dev/null
+++ b/apps/desktop2/src/routes/auth/create/index.lazy.tsx
@@ -0,0 +1,108 @@
+import { LoaderIcon } from "@lume/icons";
+import { cn } from "@lume/utils";
+import { createLazyFileRoute, useNavigate } from "@tanstack/react-router";
+import { useState } from "react";
+import { useTranslation } from "react-i18next";
+
+export const Route = createLazyFileRoute("/auth/create/")({
+ component: Screen,
+});
+
+function Screen() {
+ const navigate = useNavigate();
+
+ const [t] = useTranslation();
+ const [method, setMethod] = useState<"self" | "managed">("self");
+ const [loading, setLoading] = useState(false);
+
+ const next = () => {
+ setLoading(true);
+
+ if (method === "self") {
+ navigate({ to: "/auth/create/self" });
+ } else {
+ navigate({ to: "/auth/create/managed" });
+ }
+ };
+
+ return (
+
+
+
+
{t("signup.title")}
+
+ {t("signup.subtitle")}
+
+
+
+
setMethod("self")}
+ className={cn(
+ "flex flex-col items-start rounded-xl bg-neutral-100 px-4 py-3.5 hover:bg-neutral-200 dark:bg-neutral-900 dark:hover:bg-neutral-800",
+ method === "self"
+ ? "ring-1 ring-blue-500 ring-offset-2 ring-offset-white dark:ring-offset-black"
+ : "",
+ )}
+ >
+ {t("signup.selfManageMethod")}
+
+ {t("signup.selfManageMethodDescription")}
+
+
+
setMethod("managed")}
+ className={cn(
+ "flex flex-col items-start rounded-xl bg-neutral-100 px-4 py-3.5 hover:bg-neutral-200 dark:bg-neutral-900 dark:hover:bg-neutral-800",
+ method === "managed"
+ ? "ring-1 ring-blue-500 ring-offset-2 ring-offset-white dark:ring-offset-black"
+ : "",
+ )}
+ >
+ {t("signup.providerMethod")}
+
+ {t("signup.providerMethodDescription")}
+
+
+
+
+ {loading ? (
+
+ ) : (
+ t("global.continue")
+ )}
+
+ {method === "managed" ? (
+
+
+ Attention:
+
+
+ You're chosing Managed by Provider, this feature still in
+ "Beta".
+
+
+ Some functions still missing or not work as expected, you
+ shouldn't create your main account with this method
+
+
+ Learn more
+
+
+ ) : null}
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/auth/create/managed.lazy.tsx b/apps/desktop2/src/routes/auth/create/managed.lazy.tsx
new file mode 100644
index 00000000..9258c283
--- /dev/null
+++ b/apps/desktop2/src/routes/auth/create/managed.lazy.tsx
@@ -0,0 +1,5 @@
+import { createLazyFileRoute } from '@tanstack/react-router'
+
+export const Route = createLazyFileRoute('/auth/create/managed')({
+ component: () => Hello /auth/create/managed!
+})
\ No newline at end of file
diff --git a/apps/desktop2/src/routes/auth/create/self.lazy.tsx b/apps/desktop2/src/routes/auth/create/self.lazy.tsx
new file mode 100644
index 00000000..8549ed6a
--- /dev/null
+++ b/apps/desktop2/src/routes/auth/create/self.lazy.tsx
@@ -0,0 +1,161 @@
+import { useArk } from "@lume/ark";
+import { CheckIcon, EyeOffIcon, EyeOnIcon, LoaderIcon } from "@lume/icons";
+import { Keys } from "@lume/types";
+import * as Checkbox from "@radix-ui/react-checkbox";
+import { createLazyFileRoute, useNavigate } from "@tanstack/react-router";
+import { useEffect, useState } from "react";
+import { useTranslation } from "react-i18next";
+import { toast } from "sonner";
+
+export const Route = createLazyFileRoute("/auth/create/self")({
+ component: Create,
+});
+
+function Create() {
+ const ark = useArk();
+ const navigate = useNavigate();
+
+ const [t] = useTranslation();
+ const [loading, setLoading] = useState(false);
+ const [showKey, setShowKey] = useState(false);
+ const [confirm, setConfirm] = useState({ c1: false, c2: false, c3: false });
+ const [keys, setKeys] = useState(null);
+
+ const submit = async () => {
+ setLoading(true);
+ try {
+ await ark.save_account(keys);
+ navigate({
+ to: "/$account/home",
+ params: { account: keys.npub },
+ search: { onboarding: true },
+ replace: true,
+ });
+ } catch (e) {
+ setLoading(false);
+ toast.error(e);
+ }
+ };
+
+ useEffect(() => {
+ async function genKeys() {
+ const res = await ark.create_keys();
+ setKeys(res);
+ }
+ genKeys();
+ }, []);
+
+ return (
+
+
+
+
+ {t("signupWithSelfManage.title")}
+
+
+ {t("signupWithSelfManage.subtitle")}
+
+
+
+
+
+ {keys ? (
+
+ ) : null}
+ setShowKey((state) => !state)}
+ className="absolute right-2 top-2 inline-flex size-8 items-center justify-center rounded-lg bg-neutral-200 hover:bg-neutral-300 dark:bg-neutral-800 dark:hover:bg-neutral-700"
+ >
+ {showKey ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+ setConfirm((state) => ({ ...state, c1: !state.c1 }))
+ }
+ className="flex size-7 appearance-none items-center justify-center rounded-lg bg-neutral-100 outline-none dark:bg-neutral-900"
+ id="confirm1"
+ >
+
+
+
+
+
+ {t("signupWithSelfManage.confirm1")}
+
+
+
+
+ setConfirm((state) => ({ ...state, c3: !state.c3 }))
+ }
+ className="flex size-7 appearance-none items-center justify-center rounded-lg bg-neutral-100 outline-none dark:bg-neutral-900"
+ id="confirm3"
+ >
+
+
+
+
+
+ {t("signupWithSelfManage.confirm3")}
+
+
+
+
+ setConfirm((state) => ({ ...state, c2: !state.c2 }))
+ }
+ className="flex size-7 appearance-none items-center justify-center rounded-lg bg-neutral-100 outline-none dark:bg-neutral-900"
+ id="confirm2"
+ >
+
+
+
+
+
+ {t("signupWithSelfManage.confirm2")}
+
+
+
+
+
+ {loading ? (
+
+ ) : (
+ t("signupWithSelfManage.button")
+ )}
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/auth/import.lazy.tsx b/apps/desktop2/src/routes/auth/import.lazy.tsx
new file mode 100644
index 00000000..08f361e5
--- /dev/null
+++ b/apps/desktop2/src/routes/auth/import.lazy.tsx
@@ -0,0 +1,101 @@
+import { useArk } from "@lume/ark";
+import { LoaderIcon } from "@lume/icons";
+import { createLazyFileRoute, useNavigate } from "@tanstack/react-router";
+import { invoke } from "@tauri-apps/api/core";
+import { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { toast } from "sonner";
+
+export const Route = createLazyFileRoute("/auth/import")({
+ component: Import,
+});
+
+function Import() {
+ const ark = useArk();
+ const navigate = useNavigate();
+
+ const [t] = useTranslation();
+ const [key, setKey] = useState("");
+ const [password, setPassword] = useState("");
+ const [loading, setLoading] = useState(false);
+
+ const submit = async () => {
+ if (!key.startsWith("nsec1")) return;
+ if (key.length < 30) return;
+
+ setLoading(true);
+
+ try {
+ const npub: string = await invoke("get_public_key", { nsec: key });
+ await ark.save_account({
+ npub,
+ nsec: key,
+ });
+ navigate({
+ to: "/$account/home",
+ params: { account: npub },
+ search: { onboarding: true },
+ replace: true,
+ });
+ } catch (e) {
+ setLoading(false);
+ toast.error(e);
+ }
+ };
+
+ const isNip05 = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/.test(key);
+ const isNip49 = key.startsWith("ncryptsec");
+
+ return (
+
+
+
+
{t("login.title")}
+
+ {t("login.subtitle")}
+
+
+
+
+
+ {loading ? (
+
+ ) : (
+ "Import"
+ )}
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/backup.lazy.tsx b/apps/desktop2/src/routes/backup.lazy.tsx
new file mode 100644
index 00000000..31cdd902
--- /dev/null
+++ b/apps/desktop2/src/routes/backup.lazy.tsx
@@ -0,0 +1,20 @@
+import { createLazyFileRoute } from "@tanstack/react-router";
+import { useTranslation } from "react-i18next";
+
+export const Route = createLazyFileRoute("/backup")({
+ component: Screen,
+});
+
+function Screen() {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
{t("backup.title")}
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/editor/-components/media.tsx b/apps/desktop2/src/routes/editor/-components/media.tsx
new file mode 100644
index 00000000..147f14c3
--- /dev/null
+++ b/apps/desktop2/src/routes/editor/-components/media.tsx
@@ -0,0 +1,78 @@
+import { useArk } from "@lume/ark";
+import { AddMediaIcon, LoaderIcon } from "@lume/icons";
+import { cn, insertImage, isImagePath } from "@lume/utils";
+import { useEffect, useState } from "react";
+import { useSlateStatic } from "slate-react";
+import { toast } from "sonner";
+import { getCurrent } from "@tauri-apps/api/window";
+import { UnlistenFn } from "@tauri-apps/api/event";
+
+export function MediaButton({ className }: { className?: string }) {
+ const ark = useArk();
+ const editor = useSlateStatic();
+
+ const [loading, setLoading] = useState(false);
+
+ const uploadToNostrBuild = async () => {
+ try {
+ setLoading(true);
+
+ const image = await ark.upload();
+
+ if (image) {
+ insertImage(editor, image);
+ }
+
+ setLoading(false);
+ } catch (e) {
+ setLoading(false);
+ toast.error(`Upload failed, error: ${e}`);
+ }
+ };
+
+ useEffect(() => {
+ let unlisten: UnlistenFn = undefined;
+
+ async function listenFileDrop() {
+ const window = getCurrent();
+ if (!unlisten) {
+ unlisten = await window.listen("tauri://file-drop", async (event) => {
+ // @ts-ignore, lfg !!!
+ const items: string[] = event.payload.paths;
+ // start loading
+ setLoading(true);
+ // upload all images
+ for (const item of items) {
+ if (isImagePath(item)) {
+ const image = await ark.upload(item);
+ insertImage(editor, image);
+ }
+ }
+ // stop loading
+ setLoading(false);
+ });
+ }
+ }
+
+ listenFileDrop();
+
+ return () => {
+ if (unlisten) unlisten();
+ };
+ }, []);
+
+ return (
+ uploadToNostrBuild()}
+ disabled={loading}
+ className={cn("inline-flex items-center justify-center", className)}
+ >
+ {loading ? (
+
+ ) : (
+
+ )}
+
+ );
+}
diff --git a/apps/desktop2/src/routes/editor/index.tsx b/apps/desktop2/src/routes/editor/index.tsx
new file mode 100644
index 00000000..7552355c
--- /dev/null
+++ b/apps/desktop2/src/routes/editor/index.tsx
@@ -0,0 +1,438 @@
+import { useArk } from "@lume/ark";
+import { LoaderIcon, TrashIcon } from "@lume/icons";
+import {
+ Portal,
+ cn,
+ insertImage,
+ insertMention,
+ insertNostrEvent,
+ isImageUrl,
+ sendNativeNotification,
+} from "@lume/utils";
+import { createFileRoute } from "@tanstack/react-router";
+import { useEffect, useRef, useState } from "react";
+import { useTranslation } from "react-i18next";
+import { MediaButton } from "./-components/media";
+import { MentionNote } from "@lume/ui/src/note/mentions/note";
+import {
+ Descendant,
+ Editor,
+ Node,
+ Range,
+ Transforms,
+ createEditor,
+} from "slate";
+import {
+ ReactEditor,
+ useSlateStatic,
+ useSelected,
+ useFocused,
+ withReact,
+ Slate,
+ Editable,
+} from "slate-react";
+import { Contact } from "@lume/types";
+import { User } from "@lume/ui";
+import { nip19 } from "nostr-tools";
+import { queryOptions, useSuspenseQuery } from "@tanstack/react-query";
+import { invoke } from "@tauri-apps/api/core";
+
+type EditorElement = {
+ type: string;
+ children: Descendant[];
+ eventId?: string;
+};
+
+const contactQueryOptions = queryOptions({
+ queryKey: ["contacts"],
+ queryFn: () => invoke("get_contact_metadata"),
+ refetchOnMount: false,
+ refetchOnReconnect: false,
+ refetchOnWindowFocus: false,
+});
+
+export const Route = createFileRoute("/editor/")({
+ loader: ({ context }) =>
+ context.queryClient.ensureQueryData(contactQueryOptions),
+ component: Screen,
+ pendingComponent: Pending,
+});
+
+function Screen() {
+ // @ts-ignore, useless
+ const { reply_to, quote } = Route.useSearch();
+
+ let initialValue: EditorElement[];
+
+ if (quote) {
+ initialValue = [
+ {
+ type: "paragraph",
+ children: [{ text: "" }],
+ },
+ {
+ type: "event",
+ eventId: `nostr:${nip19.noteEncode(reply_to)}`,
+ children: [{ text: "" }],
+ },
+ {
+ type: "paragraph",
+ children: [{ text: "" }],
+ },
+ ];
+ } else {
+ initialValue = [
+ {
+ type: "paragraph",
+ children: [{ text: "" }],
+ },
+ ];
+ }
+
+ const ark = useArk();
+ const ref = useRef();
+ const contacts = useSuspenseQuery(contactQueryOptions).data as Contact[];
+
+ const [t] = useTranslation();
+ const [editorValue, setEditorValue] = useState(initialValue);
+ const [target, setTarget] = useState();
+ const [index, setIndex] = useState(0);
+ const [search, setSearch] = useState("");
+ const [loading, setLoading] = useState(false);
+ const [editor] = useState(() =>
+ withMentions(withNostrEvent(withImages(withReact(createEditor())))),
+ );
+
+ const filters = contacts
+ ?.filter((c) =>
+ c?.profile.name?.toLowerCase().startsWith(search.toLowerCase()),
+ )
+ ?.slice(0, 5);
+
+ const reset = () => {
+ // @ts-expect-error, backlog
+ editor.children = [{ type: "paragraph", children: [{ text: "" }] }];
+ setEditorValue([{ type: "paragraph", children: [{ text: "" }] }]);
+ };
+
+ const serialize = (nodes: Descendant[]) => {
+ return nodes
+ .map((n) => {
+ // @ts-expect-error, backlog
+ if (n.type === "image") return n.url;
+ // @ts-expect-error, backlog
+ if (n.type === "event") return n.eventId;
+
+ // @ts-expect-error, backlog
+ if (n.children.length) {
+ // @ts-expect-error, backlog
+ return n.children
+ .map((n) => {
+ if (n.type === "mention") return n.npub;
+ return Node.string(n).trim();
+ })
+ .join(" ");
+ }
+
+ return Node.string(n);
+ })
+ .join("\n");
+ };
+
+ const publish = async () => {
+ try {
+ // start loading
+ setLoading(true);
+
+ const content = serialize(editor.children);
+ const eventId = await ark.publish(content, reply_to, quote);
+
+ if (eventId) {
+ await sendNativeNotification("You've publish new post successfully.");
+ return reset();
+ }
+
+ // stop loading
+ setLoading(false);
+ } catch (e) {
+ setLoading(false);
+ await sendNativeNotification(String(e));
+ }
+ };
+
+ useEffect(() => {
+ if (target && filters.length > 0) {
+ const el = ref.current;
+ const domRange = ReactEditor.toDOMRange(editor, target);
+ const rect = domRange.getBoundingClientRect();
+ el.style.top = `${rect.top + window.scrollY + 24}px`;
+ el.style.left = `${rect.left + window.scrollX}px`;
+ }
+ }, [filters.length, editor, index, search, target]);
+
+ return (
+
+
{
+ const { selection } = editor;
+
+ if (selection && Range.isCollapsed(selection)) {
+ const [start] = Range.edges(selection);
+ const wordBefore = Editor.before(editor, start, { unit: "word" });
+ const before = wordBefore && Editor.before(editor, wordBefore);
+ const beforeRange = before && Editor.range(editor, before, start);
+ const beforeText =
+ beforeRange && Editor.string(editor, beforeRange);
+ const beforeMatch = beforeText?.match(/^@(\w+)$/);
+ const after = Editor.after(editor, start);
+ const afterRange = Editor.range(editor, start, after);
+ const afterText = Editor.string(editor, afterRange);
+ const afterMatch = afterText.match(/^(\s|$)/);
+
+ if (beforeMatch && afterMatch) {
+ setTarget(beforeRange);
+ setSearch(beforeMatch[1]);
+ setIndex(0);
+ return;
+ }
+ }
+
+ setTarget(null);
+ }}
+ >
+
+
+
+ {loading ? (
+
+ ) : (
+ t("global.post")
+ )}
+
+
+
+
+ {reply_to && !quote ? (
+
+
Reply to:
+
+
+ ) : null}
+
+
}
+ placeholder={t("editor.placeholder")}
+ className="focus:outline-none"
+ />
+ {target && filters.length > 0 && (
+
+
+ {filters.map((contact) => (
+
{
+ Transforms.select(editor, target);
+ insertMention(editor, contact);
+ setTarget(null);
+ }}
+ className="flex w-full flex-col rounded-lg p-2 hover:bg-neutral-100 dark:hover:bg-neutral-900"
+ >
+
+
+
+
+
+
+
+
+
+ ))}
+
+
+ )}
+
+
+
+
+
+ );
+}
+
+function Pending() {
+ return (
+
+ );
+}
+
+const withNostrEvent = (editor: ReactEditor) => {
+ const { insertData, isVoid } = editor;
+
+ editor.isVoid = (element) => {
+ // @ts-expect-error, wtf
+ return element.type === "event" ? true : isVoid(element);
+ };
+
+ editor.insertData = (data) => {
+ const text = data.getData("text/plain");
+
+ if (text.startsWith("nevent1") || text.startsWith("note1")) {
+ insertNostrEvent(editor, text);
+ } else {
+ insertData(data);
+ }
+ };
+
+ return editor;
+};
+
+const withMentions = (editor: ReactEditor) => {
+ const { isInline, isVoid, markableVoid } = editor;
+
+ editor.isInline = (element) => {
+ // @ts-expect-error, wtf
+ return element.type === "mention" ? true : isInline(element);
+ };
+
+ editor.isVoid = (element) => {
+ // @ts-expect-error, wtf
+ return element.type === "mention" ? true : isVoid(element);
+ };
+
+ editor.markableVoid = (element) => {
+ // @ts-expect-error, wtf
+ return element.type === "mention" || markableVoid(element);
+ };
+
+ return editor;
+};
+
+const withImages = (editor: ReactEditor) => {
+ const { insertData, isVoid } = editor;
+
+ editor.isVoid = (element) => {
+ // @ts-expect-error, wtf
+ return element.type === "image" ? true : isVoid(element);
+ };
+
+ editor.insertData = (data) => {
+ const text = data.getData("text/plain");
+
+ if (isImageUrl(text)) {
+ insertImage(editor, text);
+ } else {
+ insertData(data);
+ }
+ };
+
+ return editor;
+};
+
+const Image = ({ attributes, children, element }) => {
+ const editor = useSlateStatic();
+ const path = ReactEditor.findPath(editor as ReactEditor, element);
+
+ const selected = useSelected();
+ const focused = useFocused();
+
+ return (
+
+ {children}
+
+
+
Transforms.removeNodes(editor, { at: path })}
+ className="absolute right-2 top-2 inline-flex size-8 items-center justify-center rounded-lg bg-red-500 text-white hover:bg-red-600"
+ >
+
+
+
+
+ );
+};
+
+const Mention = ({ attributes, element }) => {
+ const editor = useSlateStatic();
+ const path = ReactEditor.findPath(editor as ReactEditor, element);
+
+ return (
+ Transforms.removeNodes(editor, { at: path })}
+ className="inline-block align-baseline text-blue-500 hover:text-blue-600"
+ >{`@${element.name}`}
+ );
+};
+
+const Event = ({ attributes, element, children }) => {
+ const editor = useSlateStatic();
+ const path = ReactEditor.findPath(editor as ReactEditor, element);
+
+ return (
+
+ {children}
+ {/* biome-ignore lint/a11y/useKeyWithClickEvents:
*/}
+ Transforms.removeNodes(editor, { at: path })}
+ className="user-select-none relative my-2"
+ >
+
+
+
+ );
+};
+
+const Element = (props) => {
+ const { attributes, children, element } = props;
+
+ switch (element.type) {
+ case "image":
+ return ;
+ case "mention":
+ return ;
+ case "event":
+ return ;
+ default:
+ return (
+
+ {children}
+
+ );
+ }
+};
diff --git a/apps/desktop2/src/routes/events/$eventId.lazy.tsx b/apps/desktop2/src/routes/events/$eventId.lazy.tsx
new file mode 100644
index 00000000..e26b9377
--- /dev/null
+++ b/apps/desktop2/src/routes/events/$eventId.lazy.tsx
@@ -0,0 +1,72 @@
+import { useEvent } from "@lume/ark";
+import { LoaderIcon } from "@lume/icons";
+import { Box, Container, Note, User } from "@lume/ui";
+import { createLazyFileRoute } from "@tanstack/react-router";
+import { WindowVirtualizer } from "virtua";
+import { ReplyList } from "./-components/replyList";
+import { Event } from "@lume/types";
+
+export const Route = createLazyFileRoute("/events/$eventId")({
+ component: Event,
+});
+
+function Event() {
+ const { eventId } = Route.useParams();
+ const { isLoading, isError, data } = useEvent(eventId);
+
+ if (isLoading) {
+ return (
+
+
+
+ );
+ }
+
+ if (isError) {
+ ;
+ }
+
+ return (
+
+
+
+
+ {data ? : null}
+
+
+
+ );
+}
+
+function MainNote({ data }: { data: Event }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/events/-components/reply.tsx b/apps/desktop2/src/routes/events/-components/reply.tsx
new file mode 100644
index 00000000..5c01c9fb
--- /dev/null
+++ b/apps/desktop2/src/routes/events/-components/reply.tsx
@@ -0,0 +1,47 @@
+import { EventWithReplies } from "@lume/types";
+import { cn } from "@lume/utils";
+import { Note, User } from "@lume/ui";
+import { SubReply } from "./subReply";
+
+export function Reply({ event }: { event: EventWithReplies }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ 0
+ ? "my-3 mt-6 flex flex-col gap-3 divide-y divide-neutral-100 border-l-2 border-neutral-100 pl-6 dark:divide-neutral-900 dark:border-neutral-900"
+ : "",
+ )}
+ >
+ {event.replies?.length > 0
+ ? event.replies?.map((childEvent) => (
+
+ ))
+ : null}
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/events/-components/replyList.tsx b/apps/desktop2/src/routes/events/-components/replyList.tsx
new file mode 100644
index 00000000..f1ba20b4
--- /dev/null
+++ b/apps/desktop2/src/routes/events/-components/replyList.tsx
@@ -0,0 +1,49 @@
+import { useArk } from "@lume/ark";
+import { LoaderIcon } from "@lume/icons";
+import { cn } from "@lume/utils";
+import { useEffect, useState } from "react";
+import { useTranslation } from "react-i18next";
+import { EventWithReplies } from "@lume/types";
+import { Reply } from "./reply";
+
+export function ReplyList({
+ eventId,
+ className,
+}: {
+ eventId: string;
+ className?: string;
+}) {
+ const ark = useArk();
+
+ const [t] = useTranslation();
+ const [data, setData] = useState(null);
+
+ useEffect(() => {
+ async function getReplies() {
+ const events = await ark.get_event_thread(eventId);
+ setData(events);
+ }
+ getReplies();
+ }, [eventId]);
+
+ return (
+
+ {!data ? (
+
+
+
+ ) : data.length === 0 ? (
+
+
+
👋
+
+ {t("note.reply.empty")}
+
+
+
+ ) : (
+ data.map((event) =>
)
+ )}
+
+ );
+}
diff --git a/apps/desktop2/src/routes/events/-components/subReply.tsx b/apps/desktop2/src/routes/events/-components/subReply.tsx
new file mode 100644
index 00000000..3bdc9a50
--- /dev/null
+++ b/apps/desktop2/src/routes/events/-components/subReply.tsx
@@ -0,0 +1,32 @@
+import { Event } from "@lume/types";
+import { Note, User } from "@lume/ui";
+
+export function SubReply({ event }: { event: Event; rootEventId?: string }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/index.tsx b/apps/desktop2/src/routes/index.tsx
new file mode 100644
index 00000000..760b708a
--- /dev/null
+++ b/apps/desktop2/src/routes/index.tsx
@@ -0,0 +1,122 @@
+import { useArk } from "@lume/ark";
+import { LoaderIcon, PlusIcon } from "@lume/icons";
+import { User } from "@lume/ui";
+import { Link } from "@tanstack/react-router";
+import { createFileRoute, redirect, useNavigate } from "@tanstack/react-router";
+import { useState } from "react";
+
+export const Route = createFileRoute("/")({
+ beforeLoad: async ({ location, context }) => {
+ const ark = context.ark;
+ const accounts = await ark.get_all_accounts();
+
+ switch (accounts.length) {
+ // Guest account
+ case 0:
+ const guest = await ark.create_guest_account();
+ throw redirect({
+ to: "/$account/home",
+ params: { account: guest },
+ search: { guest: true },
+ replace: true,
+ });
+ // Only 1 account, skip account selection screen
+ case 1:
+ const account = accounts[0].npub;
+ const loadAccount = await ark.load_selected_account(account);
+ if (loadAccount) {
+ throw redirect({
+ to: "/$account/home",
+ params: { account },
+ replace: true,
+ });
+ }
+ // Account selection
+ default:
+ return;
+ }
+ },
+ component: Screen,
+});
+
+function Screen() {
+ const ark = useArk();
+ const navigate = useNavigate();
+
+ const [loading, setLoading] = useState(false);
+
+ const select = async (npub: string) => {
+ setLoading(true);
+ const loadAccount = await ark.load_selected_account(npub);
+ if (loadAccount) {
+ navigate({
+ to: "/$account/home",
+ params: { account: npub },
+ replace: true,
+ });
+ }
+ };
+
+ const currentDate = new Date().toLocaleString("default", {
+ weekday: "long",
+ month: "long",
+ day: "numeric",
+ });
+
+ return (
+
+
+
+
{currentDate}
+ Welcome back!
+
+
+ {loading ? (
+
+ ) : (
+ <>
+ {ark.accounts.map((account) => (
+
select(account.npub)}
+ >
+
+
+
+
+
+
+
+ ))}
+
+
+
+ >
+ )}
+
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/landing/index.tsx b/apps/desktop2/src/routes/landing/index.tsx
new file mode 100644
index 00000000..4ad9f6c4
--- /dev/null
+++ b/apps/desktop2/src/routes/landing/index.tsx
@@ -0,0 +1,58 @@
+import { Link, createFileRoute } from "@tanstack/react-router";
+import { useTranslation } from "react-i18next";
+
+export const Route = createFileRoute("/landing/")({
+ component: Screen,
+});
+
+function Screen() {
+ const context = Route.useRouteContext();
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
+
+
+
+ {t("welcome.title")}
+
+
+
+
+ {t("welcome.signup")}
+
+
+ {t("welcome.login")}
+
+
+
+
+
+ {t("welcome.footer")}{" "}
+
+ here
+
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/login.tsx b/apps/desktop2/src/routes/login.tsx
new file mode 100644
index 00000000..4bc1d153
--- /dev/null
+++ b/apps/desktop2/src/routes/login.tsx
@@ -0,0 +1,14 @@
+import { Outlet, createFileRoute } from "@tanstack/react-router";
+
+export const Route = createFileRoute("/login")({
+ component: Screen,
+});
+
+function Screen() {
+ return (
+
+
Login
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/settings/index.lazy.tsx b/apps/desktop2/src/routes/settings/index.lazy.tsx
new file mode 100644
index 00000000..1ac6a83c
--- /dev/null
+++ b/apps/desktop2/src/routes/settings/index.lazy.tsx
@@ -0,0 +1,9 @@
+import { createLazyFileRoute } from "@tanstack/react-router";
+
+export const Route = createLazyFileRoute("/settings/")({
+ component: Screen,
+});
+
+function Screen() {
+ return Settings
;
+}
diff --git a/apps/desktop2/src/routes/users/$pubkey.lazy.tsx b/apps/desktop2/src/routes/users/$pubkey.lazy.tsx
new file mode 100644
index 00000000..628b7b10
--- /dev/null
+++ b/apps/desktop2/src/routes/users/$pubkey.lazy.tsx
@@ -0,0 +1,46 @@
+import { createLazyFileRoute } from "@tanstack/react-router";
+import { WindowVirtualizer } from "virtua";
+import { User } from "@lume/ui";
+import { EventList } from "./-components/eventList";
+
+export const Route = createLazyFileRoute("/users/$pubkey")({
+ component: Screen,
+});
+
+function Screen() {
+ const { pubkey } = Route.useParams();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Notes
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/users/-components/eventList.tsx b/apps/desktop2/src/routes/users/-components/eventList.tsx
new file mode 100644
index 00000000..eabaada2
--- /dev/null
+++ b/apps/desktop2/src/routes/users/-components/eventList.tsx
@@ -0,0 +1,71 @@
+import { TextNote } from "@/components/text";
+import { RepostNote } from "@/components/repost";
+import { useArk } from "@lume/ark";
+import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons";
+import { Event, Kind } from "@lume/types";
+import { EmptyFeed } from "@lume/ui";
+import { FETCH_LIMIT } from "@lume/utils";
+import { useInfiniteQuery } from "@tanstack/react-query";
+
+export function EventList({ id }: { id: string }) {
+ const ark = useArk();
+ const { data, hasNextPage, isLoading, isFetchingNextPage, fetchNextPage } =
+ useInfiniteQuery({
+ queryKey: ["events", id],
+ initialPageParam: 0,
+ queryFn: async ({ pageParam }: { pageParam: number }) => {
+ const events = await ark.get_events_from(id, FETCH_LIMIT, pageParam);
+ return events;
+ },
+ getNextPageParam: (lastPage) => {
+ const lastEvent = lastPage?.at(-1);
+ if (!lastEvent) return;
+ return lastEvent.created_at - 1;
+ },
+ select: (data) => data?.pages.flatMap((page) => page),
+ refetchOnWindowFocus: false,
+ });
+
+ const renderItem = (event: Event) => {
+ if (!event) return;
+ switch (event.kind) {
+ case Kind.Repost:
+ return ;
+ default:
+ return ;
+ }
+ };
+
+ return (
+
+ {isLoading ? (
+
+
+
+ ) : !data.length ? (
+
+ ) : (
+ data.map((item) => renderItem(item))
+ )}
+
+ {hasNextPage ? (
+
fetchNextPage()}
+ disabled={!hasNextPage || isFetchingNextPage}
+ className="inline-flex h-12 w-36 items-center justify-center gap-2 rounded-full bg-neutral-100 px-3 font-medium hover:bg-neutral-200 focus:outline-none dark:bg-neutral-900 dark:hover:bg-neutral-800"
+ >
+ {isFetchingNextPage ? (
+
+ ) : (
+ <>
+
+ Load more
+ >
+ )}
+
+ ) : null}
+
+
+ );
+}
diff --git a/apps/desktop2/tailwind.config.js b/apps/desktop2/tailwind.config.js
new file mode 100644
index 00000000..6a0d8d71
--- /dev/null
+++ b/apps/desktop2/tailwind.config.js
@@ -0,0 +1,16 @@
+/** @type {import('tailwindcss').Config} */
+
+import preset from "@lume/tailwindcss";
+
+const config = {
+ content: [
+ "./src/**/*.{js,ts,jsx,tsx}",
+ "../../packages/@columns/**/*{.js,.ts,.jsx,.tsx}",
+ "../../packages/ark/**/*{.js,.ts,.jsx,.tsx}",
+ "../../packages/ui/**/*{.js,.ts,.jsx,.tsx}",
+ "index.html",
+ ],
+ presets: [preset],
+};
+
+export default config;
diff --git a/packages/storage/tsconfig.json b/apps/desktop2/tsconfig.json
similarity index 50%
rename from packages/storage/tsconfig.json
rename to apps/desktop2/tsconfig.json
index 86a6f0b8..babab986 100644
--- a/packages/storage/tsconfig.json
+++ b/apps/desktop2/tsconfig.json
@@ -1,7 +1,12 @@
{
"extends": "@lume/tsconfig/base.json",
"compilerOptions": {
- "outDir": "dist"
+ "outDir": "dist",
+ "baseUrl": "./",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
},
+ "include": ["src"],
"exclude": ["node_modules", "dist"]
}
diff --git a/apps/desktop2/tsr.config.json b/apps/desktop2/tsr.config.json
new file mode 100644
index 00000000..77360553
--- /dev/null
+++ b/apps/desktop2/tsr.config.json
@@ -0,0 +1,6 @@
+{
+ "routesDirectory": "./src/routes",
+ "generatedRouteTree": "./src/router.gen.ts",
+ "routeFileIgnorePrefix": "-",
+ "quoteStyle": "single"
+}
diff --git a/apps/desktop2/vite.config.ts b/apps/desktop2/vite.config.ts
new file mode 100644
index 00000000..04c584f9
--- /dev/null
+++ b/apps/desktop2/vite.config.ts
@@ -0,0 +1,25 @@
+import { TanStackRouterVite } from "@tanstack/router-vite-plugin";
+import react from "@vitejs/plugin-react-swc";
+import { defineConfig } from "vite";
+import topLevelAwait from "vite-plugin-top-level-await";
+import viteTsconfigPaths from "vite-tsconfig-paths";
+
+export default defineConfig({
+ plugins: [
+ react(),
+ viteTsconfigPaths(),
+ topLevelAwait({
+ promiseExportName: "__tla",
+ promiseImportName: (i) => `__tla_${i}`,
+ }),
+ TanStackRouterVite(),
+ ],
+ build: {
+ outDir: "../../dist",
+ },
+ server: {
+ strictPort: true,
+ port: 3000,
+ },
+ clearScreen: false,
+});
diff --git a/apps/web/package.json b/apps/web/package.json
index 620c5b0e..6e813cc0 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -13,7 +13,7 @@
"@astrojs/check": "^0.4.1",
"@astrojs/tailwind": "^5.1.0",
"@fontsource/geist-mono": "^5.0.1",
- "astro": "^4.2.6",
+ "astro": "^4.4.6",
"astro-seo-meta": "^4.1.0",
"astro-seo-schema": "^4.0.0",
"schema-dts": "^1.1.2",
diff --git a/package.json b/package.json
index 7e2204fa..a0d363f4 100644
--- a/package.json
+++ b/package.json
@@ -3,33 +3,34 @@
"private": true,
"version": "3.0.1",
"scripts": {
- "build": "turbo build",
- "dev": "turbo dev",
+ "build": "turbo run build",
+ "dev": "turbo run dev",
+ "web:dev": "turbo run dev --filter web",
+ "desktop:dev": "turbo run dev --filter desktop2",
"tauri": "tauri"
},
"devDependencies": {
"@biomejs/biome": "^1.5.3",
- "@tauri-apps/cli": "2.0.0-alpha.21",
- "turbo": "^1.11.3"
+ "@tauri-apps/cli": "2.0.0-beta.4",
+ "turbo": "^1.12.4"
},
"packageManager": "pnpm@8.9.0",
"engines": {
"node": ">=18"
},
"dependencies": {
- "@tauri-apps/api": "2.0.0-alpha.14",
- "@tauri-apps/plugin-autostart": "2.0.0-alpha.5",
- "@tauri-apps/plugin-clipboard-manager": "2.0.0-alpha.5",
- "@tauri-apps/plugin-dialog": "2.0.0-alpha.5",
- "@tauri-apps/plugin-fs": "2.0.0-alpha.6",
- "@tauri-apps/plugin-http": "2.0.0-alpha.6",
- "@tauri-apps/plugin-notification": "2.0.0-alpha.5",
- "@tauri-apps/plugin-os": "2.0.0-alpha.6",
- "@tauri-apps/plugin-process": "2.0.0-alpha.5",
- "@tauri-apps/plugin-shell": "2.0.0-alpha.5",
- "@tauri-apps/plugin-sql": "2.0.0-alpha.5",
- "@tauri-apps/plugin-updater": "2.0.0-alpha.5",
- "@tauri-apps/plugin-upload": "2.0.0-alpha.5",
- "million": "^2.6.4"
+ "@tauri-apps/api": "2.0.0-beta.3",
+ "@tauri-apps/plugin-autostart": "2.0.0-beta.1",
+ "@tauri-apps/plugin-clipboard-manager": "2.0.0-beta.1",
+ "@tauri-apps/plugin-dialog": "2.0.0-beta.1",
+ "@tauri-apps/plugin-fs": "2.0.0-beta.1",
+ "@tauri-apps/plugin-http": "2.0.0-beta.1",
+ "@tauri-apps/plugin-notification": "2.0.0-beta.1",
+ "@tauri-apps/plugin-os": "2.0.0-beta.1",
+ "@tauri-apps/plugin-process": "2.0.0-beta.1",
+ "@tauri-apps/plugin-shell": "2.0.0-beta.1",
+ "@tauri-apps/plugin-sql": "2.0.0-beta.1",
+ "@tauri-apps/plugin-updater": "2.0.0-beta.1",
+ "@tauri-apps/plugin-upload": "2.0.0-beta.1"
}
}
diff --git a/packages/ark/package.json b/packages/ark/package.json
index ef006b90..ee896a2f 100644
--- a/packages/ark/package.json
+++ b/packages/ark/package.json
@@ -4,13 +4,9 @@
"private": true,
"main": "./src/index.ts",
"dependencies": {
- "@getalby/sdk": "^3.2.3",
+ "@getalby/sdk": "^3.3.1",
"@lume/icons": "workspace:^",
- "@lume/ndk-cache-tauri": "workspace:^",
- "@lume/storage": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@nostr-fetch/adapter-ndk": "^0.15.0",
"@radix-ui/react-avatar": "^1.0.4",
"@radix-ui/react-collapsible": "^1.0.3",
"@radix-ui/react-dialog": "^1.0.5",
@@ -18,35 +14,26 @@
"@radix-ui/react-hover-card": "^1.0.7",
"@radix-ui/react-popover": "^1.0.7",
"@radix-ui/react-tooltip": "^1.0.7",
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"get-urls": "^12.1.0",
- "jotai": "^2.6.3",
- "linkify-react": "^4.1.3",
- "linkifyjs": "^4.1.3",
- "media-chrome": "^2.1.0",
+ "media-chrome": "^2.2.5",
"minidenticons": "^4.2.0",
- "nanoid": "^5.0.4",
- "nostr-fetch": "^0.15.0",
- "nostr-tools": "1.17.0",
+ "nanoid": "^5.0.6",
"qrcode.react": "^3.1.0",
"re-resizable": "^6.9.11",
"react": "^18.2.0",
- "react-currency-input-field": "^3.6.14",
- "react-i18next": "^14.0.1",
- "react-router-dom": "^6.21.3",
+ "react-currency-input-field": "^3.8.0",
+ "react-i18next": "^14.0.5",
"react-string-replace": "^1.1.1",
- "sonner": "^1.4.0",
- "string-strip-html": "^13.4.5",
- "tippy.js": "^6.3.7",
- "use-context-selector": "^1.4.1",
- "virtua": "^0.23.0"
+ "sonner": "^1.4.2",
+ "string-strip-html": "^13.4.6",
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
- "tailwind-merge": "^2.2.1",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/ark/src/ark.ts b/packages/ark/src/ark.ts
index f3e9dc7f..af64ad67 100644
--- a/packages/ark/src/ark.ts
+++ b/packages/ark/src/ark.ts
@@ -1,336 +1,261 @@
-import { Account, type NDKEventWithReplies, type NIP05 } from "@lume/types";
-import NDK, {
- NDKEvent,
- NDKFilter,
- NDKKind,
- NDKNip46Signer,
- NDKPrivateKeySigner,
- NDKRelay,
- NDKSubscriptionCacheUsage,
- NDKTag,
- NDKUser,
- NostrEvent,
-} from "@nostr-dev-kit/ndk";
-import { ndkAdapter } from "@nostr-fetch/adapter-ndk";
+import { WebviewWindow } from "@tauri-apps/api/webviewWindow";
+import type {
+ Account,
+ Contact,
+ Event,
+ EventWithReplies,
+ Keys,
+ Metadata,
+} from "@lume/types";
+import { invoke } from "@tauri-apps/api/core";
import { open } from "@tauri-apps/plugin-dialog";
import { readFile } from "@tauri-apps/plugin-fs";
-import { fetch } from "@tauri-apps/plugin-http";
-import { NostrFetcher, normalizeRelayUrl } from "nostr-fetch";
-import { nip19 } from "nostr-tools";
+import { generateContentTags } from "@lume/utils";
export class Ark {
- public ndk: NDK;
- public account: Account;
+ public accounts: Account[];
- constructor({
- ndk,
- account,
- }: {
- ndk: NDK;
- account: Account;
- }) {
- this.ndk = ndk;
- this.account = account;
+ constructor() {
+ this.accounts = [];
}
- public async connectDepot() {
- return this.ndk.addExplicitRelay(
- new NDKRelay(normalizeRelayUrl("ws://localhost:6090")),
- undefined,
- true,
- );
- }
-
- public updateNostrSigner({
- signer,
- }: { signer: NDKNip46Signer | NDKPrivateKeySigner }) {
- this.ndk.signer = signer;
- return this.ndk.signer;
- }
-
- public subscribe({
- filter,
- closeOnEose = false,
- cb,
- }: {
- filter: NDKFilter;
- closeOnEose: boolean;
- cb: (event: NDKEvent) => void;
- }) {
- const sub = this.ndk.subscribe(filter, { closeOnEose });
- sub.addListener("event", (event: NDKEvent) => cb(event));
- return sub;
- }
-
- public getNDKEvent(event: NostrEvent) {
- return new NDKEvent(this.ndk, event);
- }
-
- public async createEvent({
- kind,
- tags,
- content,
- rootReplyTo = undefined,
- replyTo = undefined,
- }: {
- kind: NDKKind | number;
- tags: NDKTag[];
- content?: string;
- rootReplyTo?: string;
- replyTo?: string;
- }) {
+ public async get_all_accounts() {
try {
- const event = new NDKEvent(this.ndk);
- if (content) event.content = content;
- event.kind = kind;
- event.tags = tags;
+ const accounts: Account[] = [];
+ const cmd: string[] = await invoke("get_all_nsecs");
- if (rootReplyTo) {
- const rootEvent = await this.ndk.fetchEvent(rootReplyTo);
- if (rootEvent) event.tag(rootEvent, "root");
+ for (const item of cmd) {
+ accounts.push({ npub: item.replace(".nsec", "") });
}
- if (replyTo) {
- const replyEvent = await this.ndk.fetchEvent(replyTo);
- if (replyEvent) event.tag(replyEvent, "reply");
- }
-
- const publish = await event.publish();
-
- if (!publish) throw new Error("Failed to publish event");
- return {
- id: event.id,
- seens: [...publish.values()].map((item) => item.url),
- };
+ this.accounts = accounts;
+ return accounts;
} catch (e) {
- throw new Error(e);
+ console.error(e);
+ return [];
}
}
- public getCleanPubkey(pubkey: string) {
+ public async load_selected_account(npub: string) {
try {
- let hexstring = pubkey
+ const fullNpub = `${npub}.nsec`;
+ const cmd: boolean = await invoke("load_selected_account", {
+ npub: fullNpub,
+ });
+
+ return cmd;
+ } catch (e) {
+ console.error(e);
+ return false;
+ }
+ }
+
+ public async create_guest_account() {
+ try {
+ const keys = await this.create_keys();
+ await this.save_account(keys);
+
+ return keys.npub;
+ } catch (e) {
+ console.error(e);
+ }
+ }
+
+ public async create_keys() {
+ try {
+ const cmd: Keys = await invoke("create_keys");
+ return cmd;
+ } catch (e) {
+ console.error(String(e));
+ }
+ }
+
+ public async save_account(keys: Keys) {
+ try {
+ const cmd: boolean = await invoke("save_key", { nsec: keys.nsec });
+
+ if (cmd) {
+ await invoke("update_signer", { nsec: keys.nsec });
+ }
+
+ return cmd;
+ } catch (e) {
+ console.error(String(e));
+ }
+ }
+
+ public async event_to_bech32(id: string, relays: string[]) {
+ try {
+ const cmd: string = await invoke("event_to_bech32", {
+ id,
+ relays,
+ });
+ return cmd;
+ } catch (e) {
+ console.error(String(e));
+ }
+ }
+
+ public async get_event(id: string) {
+ try {
+ const eventId: string = id
.replace("nostr:", "")
.split("'")[0]
- .split(".")[0]
- .split(",")[0]
- .split("?")[0];
-
- if (
- hexstring.startsWith("npub1") ||
- hexstring.startsWith("nprofile1") ||
- hexstring.startsWith("naddr1")
- ) {
- const decoded = nip19.decode(hexstring);
-
- if (decoded.type === "nprofile") hexstring = decoded.data.pubkey;
- if (decoded.type === "npub") hexstring = decoded.data;
- if (decoded.type === "naddr") hexstring = decoded.data.pubkey;
- }
-
- return hexstring;
+ .split(".")[0];
+ const cmd: string = await invoke("get_event", { id: eventId });
+ const event: Event = JSON.parse(cmd);
+ return event;
} catch (e) {
- console.log(e);
- }
- }
-
- public async getUserProfile(pubkey?: string) {
- try {
- const currentUserPubkey = this.account.pubkey;
- const hexstring = pubkey
- ? this.getCleanPubkey(pubkey)
- : currentUserPubkey;
-
- const user = this.ndk.getUser({
- pubkey: hexstring,
- });
-
- const profile = await user.fetchProfile({
- cacheUsage: NDKSubscriptionCacheUsage.CACHE_FIRST,
- });
-
- return profile;
- } catch {
- throw new Error("user not found");
- }
- }
-
- public async getUserContacts(pubkey?: string) {
- try {
- const currentUserPubkey = this.account.pubkey;
- const hexstring = pubkey
- ? this.getCleanPubkey(pubkey)
- : currentUserPubkey;
-
- const user = this.ndk.getUser({
- pubkey: hexstring,
- });
-
- const contacts = [...(await user.follows(undefined, false))].map(
- (user) => user.pubkey,
- );
-
- if (!pubkey || pubkey === this.account.pubkey) {
- this.account.contacts = contacts;
- }
-
- return contacts;
- } catch (e) {
- console.error(e);
- }
- }
-
- public async getUserRelays({ pubkey }: { pubkey?: string }) {
- try {
- const user = this.ndk.getUser({
- pubkey: pubkey ? pubkey : this.account.pubkey,
- });
- return await user.relayList();
- } catch (e) {
- console.error(e);
- }
- }
-
- public async newContactList({ tags }: { tags: NDKTag[] }) {
- const publish = await this.createEvent({
- kind: NDKKind.Contacts,
- tags: tags,
- });
-
- if (publish) {
- this.account.contacts = tags.map((item) => item[1]);
- return publish;
- }
- }
-
- public async createContact(pubkey: string) {
- const user = this.ndk.getUser({ pubkey: this.account.pubkey });
- const contacts = await user.follows();
- return await user.follow(new NDKUser({ pubkey: pubkey }), contacts);
- }
-
- public async deleteContact(pubkey: string) {
- const user = this.ndk.getUser({ pubkey: this.account.pubkey });
- const contacts = await user.follows();
- contacts.delete(new NDKUser({ pubkey: pubkey }));
-
- const event = new NDKEvent(this.ndk);
- event.content = "";
- event.kind = NDKKind.Contacts;
- event.tags = [...contacts].map((item) => [
- "p",
- item.pubkey,
- item.relayUrls?.[0] || "",
- "",
- ]);
-
- return await event.publish();
- }
-
- public async getAllEvents({ filter }: { filter: NDKFilter }) {
- const events = await this.ndk.fetchEvents(filter);
- if (!events) return [];
- return [...events];
- }
-
- public getCleanEventId(id: string) {
- let eventId: string = id.replace("nostr:", "").split("'")[0].split(".")[0];
-
- if (
- eventId.startsWith("nevent1") ||
- eventId.startsWith("note1") ||
- eventId.startsWith("naddr1")
- ) {
- const decode = nip19.decode(eventId);
- if (decode.type === "nevent") eventId = decode.data.id;
- if (decode.type === "note") eventId = decode.data;
- }
-
- return eventId;
- }
-
- public async getEventById(id: string) {
- try {
- const eventId = this.getCleanEventId(id);
- return await this.ndk.fetchEvent(eventId);
- } catch {
- throw new Error("event not found");
- }
- }
-
- public async getEventByFilter({
- filter,
- cache,
- }: { filter: NDKFilter; cache?: NDKSubscriptionCacheUsage }) {
- const event = await this.ndk.fetchEvent(filter, {
- cacheUsage: cache || NDKSubscriptionCacheUsage.CACHE_FIRST,
- });
-
- if (!event) return null;
- return event;
- }
-
- public async getEvents(filter: NDKFilter) {
- const events = await this.ndk.fetchEvents(filter);
- if (!events) return [];
- return [...events];
- }
-
- public getEventThread({
- content,
- tags,
- }: { content: string; tags: NDKTag[] }) {
- let rootEventId: string = null;
- let replyEventId: string = null;
-
- if (content.includes("nostr:note1") || content.includes("nostr:nevent1"))
return null;
-
- const events = tags.filter((el) => el[0] === "e" && el[3] !== "mention");
-
- if (!events.length) return null;
-
- if (events.length === 1)
- return {
- rootEventId: events[0][1],
- replyEventId: null,
- };
-
- if (events.length > 1) {
- rootEventId = events.find((el) => el[3] === "root")?.[1];
- replyEventId = events.find((el) => el[3] === "reply")?.[1];
-
- if (!rootEventId && !replyEventId) {
- rootEventId = events[0][1];
- replyEventId = events[1][1];
- }
}
-
- return {
- rootEventId,
- replyEventId,
- };
}
- public async getThreads(id: string) {
- const eventId = this.getCleanEventId(id);
- const fetcher = NostrFetcher.withCustomPool(ndkAdapter(this.ndk));
- const relayUrls = Array.from(this.ndk.pool.relays.keys());
-
+ public async get_events_from(id: string, limit: number, asOf?: number) {
try {
- const rawEvents = (await fetcher.fetchAllEvents(
- relayUrls,
- {
- kinds: [NDKKind.Text],
- "#e": [eventId],
- },
- { since: 0 },
- { sort: true },
- )) as unknown as NostrEvent[];
+ let until: string = undefined;
+ if (asOf && asOf > 0) until = asOf.toString();
- const events = rawEvents.map(
- (event) => new NDKEvent(this.ndk, event),
- ) as NDKEvent[] as NDKEventWithReplies[];
+ const nostrEvents: Event[] = await invoke("get_events_from", {
+ id,
+ limit,
+ until,
+ });
+
+ return nostrEvents.sort((a, b) => b.created_at - a.created_at);
+ } catch {
+ return [];
+ }
+ }
+
+ public async get_events(
+ type: "local" | "global",
+ limit: number,
+ asOf?: number,
+ dedup?: boolean,
+ ) {
+ try {
+ let until: string = undefined;
+ if (asOf && asOf > 0) until = asOf.toString();
+
+ const seenIds = new Set();
+ const dedupQueue = new Set();
+
+ const nostrEvents: Event[] = await invoke(`get_${type}_events`, {
+ limit,
+ until,
+ });
+
+ if (dedup) {
+ for (const event of nostrEvents) {
+ const tags = event.tags
+ .filter((el) => el[0] === "e")
+ ?.map((item) => item[1]);
+
+ if (tags.length) {
+ for (const tag of tags) {
+ if (seenIds.has(tag)) {
+ dedupQueue.add(event.id);
+ break;
+ }
+
+ seenIds.add(tag);
+ }
+ }
+ }
+
+ return nostrEvents
+ .filter((event) => !dedupQueue.has(event.id))
+ .sort((a, b) => b.created_at - a.created_at);
+ }
+
+ return nostrEvents.sort((a, b) => b.created_at - a.created_at);
+ } catch {
+ return [];
+ }
+ }
+
+ public async publish(content: string, reply_to?: string, quote?: boolean) {
+ try {
+ const g = await generateContentTags(content);
+
+ const eventContent = g.content;
+ const eventTags = g.tags;
+
+ if (reply_to) {
+ const replyEvent = await this.get_event(reply_to);
+
+ if (quote) {
+ eventTags.push([
+ "e",
+ replyEvent.id,
+ replyEvent.relay || "",
+ "mention",
+ ]);
+ } else {
+ const rootEvent = replyEvent.tags.find((ev) => ev[3] === "root");
+
+ if (rootEvent) {
+ eventTags.push(["e", rootEvent[1], rootEvent[2] || "", "root"]);
+ }
+
+ eventTags.push(["e", replyEvent.id, replyEvent.relay || "", "reply"]);
+ eventTags.push(["p", replyEvent.pubkey]);
+ }
+ }
+
+ const cmd: string = await invoke("publish", {
+ content: eventContent,
+ tags: eventTags,
+ });
+
+ return cmd;
+ } catch (e) {
+ console.error(String(e));
+ return false;
+ }
+ }
+
+ public async reply_to(content: string, tags: string[]) {
+ try {
+ const cmd: string = await invoke("reply_to", { content, tags });
+ return cmd;
+ } catch (e) {
+ console.error(String(e));
+ }
+ }
+
+ public async repost(id: string, author: string) {
+ try {
+ const cmd: string = await invoke("repost", { id, pubkey: author });
+ return cmd;
+ } catch (e) {
+ console.error(String(e));
+ }
+ }
+
+ public async upvote(id: string, author: string) {
+ try {
+ const cmd: string = await invoke("upvote", { id, pubkey: author });
+ return cmd;
+ } catch (e) {
+ console.error(String(e));
+ }
+ }
+
+ public async downvote(id: string, author: string) {
+ try {
+ const cmd: string = await invoke("downvote", { id, pubkey: author });
+ return cmd;
+ } catch (e) {
+ console.error(String(e));
+ }
+ }
+
+ public async get_event_thread(id: string) {
+ try {
+ const events: EventWithReplies[] = await invoke("get_event_thread", {
+ id,
+ });
if (events.length > 0) {
const replies = new Set();
@@ -359,263 +284,251 @@ export class Ark {
return events;
} catch (e) {
- console.log(e);
- } finally {
- fetcher.shutdown();
+ return [];
}
}
- public async getAllRelaysFromContacts({ signal }: { signal: AbortSignal }) {
- const fetcher = NostrFetcher.withCustomPool(ndkAdapter(this.ndk));
- const connectedRelays = Array.from(this.ndk.pool.relays.keys());
+ public parse_event_thread({
+ content,
+ tags,
+ }: { content: string; tags: string[][] }) {
+ let rootEventId: string = null;
+ let replyEventId: string = null;
- try {
- const relayMap = new Map();
- const relayEvents = fetcher.fetchLatestEventsPerAuthor(
- {
- authors: this.account.contacts,
- relayUrls: connectedRelays,
- },
- { kinds: [NDKKind.RelayList] },
- 1,
- { abortSignal: signal },
- );
+ // Ignore quote repost
+ if (content.includes("nostr:note1") || content.includes("nostr:nevent1"))
+ return null;
- for await (const { author, events } of relayEvents) {
- if (events.length) {
- const relayTags = events[0].tags.filter((item) => item[0] === "r");
- for (const tag of relayTags) {
- const item = relayMap.get(tag[1]);
- if (item?.length) {
- item.push(author);
- } else {
- relayMap.set(tag[1], [author]);
- }
- }
- }
- }
+ // Get all event references from tags, ignore mention
+ const events = tags.filter((el) => el[0] === "e" && el[3] !== "mention");
- return relayMap;
- } catch (e) {
- console.log(e);
- } finally {
- fetcher.shutdown();
+ if (!events.length) return null;
+ if (events.length === 1) {
+ return {
+ rootEventId: events[0][1],
+ replyEventId: null,
+ };
}
- }
+ if (events.length > 1) {
+ rootEventId = events.find((el) => el[3] === "root")?.[1];
+ replyEventId = events.find((el) => el[3] === "reply")?.[1];
- public async getInfiniteEvents({
- filter,
- limit,
- pageParam = 0,
- signal = undefined,
- dedup = true,
- }: {
- filter: NDKFilter;
- limit: number;
- pageParam?: number;
- signal?: AbortSignal;
- dedup?: boolean;
- }) {
- const fetcher = NostrFetcher.withCustomPool(ndkAdapter(this.ndk));
- const relayUrls = Array.from(this.ndk.pool.relays.keys());
- const seenIds = new Set();
- const dedupQueue = new Set();
-
- try {
- const events = await fetcher.fetchLatestEvents(relayUrls, filter, limit, {
- asOf: pageParam === 0 ? undefined : pageParam,
- abortSignal: signal,
- });
-
- const ndkEvents = events.map((event) => {
- return new NDKEvent(this.ndk, event);
- });
-
- if (dedup) {
- for (const event of ndkEvents) {
- const tags = event.tags
- .filter((el) => el[0] === "e")
- ?.map((item) => item[1]);
-
- if (tags.length) {
- for (const tag of tags) {
- if (seenIds.has(tag)) {
- dedupQueue.add(event.id);
- break;
- }
-
- seenIds.add(tag);
- }
- }
- }
-
- return ndkEvents
- .filter((event) => !dedupQueue.has(event.id))
- .sort((a, b) => b.created_at - a.created_at);
- }
-
- return ndkEvents.sort((a, b) => b.created_at - a.created_at);
- } catch (e) {
- console.log(e);
- } finally {
- fetcher.shutdown();
- }
- }
-
- public async getRelayEvents({
- relayUrl,
- filter,
- limit,
- pageParam = 0,
- signal = undefined,
- }: {
- relayUrl: string;
- filter: NDKFilter;
- limit: number;
- pageParam?: number;
- signal?: AbortSignal;
- dedup?: boolean;
- }) {
- const fetcher = NostrFetcher.withCustomPool(ndkAdapter(this.ndk));
-
- try {
- const events = await fetcher.fetchLatestEvents(
- [normalizeRelayUrl(relayUrl)],
- filter,
- limit,
- {
- asOf: pageParam === 0 ? undefined : pageParam,
- abortSignal: signal,
- },
- );
-
- const ndkEvents = events.map((event) => {
- return new NDKEvent(this.ndk, event);
- });
-
- return ndkEvents.sort((a, b) => b.created_at - a.created_at);
- } catch (e) {
- console.log(e);
- } finally {
- fetcher.shutdown();
- }
- }
-
- /**
- * Upload media file to nostr.build
- * @todo support multiple backends
- */
- public async upload({ fileExts }: { fileExts?: string[] }) {
- const defaultExts = ["png", "jpeg", "jpg", "gif"].concat(fileExts);
-
- const selected = await open({
- multiple: false,
- filters: [
- {
- name: "Image",
- extensions: defaultExts,
- },
- ],
- });
-
- if (!selected) return null;
-
- const file = await readFile(selected.path);
- const blob = new Blob([file]);
-
- const data = new FormData();
- data.append("fileToUpload", blob);
- data.append("submit", "Upload Image");
-
- const res = await fetch("https://nostr.build/api/v2/upload/files", {
- method: "POST",
- body: data,
- });
-
- if (!res.ok) return null;
-
- const json = await res.json();
- const content = json.data[0];
-
- return content.url as string;
- }
-
- public async validateNIP05({
- pubkey,
- nip05,
- signal,
- }: {
- pubkey: string;
- nip05: string;
- signal?: AbortSignal;
- }) {
- const localPath = nip05.split("@")[0];
- const service = nip05.split("@")[1];
- const verifyURL = `https://${service}/.well-known/nostr.json?name=${localPath}`;
-
- const res = await fetch(verifyURL, {
- method: "GET",
- headers: {
- "Content-Type": "application/json; charset=utf-8",
- },
- signal,
- });
-
- if (!res.ok) throw new Error(`Failed to fetch NIP-05 service: ${nip05}`);
-
- const data: NIP05 = await res.json();
-
- if (!data.names) return false;
- if (data.names[localPath.toLowerCase()] === pubkey) return true;
- if (data.names[localPath] === pubkey) return true;
-
- return false;
- }
-
- public async getAppRecommend({
- unknownKind,
- author,
- }: { unknownKind: string; author?: string }) {
- const event = await this.ndk.fetchEvent({
- kinds: [NDKKind.AppRecommendation],
- "#d": [unknownKind],
- authors: this.account.contacts || [author],
- });
-
- if (event) return event.tags.filter((item) => item[0] !== "d");
-
- const altEvent = await this.ndk.fetchEvent({
- kinds: [NDKKind.AppHandler],
- "#k": [unknownKind],
- authors: this.account.contacts || [author],
- });
-
- if (altEvent) return altEvent.tags.filter((item) => item[0] !== "d");
-
- return null;
- }
-
- public async getOAuthServices() {
- const trusted: NDKEvent[] = [];
-
- const services = await this.ndk.fetchEvents({
- kinds: [NDKKind.AppHandler],
- "#k": ["24133"],
- });
-
- for (const service of services) {
- const nip05 = JSON.parse(service.content).nip05 as string;
- try {
- const validate = await this.validateNIP05({
- pubkey: service.pubkey,
- nip05,
- });
- if (validate) trusted.push(service);
- } catch (e) {
- console.log(e);
+ if (!rootEventId && !replyEventId) {
+ rootEventId = events[0][1];
+ replyEventId = events[1][1];
}
}
- return trusted;
+ return {
+ rootEventId,
+ replyEventId,
+ };
+ }
+
+ public async get_profile(pubkey: string) {
+ try {
+ const id = pubkey
+ .replace("nostr:", "")
+ .split("'")[0]
+ .split(".")[0]
+ .split(",")[0]
+ .split("?")[0];
+ const cmd: Metadata = await invoke("get_profile", { id });
+
+ return cmd;
+ } catch {
+ return null;
+ }
+ }
+
+ public async get_contact_list() {
+ try {
+ const cmd: string[] = await invoke("get_contact_list");
+ return cmd;
+ } catch (e) {
+ console.error(e);
+ return [];
+ }
+ }
+
+ public async get_contact_metadata() {
+ try {
+ const cmd: Contact[] = await invoke("get_contact_metadata");
+ return cmd;
+ } catch (e) {
+ console.error(e);
+ return [];
+ }
+ }
+
+ public async follow(id: string, alias?: string) {
+ try {
+ const cmd: string = await invoke("follow", { id, alias });
+ return cmd;
+ } catch (e) {
+ console.error(e);
+ return false;
+ }
+ }
+
+ public async unfollow(id: string) {
+ try {
+ const cmd: string = await invoke("unfollow", { id });
+ return cmd;
+ } catch (e) {
+ console.error(e);
+ return false;
+ }
+ }
+
+ public async user_to_bech32(key: string, relays: string[]) {
+ try {
+ const cmd: string = await invoke("user_to_bech32", {
+ key,
+ relays,
+ });
+ return cmd;
+ } catch (e) {
+ console.error(String(e));
+ }
+ }
+
+ public async verify_nip05(pubkey: string, nip05: string) {
+ try {
+ const cmd: boolean = await invoke("verify_nip05", {
+ key: pubkey,
+ nip05,
+ });
+ return cmd;
+ } catch {
+ return false;
+ }
+ }
+
+ public async set_nwc(uri: string) {
+ try {
+ const cmd: boolean = await invoke("set_nwc", { uri });
+ return cmd;
+ } catch {
+ return false;
+ }
+ }
+
+ public async zap_profile(id: string, amount: number, message: string) {
+ try {
+ const cmd: boolean = await invoke("zap_profile", { id, amount, message });
+ return cmd;
+ } catch {
+ return false;
+ }
+ }
+
+ public async zap_event(id: string, amount: number, message: string) {
+ try {
+ const cmd: boolean = await invoke("zap_event", { id, amount, message });
+ return cmd;
+ } catch {
+ return false;
+ }
+ }
+
+ public async upload(filePath?: string) {
+ try {
+ const allowExts = [
+ "png",
+ "jpeg",
+ "jpg",
+ "gif",
+ "mp4",
+ "mp3",
+ "webm",
+ "mkv",
+ "avi",
+ "mov",
+ ];
+
+ const selected =
+ filePath ||
+ (
+ await open({
+ multiple: false,
+ filters: [
+ {
+ name: "Media",
+ extensions: allowExts,
+ },
+ ],
+ })
+ ).path;
+
+ if (!selected) return null;
+
+ const file = await readFile(selected);
+ const blob = new Blob([file]);
+
+ const data = new FormData();
+ data.append("fileToUpload", blob);
+ data.append("submit", "Upload Image");
+
+ const res = await fetch("https://nostr.build/api/v2/upload/files", {
+ method: "POST",
+ body: data,
+ });
+
+ if (!res.ok) return null;
+
+ const json = await res.json();
+ const content = json.data[0];
+
+ return content.url as string;
+ } catch (e) {
+ console.error(String(e));
+ return null;
+ }
+ }
+
+ public open_thread(id: string) {
+ return new WebviewWindow(`event-${id}`, {
+ title: "Thread",
+ url: `/events/${id}`,
+ minWidth: 500,
+ width: 600,
+ height: 800,
+ hiddenTitle: true,
+ titleBarStyle: "overlay",
+ });
+ }
+
+ public open_profile(pubkey: string) {
+ return new WebviewWindow(`user-${pubkey}`, {
+ title: "Profile",
+ url: `/users/${pubkey}`,
+ minWidth: 500,
+ width: 500,
+ height: 800,
+ hiddenTitle: true,
+ titleBarStyle: "overlay",
+ });
+ }
+
+ public open_editor(reply_to?: string, quote: boolean = false) {
+ let url: string;
+
+ if (reply_to) {
+ url = `/editor?reply_to=${reply_to}"e=${quote}`;
+ } else {
+ url = "/editor";
+ }
+
+ return new WebviewWindow("editor", {
+ title: "Editor",
+ url,
+ minWidth: 500,
+ width: 600,
+ height: 400,
+ hiddenTitle: true,
+ titleBarStyle: "overlay",
+ fileDropEnabled: true,
+ });
}
}
diff --git a/packages/ark/src/components/column/header.tsx b/packages/ark/src/components/column/header.tsx
deleted file mode 100644
index 46e11b60..00000000
--- a/packages/ark/src/components/column/header.tsx
+++ /dev/null
@@ -1,112 +0,0 @@
-import {
- ChevronDownIcon,
- MoveLeftIcon,
- MoveRightIcon,
- RefreshIcon,
- TrashIcon,
-} from "@lume/icons";
-import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
-import { useQueryClient } from "@tanstack/react-query";
-import { useTranslation } from "react-i18next";
-import { InterestModal } from "./interestModal";
-import { useColumnContext } from "./provider";
-
-export function ColumnHeader({
- id,
- title,
- queryKey,
-}: {
- id: number;
- title: string;
- queryKey?: string[];
-}) {
- const queryClient = useQueryClient();
-
- const { t } = useTranslation();
- const { moveColumn, removeColumn } = useColumnContext();
-
- const refresh = async () => {
- if (queryKey) await queryClient.refetchQueries({ queryKey });
- };
-
- const moveLeft = async () => {
- moveColumn(id, "left");
- };
-
- const moveRight = async () => {
- moveColumn(id, "right");
- };
-
- const deleteWidget = async () => {
- await removeColumn(id);
- };
-
- return (
-
-
-
-
-
-
-
-
-
-
- {t("global.refresh")}
-
-
- {queryKey?.[0] === "foryou-9998" ? (
-
-
-
- ) : null}
-
-
-
- {t("global.moveLeft")}
-
-
-
-
-
- {t("global.moveRight")}
-
-
-
-
-
-
- {t("global.delete")}
-
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/column/interestModal.tsx b/packages/ark/src/components/column/interestModal.tsx
deleted file mode 100644
index b52647a5..00000000
--- a/packages/ark/src/components/column/interestModal.tsx
+++ /dev/null
@@ -1,157 +0,0 @@
-import { ArrowLeftIcon, EditInterestIcon, LoaderIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { TOPICS, cn } from "@lume/utils";
-import * as Dialog from "@radix-ui/react-dialog";
-import { useQueryClient } from "@tanstack/react-query";
-import { ReactNode, useState } from "react";
-import { useTranslation } from "react-i18next";
-import { toast } from "sonner";
-
-export function InterestModal({
- queryKey,
- className,
- children,
-}: { queryKey: string[]; className?: string; children?: ReactNode }) {
- const storage = useStorage();
- const queryClient = useQueryClient();
-
- const [t] = useTranslation();
- const [open, setOpen] = useState(false);
- const [loading, setLoading] = useState(false);
- const [hashtags, setHashtags] = useState(storage.interests?.hashtags || []);
-
- const toggleHashtag = (item: string) => {
- const arr = hashtags.includes(item)
- ? hashtags.filter((i) => i !== item)
- : [...hashtags, item];
- setHashtags(arr);
- };
-
- const toggleAll = (item: string[]) => {
- const sets = new Set([...hashtags, ...item]);
- setHashtags([...sets]);
- };
-
- const submit = async () => {
- try {
- setLoading(true);
-
- const save = await storage.createSetting(
- "interests",
- JSON.stringify({ hashtags }),
- );
-
- if (save) {
- storage.interests = { hashtags, users: [], words: [] };
- await queryClient.refetchQueries({ queryKey });
- }
-
- setLoading(false);
- setOpen(false);
- } catch (e) {
- setLoading(false);
- toast.error(String(e));
- }
- };
-
- return (
-
-
- {children ? (
- children
- ) : (
- <>
-
- {t("interests.edit")}
- >
- )}
-
-
-
-
-
-
-
-
-
-
{t("interests.edit")}
-
-
-
-
-
- {TOPICS.map((topic) => (
-
-
-
-
-
- {topic.title}
-
-
-
toggleAll(topic.content)}
- className="text-sm font-medium text-blue-500"
- >
- {t("interests.followAll")}
-
-
-
- {topic.content.map((hashtag) => (
- toggleHashtag(hashtag)}
- className={cn(
- "inline-flex items-center rounded-full bg-neutral-100 dark:bg-neutral-900 border border-transparent px-2 py-1 text-sm font-medium",
- hashtags.includes(hashtag)
- ? "border-blue-500 text-blue-500"
- : "",
- )}
- >
- {hashtag}
-
- ))}
-
-
- ))}
-
-
-
-
-
- {t("global.cancel")}
-
-
- {loading ? (
-
- ) : (
- t("global.save")
- )}
-
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/column/provider.tsx b/packages/ark/src/components/column/provider.tsx
deleted file mode 100644
index 9ce8ee35..00000000
--- a/packages/ark/src/components/column/provider.tsx
+++ /dev/null
@@ -1,145 +0,0 @@
-import { useStorage } from "@lume/storage";
-import { IColumn } from "@lume/types";
-import { COL_TYPES } from "@lume/utils";
-import {
- type MutableRefObject,
- type ReactNode,
- createContext,
- useCallback,
- useContext,
- useEffect,
- useRef,
- useState,
-} from "react";
-import { toast } from "sonner";
-import { type VListHandle } from "virtua";
-
-type ColumnContext = {
- columns: IColumn[];
- vlistRef: MutableRefObject;
- addColumn: (column: IColumn) => Promise;
- removeColumn: (id: number) => Promise;
- moveColumn: (id: number, position: "left" | "right") => void;
- updateColumn: (id: number, title: string, content: string) => Promise;
- loadAllColumns: () => Promise;
-};
-
-const ColumnContext = createContext(null);
-
-export function ColumnProvider({ children }: { children: ReactNode }) {
- const storage = useStorage();
- const vlistRef = useRef(null);
-
- const [columns, setColumns] = useState([
- {
- id: 9999,
- title: "Newsfeed",
- content: "",
- kind: COL_TYPES.newsfeed,
- },
- {
- id: 9998,
- title: "For You",
- content: "",
- kind: COL_TYPES.foryou,
- },
- ]);
-
- const loadAllColumns = useCallback(async () => {
- return await storage.getColumns();
- }, []);
-
- const addColumn = useCallback(async (column: IColumn) => {
- const result = await storage.createColumn(
- column.kind,
- column.title,
- column.content,
- );
- if (result) {
- setColumns((prev) => [...prev, result]);
- vlistRef?.current.scrollToIndex(columns.length);
- }
- }, []);
-
- const removeColumn = useCallback(async (id: number) => {
- if (id === 9998 || id === 9999) {
- toast.info("You cannot remove default column");
- return;
- }
-
- await storage.removeColumn(id);
- setColumns((prev) => prev.filter((t) => t.id !== id));
- }, []);
-
- const updateColumn = useCallback(
- async (id: number, title: string, content: string) => {
- const res = await storage.updateColumn(id, title, content);
- if (res) {
- const newCols = columns.map((col) => {
- if (col.id === id) {
- return { ...col, title, content };
- }
- return col;
- });
-
- setColumns(newCols);
- }
- },
- [columns],
- );
-
- const moveColumn = useCallback(
- (id: number, position: "left" | "right") => {
- const newCols = [...columns];
-
- const col = newCols.find((el) => el.id === id);
- const colIndex = newCols.findIndex((el) => el.id === id);
-
- newCols.splice(colIndex, 1);
-
- if (position === "left") newCols.splice(colIndex - 1, 0, col);
- if (position === "right") newCols.splice(colIndex + 1, 0, col);
-
- setColumns(newCols);
- },
- [columns],
- );
-
- useEffect(() => {
- let isMounted = true;
-
- loadAllColumns().then((data) => {
- if (isMounted) setColumns((prev) => [...prev, ...data]);
- });
-
- return () => {
- isMounted = false;
- };
- }, []);
-
- return (
-
- {children}
-
- );
-}
-
-export function useColumnContext() {
- const context = useContext(ColumnContext);
- if (!context) {
- throw new Error(
- "Please import Column Provider to use useColumnContext() hook",
- );
- }
- return context;
-}
diff --git a/packages/ark/src/components/note/appHandler.tsx b/packages/ark/src/components/note/appHandler.tsx
deleted file mode 100644
index f229f063..00000000
--- a/packages/ark/src/components/note/appHandler.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import { NDKAppHandlerEvent } from "@nostr-dev-kit/ndk";
-import { useQuery } from "@tanstack/react-query";
-import { useArk } from "../../hooks/useArk";
-
-export function AppHandler({ tag }: { tag: string[] }) {
- const ark = useArk();
-
- const { isLoading, isError, data } = useQuery({
- queryKey: ["app-handler", tag[1]],
- queryFn: async () => {
- const ref = tag[1].split(":");
- const event = await ark.getEventByFilter({
- filter: {
- kinds: [Number(ref[0])],
- authors: [ref[1]],
- "#d": [ref[2]],
- },
- });
-
- if (!event) return null;
-
- const app = NDKAppHandlerEvent.from(event);
- return await app.fetchProfile();
- },
- refetchOnWindowFocus: false,
- });
-
- if (isLoading) {
- Loading...
;
- }
-
- if (isError || !data) {
- return Error
;
- }
-
- return (
-
-
-
-
- {data.name}
-
-
- {data.about}
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/buttons/reaction.tsx b/packages/ark/src/components/note/buttons/reaction.tsx
deleted file mode 100644
index d29f2b8c..00000000
--- a/packages/ark/src/components/note/buttons/reaction.tsx
+++ /dev/null
@@ -1,137 +0,0 @@
-import { ReactionIcon } from "@lume/icons";
-import * as HoverCard from "@radix-ui/react-hover-card";
-import { useState } from "react";
-import { useNoteContext } from "../provider";
-
-const REACTIONS = [
- {
- content: "👏",
- img: "/clapping_hands.png",
- },
- {
- content: "🤪",
- img: "/face_with_tongue.png",
- },
- {
- content: "😮",
- img: "/face_with_open_mouth.png",
- },
- {
- content: "😢",
- img: "/crying_face.png",
- },
- {
- content: "🤡",
- img: "/clown_face.png",
- },
-];
-
-export function NoteReaction() {
- const event = useNoteContext();
-
- const [open, setOpen] = useState(false);
- const [reaction, setReaction] = useState(null);
-
- const getReactionImage = (content: string) => {
- const reaction: { img: string } = REACTIONS.find(
- (el) => el.content === content,
- );
- return reaction.img;
- };
-
- const react = async (content: string) => {
- try {
- setReaction(content);
-
- // react
- await event.react(content);
-
- setOpen(false);
- } catch (e) {
- console.error(e);
- }
- };
-
- return (
-
-
-
- {reaction ? (
-
- ) : (
-
- )}
-
-
-
-
-
-
react("👏")}
- className="inline-flex items-center justify-center w-8 h-8 rounded-md backdrop-blur-xl hover:bg-white/10 dark:hover:bg-black/10"
- >
-
-
-
react("🤪")}
- className="inline-flex items-center justify-center w-8 h-8 rounded-md backdrop-blur-xl hover:bg-white/10 dark:hover:bg-black/10"
- >
-
-
-
react("😮")}
- className="inline-flex items-center justify-center w-8 h-8 rounded-md backdrop-blur-xl hover:bg-white/10 dark:hover:bg-black/10"
- >
-
-
-
react("😢")}
- className="inline-flex items-center justify-center w-8 h-8 rounded-md backdrop-blur-xl hover:bg-white/10 dark:hover:bg-black/10"
- >
-
-
-
react("🤡")}
- className="inline-flex items-center justify-center w-8 h-8 rounded-md backdrop-blur-xl hover:bg-white/10 dark:hover:bg-black/10"
- >
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/buttons/reply.tsx b/packages/ark/src/components/note/buttons/reply.tsx
deleted file mode 100644
index 1371e4ac..00000000
--- a/packages/ark/src/components/note/buttons/reply.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { ReplyIcon } from "@lume/icons";
-import * as Tooltip from "@radix-ui/react-tooltip";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-import { useNoteContext } from "../provider";
-
-export function NoteReply() {
- const event = useNoteContext();
- const navigate = useNavigate();
-
- const { t } = useTranslation();
-
- return (
-
-
-
- navigate(`/events/${event.id}`)}
- className="inline-flex items-center justify-center group h-7 w-7 text-neutral-600 dark:text-neutral-400"
- >
-
-
-
-
-
- {t("note.menu.viewThread")}
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/buttons/repost.tsx b/packages/ark/src/components/note/buttons/repost.tsx
deleted file mode 100644
index 9cc7f07e..00000000
--- a/packages/ark/src/components/note/buttons/repost.tsx
+++ /dev/null
@@ -1,118 +0,0 @@
-import { LoaderIcon, ReplyIcon, RepostIcon } from "@lume/icons";
-import { cn, editorAtom, editorValueAtom } from "@lume/utils";
-import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
-import * as Tooltip from "@radix-ui/react-tooltip";
-import { useSetAtom } from "jotai";
-import { nip19 } from "nostr-tools";
-import { useState } from "react";
-import { useTranslation } from "react-i18next";
-import { toast } from "sonner";
-import { useNoteContext } from "../provider";
-
-export function NoteRepost() {
- const event = useNoteContext();
- const setEditorValue = useSetAtom(editorValueAtom);
- const setIsEditorOpen = useSetAtom(editorAtom);
-
- const [t] = useTranslation();
- const [loading, setLoading] = useState(false);
- const [isRepost, setIsRepost] = useState(false);
- const [open, setOpen] = useState(false);
-
- const repost = async () => {
- try {
- setLoading(true);
-
- // repost
- await event.repost(true);
-
- // update state
- setLoading(false);
- setIsRepost(true);
-
- // notify
- toast.success("You've reposted this post successfully");
- } catch (e) {
- setLoading(false);
- toast.error("Repost failed, try again later");
- }
- };
-
- const quote = () => {
- setEditorValue([
- {
- type: "paragraph",
- children: [{ text: "" }],
- },
- {
- type: "event",
- // @ts-expect-error, useless
- eventId: `nostr:${nip19.noteEncode(event.id)}`,
- children: [{ text: "" }],
- },
- {
- type: "paragraph",
- children: [{ text: "" }],
- },
- ]);
- setIsEditorOpen(true);
- };
-
- return (
-
-
-
-
-
-
- {loading ? (
-
- ) : (
-
- )}
-
-
-
-
-
- {t("note.buttons.repost")}
-
-
-
-
-
-
-
-
-
-
- {t("note.buttons.repost")}
-
-
-
-
-
- {t("note.buttons.quote")}
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/buttons/zap.tsx b/packages/ark/src/components/note/buttons/zap.tsx
deleted file mode 100644
index c27e3505..00000000
--- a/packages/ark/src/components/note/buttons/zap.tsx
+++ /dev/null
@@ -1,260 +0,0 @@
-import { webln } from "@getalby/sdk";
-import { type SendPaymentResponse } from "@getalby/sdk/dist/types";
-import { CancelIcon, LoaderIcon, ZapIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { cn, compactNumber, displayNpub } from "@lume/utils";
-import * as Dialog from "@radix-ui/react-dialog";
-import * as Tooltip from "@radix-ui/react-tooltip";
-import { QRCodeSVG } from "qrcode.react";
-import { useState } from "react";
-import CurrencyInput from "react-currency-input-field";
-import { useTranslation } from "react-i18next";
-import { toast } from "sonner";
-import { useProfile } from "../../../hooks/useProfile";
-import { useNoteContext } from "../provider";
-
-export function NoteZap() {
- const storage = useStorage();
- const event = useNoteContext();
-
- const [amount, setAmount] = useState("21");
- const [zapMessage, setZapMessage] = useState("");
- const [isOpen, setIsOpen] = useState(false);
- const [isCompleted, setIsCompleted] = useState(false);
- const [isLoading, setIsLoading] = useState(false);
- const [invoice, setInvoice] = useState(null);
-
- const { t } = useTranslation();
- const { user } = useProfile(event.pubkey);
-
- const createZapRequest = async (instant?: boolean) => {
- if (instant && !storage.nwc) return;
-
- let nwc: webln.NostrWebLNProvider = undefined;
-
- try {
- // start loading
- setIsLoading(true);
-
- const zapAmount = parseInt(amount) * 1000;
- const res = await event.zap(zapAmount, zapMessage);
-
- if (!storage.nwc) return setInvoice(res);
-
- // user connect nwc
- nwc = new webln.NostrWebLNProvider({
- nostrWalletConnectUrl: storage.nwc,
- });
- await nwc.enable();
-
- // send payment via nwc
- const send: SendPaymentResponse = await nwc.sendPayment(res);
-
- if (send) {
- toast.success(
- `You've zapped ${compactNumber.format(send.amount)} sats to ${
- user?.name || user?.displayName || "anon"
- }`,
- );
-
- // reset after 1.5 secs
- if (!instant) {
- const timeout = setTimeout(() => setIsCompleted(false), 1500);
- clearTimeout(timeout);
- }
- }
-
- // eose
- nwc.close();
-
- // update state
- setIsCompleted(true);
- setIsLoading(false);
- } catch (e) {
- nwc?.close();
- setIsLoading(false);
- toast.error(String(e));
- }
- };
-
- if (storage.settings.instantZap) {
- return (
-
-
-
- createZapRequest(true)}
- className="inline-flex items-center justify-center group size-7 text-neutral-600 dark:text-neutral-400"
- >
- {isLoading ? (
-
- ) : (
-
- )}
-
-
-
-
- {t("note.zap.tooltip")}
-
-
-
-
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
- {t("note.zap.tooltip")}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {t("note.zap.modalTitle")}{" "}
- {user?.name ||
- user?.displayName ||
- displayNpub(event.pubkey, 16)}
-
-
- {!invoice ? (
-
-
-
- setAmount(value)}
- className="flex-1 w-full text-4xl font-semibold text-right bg-transparent border-none placeholder:text-neutral-600 focus:outline-none focus:ring-0 dark:text-neutral-400"
- />
-
- sats
-
-
-
- setAmount("69")}
- className="w-max rounded-full bg-neutral-100 px-2.5 py-1 text-sm font-medium hover:bg-neutral-200 dark:bg-neutral-900 dark:hover:bg-neutral-800"
- >
- 69 sats
-
- setAmount("100")}
- className="w-max rounded-full bg-neutral-100 px-2.5 py-1 text-sm font-medium hover:bg-neutral-200 dark:bg-neutral-900 dark:hover:bg-neutral-800"
- >
- 100 sats
-
- setAmount("200")}
- className="w-max rounded-full bg-neutral-100 px-2.5 py-1 text-sm font-medium hover:bg-neutral-200 dark:bg-neutral-900 dark:hover:bg-neutral-800"
- >
- 200 sats
-
- setAmount("500")}
- className="w-max rounded-full bg-neutral-100 px-2.5 py-1 text-sm font-medium hover:bg-neutral-200 dark:bg-neutral-900 dark:hover:bg-neutral-800"
- >
- 500 sats
-
- setAmount("1000")}
- className="w-max rounded-full bg-neutral-100 px-2.5 py-1 text-sm font-medium hover:bg-neutral-200 dark:bg-neutral-900 dark:hover:bg-neutral-800"
- >
- 1K sats
-
-
-
-
-
setZapMessage(e.target.value)}
- spellCheck={false}
- autoComplete="off"
- autoCorrect="off"
- autoCapitalize="off"
- placeholder={t("note.zap.messagePlaceholder")}
- className="w-full resize-none rounded-lg border-transparent bg-neutral-100 px-3 py-3 !outline-none placeholder:text-neutral-600 focus:border-blue-500 focus:ring focus:ring-blue-200 dark:bg-neutral-950 dark:text-neutral-400"
- />
-
- createZapRequest()}
- className="inline-flex items-center justify-center w-full pb-[2px] font-semibold border-t rounded-lg border-neutral-900 dark:border-neutral-800 h-9 bg-neutral-950 text-neutral-50 dark:bg-neutral-900 hover:bg-neutral-900 dark:hover:bg-neutral-800"
- >
- {isCompleted
- ? t("note.zap.buttonFinish")
- : isLoading
- ? t("note.zap.buttonLoading")
- : t("note.zap.zap")}
-
-
-
-
- ) : (
-
-
-
-
-
-
- {t("note.zap.invoiceButton")}
-
-
- {t("note.zap.invoiceFooter")}
-
-
-
- )}
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/child.tsx b/packages/ark/src/components/note/child.tsx
deleted file mode 100644
index ef839800..00000000
--- a/packages/ark/src/components/note/child.tsx
+++ /dev/null
@@ -1,122 +0,0 @@
-import { NOSTR_MENTIONS } from "@lume/utils";
-import { nanoid } from "nanoid";
-import { ReactNode, useMemo } from "react";
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-import reactStringReplace from "react-string-replace";
-import { useEvent } from "../../hooks/useEvent";
-import { User } from "../user";
-import { Hashtag } from "./mentions/hashtag";
-import { MentionUser } from "./mentions/user";
-
-export function NoteChild({
- eventId,
- isRoot,
-}: { eventId: string; isRoot?: boolean }) {
- const { t } = useTranslation();
- const { isLoading, isError, data } = useEvent(eventId);
-
- const richContent = useMemo(() => {
- if (!data) return "";
-
- let parsedContent: string | ReactNode[] = data.content.replace(
- /\n+/g,
- "\n",
- );
-
- const text = parsedContent as string;
- const words = text.split(/( |\n)/);
-
- const hashtags = words.filter((word) => word.startsWith("#"));
- const mentions = words.filter((word) =>
- NOSTR_MENTIONS.some((el) => word.startsWith(el)),
- );
-
- try {
- if (hashtags.length) {
- for (const hashtag of hashtags) {
- const regex = new RegExp(`(|^)${hashtag}\\b`, "g");
- parsedContent = reactStringReplace(parsedContent, regex, () => {
- return ;
- });
- }
- }
-
- if (mentions.length) {
- for (const mention of mentions) {
- parsedContent = reactStringReplace(
- parsedContent,
- mention,
- (match, i) => ,
- );
- }
- }
-
- parsedContent = reactStringReplace(
- parsedContent,
- /(https?:\/\/\S+)/g,
- (match, i) => {
- const url = new URL(match);
- return (
-
- {url.toString()}
-
- );
- },
- );
-
- return parsedContent;
- } catch (e) {
- console.log(e);
- return parsedContent;
- }
- }, [data]);
-
- if (isLoading) {
- return (
-
- );
- }
-
- if (isError || !data) {
- return (
-
-
- {t("note.error")}
-
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
- {isRoot ? t("note.posted") : t("note.replied")}:
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/content.tsx b/packages/ark/src/components/note/content.tsx
deleted file mode 100644
index 1ef1ffde..00000000
--- a/packages/ark/src/components/note/content.tsx
+++ /dev/null
@@ -1,256 +0,0 @@
-import { useStorage } from "@lume/storage";
-import {
- AUDIOS,
- IMAGES,
- NOSTR_EVENTS,
- NOSTR_MENTIONS,
- VIDEOS,
- canPreview,
- cn,
- regionNames,
-} from "@lume/utils";
-import { NDKKind } from "@nostr-dev-kit/ndk";
-import { fetch } from "@tauri-apps/plugin-http";
-import getUrls from "get-urls";
-import { nanoid } from "nanoid";
-import { ReactNode, useMemo, useState } from "react";
-import { Link } from "react-router-dom";
-import reactStringReplace from "react-string-replace";
-import { toast } from "sonner";
-import { stripHtml } from "string-strip-html";
-import { Hashtag } from "./mentions/hashtag";
-import { MentionNote } from "./mentions/note";
-import { MentionUser } from "./mentions/user";
-import { NIP89 } from "./nip89";
-import { ImagePreview } from "./preview/image";
-import { LinkPreview } from "./preview/link";
-import { VideoPreview } from "./preview/video";
-import { useNoteContext } from "./provider";
-
-export function NoteContent({
- className,
-}: {
- className?: string;
-}) {
- const storage = useStorage();
- const event = useNoteContext();
-
- const [content, setContent] = useState(event.content);
- const [translate, setTranslate] = useState({
- translatable: false,
- translated: false,
- });
-
- const richContent = useMemo(() => {
- if (event.kind !== NDKKind.Text) return content;
-
- let parsedContent: string | ReactNode[] = stripHtml(
- content.replace(/\n{2,}\s*/g, "\n"),
- ).result;
- let linkPreview: string = undefined;
- let images: string[] = [];
- let videos: string[] = [];
- let audios: string[] = [];
- let events: string[] = [];
-
- const text = parsedContent;
- const words = text.split(/( |\n)/);
- const urls = [...getUrls(text)];
-
- if (storage.settings.media && !storage.settings.lowPower) {
- images = urls.filter((word) =>
- IMAGES.some((el) => {
- const url = new URL(word);
- const extension = url.pathname.split(".")[1];
- if (extension === el) return true;
- return false;
- }),
- );
- videos = urls.filter((word) =>
- VIDEOS.some((el) => {
- const url = new URL(word);
- const extension = url.pathname.split(".")[1];
- if (extension === el) return true;
- return false;
- }),
- );
- audios = urls.filter((word) =>
- AUDIOS.some((el) => {
- const url = new URL(word);
- const extension = url.pathname.split(".")[1];
- if (extension === el) return true;
- return false;
- }),
- );
- }
-
- events = words.filter((word) =>
- NOSTR_EVENTS.some((el) => word.startsWith(el)),
- );
-
- const hashtags = words.filter((word) => word.startsWith("#"));
- const mentions = words.filter((word) =>
- NOSTR_MENTIONS.some((el) => word.startsWith(el)),
- );
-
- try {
- if (images.length) {
- for (const image of images) {
- parsedContent = reactStringReplace(
- parsedContent,
- image,
- (match, i) => ,
- );
- }
- }
-
- if (videos.length) {
- for (const video of videos) {
- parsedContent = reactStringReplace(
- parsedContent,
- video,
- (match, i) => ,
- );
- }
- }
-
- if (audios.length) {
- for (const audio of audios) {
- parsedContent = reactStringReplace(
- parsedContent,
- audio,
- (match, i) => ,
- );
- }
- }
-
- if (hashtags.length) {
- for (const hashtag of hashtags) {
- const regex = new RegExp(`(|^)${hashtag}\\b`, "g");
- parsedContent = reactStringReplace(parsedContent, regex, () => {
- if (storage.settings.hashtag)
- return ;
- return null;
- });
- }
- }
-
- if (events.length) {
- for (const event of events) {
- parsedContent = reactStringReplace(
- parsedContent,
- event,
- (match, i) => ,
- );
- }
- }
-
- if (mentions.length) {
- for (const mention of mentions) {
- parsedContent = reactStringReplace(
- parsedContent,
- mention,
- (match, i) => ,
- );
- }
- }
-
- parsedContent = reactStringReplace(
- parsedContent,
- /(https?:\/\/\S+)/g,
- (match, i) => {
- const url = new URL(match);
-
- if (!linkPreview && canPreview(match)) {
- linkPreview = match;
- return ;
- }
-
- return (
-
- {url.toString()}
-
- );
- },
- );
-
- parsedContent = reactStringReplace(parsedContent, "\n", () => {
- return
;
- });
-
- if (typeof parsedContent[0] === "string") {
- parsedContent[0] = parsedContent[0].trimStart();
- }
-
- return parsedContent;
- } catch (e) {
- console.warn(event.id, `[parser] parse failed: ${e}`);
- return parsedContent;
- }
- }, [content]);
-
- const translateContent = async () => {
- try {
- if (!translate.translatable) return;
-
- const res = await fetch("https://translate.nostr.wine/translate", {
- method: "POST",
- body: JSON.stringify({
- q: event.content,
- target: storage.locale.slice(0, 2),
- api_key: storage.settings.translateApiKey,
- }),
- headers: { "Content-Type": "application/json" },
- });
-
- if (!res.ok)
- toast.error(
- "Cannot connect to translate service, please try again later.",
- );
-
- const data = await res.json();
-
- setContent(data.translatedText);
- setTranslate((state) => ({ ...state, translated: true }));
- } catch (e) {
- console.error("translate api: ", String(e));
- }
- };
-
- if (event.kind !== NDKKind.Text) {
- return ;
- }
-
- return (
-
-
- {richContent}
-
- {storage.settings.translation && translate.translatable ? (
- translate.translated ? (
-
setContent(event.content)}
- className="mt-3 text-sm text-blue-500 hover:text-blue-600 border-none shadow-none focus:outline-none"
- >
- Show original content
-
- ) : (
-
- Translate to {regionNames.of(storage.locale)}
-
- )
- ) : null}
-
- );
-}
diff --git a/packages/ark/src/components/note/mentions/hashtag.tsx b/packages/ark/src/components/note/mentions/hashtag.tsx
deleted file mode 100644
index 7559e8c1..00000000
--- a/packages/ark/src/components/note/mentions/hashtag.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { COL_TYPES } from "@lume/utils";
-import { useColumnContext } from "../../column/provider";
-
-export function Hashtag({ tag }: { tag: string }) {
- const { addColumn } = useColumnContext();
-
- return (
-
- await addColumn({
- kind: COL_TYPES.hashtag,
- title: tag,
- content: tag,
- })
- }
- className="text-blue-500 break-all cursor-default hover:text-blue-600"
- >
- {tag}
-
- );
-}
diff --git a/packages/ark/src/components/note/mentions/note.tsx b/packages/ark/src/components/note/mentions/note.tsx
deleted file mode 100644
index 14e0a354..00000000
--- a/packages/ark/src/components/note/mentions/note.tsx
+++ /dev/null
@@ -1,153 +0,0 @@
-import { PinIcon } from "@lume/icons";
-import { COL_TYPES, NOSTR_MENTIONS } from "@lume/utils";
-import { ReactNode, useMemo } from "react";
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-import reactStringReplace from "react-string-replace";
-import { useEvent } from "../../../hooks/useEvent";
-import { useColumnContext } from "../../column/provider";
-import { User } from "../../user";
-import { Hashtag } from "./hashtag";
-import { MentionUser } from "./user";
-
-export function MentionNote({
- eventId,
- openable = true,
-}: { eventId: string; openable?: boolean }) {
- const { t } = useTranslation();
- const { addColumn } = useColumnContext();
- const { isLoading, isError, data } = useEvent(eventId);
-
- const richContent = useMemo(() => {
- if (!data) return "";
-
- let parsedContent: string | ReactNode[] = data.content.replace(
- /\n+/g,
- "\n",
- );
-
- const text = parsedContent as string;
- const words = text.split(/( |\n)/);
-
- const hashtags = words.filter((word) => word.startsWith("#"));
- const mentions = words.filter((word) =>
- NOSTR_MENTIONS.some((el) => word.startsWith(el)),
- );
-
- try {
- if (hashtags.length) {
- for (const hashtag of hashtags) {
- parsedContent = reactStringReplace(
- parsedContent,
- hashtag,
- (match, i) => {
- return ;
- },
- );
- }
- }
-
- if (mentions.length) {
- for (const mention of mentions) {
- parsedContent = reactStringReplace(
- parsedContent,
- mention,
- (match, i) => ,
- );
- }
- }
-
- parsedContent = reactStringReplace(
- parsedContent,
- /(https?:\/\/\S+)/g,
- (match, i) => {
- const url = new URL(match);
- return (
-
- {url.toString()}
-
- );
- },
- );
-
- return parsedContent;
- } catch (e) {
- console.log(e);
- return parsedContent;
- }
- }, [data]);
-
- if (isLoading) {
- return (
-
- );
- }
-
- if (isError || !data) {
- return (
-
- {t("note.error")}
-
- );
- }
-
- return (
-
-
-
-
-
-
- ·
-
-
-
-
-
- {richContent}
-
- {openable ? (
-
-
- {t("note.showMore")}
-
-
- await addColumn({
- kind: COL_TYPES.thread,
- title: "Thread",
- content: data.id,
- })
- }
- className="inline-flex items-center justify-center rounded-md text-neutral-600 dark:text-neutral-400 size-6 bg-neutral-200 dark:bg-neutral-800 hover:bg-neutral-300 dark:hover:bg-neutral-700"
- >
-
-
-
- ) : (
-
- )}
-
- );
-}
diff --git a/packages/ark/src/components/note/mentions/user.tsx b/packages/ark/src/components/note/mentions/user.tsx
deleted file mode 100644
index 70249f36..00000000
--- a/packages/ark/src/components/note/mentions/user.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { COL_TYPES } from "@lume/utils";
-import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-import { useArk } from "../../../hooks/useArk";
-import { useProfile } from "../../../hooks/useProfile";
-import { useColumnContext } from "../../column/provider";
-
-export function MentionUser({ pubkey }: { pubkey: string }) {
- const ark = useArk();
- const cleanPubkey = ark.getCleanPubkey(pubkey);
-
- const { isLoading, isError, user } = useProfile(pubkey);
- const { t } = useTranslation();
- const { addColumn } = useColumnContext();
-
- return (
-
-
- {isLoading
- ? "@anon"
- : isError
- ? pubkey
- : `@${user?.name || user?.displayName || user?.username || "anon"}`}
-
-
-
-
- {t("note.buttons.viewProfile")}
-
-
-
-
- await addColumn({
- kind: COL_TYPES.user,
- title: user?.name || user?.displayName || "User",
- content: cleanPubkey,
- })
- }
- className="inline-flex items-center gap-3 px-3 text-sm font-medium rounded-lg h-9 text-black/70 hover:bg-black/10 hover:text-black focus:outline-none dark:text-white/70 dark:hover:bg-white/10 dark:hover:text-white"
- >
- {t("note.buttons.pin")}
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/menu.tsx b/packages/ark/src/components/note/menu.tsx
deleted file mode 100644
index 75f2955d..00000000
--- a/packages/ark/src/components/note/menu.tsx
+++ /dev/null
@@ -1,150 +0,0 @@
-import { HorizontalDotsIcon } from "@lume/icons";
-import { COL_TYPES } from "@lume/utils";
-import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
-import { writeText } from "@tauri-apps/plugin-clipboard-manager";
-import { nip19 } from "nostr-tools";
-import { type EventPointer } from "nostr-tools/lib/types/nip19";
-import { useState } from "react";
-import { useTranslation } from "react-i18next";
-import { Link, useNavigate } from "react-router-dom";
-import { toast } from "sonner";
-import { useColumnContext } from "../column/provider";
-import { useNoteContext } from "./provider";
-
-export function NoteMenu() {
- const event = useNoteContext();
- const navigate = useNavigate();
-
- const { t } = useTranslation();
- const { addColumn } = useColumnContext();
-
- const [open, setOpen] = useState(false);
-
- const copyID = async () => {
- await writeText(
- nip19.neventEncode({
- id: event.id,
- author: event.pubkey,
- } as EventPointer),
- );
- setOpen(false);
- };
-
- const copyRaw = async () => {
- await writeText(JSON.stringify(await event.toNostrEvent()));
- };
-
- const copyNpub = async () => {
- await writeText(nip19.npubEncode(event.pubkey));
- };
-
- const copyLink = async () => {
- await writeText(
- `https://njump.me/${nip19.neventEncode({
- id: event.id,
- author: event.pubkey,
- } as EventPointer)}`,
- );
- setOpen(false);
- };
-
- const muteUser = async () => {
- event.muted();
- toast.info("You've muted this user");
- };
-
- return (
-
-
-
-
-
-
-
-
-
- copyLink()}
- className="inline-flex items-center gap-3 px-3 text-sm font-medium rounded-lg h-9 text-black/70 hover:bg-black/10 hover:text-black focus:outline-none dark:text-white/70 dark:hover:bg-white/10 dark:hover:text-white"
- >
- {t("note.menu.viewThread")}
-
-
-
- navigate(`/events/${event.id}`)}
- className="inline-flex items-center gap-3 px-3 text-sm font-medium rounded-lg h-9 text-black/70 hover:bg-black/10 hover:text-black focus:outline-none dark:text-white/70 dark:hover:bg-white/10 dark:hover:text-white"
- >
- {t("note.menu.copyLink")}
-
-
-
- copyID()}
- className="inline-flex items-center gap-3 px-3 text-sm font-medium rounded-lg h-9 text-black/70 hover:bg-black/10 hover:text-black focus:outline-none dark:text-white/70 dark:hover:bg-white/10 dark:hover:text-white"
- >
- {t("note.menu.copyNoteId")}
-
-
-
- copyNpub()}
- className="inline-flex items-center gap-3 px-3 text-sm font-medium rounded-lg h-9 text-black/70 hover:bg-black/10 hover:text-black focus:outline-none dark:text-white/70 dark:hover:bg-white/10 dark:hover:text-white"
- >
- {t("note.menu.copyAuthorId")}
-
-
-
-
- {t("note.menu.viewAuthor")}
-
-
-
-
- addColumn({
- kind: COL_TYPES.user,
- title: "User",
- content: event.pubkey,
- })
- }
- className="inline-flex items-center gap-3 px-3 text-sm font-medium rounded-lg h-9 text-black/70 hover:bg-black/10 hover:text-black focus:outline-none dark:text-white/70 dark:hover:bg-white/10 dark:hover:text-white"
- >
- {t("note.menu.pinAuthor")}
-
-
-
-
- copyRaw()}
- className="inline-flex items-center gap-3 px-3 text-sm font-medium rounded-lg h-9 text-black/70 hover:bg-black/10 hover:text-black focus:outline-none dark:text-white/70 dark:hover:bg-white/10 dark:hover:text-white"
- >
- {t("note.menu.copyRaw")}
-
-
-
-
- {t("note.menu.mute")}
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/nip89.tsx b/packages/ark/src/components/note/nip89.tsx
deleted file mode 100644
index 0399a68b..00000000
--- a/packages/ark/src/components/note/nip89.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { useQuery } from "@tanstack/react-query";
-import { useTranslation } from "react-i18next";
-import { useArk } from "../../hooks/useArk";
-import { AppHandler } from "./appHandler";
-import { useNoteContext } from "./provider";
-
-export function NIP89({ className }: { className?: string }) {
- const ark = useArk();
- const event = useNoteContext();
-
- const { t } = useTranslation();
- const { isLoading, isError, data } = useQuery({
- queryKey: ["app-recommend", event.id],
- queryFn: () => {
- return ark.getAppRecommend({
- unknownKind: event.kind.toString(),
- author: event.pubkey,
- });
- },
- refetchOnWindowFocus: false,
- refetchOnMount: false,
- staleTime: Infinity,
- });
-
- if (isLoading) {
- Loading...
;
- }
-
- if (isError || !data) {
- return Error
;
- }
-
- return (
-
-
-
-
- {t("nip89.unsupported")}
-
-
- {event.kind}
-
-
-
-
- {t("nip89.openWith")}
-
- {data.map((item) => (
-
- ))}
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/preview/image.tsx b/packages/ark/src/components/note/preview/image.tsx
deleted file mode 100644
index 883ac33c..00000000
--- a/packages/ark/src/components/note/preview/image.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import { CheckCircleIcon, DownloadIcon } from "@lume/icons";
-import { downloadDir } from "@tauri-apps/api/path";
-import { Window } from "@tauri-apps/api/window";
-import { download } from "@tauri-apps/plugin-upload";
-import { SyntheticEvent, useState } from "react";
-
-export function ImagePreview({ url }: { url: string }) {
- const [downloaded, setDownloaded] = useState(false);
-
- const downloadImage = async (e: { stopPropagation: () => void }) => {
- try {
- e.stopPropagation();
-
- const downloadDirPath = await downloadDir();
- const filename = url.substring(url.lastIndexOf("/") + 1);
- await download(url, `${downloadDirPath}/${filename}`);
-
- setDownloaded(true);
- } catch (e) {
- console.error(e);
- }
- };
-
- const open = async () => {
- const name = new URL(url).pathname.split("/").pop();
- return new Window("image-viewer", {
- url,
- title: name,
- });
- };
-
- const fallback = (event: SyntheticEvent) => {
- event.currentTarget.src = "/fallback-image.jpg";
- };
-
- return (
- // biome-ignore lint/a11y/useKeyWithClickEvents:
-
-
-
downloadImage(e)}
- className="absolute z-10 items-center justify-center hidden size-10 bg-white/10 text-black/70 backdrop-blur-xl rounded-lg right-2 top-2 group-hover:inline-flex hover:bg-blue-500 hover:text-white"
- >
- {downloaded ? (
-
- ) : (
-
- )}
-
-
- );
-}
diff --git a/packages/ark/src/components/note/preview/link.tsx b/packages/ark/src/components/note/preview/link.tsx
deleted file mode 100644
index 0bc51dd9..00000000
--- a/packages/ark/src/components/note/preview/link.tsx
+++ /dev/null
@@ -1,88 +0,0 @@
-import { useOpenGraph } from "@lume/utils";
-import { Link } from "react-router-dom";
-
-function isImage(url: string) {
- return /^https?:\/\/.+\.(jpg|jpeg|png|webp|avif)$/.test(url);
-}
-
-export function LinkPreview({ url }: { url: string }) {
- const domain = new URL(url);
- const { isLoading, isError, data } = useOpenGraph(url);
-
- if (isLoading) {
- return (
-
-
-
-
-
-
- {domain.hostname}
-
-
-
- );
- }
-
- if (!data.title && !data.image && !data.description) {
- return (
-
- {url}
-
- );
- }
-
- if (isError) {
- return (
-
- {url}
-
- );
- }
-
- return (
-
- {isImage(data.image) ? (
-
- ) : null}
-
-
- {data.title ? (
-
- {data.title}
-
- ) : null}
- {data.description ? (
-
- {data.description}
-
- ) : null}
-
-
- {domain.hostname}
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/preview/video.tsx b/packages/ark/src/components/note/preview/video.tsx
deleted file mode 100644
index 5a82a1ed..00000000
--- a/packages/ark/src/components/note/preview/video.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import {
- MediaControlBar,
- MediaController,
- MediaMuteButton,
- MediaPlayButton,
- MediaTimeDisplay,
- MediaTimeRange,
-} from "media-chrome/dist/react";
-
-export function VideoPreview({ url }: { url: string }) {
- return (
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/primitives/repost.tsx b/packages/ark/src/components/note/primitives/repost.tsx
deleted file mode 100644
index e2ffb0ee..00000000
--- a/packages/ark/src/components/note/primitives/repost.tsx
+++ /dev/null
@@ -1,110 +0,0 @@
-import { RepostIcon } from "@lume/icons";
-import { cn } from "@lume/utils";
-import { NDKEvent, NostrEvent } from "@nostr-dev-kit/ndk";
-import { useQuery } from "@tanstack/react-query";
-import { useTranslation } from "react-i18next";
-import { Note } from "..";
-import { useArk } from "../../../hooks/useArk";
-import { User } from "../../user";
-
-export function RepostNote({
- event,
- className,
-}: { event: NDKEvent; className?: string }) {
- const ark = useArk();
-
- const { t } = useTranslation();
- const {
- isLoading,
- isError,
- data: repostEvent,
- } = useQuery({
- queryKey: ["repost", event.id],
- queryFn: async () => {
- try {
- if (event.content.length > 50) {
- const embed = JSON.parse(event.content) as NostrEvent;
- return new NDKEvent(ark.ndk, embed);
- }
- const id = event.tags.find((el) => el[0] === "e")[1];
- return await ark.getEventById(id);
- } catch {
- throw new Error("Failed to get repost event");
- }
- },
- refetchOnWindowFocus: false,
- refetchOnMount: false,
- refetchOnReconnect: false,
- });
-
- if (isLoading) {
- return Loading...
;
- }
-
- if (isError || !repostEvent) {
- return (
-
-
-
-
-
-
-
-
-
-
- {t("note.reposted")}
-
-
-
-
-
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
-
-
- {t("note.reposted")}
-
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/primitives/text.tsx b/packages/ark/src/components/note/primitives/text.tsx
deleted file mode 100644
index 88b41db5..00000000
--- a/packages/ark/src/components/note/primitives/text.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { cn } from "@lume/utils";
-import { NDKEvent } from "@nostr-dev-kit/ndk";
-import { Note } from "..";
-
-export function TextNote({
- event,
- className,
-}: { event: NDKEvent; className?: string }) {
- return (
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/primitives/thread.tsx b/packages/ark/src/components/note/primitives/thread.tsx
deleted file mode 100644
index 236d23b9..00000000
--- a/packages/ark/src/components/note/primitives/thread.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import { Note } from "..";
-import { useEvent } from "../../../hooks/useEvent";
-import { User } from "../../user";
-
-export function ThreadNote({ eventId }: { eventId: string }) {
- const { isLoading, data } = useEvent(eventId);
-
- if (isLoading) {
- return Loading...
;
- }
-
- return (
-
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/thread.tsx b/packages/ark/src/components/note/thread.tsx
deleted file mode 100644
index a112ad9b..00000000
--- a/packages/ark/src/components/note/thread.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import { PinIcon } from "@lume/icons";
-import { COL_TYPES, cn } from "@lume/utils";
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-import { Note } from ".";
-import { useArk } from "../../hooks/useArk";
-import { useColumnContext } from "../column/provider";
-import { useNoteContext } from "./provider";
-
-export function NoteThread({
- className,
-}: {
- className?: string;
-}) {
- const ark = useArk();
- const event = useNoteContext();
- const thread = ark.getEventThread({
- content: event.content,
- tags: event.tags,
- });
-
- const { t } = useTranslation();
- const { addColumn } = useColumnContext();
-
- if (!thread) return null;
-
- return (
-
-
- {thread.rootEventId ? (
-
- ) : null}
- {thread.replyEventId ? (
-
- ) : null}
-
-
- {t("note.showThread")}
-
-
- await addColumn({
- kind: COL_TYPES.thread,
- title: "Thread",
- content: thread?.rootEventId || thread?.replyEventId,
- })
- }
- className="inline-flex items-center justify-center rounded-md text-neutral-600 dark:text-neutral-400 size-6 bg-neutral-200 dark:bg-neutral-800 hover:bg-neutral-300 dark:hover:bg-neutral-700"
- >
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/note/user.tsx b/packages/ark/src/components/note/user.tsx
deleted file mode 100644
index 1b972bec..00000000
--- a/packages/ark/src/components/note/user.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { cn } from "@lume/utils";
-import * as HoverCard from "@radix-ui/react-hover-card";
-import { Link } from "react-router-dom";
-import { User } from "../user";
-import { useNoteContext } from "./provider";
-
-export function NoteUser({
- className,
-}: {
- className?: string;
-}) {
- const event = useNoteContext();
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- View profile
-
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/user/about.tsx b/packages/ark/src/components/user/about.tsx
deleted file mode 100644
index aa4cf0ca..00000000
--- a/packages/ark/src/components/user/about.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { cn } from "@lume/utils";
-import { useUserContext } from "./provider";
-
-export function UserAbout({ className }: { className?: string }) {
- const user = useUserContext();
-
- if (!user) {
- return (
-
- );
- }
-
- return (
-
- {user.about?.trim() || user.bio?.trim() || "No bio"}
-
- );
-}
diff --git a/packages/ark/src/components/user/avatar.tsx b/packages/ark/src/components/user/avatar.tsx
deleted file mode 100644
index 22d14057..00000000
--- a/packages/ark/src/components/user/avatar.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-import { useStorage } from "@lume/storage";
-import { cn } from "@lume/utils";
-import * as Avatar from "@radix-ui/react-avatar";
-import { minidenticon } from "minidenticons";
-import { nanoid } from "nanoid";
-import { useMemo } from "react";
-import { useUserContext } from "./provider";
-
-export function UserAvatar({ className }: { className?: string }) {
- const user = useUserContext();
- const storage = useStorage();
-
- const fallbackAvatar = useMemo(
- () =>
- `data:image/svg+xml;utf8,${encodeURIComponent(
- minidenticon(user?.pubkey || nanoid(), 90, 50),
- )}`,
- [user],
- );
-
- if (!user) {
- return (
-
- );
- }
-
- return (
-
- {storage.settings.lowPower ? (
-
- ) : (
-
- )}
-
-
-
-
- );
-}
diff --git a/packages/ark/src/components/user/followButton.tsx b/packages/ark/src/components/user/followButton.tsx
deleted file mode 100644
index 29d4af7c..00000000
--- a/packages/ark/src/components/user/followButton.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { LoaderIcon } from "@lume/icons";
-import { cn } from "@lume/utils";
-import { useEffect, useState } from "react";
-import { useTranslation } from "react-i18next";
-import { useArk } from "../../hooks/useArk";
-
-export function UserFollowButton({
- target,
- className,
-}: { target: string; className?: string }) {
- const ark = useArk();
-
- const [t] = useTranslation();
- const [loading, setLoading] = useState(false);
- const [followed, setFollowed] = useState(false);
-
- const toggleFollow = async () => {
- setLoading(true);
- if (!followed) {
- const add = await ark.createContact(target);
- if (add) setFollowed(true);
- } else {
- const remove = await ark.deleteContact(target);
- if (remove) setFollowed(false);
- }
- setLoading(false);
- };
-
- useEffect(() => {
- async function status() {
- setLoading(true);
-
- const contacts = await ark.getUserContacts();
- if (contacts?.includes(target)) {
- setFollowed(true);
- }
-
- setLoading(false);
- }
- status();
- }, []);
-
- return (
-
- {loading ? (
-
- ) : followed ? (
- t("user.unfollow")
- ) : (
- t("user.follow")
- )}
-
- );
-}
diff --git a/packages/ark/src/components/user/name.tsx b/packages/ark/src/components/user/name.tsx
deleted file mode 100644
index 95ca9c29..00000000
--- a/packages/ark/src/components/user/name.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { cn } from "@lume/utils";
-import { useUserContext } from "./provider";
-
-export function UserName({ className }: { className?: string }) {
- const user = useUserContext();
-
- if (!user) {
- return (
-
- );
- }
-
- return (
-
- {user.displayName || user.name || "Anon"}
-
- );
-}
diff --git a/packages/ark/src/components/user/nip05.tsx b/packages/ark/src/components/user/nip05.tsx
deleted file mode 100644
index 25e8c118..00000000
--- a/packages/ark/src/components/user/nip05.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { VerifiedIcon } from "@lume/icons";
-import { cn, displayNpub } from "@lume/utils";
-import { useQuery } from "@tanstack/react-query";
-import { useArk } from "../../hooks/useArk";
-import { useUserContext } from "./provider";
-
-export function UserNip05({
- pubkey,
- className,
-}: { pubkey: string; className?: string }) {
- const ark = useArk();
- const user = useUserContext();
-
- const { isLoading, data: verified } = useQuery({
- queryKey: ["nip05", user?.nip05],
- queryFn: async ({ signal }: { signal: AbortSignal }) => {
- if (!user) return false;
- if (!user.nip05) return false;
- return ark.validateNIP05({
- pubkey,
- nip05: user.nip05,
- signal,
- });
- },
- enabled: !!user,
- });
-
- if (!user) {
- return (
-
- );
- }
-
- return (
-
-
- {!user?.nip05
- ? displayNpub(pubkey, 16)
- : user?.nip05?.startsWith("_@")
- ? user?.nip05?.replace("_@", "")
- : user?.nip05}
-
- {!isLoading && verified ? (
-
- ) : null}
-
- );
-}
diff --git a/packages/ark/src/components/user/provider.tsx b/packages/ark/src/components/user/provider.tsx
deleted file mode 100644
index 69b7ef0a..00000000
--- a/packages/ark/src/components/user/provider.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { NDKUserProfile } from "@nostr-dev-kit/ndk";
-import { useQuery } from "@tanstack/react-query";
-import { ReactNode, createContext, useContext } from "react";
-import { useArk } from "../../hooks/useArk";
-
-const UserContext = createContext(null);
-
-export function UserProvider({
- pubkey,
- children,
- embed,
-}: { pubkey: string; children: ReactNode; embed?: string }) {
- const ark = useArk();
- const { data: user } = useQuery({
- queryKey: ["user", pubkey],
- queryFn: async () => {
- if (embed) return JSON.parse(embed) as NDKUserProfile;
-
- const profile = await ark.getUserProfile(pubkey);
- if (!profile)
- throw new Error(
- `Cannot get metadata for ${pubkey}, will be retry after 10 seconds`,
- );
-
- return profile;
- },
- refetchOnMount: false,
- refetchOnWindowFocus: false,
- refetchOnReconnect: false,
- staleTime: Infinity,
- retry: 2,
- });
-
- return {children} ;
-}
-
-export function useUserContext() {
- const context = useContext(UserContext);
- return context;
-}
diff --git a/packages/ark/src/components/user/time.tsx b/packages/ark/src/components/user/time.tsx
deleted file mode 100644
index 3da95cec..00000000
--- a/packages/ark/src/components/user/time.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { cn, formatCreatedAt } from "@lume/utils";
-import { useMemo } from "react";
-
-export function UserTime({
- time,
- className,
-}: { time: number; className?: string }) {
- const createdAt = useMemo(() => formatCreatedAt(time), [time]);
-
- return {createdAt}
;
-}
diff --git a/packages/ark/src/context.ts b/packages/ark/src/context.ts
index 918a4536..e4b7c8e8 100644
--- a/packages/ark/src/context.ts
+++ b/packages/ark/src/context.ts
@@ -1,4 +1,4 @@
import { createContext } from "react";
import { type Ark } from "./ark";
-export const LumeContext = createContext(undefined);
+export const ArkContext = createContext(undefined);
diff --git a/packages/ark/src/hooks/useArk.ts b/packages/ark/src/hooks/useArk.ts
index 8d45b8dc..2c311a08 100644
--- a/packages/ark/src/hooks/useArk.ts
+++ b/packages/ark/src/hooks/useArk.ts
@@ -1,10 +1,10 @@
import { useContext } from "react";
-import { LumeContext } from "../context";
+import { ArkContext } from "../context";
export const useArk = () => {
- const context = useContext(LumeContext);
+ const context = useContext(ArkContext);
if (context === undefined) {
- throw new Error("Please import Ark Provider to use useArk() hook");
+ throw new Error("useArk must be used within an ArkProvider");
}
return context;
};
diff --git a/packages/ark/src/hooks/useEvent.ts b/packages/ark/src/hooks/useEvent.ts
index ec100889..8bb307af 100644
--- a/packages/ark/src/hooks/useEvent.ts
+++ b/packages/ark/src/hooks/useEvent.ts
@@ -6,12 +6,12 @@ export function useEvent(id: string) {
const { isLoading, isError, data } = useQuery({
queryKey: ["event", id],
queryFn: async () => {
- const event = await ark.getEventById(id);
- if (!event)
- throw new Error(
- `Cannot get event with ${id}, will be retry after 10 seconds`,
- );
- return event;
+ try {
+ const event = await ark.get_event(id);
+ return event;
+ } catch (e) {
+ throw new Error(e);
+ }
},
refetchOnWindowFocus: false,
refetchOnMount: false,
diff --git a/packages/ark/src/hooks/useProfile.ts b/packages/ark/src/hooks/useProfile.ts
index 3aa2d90c..bd9ba697 100644
--- a/packages/ark/src/hooks/useProfile.ts
+++ b/packages/ark/src/hooks/useProfile.ts
@@ -1,27 +1,21 @@
-import { NDKUserProfile } from "@nostr-dev-kit/ndk";
-import { useQuery, useQueryClient } from "@tanstack/react-query";
+import { useQuery } from "@tanstack/react-query";
import { useArk } from "./useArk";
export function useProfile(pubkey: string) {
const ark = useArk();
- const queryClient = useQueryClient();
-
const {
isLoading,
isError,
- data: user,
+ data: profile,
} = useQuery({
queryKey: ["user", pubkey],
queryFn: async () => {
- const profile = await ark.getUserProfile(pubkey);
- if (!profile)
- throw new Error(
- `Cannot get metadata for ${pubkey}, will be retry after 10 seconds`,
- );
- return profile;
- },
- initialData: () => {
- return queryClient.getQueryData(["user", pubkey]) as NDKUserProfile;
+ try {
+ const profile = await ark.get_profile(pubkey);
+ return profile;
+ } catch (e) {
+ throw new Error(e);
+ }
},
refetchOnMount: false,
refetchOnWindowFocus: false,
@@ -30,5 +24,5 @@ export function useProfile(pubkey: string) {
retry: 2,
});
- return { isLoading, isError, user };
+ return { isLoading, isError, profile };
}
diff --git a/packages/ark/src/hooks/useRelayList.ts b/packages/ark/src/hooks/useRelayList.ts
deleted file mode 100644
index 85753c69..00000000
--- a/packages/ark/src/hooks/useRelayList.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import { NDKKind, NDKTag } from "@nostr-dev-kit/ndk";
-import { useMutation, useQueryClient } from "@tanstack/react-query";
-import { normalizeRelayUrl } from "nostr-fetch";
-import { useArk } from "./useArk";
-
-export function useRelaylist() {
- const ark = useArk();
- const queryClient = useQueryClient();
-
- const connectRelay = useMutation({
- mutationFn: async (
- relay: WebSocket["url"],
- purpose?: "read" | "write" | undefined,
- ) => {
- // Cancel any outgoing refetches
- await queryClient.cancelQueries({
- queryKey: ["relay-personal"],
- });
-
- const relayUrl = normalizeRelayUrl(relay);
-
- // Snapshot the previous value
- const prevRelays: NDKTag[] = queryClient.getQueryData(["relay-personal"]);
-
- // create new relay list if not exist
- if (!prevRelays) {
- await ark.createEvent({
- kind: NDKKind.RelayList,
- tags: [["r", relay, purpose ?? ""]],
- });
- }
-
- // add relay to exist list
- const index = prevRelays.findIndex((el) => el[1] === relay);
- if (index > -1) return;
-
- await ark.createEvent({
- kind: NDKKind.RelayList,
- tags: [...prevRelays, ["r", relayUrl, purpose ?? ""]],
- });
-
- // Optimistically update to the new value
- queryClient.setQueryData(["relay-personal"], (prev: NDKTag[]) => [
- ...prev,
- ["r", relayUrl, purpose ?? ""],
- ]);
-
- // Return a context object with the snapshotted value
- return { prevRelays };
- },
- onSettled: () => {
- queryClient.invalidateQueries({
- queryKey: ["relay-personal"],
- });
- },
- });
-
- const removeRelay = useMutation({
- mutationFn: async (relay: WebSocket["url"]) => {
- // Cancel any outgoing refetches
- await queryClient.cancelQueries({
- queryKey: ["relay-personal"],
- });
-
- // Snapshot the previous value
- const prevRelays: NDKTag[] = queryClient.getQueryData(["relay-personal"]);
-
- if (!prevRelays) return;
-
- const index = prevRelays.findIndex((el) => el[1] === relay);
- if (index > -1) prevRelays.splice(index, 1);
-
- await ark.createEvent({
- kind: NDKKind.RelayList,
- tags: prevRelays,
- });
-
- // Optimistically update to the new value
- queryClient.setQueryData(["relay-personal"], prevRelays);
-
- // Return a context object with the snapshotted value
- return { prevRelays };
- },
- onSettled: () => {
- queryClient.invalidateQueries({
- queryKey: ["relay-personal"],
- });
- },
- });
-
- return { connectRelay, removeRelay };
-}
diff --git a/packages/ark/src/index.ts b/packages/ark/src/index.ts
index 5d591207..ca80124b 100644
--- a/packages/ark/src/index.ts
+++ b/packages/ark/src/index.ts
@@ -1,23 +1,5 @@
export * from "./ark";
export * from "./context";
-export * from "./provider";
-export * from "./hooks/useEvent";
export * from "./hooks/useArk";
+export * from "./hooks/useEvent";
export * from "./hooks/useProfile";
-export * from "./hooks/useRelayList";
-export * from "./components/user";
-export * from "./components/column";
-export * from "./components/column/provider";
-export * from "./components/note";
-export * from "./components/note/primitives/text";
-export * from "./components/note/primitives/repost";
-export * from "./components/note/primitives/skeleton";
-export * from "./components/note/primitives/thread";
-export * from "./components/note/primitives/reply";
-export * from "./components/note/preview/image";
-export * from "./components/note/preview/link";
-export * from "./components/note/preview/video";
-export * from "./components/note/mentions/note";
-export * from "./components/note/mentions/user";
-export * from "./components/note/mentions/hashtag";
-export * from "./components/note/mentions/invoice";
diff --git a/packages/ark/src/provider.tsx b/packages/ark/src/provider.tsx
deleted file mode 100644
index b7ea57ed..00000000
--- a/packages/ark/src/provider.tsx
+++ /dev/null
@@ -1,255 +0,0 @@
-import { LoaderIcon } from "@lume/icons";
-import { NDKCacheAdapterTauri } from "@lume/ndk-cache-tauri";
-import { useStorage } from "@lume/storage";
-import {
- FETCH_LIMIT,
- QUOTES,
- activityUnreadAtom,
- sendNativeNotification,
-} from "@lume/utils";
-import NDK, {
- NDKEvent,
- NDKKind,
- NDKNip46Signer,
- NDKPrivateKeySigner,
- NDKRelay,
- NDKRelayAuthPolicies,
- NDKUser,
-} from "@nostr-dev-kit/ndk";
-import { useQueryClient } from "@tanstack/react-query";
-import { message } from "@tauri-apps/plugin-dialog";
-import { fetch } from "@tauri-apps/plugin-http";
-import { useSetAtom } from "jotai";
-import Linkify from "linkify-react";
-import { normalizeRelayUrlSet } from "nostr-fetch";
-import { PropsWithChildren, useEffect, useState } from "react";
-import { toast } from "sonner";
-import { Ark } from "./ark";
-import { LumeContext } from "./context";
-
-export const LumeProvider = ({ children }: PropsWithChildren) => {
- const storage = useStorage();
- const queryClient = useQueryClient();
- const setUnreadActivity = useSetAtom(activityUnreadAtom);
-
- const [ark, setArk] = useState(undefined);
- const [ndk, setNDK] = useState(undefined);
-
- async function initNostrSigner({
- nsecbunker,
- }: {
- nsecbunker?: boolean;
- }) {
- try {
- if (!storage.currentUser) return null;
-
- // NIP-46 Signer
- if (nsecbunker) {
- const localSignerPrivkey = await storage.loadPrivkey(
- storage.currentUser.pubkey,
- );
-
- if (!localSignerPrivkey) return null;
-
- const localSigner = new NDKPrivateKeySigner(localSignerPrivkey);
- const bunker = new NDK({
- explicitRelayUrls: normalizeRelayUrlSet([
- "wss://relay.nsecbunker.com/",
- "wss://nostr.vulpem.com/",
- ]),
- });
- await bunker.connect(2000);
-
- const remoteSigner = new NDKNip46Signer(
- bunker,
- storage.currentUser.pubkey,
- localSigner,
- );
- await remoteSigner.blockUntilReady();
-
- return remoteSigner;
- }
-
- // Privkey Signer
- const userPrivkey = await storage.loadPrivkey(storage.currentUser.pubkey);
- if (!userPrivkey) return null;
-
- // load nwc
- storage.nwc = await storage.loadPrivkey(
- `${storage.currentUser.pubkey}.nwc`,
- );
-
- return new NDKPrivateKeySigner(userPrivkey);
- } catch (e) {
- toast.error(String(e));
- return null;
- }
- }
-
- async function initNDK() {
- try {
- const explicitRelayUrls = normalizeRelayUrlSet([
- "wss://nostr.mutinywallet.com/",
- "wss://bostr.nokotaro.com/",
- "wss://purplepag.es/",
- ]);
-
- const outboxRelayUrls = normalizeRelayUrlSet(["wss://purplepag.es/"]);
-
- const tauriCache = new NDKCacheAdapterTauri(storage);
- const ndk = new NDK({
- cacheAdapter: tauriCache,
- explicitRelayUrls,
- outboxRelayUrls,
- enableOutboxModel: !storage.settings.lowPower,
- autoConnectUserRelays: !storage.settings.lowPower,
- autoFetchUserMutelist: false, // #TODO: add support mute list
- clientName: "Lume",
- });
-
- // use tauri fetch
- ndk.httpFetch = fetch;
-
- // add signer
- const signer = await initNostrSigner({
- nsecbunker: storage.settings.nsecbunker,
- });
-
- if (signer) ndk.signer = signer;
-
- // connect
- await ndk.connect(3000);
-
- // auth
- ndk.relayAuthDefaultPolicy = async (
- relay: NDKRelay,
- challenge: string,
- ) => {
- const signIn = NDKRelayAuthPolicies.signIn({ ndk });
- const event = await signIn(relay, challenge).catch((e) =>
- console.log("auth failed", e),
- );
- if (event) {
- await sendNativeNotification(
- `You've sign in sucessfully to relay: ${relay.url}`,
- );
- return event;
- }
- };
-
- setNDK(ndk);
- } catch (e) {
- toast.error(String(e));
- }
- }
-
- async function initArk() {
- if (!ndk) await message("Something wrong!", { type: "error" });
-
- // ark utils
- const ark = new Ark({ ndk, account: storage.currentUser });
-
- try {
- if (ndk && storage.currentUser) {
- const user = new NDKUser({ pubkey: storage.currentUser.pubkey });
- ndk.activeUser = user;
-
- // update contacts
- const contacts = await ark.getUserContacts();
-
- if (contacts?.length) {
- console.log("total contacts: ", contacts.length);
- for (const pubkey of ark.account.contacts) {
- await queryClient.prefetchQuery({
- queryKey: ["user", pubkey],
- queryFn: async () => {
- return await ark.getUserProfile(pubkey);
- },
- });
- }
- }
-
- // subscribe for new activity
- const activitySub = ndk.subscribe(
- {
- kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Zap],
- since: Math.floor(Date.now() / 1000),
- "#p": [ark.account.pubkey],
- },
- { closeOnEose: false, groupable: false },
- );
-
- activitySub.addListener("event", async (event: NDKEvent) => {
- if (event.pubkey === storage.currentUser.pubkey) return;
-
- setUnreadActivity((state) => state + 1);
- const profile = await ark.getUserProfile(event.pubkey);
-
- switch (event.kind) {
- case NDKKind.Text:
- return await sendNativeNotification(
- `${
- profile.displayName || profile.name || "Anon"
- } has replied to your note`,
- );
- case NDKKind.Repost:
- return await sendNativeNotification(
- `${
- profile.displayName || profile.name || "Anon"
- } has reposted to your note`,
- );
- case NDKKind.Zap:
- return await sendNativeNotification(
- `${
- profile.displayName || profile.name || "Anon"
- } has zapped to your note`,
- );
- default:
- break;
- }
- });
- }
- } catch (e) {
- toast.error(String(e));
- }
-
- setArk(ark);
- }
-
- useEffect(() => {
- if (ndk) initArk();
- }, [ndk]);
-
- useEffect(() => {
- if (!ark && !ndk) initNDK();
- }, []);
-
- if (!ark) {
- return (
-
-
-
TIP:
-
-
- {QUOTES[Math.floor(Math.random() * QUOTES.length)]}
-
-
-
-
-
- );
- }
-
- return {children} ;
-};
diff --git a/packages/ark/tailwind.config.js b/packages/ark/tailwind.config.js
index 49c48c7a..21ad8bf9 100644
--- a/packages/ark/tailwind.config.js
+++ b/packages/ark/tailwind.config.js
@@ -1,8 +1,10 @@
-import sharedConfig from "@lume/tailwindcss";
+/** @type {import('tailwindcss').Config} */
+
+import preset from "@lume/tailwindcss";
const config = {
content: ["./src/**/*.{js,ts,jsx,tsx}"],
- presets: [sharedConfig],
+ presets: [preset],
};
export default config;
diff --git a/packages/icons/index.ts b/packages/icons/index.ts
index 1fb805ef..19a36255 100644
--- a/packages/icons/index.ts
+++ b/packages/icons/index.ts
@@ -21,6 +21,7 @@ export * from "./src/lume";
export * from "./src/media";
export * from "./src/mute";
export * from "./src/space";
+export * from "./src/spaceFilled";
export * from "./src/navArrowDown";
export * from "./src/plus";
export * from "./src/plusCircle";
@@ -113,3 +114,5 @@ export * from "./src/newColumn";
export * from "./src/searchFilled";
export * from "./src/arrowUp";
export * from "./src/arrowUpSquare";
+export * from "./src/arrowDown";
+export * from "./src/link";
diff --git a/packages/icons/package.json b/packages/icons/package.json
index 2e03dee0..a9e6ea40 100644
--- a/packages/icons/package.json
+++ b/packages/icons/package.json
@@ -8,7 +8,7 @@
},
"devDependencies": {
"@lume/tsconfig": "workspace:*",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"typescript": "^5.3.3"
}
}
\ No newline at end of file
diff --git a/packages/icons/src/arrowDown.tsx b/packages/icons/src/arrowDown.tsx
new file mode 100644
index 00000000..77d9f123
--- /dev/null
+++ b/packages/icons/src/arrowDown.tsx
@@ -0,0 +1,24 @@
+import { SVGProps } from "react";
+
+export function ArrowDownIcon(
+ props: JSX.IntrinsicAttributes & SVGProps,
+) {
+ return (
+
+
+
+ );
+}
diff --git a/packages/icons/src/bell.tsx b/packages/icons/src/bell.tsx
index 48126612..67f1b50d 100644
--- a/packages/icons/src/bell.tsx
+++ b/packages/icons/src/bell.tsx
@@ -1,24 +1,16 @@
import { SVGProps } from "react";
export function BellIcon(
- props: JSX.IntrinsicAttributes & SVGProps,
+ props: JSX.IntrinsicAttributes & SVGProps,
) {
- return (
-
-
-
- );
+ return (
+
+
+
+ );
}
diff --git a/packages/icons/src/bellFilled.tsx b/packages/icons/src/bellFilled.tsx
index d1eb55d8..8b069d50 100644
--- a/packages/icons/src/bellFilled.tsx
+++ b/packages/icons/src/bellFilled.tsx
@@ -1,23 +1,16 @@
import { SVGProps } from "react";
export function BellFilledIcon(
- props: JSX.IntrinsicAttributes & SVGProps,
+ props: JSX.IntrinsicAttributes & SVGProps,
) {
- return (
-
-
-
- );
+ return (
+
+
+
+ );
}
diff --git a/packages/icons/src/composeFilled.tsx b/packages/icons/src/composeFilled.tsx
index 90a17840..ec87db20 100644
--- a/packages/icons/src/composeFilled.tsx
+++ b/packages/icons/src/composeFilled.tsx
@@ -1,21 +1,16 @@
import { SVGProps } from "react";
export function ComposeFilledIcon(
- props: JSX.IntrinsicAttributes & SVGProps,
+ props: JSX.IntrinsicAttributes & SVGProps,
) {
- return (
-
-
-
- );
+ return (
+
+
+
+ );
}
diff --git a/packages/icons/src/home.tsx b/packages/icons/src/home.tsx
index 828744a9..c7f2390b 100644
--- a/packages/icons/src/home.tsx
+++ b/packages/icons/src/home.tsx
@@ -1,18 +1,13 @@
export function HomeIcon(props: JSX.IntrinsicElements["svg"]) {
- return (
-
-
-
- );
+ return (
+
+
+
+ );
}
diff --git a/packages/icons/src/homeFilled.tsx b/packages/icons/src/homeFilled.tsx
index 9bb9197c..3468dcc4 100644
--- a/packages/icons/src/homeFilled.tsx
+++ b/packages/icons/src/homeFilled.tsx
@@ -1,19 +1,10 @@
export function HomeFilledIcon(props: JSX.IntrinsicElements["svg"]) {
- return (
-
-
-
- );
+ return (
+
+
+
+ );
}
diff --git a/packages/icons/src/horizontalDots.tsx b/packages/icons/src/horizontalDots.tsx
index 1e62dad2..6475277e 100644
--- a/packages/icons/src/horizontalDots.tsx
+++ b/packages/icons/src/horizontalDots.tsx
@@ -1,18 +1,13 @@
export function HorizontalDotsIcon(props: JSX.IntrinsicElements["svg"]) {
- return (
-
-
-
- );
+ return (
+
+
+
+ );
}
diff --git a/packages/icons/src/link.tsx b/packages/icons/src/link.tsx
new file mode 100644
index 00000000..87ec9c23
--- /dev/null
+++ b/packages/icons/src/link.tsx
@@ -0,0 +1,17 @@
+import { SVGProps } from "react";
+
+export function LinkIcon(
+ props: JSX.IntrinsicAttributes & SVGProps,
+) {
+ return (
+
+
+
+ );
+}
diff --git a/packages/icons/src/plus.tsx b/packages/icons/src/plus.tsx
index cb1c5c56..f54d371b 100644
--- a/packages/icons/src/plus.tsx
+++ b/packages/icons/src/plus.tsx
@@ -1,18 +1,12 @@
-export function PlusIcon(props: JSX.IntrinsicElements['svg']) {
+export function PlusIcon(props: JSX.IntrinsicElements["svg"]) {
return (
-
-
+
+
);
}
diff --git a/packages/icons/src/reply.tsx b/packages/icons/src/reply.tsx
index 19029885..3c397914 100644
--- a/packages/icons/src/reply.tsx
+++ b/packages/icons/src/reply.tsx
@@ -1,20 +1,13 @@
export function ReplyIcon(props: JSX.IntrinsicElements["svg"]) {
- return (
-
-
-
- );
+ return (
+
+
+
+ );
}
diff --git a/packages/icons/src/repost.tsx b/packages/icons/src/repost.tsx
index 0bb7d3da..c41afa98 100644
--- a/packages/icons/src/repost.tsx
+++ b/packages/icons/src/repost.tsx
@@ -1,18 +1,13 @@
export function RepostIcon(props: JSX.IntrinsicElements["svg"]) {
- return (
-
-
-
- );
+ return (
+
+
+
+ );
}
diff --git a/packages/icons/src/settings.tsx b/packages/icons/src/settings.tsx
index 569ea943..02f98a47 100644
--- a/packages/icons/src/settings.tsx
+++ b/packages/icons/src/settings.tsx
@@ -1,31 +1,22 @@
import { SVGProps } from "react";
export function SettingsIcon(
- props: JSX.IntrinsicAttributes & SVGProps,
+ props: JSX.IntrinsicAttributes & SVGProps,
) {
- return (
-
-
-
-
- );
+ return (
+
+
+
+
+ );
}
diff --git a/packages/icons/src/space.tsx b/packages/icons/src/space.tsx
index 31b9c70f..5b51049b 100644
--- a/packages/icons/src/space.tsx
+++ b/packages/icons/src/space.tsx
@@ -1,20 +1,13 @@
-import { SVGProps } from 'react';
+import { SVGProps } from "react";
-export function SpaceIcon(props: JSX.IntrinsicAttributes & SVGProps) {
+export function SpaceIcon(
+ props: JSX.IntrinsicAttributes & SVGProps,
+) {
return (
-
+
);
diff --git a/packages/icons/src/spaceFilled.tsx b/packages/icons/src/spaceFilled.tsx
new file mode 100644
index 00000000..6f4ce3e2
--- /dev/null
+++ b/packages/icons/src/spaceFilled.tsx
@@ -0,0 +1,14 @@
+import { SVGProps } from "react";
+
+export function SpaceFilledIcon(
+ props: JSX.IntrinsicAttributes & SVGProps,
+) {
+ return (
+
+
+
+ );
+}
diff --git a/packages/icons/src/zap.tsx b/packages/icons/src/zap.tsx
index 28634c96..c3fe1e5c 100644
--- a/packages/icons/src/zap.tsx
+++ b/packages/icons/src/zap.tsx
@@ -1,18 +1,12 @@
export function ZapIcon(props: JSX.IntrinsicElements["svg"]) {
- return (
-
-
-
- );
+ return (
+
+
+
+ );
}
diff --git a/packages/lume-column-antenas/package.json b/packages/lume-column-antenas/package.json
index 788891a8..8c1ad890 100644
--- a/packages/lume-column-antenas/package.json
+++ b/packages/lume-column-antenas/package.json
@@ -8,18 +8,16 @@
"@lume/icons": "workspace:^",
"@lume/ui": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"react": "^18.2.0",
- "react-router-dom": "^6.21.3",
- "sonner": "^1.4.0",
- "virtua": "^0.23.0"
+ "sonner": "^1.4.2",
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/lume-column-antenas/src/index.tsx b/packages/lume-column-antenas/src/index.tsx
index 099febc7..e5b38f74 100644
--- a/packages/lume-column-antenas/src/index.tsx
+++ b/packages/lume-column-antenas/src/index.tsx
@@ -1,10 +1,10 @@
import { Column } from "@lume/ark";
-import { IColumn } from "@lume/types";
+import { LumeColumn } from "@lume/types";
import { EventRoute, UserRoute } from "@lume/ui";
import { AntenasForm } from "./components/form";
import { HomeRoute } from "./home";
-export function Antenas({ column }: { column: IColumn }) {
+export function Antenas({ column }: { column: LumeColumn }) {
const colKey = `antenas-${column.id}`;
const created = !!column.content?.length;
diff --git a/packages/lume-column-default/package.json b/packages/lume-column-default/package.json
index fa2ce450..f639f4b3 100644
--- a/packages/lume-column-default/package.json
+++ b/packages/lume-column-default/package.json
@@ -8,18 +8,16 @@
"@lume/icons": "workspace:^",
"@lume/ui": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"react": "^18.2.0",
- "react-router-dom": "^6.21.3",
- "sonner": "^1.4.0",
- "virtua": "^0.23.0"
+ "sonner": "^1.4.2",
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/lume-column-default/src/index.tsx b/packages/lume-column-default/src/index.tsx
index 76aaea1e..5342690a 100644
--- a/packages/lume-column-default/src/index.tsx
+++ b/packages/lume-column-default/src/index.tsx
@@ -1,8 +1,8 @@
import { Column, useColumnContext } from "@lume/ark";
-import { IColumn } from "@lume/types";
+import { LumeColumn } from "@lume/types";
import { COL_TYPES } from "@lume/utils";
-export function Default({ column }: { column: IColumn }) {
+export function Default({ column }: { column: LumeColumn }) {
const { addColumn } = useColumnContext();
return (
diff --git a/packages/lume-column-foryou/package.json b/packages/lume-column-foryou/package.json
index 9308c6cf..d485f9b3 100644
--- a/packages/lume-column-foryou/package.json
+++ b/packages/lume-column-foryou/package.json
@@ -6,21 +6,18 @@
"dependencies": {
"@lume/ark": "workspace:^",
"@lume/icons": "workspace:^",
- "@lume/storage": "workspace:^",
"@lume/ui": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"react": "^18.2.0",
- "react-router-dom": "^6.21.3",
- "sonner": "^1.4.0",
- "virtua": "^0.23.0"
+ "sonner": "^1.4.2",
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/lume-column-foryou/src/index.tsx b/packages/lume-column-foryou/src/index.tsx
index 406a9037..7b306e4a 100644
--- a/packages/lume-column-foryou/src/index.tsx
+++ b/packages/lume-column-foryou/src/index.tsx
@@ -1,13 +1,13 @@
import { Column } from "@lume/ark";
import { useStorage } from "@lume/storage";
-import { IColumn } from "@lume/types";
+import { LumeColumn } from "@lume/types";
import { EventRoute, UserRoute } from "@lume/ui";
import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
import { useQueryClient } from "@tanstack/react-query";
import { useRef } from "react";
import { HomeRoute } from "./home";
-export function ForYou({ column }: { column: IColumn }) {
+export function ForYou({ column }: { column: LumeColumn }) {
const colKey = `foryou-${column.id}`;
const storage = useStorage();
const queryClient = useQueryClient();
diff --git a/packages/lume-column-global/package.json b/packages/lume-column-global/package.json
index 25c5d8d4..f32f537a 100644
--- a/packages/lume-column-global/package.json
+++ b/packages/lume-column-global/package.json
@@ -8,18 +8,16 @@
"@lume/icons": "workspace:^",
"@lume/ui": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"react": "^18.2.0",
- "react-router-dom": "^6.21.3",
- "sonner": "^1.4.0",
- "virtua": "^0.23.0"
+ "sonner": "^1.4.2",
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/lume-column-global/src/index.tsx b/packages/lume-column-global/src/index.tsx
index 2efddb8f..c148e4a8 100644
--- a/packages/lume-column-global/src/index.tsx
+++ b/packages/lume-column-global/src/index.tsx
@@ -1,9 +1,9 @@
import { Column } from "@lume/ark";
-import { IColumn } from "@lume/types";
+import { LumeColumn } from "@lume/types";
import { EventRoute, UserRoute } from "@lume/ui";
import { HomeRoute } from "./home";
-export function Global({ column }: { column: IColumn }) {
+export function Global({ column }: { column: LumeColumn }) {
const colKey = `global-${column.id}`;
return (
diff --git a/packages/lume-column-group/package.json b/packages/lume-column-group/package.json
index 0424578d..0a219b1f 100644
--- a/packages/lume-column-group/package.json
+++ b/packages/lume-column-group/package.json
@@ -8,18 +8,16 @@
"@lume/icons": "workspace:^",
"@lume/ui": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"react": "^18.2.0",
- "react-router-dom": "^6.21.3",
- "sonner": "^1.4.0",
- "virtua": "^0.23.0"
+ "sonner": "^1.4.2",
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/lume-column-group/src/index.tsx b/packages/lume-column-group/src/index.tsx
index e1a2cc82..fb6e7d63 100644
--- a/packages/lume-column-group/src/index.tsx
+++ b/packages/lume-column-group/src/index.tsx
@@ -1,10 +1,10 @@
import { Column } from "@lume/ark";
-import { IColumn } from "@lume/types";
+import { LumeColumn } from "@lume/types";
import { EventRoute, UserRoute } from "@lume/ui";
import { GroupForm } from "./components/form";
import { HomeRoute } from "./home";
-export function Group({ column }: { column: IColumn }) {
+export function Group({ column }: { column: LumeColumn }) {
const colKey = `group-${column.id}`;
const created = !!column.content?.length;
diff --git a/packages/lume-column-hashtag/package.json b/packages/lume-column-hashtag/package.json
index 9bb4e5a1..e6a9abfc 100644
--- a/packages/lume-column-hashtag/package.json
+++ b/packages/lume-column-hashtag/package.json
@@ -8,18 +8,16 @@
"@lume/icons": "workspace:^",
"@lume/ui": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"react": "^18.2.0",
- "react-router-dom": "^6.21.3",
- "sonner": "^1.4.0",
- "virtua": "^0.23.0"
+ "sonner": "^1.4.2",
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/lume-column-hashtag/src/index.tsx b/packages/lume-column-hashtag/src/index.tsx
index c82cfbf7..b3fa2d45 100644
--- a/packages/lume-column-hashtag/src/index.tsx
+++ b/packages/lume-column-hashtag/src/index.tsx
@@ -1,9 +1,9 @@
import { Column } from "@lume/ark";
-import { IColumn } from "@lume/types";
+import { LumeColumn } from "@lume/types";
import { EventRoute, UserRoute } from "@lume/ui";
import { HomeRoute } from "./home";
-export function Hashtag({ column }: { column: IColumn }) {
+export function Hashtag({ column }: { column: LumeColumn }) {
const colKey = `hashtag-${column.id}`;
const hashtag = column.content.replace("#", "");
diff --git a/packages/lume-column-thread/package.json b/packages/lume-column-thread/package.json
index bb831ca2..f6491153 100644
--- a/packages/lume-column-thread/package.json
+++ b/packages/lume-column-thread/package.json
@@ -8,18 +8,16 @@
"@lume/icons": "workspace:^",
"@lume/ui": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"react": "^18.2.0",
- "react-router-dom": "^6.21.3",
- "sonner": "^1.4.0",
- "virtua": "^0.23.0"
+ "sonner": "^1.4.2",
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/lume-column-thread/src/home.tsx b/packages/lume-column-thread/src/home.tsx
index 0de9041f..6587e4bb 100644
--- a/packages/lume-column-thread/src/home.tsx
+++ b/packages/lume-column-thread/src/home.tsx
@@ -3,14 +3,14 @@ import { ReplyList } from "@lume/ui";
import { WindowVirtualizer } from "virtua";
export function HomeRoute({ id }: { id: string }) {
- return (
-
- );
+ return (
+
+ );
}
diff --git a/packages/lume-column-thread/src/index.tsx b/packages/lume-column-thread/src/index.tsx
index bcd536ed..3476745d 100644
--- a/packages/lume-column-thread/src/index.tsx
+++ b/packages/lume-column-thread/src/index.tsx
@@ -1,9 +1,9 @@
import { Column } from "@lume/ark";
-import { IColumn } from "@lume/types";
+import { LumeColumn } from "@lume/types";
import { HomeRoute } from "./home";
import { EventRoute, UserRoute } from "@lume/ui";
-export function Thread({ column }: { column: IColumn }) {
+export function Thread({ column }: { column: LumeColumn }) {
return (
diff --git a/packages/lume-column-timeline/package.json b/packages/lume-column-timeline/package.json
index 73fa0444..73c260e5 100644
--- a/packages/lume-column-timeline/package.json
+++ b/packages/lume-column-timeline/package.json
@@ -8,18 +8,16 @@
"@lume/icons": "workspace:^",
"@lume/ui": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"react": "^18.2.0",
- "react-router-dom": "^6.21.3",
- "sonner": "^1.4.0",
- "virtua": "^0.23.0"
+ "sonner": "^1.4.2",
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/lume-column-timeline/src/home.tsx b/packages/lume-column-timeline/src/home.tsx
index cacb30e9..0f4ac3d8 100644
--- a/packages/lume-column-timeline/src/home.tsx
+++ b/packages/lume-column-timeline/src/home.tsx
@@ -1,17 +1,17 @@
import { RepostNote, TextNote, useArk } from "@lume/ark";
import { ArrowRightCircleIcon, LoaderIcon, SearchIcon } from "@lume/icons";
+import { Event, Kind } from "@lume/types";
import { EmptyFeed } from "@lume/ui";
import { FETCH_LIMIT } from "@lume/utils";
-import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
import { useInfiniteQuery } from "@tanstack/react-query";
import { useEffect, useMemo, useRef } from "react";
import { Link } from "react-router-dom";
import { CacheSnapshot, VList, VListHandle } from "virtua";
-export function HomeRoute({ colKey }: { colKey: string }) {
+export function HomeRoute({ queryKey }: { queryKey: string }) {
const ark = useArk();
const ref = useRef();
- const cacheKey = `${colKey}-vlist`;
+ const cacheKey = `${queryKey}-vlist`;
const [offset, cache] = useMemo(() => {
const serialized = sessionStorage.getItem(cacheKey);
@@ -21,27 +21,14 @@ export function HomeRoute({ colKey }: { colKey: string }) {
const { data, hasNextPage, isLoading, isFetchingNextPage, fetchNextPage } =
useInfiniteQuery({
- queryKey: [colKey],
+ queryKey: [queryKey],
initialPageParam: 0,
queryFn: async ({
- signal,
pageParam,
}: {
- signal: AbortSignal;
pageParam: number;
}) => {
- if (!ark.account.contacts.length) return [];
-
- const events = await ark.getInfiniteEvents({
- filter: {
- kinds: [NDKKind.Text, NDKKind.Repost],
- authors: ark.account.contacts,
- },
- limit: FETCH_LIMIT,
- pageParam,
- signal,
- });
-
+ const events = await ark.get_text_events(FETCH_LIMIT, pageParam);
return events;
},
getNextPageParam: (lastPage) => {
@@ -54,11 +41,11 @@ export function HomeRoute({ colKey }: { colKey: string }) {
refetchOnMount: false,
});
- const renderItem = (event: NDKEvent) => {
+ const renderItem = (event: Event) => {
switch (event.kind) {
- case NDKKind.Text:
+ case Kind.Text:
return ;
- case NDKKind.Repost:
+ case Kind.Repost:
return ;
default:
return ;
@@ -81,21 +68,6 @@ export function HomeRoute({ colKey }: { colKey: string }) {
};
}, []);
- if (!ark.account.contacts.length) {
- return (
-
-
-
-
- Find accounts to follow
-
-
- );
- }
-
return (
diff --git a/packages/lume-column-timeline/src/index.tsx b/packages/lume-column-timeline/src/index.tsx
index fad7c37b..6c92285c 100644
--- a/packages/lume-column-timeline/src/index.tsx
+++ b/packages/lume-column-timeline/src/index.tsx
@@ -1,50 +1,25 @@
-import { Column, useArk } from "@lume/ark";
-import { IColumn } from "@lume/types";
+import { Column } from "@lume/ark";
+import { LumeColumn } from "@lume/types";
import { EventRoute, SuggestRoute, UserRoute } from "@lume/ui";
-import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
-import { useQueryClient } from "@tanstack/react-query";
-import { useRef } from "react";
import { HomeRoute } from "./home";
-export function Timeline({ column }: { column: IColumn }) {
+export function Timeline({ column }: { column: LumeColumn }) {
const colKey = `timeline-${column.id}`;
- const ark = useArk();
- const queryClient = useQueryClient();
- const since = useRef(Math.floor(Date.now() / 1000));
-
- const refresh = async (events: NDKEvent[]) => {
- const uniqEvents = new Set(events);
- await queryClient.setQueryData(
- [colKey],
- (prev: { pageParams: number; pages: Array }) => ({
- ...prev,
- pages: [[...uniqEvents], ...prev.pages],
- }),
- );
- };
return (
-
-
- {ark.account.contacts.length ? (
-
- ) : null}
-
- } />
- } />
- } />
- }
- />
-
-
+
+
+
+
+ } />
+ } />
+ } />
+ }
+ />
+
+
+
);
}
diff --git a/packages/lume-column-trending-notes/package.json b/packages/lume-column-trending-notes/package.json
index 82f0d9a7..ca8c830a 100644
--- a/packages/lume-column-trending-notes/package.json
+++ b/packages/lume-column-trending-notes/package.json
@@ -8,18 +8,16 @@
"@lume/icons": "workspace:^",
"@lume/ui": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"react": "^18.2.0",
- "react-router-dom": "^6.21.3",
- "sonner": "^1.4.0",
- "virtua": "^0.23.0"
+ "sonner": "^1.4.2",
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/lume-column-trending-notes/src/index.tsx b/packages/lume-column-trending-notes/src/index.tsx
index 8cfe690d..78c699f1 100644
--- a/packages/lume-column-trending-notes/src/index.tsx
+++ b/packages/lume-column-trending-notes/src/index.tsx
@@ -1,9 +1,9 @@
import { Column } from "@lume/ark";
-import { IColumn } from "@lume/types";
+import { LumeColumn } from "@lume/types";
import { EventRoute, UserRoute } from "@lume/ui";
import { HomeRoute } from "./home";
-export function TrendingNotes({ column }: { column: IColumn }) {
+export function TrendingNotes({ column }: { column: LumeColumn }) {
const colKey = `trending-notes-${column.id}`;
return (
diff --git a/packages/lume-column-user/package.json b/packages/lume-column-user/package.json
index 7a1b1767..7bae7fa6 100644
--- a/packages/lume-column-user/package.json
+++ b/packages/lume-column-user/package.json
@@ -8,18 +8,16 @@
"@lume/icons": "workspace:^",
"@lume/ui": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"react": "^18.2.0",
- "react-router-dom": "^6.21.3",
- "sonner": "^1.4.0",
- "virtua": "^0.23.0"
+ "sonner": "^1.4.2",
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/lume-column-user/src/index.tsx b/packages/lume-column-user/src/index.tsx
index 59034cd0..b148d314 100644
--- a/packages/lume-column-user/src/index.tsx
+++ b/packages/lume-column-user/src/index.tsx
@@ -1,9 +1,9 @@
import { Column } from "@lume/ark";
-import { IColumn } from "@lume/types";
+import { LumeColumn } from "@lume/types";
import { EventRoute, UserRoute } from "@lume/ui";
import { HomeRoute } from "./home";
-export function User({ column }: { column: IColumn }) {
+export function User({ column }: { column: LumeColumn }) {
return (
diff --git a/packages/lume-column-waifu/package.json b/packages/lume-column-waifu/package.json
index 43c87576..13cf11c3 100644
--- a/packages/lume-column-waifu/package.json
+++ b/packages/lume-column-waifu/package.json
@@ -8,15 +8,14 @@
"@lume/icons": "workspace:^",
"@lume/ui": "workspace:^",
"@lume/utils": "workspace:^",
- "@tanstack/react-query": "^5.17.19",
- "react": "^18.2.0",
- "react-router-dom": "^6.21.3"
+ "@tanstack/react-query": "^5.24.1",
+ "react": "^18.2.0"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/lume-column-waifu/src/index.tsx b/packages/lume-column-waifu/src/index.tsx
index 43ba2991..38b59c2a 100644
--- a/packages/lume-column-waifu/src/index.tsx
+++ b/packages/lume-column-waifu/src/index.tsx
@@ -1,8 +1,8 @@
import { Column } from "@lume/ark";
-import { IColumn } from "@lume/types";
+import { LumeColumn } from "@lume/types";
import { HomeRoute } from "./home";
-export function Waifu({ column }: { column: IColumn }) {
+export function Waifu({ column }: { column: LumeColumn }) {
const colKey = `waifu-${column.id}`;
return (
diff --git a/packages/ndk-cache-tauri/index.ts b/packages/ndk-cache-tauri/index.ts
deleted file mode 100644
index b9996798..00000000
--- a/packages/ndk-cache-tauri/index.ts
+++ /dev/null
@@ -1,442 +0,0 @@
-// inspired by NDK Cache Dexie
-// source: https://github.com/nostr-dev-kit/ndk/tree/master/ndk-cache-dexie
-
-import { LumeStorage } from "@lume/storage";
-import {
- Hexpubkey,
- NDKCacheAdapter,
- NDKEvent,
- NDKFilter,
- NDKRelay,
- NDKSubscription,
- NDKUserProfile,
- profileFromEvent,
-} from "@nostr-dev-kit/ndk";
-import { LRUCache } from "lru-cache";
-import { NostrEvent } from "nostr-fetch";
-import { matchFilter } from "nostr-tools";
-
-export class NDKCacheAdapterTauri implements NDKCacheAdapter {
- #storage: LumeStorage;
- private dirtyProfiles: Set = new Set();
- public profiles?: LRUCache;
- readonly locking: boolean;
-
- constructor(storage: LumeStorage) {
- this.#storage = storage;
- this.locking = true;
-
- this.profiles = new LRUCache({
- max: 100000,
- });
-
- setInterval(() => {
- this.dumpProfiles();
- }, 1000 * 10);
- }
-
- public async query(subscription: NDKSubscription): Promise {
- Promise.allSettled(
- subscription.filters.map((filter) =>
- this.processFilter(filter, subscription),
- ),
- );
- }
-
- public async fetchProfile(pubkey: Hexpubkey) {
- if (!this.profiles) return null;
-
- let profile = this.profiles.get(pubkey);
-
- if (!profile) {
- const user = await this.#storage.getCacheUser(pubkey);
- if (user) {
- profile = user.profile as NDKUserProfile;
- this.profiles.set(pubkey, profile);
- }
- }
-
- return profile;
- }
-
- public saveProfile(pubkey: Hexpubkey, profile: NDKUserProfile) {
- if (!this.profiles) return;
-
- this.profiles.set(pubkey, profile);
-
- this.dirtyProfiles.add(pubkey);
- }
-
- private async processFilter(
- filter: NDKFilter,
- subscription: NDKSubscription,
- ): Promise {
- const _filter = { ...filter };
- _filter.limit = undefined;
- const filterKeys = Object.keys(_filter || {})
- .sort()
- .filter((e) => e !== "limit");
-
- try {
- await Promise.allSettled([
- this.byKindAndAuthor(filterKeys, filter, subscription),
- this.byAuthors(filterKeys, filter, subscription),
- this.byKinds(filterKeys, filter, subscription),
- this.byIdsQuery(filterKeys, filter, subscription),
- this.byNip33Query(filterKeys, filter, subscription),
- this.byTagsAndOptionallyKinds(filterKeys, filter, subscription),
- ]);
- } catch (error) {
- console.error(error);
- }
- }
-
- public async setEvent(
- event: NDKEvent,
- filters: NDKFilter[],
- relay?: NDKRelay,
- ): Promise {
- if (event.kind === 0) {
- if (!this.profiles) return;
-
- const profile: NDKUserProfile = profileFromEvent(event);
- this.profiles.set(event.pubkey, profile);
- } else {
- let addEvent = true;
-
- if (event.isParamReplaceable()) {
- const replaceableId = `${event.kind}:${event.pubkey}:${event.tagId()}`;
- const existingEvent = await this.#storage.getCacheEvent(replaceableId);
- if (
- existingEvent &&
- event.created_at &&
- existingEvent.createdAt > event.created_at
- ) {
- addEvent = false;
- }
- }
-
- if (addEvent) {
- this.#storage.setCacheEvent({
- id: event.tagId(),
- pubkey: event.pubkey,
- content: event.content,
- // biome-ignore lint/style/noNonNullAssertion:
- kind: event.kind!,
- // biome-ignore lint/style/noNonNullAssertion:
- createdAt: event.created_at!,
- relay: relay?.url,
- event: JSON.stringify(event.rawEvent()),
- });
-
- // Don't cache contact lists as tags since it's expensive
- // and there is no use case for it
- if (event.kind !== 3) {
- for (const tag of event.tags) {
- if (tag[0].length !== 1) return;
-
- this.#storage.setCacheEventTag({
- id: `${event.id}:${tag[0]}:${tag[1]}`,
- eventId: event.id,
- tag: tag[0],
- value: tag[1],
- tagValue: tag[0] + tag[1],
- });
- }
- }
- }
- }
- }
-
- /**
- * Searches by authors
- */
- private async byAuthors(
- filterKeys: string[],
- filter: NDKFilter,
- subscription: NDKSubscription,
- ): Promise {
- const f = ["authors"];
- const hasAllKeys =
- filterKeys.length === f.length && f.every((k) => filterKeys.includes(k));
-
- let foundEvents = false;
-
- if (hasAllKeys && filter.authors) {
- for (const pubkey of filter.authors) {
- const events = await this.#storage.getCacheEventsByPubkey(pubkey);
- for (const event of events) {
- let rawEvent: NostrEvent;
- try {
- rawEvent = JSON.parse(event.event);
- } catch (e) {
- console.log("failed to parse event", e);
- continue;
- }
-
- const ndkEvent = new NDKEvent(undefined, rawEvent);
- const relay = event.relay ? new NDKRelay(event.relay) : undefined;
- subscription.eventReceived(ndkEvent, relay, true);
- foundEvents = true;
- }
- }
- }
- return foundEvents;
- }
-
- /**
- * Searches by kinds
- */
- private async byKinds(
- filterKeys: string[],
- filter: NDKFilter,
- subscription: NDKSubscription,
- ): Promise {
- const f = ["kinds"];
- const hasAllKeys =
- filterKeys.length === f.length && f.every((k) => filterKeys.includes(k));
-
- let foundEvents = false;
-
- if (hasAllKeys && filter.kinds) {
- for (const kind of filter.kinds) {
- const events = await this.#storage.getCacheEventsByKind(kind);
- for (const event of events) {
- let rawEvent: NostrEvent;
- try {
- rawEvent = JSON.parse(event.event);
- } catch (e) {
- console.log("failed to parse event", e);
- continue;
- }
-
- const ndkEvent = new NDKEvent(undefined, rawEvent);
- const relay = event.relay ? new NDKRelay(event.relay) : undefined;
- subscription.eventReceived(ndkEvent, relay, true);
- foundEvents = true;
- }
- }
- }
- return foundEvents;
- }
-
- /**
- * Searches by ids
- */
- private async byIdsQuery(
- filterKeys: string[],
- filter: NDKFilter,
- subscription: NDKSubscription,
- ): Promise {
- const f = ["ids"];
- const hasAllKeys =
- filterKeys.length === f.length && f.every((k) => filterKeys.includes(k));
-
- if (hasAllKeys && filter.ids) {
- for (const id of filter.ids) {
- const event = await this.#storage.getCacheEvent(id);
- if (!event) continue;
-
- let rawEvent: NostrEvent;
- try {
- rawEvent = JSON.parse(event.event);
- } catch (e) {
- console.log("failed to parse event", e);
- continue;
- }
-
- const ndkEvent = new NDKEvent(undefined, rawEvent);
- const relay = event.relay ? new NDKRelay(event.relay) : undefined;
- subscription.eventReceived(ndkEvent, relay, true);
- }
-
- return true;
- }
-
- return false;
- }
-
- /**
- * Searches by NIP-33
- */
- private async byNip33Query(
- filterKeys: string[],
- filter: NDKFilter,
- subscription: NDKSubscription,
- ): Promise {
- const f = ["#d", "authors", "kinds"];
- const hasAllKeys =
- filterKeys.length === f.length && f.every((k) => filterKeys.includes(k));
-
- if (hasAllKeys && filter.kinds && filter.authors) {
- for (const kind of filter.kinds) {
- const replaceableKind = kind >= 30000 && kind < 40000;
-
- if (!replaceableKind) continue;
-
- for (const author of filter.authors) {
- for (const dTag of filter["#d"]) {
- const replaceableId = `${kind}:${author}:${dTag}`;
- const event = await this.#storage.getCacheEvent(replaceableId);
- if (!event) continue;
-
- let rawEvent: NostrEvent;
- try {
- rawEvent = JSON.parse(event.event);
- } catch (e) {
- console.log("failed to parse event", e);
- continue;
- }
-
- const ndkEvent = new NDKEvent(undefined, rawEvent);
- const relay = event.relay ? new NDKRelay(event.relay) : undefined;
- subscription.eventReceived(ndkEvent, relay, true);
- }
- }
- }
- return true;
- }
- return false;
- }
-
- /**
- * Searches by kind & author
- */
- private async byKindAndAuthor(
- filterKeys: string[],
- filter: NDKFilter,
- subscription: NDKSubscription,
- ): Promise {
- const f = ["authors", "kinds"];
- const hasAllKeys =
- filterKeys.length === f.length && f.every((k) => filterKeys.includes(k));
- let foundEvents = false;
-
- if (!hasAllKeys) return false;
-
- if (filter.kinds && filter.authors) {
- for (const kind of filter.kinds) {
- for (const author of filter.authors) {
- const events = await this.#storage.getCacheEventsByKindAndAuthor(
- kind,
- author,
- );
-
- for (const event of events) {
- let rawEvent: NostrEvent;
- try {
- rawEvent = JSON.parse(event.event);
- } catch (e) {
- console.log("failed to parse event", e);
- continue;
- }
-
- const ndkEvent = new NDKEvent(undefined, rawEvent);
- const relay = event.relay ? new NDKRelay(event.relay) : undefined;
- subscription.eventReceived(ndkEvent, relay, true);
- foundEvents = true;
- }
- }
- }
- }
- return foundEvents;
- }
-
- /**
- * Searches by tags and optionally filters by tags
- */
- private async byTagsAndOptionallyKinds(
- filterKeys: string[],
- filter: NDKFilter,
- subscription: NDKSubscription,
- ): Promise {
- for (const filterKey of filterKeys) {
- const isKind = filterKey === "kinds";
- const isTag = filterKey.startsWith("#") && filterKey.length === 2;
-
- if (!isKind && !isTag) return false;
- }
-
- const events = await this.filterByTag(filterKeys, filter);
- const kinds = filter.kinds as number[];
-
- for (const event of events) {
- // biome-ignore lint/style/noNonNullAssertion:
- if (!kinds?.includes(event.kind!)) continue;
- subscription.eventReceived(event, undefined, true);
- }
-
- return false;
- }
-
- private async filterByTag(
- filterKeys: string[],
- filter: NDKFilter,
- ): Promise {
- const retEvents: NDKEvent[] = [];
-
- for (const filterKey of filterKeys) {
- if (filterKey.length !== 2) continue;
- const tag = filterKey.slice(1);
- // const values = filter[filterKey] as string[];
- const values: string[] = [];
- for (const [key, value] of Object.entries(filter)) {
- if (key === filterKey) values.push(value as string);
- }
-
- for (const value of values) {
- const eventTags = await this.#storage.getCacheEventTagsByTagValue(
- tag + value,
- );
- if (!eventTags.length) continue;
-
- const eventIds = eventTags.map((t) => t.eventId);
-
- const events = await this.#storage.getCacheEvents(eventIds);
- for (const event of events) {
- let rawEvent: NostrEvent;
- try {
- rawEvent = JSON.parse(event.event);
-
- // Make sure all passed filters match the event
- if (!matchFilter(filter, rawEvent)) continue;
- } catch (e) {
- console.log("failed to parse event", e);
- continue;
- }
-
- const ndkEvent = new NDKEvent(undefined, rawEvent);
- const relay = event.relay ? new NDKRelay(event.relay) : undefined;
- ndkEvent.relay = relay;
- retEvents.push(ndkEvent);
- }
- }
- }
-
- return retEvents;
- }
-
- private async dumpProfiles(): Promise {
- const profiles = [];
-
- if (!this.profiles) return;
-
- for (const pubkey of this.dirtyProfiles) {
- const profile = this.profiles.get(pubkey);
-
- if (!profile) continue;
-
- profiles.push({
- pubkey,
- profile: JSON.stringify(profile),
- createdAt: Date.now(),
- });
- }
-
- if (profiles.length) {
- await this.#storage.setCacheProfiles(profiles);
- }
-
- this.dirtyProfiles.clear();
- }
-}
diff --git a/packages/ndk-cache-tauri/package.json b/packages/ndk-cache-tauri/package.json
deleted file mode 100644
index 0fca1db2..00000000
--- a/packages/ndk-cache-tauri/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name": "@lume/ndk-cache-tauri",
- "version": "0.0.0",
- "main": "./index.ts",
- "private": true,
- "license": "MIT",
- "publishConfig": {
- "access": "public"
- },
- "dependencies": {
- "@lume/storage": "workspace:*",
- "@nostr-dev-kit/ndk": "^2.3.3",
- "lru-cache": "^10.2.0",
- "nostr-fetch": "^0.15.0",
- "nostr-tools": "1.17.0",
- "react": "^18.2.0"
- },
- "devDependencies": {
- "@lume/tsconfig": "workspace:*",
- "@types/react": "^18.2.48",
- "typescript": "^5.3.3"
- }
-}
\ No newline at end of file
diff --git a/packages/ndk-cache-tauri/tsconfig.json b/packages/ndk-cache-tauri/tsconfig.json
deleted file mode 100644
index 86a6f0b8..00000000
--- a/packages/ndk-cache-tauri/tsconfig.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "extends": "@lume/tsconfig/base.json",
- "compilerOptions": {
- "outDir": "dist"
- },
- "exclude": ["node_modules", "dist"]
-}
diff --git a/packages/storage/package.json b/packages/storage/package.json
deleted file mode 100644
index beb3235d..00000000
--- a/packages/storage/package.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "name": "@lume/storage",
- "version": "0.0.0",
- "main": "./src/index.ts",
- "private": true,
- "license": "MIT",
- "publishConfig": {
- "access": "public"
- },
- "dependencies": {
- "nostr-tools": "~1.17.0",
- "react": "^18.2.0"
- },
- "devDependencies": {
- "@lume/tsconfig": "workspace:*",
- "@lume/types": "workspace:*",
- "@lume/utils": "workspace:^",
- "@types/react": "^18.2.48",
- "typescript": "^5.3.3"
- }
-}
diff --git a/packages/storage/src/index.ts b/packages/storage/src/index.ts
deleted file mode 100644
index 90a7de2d..00000000
--- a/packages/storage/src/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from "./storage";
-export * from "./provider";
diff --git a/packages/storage/src/provider.tsx b/packages/storage/src/provider.tsx
deleted file mode 100644
index 5122462b..00000000
--- a/packages/storage/src/provider.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { locale, platform } from "@tauri-apps/plugin-os";
-import Database from "@tauri-apps/plugin-sql";
-import { PropsWithChildren, createContext, useContext } from "react";
-import { LumeStorage } from "./storage";
-
-const StorageContext = createContext(null);
-
-const sqliteAdapter = await Database.load("sqlite:lume_v3.db");
-const platformName = await platform();
-const osLocale = await locale();
-
-const db = new LumeStorage(sqliteAdapter, platformName, osLocale);
-await db.init();
-
-if (db.settings.depot) await db.launchDepot();
-
-export const StorageProvider = ({ children }: PropsWithChildren) => {
- return (
- {children}
- );
-};
-
-export const useStorage = () => {
- const context = useContext(StorageContext);
- if (context === undefined) {
- throw new Error("Please import Storage Provider to use useStorage() hook");
- }
- return context;
-};
diff --git a/packages/storage/src/storage.ts b/packages/storage/src/storage.ts
deleted file mode 100644
index b31d3565..00000000
--- a/packages/storage/src/storage.ts
+++ /dev/null
@@ -1,458 +0,0 @@
-import {
- Account,
- IColumn,
- Interests,
- NDKCacheEvent,
- NDKCacheEventTag,
- NDKCacheUser,
- NDKCacheUserProfile,
-} from "@lume/types";
-import { invoke } from "@tauri-apps/api/core";
-import { resolve, appConfigDir, resolveResource } from "@tauri-apps/api/path";
-import { VITE_FLATPAK_RESOURCE } from "@lume/utils";
-import { Platform } from "@tauri-apps/plugin-os";
-import { Child, Command } from "@tauri-apps/plugin-shell";
-import Database from "@tauri-apps/plugin-sql";
-import { nip19 } from "nostr-tools";
-
-export class LumeStorage {
- #db: Database;
- #depot: Child;
- readonly platform: Platform;
- readonly locale: string;
- public currentUser: Account;
- public interests: Interests;
- public nwc: string;
- public settings: {
- autoupdate: boolean;
- nsecbunker: boolean;
- media: boolean;
- hashtag: boolean;
- depot: boolean;
- tunnelUrl: string;
- lowPower: boolean;
- translation: boolean;
- translateApiKey: string;
- instantZap: boolean;
- };
-
- constructor(db: Database, platform: Platform, locale: string) {
- this.#db = db;
- this.locale = locale;
- this.platform = platform;
- this.interests = null;
- this.nwc = null;
- this.settings = {
- autoupdate: false,
- nsecbunker: false,
- media: true,
- hashtag: true,
- depot: false,
- tunnelUrl: "",
- lowPower: false,
- translation: false,
- translateApiKey: "",
- instantZap: false,
- };
- }
-
- public async init() {
- const settings = await this.getAllSettings();
- const account = await this.getActiveAccount();
-
- if (account) {
- this.currentUser = account;
- this.interests = await this.getInterests();
- }
-
- for (const item of settings) {
- if (item.value.length > 10) {
- this.settings[item.key] = item.value;
- } else {
- this.settings[item.key] = !!parseInt(item.value);
- }
- }
- }
-
- async #keyring_save(key: string, value: string) {
- return await invoke("secure_save", { key, value });
- }
-
- async #keyring_load(key: string) {
- try {
- const value: string = await invoke("secure_load", { key });
- if (!value) return null;
- return value;
- } catch {
- return null;
- }
- }
-
- async #keyring_remove(key: string) {
- return await invoke("secure_remove", { key });
- }
-
- public async launchDepot() {
- const configPath =
- VITE_FLATPAK_RESOURCE !== null
- ? await resolve("/", VITE_FLATPAK_RESOURCE)
- : await resolveResource("resources/config.toml");
- const dataPath = await appConfigDir();
-
- const command = Command.sidecar("bin/depot", [
- "-c",
- configPath,
- "-d",
- dataPath,
- ]);
- this.#depot = await command.spawn();
- }
-
- public checkDepot() {
- if (this.#depot) return true;
- return false;
- }
-
- public async stopDepot() {
- if (this.#depot) return this.#depot.kill();
- }
-
- public async getCacheUser(pubkey: string) {
- const results: Array = await this.#db.select(
- "SELECT * FROM ndk_users WHERE pubkey = $1 ORDER BY pubkey DESC LIMIT 1;",
- [pubkey],
- );
-
- if (!results.length) return null;
-
- if (typeof results[0].profile === "string")
- results[0].profile = JSON.parse(results[0].profile);
-
- return results[0];
- }
-
- public async getCacheEvent(id: string) {
- const results: Array = await this.#db.select(
- "SELECT * FROM ndk_events WHERE id = $1 ORDER BY id DESC LIMIT 1;",
- [id],
- );
-
- if (!results.length) return null;
- return results[0];
- }
-
- public async getCacheEvents(ids: string[]) {
- const idsArr = `'${ids.join("','")}'`;
-
- const results: Array = await this.#db.select(
- `SELECT * FROM ndk_events WHERE id IN (${idsArr}) ORDER BY id;`,
- );
-
- if (!results.length) return [];
- return results;
- }
-
- public async getCacheEventsByPubkey(pubkey: string) {
- const results: Array = await this.#db.select(
- "SELECT * FROM ndk_events WHERE pubkey = $1 ORDER BY id;",
- [pubkey],
- );
-
- if (!results.length) return [];
- return results;
- }
-
- public async getCacheEventsByKind(kind: number) {
- const results: Array = await this.#db.select(
- "SELECT * FROM ndk_events WHERE kind = $1 ORDER BY id;",
- [kind],
- );
-
- if (!results.length) return [];
- return results;
- }
-
- public async getCacheEventsByKindAndAuthor(kind: number, pubkey: string) {
- const results: Array = await this.#db.select(
- "SELECT * FROM ndk_events WHERE kind = $1 AND pubkey = $2 ORDER BY id;",
- [kind, pubkey],
- );
-
- if (!results.length) return [];
- return results;
- }
-
- public async getCacheEventTagsByTagValue(tagValue: string) {
- const results: Array = await this.#db.select(
- "SELECT * FROM ndk_eventtags WHERE tagValue = $1 ORDER BY id;",
- [tagValue],
- );
-
- if (!results.length) return [];
- return results;
- }
-
- public async setCacheEvent({
- id,
- pubkey,
- content,
- kind,
- createdAt,
- relay,
- event,
- }: NDKCacheEvent) {
- return await this.#db.execute(
- "INSERT OR IGNORE INTO ndk_events (id, pubkey, content, kind, createdAt, relay, event) VALUES ($1, $2, $3, $4, $5, $6, $7);",
- [id, pubkey, content, kind, createdAt, relay, event],
- );
- }
-
- public async setCacheEventTag({
- id,
- eventId,
- tag,
- value,
- tagValue,
- }: NDKCacheEventTag) {
- return await this.#db.execute(
- "INSERT OR IGNORE INTO ndk_eventtags (id, eventId, tag, value, tagValue) VALUES ($1, $2, $3, $4, $5);",
- [id, eventId, tag, value, tagValue],
- );
- }
-
- public async setCacheProfiles(profiles: Array) {
- return await Promise.all(
- profiles.map(
- async (profile) =>
- await this.#db.execute(
- "INSERT OR IGNORE INTO ndk_users (pubkey, profile, createdAt) VALUES ($1, $2, $3);",
- [profile.pubkey, profile.profile, profile.createdAt],
- ),
- ),
- );
- }
-
- public async getAllCacheUsers() {
- const results: Array = await this.#db.select(
- "SELECT * FROM ndk_users ORDER BY createdAt DESC;",
- );
-
- if (!results.length) return [];
-
- const users: NDKCacheUserProfile[] = results.map((item) => ({
- npub: nip19.npubEncode(item.pubkey),
- ...JSON.parse(item.profile as string),
- }));
-
- return users;
- }
-
- public async checkAccount() {
- const result: Array<{ total: string }> = await this.#db.select(
- 'SELECT COUNT(*) AS "total" FROM accounts WHERE is_active = "1" ORDER BY id DESC LIMIT 1;',
- );
- return parseInt(result[0].total);
- }
-
- public async getActiveAccount() {
- const results: Array = await this.#db.select(
- 'SELECT * FROM accounts WHERE is_active = "1" ORDER BY id DESC LIMIT 1;',
- );
-
- if (results.length) {
- this.currentUser = results[0];
- return results[0];
- }
- return null;
- }
-
- public async createAccount({
- pubkey,
- privkey,
- }: {
- pubkey: string;
- privkey?: string;
- }) {
- const existAccounts: Array = await this.#db.select(
- "SELECT * FROM accounts WHERE pubkey = $1 ORDER BY id DESC LIMIT 1;",
- [pubkey],
- );
-
- if (existAccounts.length) {
- await this.#db.execute(
- "UPDATE accounts SET is_active = '1' WHERE pubkey = $1;",
- [pubkey],
- );
- } else {
- await this.#db.execute(
- "INSERT OR IGNORE INTO accounts (pubkey, is_active) VALUES ($1, $2);",
- [pubkey, 1],
- );
-
- if (privkey) await this.#keyring_save(pubkey, privkey);
- }
-
- const account = await this.getActiveAccount();
- return account;
- }
-
- /**
- * Save private key to OS secure storage
- * @deprecated this method will be remove in the next update
- */
- public async createPrivkey(name: string, privkey: string) {
- return await this.#keyring_save(name, privkey);
- }
-
- /**
- * Load private key from OS secure storage
- * @deprecated this method will be remove in the next update
- */
- public async loadPrivkey(name: string) {
- return await this.#keyring_load(name);
- }
-
- /**
- * Remove private key from OS secure storage
- * @deprecated this method will be remove in the next update
- */
- public async removePrivkey(name: string) {
- return await this.#keyring_remove(name);
- }
-
- public async updateAccount(column: string, value: string) {
- const insert = await this.#db.execute(
- `UPDATE accounts SET ${column} = $1 WHERE id = $2;`,
- [value, this.currentUser.id],
- );
-
- if (insert) {
- const account = await this.getActiveAccount();
- return account;
- }
- }
-
- public async getColumns() {
- if (!this.currentUser) return [];
-
- const columns: Array = await this.#db.select(
- "SELECT * FROM columns WHERE account_id = $1 ORDER BY created_at DESC;",
- [this.currentUser.id],
- );
-
- return columns;
- }
-
- public async createColumn(
- kind: number,
- title: string,
- content: string | string[],
- ) {
- const insert = await this.#db.execute(
- "INSERT INTO columns (account_id, kind, title, content) VALUES ($1, $2, $3, $4);",
- [this.currentUser.id, kind, title, content],
- );
-
- if (insert) {
- const columns: Array = await this.#db.select(
- "SELECT * FROM columns WHERE id = $1 ORDER BY id DESC LIMIT 1;",
- [insert.lastInsertId],
- );
- if (!columns.length) console.error("get created widget failed");
- return columns[0];
- }
- }
-
- public async updateColumn(id: number, title: string, content: string) {
- return await this.#db.execute(
- "UPDATE columns SET title = $1, content = $2 WHERE id = $3;",
- [title, content, id],
- );
- }
-
- public async removeColumn(id: number) {
- const res = await this.#db.execute("DELETE FROM columns WHERE id = $1;", [
- id,
- ]);
- if (res) return id;
- }
-
- public async createSetting(key: string, value: string | undefined) {
- const currentSetting = await this.checkSettingValue(key);
-
- if (!currentSetting) {
- if (key !== "translateApiKey" && key !== "tunnelUrl")
- this.settings[key] === !!parseInt(value);
-
- return await this.#db.execute(
- "INSERT OR IGNORE INTO settings (key, value) VALUES ($1, $2);",
- [key, value],
- );
- }
-
- return await this.#db.execute(
- "UPDATE settings SET value = $1 WHERE key = $2;",
- [value, key],
- );
- }
-
- public async getAllSettings() {
- const results: { key: string; value: string }[] = await this.#db.select(
- "SELECT * FROM settings ORDER BY id DESC;",
- );
- if (results.length < 1) return [];
- return results;
- }
-
- public async checkSettingValue(key: string) {
- const results: { key: string; value: string }[] = await this.#db.select(
- "SELECT * FROM settings WHERE key = $1 ORDER BY id DESC LIMIT 1;",
- [key],
- );
- if (!results.length) return false;
- return results[0].value;
- }
-
- public async getSettingValue(key: string) {
- const results: { key: string; value: string }[] = await this.#db.select(
- "SELECT * FROM settings WHERE key = $1 ORDER BY id DESC LIMIT 1;",
- [key],
- );
- if (!results.length) return "0";
- return results[0].value;
- }
-
- public async getInterests() {
- const results: { key: string; value: string }[] = await this.#db.select(
- "SELECT * FROM settings WHERE key = 'interests' ORDER BY id DESC LIMIT 1;",
- );
-
- if (!results.length) return null;
- if (!results[0].value.length) return null;
-
- return JSON.parse(results[0].value) as Interests;
- }
-
- public async clearCache() {
- await this.#db.execute("DELETE FROM ndk_events;");
- await this.#db.execute("DELETE FROM ndk_eventtags;");
- await this.#db.execute("DELETE FROM ndk_users;");
- }
-
- public async clearProfileCache(pubkey: string) {
- await this.#db.execute("DELETE FROM ndk_users WHERE pubkey = $1;", [
- pubkey,
- ]);
- }
-
- public async logout() {
- await this.createSetting("nsecbunker", "0");
- await this.#db.execute(
- "UPDATE accounts SET is_active = '0' WHERE id = $1;",
- [this.currentUser.id],
- );
-
- this.currentUser = null;
- this.nwc = null;
- }
-}
diff --git a/packages/tailwindcss/package.json b/packages/tailwindcss/package.json
index 12460629..6e5e6b41 100644
--- a/packages/tailwindcss/package.json
+++ b/packages/tailwindcss/package.json
@@ -10,12 +10,10 @@
".": "./tailwind.config.js"
},
"devDependencies": {
+ "@evilmartians/harmony": "^1.2.0",
"@tailwindcss/forms": "^0.5.7",
"@tailwindcss/typography": "^0.5.10",
- "tailwind-scrollbar": "^3.0.5",
+ "tailwind-scrollbar": "^3.1.0",
"tailwindcss": "^3.4.1"
- },
- "dependencies": {
- "@evilmartians/harmony": "^1.2.0"
}
}
diff --git a/packages/tailwindcss/tailwind.config.js b/packages/tailwindcss/tailwind.config.js
index 43a5ae57..bd4f0b94 100644
--- a/packages/tailwindcss/tailwind.config.js
+++ b/packages/tailwindcss/tailwind.config.js
@@ -1,53 +1,55 @@
+/** @type {import('tailwindcss').Config} */
+
import harmonyPalette from "@evilmartians/harmony/tailwind";
const config = {
- theme: {
- colors: harmonyPalette,
- extend: {
- keyframes: {
- slideDownAndFade: {
- from: { opacity: 0, transform: "translateY(-2px)" },
- to: { opacity: 1, transform: "translateY(0)" },
- },
- slideLeftAndFade: {
- from: { opacity: 0, transform: "translateX(2px)" },
- to: { opacity: 1, transform: "translateX(0)" },
- },
- slideUpAndFade: {
- from: { opacity: 0, transform: "translateY(2px)" },
- to: { opacity: 1, transform: "translateY(0)" },
- },
- slideRightAndFade: {
- from: { opacity: 0, transform: "translateX(-2px)" },
- to: { opacity: 1, transform: "translateX(0)" },
- },
- overlayShow: {
- from: { opacity: 0 },
- to: { opacity: 1 },
- },
- contentShow: {
- from: { opacity: 0, transform: "translate(-50%, -48%) scale(0.96)" },
- to: { opacity: 1, transform: "translate(-50%, -50%) scale(1)" },
- },
- },
- animation: {
- slideDownAndFade:
- "slideDownAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)",
- slideLeftAndFade:
- "slideLeftAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)",
- slideUpAndFade: "slideUpAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)",
- slideRightAndFade:
- "slideRightAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)",
- overlayShow: "overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1)",
- contentShow: "contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1)",
- },
- },
- },
- plugins: [
- require("@tailwindcss/forms"),
- require("@tailwindcss/typography"),
- require("tailwind-scrollbar")({ nocompatible: true }),
- ],
+ theme: {
+ colors: harmonyPalette,
+ extend: {
+ keyframes: {
+ slideDownAndFade: {
+ from: { opacity: 0, transform: "translateY(-2px)" },
+ to: { opacity: 1, transform: "translateY(0)" },
+ },
+ slideLeftAndFade: {
+ from: { opacity: 0, transform: "translateX(2px)" },
+ to: { opacity: 1, transform: "translateX(0)" },
+ },
+ slideUpAndFade: {
+ from: { opacity: 0, transform: "translateY(2px)" },
+ to: { opacity: 1, transform: "translateY(0)" },
+ },
+ slideRightAndFade: {
+ from: { opacity: 0, transform: "translateX(-2px)" },
+ to: { opacity: 1, transform: "translateX(0)" },
+ },
+ overlayShow: {
+ from: { opacity: 0 },
+ to: { opacity: 1 },
+ },
+ contentShow: {
+ from: { opacity: 0, transform: "translate(-50%, -48%) scale(0.96)" },
+ to: { opacity: 1, transform: "translate(-50%, -50%) scale(1)" },
+ },
+ },
+ animation: {
+ slideDownAndFade:
+ "slideDownAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)",
+ slideLeftAndFade:
+ "slideLeftAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)",
+ slideUpAndFade: "slideUpAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)",
+ slideRightAndFade:
+ "slideRightAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)",
+ overlayShow: "overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1)",
+ contentShow: "contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1)",
+ },
+ },
+ },
+ plugins: [
+ require("@tailwindcss/forms"),
+ require("@tailwindcss/typography"),
+ require("tailwind-scrollbar")({ nocompatible: true }),
+ ],
};
export default config;
diff --git a/packages/types/index.d.ts b/packages/types/index.d.ts
index 2ae39b1e..61ebf832 100644
--- a/packages/types/index.d.ts
+++ b/packages/types/index.d.ts
@@ -1,8 +1,76 @@
-import {
- type NDKEvent,
- NDKRelayList,
- type NDKUserProfile,
-} from "@nostr-dev-kit/ndk";
+export interface Settings {
+ autoupdate: boolean;
+ nsecbunker: boolean;
+ media: boolean;
+ hashtag: boolean;
+ lowPower: boolean;
+ translation: boolean;
+ translateApiKey: string;
+ instantZap: boolean;
+ defaultZapAmount: number;
+}
+
+export interface Keys {
+ npub: string;
+ nsec: string;
+}
+
+export enum Kind {
+ Metadata = 0,
+ Text = 1,
+ RecommendRelay = 2,
+ Contacts = 3,
+ Repost = 6,
+ Reaction = 7,
+ // NIP-89: App Metadata
+ AppRecommendation = 31989,
+ AppHandler = 31990,
+ // #TODO: Add all nostr kinds
+}
+
+export interface Event {
+ id: string;
+ pubkey: string;
+ created_at: number;
+ kind: Kind;
+ tags: string[][];
+ content: string;
+ sig: string;
+ relay?: string;
+}
+
+export interface EventWithReplies extends Event {
+ replies: Array;
+}
+
+export interface Metadata {
+ name?: string;
+ display_name?: string;
+ about?: string;
+ website?: string;
+ picture?: string;
+ banner?: string;
+ nip05?: string;
+ lud06?: string;
+ lud16?: string;
+}
+
+export interface Contact {
+ pubkey: string;
+ profile: Metadata;
+}
+
+export interface Account {
+ npub: string;
+ contacts?: string[];
+ interests?: Interests;
+}
+
+export interface Interests {
+ hashtags: string[];
+ users: string[];
+ words: string[];
+}
export interface RichContent {
parsed: string;
@@ -12,17 +80,8 @@ export interface RichContent {
notes: string[];
}
-export interface Account {
- id: string;
- pubkey: string;
- is_active: number;
- contacts: string[];
- relayList: string[];
-}
-
-export interface IColumn {
- id?: number;
- kind: number;
+export interface LumeColumn {
+ id: number;
title: string;
content: string;
}
@@ -34,10 +93,6 @@ export interface Opengraph {
image?: string;
}
-export interface NDKEventWithReplies extends NDKEvent {
- replies: Array;
-}
-
export interface NostrBuildResponse {
ok: boolean;
data?: {
@@ -58,34 +113,6 @@ export interface NostrBuildResponse {
};
}
-export interface NDKCacheUser {
- pubkey: string;
- profile: string | NDKUserProfile;
- createdAt: number;
-}
-
-export interface NDKCacheUserProfile extends NDKUserProfile {
- npub: string;
-}
-
-export interface NDKCacheEvent {
- id: string;
- pubkey: string;
- content: string;
- kind: number;
- createdAt: number;
- relay: string;
- event: string;
-}
-
-export interface NDKCacheEventTag {
- id: string;
- eventId: string;
- tag: string;
- value: string;
- tagValue: string;
-}
-
export interface NIP11 {
name: string;
description: string;
@@ -115,9 +142,3 @@ export interface NIP05 {
};
};
}
-
-export interface Interests {
- hashtags: string[];
- users: string[];
- words: string[];
-}
diff --git a/packages/types/package.json b/packages/types/package.json
index 52d210cc..ecd50bc4 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,7 @@
{
"name": "@lume/types",
"version": "0.0.0",
+ "main": "./index.d.ts",
"types": "./index.d.ts",
"private": true,
"license": "MIT",
@@ -9,8 +10,5 @@
},
"devDependencies": {
"typescript": "^5.3.3"
- },
- "dependencies": {
- "@nostr-dev-kit/ndk": "^2.3.3"
}
}
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 970645b2..bfbefa42 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -4,43 +4,50 @@
"private": true,
"main": "./src/index.ts",
"dependencies": {
- "@dnd-kit/core": "^6.1.0",
+ "@getalby/sdk": "^3.3.1",
"@lume/ark": "workspace:^",
"@lume/icons": "workspace:^",
- "@lume/storage": "workspace:^",
"@lume/utils": "workspace:^",
- "@nostr-dev-kit/ndk": "^2.3.3",
+ "@nostr-dev-kit/ndk": "^2.5.0",
"@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-alert-dialog": "^1.0.5",
"@radix-ui/react-avatar": "^1.0.4",
+ "@radix-ui/react-collapsible": "^1.0.3",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-dropdown-menu": "^2.0.6",
"@radix-ui/react-hover-card": "^1.0.7",
"@radix-ui/react-popover": "^1.0.7",
- "@tanstack/react-query": "^5.17.19",
- "framer-motion": "^11.0.3",
- "jotai": "^2.6.3",
+ "@radix-ui/react-tooltip": "^1.0.7",
+ "@tanstack/react-query": "^5.24.1",
+ "@tanstack/react-router": "^1.17.4",
+ "framer-motion": "^11.0.6",
+ "get-urls": "^12.1.0",
+ "media-chrome": "^2.2.5",
"minidenticons": "^4.2.0",
- "nostr-tools": "~1.17.0",
+ "nanoid": "^5.0.6",
+ "qrcode.react": "^3.1.0",
+ "re-resizable": "^6.9.11",
"react": "^18.2.0",
+ "react-currency-input-field": "^3.8.0",
"react-dom": "^18.2.0",
- "react-hook-form": "^7.49.3",
- "react-hotkeys-hook": "^4.4.4",
- "react-i18next": "^14.0.1",
- "react-router-dom": "^6.21.3",
+ "react-hook-form": "^7.50.1",
+ "react-hotkeys-hook": "^4.5.0",
+ "react-i18next": "^14.0.5",
+ "react-router-dom": "^6.22.2",
+ "react-string-replace": "^1.1.1",
"slate": "^0.101.5",
"slate-react": "^0.101.6",
- "sonner": "^1.4.0",
+ "sonner": "^1.4.2",
+ "string-strip-html": "^13.4.6",
"uqr": "^0.1.2",
"use-debounce": "^10.0.0",
- "virtua": "^0.23.0"
+ "virtua": "^0.27.5"
},
"devDependencies": {
"@lume/tailwindcss": "workspace:^",
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
- "tailwind-merge": "^2.2.1",
+ "@types/react": "^18.2.60",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
diff --git a/packages/ui/src/account/active.tsx b/packages/ui/src/account/active.tsx
deleted file mode 100644
index d6ecf5f8..00000000
--- a/packages/ui/src/account/active.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-import { useArk, useProfile } from "@lume/ark";
-import { SettingsIcon, UserIcon } from "@lume/icons";
-import { cn, useNetworkStatus } from "@lume/utils";
-import * as Avatar from "@radix-ui/react-avatar";
-import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
-import { minidenticon } from "minidenticons";
-import { useMemo } from "react";
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-import { Logout } from "./logout";
-
-export function ActiveAccount() {
- const ark = useArk();
- const isOnline = useNetworkStatus();
- const svgURI = useMemo(
- () =>
- `data:image/svg+xml;utf8,${encodeURIComponent(
- minidenticon(ark.account.pubkey, 90, 50),
- )}`,
- [],
- );
-
- const { t } = useTranslation();
- const { user } = useProfile(ark.account.pubkey);
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {t("user.editProfile")}
-
-
-
-
-
- {t("user.settings")}
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/account/logout.tsx b/packages/ui/src/account/logout.tsx
deleted file mode 100644
index a375f9d1..00000000
--- a/packages/ui/src/account/logout.tsx
+++ /dev/null
@@ -1,83 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LogoutIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import * as AlertDialog from "@radix-ui/react-alert-dialog";
-import { useQueryClient } from "@tanstack/react-query";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-import { toast } from "sonner";
-
-export function Logout() {
- const ark = useArk();
- const storage = useStorage();
- const queryClient = useQueryClient();
- const navigate = useNavigate();
-
- const { t } = useTranslation();
-
- const logout = async () => {
- try {
- // logout
- await storage.logout();
-
- // clear cache
- queryClient.clear();
- ark.account = null;
- ark.ndk.signer = null;
- ark.ndk.activeUser = null;
-
- // redirect to welcome screen
- navigate("/auth/");
- } catch (e) {
- toast.error(String(e));
- }
- };
-
- return (
-
-
-
-
- {t("user.logout")}
-
-
-
-
-
-
-
-
- {t("user.logoutConfirmTitle")}
-
-
- {t("user.logoutConfirmSubtitle")}
-
-
-
-
-
- {t("global.cancel")}
-
-
-
- logout()}
- className="inline-flex h-9 items-center justify-center rounded-lg bg-red-500 px-4 text-sm font-medium text-white outline-none hover:bg-red-600"
- >
- {t("user.logout")}
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/avatarUploadButton.tsx b/packages/ui/src/avatarUploadButton.tsx
deleted file mode 100644
index 8abd1d57..00000000
--- a/packages/ui/src/avatarUploadButton.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon } from "@lume/icons";
-import { Dispatch, SetStateAction, useState } from "react";
-import { useTranslation } from "react-i18next";
-import { toast } from "sonner";
-
-export function AvatarUploadButton({
- setPicture,
-}: {
- setPicture: Dispatch>;
-}) {
- const ark = useArk();
-
- const [t] = useTranslation();
- const [loading, setLoading] = useState(false);
-
- const uploadAvatar = async () => {
- try {
- // start loading
- setLoading(true);
-
- const image = await ark.upload({ fileExts: [] });
- if (image) {
- setPicture(image);
- setLoading(false);
- }
- } catch (e) {
- setLoading(false);
- toast.error(String(e));
- }
- };
-
- return (
- uploadAvatar()}
- className="inline-flex items-center justify-center rounded-lg border border-blue-200 bg-blue-100 w-32 px-2 py-1.5 text-sm font-medium text-blue-500 hover:border-blue-300 hover:bg-blue-200 dark:border-blue-800 dark:bg-blue-900 dark:text-blue-500 dark:hover:border-blue-800 dark:hover:bg-blue-800"
- >
- {loading ? (
-
- ) : (
- t("user.avatarButton")
- )}
-
- );
-}
diff --git a/packages/ui/src/box.tsx b/packages/ui/src/box.tsx
new file mode 100644
index 00000000..6681deac
--- /dev/null
+++ b/packages/ui/src/box.tsx
@@ -0,0 +1,25 @@
+import { cn } from "@lume/utils";
+import { ReactNode } from "react";
+
+export function Box({
+ children,
+ className,
+}: {
+ children: ReactNode;
+ className?: string;
+}) {
+ return (
+
+ );
+}
diff --git a/packages/ark/src/components/column/content.tsx b/packages/ui/src/column/content.tsx
similarity index 100%
rename from packages/ark/src/components/column/content.tsx
rename to packages/ui/src/column/content.tsx
diff --git a/packages/ui/src/column/header.tsx b/packages/ui/src/column/header.tsx
new file mode 100644
index 00000000..9e9c8f7c
--- /dev/null
+++ b/packages/ui/src/column/header.tsx
@@ -0,0 +1,80 @@
+import {
+ ChevronDownIcon,
+ MoveLeftIcon,
+ MoveRightIcon,
+ RefreshIcon,
+ TrashIcon,
+} from "@lume/icons";
+import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
+import { useQueryClient } from "@tanstack/react-query";
+import { useTranslation } from "react-i18next";
+
+export function ColumnHeader({ queryKey }: { queryKey?: string[] }) {
+ const { t } = useTranslation();
+ const queryClient = useQueryClient();
+
+ const refresh = async () => {
+ if (queryKey) await queryClient.refetchQueries({ queryKey });
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {t("global.refresh")}
+
+
+
+ move(column.id, "left")}
+ className="inline-flex h-9 items-center gap-3 rounded-lg px-3 text-sm font-medium text-black/70 hover:bg-black/10 hover:text-black focus:outline-none dark:text-white/70 dark:hover:bg-white/10 dark:hover:text-white"
+ >
+
+ {t("global.moveLeft")}
+
+
+
+ move(column.id, "right")}
+ className="inline-flex h-9 items-center gap-3 rounded-lg px-3 text-sm font-medium text-black/70 hover:bg-black/10 hover:text-black focus:outline-none dark:text-white/70 dark:hover:bg-white/10 dark:hover:text-white"
+ >
+
+ {t("global.moveRight")}
+
+
+
+
+ remove(column.id)}
+ className="inline-flex h-9 items-center gap-3 rounded-lg px-3 text-sm font-medium text-red-500 hover:bg-red-500 hover:text-red-50 focus:outline-none"
+ >
+
+ {t("global.delete")}
+
+
+
+
+
+
+ );
+}
diff --git a/packages/ark/src/components/column/index.ts b/packages/ui/src/column/index.ts
similarity index 82%
rename from packages/ark/src/components/column/index.ts
rename to packages/ui/src/column/index.ts
index aecc1b5a..6b6813b8 100644
--- a/packages/ark/src/components/column/index.ts
+++ b/packages/ui/src/column/index.ts
@@ -2,9 +2,11 @@ import { Route } from "react-router-dom";
import { ColumnContent } from "./content";
import { ColumnHeader } from "./header";
import { ColumnLiveWidget } from "./live";
+import { ColumnProvider } from "./provider";
import { ColumnRoot } from "./root";
export const Column = {
+ Provider: ColumnProvider,
Root: ColumnRoot,
Live: ColumnLiveWidget,
Header: ColumnHeader,
diff --git a/packages/ark/src/components/column/live.tsx b/packages/ui/src/column/live.tsx
similarity index 91%
rename from packages/ark/src/components/column/live.tsx
rename to packages/ui/src/column/live.tsx
index 0278954d..09118ebe 100644
--- a/packages/ark/src/components/column/live.tsx
+++ b/packages/ui/src/column/live.tsx
@@ -1,7 +1,5 @@
import { ArrowUpIcon } from "@lume/icons";
-import { NDKEvent, NDKFilter } from "@nostr-dev-kit/ndk";
import { useEffect, useState } from "react";
-import { useArk } from "../../hooks/useArk";
export function ColumnLiveWidget({
filter,
diff --git a/packages/ui/src/column/provider.tsx b/packages/ui/src/column/provider.tsx
new file mode 100644
index 00000000..d37d5cd3
--- /dev/null
+++ b/packages/ui/src/column/provider.tsx
@@ -0,0 +1,23 @@
+import { LumeColumn } from "@lume/types";
+import { ReactNode, createContext, useContext } from "react";
+
+const ColumnContext = createContext(null);
+
+export function ColumnProvider({
+ column,
+ children,
+}: { column: LumeColumn; children: ReactNode }) {
+ return (
+ {children}
+ );
+}
+
+export function useColumnContext() {
+ const context = useContext(ColumnContext);
+ if (!context) {
+ throw new Error(
+ "Please import Column Provider to use useColumnContext() hook",
+ );
+ }
+ return context;
+}
diff --git a/packages/ark/src/components/column/root.tsx b/packages/ui/src/column/root.tsx
similarity index 100%
rename from packages/ark/src/components/column/root.tsx
rename to packages/ui/src/column/root.tsx
diff --git a/packages/ui/src/container.tsx b/packages/ui/src/container.tsx
new file mode 100644
index 00000000..521cbbd6
--- /dev/null
+++ b/packages/ui/src/container.tsx
@@ -0,0 +1,26 @@
+import { cn } from "@lume/utils";
+import { ReactNode } from "react";
+
+export function Container({
+ children,
+ withDrag = false,
+ className,
+}: {
+ children: ReactNode;
+ withDrag?: boolean;
+ className?: string;
+}) {
+ return (
+
+ {withDrag ? (
+
+ ) : null}
+ {children}
+
+ );
+}
diff --git a/packages/ui/src/editor/addMedia.tsx b/packages/ui/src/editor/addMedia.tsx
deleted file mode 100644
index 443e696c..00000000
--- a/packages/ui/src/editor/addMedia.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useArk } from "@lume/ark";
-import { AddMediaIcon, LoaderIcon } from "@lume/icons";
-import { useState } from "react";
-import { useSlateStatic } from "slate-react";
-import { toast } from "sonner";
-import { insertImage } from "./utils";
-
-export function EditorAddMedia() {
- const ark = useArk();
- const editor = useSlateStatic();
-
- const [loading, setLoading] = useState(false);
-
- const uploadToNostrBuild = async () => {
- try {
- setLoading(true);
-
- const image = await ark.upload({
- fileExts: ["mp4", "mp3", "webm", "mkv", "avi", "mov"],
- });
-
- if (image) {
- insertImage(editor, image);
- setLoading(false);
- }
- } catch (e) {
- setLoading(false);
- toast.error(`Upload failed, error: ${e}`);
- }
- };
-
- return (
- uploadToNostrBuild()}
- className="inline-flex items-center justify-center text-sm font-medium rounded-lg size-9 bg-neutral-100 text-neutral-900 hover:bg-neutral-200 dark:bg-neutral-900 dark:text-neutral-100 dark:hover:bg-neutral-800"
- >
- {loading ? (
-
- ) : (
-
- )}
-
- );
-}
diff --git a/packages/ui/src/editor/column.tsx b/packages/ui/src/editor/column.tsx
deleted file mode 100644
index 56a27a57..00000000
--- a/packages/ui/src/editor/column.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { editorAtom } from "@lume/utils";
-import { AnimatePresence, motion } from "framer-motion";
-import { useAtomValue } from "jotai";
-import { EditorForm } from "./form";
-
-export function Editor() {
- const isEditorOpen = useAtomValue(editorAtom);
-
- return (
-
- {isEditorOpen ? (
-
-
-
- ) : null}
-
- );
-}
diff --git a/packages/ui/src/editor/form.tsx b/packages/ui/src/editor/form.tsx
deleted file mode 100644
index 488cb5c8..00000000
--- a/packages/ui/src/editor/form.tsx
+++ /dev/null
@@ -1,389 +0,0 @@
-import { MentionNote, User, useArk, useColumnContext } from "@lume/ark";
-import { LoaderIcon, TrashIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { NDKCacheUserProfile } from "@lume/types";
-import { COL_TYPES, cn, editorValueAtom } from "@lume/utils";
-import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
-import { useAtom } from "jotai";
-import { useEffect, useRef, useState } from "react";
-import { useTranslation } from "react-i18next";
-import {
- Descendant,
- Editor,
- Node,
- Range,
- Transforms,
- createEditor,
-} from "slate";
-import {
- Editable,
- ReactEditor,
- Slate,
- useFocused,
- useSelected,
- useSlateStatic,
- withReact,
-} from "slate-react";
-import { toast } from "sonner";
-import { EditorAddMedia } from "./addMedia";
-import {
- Portal,
- insertImage,
- insertMention,
- insertNostrEvent,
- isImageUrl,
-} from "./utils";
-
-const withNostrEvent = (editor: ReactEditor) => {
- const { insertData, isVoid } = editor;
-
- editor.isVoid = (element) => {
- // @ts-expect-error, wtf
- return element.type === "event" ? true : isVoid(element);
- };
-
- editor.insertData = (data) => {
- const text = data.getData("text/plain");
-
- if (text.startsWith("nevent1") || text.startsWith("note1")) {
- insertNostrEvent(editor, text);
- } else {
- insertData(data);
- }
- };
-
- return editor;
-};
-
-const withMentions = (editor: ReactEditor) => {
- const { isInline, isVoid, markableVoid } = editor;
-
- editor.isInline = (element) => {
- // @ts-expect-error, wtf
- return element.type === "mention" ? true : isInline(element);
- };
-
- editor.isVoid = (element) => {
- // @ts-expect-error, wtf
- return element.type === "mention" ? true : isVoid(element);
- };
-
- editor.markableVoid = (element) => {
- // @ts-expect-error, wtf
- return element.type === "mention" || markableVoid(element);
- };
-
- return editor;
-};
-
-const withImages = (editor: ReactEditor) => {
- const { insertData, isVoid } = editor;
-
- editor.isVoid = (element) => {
- // @ts-expect-error, wtf
- return element.type === "image" ? true : isVoid(element);
- };
-
- editor.insertData = (data) => {
- const text = data.getData("text/plain");
-
- if (isImageUrl(text)) {
- insertImage(editor, text);
- } else {
- insertData(data);
- }
- };
-
- return editor;
-};
-
-const Image = ({ attributes, children, element }) => {
- const editor = useSlateStatic();
- const path = ReactEditor.findPath(editor as ReactEditor, element);
-
- const selected = useSelected();
- const focused = useFocused();
-
- return (
-
- {children}
-
-
-
Transforms.removeNodes(editor, { at: path })}
- className="absolute inline-flex items-center justify-center text-white bg-red-500 rounded-lg top-2 right-2 size-8 hover:bg-red-600"
- >
-
-
-
-
- );
-};
-
-const Mention = ({ attributes, element }) => {
- const editor = useSlateStatic();
- const path = ReactEditor.findPath(editor as ReactEditor, element);
-
- return (
- Transforms.removeNodes(editor, { at: path })}
- className="inline-block text-blue-500 align-baseline hover:text-blue-600"
- >{`@${element.name}`}
- );
-};
-
-const Event = ({ attributes, element, children }) => {
- const editor = useSlateStatic();
- const path = ReactEditor.findPath(editor as ReactEditor, element);
-
- return (
-
- {children}
- {/* biome-ignore lint/a11y/useKeyWithClickEvents:
*/}
- Transforms.removeNodes(editor, { at: path })}
- className="relative user-select-none my-2"
- >
-
-
-
- );
-};
-
-const Element = (props) => {
- const { attributes, children, element } = props;
-
- switch (element.type) {
- case "image":
- return ;
- case "mention":
- return ;
- case "event":
- return ;
- default:
- return (
-
- {children}
-
- );
- }
-};
-
-export function EditorForm() {
- const ark = useArk();
- const storage = useStorage();
- const ref = useRef();
-
- const [editorValue, setEditorValue] = useAtom(editorValueAtom);
- const [contacts, setContacts] = useState([]);
- const [target, setTarget] = useState();
- const [index, setIndex] = useState(0);
- const [search, setSearch] = useState("");
- const [loading, setLoading] = useState(false);
- const [editor] = useState(() =>
- withMentions(withNostrEvent(withImages(withReact(createEditor())))),
- );
-
- const { t } = useTranslation();
- const { addColumn } = useColumnContext();
-
- const filters = contacts
- ?.filter((c) => c?.name?.toLowerCase().startsWith(search.toLowerCase()))
- ?.slice(0, 10);
-
- const reset = () => {
- // @ts-expect-error, backlog
- editor.children = [{ type: "paragraph", children: [{ text: "" }] }];
- setEditorValue([{ type: "paragraph", children: [{ text: "" }] }]);
- };
-
- const serialize = (nodes: Descendant[]) => {
- return nodes
- .map((n) => {
- // @ts-expect-error, backlog
- if (n.type === "image") return n.url;
- // @ts-expect-error, backlog
- if (n.type === "event") return n.eventId;
-
- // @ts-expect-error, backlog
- if (n.children.length) {
- // @ts-expect-error, backlog
- return n.children
- .map((n) => {
- if (n.type === "mention") return n.npub;
- return Node.string(n).trim();
- })
- .join(" ");
- }
-
- return Node.string(n);
- })
- .join("\n");
- };
-
- const submit = async () => {
- try {
- setLoading(true);
-
- const event = new NDKEvent(ark.ndk);
- event.kind = NDKKind.Text;
- event.content = serialize(editor.children);
-
- const publish = await event.publish();
-
- if (publish) {
- toast.success(t("editor.successMessage"));
-
- // add current post as column thread
- addColumn({
- kind: COL_TYPES.thread,
- content: event.id,
- title: "Thread",
- });
-
- setLoading(false);
-
- return reset();
- }
- } catch (e) {
- setLoading(false);
- toast.error(String(e));
- }
- };
-
- useEffect(() => {
- async function loadContacts() {
- const res = await storage.getAllCacheUsers();
- if (res) setContacts(res);
- }
-
- loadContacts();
- }, []);
-
- useEffect(() => {
- if (target && filters.length > 0) {
- const el = ref.current;
- const domRange = ReactEditor.toDOMRange(editor, target);
- const rect = domRange.getBoundingClientRect();
- el.style.top = `${rect.top + window.pageYOffset + 24}px`;
- el.style.left = `${rect.left + window.pageXOffset}px`;
- }
- }, [filters.length, editor, index, search, target]);
-
- return (
-
-
{
- const { selection } = editor;
-
- if (selection && Range.isCollapsed(selection)) {
- const [start] = Range.edges(selection);
- const wordBefore = Editor.before(editor, start, { unit: "word" });
- const before = wordBefore && Editor.before(editor, wordBefore);
- const beforeRange = before && Editor.range(editor, before, start);
- const beforeText =
- beforeRange && Editor.string(editor, beforeRange);
- const beforeMatch = beforeText?.match(/^@(\w+)$/);
- const after = Editor.after(editor, start);
- const afterRange = Editor.range(editor, start, after);
- const afterText = Editor.string(editor, afterRange);
- const afterMatch = afterText.match(/^(\s|$)/);
-
- if (beforeMatch && afterMatch) {
- setTarget(beforeRange);
- setSearch(beforeMatch[1]);
- setIndex(0);
- return;
- }
- }
-
- setTarget(null);
- }}
- >
-
-
-
{t("editor.title")}
-
-
-
-
-
-
-
- {loading ? (
-
- ) : (
- t("global.post")
- )}
-
-
-
-
-
}
- placeholder={t("editor.placeholder")}
- className="focus:outline-none"
- />
- {target && filters.length > 0 && (
-
-
- {filters.map((contact, i) => (
-
{
- Transforms.select(editor, target);
- insertMention(editor, contact);
- setTarget(null);
- }}
- className="p-2 flex flex-col w-full rounded-lg hover:bg-neutral-100 dark:hover:bg-neutral-900"
- >
-
-
-
-
-
-
-
-
-
- ))}
-
-
- )}
-
-
-
- );
-}
diff --git a/packages/ui/src/editor/replyForm.tsx b/packages/ui/src/editor/replyForm.tsx
deleted file mode 100644
index 274ae395..00000000
--- a/packages/ui/src/editor/replyForm.tsx
+++ /dev/null
@@ -1,398 +0,0 @@
-import { MentionNote, User, useArk } from "@lume/ark";
-import { LoaderIcon, TrashIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { NDKCacheUserProfile } from "@lume/types";
-import { cn } from "@lume/utils";
-import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
-import { Portal } from "@radix-ui/react-dropdown-menu";
-import { useEffect, useRef, useState } from "react";
-import { useTranslation } from "react-i18next";
-import {
- Descendant,
- Editor,
- Node,
- Range,
- Transforms,
- createEditor,
-} from "slate";
-import {
- Editable,
- ReactEditor,
- Slate,
- useFocused,
- useSelected,
- useSlateStatic,
- withReact,
-} from "slate-react";
-import { toast } from "sonner";
-import { EditorAddMedia } from "./addMedia";
-import {
- insertImage,
- insertMention,
- insertNostrEvent,
- isImageUrl,
-} from "./utils";
-
-const withNostrEvent = (editor: ReactEditor) => {
- const { insertData, isVoid } = editor;
-
- editor.isVoid = (element) => {
- // @ts-expect-error, wtf
- return element.type === "event" ? true : isVoid(element);
- };
-
- editor.insertData = (data) => {
- const text = data.getData("text/plain");
-
- if (text.startsWith("nevent1") || text.startsWith("note1")) {
- insertNostrEvent(editor, text);
- } else {
- insertData(data);
- }
- };
-
- return editor;
-};
-
-const withMentions = (editor: ReactEditor) => {
- const { isInline, isVoid, markableVoid } = editor;
-
- editor.isInline = (element) => {
- // @ts-expect-error, wtf
- return element.type === "mention" ? true : isInline(element);
- };
-
- editor.isVoid = (element) => {
- // @ts-expect-error, wtf
- return element.type === "mention" ? true : isVoid(element);
- };
-
- editor.markableVoid = (element) => {
- // @ts-expect-error, wtf
- return element.type === "mention" || markableVoid(element);
- };
-
- return editor;
-};
-
-const withImages = (editor: ReactEditor) => {
- const { insertData, isVoid } = editor;
-
- editor.isVoid = (element) => {
- // @ts-expect-error, wtf
- return element.type === "image" ? true : isVoid(element);
- };
-
- editor.insertData = (data) => {
- const text = data.getData("text/plain");
-
- if (isImageUrl(text)) {
- insertImage(editor, text);
- } else {
- insertData(data);
- }
- };
-
- return editor;
-};
-
-const Image = ({ attributes, children, element }) => {
- const editor = useSlateStatic();
- const path = ReactEditor.findPath(editor as ReactEditor, element);
-
- const selected = useSelected();
- const focused = useFocused();
-
- return (
-
- {children}
-
-
-
Transforms.removeNodes(editor, { at: path })}
- className="absolute inline-flex items-center justify-center text-white bg-red-500 rounded-lg top-2 right-2 size-8 hover:bg-red-600"
- >
-
-
-
-
- );
-};
-
-const Mention = ({ attributes, element }) => {
- const editor = useSlateStatic();
- const path = ReactEditor.findPath(editor as ReactEditor, element);
-
- return (
- Transforms.removeNodes(editor, { at: path })}
- className="inline-block text-blue-500 align-baseline hover:text-blue-600"
- >{`@${element.name}`}
- );
-};
-
-const Event = ({ attributes, element, children }) => {
- const editor = useSlateStatic();
- const path = ReactEditor.findPath(editor as ReactEditor, element);
-
- return (
-
- {children}
- {/* biome-ignore lint/a11y/useKeyWithClickEvents:
*/}
- Transforms.removeNodes(editor, { at: path })}
- className="relative user-select-none"
- >
-
-
-
- );
-};
-
-const Element = (props) => {
- const { attributes, children, element } = props;
-
- switch (element.type) {
- case "image":
- return ;
- case "mention":
- return ;
- case "event":
- return ;
- default:
- return (
-
- {children}
-
- );
- }
-};
-
-export function ReplyForm({
- eventId,
- className,
-}: { eventId: string; className?: string }) {
- const ark = useArk();
- const storage = useStorage();
- const ref = useRef();
-
- const [editorValue, setEditorValue] = useState([
- {
- type: "paragraph",
- children: [{ text: "" }],
- },
- ]);
- const [contacts, setContacts] = useState([]);
- const [target, setTarget] = useState();
- const [index, setIndex] = useState(0);
- const [search, setSearch] = useState("");
- const [loading, setLoading] = useState(false);
- const [editor] = useState(() =>
- withMentions(withNostrEvent(withImages(withReact(createEditor())))),
- );
-
- const { t } = useTranslation();
-
- const filters = contacts
- ?.filter((c) => c?.name?.toLowerCase().startsWith(search.toLowerCase()))
- ?.slice(0, 10);
-
- const reset = () => {
- // @ts-expect-error, backlog
- editor.children = [{ type: "paragraph", children: [{ text: "" }] }];
- setEditorValue([{ type: "paragraph", children: [{ text: "" }] }]);
- };
-
- const serialize = (nodes: Descendant[]) => {
- return nodes
- .map((n) => {
- // @ts-expect-error, backlog
- if (n.type === "image") return n.url;
- // @ts-expect-error, backlog
- if (n.type === "event") return n.eventId;
-
- // @ts-expect-error, backlog
- if (n.children.length) {
- // @ts-expect-error, backlog
- return n.children
- .map((n) => {
- if (n.type === "mention") return n.npub;
- return Node.string(n).trim();
- })
- .join(" ");
- }
-
- return Node.string(n);
- })
- .join("\n");
- };
-
- const submit = async () => {
- try {
- setLoading(true);
-
- const event = new NDKEvent(ark.ndk);
- event.kind = NDKKind.Text;
- event.content = serialize(editor.children);
-
- const rootEvent = await ark.getEventById(eventId);
- event.tag(rootEvent, "root");
-
- const publish = await event.publish();
-
- if (publish) {
- toast.success(
- `Event has been published successfully to ${publish.size} relays.`,
- );
-
- setLoading(false);
-
- return reset();
- }
- } catch (e) {
- setLoading(false);
- toast.error(String(e));
- }
- };
-
- useEffect(() => {
- async function loadContacts() {
- const res = await storage.getAllCacheUsers();
- if (res) setContacts(res);
- }
-
- loadContacts();
- }, []);
-
- useEffect(() => {
- if (target && filters.length > 0) {
- const el = ref.current;
- const domRange = ReactEditor.toDOMRange(editor, target);
- const rect = domRange.getBoundingClientRect();
- el.style.top = `${rect.top + window.pageYOffset + 24}px`;
- el.style.left = `${rect.left + window.pageXOffset}px`;
- }
- }, [filters.length, editor, index, search, target]);
-
- return (
-
-
-
-
-
-
-
-
{
- const { selection } = editor;
-
- if (selection && Range.isCollapsed(selection)) {
- const [start] = Range.edges(selection);
- const wordBefore = Editor.before(editor, start, { unit: "word" });
- const before = wordBefore && Editor.before(editor, wordBefore);
- const beforeRange = before && Editor.range(editor, before, start);
- const beforeText =
- beforeRange && Editor.string(editor, beforeRange);
- const beforeMatch = beforeText?.match(/^@(\w+)$/);
- const after = Editor.after(editor, start);
- const afterRange = Editor.range(editor, start, after);
- const afterText = Editor.string(editor, afterRange);
- const afterMatch = afterText.match(/^(\s|$)/);
-
- if (beforeMatch && afterMatch) {
- setTarget(beforeRange);
- setSearch(beforeMatch[1]);
- setIndex(0);
- return;
- }
- }
-
- setTarget(null);
- }}
- >
-
-
}
- placeholder={t("editor.replyPlaceholder")}
- className="focus:outline-none h-28"
- />
- {target && filters.length > 0 && (
-
-
- {filters.map((contact, i) => (
- // biome-ignore lint/a11y/useKeyWithClickEvents:
- {
- Transforms.select(editor, target);
- insertMention(editor, contact);
- setTarget(null);
- }}
- className="px-2 py-2 rounded-md hover:bg-neutral-100 dark:hover:bg-neutral-900"
- >
-
-
-
-
-
-
-
-
-
- ))}
-
-
- )}
-
-
-
-
-
-
-
-
-
- {loading ? (
-
- ) : (
- t("global.post")
- )}
-
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/emptyFeed.tsx b/packages/ui/src/emptyFeed.tsx
index 58a8a87a..60479726 100644
--- a/packages/ui/src/emptyFeed.tsx
+++ b/packages/ui/src/emptyFeed.tsx
@@ -3,28 +3,32 @@ import { cn } from "@lume/utils";
import { useTranslation } from "react-i18next";
export function EmptyFeed({
- text,
- subtext,
- className,
-}: { text?: string; subtext?: string; className?: string }) {
- const { t } = useTranslation();
+ text,
+ subtext,
+ className,
+}: {
+ text?: string;
+ subtext?: string;
+ className?: string;
+}) {
+ const { t } = useTranslation();
- return (
-
-
-
-
- {text ? text : t("global.emptyFeedTitle")}
-
-
- {subtext ? subtext : t("global.emptyFeedSubtitle")}
-
-
-
- );
+ return (
+
+
+
+
+ {text ? text : t("global.emptyFeedTitle")}
+
+
+ {subtext ? subtext : t("global.emptyFeedSubtitle")}
+
+
+
+ );
}
diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts
index fefe25a3..8c409699 100644
--- a/packages/ui/src/index.ts
+++ b/packages/ui/src/index.ts
@@ -1,16 +1,8 @@
-export * from "./account/active";
-export * from "./account/logout";
-export * from "./navigation";
-export * from "./titlebar";
-export * from "./layouts/app";
-export * from "./layouts/auth";
-export * from "./layouts/home";
-export * from "./layouts/settings";
-export * from "./mentions";
-export * from "./replyList";
-export * from "./emptyFeed";
-export * from "./routes/event";
-export * from "./routes/user";
-export * from "./routes/suggest";
-export * from "./translateRegisterModal";
export * from "./user";
+export * from "./note";
+export * from "./column";
+export * from "./emptyFeed";
+
+// UI
+export * from "./container";
+export * from "./box";
diff --git a/packages/ui/src/layouts/app.tsx b/packages/ui/src/layouts/app.tsx
deleted file mode 100644
index 3c099cb5..00000000
--- a/packages/ui/src/layouts/app.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { cn } from "@lume/utils";
-import { type Platform } from "@tauri-apps/plugin-os";
-import { Outlet } from "react-router-dom";
-import { Editor } from "../editor/column";
-import { Navigation } from "../navigation";
-import { SearchDialog } from "../search/dialog";
-import { WindowTitleBar } from "../titlebar";
-
-export function AppLayout({ platform }: { platform: Platform }) {
- return (
-
- {platform === "windows" ? (
-
- ) : (
-
- )}
-
-
- );
-}
diff --git a/packages/ui/src/layouts/auth.tsx b/packages/ui/src/layouts/auth.tsx
deleted file mode 100644
index e262f96f..00000000
--- a/packages/ui/src/layouts/auth.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { ArrowLeftIcon, SettingsIcon } from "@lume/icons";
-import { type Platform } from "@tauri-apps/plugin-os";
-import { Outlet, useLocation, useNavigate } from "react-router-dom";
-import { WindowTitleBar } from "../titlebar";
-
-export function AuthLayout({ platform }: { platform: Platform }) {
- const location = useLocation();
- const navigate = useNavigate();
-
- const canGoBack = location.pathname.length > 6;
-
- return (
-
- {platform === "windows" ? (
-
- ) : (
-
- )}
-
-
- {canGoBack ? (
-
navigate(-1)}
- className="inline-flex items-center justify-center rounded-lg size-10 group"
- >
-
-
- ) : (
-
- )}
-
-
-
-
- );
-}
diff --git a/packages/ui/src/layouts/home.tsx b/packages/ui/src/layouts/home.tsx
deleted file mode 100644
index bdab9273..00000000
--- a/packages/ui/src/layouts/home.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Outlet } from "react-router-dom";
-import { OnboardingModal } from "../onboarding/modal";
-
-export function HomeLayout() {
- return (
- <>
-
-
-
-
- >
- );
-}
diff --git a/packages/ui/src/layouts/settings.tsx b/packages/ui/src/layouts/settings.tsx
deleted file mode 100644
index 2c72e3d5..00000000
--- a/packages/ui/src/layouts/settings.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-import {
- AdvancedSettingsIcon,
- InfoIcon,
- SecureIcon,
- SettingsIcon,
- UserIcon,
- ZapIcon,
-} from "@lume/icons";
-import { cn } from "@lume/utils";
-import { useTranslation } from "react-i18next";
-import { NavLink, Outlet } from "react-router-dom";
-
-export function SettingsLayout() {
- const { t } = useTranslation();
-
- return (
-
-
-
-
- cn(
- "flex w-20 shrink-0 flex-col gap-1 items-center justify-center rounded-lg px-2 py-2 text-neutral-700 hover:bg-neutral-100 dark:text-neutral-300 dark:hover:bg-neutral-900",
- isActive
- ? "bg-black/10 dark:bg-white/10 text-blue-500 hover:bg-black/20 dark:hover:bg-white/20"
- : "",
- )
- }
- >
-
- {t("settings.general.title")}
-
-
- cn(
- "flex w-20 shrink-0 flex-col gap-1 items-center justify-center rounded-lg px-2 py-2 text-neutral-700 hover:bg-black/10 dark:text-neutral-300 dark:hover:bg-white/10",
- isActive
- ? "bg-black/10 dark:bg-white/10 text-blue-500 hover:bg-black/20 dark:hover:bg-white/20"
- : "",
- )
- }
- >
-
- {t("settings.user.title")}
-
-
- cn(
- "flex w-20 shrink-0 flex-col gap-1 items-center justify-center rounded-lg px-2 py-2 text-neutral-700 hover:bg-black/10 dark:text-neutral-300 dark:hover:bg-white/10",
- isActive
- ? "bg-black/10 dark:bg-white/10 text-blue-500 hover:bg-black/20 dark:hover:bg-white/20"
- : "",
- )
- }
- >
-
- {t("settings.zap.title")}
-
-
- cn(
- "flex w-20 shrink-0 flex-col gap-1 items-center justify-center rounded-lg px-2 py-2 text-neutral-700 hover:bg-black/10 dark:text-neutral-300 dark:hover:bg-white/10",
- isActive
- ? "bg-black/10 dark:bg-white/10 text-blue-500 hover:bg-black/20 dark:hover:bg-white/20"
- : "",
- )
- }
- >
-
- {t("settings.backup.title")}
-
-
- cn(
- "flex w-20 shrink-0 flex-col gap-1 items-center justify-center rounded-lg px-2 py-2 text-neutral-700 hover:bg-black/10 dark:text-neutral-300 dark:hover:bg-white/10",
- isActive
- ? "bg-black/10 dark:bg-white/10 text-blue-500 hover:bg-black/20 dark:hover:bg-white/20"
- : "",
- )
- }
- >
-
-
- {t("settings.advanced.title")}
-
-
-
- cn(
- "flex w-20 shrink-0 flex-col gap-1 items-center justify-center rounded-lg px-2 py-2 text-neutral-700 hover:bg-black/10 dark:text-neutral-300 dark:hover:bg-white/10",
- isActive
- ? "bg-black/10 dark:bg-white/10 text-blue-500 hover:bg-black/20 dark:hover:bg-white/20"
- : "",
- )
- }
- >
-
- {t("settings.about.title")}
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/mentions.tsx b/packages/ui/src/mentions.tsx
deleted file mode 100644
index b217c3f9..00000000
--- a/packages/ui/src/mentions.tsx
+++ /dev/null
@@ -1,120 +0,0 @@
-import * as Avatar from "@radix-ui/react-avatar";
-import { minidenticon } from "minidenticons";
-import {
- Ref,
- forwardRef,
- useEffect,
- useImperativeHandle,
- useState,
-} from "react";
-
-import { NDKCacheUserProfile } from "@lume/types";
-import { cn } from "@lume/utils";
-import { useTranslation } from "react-i18next";
-
-type MentionListRef = {
- onKeyDown: (props: { event: Event }) => boolean;
-};
-
-const List = (
- props: {
- items: NDKCacheUserProfile[];
- command: (arg0: { id: string }) => void;
- },
- ref: Ref,
-) => {
- const [t] = useTranslation();
- const [selectedIndex, setSelectedIndex] = useState(0);
-
- const selectItem = (index) => {
- const item = props.items[index];
- if (item) {
- props.command({ id: item.pubkey });
- }
- };
-
- const upHandler = () => {
- setSelectedIndex(
- (selectedIndex + props.items.length - 1) % props.items.length,
- );
- };
-
- const downHandler = () => {
- setSelectedIndex((selectedIndex + 1) % props.items.length);
- };
-
- const enterHandler = () => {
- selectItem(selectedIndex);
- };
-
- useEffect(() => setSelectedIndex(0), [props.items]);
-
- useImperativeHandle(ref, () => ({
- onKeyDown: ({ event }) => {
- if (event.key === "ArrowUp") {
- upHandler();
- return true;
- }
-
- if (event.key === "ArrowDown") {
- downHandler();
- return true;
- }
-
- if (event.key === "Enter") {
- enterHandler();
- return true;
- }
-
- return false;
- },
- }));
-
- return (
-
- {props.items.length ? (
- props.items.map((item, index) => (
-
selectItem(index)}
- className={cn(
- "inline-flex h-11 items-center gap-2 rounded-md px-2",
- index === selectedIndex
- ? "bg-neutral-100 dark:bg-neutral-900"
- : "",
- )}
- >
-
-
-
-
-
-
-
- {item.name}
-
-
- ))
- ) : (
-
- {t("global.noResult")}
-
- )}
-
- );
-};
-
-export const MentionList = forwardRef(List);
diff --git a/packages/ui/src/navigation.tsx b/packages/ui/src/navigation.tsx
deleted file mode 100644
index 5367ec80..00000000
--- a/packages/ui/src/navigation.tsx
+++ /dev/null
@@ -1,208 +0,0 @@
-import {
- ArrowUpSquareIcon,
- BellFilledIcon,
- BellIcon,
- DepotFilledIcon,
- DepotIcon,
- HomeFilledIcon,
- HomeIcon,
- PlusIcon,
- SearchFilledIcon,
- SearchIcon,
- SettingsFilledIcon,
- SettingsIcon,
-} from "@lume/icons";
-import { cn, editorAtom, searchAtom } from "@lume/utils";
-import { confirm } from "@tauri-apps/plugin-dialog";
-import { relaunch } from "@tauri-apps/plugin-process";
-import { Update, check } from "@tauri-apps/plugin-updater";
-import { useAtom } from "jotai";
-import { useEffect, useState } from "react";
-import { useHotkeys } from "react-hotkeys-hook";
-import { NavLink } from "react-router-dom";
-import { ActiveAccount } from "./account/active";
-import { UnreadActivity } from "./unread";
-
-export function Navigation() {
- const [isEditorOpen, setIsEditorOpen] = useAtom(editorAtom);
- const [search, setSearch] = useAtom(searchAtom);
- const [update, setUpdate] = useState(null);
-
- // shortcut for editor
- useHotkeys("meta+n", () => setIsEditorOpen((state) => !state), []);
-
- const installNewUpdate = async () => {
- if (!update) return;
-
- const yes = await confirm(update.body, {
- title: `v${update.version} is available`,
- type: "info",
- });
-
- if (yes) {
- await update.downloadAndInstall();
- await relaunch();
- }
- };
-
- useEffect(() => {
- async function checkNewUpdate() {
- const newVersion = await check();
- setUpdate(newVersion);
- }
- checkNewUpdate();
- }, []);
-
- return (
-
-
-
-
-
setIsEditorOpen((state) => !state)}
- className={cn(
- "flex items-center justify-center h-auto w-full text-black aspect-square rounded-xl hover:text-white dark:text-white",
- isEditorOpen
- ? "bg-blue-500 text-white"
- : "bg-black/5 hover:bg-blue-500 dark:bg-white/5 dark:hover:bg-blue-500",
- )}
- >
-
-
-
-
-
-
- {({ isActive }) => (
-
- {isActive ? (
-
- ) : (
-
- )}
-
- )}
-
-
- {({ isActive }) => (
-
- {isActive ? (
-
- ) : (
-
- )}
-
-
- )}
-
-
- {({ isActive }) => (
-
- {isActive ? (
-
- ) : (
-
- )}
-
- )}
-
-
-
-
- {update ? (
-
-
- Update
-
-
-
- ) : null}
-
setSearch((open) => !open)}
- className="inline-flex flex-col items-center justify-center"
- >
-
- {search ? (
-
- ) : (
-
- )}
-
-
-
- {({ isActive }) => (
-
- {isActive ? (
-
- ) : (
-
- )}
-
- )}
-
-
-
- );
-}
diff --git a/packages/ui/src/note/appHandler.tsx b/packages/ui/src/note/appHandler.tsx
new file mode 100644
index 00000000..eb6105fb
--- /dev/null
+++ b/packages/ui/src/note/appHandler.tsx
@@ -0,0 +1,53 @@
+import { useArk } from "@lume/ark";
+import { useQuery } from "@tanstack/react-query";
+
+export function AppHandler({ tag }: { tag: string[] }) {
+ const ark = useArk();
+
+ const { isLoading, isError, data } = useQuery({
+ queryKey: ["app-handler", tag[1]],
+ queryFn: async () => {
+ const ref = tag[1].split(":");
+ const event = await ark.getEventByFilter({
+ filter: {
+ kinds: [Number(ref[0])],
+ authors: [ref[1]],
+ "#d": [ref[2]],
+ },
+ });
+
+ if (!event) return null;
+
+ const app = NDKAppHandlerEvent.from(event);
+ return await app.fetchProfile();
+ },
+ refetchOnWindowFocus: false,
+ });
+
+ if (isLoading) {
+ Loading...
;
+ }
+
+ if (isError || !data) {
+ return Error
;
+ }
+
+ return (
+
+
+
+
+ {data.name}
+
+
+ {data.about}
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/buttons/downvote.tsx b/packages/ui/src/note/buttons/downvote.tsx
new file mode 100644
index 00000000..439790ea
--- /dev/null
+++ b/packages/ui/src/note/buttons/downvote.tsx
@@ -0,0 +1,59 @@
+import { ArrowDownIcon, ArrowUpIcon, LoaderIcon } from "@lume/icons";
+import { useState } from "react";
+import { useNoteContext } from "../provider";
+import { useArk } from "@lume/ark";
+import { cn } from "@lume/utils";
+import * as Tooltip from "@radix-ui/react-tooltip";
+import { useTranslation } from "react-i18next";
+
+export function NoteDownvote() {
+ const ark = useArk();
+ const event = useNoteContext();
+
+ const [t] = useTranslation();
+ const [reaction, setReaction] = useState<"-" | null>(null);
+ const [loading, setLoading] = useState(false);
+
+ const down = async () => {
+ // start loading
+ setLoading(true);
+
+ const res = await ark.downvote(event.id, event.pubkey);
+ if (res) setReaction("-");
+
+ // stop loading
+ setLoading(false);
+ };
+
+ return (
+
+
+
+
+ {loading ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {t("note.buttons.downvote")}
+
+
+
+
+
+ );
+}
diff --git a/packages/ark/src/components/note/buttons/pin.tsx b/packages/ui/src/note/buttons/pin.tsx
similarity index 82%
rename from packages/ark/src/components/note/buttons/pin.tsx
rename to packages/ui/src/note/buttons/pin.tsx
index 6125f4e3..cc1bc9a7 100644
--- a/packages/ark/src/components/note/buttons/pin.tsx
+++ b/packages/ui/src/note/buttons/pin.tsx
@@ -1,15 +1,11 @@
import { PinIcon } from "@lume/icons";
-import { COL_TYPES } from "@lume/utils";
import * as Tooltip from "@radix-ui/react-tooltip";
import { useTranslation } from "react-i18next";
-import { useColumnContext } from "../../column/provider";
import { useNoteContext } from "../provider";
export function NotePin() {
const event = useNoteContext();
-
const { t } = useTranslation();
- const { addColumn } = useColumnContext();
return (
@@ -17,13 +13,6 @@ export function NotePin() {
- await addColumn({
- kind: COL_TYPES.thread,
- title: "Thread",
- content: event.id,
- })
- }
className="inline-flex items-center justify-center gap-2 pl-2 pr-3 text-sm font-medium rounded-full h-7 w-max bg-neutral-100 hover:bg-neutral-200 dark:hover:bg-neutral-800 dark:bg-neutral-900"
>
diff --git a/packages/ui/src/note/buttons/reaction.tsx b/packages/ui/src/note/buttons/reaction.tsx
new file mode 100644
index 00000000..431d8de6
--- /dev/null
+++ b/packages/ui/src/note/buttons/reaction.tsx
@@ -0,0 +1,11 @@
+import { NoteUpvote } from "./upvote";
+import { NoteDownvote } from "./downvote";
+
+export function NoteReaction() {
+ return (
+
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/buttons/reply.tsx b/packages/ui/src/note/buttons/reply.tsx
new file mode 100644
index 00000000..b9948f0a
--- /dev/null
+++ b/packages/ui/src/note/buttons/reply.tsx
@@ -0,0 +1,63 @@
+import { LinkIcon, ReplyIcon } from "@lume/icons";
+import * as Tooltip from "@radix-ui/react-tooltip";
+import { useTranslation } from "react-i18next";
+import { useNoteContext } from "../provider";
+import { useArk } from "@lume/ark";
+import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
+
+export function NoteReply() {
+ const ark = useArk();
+ const event = useNoteContext();
+
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ {t("note.menu.viewThread")}
+
+
+
+
+
+
+
+
+ ark.open_thread(event.id)}
+ className="inline-flex h-9 items-center gap-2 rounded-lg px-3 text-sm font-medium text-white hover:bg-neutral-900 focus:outline-none dark:text-black dark:hover:bg-neutral-100"
+ >
+
+ {t("note.buttons.open")}
+
+
+
+ ark.open_editor(event.id)}
+ className="inline-flex h-9 items-center gap-2 rounded-lg px-3 text-sm font-medium text-white hover:bg-neutral-900 focus:outline-none dark:text-black dark:hover:bg-neutral-100"
+ >
+
+ {t("note.buttons.reply")}
+
+
+
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/buttons/repost.tsx b/packages/ui/src/note/buttons/repost.tsx
new file mode 100644
index 00000000..544242cf
--- /dev/null
+++ b/packages/ui/src/note/buttons/repost.tsx
@@ -0,0 +1,96 @@
+import { LoaderIcon, ReplyIcon, RepostIcon } from "@lume/icons";
+import { cn } from "@lume/utils";
+import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
+import * as Tooltip from "@radix-ui/react-tooltip";
+import { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { toast } from "sonner";
+import { useNoteContext } from "../provider";
+import { useArk } from "@lume/ark";
+
+export function NoteRepost() {
+ const ark = useArk();
+ const event = useNoteContext();
+
+ const [t] = useTranslation();
+ const [loading, setLoading] = useState(false);
+ const [isRepost, setIsRepost] = useState(false);
+
+ const repost = async () => {
+ try {
+ setLoading(true);
+
+ // repost
+ await ark.repost(event.id, event.pubkey);
+
+ // update state
+ setLoading(false);
+ setIsRepost(true);
+
+ // notify
+ toast.success("You've reposted this post successfully");
+ } catch (e) {
+ setLoading(false);
+ toast.error("Repost failed, try again later");
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ {loading ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+ {t("note.buttons.repost")}
+
+
+
+
+
+
+
+
+
+
+ {t("note.buttons.repost")}
+
+
+
+ ark.open_editor(event.id, true)}
+ className="inline-flex h-9 items-center gap-2 rounded-lg px-3 text-sm font-medium text-white hover:bg-neutral-900 focus:outline-none dark:text-black dark:hover:bg-neutral-100"
+ >
+
+ {t("note.buttons.quote")}
+
+
+
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/buttons/upvote.tsx b/packages/ui/src/note/buttons/upvote.tsx
new file mode 100644
index 00000000..2aaf6184
--- /dev/null
+++ b/packages/ui/src/note/buttons/upvote.tsx
@@ -0,0 +1,59 @@
+import { ArrowUpIcon, LoaderIcon } from "@lume/icons";
+import { useState } from "react";
+import { useNoteContext } from "../provider";
+import { useArk } from "@lume/ark";
+import { cn } from "@lume/utils";
+import * as Tooltip from "@radix-ui/react-tooltip";
+import { useTranslation } from "react-i18next";
+
+export function NoteUpvote() {
+ const ark = useArk();
+ const event = useNoteContext();
+
+ const [t] = useTranslation();
+ const [reaction, setReaction] = useState<"+" | null>(null);
+ const [loading, setLoading] = useState(false);
+
+ const up = async () => {
+ // start loading
+ setLoading(true);
+
+ const res = await ark.upvote(event.id, event.pubkey);
+ if (res) setReaction("+");
+
+ // stop loading
+ setLoading(false);
+ };
+
+ return (
+
+
+
+
+ {loading ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {t("note.buttons.upvote")}
+
+
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/buttons/zap.tsx b/packages/ui/src/note/buttons/zap.tsx
new file mode 100644
index 00000000..3d00d580
--- /dev/null
+++ b/packages/ui/src/note/buttons/zap.tsx
@@ -0,0 +1,12 @@
+import { ZapIcon } from "@lume/icons";
+
+export function NoteZap() {
+ return (
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/child.tsx b/packages/ui/src/note/child.tsx
new file mode 100644
index 00000000..04980630
--- /dev/null
+++ b/packages/ui/src/note/child.tsx
@@ -0,0 +1,122 @@
+import { NOSTR_MENTIONS } from "@lume/utils";
+import { nanoid } from "nanoid";
+import { ReactNode, useMemo } from "react";
+import { useTranslation } from "react-i18next";
+import reactStringReplace from "react-string-replace";
+import { User } from "../user";
+import { Hashtag } from "./mentions/hashtag";
+import { MentionUser } from "./mentions/user";
+import { useEvent } from "@lume/ark";
+
+export function NoteChild({
+ eventId,
+ isRoot,
+}: {
+ eventId: string;
+ isRoot?: boolean;
+}) {
+ const { t } = useTranslation();
+ const { isLoading, isError, data } = useEvent(eventId);
+
+ const richContent = useMemo(() => {
+ if (!data) return "";
+
+ let parsedContent: string | ReactNode[] =
+ data.content.substring(0, 160) + "...";
+
+ const text = data.content;
+ const words = text.split(/( |\n)/);
+
+ const hashtags = words.filter((word) => word.startsWith("#"));
+ const mentions = words.filter((word) =>
+ NOSTR_MENTIONS.some((el) => word.startsWith(el)),
+ );
+
+ try {
+ if (hashtags.length) {
+ for (const hashtag of hashtags) {
+ const regex = new RegExp(`(|^)${hashtag}\\b`, "g");
+ parsedContent = reactStringReplace(parsedContent, regex, () => {
+ return ;
+ });
+ }
+ }
+
+ if (mentions.length) {
+ for (const mention of mentions) {
+ parsedContent = reactStringReplace(
+ parsedContent,
+ mention,
+ (match, i) => ,
+ );
+ }
+ }
+
+ parsedContent = reactStringReplace(
+ parsedContent,
+ /(https?:\/\/\S+)/g,
+ (match, i) => {
+ const url = new URL(match);
+ return (
+
+ {url.toString()}
+
+ );
+ },
+ );
+
+ return parsedContent;
+ } catch (e) {
+ console.log(e);
+ return parsedContent;
+ }
+ }, [data]);
+
+ if (isLoading) {
+ return (
+
+ );
+ }
+
+ if (isError || !data) {
+ return (
+
+
+ {t("note.error")}
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+ {" "}
+
+ {isRoot ? t("note.posted") : t("note.replied")}:
+
+
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/content.tsx b/packages/ui/src/note/content.tsx
new file mode 100644
index 00000000..8cdd3375
--- /dev/null
+++ b/packages/ui/src/note/content.tsx
@@ -0,0 +1,136 @@
+import { Kind } from "@lume/types";
+import {
+ AUDIOS,
+ IMAGES,
+ NOSTR_EVENTS,
+ NOSTR_MENTIONS,
+ VIDEOS,
+ canPreview,
+ cn,
+} from "@lume/utils";
+import { NIP89 } from "./nip89";
+import { useNoteContext } from "./provider";
+import { ReactNode, useMemo } from "react";
+import reactStringReplace from "react-string-replace";
+import { nanoid } from "nanoid";
+import { MentionUser } from "./mentions/user";
+import { MentionNote } from "./mentions/note";
+import { Hashtag } from "./mentions/hashtag";
+import { VideoPreview } from "./preview/video";
+import { stripHtml } from "string-strip-html";
+import getUrl from "get-urls";
+import { ImagePreview } from "./preview/image";
+
+export function NoteContent({ className }: { className?: string }) {
+ const event = useNoteContext();
+ const content = useMemo(() => {
+ const text = stripHtml(event.content.trim()).result;
+ const words = text.split(/( |\n)/);
+ const urls = [...getUrl(text)];
+
+ // @ts-ignore, kaboom !!!
+ let parsedContent: ReactNode[] = text;
+
+ const hashtags = words.filter((word) => word.startsWith("#"));
+ const events = words.filter((word) =>
+ NOSTR_EVENTS.some((el) => word.startsWith(el)),
+ );
+ const mentions = words.filter((word) =>
+ NOSTR_MENTIONS.some((el) => word.startsWith(el)),
+ );
+
+ try {
+ if (hashtags.length) {
+ for (const hashtag of hashtags) {
+ const regex = new RegExp(`(|^)${hashtag}\\b`, "g");
+ parsedContent = reactStringReplace(parsedContent, regex, () => {
+ return ;
+ });
+ }
+ }
+
+ if (events.length) {
+ for (const event of events) {
+ parsedContent = reactStringReplace(
+ parsedContent,
+ event,
+ (match, i) => ,
+ );
+ }
+ }
+
+ if (mentions.length) {
+ for (const mention of mentions) {
+ parsedContent = reactStringReplace(
+ parsedContent,
+ mention,
+ (match, i) => ,
+ );
+ }
+ }
+
+ parsedContent = reactStringReplace(
+ parsedContent,
+ /(https?:\/\/\S+)/gi,
+ (match, i) => {
+ try {
+ const url = new URL(match);
+ const ext = url.pathname.split(".")[1];
+
+ if (IMAGES.includes(ext)) {
+ return ;
+ }
+
+ if (VIDEOS.includes(ext)) {
+ return ;
+ }
+
+ if (AUDIOS.includes(ext)) {
+ return ;
+ }
+
+ return (
+
+ {match}
+
+ );
+ } catch {
+ return (
+
+ {match}
+
+ );
+ }
+ },
+ );
+
+ return parsedContent;
+ } catch (e) {
+ return text;
+ }
+ }, []);
+
+ if (event.kind !== Kind.Text) {
+ return ;
+ }
+
+ return (
+
+ );
+}
diff --git a/packages/ark/src/components/note/index.ts b/packages/ui/src/note/index.ts
similarity index 100%
rename from packages/ark/src/components/note/index.ts
rename to packages/ui/src/note/index.ts
diff --git a/packages/ui/src/note/mentions/hashtag.tsx b/packages/ui/src/note/mentions/hashtag.tsx
new file mode 100644
index 00000000..e27489fe
--- /dev/null
+++ b/packages/ui/src/note/mentions/hashtag.tsx
@@ -0,0 +1,10 @@
+export function Hashtag({ tag }: { tag: string }) {
+ return (
+
+ {tag}
+
+ );
+}
diff --git a/packages/ark/src/components/note/mentions/invoice.tsx b/packages/ui/src/note/mentions/invoice.tsx
similarity index 100%
rename from packages/ark/src/components/note/mentions/invoice.tsx
rename to packages/ui/src/note/mentions/invoice.tsx
diff --git a/packages/ui/src/note/mentions/note.tsx b/packages/ui/src/note/mentions/note.tsx
new file mode 100644
index 00000000..7f149f55
--- /dev/null
+++ b/packages/ui/src/note/mentions/note.tsx
@@ -0,0 +1,141 @@
+import { NOSTR_MENTIONS } from "@lume/utils";
+import { ReactNode, useMemo } from "react";
+import { useTranslation } from "react-i18next";
+import reactStringReplace from "react-string-replace";
+import { User } from "../../user";
+import { Hashtag } from "./hashtag";
+import { MentionUser } from "./user";
+import { useArk, useEvent } from "@lume/ark";
+import { LinkIcon } from "@lume/icons";
+import { stripHtml } from "string-strip-html";
+
+export function MentionNote({
+ eventId,
+ openable = true,
+}: {
+ eventId: string;
+ openable?: boolean;
+}) {
+ const { t } = useTranslation();
+ const { isLoading, isError, data } = useEvent(eventId);
+
+ const ark = useArk();
+ const content = useMemo(() => {
+ if (!data) return "";
+
+ const text = stripHtml(data.content.trim()).result;
+ const words = text.split(/( |\n)/);
+
+ // @ts-ignore, kaboom !!!
+ let parsedContent: ReactNode[] = text;
+
+ const hashtags = words.filter((word) => word.startsWith("#"));
+ const mentions = words.filter((word) =>
+ NOSTR_MENTIONS.some((el) => word.startsWith(el)),
+ );
+
+ try {
+ if (hashtags.length) {
+ for (const hashtag of hashtags) {
+ parsedContent = reactStringReplace(
+ parsedContent,
+ hashtag,
+ (match, i) => {
+ return ;
+ },
+ );
+ }
+ }
+
+ if (mentions.length) {
+ for (const mention of mentions) {
+ parsedContent = reactStringReplace(
+ parsedContent,
+ mention,
+ (match, i) => ,
+ );
+ }
+ }
+
+ parsedContent = reactStringReplace(
+ parsedContent,
+ /(https?:\/\/\S+)/g,
+ (match, i) => {
+ const url = new URL(match);
+ return (
+
+ {url.toString()}
+
+ );
+ },
+ );
+
+ return parsedContent;
+ } catch (e) {
+ return text;
+ }
+ }, [data]);
+
+ if (isLoading) {
+ return (
+
+ );
+ }
+
+ if (isError || !data) {
+ return (
+
+ {t("note.error")}
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+ ·
+
+
+
+
+
+ {content}
+
+ {openable ? (
+
+ ark.open_thread(data.id)}
+ className="inline-flex items-center gap-1 text-sm text-neutral-600 hover:text-blue-500 dark:text-neutral-400"
+ >
+ {t("note.showMore")}
+
+
+
+ ) : (
+
+ )}
+
+ );
+}
diff --git a/packages/ui/src/note/mentions/user.tsx b/packages/ui/src/note/mentions/user.tsx
new file mode 100644
index 00000000..7f91a985
--- /dev/null
+++ b/packages/ui/src/note/mentions/user.tsx
@@ -0,0 +1,21 @@
+import { useArk, useProfile } from "@lume/ark";
+import { displayNpub } from "@lume/utils";
+
+export function MentionUser({ pubkey }: { pubkey: string }) {
+ const ark = useArk();
+ const { isLoading, isError, profile } = useProfile(pubkey);
+
+ return (
+ ark.open_profile(pubkey)}
+ className="break-words text-start text-blue-500 hover:text-blue-600"
+ >
+ {isLoading
+ ? "@anon"
+ : isError
+ ? displayNpub(pubkey, 16)
+ : `@${profile?.name || profile?.display_name || profile?.name || "anon"}`}
+
+ );
+}
diff --git a/packages/ui/src/note/menu.tsx b/packages/ui/src/note/menu.tsx
new file mode 100644
index 00000000..bc0e8d90
--- /dev/null
+++ b/packages/ui/src/note/menu.tsx
@@ -0,0 +1,103 @@
+import { HorizontalDotsIcon } from "@lume/icons";
+import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
+import { writeText } from "@tauri-apps/plugin-clipboard-manager";
+import { useTranslation } from "react-i18next";
+import { useNoteContext } from "./provider";
+import { useArk } from "@lume/ark";
+
+export function NoteMenu() {
+ const ark = useArk();
+ const event = useNoteContext();
+
+ const { t } = useTranslation();
+
+ const copyID = async () => {
+ await writeText(await ark.event_to_bech32(event.id, [""]));
+ };
+
+ const copyRaw = async () => {
+ await writeText(JSON.stringify(event));
+ };
+
+ const copyNpub = async () => {
+ await writeText(await ark.user_to_bech32(event.pubkey, [""]));
+ };
+
+ const copyLink = async () => {
+ await writeText(
+ `https://njump.me/${await ark.event_to_bech32(event.id, [""])}`,
+ );
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+ ark.open_thread(event.id)}
+ className="inline-flex h-9 items-center gap-2 rounded-lg px-3 text-sm font-medium text-white hover:bg-neutral-900 focus:outline-none dark:text-black dark:hover:bg-neutral-100"
+ >
+ {t("note.menu.viewThread")}
+
+
+
+ copyLink()}
+ className="inline-flex h-9 items-center gap-2 rounded-lg px-3 text-sm font-medium text-white hover:bg-neutral-900 focus:outline-none dark:text-black dark:hover:bg-neutral-100"
+ >
+ {t("note.menu.copyLink")}
+
+
+
+ copyID()}
+ className="inline-flex h-9 items-center gap-2 rounded-lg px-3 text-sm font-medium text-white hover:bg-neutral-900 focus:outline-none dark:text-black dark:hover:bg-neutral-100"
+ >
+ {t("note.menu.copyNoteId")}
+
+
+
+ copyNpub()}
+ className="inline-flex h-9 items-center gap-2 rounded-lg px-3 text-sm font-medium text-white hover:bg-neutral-900 focus:outline-none dark:text-black dark:hover:bg-neutral-100"
+ >
+ {t("note.menu.copyAuthorId")}
+
+
+
+ ark.open_profile(event.pubkey)}
+ className="inline-flex h-9 items-center gap-2 rounded-lg px-3 text-sm font-medium text-white hover:bg-neutral-900 focus:outline-none dark:text-black dark:hover:bg-neutral-100"
+ >
+ {t("note.menu.viewAuthor")}
+
+
+
+
+ copyRaw()}
+ className="inline-flex h-9 items-center gap-2 rounded-lg px-3 text-sm font-medium text-white hover:bg-neutral-900 focus:outline-none dark:text-black dark:hover:bg-neutral-100"
+ >
+ {t("note.menu.copyRaw")}
+
+
+
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/nip89.tsx b/packages/ui/src/note/nip89.tsx
new file mode 100644
index 00000000..ed4cd257
--- /dev/null
+++ b/packages/ui/src/note/nip89.tsx
@@ -0,0 +1,55 @@
+import { useQuery } from "@tanstack/react-query";
+import { useTranslation } from "react-i18next";
+import { AppHandler } from "./appHandler";
+import { useNoteContext } from "./provider";
+import { useArk } from "@lume/ark";
+
+export function NIP89({ className }: { className?: string }) {
+ const ark = useArk();
+ const event = useNoteContext();
+
+ const { t } = useTranslation();
+ const { isLoading, isError, data } = useQuery({
+ queryKey: ["app-recommend", event.id],
+ queryFn: () => {
+ return ark.getAppRecommend({
+ unknownKind: event.kind.toString(),
+ author: event.pubkey,
+ });
+ },
+ refetchOnWindowFocus: false,
+ refetchOnMount: false,
+ staleTime: Infinity,
+ });
+
+ if (isLoading) {
+ Loading...
;
+ }
+
+ if (isError || !data) {
+ return Error
;
+ }
+
+ return (
+
+
+
+
+ {t("nip89.unsupported")}
+
+
+ {event.kind}
+
+
+
+
+ {t("nip89.openWith")}
+
+ {data.map((item) => (
+
+ ))}
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/preview/image.tsx b/packages/ui/src/note/preview/image.tsx
new file mode 100644
index 00000000..139b9ee4
--- /dev/null
+++ b/packages/ui/src/note/preview/image.tsx
@@ -0,0 +1,64 @@
+import { CheckCircleIcon, DownloadIcon } from "@lume/icons";
+import { downloadDir } from "@tauri-apps/api/path";
+import { WebviewWindow } from "@tauri-apps/api/webviewWindow";
+import { download } from "@tauri-apps/plugin-upload";
+import { SyntheticEvent, useState } from "react";
+
+export function ImagePreview({ url }: { url: string }) {
+ const [downloaded, setDownloaded] = useState(false);
+
+ const downloadImage = async (e: { stopPropagation: () => void }) => {
+ try {
+ e.stopPropagation();
+
+ const downloadDirPath = await downloadDir();
+ const filename = url.substring(url.lastIndexOf("/") + 1);
+ await download(url, `${downloadDirPath}/${filename}`);
+
+ setDownloaded(true);
+ } catch (e) {
+ console.error(e);
+ }
+ };
+
+ const open = async () => {
+ const name = new URL(url).pathname.split("/").pop();
+ return new WebviewWindow("image-viewer", {
+ url,
+ title: name,
+ });
+ };
+
+ const fallback = (event: SyntheticEvent) => {
+ event.currentTarget.src = "/fallback-image.jpg";
+ };
+
+ return (
+ // biome-ignore lint/a11y/useKeyWithClickEvents:
+
+
+
downloadImage(e)}
+ className="absolute right-2 top-2 z-20 hidden size-8 items-center justify-center rounded-md bg-white/10 text-white/70 backdrop-blur-2xl hover:bg-blue-500 hover:text-white group-hover:inline-flex"
+ >
+ {downloaded ? (
+
+ ) : (
+
+ )}
+
+
+ );
+}
diff --git a/packages/ui/src/note/preview/link.tsx b/packages/ui/src/note/preview/link.tsx
new file mode 100644
index 00000000..c9319a10
--- /dev/null
+++ b/packages/ui/src/note/preview/link.tsx
@@ -0,0 +1,87 @@
+import { useOpenGraph } from "@lume/utils";
+
+function isImage(url: string) {
+ return /^https?:\/\/.+\.(jpg|jpeg|png|webp|avif)$/.test(url);
+}
+
+export function LinkPreview({ url }: { url: string }) {
+ const domain = new URL(url);
+ const { isLoading, isError, data } = useOpenGraph(url);
+
+ if (isLoading) {
+ return (
+
+
+
+
+
+
+ {domain.hostname}
+
+
+
+ );
+ }
+
+ if (!data.title && !data.image && !data.description) {
+ return (
+
+ {url}
+
+ );
+ }
+
+ if (isError) {
+ return (
+
+ {url}
+
+ );
+ }
+
+ return (
+
+ {isImage(data.image) ? (
+
+ ) : null}
+
+
+ {data.title ? (
+
+ {data.title}
+
+ ) : null}
+ {data.description ? (
+
+ {data.description}
+
+ ) : null}
+
+
+ {domain.hostname}
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/preview/video.tsx b/packages/ui/src/note/preview/video.tsx
new file mode 100644
index 00000000..faa2a897
--- /dev/null
+++ b/packages/ui/src/note/preview/video.tsx
@@ -0,0 +1,30 @@
+import {
+ MediaControlBar,
+ MediaController,
+ MediaMuteButton,
+ MediaPlayButton,
+ MediaTimeDisplay,
+ MediaTimeRange,
+} from "media-chrome/dist/react";
+
+export function VideoPreview({ url }: { url: string }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/packages/ark/src/components/note/primitives/childReply.tsx b/packages/ui/src/note/primitives/childReply.tsx
similarity index 75%
rename from packages/ark/src/components/note/primitives/childReply.tsx
rename to packages/ui/src/note/primitives/childReply.tsx
index 4ecfc9a8..b2ff0c2c 100644
--- a/packages/ark/src/components/note/primitives/childReply.tsx
+++ b/packages/ui/src/note/primitives/childReply.tsx
@@ -1,9 +1,7 @@
-import { NDKEvent } from "@nostr-dev-kit/ndk";
+import { Event } from "@lume/types";
import { Note } from "..";
-export function ChildReply({
- event,
-}: { event: NDKEvent; rootEventId?: string }) {
+export function ChildReply({ event }: { event: Event; rootEventId?: string }) {
return (
diff --git a/packages/ark/src/components/note/primitives/reply.tsx b/packages/ui/src/note/primitives/reply.tsx
similarity index 96%
rename from packages/ark/src/components/note/primitives/reply.tsx
rename to packages/ui/src/note/primitives/reply.tsx
index 0aa447b9..284de4e8 100644
--- a/packages/ark/src/components/note/primitives/reply.tsx
+++ b/packages/ui/src/note/primitives/reply.tsx
@@ -1,5 +1,5 @@
import { NavArrowDownIcon } from "@lume/icons";
-import { NDKEventWithReplies } from "@lume/types";
+import { EventWithReplies } from "@lume/types";
import { cn } from "@lume/utils";
import * as Collapsible from "@radix-ui/react-collapsible";
import { useState } from "react";
@@ -10,7 +10,7 @@ import { ChildReply } from "./childReply";
export function Reply({
event,
}: {
- event: NDKEventWithReplies;
+ event: EventWithReplies;
}) {
const [t] = useTranslation();
const [open, setOpen] = useState(false);
diff --git a/packages/ui/src/note/primitives/repost.tsx b/packages/ui/src/note/primitives/repost.tsx
new file mode 100644
index 00000000..b4adc458
--- /dev/null
+++ b/packages/ui/src/note/primitives/repost.tsx
@@ -0,0 +1,118 @@
+import { RepostIcon } from "@lume/icons";
+import { Event } from "@lume/types";
+import { cn } from "@lume/utils";
+import { useQuery } from "@tanstack/react-query";
+import { useTranslation } from "react-i18next";
+import { Note } from "..";
+import { User } from "../../user";
+import { useArk } from "@lume/ark";
+
+export function RepostNote({
+ event,
+ className,
+}: {
+ event: Event;
+ className?: string;
+}) {
+ const ark = useArk();
+
+ const { t } = useTranslation();
+ const {
+ isLoading,
+ isError,
+ data: repostEvent,
+ } = useQuery({
+ queryKey: ["repost", event.id],
+ queryFn: async () => {
+ try {
+ if (event.content.length > 50) {
+ const embed = JSON.parse(event.content) as Event;
+ return embed;
+ }
+ const id = event.tags.find((el) => el[0] === "e")[1];
+ return await ark.get_event(id);
+ } catch {
+ throw new Error("Failed to get repost event");
+ }
+ },
+ refetchOnWindowFocus: false,
+ refetchOnMount: false,
+ refetchOnReconnect: false,
+ });
+
+ if (isLoading) {
+ return Loading...
;
+ }
+
+ if (isError || !repostEvent) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ {t("note.reposted")}
+
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {t("note.reposted")}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/packages/ark/src/components/note/primitives/skeleton.tsx b/packages/ui/src/note/primitives/skeleton.tsx
similarity index 100%
rename from packages/ark/src/components/note/primitives/skeleton.tsx
rename to packages/ui/src/note/primitives/skeleton.tsx
diff --git a/packages/ui/src/note/primitives/text.tsx b/packages/ui/src/note/primitives/text.tsx
new file mode 100644
index 00000000..80af0b8c
--- /dev/null
+++ b/packages/ui/src/note/primitives/text.tsx
@@ -0,0 +1,42 @@
+import { Event } from "@lume/types";
+import { cn } from "@lume/utils";
+import { Note } from "..";
+
+export function TextNote({
+ event,
+ className,
+}: {
+ event: Event;
+ className?: string;
+}) {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/primitives/thread.tsx b/packages/ui/src/note/primitives/thread.tsx
new file mode 100644
index 00000000..28c69819
--- /dev/null
+++ b/packages/ui/src/note/primitives/thread.tsx
@@ -0,0 +1,43 @@
+import { useEvent } from "@lume/ark";
+import { Note } from "..";
+import { User } from "../../user";
+
+export function ThreadNote({ eventId }: { eventId: string }) {
+ const { isLoading, data } = useEvent(eventId);
+
+ if (isLoading) {
+ return Loading...
;
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/packages/ark/src/components/note/provider.tsx b/packages/ui/src/note/provider.tsx
similarity index 73%
rename from packages/ark/src/components/note/provider.tsx
rename to packages/ui/src/note/provider.tsx
index c2cf4d45..c5c5b201 100644
--- a/packages/ark/src/components/note/provider.tsx
+++ b/packages/ui/src/note/provider.tsx
@@ -1,12 +1,12 @@
-import { NDKEvent } from "@nostr-dev-kit/ndk";
+import { Event } from "@lume/types";
import { ReactNode, createContext, useContext } from "react";
-const EventContext = createContext(null);
+const EventContext = createContext(null);
export function NoteProvider({
event,
children,
-}: { event: NDKEvent; children: ReactNode }) {
+}: { event: Event; children: ReactNode }) {
return (
{children}
);
diff --git a/packages/ark/src/components/note/root.tsx b/packages/ui/src/note/root.tsx
similarity index 100%
rename from packages/ark/src/components/note/root.tsx
rename to packages/ui/src/note/root.tsx
diff --git a/packages/ui/src/note/thread.tsx b/packages/ui/src/note/thread.tsx
new file mode 100644
index 00000000..3214c9d8
--- /dev/null
+++ b/packages/ui/src/note/thread.tsx
@@ -0,0 +1,44 @@
+import { cn } from "@lume/utils";
+import { useTranslation } from "react-i18next";
+import { Note } from ".";
+import { useNoteContext } from "./provider";
+import { useArk } from "@lume/ark";
+import { LinkIcon } from "@lume/icons";
+
+export function NoteThread({ className }: { className?: string }) {
+ const ark = useArk();
+ const event = useNoteContext();
+ const thread = ark.parse_event_thread({
+ content: event.content,
+ tags: event.tags,
+ });
+
+ const { t } = useTranslation();
+
+ if (!thread) return null;
+
+ return (
+
+
+ {thread.rootEventId ? (
+
+ ) : null}
+ {thread.replyEventId ? (
+
+ ) : null}
+
+
+ ark.open_thread(thread.rootEventId || thread.replyEventId)
+ }
+ className="inline-flex items-center gap-1 text-sm text-neutral-600 hover:text-blue-500 dark:text-neutral-400"
+ >
+ {t("note.showThread")}
+
+
+
+
+
+ );
+}
diff --git a/packages/ui/src/note/user.tsx b/packages/ui/src/note/user.tsx
new file mode 100644
index 00000000..f7485209
--- /dev/null
+++ b/packages/ui/src/note/user.tsx
@@ -0,0 +1,60 @@
+import { cn } from "@lume/utils";
+import * as HoverCard from "@radix-ui/react-hover-card";
+import { User } from "../user";
+import { useNoteContext } from "./provider";
+import { useArk } from "@lume/ark";
+
+export function NoteUser({ className }: { className?: string }) {
+ const ark = useArk();
+ const event = useNoteContext();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ark.open_profile(event.pubkey)}
+ className="mt-2 inline-flex h-9 w-full items-center justify-center rounded-lg bg-white text-sm font-medium hover:bg-neutral-100 dark:bg-neutral-100 dark:text-neutral-900 dark:hover:bg-neutral-200"
+ >
+ View profile
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/packages/ui/src/onboarding/finish.tsx b/packages/ui/src/onboarding/finish.tsx
deleted file mode 100644
index a1d9cd24..00000000
--- a/packages/ui/src/onboarding/finish.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import { CheckIcon, LoaderIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { onboardingAtom } from "@lume/utils";
-import { useQueryClient } from "@tanstack/react-query";
-import { motion } from "framer-motion";
-import { useSetAtom } from "jotai";
-import { useState } from "react";
-import { useTranslation } from "react-i18next";
-
-export function OnboardingFinishScreen() {
- const storage = useStorage();
- const queryClient = useQueryClient();
- const setOnboarding = useSetAtom(onboardingAtom);
-
- const [t] = useTranslation();
- const [loading, setLoading] = useState(false);
-
- const finish = async () => {
- setLoading(true);
-
- if (storage.interests) {
- await queryClient.invalidateQueries({ queryKey: ["foryou-9998"] });
- }
-
- setLoading(false);
- setOnboarding({ open: false, newUser: false });
- };
-
- return (
-
-
-
-
{t("onboarding.finish.title")}
-
- {t("onboarding.finish.subtitle")}
-
-
-
-
- );
-}
diff --git a/packages/ui/src/onboarding/home.tsx b/packages/ui/src/onboarding/home.tsx
deleted file mode 100644
index 1de9984b..00000000
--- a/packages/ui/src/onboarding/home.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { ArrowRightIcon, PopperFilledIcon } from "@lume/icons";
-import { onboardingAtom } from "@lume/utils";
-import { motion } from "framer-motion";
-import { useAtom } from "jotai";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-
-export function OnboardingHomeScreen() {
- const navigate = useNavigate();
-
- const [t] = useTranslation();
- const [onboarding, setOnboarding] = useAtom(onboardingAtom);
-
- return (
-
-
-
-
{t("onboarding.home.title")}
-
- {t("onboarding.home.subtitle")}
-
-
-
-
- onboarding.newUser ? navigate("/profile") : navigate("/interests")
- }
- className="inline-flex items-center justify-center gap-2 w-44 font-medium h-11 rounded-xl bg-blue-100 text-blue-500 hover:bg-blue-200 dark:bg-blue-900 dark:text-blue-500 dark:hover:bg-blue-800"
- >
- {t("onboarding.home.profileSettings")}
-
-
-
setOnboarding({ open: false, newUser: false })}
- className="inline-flex items-center justify-center gap-2 w-44 px-5 font-medium h-11 rounded-xl hover:bg-neutral-100 dark:hover:bg-neutral-900 text-neutral-700 dark:text-neutral-600"
- >
- {t("global.skip")}
-
-
-
- );
-}
diff --git a/packages/ui/src/onboarding/interest.tsx b/packages/ui/src/onboarding/interest.tsx
deleted file mode 100644
index 3d458ccd..00000000
--- a/packages/ui/src/onboarding/interest.tsx
+++ /dev/null
@@ -1,127 +0,0 @@
-import { ArrowLeftIcon, LoaderIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { TOPICS, cn } from "@lume/utils";
-import { useState } from "react";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-import { toast } from "sonner";
-
-export function OnboardingInterestScreen() {
- const storage = useStorage();
- const navigate = useNavigate();
-
- const [t] = useTranslation();
- const [loading, setLoading] = useState(false);
- const [hashtags, setHashtags] = useState([]);
-
- const toggleHashtag = (item: string) => {
- const arr = hashtags.includes(item)
- ? hashtags.filter((i) => i !== item)
- : [...hashtags, item];
- setHashtags(arr);
- };
-
- const toggleAll = (item: string[]) => {
- const sets = new Set([...hashtags, ...item]);
- setHashtags([...sets]);
- };
-
- const submit = async () => {
- try {
- setLoading(true);
-
- if (!hashtags.length) return navigate("/finish");
-
- const save = await storage.createSetting(
- "interests",
- JSON.stringify({ hashtags }),
- );
-
- if (save) {
- storage.interests = { hashtags, users: [], words: [] };
- return navigate("/finish");
- }
- } catch (e) {
- setLoading(false);
- toast.error(String(e));
- }
- };
-
- return (
-
-
-
-
{t("interests.title")}
-
- {t("interests.subtitle")}
-
-
-
-
-
-
- {TOPICS.map((topic) => (
-
-
-
-
-
{topic.title}
-
-
toggleAll(topic.content)}
- className="text-sm font-medium text-blue-500"
- >
- {t("interests.followAll")}
-
-
-
- {topic.content.map((hashtag) => (
- toggleHashtag(hashtag)}
- className={cn(
- "inline-flex items-center rounded-full bg-neutral-100 dark:bg-neutral-900 border border-transparent px-2 py-1 text-sm font-medium",
- hashtags.includes(hashtag)
- ? "border-blue-500 text-blue-500"
- : "",
- )}
- >
- {hashtag}
-
- ))}
-
-
- ))}
-
-
-
-
navigate(-1)}
- className="inline-flex h-9 flex-1 gap-2 shrink-0 items-center justify-center rounded-lg bg-neutral-100 font-medium dark:bg-neutral-900 dark:hover:bg-neutral-800 hover:bg-blue-200"
- >
-
- {t("global.back")}
-
-
- {loading ? (
-
- ) : (
- t("global.continue")
- )}
-
-
-
-
- );
-}
diff --git a/packages/ui/src/onboarding/modal.tsx b/packages/ui/src/onboarding/modal.tsx
deleted file mode 100644
index 15b525bf..00000000
--- a/packages/ui/src/onboarding/modal.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { onboardingAtom } from "@lume/utils";
-import * as Dialog from "@radix-ui/react-dialog";
-import { useAtomValue } from "jotai";
-import { OnboardingRouter } from "./router";
-
-export function OnboardingModal() {
- const onboarding = useAtomValue(onboardingAtom);
-
- return (
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/onboarding/profile.tsx b/packages/ui/src/onboarding/profile.tsx
deleted file mode 100644
index b4a0a84b..00000000
--- a/packages/ui/src/onboarding/profile.tsx
+++ /dev/null
@@ -1,171 +0,0 @@
-import { useArk } from "@lume/ark";
-import { ArrowLeftIcon, LoaderIcon } from "@lume/icons";
-import { useStorage } from "@lume/storage";
-import { NDKKind, NDKUserProfile } from "@nostr-dev-kit/ndk";
-import { useQueryClient } from "@tanstack/react-query";
-import { motion } from "framer-motion";
-import { minidenticon } from "minidenticons";
-import { useState } from "react";
-import { useForm } from "react-hook-form";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-import { toast } from "sonner";
-import { AvatarUploadButton } from "../avatarUploadButton";
-
-export function OnboardingProfileScreen() {
- const [picture, setPicture] = useState("");
- const [loading, setLoading] = useState(false);
-
- const ark = useArk();
- const storage = useStorage();
- const queryClient = useQueryClient();
- const navigate = useNavigate();
-
- const { t } = useTranslation();
- const { register, handleSubmit } = useForm();
-
- const svgURI = `data:image/svg+xml;utf8,${encodeURIComponent(
- minidenticon(ark.account.pubkey, 90, 50),
- )}`;
-
- const onSubmit = async (data: { name: string; about: string }) => {
- try {
- setLoading(true);
-
- if (!data.name.length && !data.about.length) {
- setLoading(false);
- navigate("/interests");
- }
-
- const prevProfile = await ark.getUserProfile();
- const newProfile: NDKUserProfile = {
- ...data,
- nip05: prevProfile?.nip05 || "",
- bio: data.about,
- image: picture,
- picture: picture,
- };
-
- const publish = await ark.createEvent({
- content: JSON.stringify(newProfile),
- kind: NDKKind.Metadata,
- tags: [],
- });
-
- if (publish) {
- // invalid cache
- await storage.clearProfileCache(ark.account.pubkey);
- await queryClient.setQueryData(
- ["user", ark.account.pubkey],
- () => newProfile,
- );
-
- setLoading(false);
- navigate("/interests");
- }
- } catch (e) {
- setLoading(false);
- toast.error(String(e));
- }
- };
-
- return (
-
-
-
-
{t("onboarding.profile.title")}
-
- {t("onboarding.profile.subtitle")}
-
-
-
-
-
-
-
-
{t("user.avatar")}
-
- {picture.length ? (
-
- ) : (
-
- )}
-
-
-
-
-
- {t("user.name")} *
-
-
-
-
-
- {t("user.bio")}
-
-
-
-
-
- {t("user.website")}
-
-
-
-
-
-
navigate(-1)}
- className="inline-flex h-9 flex-1 gap-2 shrink-0 items-center justify-center rounded-lg bg-neutral-100 font-medium dark:bg-neutral-900 dark:hover:bg-neutral-800 hover:bg-blue-200"
- >
-
- {t("global.back")}
-
-
- {loading ? (
-
- ) : (
- t("global.continue")
- )}
-
-
-
-
- );
-}
diff --git a/packages/ui/src/onboarding/router.tsx b/packages/ui/src/onboarding/router.tsx
deleted file mode 100644
index 84636435..00000000
--- a/packages/ui/src/onboarding/router.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { AnimatePresence } from "framer-motion";
-import {
- MemoryRouter,
- Route,
- Routes,
- UNSAFE_LocationContext,
-} from "react-router-dom";
-import { OnboardingFinishScreen } from "./finish";
-import { OnboardingHomeScreen } from "./home";
-import { OnboardingInterestScreen } from "./interest";
-import { OnboardingProfileScreen } from "./profile";
-
-export function OnboardingRouter() {
- return (
-
-
-
-
- } />
- } />
- } />
- } />
-
-
-
-
- );
-}
diff --git a/packages/ui/src/replyList.tsx b/packages/ui/src/replyList.tsx
deleted file mode 100644
index 6c52fc16..00000000
--- a/packages/ui/src/replyList.tsx
+++ /dev/null
@@ -1,83 +0,0 @@
-import { Reply, useArk } from "@lume/ark";
-import { LoaderIcon } from "@lume/icons";
-import { NDKEventWithReplies } from "@lume/types";
-import { cn } from "@lume/utils";
-import { NDKKind, type NDKSubscription } from "@nostr-dev-kit/ndk";
-import { useEffect, useState } from "react";
-import { useTranslation } from "react-i18next";
-import { ReplyForm } from "./editor/replyForm";
-
-export function ReplyList({
- eventId,
- className,
-}: { eventId: string; className?: string }) {
- const ark = useArk();
-
- const [t] = useTranslation();
- const [data, setData] = useState(null);
-
- useEffect(() => {
- let sub: NDKSubscription = undefined;
- let isCancelled = false;
-
- async function fetchRepliesAndSub() {
- const id = ark.getCleanEventId(eventId);
- const events = await ark.getThreads(id);
-
- if (!isCancelled) {
- setData(events);
- }
-
- if (!sub) {
- sub = ark.subscribe({
- filter: {
- "#e": [id],
- kinds: [NDKKind.Text],
- since: Math.floor(Date.now() / 1000),
- },
- closeOnEose: false,
- cb: (event: NDKEventWithReplies) =>
- setData((prev) => [event, ...prev]),
- });
- }
- }
-
- // subscribe for new replies
- fetchRepliesAndSub();
-
- return () => {
- isCancelled = true;
- if (sub) sub.stop();
- };
- }, [eventId]);
-
- return (
-
-
- {!data ? (
-
-
-
- ) : data.length === 0 ? (
-
-
-
👋
-
- {t("note.reply.empty")}
-
-
-
- ) : (
- data.map((event) =>
)
- )}
-
- );
-}
diff --git a/packages/ui/src/routes/event.tsx b/packages/ui/src/routes/event.tsx
deleted file mode 100644
index 9b3843e2..00000000
--- a/packages/ui/src/routes/event.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { ThreadNote } from "@lume/ark";
-import { ArrowLeftIcon, ArrowRightIcon } from "@lume/icons";
-import { useNavigate, useParams } from "react-router-dom";
-import { WindowVirtualizer } from "virtua";
-import { ReplyList } from "../replyList";
-
-export function EventRoute() {
- const { id } = useParams();
- const navigate = useNavigate();
-
- return (
-
-
-
-
navigate(-1)}
- >
-
-
-
navigate(1)}
- >
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/routes/suggest.tsx b/packages/ui/src/routes/suggest.tsx
deleted file mode 100644
index d16ef695..00000000
--- a/packages/ui/src/routes/suggest.tsx
+++ /dev/null
@@ -1,127 +0,0 @@
-import { User } from "@lume/ark";
-import { ArrowLeftIcon, ArrowRightIcon, LoaderIcon } from "@lume/icons";
-import { useQuery, useQueryClient } from "@tanstack/react-query";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
-import { toast } from "sonner";
-import { WindowVirtualizer } from "virtua";
-
-const POPULAR_USERS = [
- "npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6",
- "npub1sg6plzptd64u62a878hep2kev88swjh3tw00gjsfl8f237lmu63q0uf63m",
- "npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s",
- "npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z",
- "npub1az9xj85cmxv8e9j9y80lvqp97crsqdu2fpu3srwthd99qfu9qsgstam8y8",
- "npub1a2cww4kn9wqte4ry70vyfwqyqvpswksna27rtxd8vty6c74era8sdcw83a",
- "npub168ghgug469n4r2tuyw05dmqhqv5jcwm7nxytn67afmz8qkc4a4zqsu2dlc",
- "npub133vj8ycevdle0cq8mtgddq0xtn34kxkwxvak983dx0u5vhqnycyqj6tcza",
- "npub18ams6ewn5aj2n3wt2qawzglx9mr4nzksxhvrdc4gzrecw7n5tvjqctp424",
- "npub1r0rs5q2gk0e3dk3nlc7gnu378ec6cnlenqp8a3cjhyzu6f8k5sgs4sq9ac",
- "npub1prya33fnqerq0fljwjtp77ehtu7jlsjt5ydhwveuwmqdsdm6k8esk42xcv",
- "npub19mduaf5569jx9xz555jcx3v06mvktvtpu0zgk47n4lcpjsz43zzqhj6vzk",
-];
-
-const LUME_USERS = [
- "npub1zfss807aer0j26mwp2la0ume0jqde3823rmu97ra6sgyyg956e0s6xw445",
-];
-
-export function SuggestRoute({ queryKey }: { queryKey: string[] }) {
- const queryClient = useQueryClient();
- const navigate = useNavigate();
-
- const { t } = useTranslation();
- const { isLoading, isError, data } = useQuery({
- queryKey: ["trending-users"],
- queryFn: async ({ signal }: { signal: AbortSignal }) => {
- const res = await fetch("https://api.nostr.band/v0/trending/profiles", {
- signal,
- });
- if (!res.ok) {
- throw new Error("Failed to fetch trending users from nostr.band API.");
- }
- return res.json();
- },
- });
-
- const submit = async () => {
- try {
- await queryClient.refetchQueries({ queryKey });
- return navigate("/", { replace: true });
- } catch (e) {
- toast.error(String(e));
- }
- };
-
- return (
-
-
-
-
navigate(-1)}
- >
-
-
-
navigate(1)}
- >
-
-
-
-
-
-
{t("suggestion.title")}
-
-
- {isLoading ? (
-
-
-
- ) : isError ? (
-
- {t("suggestion.error")}
-
- ) : (
- data?.profiles.map((item: { pubkey: string }) => (
-
- ))
- )}
-
-
-
- {t("suggestion.button")}
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/routes/user.tsx b/packages/ui/src/routes/user.tsx
deleted file mode 100644
index 2cdeb60a..00000000
--- a/packages/ui/src/routes/user.tsx
+++ /dev/null
@@ -1,147 +0,0 @@
-import { RepostNote, TextNote, User, useArk } from "@lume/ark";
-import {
- ArrowLeftIcon,
- ArrowRightCircleIcon,
- ArrowRightIcon,
- LoaderIcon,
-} from "@lume/icons";
-import { FETCH_LIMIT } from "@lume/utils";
-import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
-import { useInfiniteQuery } from "@tanstack/react-query";
-import { useMemo } from "react";
-import { useTranslation } from "react-i18next";
-import { useNavigate, useParams } from "react-router-dom";
-import { WindowVirtualizer } from "virtua";
-
-export function UserRoute() {
- const ark = useArk();
- const navigate = useNavigate();
-
- const { id } = useParams();
- const { t } = useTranslation();
- const { data, hasNextPage, isLoading, isFetchingNextPage, fetchNextPage } =
- useInfiniteQuery({
- queryKey: ["user-posts", id],
- initialPageParam: 0,
- queryFn: async ({
- signal,
- pageParam,
- }: {
- signal: AbortSignal;
- pageParam: number;
- }) => {
- const events = await ark.getInfiniteEvents({
- filter: {
- kinds: [NDKKind.Text, NDKKind.Repost],
- authors: [id],
- },
- limit: FETCH_LIMIT,
- pageParam,
- signal,
- });
-
- return events;
- },
- getNextPageParam: (lastPage) => {
- const lastEvent = lastPage.at(-1);
- if (!lastEvent) return;
- return lastEvent.created_at - 1;
- },
- refetchOnWindowFocus: false,
- });
-
- const allEvents = useMemo(
- () => (data ? data.pages.flatMap((page) => page) : []),
- [data],
- );
-
- const renderItem = (event: NDKEvent) => {
- switch (event.kind) {
- case NDKKind.Text:
- return ;
- case NDKKind.Repost:
- return ;
- default:
- return ;
- }
- };
-
- return (
-
-
-
-
navigate(-1)}
- >
-
-
-
navigate(1)}
- >
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {t("user.latestPosts")}
-
-
- {isLoading ? (
-
-
-
- ) : (
- allEvents.map((item) => renderItem(item))
- )}
-
- {hasNextPage ? (
-
fetchNextPage()}
- disabled={!hasNextPage || isFetchingNextPage}
- className="inline-flex items-center justify-center w-full h-12 gap-2 font-medium bg-neutral-100 hover:bg-neutral-200 dark:bg-neutral-900 dark:hover:bg-neutral-800 rounded-xl focus:outline-none"
- >
- {isFetchingNextPage ? (
-
- ) : (
- <>
-
- {t("global.loadMore")}
- >
- )}
-
- ) : null}
-
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/search/dialog.tsx b/packages/ui/src/search/dialog.tsx
index 7aa06d00..88ee251c 100644
--- a/packages/ui/src/search/dialog.tsx
+++ b/packages/ui/src/search/dialog.tsx
@@ -1,4 +1,4 @@
-import { Note, User, useArk, useColumnContext } from "@lume/ark";
+import { Note, User, useArk } from "@lume/ark";
import { LoaderIcon, SearchIcon } from "@lume/icons";
import { COL_TYPES, searchAtom } from "@lume/utils";
import { type NDKEvent, NDKKind } from "@nostr-dev-kit/ndk";
@@ -18,7 +18,6 @@ export function SearchDialog() {
const [value] = useDebounce(search, 1200);
const { t } = useTranslation();
- const { vlistRef, columns, addColumn } = useColumnContext();
const searchEvents = async () => {
if (!value.length) return;
diff --git a/packages/ui/src/titlebar/components/button.tsx b/packages/ui/src/titlebar/components/button.tsx
deleted file mode 100644
index 28fbcf8d..00000000
--- a/packages/ui/src/titlebar/components/button.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { cn } from "@lume/utils";
-import type { ButtonHTMLAttributes } from "react";
-
-export function WindowButton({
- className,
- children,
- ...props
-}: ButtonHTMLAttributes) {
- return (
-
- {children}
-
- );
-}
diff --git a/packages/ui/src/titlebar/components/icons.tsx b/packages/ui/src/titlebar/components/icons.tsx
deleted file mode 100644
index 74425946..00000000
--- a/packages/ui/src/titlebar/components/icons.tsx
+++ /dev/null
@@ -1,140 +0,0 @@
-import type { SVGProps } from 'react';
-
-export const WindowIcons = {
- minimizeWin: (props: JSX.IntrinsicAttributes & SVGProps) => (
-
-
-
- ),
- maximizeWin: (props: JSX.IntrinsicAttributes & SVGProps) => (
-
-
-
- ),
- maximizeRestoreWin: (props: JSX.IntrinsicAttributes & SVGProps) => (
-
-
-
- ),
- closeWin: (props: JSX.IntrinsicAttributes & SVGProps) => (
-
-
-
- ),
- closeMac: (props: JSX.IntrinsicAttributes & SVGProps) => (
-
-
-
- ),
- minMac: (props: JSX.IntrinsicAttributes & SVGProps) => (
-
-
-
-
-
- ),
- fullMac: (props: JSX.IntrinsicAttributes & SVGProps) => (
-
-
-
-
-
- ),
- plusMac: (props: JSX.IntrinsicAttributes & SVGProps) => (
-
-
-
-
-
- ),
-};
diff --git a/packages/ui/src/titlebar/context.tsx b/packages/ui/src/titlebar/context.tsx
deleted file mode 100644
index 166374d6..00000000
--- a/packages/ui/src/titlebar/context.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-import { type Window, getCurrent } from "@tauri-apps/api/window";
-import { type } from "@tauri-apps/plugin-os";
-import React, { createContext, useCallback, useEffect, useState } from "react";
-
-interface AppWindowContextType {
- appWindow: Window | null;
- isWindowMaximized: boolean;
- minimizeWindow: () => Promise;
- maximizeWindow: () => Promise;
- fullscreenWindow: () => Promise;
- closeWindow: () => Promise;
-}
-
-export const AppWindowContext = createContext({
- appWindow: null,
- isWindowMaximized: false,
- minimizeWindow: () => Promise.resolve(),
- maximizeWindow: () => Promise.resolve(),
- fullscreenWindow: () => Promise.resolve(),
- closeWindow: () => Promise.resolve(),
-});
-
-interface AppWindowProviderProps {
- children: React.ReactNode;
-}
-
-export const AppWindowProvider: React.FC = ({
- children,
-}) => {
- const [appWindow, setAppWindow] = useState(null);
- const [isWindowMaximized, setIsWindowMaximized] = useState(false);
-
- useEffect(() => {
- const window = getCurrent();
- setAppWindow(window);
- }, []);
-
- const updateIsWindowMaximized = useCallback(async () => {
- if (appWindow) {
- const _isWindowMaximized = await appWindow.isMaximized();
- setIsWindowMaximized(_isWindowMaximized);
- }
- }, [appWindow]);
-
- useEffect(() => {
- let unlisten: () => void = () => {};
-
- async function getOsType() {
- const osname = await type();
-
- if (osname !== "macos") {
- updateIsWindowMaximized();
-
- const listen = async () => {
- if (appWindow) {
- unlisten = await appWindow.onResized(() => {
- updateIsWindowMaximized();
- });
- }
- };
-
- listen();
- }
- }
-
- getOsType();
-
- // Cleanup the listener when the component unmounts
- return () => unlisten?.();
- }, [appWindow, updateIsWindowMaximized]);
-
- const minimizeWindow = async () => {
- if (appWindow) {
- await appWindow.minimize();
- }
- };
-
- const maximizeWindow = async () => {
- if (appWindow) {
- await appWindow.toggleMaximize();
- }
- };
-
- const fullscreenWindow = async () => {
- if (appWindow) {
- const fullscreen = await appWindow.isFullscreen();
- if (fullscreen) {
- await appWindow.setFullscreen(false);
- } else {
- await appWindow.setFullscreen(true);
- }
- }
- };
-
- const closeWindow = async () => {
- if (appWindow) {
- await appWindow.close();
- }
- };
-
- return (
-
- {children}
-
- );
-};
diff --git a/packages/ui/src/titlebar/controls/gnome.tsx b/packages/ui/src/titlebar/controls/gnome.tsx
deleted file mode 100644
index 95294a62..00000000
--- a/packages/ui/src/titlebar/controls/gnome.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { cn } from "@lume/utils";
-import { HTMLProps, useContext } from "react";
-import { WindowButton } from "../components/button";
-import { WindowIcons } from "../components/icons";
-import { AppWindowContext } from "../context";
-
-export function Gnome({ className, ...props }: HTMLProps) {
- const { isWindowMaximized, minimizeWindow, maximizeWindow, closeWindow } =
- useContext(AppWindowContext);
-
- return (
-
-
-
-
-
- {!isWindowMaximized ? (
-
- ) : (
-
- )}
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/titlebar/controls/macos.tsx b/packages/ui/src/titlebar/controls/macos.tsx
deleted file mode 100644
index c1607df5..00000000
--- a/packages/ui/src/titlebar/controls/macos.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { cn } from "@lume/utils";
-import { HTMLProps, useContext, useEffect, useState } from "react";
-import { WindowButton } from "../components/button";
-import { WindowIcons } from "../components/icons";
-import { AppWindowContext } from "../context";
-
-export function MacOS({ className, ...props }: HTMLProps) {
- const { minimizeWindow, maximizeWindow, fullscreenWindow, closeWindow } =
- useContext(AppWindowContext);
-
- const [isAltKeyPressed, setIsAltKeyPressed] = useState(false);
- const [isHovering, setIsHovering] = useState(false);
-
- const last = isAltKeyPressed ? (
-
- ) : (
-
- );
- const key = "Alt";
-
- const handleMouseEnter = () => {
- setIsHovering(true);
- };
-
- const handleMouseLeave = () => {
- setIsHovering(false);
- };
-
- const handleAltKeyDown = (e: KeyboardEvent) => {
- if (e.key === key) {
- setIsAltKeyPressed(true);
- }
- };
-
- const handleAltKeyUp = (e: KeyboardEvent) => {
- if (e.key === key) {
- setIsAltKeyPressed(false);
- }
- };
-
- useEffect(() => {
- // Attach event listeners when the component mounts
- window.addEventListener("keydown", handleAltKeyDown);
- window.addEventListener("keyup", handleAltKeyUp);
- }, []);
-
- return (
-
-
- {isHovering && }
-
-
- {isHovering && }
-
-
- {isHovering && last}
-
-
- );
-}
diff --git a/packages/ui/src/titlebar/controls/windows.tsx b/packages/ui/src/titlebar/controls/windows.tsx
deleted file mode 100644
index 19372fa1..00000000
--- a/packages/ui/src/titlebar/controls/windows.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import { cn } from "@lume/utils";
-import { HTMLProps, useContext } from "react";
-import { WindowButton } from "../components/button";
-import { WindowIcons } from "../components/icons";
-import { AppWindowContext } from "../context";
-
-export function Windows({ className, ...props }: HTMLProps) {
- const { isWindowMaximized, minimizeWindow, maximizeWindow, closeWindow } =
- useContext(AppWindowContext);
-
- return (
-
-
-
-
-
- {!isWindowMaximized ? (
-
- ) : (
-
- )}
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/titlebar/index.ts b/packages/ui/src/titlebar/index.ts
deleted file mode 100644
index eaa6880b..00000000
--- a/packages/ui/src/titlebar/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export * from './context';
-export * from './components/button';
-export * from './components/icons';
-export * from './controls/gnome';
-export * from './controls/windows';
-export * from './controls/macos';
-export * from './titleBar';
diff --git a/packages/ui/src/titlebar/titleBar.tsx b/packages/ui/src/titlebar/titleBar.tsx
deleted file mode 100644
index 882dedbe..00000000
--- a/packages/ui/src/titlebar/titleBar.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Platform } from "@tauri-apps/plugin-os";
-import { AppWindowProvider } from "./context";
-import { Gnome } from "./controls/gnome";
-import { MacOS } from "./controls/macos";
-import { Windows } from "./controls/windows";
-
-export function WindowTitleBar({ platform }: { platform: Platform }) {
- const ControlsComponent = () => {
- switch (platform) {
- case "windows":
- return ;
- case "macos":
- return ;
- case "linux":
- return ;
- default:
- return ;
- }
- };
-
- return (
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/translateRegisterModal.tsx b/packages/ui/src/translateRegisterModal.tsx
deleted file mode 100644
index e114cd8e..00000000
--- a/packages/ui/src/translateRegisterModal.tsx
+++ /dev/null
@@ -1,145 +0,0 @@
-import { useArk } from "@lume/ark";
-import { LoaderIcon } from "@lume/icons";
-import * as Dialog from "@radix-ui/react-dialog";
-import { fetch } from "@tauri-apps/plugin-http";
-import { useState } from "react";
-import { toast } from "sonner";
-import { renderSVG } from "uqr";
-
-export function TranslateRegisterModal({ setAPIKey }) {
- const ark = useArk();
-
- const [open, setOpen] = useState(false);
- const [loading, setLoading] = useState(false);
- const [invoice, setInvoice] = useState<{ api_key: string; bolt11: string }>(
- null,
- );
-
- const createInvoice = async () => {
- try {
- setLoading(true);
-
- const res = await fetch("https://translate.nostr.wine/api/create", {
- method: "POST",
- body: JSON.stringify({
- pubkey: ark.account.pubkey,
- amount: 2500,
- }),
- headers: {
- "Content-Type": "application/json; charset=utf-8",
- },
- });
-
- if (res) {
- const data = await res.json();
- setInvoice(data);
- setLoading(false);
- }
- } catch (e) {
- setLoading(false);
- toast.error(String(e));
- }
- };
-
- const finish = () => {
- if (!invoice) return;
-
- setAPIKey(invoice.api_key);
- setOpen(false);
- };
-
- return (
-
-
-
- Register
-
-
-
-
-
-
-
- Register Translate Service
-
-
-
-
- Translation Service is provided by{" "}
- nostr.wine . Prices
- start at 2,500 sats for 50,000 characters of translated text.
-
-
- You can learn more about nostr.wine{" "}
-
- here
-
-
-
- {!invoice ? (
-
-
-
- {loading ? (
-
- ) : (
- "Create Invoice"
- )}
-
-
- ) : (
-
-
-
API Key
-
-
-
-
-
- Scan and Pay with Lightning Wallet
-
-
-
- Done
-
-
- )}
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/tutorial/finish.tsx b/packages/ui/src/tutorial/finish.tsx
deleted file mode 100644
index a342dd34..00000000
--- a/packages/ui/src/tutorial/finish.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { tutorialAtom } from "@lume/utils";
-import { useSetAtom } from "jotai";
-
-export function TutorialFinishScreen() {
- const tutorial = useSetAtom(tutorialAtom);
-
- return (
-
-
-
- Great Job! You have completed
- this section. Feel free to explore other menus in the interface, such
- as Activity and Relay Explorer.
-
-
- If you want to see this tutorial again, don't hesitate to press the ?
- icon in Bottom bar
-
-
- If you want to seek help from Lume Devs, you can publish a post with{" "}
- #lumesos
-
-
-
- tutorial(false)}
- className="inline-flex items-center justify-center w-20 font-semibold border-t rounded-lg border-neutral-900 dark:border-neutral-800 h-9 bg-neutral-950 text-neutral-50 dark:bg-neutral-900 hover:bg-neutral-900 dark:hover:bg-neutral-800"
- >
- Finish
-
-
-
- );
-}
diff --git a/packages/ui/src/tutorial/manageColumn.tsx b/packages/ui/src/tutorial/manageColumn.tsx
deleted file mode 100644
index 111b9dcb..00000000
--- a/packages/ui/src/tutorial/manageColumn.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import { Link } from "react-router-dom";
-
-export function TutorialManageColumnScreen() {
- return (
-
-
-
- Once a new column is created, you can click on the title in its header
- to find options to customize it
-
-
-
-
-
- Next
-
-
-
- );
-}
diff --git a/packages/ui/src/tutorial/modal.tsx b/packages/ui/src/tutorial/modal.tsx
deleted file mode 100644
index e43eec83..00000000
--- a/packages/ui/src/tutorial/modal.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { CancelIcon, HelpIcon } from "@lume/icons";
-import { tutorialAtom } from "@lume/utils";
-import * as Popover from "@radix-ui/react-popover";
-import { useAtom } from "jotai";
-import { TutorialRouter } from "./router";
-
-export function TutorialModal() {
- const [tutorial, setTutorial] = useAtom(tutorialAtom);
-
- return (
-
-
- setTutorial((state) => !state)}
- className="inline-flex items-center justify-center rounded-lg text-white/70 hover:text-white hover:bg-black/50 size-10"
- >
-
-
-
-
-
-
-
-
Tutorial
-
setTutorial(false)}>
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/packages/ui/src/tutorial/newColumn.tsx b/packages/ui/src/tutorial/newColumn.tsx
deleted file mode 100644
index 1fc23ca8..00000000
--- a/packages/ui/src/tutorial/newColumn.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { Link } from "react-router-dom";
-
-export function TutorialNewColumnScreen() {
- return (
-
-
-
Lume is column based, each column is its own experience.
-
- To create a new column , you can
- click on the "Plus" icon at bottom right corner of this window.
-
-
Click to "Plus" icon
-
-
-
-
- Next
-
-
-
- );
-}
diff --git a/packages/ui/src/tutorial/router.tsx b/packages/ui/src/tutorial/router.tsx
deleted file mode 100644
index 33e05a55..00000000
--- a/packages/ui/src/tutorial/router.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { AnimatePresence } from "framer-motion";
-import {
- MemoryRouter,
- Route,
- Routes,
- UNSAFE_LocationContext,
-} from "react-router-dom";
-import { TutorialFinishScreen } from "./finish";
-import { TutorialManageColumnScreen } from "./manageColumn";
-import { TutorialNewColumnScreen } from "./newColumn";
-import { TutorialWelcomeScreen } from "./welcome";
-
-export function TutorialRouter() {
- return (
-
-
-
-
- } />
- } />
- }
- />
- } />
-
-
-
-
- );
-}
diff --git a/packages/ui/src/tutorial/welcome.tsx b/packages/ui/src/tutorial/welcome.tsx
deleted file mode 100644
index 48d99ee1..00000000
--- a/packages/ui/src/tutorial/welcome.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Link } from "react-router-dom";
-
-export function TutorialWelcomeScreen() {
- return (
-
-
-
- Welcome to your Home Screen. {" "}
- This is your personalized screen, which you can customize to you
- liking
-
-
Feel free to make adjustments as needed.
-
Let's take a few minutes to explore the features together.
-
-
-
-
- Next
-
-
-
- );
-}
diff --git a/packages/ui/src/unread.tsx b/packages/ui/src/unread.tsx
deleted file mode 100644
index d4dcc5fd..00000000
--- a/packages/ui/src/unread.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { activityUnreadAtom, compactNumber } from "@lume/utils";
-import { useAtomValue } from "jotai";
-
-export function UnreadActivity() {
- const total = useAtomValue(activityUnreadAtom);
-
- if (total <= 0) return null;
-
- return (
-
- {compactNumber.format(total)}
-
- );
-}
diff --git a/packages/ui/src/user.tsx b/packages/ui/src/user.tsx
deleted file mode 100644
index a33a653c..00000000
--- a/packages/ui/src/user.tsx
+++ /dev/null
@@ -1,607 +0,0 @@
-import { useProfile } from "@lume/ark";
-import { RepostIcon } from "@lume/icons";
-import { displayNpub, formatCreatedAt } from "@lume/utils";
-import * as Avatar from "@radix-ui/react-avatar";
-import { minidenticon } from "minidenticons";
-import { memo, useMemo } from "react";
-
-export const User = memo(function User({
- pubkey,
- time,
- variant = "default",
- subtext,
-}: {
- pubkey: string;
- time?: number;
- variant?:
- | "default"
- | "simple"
- | "mention"
- | "notify"
- | "notify2"
- | "repost"
- | "chat"
- | "large"
- | "thread"
- | "miniavatar"
- | "avatar"
- | "stacked"
- | "ministacked"
- | "childnote";
- subtext?: string;
-}) {
- const { isLoading, user } = useProfile(pubkey);
-
- const createdAt = useMemo(
- () => formatCreatedAt(time, variant === "chat"),
- [time, variant],
- );
- const fallbackName = useMemo(() => displayNpub(pubkey, 16), [pubkey]);
- const fallbackAvatar = useMemo(
- () =>
- `data:image/svg+xml;utf8,${encodeURIComponent(
- minidenticon(pubkey, 90, 50),
- )}`,
- [pubkey],
- );
-
- if (variant === "mention") {
- if (isLoading) {
- return (
-
-
-
-
-
-
- {fallbackName}
-
- ·
-
- {createdAt}
-
-
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
-
- {user?.name ||
- user?.display_name ||
- user?.displayName ||
- fallbackName}
-
- ·
-
- {createdAt}
-
-
-
- );
- }
-
- if (variant === "notify2") {
- if (isLoading) {
- return (
-
-
-
-
-
- {fallbackName}
-
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
-
- {user?.name ||
- user?.display_name ||
- user?.displayName ||
- fallbackName}
-
-
{subtext}
-
-
- );
- }
-
- if (variant === "notify") {
- if (isLoading) {
- return (
-
-
-
-
-
- {fallbackName}
-
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
- {user?.name ||
- user?.display_name ||
- user?.displayName ||
- fallbackName}
-
-
- );
- }
-
- if (variant === "large") {
- if (isLoading) {
- return (
-
- );
- }
-
- return (
-
-
- {user?.banner ? (
-
- ) : null}
-
-
-
-
-
-
-
-
-
-
- {user?.name || user?.display_name || user?.displayName}
-
-
- {user?.about || user?.bio || "No bio"}
-
-
-
-
- );
- }
-
- if (variant === "simple") {
- if (isLoading) {
- return (
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
-
- {user?.name || user?.display_name || user?.displayName}
-
-
- {user?.nip05 || user?.username || fallbackName}
-
-
-
- );
- }
-
- if (variant === "avatar") {
- if (isLoading) {
- return (
-
- );
- }
-
- return (
-
-
-
-
-
-
- );
- }
-
- if (variant === "miniavatar") {
- if (isLoading) {
- return (
-
- );
- }
-
- return (
-
-
-
-
-
-
- );
- }
-
- if (variant === "childnote") {
- if (isLoading) {
- return (
- <>
-
-
-
-
-
{fallbackName}
-
- {subtext}:
-
-
- >
- );
- }
-
- return (
- <>
-
-
-
-
-
-
-
-
- {user?.display_name ||
- user?.name ||
- user?.displayName ||
- fallbackName}{" "}
-
-
- {subtext}:
-
-
- >
- );
- }
-
- if (variant === "stacked") {
- if (isLoading) {
- return (
-
- );
- }
-
- return (
-
-
-
-
-
-
- );
- }
-
- if (variant === "ministacked") {
- if (isLoading) {
- return (
-
- );
- }
-
- return (
-
-
-
-
-
-
- );
- }
-
- if (variant === "repost") {
- if (isLoading) {
- return (
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
- {user?.name ||
- user?.display_name ||
- user?.displayName ||
- fallbackName}
-
- reposted
-
-
-
- );
- }
-
- if (variant === "thread") {
- if (isLoading) {
- return (
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
-
- {user?.name || user?.display_name || user?.displayName || "Anon"}
-
-
- {createdAt}
- ·
- {fallbackName}
-
-
-
- );
- }
-
- if (isLoading) {
- return (
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
-
- {user?.name ||
- user?.display_name ||
- user?.displayName ||
- fallbackName}
-
-
-
-
- );
-});
diff --git a/packages/ui/src/user/about.tsx b/packages/ui/src/user/about.tsx
new file mode 100644
index 00000000..8680cedb
--- /dev/null
+++ b/packages/ui/src/user/about.tsx
@@ -0,0 +1,12 @@
+import { cn } from "@lume/utils";
+import { useUserContext } from "./provider";
+
+export function UserAbout({ className }: { className?: string }) {
+ const user = useUserContext();
+
+ return (
+
+ {user.profile?.about?.trim() || "No bio"}
+
+ );
+}
diff --git a/packages/ui/src/user/avatar.tsx b/packages/ui/src/user/avatar.tsx
new file mode 100644
index 00000000..c1327b62
--- /dev/null
+++ b/packages/ui/src/user/avatar.tsx
@@ -0,0 +1,37 @@
+import { cn } from "@lume/utils";
+import * as Avatar from "@radix-ui/react-avatar";
+import { minidenticon } from "minidenticons";
+import { nanoid } from "nanoid";
+import { useMemo } from "react";
+import { useUserContext } from "./provider";
+
+export function UserAvatar({ className }: { className?: string }) {
+ const user = useUserContext();
+
+ const fallbackAvatar = useMemo(
+ () =>
+ `data:image/svg+xml;utf8,${encodeURIComponent(
+ minidenticon(user.pubkey || nanoid(), 90, 50),
+ )}`,
+ [user],
+ );
+
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/packages/ark/src/components/user/cover.tsx b/packages/ui/src/user/cover.tsx
similarity index 78%
rename from packages/ark/src/components/user/cover.tsx
rename to packages/ui/src/user/cover.tsx
index 79870241..5b07704e 100644
--- a/packages/ark/src/components/user/cover.tsx
+++ b/packages/ui/src/user/cover.tsx
@@ -15,17 +15,17 @@ export function UserCover({ className }: { className?: string }) {
);
}
- if (user && !user.banner) {
+ if (user && !user.profile.banner) {
return (
);
}
return (
{
+ setLoading(true);
+ if (!followed) {
+ const add = await ark.follow(user.pubkey);
+ if (add) setFollowed(true);
+ } else {
+ const remove = await ark.unfollow(user.pubkey);
+ if (remove) setFollowed(false);
+ }
+ setLoading(false);
+ };
+
+ useEffect(() => {
+ async function status() {
+ setLoading(true);
+
+ const contacts = await ark.get_contact_list();
+ if (contacts?.includes(user.pubkey)) {
+ setFollowed(true);
+ }
+
+ setLoading(false);
+ }
+ status();
+ }, []);
+
+ return (
+
+ {loading ? (
+
+ ) : followed ? (
+ t("user.unfollow")
+ ) : (
+ t("user.follow")
+ )}
+
+ );
+}
diff --git a/packages/ark/src/components/user/index.ts b/packages/ui/src/user/index.ts
similarity index 100%
rename from packages/ark/src/components/user/index.ts
rename to packages/ui/src/user/index.ts
diff --git a/packages/ui/src/user/name.tsx b/packages/ui/src/user/name.tsx
new file mode 100644
index 00000000..992c69fe
--- /dev/null
+++ b/packages/ui/src/user/name.tsx
@@ -0,0 +1,21 @@
+import { cn, displayNpub } from "@lume/utils";
+import { useUserContext } from "./provider";
+
+export function UserName({
+ className,
+ suffix,
+}: {
+ className?: string;
+ suffix?: string;
+}) {
+ const user = useUserContext();
+
+ return (
+
+ {user.profile?.display_name ||
+ user.profile?.name ||
+ displayNpub(user.pubkey, 16)}
+ {suffix}
+
+ );
+}
diff --git a/packages/ui/src/user/nip05.tsx b/packages/ui/src/user/nip05.tsx
new file mode 100644
index 00000000..9ec72d3a
--- /dev/null
+++ b/packages/ui/src/user/nip05.tsx
@@ -0,0 +1,33 @@
+import { VerifiedIcon } from "@lume/icons";
+import { cn, displayNpub } from "@lume/utils";
+import { useQuery } from "@tanstack/react-query";
+import { useUserContext } from "./provider";
+import { useArk } from "@lume/ark";
+
+export function UserNip05({ className }: { className?: string }) {
+ const ark = useArk();
+ const user = useUserContext();
+
+ const { isLoading, data: verified } = useQuery({
+ queryKey: ["nip05", user?.pubkey],
+ queryFn: async () => {
+ if (!user.profile?.nip05) return false;
+ const verify = await ark.verify_nip05(user.pubkey, user.profile?.nip05);
+ return verify;
+ },
+ enabled: !!user.profile,
+ });
+
+ return (
+
+
+ {!user.profile?.nip05
+ ? displayNpub(user.pubkey, 16)
+ : user.profile?.nip05.replace("_@", "")}
+
+ {!isLoading && verified ? (
+
+ ) : null}
+
+ );
+}
diff --git a/packages/ui/src/user/provider.tsx b/packages/ui/src/user/provider.tsx
new file mode 100644
index 00000000..dde81575
--- /dev/null
+++ b/packages/ui/src/user/provider.tsx
@@ -0,0 +1,31 @@
+import { useProfile } from "@lume/ark";
+import { Metadata } from "@lume/types";
+import { ReactNode, createContext, useContext } from "react";
+
+const UserContext = createContext<{
+ pubkey: string;
+ isError: boolean;
+ isLoading: boolean;
+ profile: Metadata;
+}>(null);
+
+export function UserProvider({
+ pubkey,
+ children,
+}: {
+ pubkey: string;
+ children: ReactNode;
+}) {
+ const { isLoading, isError, profile } = useProfile(pubkey);
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useUserContext() {
+ const context = useContext(UserContext);
+ return context;
+}
diff --git a/packages/ark/src/components/user/root.tsx b/packages/ui/src/user/root.tsx
similarity index 100%
rename from packages/ark/src/components/user/root.tsx
rename to packages/ui/src/user/root.tsx
diff --git a/packages/ui/src/user/time.tsx b/packages/ui/src/user/time.tsx
new file mode 100644
index 00000000..6e45c942
--- /dev/null
+++ b/packages/ui/src/user/time.tsx
@@ -0,0 +1,18 @@
+import { cn, formatCreatedAt } from "@lume/utils";
+import { useMemo } from "react";
+
+export function UserTime({
+ time,
+ className,
+}: {
+ time: number;
+ className?: string;
+}) {
+ const createdAt = useMemo(() => formatCreatedAt(time), [time]);
+
+ return (
+
+ {createdAt}
+
+ );
+}
diff --git a/packages/utils/index.ts b/packages/utils/index.ts
index d0bffed6..fbf46d79 100644
--- a/packages/utils/index.ts
+++ b/packages/utils/index.ts
@@ -1,10 +1,11 @@
export * from "./src/constants";
export * from "./src/delay";
export * from "./src/formater";
+export * from "./src/editor";
+export * from "./src/nip01";
export * from "./src/nip94";
export * from "./src/notification";
export * from "./src/hooks/useNetworkStatus";
export * from "./src/hooks/useOpenGraph";
export * from "./src/cn";
export * from "./src/image";
-export * from "./src/state";
diff --git a/packages/utils/package.json b/packages/utils/package.json
index 293852ba..c8400d71 100644
--- a/packages/utils/package.json
+++ b/packages/utils/package.json
@@ -8,18 +8,21 @@
"access": "public"
},
"dependencies": {
- "@tanstack/react-query": "^5.17.19",
+ "@tanstack/react-query": "^5.24.1",
"clsx": "^2.1.0",
"dayjs": "^1.11.10",
- "jotai": "^2.6.3",
- "nostr-tools": "1.17.0",
+ "nostr-tools": "^2.3.1",
"react": "^18.2.0",
- "tailwind-merge": "^2.2.1"
+ "react-dom": "^18.2.0",
+ "slate": "^0.101.5",
+ "slate-react": "^0.101.6"
},
"devDependencies": {
"@lume/tsconfig": "workspace:^",
"@lume/types": "workspace:^",
- "@types/react": "^18.2.48",
+ "@types/react": "^18.2.60",
+ "@types/react-dom": "^18.2.19",
+ "tailwind-merge": "^2.2.1",
"typescript": "^5.3.3"
}
}
diff --git a/packages/ui/src/editor/utils.ts b/packages/utils/src/editor.ts
similarity index 83%
rename from packages/ui/src/editor/utils.ts
rename to packages/utils/src/editor.ts
index 66bf33ee..521a6e7a 100644
--- a/packages/ui/src/editor/utils.ts
+++ b/packages/utils/src/editor.ts
@@ -1,8 +1,8 @@
-import { NDKCacheUserProfile } from "@lume/types";
-import { ReactNode } from "react";
import ReactDOM from "react-dom";
+import { ReactNode } from "react";
import { BaseEditor, Transforms } from "slate";
import { ReactEditor } from "slate-react";
+import { Contact } from "@lume/types";
export const Portal = ({ children }: { children?: ReactNode }) => {
return typeof document === "object"
@@ -10,6 +10,13 @@ export const Portal = ({ children }: { children?: ReactNode }) => {
: null;
};
+export const isImagePath = (path: string) => {
+ for (const suffix of ["jpg", "jpeg", "gif", "png", "webp", "avif", "tiff"]) {
+ if (path.endsWith(suffix)) return true;
+ }
+ return false;
+};
+
export const isImageUrl = (url: string) => {
try {
if (!url) return false;
@@ -44,13 +51,13 @@ export const insertImage = (editor: ReactEditor | BaseEditor, url: string) => {
export const insertMention = (
editor: ReactEditor | BaseEditor,
- contact: NDKCacheUserProfile,
+ contact: Contact,
) => {
const text = { text: "" };
const mention = {
type: "mention",
- npub: `nostr:${contact.npub}`,
- name: contact.name || contact.displayName || "anon",
+ npub: `nostr:${contact.pubkey}`,
+ name: contact.profile.name || contact.profile.display_name || "anon",
children: [text],
};
const extraText = [
diff --git a/packages/utils/src/hooks/useOpenGraph.ts b/packages/utils/src/hooks/useOpenGraph.ts
index 78a88ebe..57fea68a 100644
--- a/packages/utils/src/hooks/useOpenGraph.ts
+++ b/packages/utils/src/hooks/useOpenGraph.ts
@@ -6,11 +6,12 @@ export function useOpenGraph(url: string) {
const { isLoading, isError, data } = useQuery({
queryKey: ["opg", url],
queryFn: async () => {
- const res: Opengraph = await invoke("fetch_opg", { url });
- if (!res) {
+ try {
+ const res: Opengraph = await invoke("fetch_opg", { url });
+ return res;
+ } catch {
throw new Error("fetch preview failed");
}
- return res;
},
staleTime: Infinity,
refetchOnWindowFocus: false,
diff --git a/packages/utils/src/nip01.ts b/packages/utils/src/nip01.ts
new file mode 100644
index 00000000..b165bd1e
--- /dev/null
+++ b/packages/utils/src/nip01.ts
@@ -0,0 +1,96 @@
+import { nip19 } from "nostr-tools";
+import { EventPointer, ProfilePointer } from "nostr-tools/lib/types/nip19";
+
+// Borrow from NDK
+// https://github.com/nostr-dev-kit/ndk/blob/master/ndk/src/events/content-tagger.ts
+export async function generateContentTags(content: string) {
+ let promises: Promise[] = [];
+ let tags: string[][] = [];
+
+ const tagRegex = /(@|nostr:)(npub|nprofile|note|nevent|naddr)[a-zA-Z0-9]+/g;
+ const hashtagRegex = /#(\w+)/g;
+
+ const addTagIfNew = (t: string[]) => {
+ if (!tags.find((t2) => t2[0] === t[0] && t2[1] === t[1])) {
+ tags.push(t);
+ }
+ };
+
+ content = content.replace(tagRegex, (tag) => {
+ try {
+ const entity = tag.split(/(@|nostr:)/)[2];
+ const { type, data } = nip19.decode(entity);
+ let t: string[] | undefined;
+
+ switch (type) {
+ case "npub":
+ t = ["p", data as string];
+ break;
+ case "nprofile":
+ t = ["p", (data as ProfilePointer).pubkey as string];
+ break;
+ case "note":
+ promises.push(
+ new Promise(async (resolve) => {
+ addTagIfNew(["e", data, "", "mention"]);
+ resolve();
+ }),
+ );
+ break;
+ case "nevent":
+ promises.push(
+ new Promise(async (resolve) => {
+ let { id, relays, author } = data as EventPointer;
+
+ // If the nevent doesn't have a relay specified, try to get one
+ if (!relays || relays.length === 0) {
+ relays = [""];
+ }
+
+ addTagIfNew(["e", id, relays[0], "mention"]);
+ if (author) addTagIfNew(["p", author]);
+ resolve();
+ }),
+ );
+ break;
+ case "naddr":
+ promises.push(
+ new Promise(async (resolve) => {
+ const id = [data.kind, data.pubkey, data.identifier].join(":");
+ let relays = data.relays ?? [];
+
+ // If the naddr doesn't have a relay specified, try to get one
+ if (relays.length === 0) {
+ relays = [""];
+ }
+
+ addTagIfNew(["a", id, relays[0], "mention"]);
+ addTagIfNew(["p", data.pubkey]);
+ resolve();
+ }),
+ );
+ break;
+ default:
+ return tag;
+ }
+
+ if (t) addTagIfNew(t);
+
+ return `nostr:${entity}`;
+ } catch (error) {
+ return tag;
+ }
+ });
+
+ await Promise.all(promises);
+
+ content = content.replace(hashtagRegex, (tag, word) => {
+ const t: string[] = ["t", word];
+ if (!tags.find((t2) => t2[0] === t[0] && t2[1] === t[1])) {
+ tags.push(t);
+ }
+ return tag; // keep the original tag in the content
+ });
+
+ return { content, tags };
+}
diff --git a/packages/utils/src/state.ts b/packages/utils/src/state.ts
deleted file mode 100644
index 682b42a5..00000000
--- a/packages/utils/src/state.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { atom } from "jotai";
-import { atomWithStorage } from "jotai/utils";
-
-// Editor
-export const editorAtom = atom(false);
-export const editorValueAtom = atom([
- {
- type: "paragraph",
- children: [{ text: "" }],
- },
-]);
-
-// Onboarding
-export const onboardingAtom = atomWithStorage("onboarding", {
- open: true,
- newUser: false,
-});
-
-// Activity
-export const activityAtom = atom(false);
-export const activityUnreadAtom = atom(0);
-
-// Tutorial
-export const tutorialAtom = atomWithStorage("tutorial", true);
-
-// Search
-export const searchAtom = atom(false);
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index bd22178c..35651261 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -9,204 +9,123 @@ importers:
.:
dependencies:
'@tauri-apps/api':
- specifier: 2.0.0-alpha.14
- version: 2.0.0-alpha.14
+ specifier: 2.0.0-beta.3
+ version: 2.0.0-beta.3
'@tauri-apps/plugin-autostart':
- specifier: 2.0.0-alpha.5
- version: 2.0.0-alpha.5
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
'@tauri-apps/plugin-clipboard-manager':
- specifier: 2.0.0-alpha.5
- version: 2.0.0-alpha.5
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
'@tauri-apps/plugin-dialog':
- specifier: 2.0.0-alpha.5
- version: 2.0.0-alpha.5
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
'@tauri-apps/plugin-fs':
- specifier: 2.0.0-alpha.6
- version: 2.0.0-alpha.6
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
'@tauri-apps/plugin-http':
- specifier: 2.0.0-alpha.6
- version: 2.0.0-alpha.6
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
'@tauri-apps/plugin-notification':
- specifier: 2.0.0-alpha.5
- version: 2.0.0-alpha.5
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
'@tauri-apps/plugin-os':
- specifier: 2.0.0-alpha.6
- version: 2.0.0-alpha.6
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
'@tauri-apps/plugin-process':
- specifier: 2.0.0-alpha.5
- version: 2.0.0-alpha.5
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
'@tauri-apps/plugin-shell':
- specifier: 2.0.0-alpha.5
- version: 2.0.0-alpha.5
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
'@tauri-apps/plugin-sql':
- specifier: 2.0.0-alpha.5
- version: 2.0.0-alpha.5
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
'@tauri-apps/plugin-updater':
- specifier: 2.0.0-alpha.5
- version: 2.0.0-alpha.5
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
'@tauri-apps/plugin-upload':
- specifier: 2.0.0-alpha.5
- version: 2.0.0-alpha.5
- million:
- specifier: ^2.6.4
- version: 2.6.4
+ specifier: 2.0.0-beta.1
+ version: 2.0.0-beta.1
devDependencies:
'@biomejs/biome':
specifier: ^1.5.3
version: 1.5.3
'@tauri-apps/cli':
- specifier: 2.0.0-alpha.21
- version: 2.0.0-alpha.21
+ specifier: 2.0.0-beta.4
+ version: 2.0.0-beta.4
turbo:
- specifier: ^1.11.3
- version: 1.11.3
+ specifier: ^1.12.4
+ version: 1.12.4
- apps/desktop:
+ apps/desktop2:
dependencies:
- '@columns/antenas':
- specifier: workspace:^
- version: link:../../packages/lume-column-antenas
- '@columns/default':
- specifier: workspace:^
- version: link:../../packages/lume-column-default
- '@columns/foryou':
- specifier: workspace:^
- version: link:../../packages/lume-column-foryou
- '@columns/global':
- specifier: workspace:^
- version: link:../../packages/lume-column-global
- '@columns/group':
- specifier: workspace:^
- version: link:../../packages/lume-column-group
- '@columns/hashtag':
- specifier: workspace:^
- version: link:../../packages/lume-column-hashtag
- '@columns/thread':
- specifier: workspace:^
- version: link:../../packages/lume-column-thread
- '@columns/timeline':
- specifier: workspace:^
- version: link:../../packages/lume-column-timeline
- '@columns/trending-notes':
- specifier: workspace:^
- version: link:../../packages/lume-column-trending-notes
- '@columns/user':
- specifier: workspace:^
- version: link:../../packages/lume-column-user
- '@columns/waifu':
- specifier: workspace:^
- version: link:../../packages/lume-column-waifu
- '@getalby/sdk':
- specifier: ^3.2.3
- version: 3.2.3(typescript@5.3.3)
'@lume/ark':
specifier: workspace:^
version: link:../../packages/ark
'@lume/icons':
specifier: workspace:^
version: link:../../packages/icons
- '@lume/storage':
- specifier: workspace:^
- version: link:../../packages/storage
'@lume/ui':
specifier: workspace:^
version: link:../../packages/ui
'@lume/utils':
specifier: workspace:^
version: link:../../packages/utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
- '@radix-ui/react-accordion':
- specifier: ^1.1.2
- version: 1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-alert-dialog':
- specifier: ^1.0.5
- version: 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-avatar':
- specifier: ^1.0.4
- version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-checkbox':
specifier: ^1.0.4
- version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-collapsible':
specifier: ^1.0.3
- version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-dialog':
- specifier: ^1.0.5
- version: 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dropdown-menu':
specifier: ^2.0.6
- version: 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-hover-card':
- specifier: ^1.0.7
- version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 2.0.6(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-popover':
specifier: ^1.0.7
- version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-select':
- specifier: ^2.0.0
- version: 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-switch':
- specifier: ^1.0.3
- version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-tooltip':
- specifier: ^1.0.7
- version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.7(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@tanstack/query-sync-storage-persister':
+ specifier: ^5.24.1
+ version: 5.24.1
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
- framer-motion:
- specifier: ^11.0.3
- version: 11.0.3(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
+ '@tanstack/react-query-persist-client':
+ specifier: ^5.24.1
+ version: 5.24.1(@tanstack/react-query@5.24.1)(react@18.2.0)
+ '@tanstack/react-router':
+ specifier: ^1.17.4
+ version: 1.17.4(react-dom@18.2.0)(react@18.2.0)
i18next:
- specifier: ^23.8.1
- version: 23.8.1
+ specifier: ^23.10.0
+ version: 23.10.0
i18next-resources-to-backend:
specifier: ^1.2.0
version: 1.2.0
- jotai:
- specifier: ^2.6.3
- version: 2.6.3(@types/react@18.2.48)(react@18.2.0)
- minidenticons:
- specifier: ^4.2.0
- version: 4.2.0
- nanoid:
- specifier: ^5.0.4
- version: 5.0.4
- nostr-fetch:
- specifier: ^0.15.0
- version: 0.15.0
nostr-tools:
- specifier: ^1.17.0
- version: 1.17.0(typescript@5.3.3)
+ specifier: ^2.3.1
+ version: 2.3.1(typescript@5.3.3)
react:
specifier: ^18.2.0
version: 18.2.0
- react-currency-input-field:
- specifier: ^3.6.14
- version: 3.6.14(react@18.2.0)
react-dom:
specifier: ^18.2.0
version: 18.2.0(react@18.2.0)
- react-hook-form:
- specifier: ^7.49.3
- version: 7.49.3(react@18.2.0)
react-i18next:
- specifier: ^14.0.1
- version: 14.0.1(i18next@23.8.1)(react-dom@18.2.0)(react@18.2.0)
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
- smol-toml:
- specifier: ^1.1.4
- version: 1.1.4
+ specifier: ^14.0.5
+ version: 14.0.5(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0)
+ slate:
+ specifier: ^0.101.5
+ version: 0.101.5
+ slate-react:
+ specifier: ^0.101.6
+ version: 0.101.6(react-dom@18.2.0)(react@18.2.0)(slate@0.101.5)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -217,30 +136,27 @@ importers:
'@lume/types':
specifier: workspace:^
version: link:../../packages/types
- '@types/node':
- specifier: ^20.11.10
- version: 20.11.10
+ '@tanstack/router-devtools':
+ specifier: ^1.17.4
+ version: 1.17.4(csstype@3.1.3)(react-dom@18.2.0)(react@18.2.0)
+ '@tanstack/router-vite-plugin':
+ specifier: ^1.16.5
+ version: 1.16.5
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
'@types/react-dom':
- specifier: ^18.2.18
- version: 18.2.18
+ specifier: ^18.2.19
+ version: 18.2.19
'@vitejs/plugin-react-swc':
- specifier: ^3.5.0
- version: 3.5.0(vite@5.0.12)
+ specifier: ^3.6.0
+ version: 3.6.0(vite@5.1.4)
autoprefixer:
specifier: ^10.4.17
- version: 10.4.17(postcss@8.4.33)
- cross-env:
- specifier: ^7.0.3
- version: 7.0.3
- encoding:
- specifier: ^0.1.13
- version: 0.1.13
+ version: 10.4.17(postcss@8.4.35)
postcss:
- specifier: ^8.4.33
- version: 8.4.33
+ specifier: ^8.4.35
+ version: 8.4.35
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -248,14 +164,14 @@ importers:
specifier: ^5.3.3
version: 5.3.3
vite:
- specifier: ^5.0.12
- version: 5.0.12(@types/node@20.11.10)
+ specifier: ^5.1.4
+ version: 5.1.4
vite-plugin-top-level-await:
specifier: ^1.4.1
- version: 1.4.1(vite@5.0.12)
+ version: 1.4.1(vite@5.1.4)
vite-tsconfig-paths:
specifier: ^4.3.1
- version: 4.3.1(typescript@5.3.3)(vite@5.0.12)
+ version: 4.3.1(typescript@5.3.3)(vite@5.1.4)
apps/web:
dependencies:
@@ -264,19 +180,19 @@ importers:
version: 0.4.1(typescript@5.3.3)
'@astrojs/tailwind':
specifier: ^5.1.0
- version: 5.1.0(astro@4.2.6)(tailwindcss@3.4.1)
+ version: 5.1.0(astro@4.4.6)(tailwindcss@3.4.1)
'@fontsource/geist-mono':
specifier: ^5.0.1
version: 5.0.1
astro:
- specifier: ^4.2.6
- version: 4.2.6(typescript@5.3.3)
+ specifier: ^4.4.6
+ version: 4.4.6(typescript@5.3.3)
astro-seo-meta:
specifier: ^4.1.0
- version: 4.1.0(astro@4.2.6)
+ version: 4.1.0(astro@4.4.6)
astro-seo-schema:
specifier: ^4.0.0
- version: 4.0.0(astro@4.2.6)(schema-dts@1.1.2)
+ version: 4.0.0(astro@4.4.6)(schema-dts@1.1.2)
schema-dts:
specifier: ^1.1.2
version: 1.1.2(typescript@5.3.3)
@@ -294,77 +210,50 @@ importers:
packages/ark:
dependencies:
'@getalby/sdk':
- specifier: ^3.2.3
- version: 3.2.3(typescript@5.3.3)
+ specifier: ^3.3.1
+ version: 3.3.1(typescript@5.3.3)
'@lume/icons':
specifier: workspace:^
version: link:../icons
- '@lume/ndk-cache-tauri':
- specifier: workspace:^
- version: link:../ndk-cache-tauri
- '@lume/storage':
- specifier: workspace:^
- version: link:../storage
'@lume/utils':
specifier: workspace:^
version: link:../utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
- '@nostr-fetch/adapter-ndk':
- specifier: ^0.15.0
- version: 0.15.0(@nostr-dev-kit/ndk@2.3.3)(nostr-fetch@0.15.0)
'@radix-ui/react-avatar':
specifier: ^1.0.4
- version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.4(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-collapsible':
specifier: ^1.0.3
- version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dialog':
specifier: ^1.0.5
- version: 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.5(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dropdown-menu':
specifier: ^2.0.6
- version: 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 2.0.6(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-hover-card':
specifier: ^1.0.7
- version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.7(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-popover':
specifier: ^1.0.7
- version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.7(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-tooltip':
specifier: ^1.0.7
- version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.7(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
get-urls:
specifier: ^12.1.0
version: 12.1.0
- jotai:
- specifier: ^2.6.3
- version: 2.6.3(@types/react@18.2.48)(react@18.2.0)
- linkify-react:
- specifier: ^4.1.3
- version: 4.1.3(linkifyjs@4.1.3)(react@18.2.0)
- linkifyjs:
- specifier: ^4.1.3
- version: 4.1.3
media-chrome:
- specifier: ^2.1.0
- version: 2.1.0
+ specifier: ^2.2.5
+ version: 2.2.5
minidenticons:
specifier: ^4.2.0
version: 4.2.0
nanoid:
- specifier: ^5.0.4
- version: 5.0.4
- nostr-fetch:
- specifier: ^0.15.0
- version: 0.15.0
- nostr-tools:
- specifier: 1.17.0
- version: 1.17.0(typescript@5.3.3)
+ specifier: ^5.0.6
+ version: 5.0.6
qrcode.react:
specifier: ^3.1.0
version: 3.1.0(react@18.2.0)
@@ -375,32 +264,23 @@ importers:
specifier: ^18.2.0
version: 18.2.0
react-currency-input-field:
- specifier: ^3.6.14
- version: 3.6.14(react@18.2.0)
+ specifier: ^3.8.0
+ version: 3.8.0(react@18.2.0)
react-i18next:
- specifier: ^14.0.1
- version: 14.0.1(i18next@23.8.1)(react-dom@18.2.0)(react@18.2.0)
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^14.0.5
+ version: 14.0.5(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0)
react-string-replace:
specifier: ^1.1.1
version: 1.1.1
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
string-strip-html:
- specifier: ^13.4.5
- version: 13.4.5
- tippy.js:
- specifier: ^6.3.7
- version: 6.3.7
- use-context-selector:
- specifier: ^1.4.1
- version: 1.4.1(react-dom@18.2.0)(react@18.2.0)(scheduler@0.23.0)
+ specifier: ^13.4.6
+ version: 13.4.6
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -412,11 +292,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
- tailwind-merge:
- specifier: ^2.2.1
- version: 2.2.1
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -434,8 +311,8 @@ importers:
specifier: workspace:*
version: link:../tsconfig
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
typescript:
specifier: ^5.3.3
version: 5.3.3
@@ -454,24 +331,18 @@ importers:
'@lume/utils':
specifier: workspace:^
version: link:../utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -483,8 +354,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -506,24 +377,18 @@ importers:
'@lume/utils':
specifier: workspace:^
version: link:../utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -535,8 +400,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -552,33 +417,24 @@ importers:
'@lume/icons':
specifier: workspace:^
version: link:../icons
- '@lume/storage':
- specifier: workspace:^
- version: link:../storage
'@lume/ui':
specifier: workspace:^
version: link:../ui
'@lume/utils':
specifier: workspace:^
version: link:../utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -590,8 +446,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -613,24 +469,18 @@ importers:
'@lume/utils':
specifier: workspace:^
version: link:../utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -642,8 +492,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -665,24 +515,18 @@ importers:
'@lume/utils':
specifier: workspace:^
version: link:../utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -694,8 +538,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -717,24 +561,18 @@ importers:
'@lume/utils':
specifier: workspace:^
version: link:../utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -746,8 +584,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -769,24 +607,18 @@ importers:
'@lume/utils':
specifier: workspace:^
version: link:../utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -798,8 +630,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -821,24 +653,18 @@ importers:
'@lume/utils':
specifier: workspace:^
version: link:../utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -850,8 +676,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -873,24 +699,18 @@ importers:
'@lume/utils':
specifier: workspace:^
version: link:../utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -902,8 +722,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -925,24 +745,18 @@ importers:
'@lume/utils':
specifier: workspace:^
version: link:../utils
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -954,8 +768,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -978,14 +792,11 @@ importers:
specifier: workspace:^
version: link:../utils
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
- react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -997,8 +808,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -1006,68 +817,11 @@ importers:
specifier: ^5.3.3
version: 5.3.3
- packages/ndk-cache-tauri:
- dependencies:
- '@lume/storage':
- specifier: workspace:*
- version: link:../storage
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
- lru-cache:
- specifier: ^10.2.0
- version: 10.2.0
- nostr-fetch:
- specifier: ^0.15.0
- version: 0.15.0
- nostr-tools:
- specifier: 1.17.0
- version: 1.17.0(typescript@5.3.3)
- react:
- specifier: ^18.2.0
- version: 18.2.0
- devDependencies:
- '@lume/tsconfig':
- specifier: workspace:*
- version: link:../tsconfig
- '@types/react':
- specifier: ^18.2.48
- version: 18.2.48
- typescript:
- specifier: ^5.3.3
- version: 5.3.3
-
- packages/storage:
- dependencies:
- nostr-tools:
- specifier: ~1.17.0
- version: 1.17.0(typescript@5.3.3)
- react:
- specifier: ^18.2.0
- version: 18.2.0
- devDependencies:
- '@lume/tsconfig':
- specifier: workspace:*
- version: link:../tsconfig
- '@lume/types':
- specifier: workspace:*
- version: link:../types
- '@lume/utils':
- specifier: workspace:^
- version: link:../utils
- '@types/react':
- specifier: ^18.2.48
- version: 18.2.48
- typescript:
- specifier: ^5.3.3
- version: 5.3.3
-
packages/tailwindcss:
- dependencies:
+ devDependencies:
'@evilmartians/harmony':
specifier: ^1.2.0
version: 1.2.0
- devDependencies:
'@tailwindcss/forms':
specifier: ^0.5.7
version: 0.5.7(tailwindcss@3.4.1)
@@ -1075,8 +829,8 @@ importers:
specifier: ^0.5.10
version: 0.5.10(tailwindcss@3.4.1)
tailwind-scrollbar:
- specifier: ^3.0.5
- version: 3.0.5(tailwindcss@3.4.1)
+ specifier: ^3.1.0
+ version: 3.1.0(tailwindcss@3.4.1)
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -1084,10 +838,6 @@ importers:
packages/tsconfig: {}
packages/types:
- dependencies:
- '@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
devDependencies:
typescript:
specifier: ^5.3.3
@@ -1095,78 +845,99 @@ importers:
packages/ui:
dependencies:
- '@dnd-kit/core':
- specifier: ^6.1.0
- version: 6.1.0(react-dom@18.2.0)(react@18.2.0)
+ '@getalby/sdk':
+ specifier: ^3.3.1
+ version: 3.3.1(typescript@5.3.3)
'@lume/ark':
specifier: workspace:^
version: link:../ark
'@lume/icons':
specifier: workspace:^
version: link:../icons
- '@lume/storage':
- specifier: workspace:^
- version: link:../storage
'@lume/utils':
specifier: workspace:^
version: link:../utils
'@nostr-dev-kit/ndk':
- specifier: ^2.3.3
- version: 2.3.3(typescript@5.3.3)
+ specifier: ^2.5.0
+ version: 2.5.0(typescript@5.3.3)
'@radix-ui/react-accordion':
specifier: ^1.1.2
- version: 1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.1.2(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-alert-dialog':
specifier: ^1.0.5
- version: 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.5(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-avatar':
specifier: ^1.0.4
- version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.4(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-collapsible':
+ specifier: ^1.0.3
+ version: 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dialog':
specifier: ^1.0.5
- version: 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.5(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dropdown-menu':
specifier: ^2.0.6
- version: 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 2.0.6(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-hover-card':
specifier: ^1.0.7
- version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.7(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-popover':
specifier: ^1.0.7
- version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.7(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-tooltip':
+ specifier: ^1.0.7
+ version: 1.0.7(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
+ '@tanstack/react-router':
+ specifier: ^1.17.4
+ version: 1.17.4(react-dom@18.2.0)(react@18.2.0)
framer-motion:
- specifier: ^11.0.3
- version: 11.0.3(react-dom@18.2.0)(react@18.2.0)
- jotai:
- specifier: ^2.6.3
- version: 2.6.3(@types/react@18.2.48)(react@18.2.0)
+ specifier: ^11.0.6
+ version: 11.0.6(react-dom@18.2.0)(react@18.2.0)
+ get-urls:
+ specifier: ^12.1.0
+ version: 12.1.0
+ media-chrome:
+ specifier: ^2.2.5
+ version: 2.2.5
minidenticons:
specifier: ^4.2.0
version: 4.2.0
- nostr-tools:
- specifier: ~1.17.0
- version: 1.17.0(typescript@5.3.3)
+ nanoid:
+ specifier: ^5.0.6
+ version: 5.0.6
+ qrcode.react:
+ specifier: ^3.1.0
+ version: 3.1.0(react@18.2.0)
+ re-resizable:
+ specifier: ^6.9.11
+ version: 6.9.11(react-dom@18.2.0)(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
+ react-currency-input-field:
+ specifier: ^3.8.0
+ version: 3.8.0(react@18.2.0)
react-dom:
specifier: ^18.2.0
version: 18.2.0(react@18.2.0)
react-hook-form:
- specifier: ^7.49.3
- version: 7.49.3(react@18.2.0)
+ specifier: ^7.50.1
+ version: 7.50.1(react@18.2.0)
react-hotkeys-hook:
- specifier: ^4.4.4
- version: 4.4.4(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^4.5.0
+ version: 4.5.0(react-dom@18.2.0)(react@18.2.0)
react-i18next:
- specifier: ^14.0.1
- version: 14.0.1(i18next@23.8.1)(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^14.0.5
+ version: 14.0.5(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0)
react-router-dom:
- specifier: ^6.21.3
- version: 6.21.3(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^6.22.2
+ version: 6.22.2(react-dom@18.2.0)(react@18.2.0)
+ react-string-replace:
+ specifier: ^1.1.1
+ version: 1.1.1
slate:
specifier: ^0.101.5
version: 0.101.5
@@ -1174,8 +945,11 @@ importers:
specifier: ^0.101.6
version: 0.101.6(react-dom@18.2.0)(react@18.2.0)(slate@0.101.5)
sonner:
- specifier: ^1.4.0
- version: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@18.2.0)(react@18.2.0)
+ string-strip-html:
+ specifier: ^13.4.6
+ version: 13.4.6
uqr:
specifier: ^0.1.2
version: 0.1.2
@@ -1183,8 +957,8 @@ importers:
specifier: ^10.0.0
version: 10.0.0(react@18.2.0)
virtua:
- specifier: ^0.23.0
- version: 0.23.0(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^0.27.5
+ version: 0.27.5(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@lume/tailwindcss':
specifier: workspace:^
@@ -1196,11 +970,8 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
- tailwind-merge:
- specifier: ^2.2.1
- version: 2.2.1
+ specifier: ^18.2.60
+ version: 18.2.60
tailwindcss:
specifier: ^3.4.1
version: 3.4.1
@@ -1211,26 +982,29 @@ importers:
packages/utils:
dependencies:
'@tanstack/react-query':
- specifier: ^5.17.19
- version: 5.17.19(react@18.2.0)
+ specifier: ^5.24.1
+ version: 5.24.1(react@18.2.0)
clsx:
specifier: ^2.1.0
version: 2.1.0
dayjs:
specifier: ^1.11.10
version: 1.11.10
- jotai:
- specifier: ^2.6.3
- version: 2.6.3(@types/react@18.2.48)(react@18.2.0)
nostr-tools:
- specifier: 1.17.0
- version: 1.17.0(typescript@5.3.3)
+ specifier: ^2.3.1
+ version: 2.3.1(typescript@5.3.3)
react:
specifier: ^18.2.0
version: 18.2.0
- tailwind-merge:
- specifier: ^2.2.1
- version: 2.2.1
+ react-dom:
+ specifier: ^18.2.0
+ version: 18.2.0(react@18.2.0)
+ slate:
+ specifier: ^0.101.5
+ version: 0.101.5
+ slate-react:
+ specifier: ^0.101.6
+ version: 0.101.6(react-dom@18.2.0)(react@18.2.0)(slate@0.101.5)
devDependencies:
'@lume/tsconfig':
specifier: workspace:^
@@ -1239,8 +1013,14 @@ importers:
specifier: workspace:^
version: link:../types
'@types/react':
- specifier: ^18.2.48
- version: 18.2.48
+ specifier: ^18.2.60
+ version: 18.2.60
+ '@types/react-dom':
+ specifier: ^18.2.19
+ version: 18.2.19
+ tailwind-merge:
+ specifier: ^2.2.1
+ version: 2.2.1
typescript:
specifier: ^5.3.3
version: 5.3.3
@@ -1255,8 +1035,8 @@ packages:
resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
engines: {node: '>=6.0.0'}
dependencies:
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.22
+ '@jridgewell/gen-mapping': 0.3.4
+ '@jridgewell/trace-mapping': 0.3.23
dev: false
/@astrojs/check@0.4.1(typescript@5.3.3):
@@ -1265,8 +1045,8 @@ packages:
peerDependencies:
typescript: ^5.0.0
dependencies:
- '@astrojs/language-server': 2.6.2(typescript@5.3.3)
- chokidar: 3.5.3
+ '@astrojs/language-server': 2.7.6(typescript@5.3.3)
+ chokidar: 3.6.0
fast-glob: 3.3.2
kleur: 4.1.5
typescript: 5.3.3
@@ -1276,16 +1056,16 @@ packages:
- prettier-plugin-astro
dev: false
- /@astrojs/compiler@2.5.1:
- resolution: {integrity: sha512-o2hKiFJXZOm1Gov+RGXSWnKlnb/UF7KRTx/Y2uazYe3+MrLY+sqLN+yB4EH2bElc0l1K9cDb4mZSejuq563rGQ==}
+ /@astrojs/compiler@2.6.0:
+ resolution: {integrity: sha512-c74k8iGHL3DzkosSJ0tGcHIEBEiIfBhr7eadSaPyvWlVKaieDVzVs8OW1tnRSQyBsfMc8DZQ4RcN2KAcESD8UQ==}
dev: false
/@astrojs/internal-helpers@0.2.1:
resolution: {integrity: sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==}
dev: false
- /@astrojs/language-server@2.6.2(typescript@5.3.3):
- resolution: {integrity: sha512-RYzPRhS/WBXK5JtfR+0+nGj+N3VbJd5jU/uSNUev9baUx/RLmUwDk1f6Oy8QDEfDDLAr76Ig8YeDD/nxPdBSLw==}
+ /@astrojs/language-server@2.7.6(typescript@5.3.3):
+ resolution: {integrity: sha512-NhMSmMAuKBMXnvpfn9eYPR7R6zOasAjRb+ta8L+rCHHuKzUc0lBgAF5M6rx01FJqlpGqeqao13eYt4287Ze49g==}
hasBin: true
peerDependencies:
prettier: ^3.0.0
@@ -1296,30 +1076,28 @@ packages:
prettier-plugin-astro:
optional: true
dependencies:
- '@astrojs/compiler': 2.5.1
+ '@astrojs/compiler': 2.6.0
'@jridgewell/sourcemap-codec': 1.4.15
- '@volar/kit': 1.11.1(typescript@5.3.3)
- '@volar/language-core': 1.11.1
- '@volar/language-server': 1.11.1
- '@volar/language-service': 1.11.1
- '@volar/source-map': 1.11.1
- '@volar/typescript': 1.11.1
+ '@volar/kit': 2.0.4(typescript@5.3.3)
+ '@volar/language-core': 2.0.4
+ '@volar/language-server': 2.0.4
+ '@volar/language-service': 2.0.4
+ '@volar/typescript': 2.0.4
fast-glob: 3.3.2
- muggle-string: 0.3.1
- volar-service-css: 0.0.17(@volar/language-service@1.11.1)
- volar-service-emmet: 0.0.17(@volar/language-service@1.11.1)
- volar-service-html: 0.0.17(@volar/language-service@1.11.1)
- volar-service-prettier: 0.0.17(@volar/language-service@1.11.1)
- volar-service-typescript: 0.0.17(@volar/language-service@1.11.1)(@volar/typescript@1.11.1)
- volar-service-typescript-twoslash-queries: 0.0.17(@volar/language-service@1.11.1)
+ volar-service-css: 0.0.30(@volar/language-service@2.0.4)
+ volar-service-emmet: 0.0.30(@volar/language-service@2.0.4)
+ volar-service-html: 0.0.30(@volar/language-service@2.0.4)
+ volar-service-prettier: 0.0.30(@volar/language-service@2.0.4)
+ volar-service-typescript: 0.0.30(@volar/language-service@2.0.4)(@volar/typescript@2.0.4)
+ volar-service-typescript-twoslash-queries: 0.0.30(@volar/language-service@2.0.4)
vscode-html-languageservice: 5.1.2
vscode-uri: 3.0.8
transitivePeerDependencies:
- typescript
dev: false
- /@astrojs/markdown-remark@4.2.0:
- resolution: {integrity: sha512-qQB+LoxmIqzkhLXaQAzfzlBxZU1jeQYailsifurz89WeY0Q8ywIj8uQQSyqxb7rPPg3ZfdNdxsN9lF5UaCRn0w==}
+ /@astrojs/markdown-remark@4.2.1:
+ resolution: {integrity: sha512-2RQBIwrq+2qPYtp99bH+eL5hfbK0BoxXla85lHsRpIX/IsGqFrPX6pXI2cbWPihBwGbKCdxS6uZNX2QerZWwpQ==}
dependencies:
'@astrojs/prism': 3.0.0
github-slugger: 2.0.0
@@ -1346,16 +1124,16 @@ packages:
prismjs: 1.29.0
dev: false
- /@astrojs/tailwind@5.1.0(astro@4.2.6)(tailwindcss@3.4.1):
+ /@astrojs/tailwind@5.1.0(astro@4.4.6)(tailwindcss@3.4.1):
resolution: {integrity: sha512-BJoCDKuWhU9FT2qYg+fr6Nfb3qP4ShtyjXGHKA/4mHN94z7BGcmauQK23iy+YH5qWvTnhqkd6mQPQ1yTZTe9Ig==}
peerDependencies:
astro: ^3.0.0 || ^4.0.0
tailwindcss: ^3.0.24
dependencies:
- astro: 4.2.6(typescript@5.3.3)
- autoprefixer: 10.4.17(postcss@8.4.33)
- postcss: 8.4.33
- postcss-load-config: 4.0.2(postcss@8.4.33)
+ astro: 4.4.6(typescript@5.3.3)
+ autoprefixer: 10.4.17(postcss@8.4.35)
+ postcss: 8.4.35
+ postcss-load-config: 4.0.2(postcss@8.4.35)
tailwindcss: 3.4.1
transitivePeerDependencies:
- ts-node
@@ -1389,20 +1167,20 @@ packages:
engines: {node: '>=6.9.0'}
dev: false
- /@babel/core@7.23.9:
- resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==}
+ /@babel/core@7.24.0:
+ resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==}
engines: {node: '>=6.9.0'}
dependencies:
'@ampproject/remapping': 2.2.1
'@babel/code-frame': 7.23.5
'@babel/generator': 7.23.6
'@babel/helper-compilation-targets': 7.23.6
- '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9)
- '@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.23.3(@babel/core@7.24.0)
+ '@babel/helpers': 7.24.0
+ '@babel/parser': 7.24.0
+ '@babel/template': 7.24.0
+ '@babel/traverse': 7.24.0
+ '@babel/types': 7.24.0
convert-source-map: 2.0.0
debug: 4.3.4
gensync: 1.0.0-beta.2
@@ -1416,9 +1194,9 @@ packages:
resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==}
engines: {node: '>=6.9.0'}
dependencies:
- '@babel/types': 7.23.9
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.22
+ '@babel/types': 7.24.0
+ '@jridgewell/gen-mapping': 0.3.4
+ '@jridgewell/trace-mapping': 0.3.23
jsesc: 2.5.2
dev: false
@@ -1426,7 +1204,7 @@ packages:
resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
engines: {node: '>=6.9.0'}
dependencies:
- '@babel/types': 7.23.9
+ '@babel/types': 7.24.0
dev: false
/@babel/helper-compilation-targets@7.23.6:
@@ -1435,7 +1213,7 @@ packages:
dependencies:
'@babel/compat-data': 7.23.5
'@babel/helper-validator-option': 7.23.5
- browserslist: 4.22.3
+ browserslist: 4.23.0
lru-cache: 5.1.1
semver: 6.3.1
dev: false
@@ -1449,31 +1227,31 @@ packages:
resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
engines: {node: '>=6.9.0'}
dependencies:
- '@babel/template': 7.23.9
- '@babel/types': 7.23.9
+ '@babel/template': 7.24.0
+ '@babel/types': 7.24.0
dev: false
/@babel/helper-hoist-variables@7.22.5:
resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
engines: {node: '>=6.9.0'}
dependencies:
- '@babel/types': 7.23.9
+ '@babel/types': 7.24.0
dev: false
/@babel/helper-module-imports@7.22.15:
resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
engines: {node: '>=6.9.0'}
dependencies:
- '@babel/types': 7.23.9
+ '@babel/types': 7.24.0
dev: false
- /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9):
+ /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0):
resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
dependencies:
- '@babel/core': 7.23.9
+ '@babel/core': 7.24.0
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-module-imports': 7.22.15
'@babel/helper-simple-access': 7.22.5
@@ -1481,8 +1259,8 @@ packages:
'@babel/helper-validator-identifier': 7.22.20
dev: false
- /@babel/helper-plugin-utils@7.22.5:
- resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
+ /@babel/helper-plugin-utils@7.24.0:
+ resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==}
engines: {node: '>=6.9.0'}
dev: false
@@ -1490,14 +1268,14 @@ packages:
resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
engines: {node: '>=6.9.0'}
dependencies:
- '@babel/types': 7.23.9
+ '@babel/types': 7.24.0
dev: false
/@babel/helper-split-export-declaration@7.22.6:
resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
engines: {node: '>=6.9.0'}
dependencies:
- '@babel/types': 7.23.9
+ '@babel/types': 7.24.0
dev: false
/@babel/helper-string-parser@7.23.4:
@@ -1515,13 +1293,13 @@ packages:
engines: {node: '>=6.9.0'}
dev: false
- /@babel/helpers@7.23.9:
- resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==}
+ /@babel/helpers@7.24.0:
+ resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==}
engines: {node: '>=6.9.0'}
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.0
+ '@babel/types': 7.24.0
transitivePeerDependencies:
- supports-color
dev: false
@@ -1535,65 +1313,55 @@ packages:
js-tokens: 4.0.0
dev: false
- /@babel/parser@7.23.9:
- resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==}
+ /@babel/parser@7.24.0:
+ resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==}
engines: {node: '>=6.0.0'}
hasBin: true
dependencies:
- '@babel/types': 7.23.9
+ '@babel/types': 7.24.0
dev: false
- /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9):
+ /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0):
resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
- '@babel/core': 7.23.9
- '@babel/helper-plugin-utils': 7.22.5
+ '@babel/core': 7.24.0
+ '@babel/helper-plugin-utils': 7.24.0
dev: false
- /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9):
- resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.9
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.9):
+ /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0):
resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
- '@babel/core': 7.23.9
+ '@babel/core': 7.24.0
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-module-imports': 7.22.15
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9)
- '@babel/types': 7.23.9
+ '@babel/helper-plugin-utils': 7.24.0
+ '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0)
+ '@babel/types': 7.24.0
dev: false
- /@babel/runtime@7.23.9:
- resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==}
+ /@babel/runtime@7.24.0:
+ resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.14.1
- /@babel/template@7.23.9:
- resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==}
+ /@babel/template@7.24.0:
+ resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==}
engines: {node: '>=6.9.0'}
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
dev: false
- /@babel/traverse@7.23.9:
- resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==}
+ /@babel/traverse@7.24.0:
+ resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/code-frame': 7.23.5
@@ -1602,16 +1370,16 @@ packages:
'@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/parser': 7.24.0
+ '@babel/types': 7.24.0
debug: 4.3.4
globals: 11.12.0
transitivePeerDependencies:
- supports-color
dev: false
- /@babel/types@7.23.9:
- resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==}
+ /@babel/types@7.24.0:
+ resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/helper-string-parser': 7.23.4
@@ -1707,37 +1475,6 @@ packages:
dev: true
optional: true
- /@dnd-kit/accessibility@3.1.0(react@18.2.0):
- resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==}
- peerDependencies:
- react: '>=16.8.0'
- dependencies:
- react: 18.2.0
- tslib: 2.6.2
- dev: false
-
- /@dnd-kit/core@6.1.0(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==}
- peerDependencies:
- react: '>=16.8.0'
- react-dom: '>=16.8.0'
- dependencies:
- '@dnd-kit/accessibility': 3.1.0(react@18.2.0)
- '@dnd-kit/utilities': 3.2.2(react@18.2.0)
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- tslib: 2.6.2
- dev: false
-
- /@dnd-kit/utilities@3.2.2(react@18.2.0):
- resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==}
- peerDependencies:
- react: '>=16.8.0'
- dependencies:
- react: 18.2.0
- tslib: 2.6.2
- dev: false
-
/@emmetio/abbreviation@2.3.3:
resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==}
dependencies:
@@ -1954,7 +1691,7 @@ packages:
/@evilmartians/harmony@1.2.0:
resolution: {integrity: sha512-Ua8gpC+28Eo9D2/xynTrrZIrSawgtobwtRLLYq4wH8N19qoMspWZ1vqfsDDVPgQFa+iHsVAk/SbdmoPAj6OH1g==}
- dev: false
+ dev: true
/@floating-ui/core@1.6.0:
resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==}
@@ -1962,8 +1699,8 @@ packages:
'@floating-ui/utils': 0.2.1
dev: false
- /@floating-ui/dom@1.6.1:
- resolution: {integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==}
+ /@floating-ui/dom@1.6.3:
+ resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==}
dependencies:
'@floating-ui/core': 1.6.0
'@floating-ui/utils': 0.2.1
@@ -1975,7 +1712,7 @@ packages:
react: '>=16.8.0'
react-dom: '>=16.8.0'
dependencies:
- '@floating-ui/dom': 1.6.1
+ '@floating-ui/dom': 1.6.3
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
@@ -1988,8 +1725,8 @@ packages:
resolution: {integrity: sha512-fbLTXtnGagDEaKmRqAnjbqWZbZ3RR6RExvNikt3hLI/qJXxaBZZw8OH+Ve5rAxVxmKwz0a5GmPk2cqW0aapbfQ==}
dev: false
- /@getalby/sdk@3.2.3(typescript@5.3.3):
- resolution: {integrity: sha512-8eIqg1vEH2CdkNoHsIlL5q2bKLvLR+XiSWK2RQnTAB+Z0CNlVW2jRM8JxxeubHnKBDTiBrBMkPqBIAhQqc8now==}
+ /@getalby/sdk@3.3.1(typescript@5.3.3):
+ resolution: {integrity: sha512-Cu45ZRriWLuVxu1Oi2qt7+J+pzzIZ60WgzwU6xlRWDjUXPcU1IQ8L+GOtdJft8xo+I7LSyg+zB16WtQmtdD2Yg==}
engines: {node: '>=14'}
dependencies:
events: 3.3.0
@@ -2009,49 +1746,57 @@ packages:
wrap-ansi: 8.1.0
wrap-ansi-cjs: /wrap-ansi@7.0.0
- /@jridgewell/gen-mapping@0.3.3:
- resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
+ /@jridgewell/gen-mapping@0.3.4:
+ resolution: {integrity: sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==}
engines: {node: '>=6.0.0'}
dependencies:
- '@jridgewell/set-array': 1.1.2
+ '@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.4.15
- '@jridgewell/trace-mapping': 0.3.22
+ '@jridgewell/trace-mapping': 0.3.23
- /@jridgewell/resolve-uri@3.1.1:
- resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
+ /@jridgewell/resolve-uri@3.1.2:
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
- /@jridgewell/set-array@1.1.2:
- resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+ /@jridgewell/set-array@1.2.1:
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
engines: {node: '>=6.0.0'}
/@jridgewell/sourcemap-codec@1.4.15:
resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
- /@jridgewell/trace-mapping@0.3.22:
- resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==}
+ /@jridgewell/trace-mapping@0.3.23:
+ resolution: {integrity: sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==}
dependencies:
- '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.4.15
/@juggle/resize-observer@3.4.0:
resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
dev: false
+ /@medv/finder@3.2.0:
+ resolution: {integrity: sha512-JmU7JIBwyL8RAzefvzALT4sP2M0biGk8i2invAgpQmma/QgfsaqoHIvJ7S0YC8n9hUVG8X3Leul2nGa06PvhbQ==}
+ dev: false
+
/@noble/ciphers@0.2.0:
resolution: {integrity: sha512-6YBxJDAapHSdd3bLDv6x2wRPwq4QFMUaB3HvljNBUTThDd12eSm7/3F+2lnfzx2jvM+S6Nsy0jEt9QbPqSwqRw==}
dev: false
+ /@noble/ciphers@0.5.1:
+ resolution: {integrity: sha512-aNE06lbe36ifvMbbWvmmF/8jx6EQPu2HVg70V95T+iGjOuYwPpAccwAQc2HlXO2D0aiQ3zavbMga4jjWnrpiPA==}
+ dev: false
+
/@noble/curves@1.1.0:
resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==}
dependencies:
'@noble/hashes': 1.3.1
dev: false
- /@noble/curves@1.3.0:
- resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==}
+ /@noble/curves@1.2.0:
+ resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==}
dependencies:
- '@noble/hashes': 1.3.3
+ '@noble/hashes': 1.3.2
dev: false
/@noble/hashes@1.3.1:
@@ -2059,6 +1804,11 @@ packages:
engines: {node: '>= 16'}
dev: false
+ /@noble/hashes@1.3.2:
+ resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==}
+ engines: {node: '>= 16'}
+ dev: false
+
/@noble/hashes@1.3.3:
resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==}
engines: {node: '>= 16'}
@@ -2084,10 +1834,10 @@ packages:
engines: {node: '>= 8'}
dependencies:
'@nodelib/fs.scandir': 2.1.5
- fastq: 1.17.0
+ fastq: 1.17.1
- /@nostr-dev-kit/ndk@2.3.3(typescript@5.3.3):
- resolution: {integrity: sha512-R2r6U1Xt4B7yygQFgTEexNqhuQQrbJ0Kxh4GvcCgNgSjMI+cPJQPWg4g4noWGRnaWf4epqLNCblfo5UfMuijTw==}
+ /@nostr-dev-kit/ndk@2.5.0(typescript@5.3.3):
+ resolution: {integrity: sha512-A2nRgjjLScDhGZGPWx8xUIJM66dJWScdWQoCn/tI1Gtwpple+C2Jp7C9t3mb0oF3bwd2nsV6qwS//wdrH8QvYQ==}
dependencies:
'@noble/hashes': 1.3.3
'@noble/secp256k1': 2.0.0
@@ -2096,7 +1846,7 @@ packages:
light-bolt11-decoder: 3.0.0
node-fetch: 3.3.2
nostr-tools: 1.17.0(typescript@5.3.3)
- tseep: 1.2.0
+ tseep: 1.2.1
typescript-lru-cache: 2.0.0
utf8-buffer: 1.0.0
websocket-polyfill: 0.0.3
@@ -2105,47 +1855,19 @@ packages:
- typescript
dev: false
- /@nostr-fetch/adapter-ndk@0.15.0(@nostr-dev-kit/ndk@2.3.3)(nostr-fetch@0.15.0):
- resolution: {integrity: sha512-Mug2yTmX4n4hFWfQV1GWiXZd88PbfbsT29lOtM5/sM59a+eYXeYvNmHddxmk2dK5VAdlT2VwKdHEmebzko6Y7w==}
- peerDependencies:
- '@nostr-dev-kit/ndk': ^1.0.0
- nostr-fetch: ^0.15.0
- dependencies:
- '@nostr-dev-kit/ndk': 2.3.3(typescript@5.3.3)
- '@nostr-fetch/kernel': 0.15.0
- nostr-fetch: 0.15.0
- dev: false
-
- /@nostr-fetch/kernel@0.15.0:
- resolution: {integrity: sha512-Sq3PjSUrPSK9uJzq2yPDe/xMVdcn5PkYxRo6KKBykigefYcuQqk9ulXxUX/Z2FyvsN3QcY+3aEwKsgaQcC+TiA==}
- dependencies:
- '@noble/curves': 1.3.0
- '@noble/hashes': 1.3.3
- dev: false
-
/@pkgjs/parseargs@0.11.0:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
requiresBuild: true
optional: true
- /@popperjs/core@2.11.8:
- resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
- dev: false
-
- /@radix-ui/number@1.0.1:
- resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==}
- dependencies:
- '@babel/runtime': 7.23.9
- dev: false
-
/@radix-ui/primitive@1.0.1:
resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
dev: false
- /@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-accordion@1.1.2(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==}
peerDependencies:
'@types/react': '*'
@@ -2158,23 +1880,22 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-direction': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-alert-dialog@1.0.5(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==}
peerDependencies:
'@types/react': '*'
@@ -2187,20 +1908,19 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-dialog': 1.0.5(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==}
peerDependencies:
'@types/react': '*'
@@ -2213,15 +1933,15 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-avatar@1.0.4(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==}
peerDependencies:
'@types/react': '*'
@@ -2234,18 +1954,17 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==}
peerDependencies:
'@types/react': '*'
@@ -2258,22 +1977,22 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==}
peerDependencies:
'@types/react': '*'
@@ -2286,22 +2005,22 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==}
peerDependencies:
'@types/react': '*'
@@ -2314,18 +2033,18 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
peerDependencies:
'@types/react': '*'
@@ -2334,12 +2053,12 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-context@1.0.1(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-context@1.0.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==}
peerDependencies:
'@types/react': '*'
@@ -2348,12 +2067,12 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-dialog@1.0.5(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==}
peerDependencies:
'@types/react': '*'
@@ -2366,28 +2085,27 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
aria-hidden: 1.2.3
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- react-remove-scroll: 2.5.5(@types/react@18.2.48)(react@18.2.0)
+ react-remove-scroll: 2.5.5(@types/react@18.2.60)(react@18.2.0)
dev: false
- /@radix-ui/react-direction@1.0.1(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-direction@1.0.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==}
peerDependencies:
'@types/react': '*'
@@ -2396,12 +2114,12 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==}
peerDependencies:
'@types/react': '*'
@@ -2414,19 +2132,19 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==}
peerDependencies:
'@types/react': '*'
@@ -2439,21 +2157,21 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==}
peerDependencies:
'@types/react': '*'
@@ -2462,12 +2180,12 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==}
peerDependencies:
'@types/react': '*'
@@ -2480,17 +2198,17 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-hover-card@1.0.7(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A==}
peerDependencies:
'@types/react': '*'
@@ -2503,23 +2221,22 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-id@1.0.1(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-id@1.0.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
peerDependencies:
'@types/react': '*'
@@ -2528,13 +2245,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==}
peerDependencies:
'@types/react': '*'
@@ -2547,32 +2264,32 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-direction': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
aria-hidden: 1.2.3
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- react-remove-scroll: 2.5.5(@types/react@18.2.48)(react@18.2.0)
+ react-remove-scroll: 2.5.5(@types/react@18.2.60)(react@18.2.0)
dev: false
- /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==}
peerDependencies:
'@types/react': '*'
@@ -2585,29 +2302,29 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
aria-hidden: 1.2.3
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- react-remove-scroll: 2.5.5(@types/react@18.2.48)(react@18.2.0)
+ react-remove-scroll: 2.5.5(@types/react@18.2.60)(react@18.2.0)
dev: false
- /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==}
peerDependencies:
'@types/react': '*'
@@ -2620,24 +2337,24 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.48)(react@18.2.0)
+ '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.60)(react@18.2.0)
'@radix-ui/rect': 1.0.1
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==}
peerDependencies:
'@types/react': '*'
@@ -2650,15 +2367,15 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==}
peerDependencies:
'@types/react': '*'
@@ -2671,16 +2388,16 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
peerDependencies:
'@types/react': '*'
@@ -2693,15 +2410,15 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==}
peerDependencies:
'@types/react': '*'
@@ -2714,64 +2431,23 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-direction': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
+ '@types/react-dom': 18.2.19
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/number': 1.0.1
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-direction': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
- aria-hidden: 1.2.3
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- react-remove-scroll: 2.5.5(@types/react@18.2.48)(react@18.2.0)
- dev: false
-
- /@radix-ui/react-slot@1.0.2(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-slot@1.0.2(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
peerDependencies:
'@types/react': '*'
@@ -2780,40 +2456,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- dev: false
-
- /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-tooltip@1.0.7(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==}
peerDependencies:
'@types/react': '*'
@@ -2826,26 +2475,25 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@radix-ui/react-visually-hidden': 1.0.3(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.60
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
peerDependencies:
'@types/react': '*'
@@ -2854,12 +2502,12 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==}
peerDependencies:
'@types/react': '*'
@@ -2868,13 +2516,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==}
peerDependencies:
'@types/react': '*'
@@ -2883,13 +2531,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==}
peerDependencies:
'@types/react': '*'
@@ -2898,12 +2546,12 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==}
peerDependencies:
'@types/react': '*'
@@ -2912,12 +2560,12 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==}
peerDependencies:
'@types/react': '*'
@@ -2926,13 +2574,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@radix-ui/rect': 1.0.1
- '@types/react': 18.2.48
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-use-size@1.0.1(@types/react@18.2.48)(react@18.2.0):
+ /@radix-ui/react-use-size@1.0.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==}
peerDependencies:
'@types/react': '*'
@@ -2941,13 +2589,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.48)(react@18.2.0)
- '@types/react': 18.2.48
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.60)(react@18.2.0)
+ '@types/react': 18.2.60
react: 18.2.0
dev: false
- /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-visually-hidden@1.0.3(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==}
peerDependencies:
'@types/react': '*'
@@ -2960,10 +2608,9 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.23.9
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.48
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.60
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
@@ -2971,11 +2618,11 @@ packages:
/@radix-ui/rect@1.0.1:
resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==}
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
dev: false
- /@remix-run/router@1.14.2:
- resolution: {integrity: sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==}
+ /@remix-run/router@1.15.2:
+ resolution: {integrity: sha512-+Rnav+CaoTE5QJc4Jcwh5toUpnVLKYbpU6Ys0zqbakqbaLQHeglLVHPfxOiQqdNmUy5C2lXz5dwC6tQNX2JW2Q==}
engines: {node: '>=14.0.0'}
dev: false
@@ -2989,92 +2636,92 @@ packages:
optional: true
dev: true
- /@rollup/rollup-android-arm-eabi@4.9.6:
- resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==}
+ /@rollup/rollup-android-arm-eabi@4.12.0:
+ resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==}
cpu: [arm]
os: [android]
requiresBuild: true
optional: true
- /@rollup/rollup-android-arm64@4.9.6:
- resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==}
+ /@rollup/rollup-android-arm64@4.12.0:
+ resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==}
cpu: [arm64]
os: [android]
requiresBuild: true
optional: true
- /@rollup/rollup-darwin-arm64@4.9.6:
- resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==}
+ /@rollup/rollup-darwin-arm64@4.12.0:
+ resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==}
cpu: [arm64]
os: [darwin]
requiresBuild: true
optional: true
- /@rollup/rollup-darwin-x64@4.9.6:
- resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==}
+ /@rollup/rollup-darwin-x64@4.12.0:
+ resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==}
cpu: [x64]
os: [darwin]
requiresBuild: true
optional: true
- /@rollup/rollup-linux-arm-gnueabihf@4.9.6:
- resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==}
+ /@rollup/rollup-linux-arm-gnueabihf@4.12.0:
+ resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==}
cpu: [arm]
os: [linux]
requiresBuild: true
optional: true
- /@rollup/rollup-linux-arm64-gnu@4.9.6:
- resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==}
+ /@rollup/rollup-linux-arm64-gnu@4.12.0:
+ resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==}
cpu: [arm64]
os: [linux]
requiresBuild: true
optional: true
- /@rollup/rollup-linux-arm64-musl@4.9.6:
- resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==}
+ /@rollup/rollup-linux-arm64-musl@4.12.0:
+ resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==}
cpu: [arm64]
os: [linux]
requiresBuild: true
optional: true
- /@rollup/rollup-linux-riscv64-gnu@4.9.6:
- resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==}
+ /@rollup/rollup-linux-riscv64-gnu@4.12.0:
+ resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==}
cpu: [riscv64]
os: [linux]
requiresBuild: true
optional: true
- /@rollup/rollup-linux-x64-gnu@4.9.6:
- resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==}
+ /@rollup/rollup-linux-x64-gnu@4.12.0:
+ resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==}
cpu: [x64]
os: [linux]
requiresBuild: true
optional: true
- /@rollup/rollup-linux-x64-musl@4.9.6:
- resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==}
+ /@rollup/rollup-linux-x64-musl@4.12.0:
+ resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==}
cpu: [x64]
os: [linux]
requiresBuild: true
optional: true
- /@rollup/rollup-win32-arm64-msvc@4.9.6:
- resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==}
+ /@rollup/rollup-win32-arm64-msvc@4.12.0:
+ resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==}
cpu: [arm64]
os: [win32]
requiresBuild: true
optional: true
- /@rollup/rollup-win32-ia32-msvc@4.9.6:
- resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==}
+ /@rollup/rollup-win32-ia32-msvc@4.12.0:
+ resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==}
cpu: [ia32]
os: [win32]
requiresBuild: true
optional: true
- /@rollup/rollup-win32-x64-msvc@4.9.6:
- resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==}
+ /@rollup/rollup-win32-x64-msvc@4.12.0:
+ resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==}
cpu: [x64]
os: [win32]
requiresBuild: true
@@ -3092,8 +2739,8 @@ packages:
resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==}
dependencies:
'@noble/curves': 1.1.0
- '@noble/hashes': 1.3.3
- '@scure/base': 1.1.5
+ '@noble/hashes': 1.3.1
+ '@scure/base': 1.1.1
dev: false
/@scure/bip39@1.2.1:
@@ -3103,8 +2750,8 @@ packages:
'@scure/base': 1.1.1
dev: false
- /@swc/core-darwin-arm64@1.3.107:
- resolution: {integrity: sha512-47tD/5vSXWxPd0j/ZllyQUg4bqalbQTsmqSw0J4dDdS82MWqCAwUErUrAZPRjBkjNQ6Kmrf5rpCWaGTtPw+ngw==}
+ /@swc/core-darwin-arm64@1.4.2:
+ resolution: {integrity: sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
@@ -3112,8 +2759,8 @@ packages:
dev: true
optional: true
- /@swc/core-darwin-x64@1.3.107:
- resolution: {integrity: sha512-hwiLJ2ulNkBGAh1m1eTfeY1417OAYbRGcb/iGsJ+LuVLvKAhU/itzsl535CvcwAlt2LayeCFfcI8gdeOLeZa9A==}
+ /@swc/core-darwin-x64@1.4.2:
+ resolution: {integrity: sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
@@ -3121,8 +2768,8 @@ packages:
dev: true
optional: true
- /@swc/core-linux-arm-gnueabihf@1.3.107:
- resolution: {integrity: sha512-I2wzcC0KXqh0OwymCmYwNRgZ9nxX7DWnOOStJXV3pS0uB83TXAkmqd7wvMBuIl9qu4Hfomi9aDM7IlEEn9tumQ==}
+ /@swc/core-linux-arm-gnueabihf@1.4.2:
+ resolution: {integrity: sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
@@ -3130,8 +2777,8 @@ packages:
dev: true
optional: true
- /@swc/core-linux-arm64-gnu@1.3.107:
- resolution: {integrity: sha512-HWgnn7JORYlOYnGsdunpSF8A+BCZKPLzLtEUA27/M/ZuANcMZabKL9Zurt7XQXq888uJFAt98Gy+59PU90aHKg==}
+ /@swc/core-linux-arm64-gnu@1.4.2:
+ resolution: {integrity: sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
@@ -3139,8 +2786,8 @@ packages:
dev: true
optional: true
- /@swc/core-linux-arm64-musl@1.3.107:
- resolution: {integrity: sha512-vfPF74cWfAm8hyhS8yvYI94ucMHIo8xIYU+oFOW9uvDlGQRgnUf/6DEVbLyt/3yfX5723Ln57U8uiMALbX5Pyw==}
+ /@swc/core-linux-arm64-musl@1.4.2:
+ resolution: {integrity: sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
@@ -3148,8 +2795,8 @@ packages:
dev: true
optional: true
- /@swc/core-linux-x64-gnu@1.3.107:
- resolution: {integrity: sha512-uBVNhIg0ip8rH9OnOsCARUFZ3Mq3tbPHxtmWk9uAa5u8jQwGWeBx5+nTHpDOVd3YxKb6+5xDEI/edeeLpha/9g==}
+ /@swc/core-linux-x64-gnu@1.4.2:
+ resolution: {integrity: sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
@@ -3157,8 +2804,8 @@ packages:
dev: true
optional: true
- /@swc/core-linux-x64-musl@1.3.107:
- resolution: {integrity: sha512-mvACkUvzSIB12q1H5JtabWATbk3AG+pQgXEN95AmEX2ZA5gbP9+B+mijsg7Sd/3tboHr7ZHLz/q3SHTvdFJrEw==}
+ /@swc/core-linux-x64-musl@1.4.2:
+ resolution: {integrity: sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
@@ -3166,8 +2813,8 @@ packages:
dev: true
optional: true
- /@swc/core-win32-arm64-msvc@1.3.107:
- resolution: {integrity: sha512-J3P14Ngy/1qtapzbguEH41kY109t6DFxfbK4Ntz9dOWNuVY3o9/RTB841ctnJk0ZHEG+BjfCJjsD2n8H5HcaOA==}
+ /@swc/core-win32-arm64-msvc@1.4.2:
+ resolution: {integrity: sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
@@ -3175,8 +2822,8 @@ packages:
dev: true
optional: true
- /@swc/core-win32-ia32-msvc@1.3.107:
- resolution: {integrity: sha512-ZBUtgyjTHlz8TPJh7kfwwwFma+ktr6OccB1oXC8fMSopD0AxVnQasgun3l3099wIsAB9eEsJDQ/3lDkOLs1gBA==}
+ /@swc/core-win32-ia32-msvc@1.4.2:
+ resolution: {integrity: sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
@@ -3184,8 +2831,8 @@ packages:
dev: true
optional: true
- /@swc/core-win32-x64-msvc@1.3.107:
- resolution: {integrity: sha512-Eyzo2XRqWOxqhE1gk9h7LWmUf4Bp4Xn2Ttb0ayAXFp6YSTxQIThXcT9kipXZqcpxcmDwoq8iWbbf2P8XL743EA==}
+ /@swc/core-win32-x64-msvc@1.4.2:
+ resolution: {integrity: sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
@@ -3193,8 +2840,8 @@ packages:
dev: true
optional: true
- /@swc/core@1.3.107:
- resolution: {integrity: sha512-zKhqDyFcTsyLIYK1iEmavljZnf4CCor5pF52UzLAz4B6Nu/4GLU+2LQVAf+oRHjusG39PTPjd2AlRT3f3QWfsQ==}
+ /@swc/core@1.4.2:
+ resolution: {integrity: sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==}
engines: {node: '>=10'}
requiresBuild: true
peerDependencies:
@@ -3203,23 +2850,23 @@ packages:
'@swc/helpers':
optional: true
dependencies:
- '@swc/counter': 0.1.2
+ '@swc/counter': 0.1.3
'@swc/types': 0.1.5
optionalDependencies:
- '@swc/core-darwin-arm64': 1.3.107
- '@swc/core-darwin-x64': 1.3.107
- '@swc/core-linux-arm-gnueabihf': 1.3.107
- '@swc/core-linux-arm64-gnu': 1.3.107
- '@swc/core-linux-arm64-musl': 1.3.107
- '@swc/core-linux-x64-gnu': 1.3.107
- '@swc/core-linux-x64-musl': 1.3.107
- '@swc/core-win32-arm64-msvc': 1.3.107
- '@swc/core-win32-ia32-msvc': 1.3.107
- '@swc/core-win32-x64-msvc': 1.3.107
+ '@swc/core-darwin-arm64': 1.4.2
+ '@swc/core-darwin-x64': 1.4.2
+ '@swc/core-linux-arm-gnueabihf': 1.4.2
+ '@swc/core-linux-arm64-gnu': 1.4.2
+ '@swc/core-linux-arm64-musl': 1.4.2
+ '@swc/core-linux-x64-gnu': 1.4.2
+ '@swc/core-linux-x64-musl': 1.4.2
+ '@swc/core-win32-arm64-msvc': 1.4.2
+ '@swc/core-win32-ia32-msvc': 1.4.2
+ '@swc/core-win32-x64-msvc': 1.4.2
dev: true
- /@swc/counter@0.1.2:
- resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==}
+ /@swc/counter@0.1.3:
+ resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
dev: true
/@swc/types@0.1.5:
@@ -3247,31 +2894,119 @@ packages:
tailwindcss: 3.4.1
dev: true
- /@tanstack/query-core@5.17.19:
- resolution: {integrity: sha512-Lzw8FUtnLCc9Jwz0sw9xOjZB+/mCCmJev38v2wHMUl/ioXNIhnNWeMxu0NKUjIhAd62IRB3eAtvxAGDJ55UkyA==}
+ /@tanstack/history@1.15.13:
+ resolution: {integrity: sha512-ToaeMtK5S4YaxCywAlYexc7KPFN0esjyTZ4vXzJhXEWAkro9iHgh7m/4ozPJb7oTo65WkHWX0W9GjcZbInSD8w==}
+ engines: {node: '>=12'}
+
+ /@tanstack/query-core@5.24.1:
+ resolution: {integrity: sha512-DZ6Nx9p7BhjkG50ayJ+MKPgff+lMeol7QYXkvuU5jr2ryW/4ok5eanaS9W5eooA4xN0A/GPHdLGOZGzArgf5Cg==}
dev: false
- /@tanstack/react-query@5.17.19(react@18.2.0):
- resolution: {integrity: sha512-qaQENB6/03Gj3dFZGvdmUoqeUGlGm7P1p0RmaR04Bf1Ib1T9lLGimcC9T3oCFbrx0b2ZF21ngjFZNjj9uPJMcg==}
+ /@tanstack/query-persist-client-core@5.24.1:
+ resolution: {integrity: sha512-ayUDCSCXAq3ZYXMrVQ3c4g2Mvj+d/Q7rGkNJTvdw09DZQUUMTfZsvSayitJjOxqJl1Pex4HmZNk8PiDvrqvlRQ==}
+ dependencies:
+ '@tanstack/query-core': 5.24.1
+ dev: false
+
+ /@tanstack/query-sync-storage-persister@5.24.1:
+ resolution: {integrity: sha512-dfqgFgb+6tmdvnE1vMQbBuZOBUi7zFeQB/gQJgiADJ2IO0OXp/Ucj06sVOLm9fAPGiUBDqF+UW/xB9ipBH2+Hw==}
+ dependencies:
+ '@tanstack/query-core': 5.24.1
+ '@tanstack/query-persist-client-core': 5.24.1
+ dev: false
+
+ /@tanstack/react-query-persist-client@5.24.1(@tanstack/react-query@5.24.1)(react@18.2.0):
+ resolution: {integrity: sha512-USD4afkZbSsAWwor5xbXTkzca0ud4SLd2Q++he8Y1iEyOCh7QJhn+zwsKOaqH2X3ecQMvH/jIzO2r+fieKyMvg==}
peerDependencies:
+ '@tanstack/react-query': ^5.24.1
react: ^18.0.0
dependencies:
- '@tanstack/query-core': 5.17.19
+ '@tanstack/query-persist-client-core': 5.24.1
+ '@tanstack/react-query': 5.24.1(react@18.2.0)
react: 18.2.0
dev: false
- /@tauri-apps/api@2.0.0-alpha.13:
- resolution: {integrity: sha512-sGgCkFahF3OZAHoGN5Ozt9WK7wJlbVZSgWpPQKNag4nSOX1+Py6VDRTEWriiJHDiV+gg31CWHnNXRy6TFoZmdA==}
+ /@tanstack/react-query@5.24.1(react@18.2.0):
+ resolution: {integrity: sha512-4+09JEdO4d6+Gc8Y/g2M/MuxDK5IY0QV8+2wL2304wPKJgJ54cBbULd3nciJ5uvh/as8rrxx6s0mtIwpRuGd1g==}
+ peerDependencies:
+ react: ^18.0.0
+ dependencies:
+ '@tanstack/query-core': 5.24.1
+ react: 18.2.0
+ dev: false
+
+ /@tanstack/react-router@1.17.4(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-iW/TgJN/qZ+Ly73jDU3D2AuC3IlAHGx3ybXTvVuZ1hihsud7arEg7g83hsuU+xbkPcVWfly9ndTb1XKxrovw9w==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ react: '>=16'
+ react-dom: '>=16'
+ dependencies:
+ '@tanstack/history': 1.15.13
+ '@tanstack/react-store': 0.2.1(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tiny-invariant: 1.3.3
+ tiny-warning: 1.0.3
+
+ /@tanstack/react-store@0.2.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-tEbMCQjbeVw9KOP/202LfqZMSNAVi6zYkkp1kBom8nFuMx/965Hzes3+6G6b/comCwVxoJU8Gg9IrcF8yRPthw==}
+ peerDependencies:
+ react: '>=16'
+ react-dom: '>=16'
+ dependencies:
+ '@tanstack/store': 0.1.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ use-sync-external-store: 1.2.0(react@18.2.0)
+
+ /@tanstack/router-devtools@1.17.4(csstype@3.1.3)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-tt02Xi1WpM/WkSrgmiKDvFa9OsLApWSfxulHVzyl/F9JMulOjqy45s0BxH2PlQSKGHjp8CNIBRyd4Ajs+sIN3A==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ react: '>=16'
+ react-dom: '>=16'
+ dependencies:
+ '@tanstack/react-router': 1.17.4(react-dom@18.2.0)(react@18.2.0)
+ clsx: 2.1.0
+ date-fns: 2.30.0
+ goober: 2.1.14(csstype@3.1.3)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ transitivePeerDependencies:
+ - csstype
+ dev: true
+
+ /@tanstack/router-generator@1.16.5:
+ resolution: {integrity: sha512-np9+DASQvD4ff+FrCZ4XqRMGpVC6Y2213kma/X05mvo241yh0D5C6paUY7N7pSBPpuTlJbYKi+73cm/xRtK3Hg==}
+ engines: {node: '>=12'}
+ dependencies:
+ prettier: 3.2.5
+ zod: 3.22.4
+ dev: true
+
+ /@tanstack/router-vite-plugin@1.16.5:
+ resolution: {integrity: sha512-rNfAuWIScl0KnjWOda5hzQYgHdwpLu1OljvqZa260UrCB6e32882X2Ci687+OUBfydhZT/V53XtQ+la7/AO5Rw==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@tanstack/router-generator': 1.16.5
+ dev: true
+
+ /@tanstack/store@0.1.3:
+ resolution: {integrity: sha512-GnolmC8Fr4mvsHE1fGQmR3Nm0eBO3KnZjDU0a+P3TeQNM/dDscFGxtA7p31NplQNW3KwBw4t1RVFmz0VeKLxcw==}
+
+ /@tauri-apps/api@2.0.0-beta.2:
+ resolution: {integrity: sha512-4r1r6kgttzIWxJ3HxkZQH+b7EiUtKhdUCPbi0KSalD+2T3j6klw+v8VyxhKwEdjM/eo60NE+J33v1E/Urq8puw==}
engines: {node: '>= 18', npm: '>= 6.6.0', yarn: '>= 1.19.1'}
dev: false
- /@tauri-apps/api@2.0.0-alpha.14:
- resolution: {integrity: sha512-j9WxOIsNqt+0CypY8wu0dSsTJJQw3H37yIdyYsgrjvHgJ/yQB0AAbOFBo6+v3C/fZ35ydswgeFCBEoeK9NC7QA==}
+ /@tauri-apps/api@2.0.0-beta.3:
+ resolution: {integrity: sha512-gDSJzKpBs6efXw2ZWqjl9QVNImY5GR5qygXqB7JK4y7prcQInxnTj2ARFR0vD4wuzkrUHGrlIKraiJJPHWJ9vg==}
engines: {node: '>= 18', npm: '>= 6.6.0', yarn: '>= 1.19.1'}
dev: false
- /@tauri-apps/cli-darwin-arm64@2.0.0-alpha.21:
- resolution: {integrity: sha512-TqUYeAyEDSodxPXSgGy208uS3t15JU24uSDN0QQZKX2l7jTah9uuzRhzqQsORPWIEwqc+cHugK1OKJ9WN44cCA==}
+ /@tauri-apps/cli-darwin-arm64@2.0.0-beta.4:
+ resolution: {integrity: sha512-ix8mxki+/bMHiFNMwECL0V0osKJ4S2coP447TnZtyxPY8YDYreDkYfQL2SvwQoz8H/rSzYWAbDOrc4d66MJo4g==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
@@ -3279,8 +3014,8 @@ packages:
dev: true
optional: true
- /@tauri-apps/cli-darwin-x64@2.0.0-alpha.21:
- resolution: {integrity: sha512-56SuCjBPvlk+rsRkokXdKGKD94bGEcG4fbSD7Ik1EohyBvstMdqWP7Gef3Q1g6dkFFHXIXLV6QkDYpDIVxyckw==}
+ /@tauri-apps/cli-darwin-x64@2.0.0-beta.4:
+ resolution: {integrity: sha512-FSYVNA2+C2EM2o8gYJZXg4qi8w2aPiFwKPZiSrq2wEyZ8vNCNS1ZpiC5I7YJaa44bb5LaRdlMYB49ggn17Qzzg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
@@ -3288,8 +3023,8 @@ packages:
dev: true
optional: true
- /@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-alpha.21:
- resolution: {integrity: sha512-l8zbj2ze532YlEB7z3xqnVRQFudU8kOTVMyv64vDWtteiNCKPCt2XZWJIaqzBhl1i0D/yTRmymzl0fIs6CRgEQ==}
+ /@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.4:
+ resolution: {integrity: sha512-CuMabwPRzYJwfYPUnh8QNSAGZJKw9f0pFl5CJ/7KW3GgJAyz4R8pYwE+d+smceJ0qeMtWjITg69w8bUAorcu1w==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
@@ -3297,8 +3032,8 @@ packages:
dev: true
optional: true
- /@tauri-apps/cli-linux-arm64-gnu@2.0.0-alpha.21:
- resolution: {integrity: sha512-q3XHOGEcw8zQRWDtKqXauqSVUlE8RSWD6TK63ZOp3e1onZ4aYKZl3MxXI+/XgZoQxoubM5xg5yrQRDtiaQoa7A==}
+ /@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.4:
+ resolution: {integrity: sha512-zmIG7Jp3pTeegRsIR7NOVbTsjeLgdyqSynG/+nLUC7maiunZ2F9mJn+lG/rt/iftu6Dqud4kFHuUCzjBhr4EMQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
@@ -3306,8 +3041,8 @@ packages:
dev: true
optional: true
- /@tauri-apps/cli-linux-arm64-musl@2.0.0-alpha.21:
- resolution: {integrity: sha512-G4lz7dWKhfAk1rT4GD/F2ZAw44HkPf6rBxZnBaIRZq2CyusryLpNpGd6D6ahlqTlw/gY23jxm4UpXWmrMCJ6WQ==}
+ /@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.4:
+ resolution: {integrity: sha512-4+WU/psA7LGMHYKH+fznzUHsc4wpyY9b7XQZmx+Qem8oD7+xPWgZspoD08N4c11uKecDd0S7m32M9JIQ7Ie8GA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
@@ -3315,8 +3050,8 @@ packages:
dev: true
optional: true
- /@tauri-apps/cli-linux-x64-gnu@2.0.0-alpha.21:
- resolution: {integrity: sha512-2rDoNt+Jp0BTPB3zipjTb0HiYK5VOO44Fovhj1tSnOEGD030qFNb9jHEUv1Z2fGYVicwNuEzP1K98iNby+4QzA==}
+ /@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.4:
+ resolution: {integrity: sha512-zDWJhsQiZfS/Lj7JA8NW7GEr554sd/iHWzVrYqKKTt1y7syVTQYtTxtyFsbYtSbBX+gaztNpw+QxNNPUs7q9pg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
@@ -3324,8 +3059,8 @@ packages:
dev: true
optional: true
- /@tauri-apps/cli-linux-x64-musl@2.0.0-alpha.21:
- resolution: {integrity: sha512-kYD2uWhrSIA7EA74YNE0RUajGV2eM7kGarJWNROCCNhJakLZT3mSXMvJ+IsT79QsGW9qrYmWe8C5kdbFcnx+zg==}
+ /@tauri-apps/cli-linux-x64-musl@2.0.0-beta.4:
+ resolution: {integrity: sha512-dJb0CYCdbvMYViAx2Wj+4cI1nNR4t9SkFoGVmuy3A9GA+kXWNs0Ib8siFPbBye3wsco3WCqmyMx/DvO3g4Jcmg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
@@ -3333,8 +3068,8 @@ packages:
dev: true
optional: true
- /@tauri-apps/cli-win32-arm64-msvc@2.0.0-alpha.21:
- resolution: {integrity: sha512-5qi9OGO623G+FUfZgbEUFicllWZLLcN4NyZsNy8JELuimPR0D5yNUxjhmhijIPd3Psb0kd4+blk5iGTTLsNszQ==}
+ /@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.4:
+ resolution: {integrity: sha512-DBhjmX7zQgBgzhXUdiq1n1g7crBtCjv2Wy6pQstVSmsfwuEDA7bQpvWDeQByApwsawGEi8fYCfMBufD21FpjVw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
@@ -3342,8 +3077,8 @@ packages:
dev: true
optional: true
- /@tauri-apps/cli-win32-ia32-msvc@2.0.0-alpha.21:
- resolution: {integrity: sha512-1cpJUulqxP/jMvvDB0MG8isnIhg8aHasI37/Fdj/41IwkLHAah1cvQxbjIoT++o/qzfGqDtpjmm9c34gjRRTGw==}
+ /@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.4:
+ resolution: {integrity: sha512-8y3kFEY+bnCPJ3E6hBIBgdhFxVGuYF9OAimbt+UJDW6sT9hAfomVpyp8XSCl58cBY6/o89jddFMyctG59Zxrug==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
@@ -3351,8 +3086,8 @@ packages:
dev: true
optional: true
- /@tauri-apps/cli-win32-x64-msvc@2.0.0-alpha.21:
- resolution: {integrity: sha512-pp5zz9xhS5rTacTsS1qH2xVWR5H3QQ3Bs/1K+zSK+xKYym5rEZxHjv8LHEq1eMu0ALq7lhNcFw/ULcWXt481xQ==}
+ /@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.4:
+ resolution: {integrity: sha512-jTKeUHIVNvcdDwXOdbFJVojo6rbl51MX9njjnyKRapH2oKUdoINRmE0g6vnBcnmm61QSvYR29zu0NGpBSDBVCg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -3360,100 +3095,100 @@ packages:
dev: true
optional: true
- /@tauri-apps/cli@2.0.0-alpha.21:
- resolution: {integrity: sha512-s61QfaKV1njrCrnjE/L2Yn1PrnxUs8I2iUI8NULjLYdOyFLCxu9UlW/kWQa9+ODJA8gYLl5txUH2fkkFdyOsCA==}
+ /@tauri-apps/cli@2.0.0-beta.4:
+ resolution: {integrity: sha512-xWQBSWOw8ipdBnLKAFw+uEoxjEe3/Jb7LEnqvV0uEzRFC8jcl6M4zaGnCyJKmouDwym7efWcUzqYAeoabT5ZnQ==}
engines: {node: '>= 10'}
hasBin: true
optionalDependencies:
- '@tauri-apps/cli-darwin-arm64': 2.0.0-alpha.21
- '@tauri-apps/cli-darwin-x64': 2.0.0-alpha.21
- '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-alpha.21
- '@tauri-apps/cli-linux-arm64-gnu': 2.0.0-alpha.21
- '@tauri-apps/cli-linux-arm64-musl': 2.0.0-alpha.21
- '@tauri-apps/cli-linux-x64-gnu': 2.0.0-alpha.21
- '@tauri-apps/cli-linux-x64-musl': 2.0.0-alpha.21
- '@tauri-apps/cli-win32-arm64-msvc': 2.0.0-alpha.21
- '@tauri-apps/cli-win32-ia32-msvc': 2.0.0-alpha.21
- '@tauri-apps/cli-win32-x64-msvc': 2.0.0-alpha.21
+ '@tauri-apps/cli-darwin-arm64': 2.0.0-beta.4
+ '@tauri-apps/cli-darwin-x64': 2.0.0-beta.4
+ '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-beta.4
+ '@tauri-apps/cli-linux-arm64-gnu': 2.0.0-beta.4
+ '@tauri-apps/cli-linux-arm64-musl': 2.0.0-beta.4
+ '@tauri-apps/cli-linux-x64-gnu': 2.0.0-beta.4
+ '@tauri-apps/cli-linux-x64-musl': 2.0.0-beta.4
+ '@tauri-apps/cli-win32-arm64-msvc': 2.0.0-beta.4
+ '@tauri-apps/cli-win32-ia32-msvc': 2.0.0-beta.4
+ '@tauri-apps/cli-win32-x64-msvc': 2.0.0-beta.4
dev: true
- /@tauri-apps/plugin-autostart@2.0.0-alpha.5:
- resolution: {integrity: sha512-FRB0bMqVViAkYD4499NoIwqXIytil96QL5vu69UBwopGBmsWj1VEseYU/2itRNIHGQvrTSybUTRJue3CfPGjwQ==}
+ /@tauri-apps/plugin-autostart@2.0.0-beta.1:
+ resolution: {integrity: sha512-p9dcHGGvbZkupE2N+9dS/b9SibStBauOaRZP6kV7H9SRV2un/+sDVnCA2R0VfdJhDO7m3yMZzuwN3mjMDRd8QQ==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
- /@tauri-apps/plugin-clipboard-manager@2.0.0-alpha.5:
- resolution: {integrity: sha512-BkoSHnB557SyzkRpEZ4Q3nXGdBpjwNj9xsK5irQs9yhuK0P2iMB7vlRb2lE96TEHUi4jakrjyqJoIDPHZDDkmA==}
+ /@tauri-apps/plugin-clipboard-manager@2.0.0-beta.1:
+ resolution: {integrity: sha512-nuC3aODbKrDadj2191ceSyobbh7vaU6EtNPnscSXv5nksRr5ZoarxtITk827UpOW14NmRQft7RDHKXY5Xr9Eew==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
- /@tauri-apps/plugin-dialog@2.0.0-alpha.5:
- resolution: {integrity: sha512-OHodi10R5an4nVq/kavU9HOATkc20RYNVdFYWMvPSVyI7rL1n55llPmbGXdWiZO94Tn10XZyZDVs7eJ1uKOkeA==}
+ /@tauri-apps/plugin-dialog@2.0.0-beta.1:
+ resolution: {integrity: sha512-nVZv2m67NaEU05SRbe59heFaZ5wlew9pgd/oi2yL8yUM+46abo9prky/eyXb1HzF8n66yRSaSkNcX1GZou5pNQ==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
- /@tauri-apps/plugin-fs@2.0.0-alpha.6:
- resolution: {integrity: sha512-f/LFVu33AF+GNQxEo/4/Xj1BZ0Tpr+TFViGs7ZqXdY1E+7W9mcHTL58sK0AHYXSJHfUezFKodazxwbXg4lYCig==}
+ /@tauri-apps/plugin-fs@2.0.0-beta.1:
+ resolution: {integrity: sha512-FGBzluMLMT4PGk7oJ8io/m+C2pd9kN5GrUDDayFKAd9D8/SaE8cqIJAhfq0VTfYGy1SeqFvP6gJFbdkS4PB8Jg==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
- /@tauri-apps/plugin-http@2.0.0-alpha.6:
- resolution: {integrity: sha512-d23Xem40/ox+UWaiCzfi+IeV/yMI57oHmy6bXaDwRqfC4KuHjZx22k9xnNV17tLGFWjcmgpuViWPiCuxFdy+Ow==}
+ /@tauri-apps/plugin-http@2.0.0-beta.1:
+ resolution: {integrity: sha512-17i1KL7ug39p21ThtzxcmIifTaR0odmrUEzT+BUFwMANh3IXV8iurooOcHesrKmYN7A4t0NXlaFErYLvPs+4DA==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
- /@tauri-apps/plugin-notification@2.0.0-alpha.5:
- resolution: {integrity: sha512-j0kgaYa1FtoBReN2lsSa7HL7qGalrVbgQogKfTywCuU0wBEPr7IL3ZKYui8LyAFgA3mBnie7WX4iN/8xmRwS1Q==}
+ /@tauri-apps/plugin-notification@2.0.0-beta.1:
+ resolution: {integrity: sha512-yFMRJt3AxUW7D4fcHy2l8WWVZW4s7Gb1aupk6YFVgnrHx4sqDDDoj/NAwjvEG7wxbLav7oxk7LwYvKKuT/OpFg==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
- /@tauri-apps/plugin-os@2.0.0-alpha.6:
- resolution: {integrity: sha512-ld5p56TiWxnGHCysEfHLmRH5+Lz7rzDRC5H5WzofVNPiqp4ra1O5y1lNOWklE01Rm5P1c0t1PbUVdNGpeYA3GQ==}
+ /@tauri-apps/plugin-os@2.0.0-beta.1:
+ resolution: {integrity: sha512-fQ0rPJjuAppOtRlBULIn7vc9oNgP8aIi58Q48HvrIZ2ndysxEEO5TW4hkFCU+BXB/b6Y24lwhLBiC8kCzUcLew==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
- /@tauri-apps/plugin-process@2.0.0-alpha.5:
- resolution: {integrity: sha512-GRCs45MPTVR4XiY2BSlctmSfI2z237vUbVe3qSbJMpPbtBHDHusOi4YOaBVoWTv3w3m0EtV9qqIXRYEp5WevsA==}
+ /@tauri-apps/plugin-process@2.0.0-beta.1:
+ resolution: {integrity: sha512-rrKHWQ6zWeC7uTXXcSIcTvWCPcX/oPC2KzR4s6PAbzOkPFusRDWVgWvpfp5byN1KQ3znYkS7x0BOhWsPNbfeMw==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
- /@tauri-apps/plugin-shell@2.0.0-alpha.5:
- resolution: {integrity: sha512-iAurwn0z16NLOLaiuk3ETLtoG6x/mgFZo75YYKYLiOg70PYMr4LpcjvNPoIPvokdqWWPa7C/6N3eE9jtcbQiLg==}
+ /@tauri-apps/plugin-shell@2.0.0-beta.1:
+ resolution: {integrity: sha512-yMf9CMHCRkGnx0pv420MptEeUdk+bVrXyM5zwFisy75GBhXgvEEtSjAkubTsC0jkzLfn4EInizaW2GER9ub7cQ==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
- /@tauri-apps/plugin-sql@2.0.0-alpha.5:
- resolution: {integrity: sha512-u4rJZM357zWP+WmE/W1t1iu0/INQ9uqO8+dOFWzLSGqg2zgYcohTeV66hZoeCTRTzsV3qrKI3suWueLu1YKT7A==}
+ /@tauri-apps/plugin-sql@2.0.0-beta.1:
+ resolution: {integrity: sha512-Ty9s+vGSTJ+D/zu8EcGY17/4OU/7j4T1AiVRCEsdC0Ty3ubbaH4LuWoiO2pg4GZdgKPvnWmGcLkvtIdHXj6kMw==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
- /@tauri-apps/plugin-updater@2.0.0-alpha.5:
- resolution: {integrity: sha512-iowOKQ2QWXlmEtICzjbv9v5n2Idbasc0T2mKyHBQk4B9HcwRRV24sQiHyxAiWbApHkakZiZNUysK9JszcKIixQ==}
+ /@tauri-apps/plugin-updater@2.0.0-beta.1:
+ resolution: {integrity: sha512-Pfb0mtzG72EPH5xR4WZGVRXyFz521uDb0a451inSKnb0ELcRlfKukRzLZEfuCtxgUAUw8cVX6sn16OduE4AkDg==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
- /@tauri-apps/plugin-upload@2.0.0-alpha.5:
- resolution: {integrity: sha512-3Jytf5l4dY5btHUfLNahnyvUzufJoFETM+g5u1zTilJv0MyJqhd8pN5/EU/AsXemlU16u/tpr5xibNGKofYWvA==}
+ /@tauri-apps/plugin-upload@2.0.0-beta.1:
+ resolution: {integrity: sha512-Teh1iMbNjo8U0VrhkA2QVYiNNiHmds572WS9rPajCvg9X9CJ6IPdABw0fSzK2XThfadabsgbsYL1BYnvTnpO5g==}
dependencies:
- '@tauri-apps/api': 2.0.0-alpha.13
+ '@tauri-apps/api': 2.0.0-beta.2
dev: false
/@types/babel__core@7.20.5:
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
dependencies:
- '@babel/parser': 7.23.9
- '@babel/types': 7.23.9
+ '@babel/parser': 7.24.0
+ '@babel/types': 7.24.0
'@types/babel__generator': 7.6.8
'@types/babel__template': 7.4.4
'@types/babel__traverse': 7.20.5
@@ -3462,20 +3197,20 @@ packages:
/@types/babel__generator@7.6.8:
resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
dependencies:
- '@babel/types': 7.23.9
+ '@babel/types': 7.24.0
dev: false
/@types/babel__template@7.4.4:
resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
dependencies:
- '@babel/parser': 7.23.9
- '@babel/types': 7.23.9
+ '@babel/parser': 7.24.0
+ '@babel/types': 7.24.0
dev: false
/@types/babel__traverse@7.20.5:
resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==}
dependencies:
- '@babel/types': 7.23.9
+ '@babel/types': 7.24.0
dev: false
/@types/debug@4.1.12:
@@ -3487,8 +3222,8 @@ packages:
/@types/estree@1.0.5:
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
- /@types/hast@3.0.3:
- resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==}
+ /@types/hast@3.0.4:
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
dependencies:
'@types/unist': 3.0.2
dev: false
@@ -3523,21 +3258,16 @@ packages:
'@types/unist': 2.0.10
dev: false
- /@types/node@20.11.10:
- resolution: {integrity: sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==}
- dependencies:
- undici-types: 5.26.5
-
/@types/prop-types@15.7.11:
resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==}
- /@types/react-dom@18.2.18:
- resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==}
+ /@types/react-dom@18.2.19:
+ resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==}
dependencies:
- '@types/react': 18.2.48
+ '@types/react': 18.2.60
- /@types/react@18.2.48:
- resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==}
+ /@types/react@18.2.60:
+ resolution: {integrity: sha512-dfiPj9+k20jJrLGOu9Nf6eqxm2EyJRrq2NvwOFsfbb7sFExZ9WELPs67UImHj3Ayxg8ruTtKtNnbjaF8olPq0A==}
dependencies:
'@types/prop-types': 15.7.11
'@types/scheduler': 0.16.8
@@ -3558,41 +3288,43 @@ packages:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
dev: false
- /@vitejs/plugin-react-swc@3.5.0(vite@5.0.12):
- resolution: {integrity: sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==}
+ /@vitejs/plugin-react-swc@3.6.0(vite@5.1.4):
+ resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==}
peerDependencies:
vite: ^4 || ^5
dependencies:
- '@swc/core': 1.3.107
- vite: 5.0.12(@types/node@20.11.10)
+ '@swc/core': 1.4.2
+ vite: 5.1.4
transitivePeerDependencies:
- '@swc/helpers'
dev: true
- /@volar/kit@1.11.1(typescript@5.3.3):
- resolution: {integrity: sha512-nqO+Hl9f1ygOK/3M7Hpnw0lhKvuMFhh823nilStpkTmm5WfrUnE+4WaQkb3dC6LM3TZq74j2m88yxRC+Z3sZZw==}
+ /@volar/kit@2.0.4(typescript@5.3.3):
+ resolution: {integrity: sha512-USRx/o0jKz7o8+lEKWMxWqbqvC46XFrf3IE6CZBYzRo9kM7RERQLwUYaoT2bOcHt5DQWublpnTgdgHMm37Gysg==}
peerDependencies:
typescript: '*'
dependencies:
- '@volar/language-service': 1.11.1
+ '@volar/language-service': 2.0.4
+ '@volar/typescript': 2.0.4
typesafe-path: 0.2.2
typescript: 5.3.3
vscode-languageserver-textdocument: 1.0.11
vscode-uri: 3.0.8
dev: false
- /@volar/language-core@1.11.1:
- resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==}
+ /@volar/language-core@2.0.4:
+ resolution: {integrity: sha512-VhC8i03P0x9LKGLTBi81xNTNWm40yxQ/Iba8IpH+LFr+Yb7c/D7fF90Cvf31MzPDM4G5rjIOlCfs+eQKPBkwQw==}
dependencies:
- '@volar/source-map': 1.11.1
+ '@volar/source-map': 2.0.4
dev: false
- /@volar/language-server@1.11.1:
- resolution: {integrity: sha512-XYG4HcML2qimQV9UouQ7c1GuuqQw1NXoNDxAOAcfyYlz43P+HgzGQx4QEou+QMGHJeYIN86foDvkTN3fcopw9A==}
+ /@volar/language-server@2.0.4:
+ resolution: {integrity: sha512-VnljhooQjT6RhmvwwJK9+3YYs2ovFmav4IVNHiQgnTMfiOiyABzcghwvJrJrI39rJDI6LNOWF7BYUJq7K07BKQ==}
dependencies:
- '@volar/language-core': 1.11.1
- '@volar/language-service': 1.11.1
- '@volar/typescript': 1.11.1
+ '@volar/language-core': 2.0.4
+ '@volar/language-service': 2.0.4
+ '@volar/snapshot-document': 2.0.4
+ '@volar/typescript': 2.0.4
'@vscode/l10n': 0.0.16
path-browserify: 1.0.1
request-light: 0.7.0
@@ -3602,26 +3334,32 @@ packages:
vscode-uri: 3.0.8
dev: false
- /@volar/language-service@1.11.1:
- resolution: {integrity: sha512-dKo8z1UzQRPHnlXxwfONGrasS1wEWXMoLQiohZ8KgWqZALbekZCwdGImLZD4DeFGNjk3HTTdfeCzo3KjwohjEQ==}
+ /@volar/language-service@2.0.4:
+ resolution: {integrity: sha512-DoanyU9I9Nl85lUytDl8jgyk+nrUDR5CFNVMrxWXGXclP4WTqBayBgSFAeF1L/5AwP3MywmWoK4GLAEVvl8D+Q==}
dependencies:
- '@volar/language-core': 1.11.1
- '@volar/source-map': 1.11.1
+ '@volar/language-core': 2.0.4
vscode-languageserver-protocol: 3.17.5
vscode-languageserver-textdocument: 1.0.11
vscode-uri: 3.0.8
dev: false
- /@volar/source-map@1.11.1:
- resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==}
+ /@volar/snapshot-document@2.0.4:
+ resolution: {integrity: sha512-YzgdmvpdRFxiBFCOVWga67naAtbPtKmPaFtGnmxWx+KXrjGkpUXT/2tzeKn5FLdtoYV+DRTdpMdP/45ArnVwZQ==}
dependencies:
- muggle-string: 0.3.1
+ vscode-languageserver-protocol: 3.17.5
+ vscode-languageserver-textdocument: 1.0.11
dev: false
- /@volar/typescript@1.11.1:
- resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==}
+ /@volar/source-map@2.0.4:
+ resolution: {integrity: sha512-BbxUinEMoJZqrHsSj1aBa0boCBnN3BoXnf7j9IBwjxosxGXOhCvqmH2L9raJemadaKjeVR8ZQLhV7AOhyoHt/Q==}
dependencies:
- '@volar/language-core': 1.11.1
+ muggle-string: 0.4.1
+ dev: false
+
+ /@volar/typescript@2.0.4:
+ resolution: {integrity: sha512-KF7yh7GIo4iWuAQOKf/ONeFHdQA+wFriitW8LtGZB4iOOT6MdlRlYNsRL8do7XxmXvsBKcs4jTMtGn+uZRwlWg==}
+ dependencies:
+ '@volar/language-core': 2.0.4
path-browserify: 1.0.1
dev: false
@@ -3720,45 +3458,46 @@ packages:
resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
dev: false
- /astro-seo-meta@4.1.0(astro@4.2.6):
+ /astro-seo-meta@4.1.0(astro@4.4.6):
resolution: {integrity: sha512-v5qULt/c2hp9u6JtRyZeWTeb6YC82XDMzVcEf7XlRSuvs3C6KUQxeIOp5j+uOIek42CZHcyhbWzQF+FoRbQlfg==}
peerDependencies:
astro: ^4.0.0
dependencies:
- astro: 4.2.6(typescript@5.3.3)
+ astro: 4.4.6(typescript@5.3.3)
dev: false
- /astro-seo-schema@4.0.0(astro@4.2.6)(schema-dts@1.1.2):
+ /astro-seo-schema@4.0.0(astro@4.4.6)(schema-dts@1.1.2):
resolution: {integrity: sha512-ZcpxuQWSlyOVru+sN5LwUHqfrQpOEyv6Ksxq6WBNhycEHE0AEgGdiHkfhAmQbVqT4HXM8bmZOZlYlwwsYkfPAw==}
peerDependencies:
astro: ^4.0.0
schema-dts: ^1.1.0
dependencies:
- astro: 4.2.6(typescript@5.3.3)
+ astro: 4.4.6(typescript@5.3.3)
schema-dts: 1.1.2(typescript@5.3.3)
dev: false
- /astro@4.2.6(typescript@5.3.3):
- resolution: {integrity: sha512-k5i8pEI2r45JTkoE0I4JyhOH/dZFpjUA4AONbRd9Gr1LtnGOhKHDftiYOrRLUGx91q7BzoW3DOk+h4yZM4yC3g==}
+ /astro@4.4.6(typescript@5.3.3):
+ resolution: {integrity: sha512-kns2TtiMYTyDPgcvtaQjMfBhY/F/2+O3eSX4XWH13FFQW1hp7AcTXfGwq8SvJ14JNoU4bsKeJbaB9CxUN9ZQlQ==}
engines: {node: '>=18.14.1', npm: '>=6.14.0'}
hasBin: true
dependencies:
- '@astrojs/compiler': 2.5.1
+ '@astrojs/compiler': 2.6.0
'@astrojs/internal-helpers': 0.2.1
- '@astrojs/markdown-remark': 4.2.0
+ '@astrojs/markdown-remark': 4.2.1
'@astrojs/telemetry': 3.0.4
- '@babel/core': 7.23.9
+ '@babel/core': 7.24.0
'@babel/generator': 7.23.6
- '@babel/parser': 7.23.9
- '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9)
- '@babel/traverse': 7.23.9
- '@babel/types': 7.23.9
+ '@babel/parser': 7.24.0
+ '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.0)
+ '@babel/traverse': 7.24.0
+ '@babel/types': 7.24.0
+ '@medv/finder': 3.2.0
'@types/babel__core': 7.20.5
acorn: 8.11.3
aria-query: 5.3.0
axobject-query: 4.0.0
boxen: 7.1.1
- chokidar: 3.5.3
+ chokidar: 3.6.0
ci-info: 4.0.0
clsx: 2.1.0
common-ancestor-path: 1.0.1
@@ -3767,7 +3506,7 @@ packages:
debug: 4.3.4
deterministic-object-hash: 2.0.2
devalue: 4.3.2
- diff: 5.1.0
+ diff: 5.2.0
dlv: 1.1.3
dset: 3.1.3
es-module-lexer: 1.4.1
@@ -3782,28 +3521,27 @@ packages:
http-cache-semantics: 4.1.1
js-yaml: 4.1.0
kleur: 4.1.5
- magic-string: 0.30.5
+ magic-string: 0.30.7
mdast-util-to-hast: 13.0.2
mime: 3.0.0
ora: 7.0.1
p-limit: 5.0.0
p-queue: 8.0.1
path-to-regexp: 6.2.1
- preferred-pm: 3.1.2
- probe-image-size: 7.2.3
+ preferred-pm: 3.1.3
prompts: 2.4.2
rehype: 13.0.1
resolve: 1.22.8
- semver: 7.5.4
- server-destroy: 1.0.1
+ semver: 7.6.0
shikiji: 0.9.19
+ shikiji-core: 0.9.19
string-width: 7.1.0
strip-ansi: 7.1.0
- tsconfck: 3.0.1(typescript@5.3.3)
+ tsconfck: 3.0.2(typescript@5.3.3)
unist-util-visit: 5.0.0
vfile: 6.0.1
- vite: 5.0.12(@types/node@20.11.10)
- vitefu: 0.2.5(vite@5.0.12)
+ vite: 5.1.4
+ vitefu: 0.2.5(vite@5.1.4)
which-pm: 2.1.1
yargs-parser: 21.1.1
zod: 3.22.4
@@ -3821,19 +3559,19 @@ packages:
- typescript
dev: false
- /autoprefixer@10.4.17(postcss@8.4.33):
+ /autoprefixer@10.4.17(postcss@8.4.35):
resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==}
engines: {node: ^10 || ^12 || >=14}
hasBin: true
peerDependencies:
postcss: ^8.1.0
dependencies:
- browserslist: 4.22.3
- caniuse-lite: 1.0.30001581
+ browserslist: 4.23.0
+ caniuse-lite: 1.0.30001591
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.0.0
- postcss: 8.4.33
+ postcss: 8.4.35
postcss-value-parser: 4.2.0
/axobject-query@4.0.0:
@@ -3842,8 +3580,8 @@ packages:
dequal: 2.0.3
dev: false
- /b4a@1.6.4:
- resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==}
+ /b4a@1.6.6:
+ resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==}
requiresBuild: true
dev: false
optional: true
@@ -3855,6 +3593,37 @@ packages:
/balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ /bare-events@2.2.0:
+ resolution: {integrity: sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==}
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /bare-fs@2.2.0:
+ resolution: {integrity: sha512-+VhW202E9eTVGkX7p+TNXtZC4RTzj9JfJW7PtfIbZ7mIQ/QT9uOafQTx7lx2n9ERmWsXvLHF4hStAFn4gl2mQw==}
+ requiresBuild: true
+ dependencies:
+ bare-events: 2.2.0
+ bare-os: 2.2.0
+ bare-path: 2.1.0
+ streamx: 2.16.1
+ dev: false
+ optional: true
+
+ /bare-os@2.2.0:
+ resolution: {integrity: sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==}
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /bare-path@2.1.0:
+ resolution: {integrity: sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==}
+ requiresBuild: true
+ dependencies:
+ bare-os: 2.2.0
+ dev: false
+ optional: true
+
/base-64@1.0.0:
resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
dev: false
@@ -3910,15 +3679,15 @@ packages:
dependencies:
fill-range: 7.0.1
- /browserslist@4.22.3:
- resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==}
+ /browserslist@4.23.0:
+ resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
dependencies:
- caniuse-lite: 1.0.30001581
- electron-to-chromium: 1.4.650
+ caniuse-lite: 1.0.30001591
+ electron-to-chromium: 1.4.687
node-releases: 2.0.14
- update-browserslist-db: 1.0.13(browserslist@4.22.3)
+ update-browserslist-db: 1.0.13(browserslist@4.23.0)
/buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
@@ -3953,8 +3722,8 @@ packages:
engines: {node: '>=14.16'}
dev: false
- /caniuse-lite@1.0.30001581:
- resolution: {integrity: sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==}
+ /caniuse-lite@1.0.30001591:
+ resolution: {integrity: sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==}
/ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
@@ -3986,8 +3755,8 @@ packages:
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
dev: false
- /chokidar@3.5.3:
- resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ /chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
dependencies:
anymatch: 3.1.3
@@ -4052,10 +3821,9 @@ packages:
/clsx@2.1.0:
resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==}
engines: {node: '>=6'}
- dev: false
- /codsen-utils@1.6.3:
- resolution: {integrity: sha512-jsayHP4Z1gKjXB+NsFhEKrM2dAN4XCpbHbhwzzYfFrVL/DYPw9D/ACob6EjbIiV47PSe3OcxJqX/b1V/T7XK3A==}
+ /codsen-utils@1.6.4:
+ resolution: {integrity: sha512-PDyvQ5f2PValmqZZIJATimcokDt4JjIev8cKbZgEOoZm+U1IJDYuLeTcxZPQdep99R/X0RIlQ6ReQgPOVnPbNw==}
engines: {node: '>=14.18.0'}
dependencies:
rfdc: 1.3.1
@@ -4130,14 +3898,6 @@ packages:
engines: {node: '>= 0.6'}
dev: false
- /cross-env@7.0.3:
- resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
- engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
- hasBin: true
- dependencies:
- cross-spawn: 7.0.3
- dev: true
-
/cross-spawn@7.0.3:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
engines: {node: '>= 8'}
@@ -4157,7 +3917,7 @@ packages:
/d@1.0.1:
resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==}
dependencies:
- es5-ext: 0.10.62
+ es5-ext: 0.10.64
type: 1.2.0
dev: false
@@ -4166,6 +3926,13 @@ packages:
engines: {node: '>= 12'}
dev: false
+ /date-fns@2.30.0:
+ resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
+ engines: {node: '>=0.11'}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ dev: true
+
/dayjs@1.11.10:
resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
dev: false
@@ -4181,17 +3948,6 @@ packages:
ms: 2.0.0
dev: false
- /debug@3.2.7:
- resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
- dependencies:
- ms: 2.1.3
- dev: false
-
/debug@4.3.4:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
engines: {node: '>=6.0'}
@@ -4261,8 +4017,8 @@ packages:
/didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
- /diff@5.1.0:
- resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
+ /diff@5.2.0:
+ resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
engines: {node: '>=0.3.1'}
dev: false
@@ -4282,8 +4038,8 @@ packages:
/eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
- /electron-to-chromium@1.4.650:
- resolution: {integrity: sha512-sYSQhJCJa4aGA1wYol5cMQgekDBlbVfTRavlGZVr3WZpDdOPcp6a6xUnFfrt8TqZhsBYYbDxJZCjGfHuGupCRQ==}
+ /electron-to-chromium@1.4.687:
+ resolution: {integrity: sha512-Ic85cOuXSP6h7KM0AIJ2hpJ98Bo4hyTUjc4yjMbkvD+8yTxEhfK9+8exT2KKYsSjnCn2tGsKVSZwE7ZgTORQCw==}
/emmet@2.4.6:
resolution: {integrity: sha512-dJfbdY/hfeTyf/Ef7Y7ubLYzkBvPQ912wPaeVYpAxvFxkEBf/+hJu4H6vhAvFN6HlxqedlfVn2x1S44FfQ97pg==}
@@ -4302,12 +4058,6 @@ packages:
/emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
- /encoding@0.1.13:
- resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
- dependencies:
- iconv-lite: 0.6.3
- dev: true
-
/end-of-stream@1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
requiresBuild: true
@@ -4325,13 +4075,14 @@ packages:
resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==}
dev: false
- /es5-ext@0.10.62:
- resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==}
+ /es5-ext@0.10.64:
+ resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==}
engines: {node: '>=0.10'}
requiresBuild: true
dependencies:
es6-iterator: 2.0.3
es6-symbol: 3.1.3
+ esniff: 2.0.1
next-tick: 1.1.0
dev: false
@@ -4339,7 +4090,7 @@ packages:
resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
dependencies:
d: 1.0.1
- es5-ext: 0.10.62
+ es5-ext: 0.10.64
es6-symbol: 3.1.3
dev: false
@@ -4380,8 +4131,8 @@ packages:
'@esbuild/win32-ia32': 0.19.12
'@esbuild/win32-x64': 0.19.12
- /escalade@3.1.1:
- resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ /escalade@3.1.2:
+ resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
engines: {node: '>=6'}
/escape-string-regexp@1.0.5:
@@ -4394,6 +4145,16 @@ packages:
engines: {node: '>=12'}
dev: false
+ /esniff@2.0.1:
+ resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ d: 1.0.1
+ es5-ext: 0.10.64
+ event-emitter: 0.3.5
+ type: 2.7.2
+ dev: false
+
/esprima@4.0.1:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'}
@@ -4406,6 +4167,13 @@ packages:
'@types/estree': 1.0.5
dev: false
+ /event-emitter@0.3.5:
+ resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
+ dependencies:
+ d: 1.0.1
+ es5-ext: 0.10.64
+ dev: false
+
/eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
dev: false
@@ -4424,7 +4192,7 @@ packages:
human-signals: 5.0.0
is-stream: 3.0.0
merge-stream: 2.0.0
- npm-run-path: 5.2.0
+ npm-run-path: 5.3.0
onetime: 6.0.0
signal-exit: 4.1.0
strip-final-newline: 3.0.0
@@ -4470,8 +4238,8 @@ packages:
merge2: 1.4.1
micromatch: 4.0.5
- /fastq@1.17.0:
- resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==}
+ /fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
dependencies:
reusify: 1.0.4
@@ -4480,7 +4248,7 @@ packages:
engines: {node: ^12.20 || >= 14.13}
dependencies:
node-domexception: 1.0.0
- web-streams-polyfill: 3.3.2
+ web-streams-polyfill: 3.3.3
dev: false
/fill-range@7.0.1:
@@ -4534,8 +4302,8 @@ packages:
/fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
- /framer-motion@11.0.3(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-6x2poQpIWBdbZwLd73w6cKZ1I9IEPIU94C6/Swp1Zt3LJ+sB5bPe1E2wC6EH5hSISXNkMJ4afH7AdwS7MrtkWw==}
+ /framer-motion@11.0.6(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-BpO3mWF8UwxzO3Ca5AmSkrg14QYTeJa9vKgoLOoBdBdTPj0e81i1dMwnX6EQJXRieUx20uiDBXq8bA6y7N6b8Q==}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
@@ -4651,6 +4419,14 @@ packages:
resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
dev: true
+ /goober@2.1.14(csstype@3.1.3):
+ resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==}
+ peerDependencies:
+ csstype: ^3.0.10
+ dependencies:
+ csstype: 3.1.3
+ dev: true
+
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
dev: false
@@ -4670,8 +4446,8 @@ packages:
engines: {node: '>=4'}
dev: false
- /hasown@2.0.0:
- resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
+ /hasown@2.0.1:
+ resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==}
engines: {node: '>= 0.4'}
dependencies:
function-bind: 1.1.2
@@ -4679,7 +4455,7 @@ packages:
/hast-util-from-html@2.0.1:
resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
devlop: 1.1.0
hast-util-from-parse5: 8.0.1
parse5: 7.1.2
@@ -4690,7 +4466,7 @@ packages:
/hast-util-from-parse5@8.0.1:
resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
'@types/unist': 3.0.2
devlop: 1.1.0
hastscript: 8.0.0
@@ -4703,13 +4479,13 @@ packages:
/hast-util-parse-selector@4.0.0:
resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
dev: false
/hast-util-raw@9.0.2:
resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
'@types/unist': 3.0.2
'@ungap/structured-clone': 1.2.0
hast-util-from-parse5: 8.0.1
@@ -4727,7 +4503,7 @@ packages:
/hast-util-to-html@9.0.0:
resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
'@types/unist': 3.0.2
ccount: 2.0.1
comma-separated-tokens: 2.0.3
@@ -4744,7 +4520,7 @@ packages:
/hast-util-to-parse5@8.0.0:
resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
comma-separated-tokens: 2.0.3
devlop: 1.1.0
property-information: 6.4.1
@@ -4756,13 +4532,13 @@ packages:
/hast-util-whitespace@3.0.0:
resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
dev: false
/hastscript@8.0.0:
resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
comma-separated-tokens: 2.0.3
hast-util-parse-selector: 4.0.0
property-information: 6.4.1
@@ -4799,29 +4575,15 @@ packages:
/i18next-resources-to-backend@1.2.0:
resolution: {integrity: sha512-8f1l03s+QxDmCfpSXCh9V+AFcxAwIp0UaroWuyOx+hmmv8484GcELHs+lnu54FrNij8cDBEXvEwhzZoXsKcVpg==}
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
dev: false
- /i18next@23.8.1:
- resolution: {integrity: sha512-Yhe6oiJhigSh64ev7nVVywu7vHjuUG41MRmFKNwphbkadqTL1ozZFBQISflY7/ju+gL6I/SPfI1GgWQh1yYArA==}
+ /i18next@23.10.0:
+ resolution: {integrity: sha512-/TgHOqsa7/9abUKJjdPeydoyDc0oTi/7u9F8lMSj6ufg4cbC1Oj3f/Jja7zj7WRIhEQKB7Q4eN6y68I9RDxxGQ==}
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
dev: false
- /iconv-lite@0.4.24:
- resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
- engines: {node: '>=0.10.0'}
- dependencies:
- safer-buffer: 2.1.2
- dev: false
-
- /iconv-lite@0.6.3:
- resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
- engines: {node: '>=0.10.0'}
- dependencies:
- safer-buffer: 2.1.2
- dev: true
-
/ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
dev: false
@@ -4875,7 +4637,7 @@ packages:
/is-core-module@2.13.1:
resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
dependencies:
- hasown: 2.0.0
+ hasown: 2.0.1
/is-docker@3.0.0:
resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
@@ -4974,25 +4736,8 @@ packages:
resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
hasBin: true
- /jotai@2.6.3(@types/react@18.2.48)(react@18.2.0):
- resolution: {integrity: sha512-0htSJ2d6426ZdSEYHncJHXY6Lkgde1Hc2HE/ADIRi9d2L3hQL+jLKY1LkWBMeCNyOSlKH8+1u/Gc33Ox0uq21Q==}
- engines: {node: '>=12.20.0'}
- peerDependencies:
- '@types/react': '>=17.0.0'
- react: '>=17.0.0'
- peerDependenciesMeta:
- '@types/react':
- optional: true
- react:
- optional: true
- dependencies:
- '@types/react': 18.2.48
- react: 18.2.0
- dev: false
-
/js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
- dev: false
/js-yaml@3.14.1:
resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
@@ -5050,27 +4795,13 @@ packages:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
- /lilconfig@3.0.0:
- resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==}
+ /lilconfig@3.1.1:
+ resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==}
engines: {node: '>=14'}
/lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
- /linkify-react@4.1.3(linkifyjs@4.1.3)(react@18.2.0):
- resolution: {integrity: sha512-rhI3zM/fxn5BfRPHfi4r9N7zgac4vOIxub1wHIWXLA5ENTMs+BGaIaFO1D1PhmxgwhIKmJz3H7uCP0Dg5JwSlA==}
- peerDependencies:
- linkifyjs: ^4.0.0
- react: '>= 15.0.0'
- dependencies:
- linkifyjs: 4.1.3
- react: 18.2.0
- dev: false
-
- /linkifyjs@4.1.3:
- resolution: {integrity: sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==}
- dev: false
-
/load-yaml-file@0.2.0:
resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==}
engines: {node: '>=6'}
@@ -5109,6 +4840,7 @@ packages:
/lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: true
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
@@ -5131,7 +4863,6 @@ packages:
hasBin: true
dependencies:
js-tokens: 4.0.0
- dev: false
/lru-cache@10.2.0:
resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
@@ -5150,8 +4881,8 @@ packages:
yallist: 4.0.0
dev: false
- /magic-string@0.30.5:
- resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==}
+ /magic-string@0.30.7:
+ resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==}
engines: {node: '>=12'}
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
@@ -5266,8 +4997,8 @@ packages:
- supports-color
dev: false
- /mdast-util-phrasing@4.0.0:
- resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==}
+ /mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
dependencies:
'@types/mdast': 4.0.3
unist-util-is: 6.0.0
@@ -5276,7 +5007,7 @@ packages:
/mdast-util-to-hast@13.0.2:
resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
'@types/mdast': 4.0.3
'@ungap/structured-clone': 1.2.0
devlop: 1.1.0
@@ -5292,7 +5023,7 @@ packages:
'@types/mdast': 4.0.3
'@types/unist': 3.0.2
longest-streak: 3.1.0
- mdast-util-phrasing: 4.0.0
+ mdast-util-phrasing: 4.1.0
mdast-util-to-string: 4.0.0
micromark-util-decode-string: 2.0.0
unist-util-visit: 5.0.0
@@ -5305,8 +5036,8 @@ packages:
'@types/mdast': 4.0.3
dev: false
- /media-chrome@2.1.0:
- resolution: {integrity: sha512-ceUEE9tHVIe7KNmjtWq4oCOx1oYq09VyL3A9EP1MDGnFot0eOoLuDfaye/koe8+4tzhB4/yGyn8pIGuvzF85lg==}
+ /media-chrome@2.2.5:
+ resolution: {integrity: sha512-59peAYFlL9ZlFVkKJmIgIDNMkQr4nauYTwIQhLg3khmGfO6/25VNEI8Yn0aUMLb5IFB2gzjcPmfu1ktfOhQ8Ag==}
dev: false
/merge-stream@2.0.0:
@@ -5571,22 +5302,6 @@ packages:
braces: 3.0.2
picomatch: 2.3.1
- /million@2.6.4:
- resolution: {integrity: sha512-voUkdd/jHWrG+7NS+mX49Pat+POKdgGW78V7pYMSrTaOjUitR6ySEcAci8hn17Rsx1IMI3+5w41dkADM1J1ZEg==}
- hasBin: true
- dependencies:
- '@babel/core': 7.23.9
- '@babel/generator': 7.23.6
- '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9)
- '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9)
- '@babel/types': 7.23.9
- kleur: 4.1.5
- rollup: 3.29.4
- unplugin: 1.6.0
- transitivePeerDependencies:
- - supports-color
- dev: false
-
/mime@3.0.0:
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
engines: {node: '>=10.0.0'}
@@ -5649,12 +5364,8 @@ packages:
/ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
- /ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- dev: false
-
- /muggle-string@0.3.1:
- resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==}
+ /muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
dev: false
/mz@2.7.0:
@@ -5669,8 +5380,8 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- /nanoid@5.0.4:
- resolution: {integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==}
+ /nanoid@5.0.6:
+ resolution: {integrity: sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==}
engines: {node: ^18 || >=20}
hasBin: true
dev: false
@@ -5681,18 +5392,6 @@ packages:
dev: false
optional: true
- /needle@2.9.1:
- resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==}
- engines: {node: '>= 4.4.x'}
- hasBin: true
- dependencies:
- debug: 3.2.7
- iconv-lite: 0.4.24
- sax: 1.3.0
- transitivePeerDependencies:
- - supports-color
- dev: false
-
/next-tick@1.1.0:
resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
dev: false
@@ -5703,12 +5402,12 @@ packages:
'@types/nlcst': 1.0.4
dev: false
- /node-abi@3.54.0:
- resolution: {integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==}
+ /node-abi@3.56.0:
+ resolution: {integrity: sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==}
engines: {node: '>=10'}
requiresBuild: true
dependencies:
- semver: 7.5.4
+ semver: 7.6.0
dev: false
optional: true
@@ -5753,12 +5452,6 @@ packages:
engines: {node: '>=14.16'}
dev: false
- /nostr-fetch@0.15.0:
- resolution: {integrity: sha512-j/Mu1M6tDVoyjtEec+ZzV1MqFIq+Y9UffiB/bJki1DVKZHpp6WYYfiAbyiuOxNRomZvnNciT8cWMeqJFFzv2xw==}
- dependencies:
- '@nostr-fetch/kernel': 0.15.0
- dev: false
-
/nostr-tools@1.17.0(typescript@5.3.3):
resolution: {integrity: sha512-LZmR8GEWKZeElbFV5Xte75dOeE9EFUW/QLI1Ncn3JKn0kFddDKEfBbFN8Mu4TMs+L4HR/WTPha2l+PPuRnJcMw==}
peerDependencies:
@@ -5776,8 +5469,33 @@ packages:
typescript: 5.3.3
dev: false
- /npm-run-path@5.2.0:
- resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==}
+ /nostr-tools@2.3.1(typescript@5.3.3):
+ resolution: {integrity: sha512-qjKx2C3EzwiQOe2LPSPyCnp07pGz1pWaWjDXcm+L2y2c8iTECbvlzujDANm3nJUjWL5+LVRUVDovTZ1a/DC4Bg==}
+ peerDependencies:
+ typescript: '>=5.0.0'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@noble/ciphers': 0.5.1
+ '@noble/curves': 1.2.0
+ '@noble/hashes': 1.3.1
+ '@scure/base': 1.1.1
+ '@scure/bip32': 1.3.1
+ '@scure/bip39': 1.2.1
+ typescript: 5.3.3
+ optionalDependencies:
+ nostr-wasm: 0.1.0
+ dev: false
+
+ /nostr-wasm@0.1.0:
+ resolution: {integrity: sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA==}
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
path-key: 4.0.0
@@ -5954,27 +5672,27 @@ packages:
find-up: 4.1.0
dev: false
- /postcss-import@15.1.0(postcss@8.4.33):
+ /postcss-import@15.1.0(postcss@8.4.35):
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'}
peerDependencies:
postcss: ^8.0.0
dependencies:
- postcss: 8.4.33
+ postcss: 8.4.35
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.8
- /postcss-js@4.0.1(postcss@8.4.33):
+ /postcss-js@4.0.1(postcss@8.4.35):
resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
engines: {node: ^12 || ^14 || >= 16}
peerDependencies:
postcss: ^8.4.21
dependencies:
camelcase-css: 2.0.1
- postcss: 8.4.33
+ postcss: 8.4.35
- /postcss-load-config@4.0.2(postcss@8.4.33):
+ /postcss-load-config@4.0.2(postcss@8.4.35):
resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
engines: {node: '>= 14'}
peerDependencies:
@@ -5986,17 +5704,17 @@ packages:
ts-node:
optional: true
dependencies:
- lilconfig: 3.0.0
- postcss: 8.4.33
- yaml: 2.3.4
+ lilconfig: 3.1.1
+ postcss: 8.4.35
+ yaml: 2.4.0
- /postcss-nested@6.0.1(postcss@8.4.33):
+ /postcss-nested@6.0.1(postcss@8.4.35):
resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.2.14
dependencies:
- postcss: 8.4.33
+ postcss: 8.4.35
postcss-selector-parser: 6.0.15
/postcss-selector-parser@6.0.10:
@@ -6017,8 +5735,8 @@ packages:
/postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
- /postcss@8.4.33:
- resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==}
+ /postcss@8.4.35:
+ resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.7
@@ -6037,7 +5755,7 @@ packages:
minimist: 1.2.8
mkdirp-classic: 0.5.3
napi-build-utils: 1.0.2
- node-abi: 3.54.0
+ node-abi: 3.56.0
pump: 3.0.0
rc: 1.2.8
simple-get: 4.0.1
@@ -6046,8 +5764,8 @@ packages:
dev: false
optional: true
- /preferred-pm@3.1.2:
- resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==}
+ /preferred-pm@3.1.3:
+ resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==}
engines: {node: '>=10'}
dependencies:
find-up: 5.0.0
@@ -6056,21 +5774,17 @@ packages:
which-pm: 2.0.0
dev: false
+ /prettier@3.2.5:
+ resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dev: true
+
/prismjs@1.29.0:
resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
engines: {node: '>=6'}
dev: false
- /probe-image-size@7.2.3:
- resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==}
- dependencies:
- lodash.merge: 4.6.2
- needle: 2.9.1
- stream-parser: 0.3.1
- transitivePeerDependencies:
- - supports-color
- dev: false
-
/prompts@2.4.2:
resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
engines: {node: '>= 6'}
@@ -6109,27 +5823,27 @@ packages:
dev: false
optional: true
- /ranges-apply@7.0.14:
- resolution: {integrity: sha512-ebPhmznZthJJszHMzGdZIVEHxWxM9uiynCGHChtgbuKO155uYCdrUvwsobX6xeefyqtVgHJcXpQDkTJhX0UFoQ==}
+ /ranges-apply@7.0.15:
+ resolution: {integrity: sha512-YMYWexEb5+irsSRGCV4JnWflhc5TvMNbaZrqNTXQYD6vA6hk60CrPZyd5bxTUoZ8Phd1v80UIQJCoxh+bSiHdg==}
engines: {node: '>=14.18.0'}
dependencies:
- ranges-merge: 9.0.14
- tiny-invariant: 1.3.1
+ ranges-merge: 9.0.15
+ tiny-invariant: 1.3.3
dev: false
- /ranges-merge@9.0.14:
- resolution: {integrity: sha512-0iT8T14RPellWrLsfezpIq636TyqCK8+1oG7pxULjuJHwomq6POJF63fZ3CeQ7c/Dpjogs5iSOFc2hFv+XTI1Q==}
+ /ranges-merge@9.0.15:
+ resolution: {integrity: sha512-hvt4hx0FKIaVfjd1oKx0poL57ljxdL2KHC6bXBrAdsx2iCsH+x7nO/5J0k2veM/isnOcFZKp0ZKkiCjCtzy74Q==}
engines: {node: '>=14.18.0'}
dependencies:
- ranges-push: 7.0.14
+ ranges-push: 7.0.15
ranges-sort: 6.0.11
dev: false
- /ranges-push@7.0.14:
- resolution: {integrity: sha512-EKmOrxtaFT4u3OiIfkoCoYxEeRkN2UuH1DbxvA7K/ok4Ie8/QK/DKaWbD9PnoXNnWbqnPtDdyMyvVgVyhnmGhA==}
+ /ranges-push@7.0.15:
+ resolution: {integrity: sha512-gXpBYQ5Umf3uG6jkJnw5ddok2Xfo5p22rAJBLrqzNKa7qkj3q5AOCoxfRPXEHUVaJutfXc9K9eGXdIzdyQKPkw==}
engines: {node: '>=14.18.0'}
dependencies:
- codsen-utils: 1.6.3
+ codsen-utils: 1.6.4
ranges-sort: 6.0.11
string-collapse-leading-whitespace: 7.0.7
string-trim-spaces-only: 5.0.10
@@ -6162,8 +5876,8 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
- /react-currency-input-field@3.6.14(react@18.2.0):
- resolution: {integrity: sha512-pUM4oK1KkUjjcFH7t6GksbuYwGpNhX3We2l41V9PIyJjm1HVlJGbKNksr0PNXGsQZqXDIKBJxL3TAbTS4cbKgg==}
+ /react-currency-input-field@3.8.0(react@18.2.0):
+ resolution: {integrity: sha512-DKSIjacrvgUDOpuB16b+OVDvp5pbCt+s+RHJgpRZCHNhzg1yBpRUoy4fbnXpeOj0kdbwf5BaXCr2mAtxEujfhg==}
peerDependencies:
react: ^16.9.0 || ^17.0.0 || ^18.0.0
dependencies:
@@ -6178,19 +5892,18 @@ packages:
loose-envify: 1.4.0
react: 18.2.0
scheduler: 0.23.0
- dev: false
- /react-hook-form@7.49.3(react@18.2.0):
- resolution: {integrity: sha512-foD6r3juidAT1cOZzpmD/gOKt7fRsDhXXZ0y28+Al1CHgX+AY1qIN9VSIIItXRq1dN68QrRwl1ORFlwjBaAqeQ==}
- engines: {node: '>=18', pnpm: '8'}
+ /react-hook-form@7.50.1(react@18.2.0):
+ resolution: {integrity: sha512-3PCY82oE0WgeOgUtIr3nYNNtNvqtJ7BZjsbxh6TnYNbXButaD5WpjOmTjdxZfheuHKR68qfeFnEDVYoSSFPMTQ==}
+ engines: {node: '>=12.22.0'}
peerDependencies:
react: ^16.8.0 || ^17 || ^18
dependencies:
react: 18.2.0
dev: false
- /react-hotkeys-hook@4.4.4(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-wzZmqb/Obr0ds9Myc1sIFPJ52GA/Eeg/vXBWV0HA1LvHlVAW5Va3KB0q6EZNlNSHQWscWZ2K8+6w0GYSie2o7A==}
+ /react-hotkeys-hook@4.5.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Samb85GSgAWFQNvVt3PS90LPPGSf9mkH/r4au81ZP1yOIFayLC3QAvqTgGtJ8YEDMXtPmaVBs6NgipHO6h4Mug==}
peerDependencies:
react: '>=16.8.1'
react-dom: '>=16.8.1'
@@ -6199,8 +5912,8 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
- /react-i18next@14.0.1(i18next@23.8.1)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-TMV8hFismBmpMdIehoFHin/okfvgjFhp723RYgIqB4XyhDobVMyukyM3Z8wtTRmajyFMZrBl/OaaXF2P6WjUAw==}
+ /react-i18next@14.0.5(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-5+bQSeEtgJrMBABBL5lO7jPdSNAbeAZ+MlFWDw//7FnVacuVu3l9EeWFzBQvZsKy+cihkbThWOAThEdH8YjGEw==}
peerDependencies:
i18next: '>= 23.2.3'
react: '>= 16.8.0'
@@ -6212,15 +5925,15 @@ packages:
react-native:
optional: true
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
html-parse-stringify: 3.0.1
- i18next: 23.8.1
+ i18next: 23.10.0
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /react-remove-scroll-bar@2.3.4(@types/react@18.2.48)(react@18.2.0):
- resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==}
+ /react-remove-scroll-bar@2.3.5(@types/react@18.2.60)(react@18.2.0):
+ resolution: {integrity: sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==}
engines: {node: '>=10'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
@@ -6229,13 +5942,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@types/react': 18.2.48
+ '@types/react': 18.2.60
react: 18.2.0
- react-style-singleton: 2.2.1(@types/react@18.2.48)(react@18.2.0)
+ react-style-singleton: 2.2.1(@types/react@18.2.60)(react@18.2.0)
tslib: 2.6.2
dev: false
- /react-remove-scroll@2.5.5(@types/react@18.2.48)(react@18.2.0):
+ /react-remove-scroll@2.5.5(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==}
engines: {node: '>=10'}
peerDependencies:
@@ -6245,35 +5958,35 @@ packages:
'@types/react':
optional: true
dependencies:
- '@types/react': 18.2.48
+ '@types/react': 18.2.60
react: 18.2.0
- react-remove-scroll-bar: 2.3.4(@types/react@18.2.48)(react@18.2.0)
- react-style-singleton: 2.2.1(@types/react@18.2.48)(react@18.2.0)
+ react-remove-scroll-bar: 2.3.5(@types/react@18.2.60)(react@18.2.0)
+ react-style-singleton: 2.2.1(@types/react@18.2.60)(react@18.2.0)
tslib: 2.6.2
- use-callback-ref: 1.3.1(@types/react@18.2.48)(react@18.2.0)
- use-sidecar: 1.1.2(@types/react@18.2.48)(react@18.2.0)
+ use-callback-ref: 1.3.1(@types/react@18.2.60)(react@18.2.0)
+ use-sidecar: 1.1.2(@types/react@18.2.60)(react@18.2.0)
dev: false
- /react-router-dom@6.21.3(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==}
+ /react-router-dom@6.22.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-WgqxD2qySEIBPZ3w0sHH+PUAiamDeszls9tzqMPBDA1YYVucTBXLU7+gtRfcSnhe92A3glPnvSxK2dhNoAVOIQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: '>=16.8'
react-dom: '>=16.8'
dependencies:
- '@remix-run/router': 1.14.2
+ '@remix-run/router': 1.15.2
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- react-router: 6.21.3(react@18.2.0)
+ react-router: 6.22.2(react@18.2.0)
dev: false
- /react-router@6.21.3(react@18.2.0):
- resolution: {integrity: sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==}
+ /react-router@6.22.2(react@18.2.0):
+ resolution: {integrity: sha512-YD3Dzprzpcq+tBMHBS822tCjnWD3iIZbTeSXMY9LPSG541EfoBGyZ3bS25KEnaZjLcmQpw2AVLkFyfgXY8uvcw==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: '>=16.8'
dependencies:
- '@remix-run/router': 1.14.2
+ '@remix-run/router': 1.15.2
react: 18.2.0
dev: false
@@ -6282,7 +5995,7 @@ packages:
engines: {node: '>=0.12.0'}
dev: false
- /react-style-singleton@2.2.1(@types/react@18.2.48)(react@18.2.0):
+ /react-style-singleton@2.2.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
engines: {node: '>=10'}
peerDependencies:
@@ -6292,7 +6005,7 @@ packages:
'@types/react':
optional: true
dependencies:
- '@types/react': 18.2.48
+ '@types/react': 18.2.60
get-nonce: 1.0.1
invariant: 2.2.4
react: 18.2.0
@@ -6304,7 +6017,6 @@ packages:
engines: {node: '>=0.10.0'}
dependencies:
loose-envify: 1.4.0
- dev: false
/read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
@@ -6332,7 +6044,7 @@ packages:
/rehype-parse@9.0.0:
resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
hast-util-from-html: 2.0.1
unified: 11.0.4
dev: false
@@ -6340,7 +6052,7 @@ packages:
/rehype-raw@7.0.0:
resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
hast-util-raw: 9.0.2
vfile: 6.0.1
dev: false
@@ -6348,7 +6060,7 @@ packages:
/rehype-stringify@10.0.0:
resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
hast-util-to-html: 9.0.0
unified: 11.0.4
dev: false
@@ -6356,7 +6068,7 @@ packages:
/rehype@13.0.1:
resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
rehype-parse: 9.0.0
rehype-stringify: 10.0.0
unified: 11.0.4
@@ -6389,7 +6101,7 @@ packages:
/remark-rehype@11.1.0:
resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
'@types/mdast': 4.0.3
mdast-util-to-hast: 13.0.2
unified: 11.0.4
@@ -6481,34 +6193,26 @@ packages:
resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==}
dev: false
- /rollup@3.29.4:
- resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
- engines: {node: '>=14.18.0', npm: '>=8.0.0'}
- hasBin: true
- optionalDependencies:
- fsevents: 2.3.3
- dev: false
-
- /rollup@4.9.6:
- resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==}
+ /rollup@4.12.0:
+ resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
dependencies:
'@types/estree': 1.0.5
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.9.6
- '@rollup/rollup-android-arm64': 4.9.6
- '@rollup/rollup-darwin-arm64': 4.9.6
- '@rollup/rollup-darwin-x64': 4.9.6
- '@rollup/rollup-linux-arm-gnueabihf': 4.9.6
- '@rollup/rollup-linux-arm64-gnu': 4.9.6
- '@rollup/rollup-linux-arm64-musl': 4.9.6
- '@rollup/rollup-linux-riscv64-gnu': 4.9.6
- '@rollup/rollup-linux-x64-gnu': 4.9.6
- '@rollup/rollup-linux-x64-musl': 4.9.6
- '@rollup/rollup-win32-arm64-msvc': 4.9.6
- '@rollup/rollup-win32-ia32-msvc': 4.9.6
- '@rollup/rollup-win32-x64-msvc': 4.9.6
+ '@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
fsevents: 2.3.3
/run-parallel@1.2.0:
@@ -6520,18 +6224,10 @@ packages:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: false
- /safer-buffer@2.1.2:
- resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
-
- /sax@1.3.0:
- resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==}
- dev: false
-
/scheduler@0.23.0:
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
dependencies:
loose-envify: 1.4.0
- dev: false
/schema-dts@1.1.2(typescript@5.3.3):
resolution: {integrity: sha512-MpNwH0dZJHinVxk9bT8XUdjKTxMYrA5bLtrrGmFA6PTLwlOKnhi67XoRd6/ty+Djt6ZC0slR57qFhZDNMI6DhQ==}
@@ -6560,18 +6256,14 @@ packages:
hasBin: true
dev: false
- /semver@7.5.4:
- resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+ /semver@7.6.0:
+ resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
engines: {node: '>=10'}
hasBin: true
dependencies:
lru-cache: 6.0.0
dev: false
- /server-destroy@1.0.1:
- resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==}
- dev: false
-
/sharp@0.32.6:
resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==}
engines: {node: '>=14.15.0'}
@@ -6581,9 +6273,9 @@ packages:
detect-libc: 2.0.2
node-addon-api: 6.1.0
prebuild-install: 7.1.1
- semver: 7.5.4
+ semver: 7.6.0
simple-get: 4.0.1
- tar-fs: 3.0.4
+ tar-fs: 3.0.5
tunnel-agent: 0.6.0
dev: false
optional: true
@@ -6673,13 +6365,8 @@ packages:
tiny-warning: 1.0.3
dev: false
- /smol-toml@1.1.4:
- resolution: {integrity: sha512-Y0OT8HezWsTNeEOSVxDnKOW/AyNXHQ4BwJNbAXlLTF5wWsBvrcHhIkE5Rf8kQMLmgf7nDX3PVOlgC6/Aiggu3Q==}
- engines: {node: '>= 18', pnpm: '>= 8'}
- dev: false
-
- /sonner@1.4.0(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-nvkTsIuOmi9e5Wz5If8ldasJjZNVfwiXYijBi2dbijvTQnQppvMcXTFNxL/NUFWlI2yJ1JX7TREDsg+gYm9WyA==}
+ /sonner@1.4.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-x3Kfzfhb56V/ErvUnH5dZcsu6QkZpyIlRAogO4vAbN+AkBsA/8CFqOV+5djqbE5pQCpejtO4JBWL1zRj2sO/Vg==}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
@@ -6707,20 +6394,14 @@ packages:
bl: 5.1.0
dev: false
- /stream-parser@0.3.1:
- resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==}
- dependencies:
- debug: 2.6.9
- transitivePeerDependencies:
- - supports-color
- dev: false
-
- /streamx@2.15.6:
- resolution: {integrity: sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==}
+ /streamx@2.16.1:
+ resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==}
requiresBuild: true
dependencies:
fast-fifo: 1.3.2
queue-tick: 1.0.1
+ optionalDependencies:
+ bare-events: 2.2.0
dev: false
optional: true
@@ -6729,25 +6410,25 @@ packages:
engines: {node: '>=14.18.0'}
dev: false
- /string-left-right@6.0.16:
- resolution: {integrity: sha512-cQL1I49o8qS52LgaS8IU6EXd9S2HNYVRtizdDyp6XjKzSkytr1oTM/7laDqjV7J53bw4iOQNepp/cTs9rCyFVw==}
+ /string-left-right@6.0.17:
+ resolution: {integrity: sha512-nuyIV4D4ivnwT64E0TudmCRg52NfkumuEUilyoOrHb/Z2wEOF5I+9SI6P+veFKqWKZfGpAs6OqKe4nAjujARyw==}
engines: {node: '>=14.18.0'}
dependencies:
- codsen-utils: 1.6.3
+ codsen-utils: 1.6.4
rfdc: 1.3.1
dev: false
- /string-strip-html@13.4.5:
- resolution: {integrity: sha512-uf6o6zzYXccZQ+wsKN58cedBfMlbFqrUXcDjrBpptExgQEHcFU+uw1jAQdrfyOrAyH4GQKu7JcCm/wzPppnf5Q==}
+ /string-strip-html@13.4.6:
+ resolution: {integrity: sha512-I1uUTS/BGQ/3jj+9WF6GENATSUPy9UruqVHdvAikOqlvFvlOAQL8M3qjoLu60Usp2x3yJpnAYtUTzDYiDdqXqg==}
engines: {node: '>=14.18.0'}
dependencies:
'@types/lodash-es': 4.17.12
- codsen-utils: 1.6.3
+ codsen-utils: 1.6.4
html-entities: 2.4.0
lodash-es: 4.17.21
- ranges-apply: 7.0.14
- ranges-push: 7.0.14
- string-left-right: 6.0.16
+ ranges-apply: 7.0.15
+ ranges-push: 7.0.15
+ string-left-right: 6.0.17
dev: false
/string-trim-spaces-only@5.0.10:
@@ -6841,7 +6522,7 @@ packages:
engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
dependencies:
- '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/gen-mapping': 0.3.4
commander: 4.1.1
glob: 10.3.10
lines-and-columns: 1.2.4
@@ -6872,10 +6553,11 @@ packages:
/tailwind-merge@2.2.1:
resolution: {integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==}
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
+ dev: true
- /tailwind-scrollbar@3.0.5(tailwindcss@3.4.1):
- resolution: {integrity: sha512-0ZwxTivevqq9BY9fRP9zDjHl7Tu+J5giBGbln+0O1R/7nHtBUKnjQcA1aTIhK7Oyjp6Uc/Dj6/dn8Dq58k5Uww==}
+ /tailwind-scrollbar@3.1.0(tailwindcss@3.4.1):
+ resolution: {integrity: sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==}
engines: {node: '>=12.13.0'}
peerDependencies:
tailwindcss: 3.x
@@ -6890,7 +6572,7 @@ packages:
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
- chokidar: 3.5.3
+ chokidar: 3.6.0
didyoumean: 1.2.2
dlv: 1.1.3
fast-glob: 3.3.2
@@ -6902,11 +6584,11 @@ packages:
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.0.0
- postcss: 8.4.33
- postcss-import: 15.1.0(postcss@8.4.33)
- postcss-js: 4.0.1(postcss@8.4.33)
- postcss-load-config: 4.0.2(postcss@8.4.33)
- postcss-nested: 6.0.1(postcss@8.4.33)
+ postcss: 8.4.35
+ postcss-import: 15.1.0(postcss@8.4.35)
+ postcss-js: 4.0.1(postcss@8.4.35)
+ postcss-load-config: 4.0.2(postcss@8.4.35)
+ postcss-nested: 6.0.1(postcss@8.4.35)
postcss-selector-parser: 6.0.15
resolve: 1.22.8
sucrase: 3.35.0
@@ -6924,13 +6606,15 @@ packages:
dev: false
optional: true
- /tar-fs@3.0.4:
- resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==}
+ /tar-fs@3.0.5:
+ resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==}
requiresBuild: true
dependencies:
- mkdirp-classic: 0.5.3
pump: 3.0.0
tar-stream: 3.1.7
+ optionalDependencies:
+ bare-fs: 2.2.0
+ bare-path: 2.1.0
dev: false
optional: true
@@ -6951,9 +6635,9 @@ packages:
resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
requiresBuild: true
dependencies:
- b4a: 1.6.4
+ b4a: 1.6.6
fast-fifo: 1.3.2
- streamx: 2.15.6
+ streamx: 2.16.1
dev: false
optional: true
@@ -6979,18 +6663,14 @@ packages:
resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==}
dev: false
+ /tiny-invariant@1.3.3:
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+
/tiny-warning@1.0.3:
resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
- dev: false
- /tippy.js@6.3.7:
- resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==}
- dependencies:
- '@popperjs/core': 2.11.8
- dev: false
-
- /tlds@1.249.0:
- resolution: {integrity: sha512-PfcE+oqaEhs0U3RDNg4uGg37793cGvlK6+aLAetwR0ImFyV3R2ts1KvU2RfJdtoLn7IFnUEftFFz4br5Wr3caA==}
+ /tlds@1.250.0:
+ resolution: {integrity: sha512-rWsBfFCWKrjM/o2Q1TTUeYQv6tHSd/umUutDjVs6taTuEgRDIreVYIBgWRWW4ot7jp6n0UVUuxhTLWBtUmPu/w==}
hasBin: true
dev: false
@@ -7009,15 +6689,15 @@ packages:
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
dev: false
- /trough@2.1.0:
- resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==}
+ /trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
dev: false
/ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- /tsconfck@3.0.1(typescript@5.3.3):
- resolution: {integrity: sha512-7ppiBlF3UEddCLeI1JRx5m2Ryq+xk4JrZuq4EuYXykipebaq1dV0Fhgr1hb7CkmHt32QSgOZlcqVLEtHBG4/mg==}
+ /tsconfck@3.0.2(typescript@5.3.3):
+ resolution: {integrity: sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q==}
engines: {node: ^18 || >=20}
hasBin: true
peerDependencies:
@@ -7028,8 +6708,8 @@ packages:
dependencies:
typescript: 5.3.3
- /tseep@1.2.0:
- resolution: {integrity: sha512-9YApl3bP9/Onk8IirhZltxFWtDg6Qsij2cxHVu24evhBBhf7ChfENNtAkYvB/GLLvCErFVqPaaXgZqCnmjrXiA==}
+ /tseep@1.2.1:
+ resolution: {integrity: sha512-VFnsNcPGC4qFJ1nxbIPSjTmtRZOhlqLmtwRqtLVos8mbRHki8HO9cy9Z1e89EiWyxFmq6LBviI9TQjijxw/mEw==}
dev: false
/tslib@2.6.2:
@@ -7048,64 +6728,64 @@ packages:
dev: false
optional: true
- /turbo-darwin-64@1.11.3:
- resolution: {integrity: sha512-IsOOg2bVbIt3o/X8Ew9fbQp5t1hTHN3fGNQYrPQwMR2W1kIAC6RfbVD4A9OeibPGyEPUpwOH79hZ9ydFH5kifw==}
+ /turbo-darwin-64@1.12.4:
+ resolution: {integrity: sha512-dBwFxhp9isTa9RS/fz2gDVk5wWhKQsPQMozYhjM7TT4jTrnYn0ZJMzr7V3B/M/T8QF65TbniW7w1gtgxQgX5Zg==}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
- /turbo-darwin-arm64@1.11.3:
- resolution: {integrity: sha512-FsJL7k0SaPbJzI/KCnrf/fi3PgCDCjTliMc/kEFkuWVA6Httc3Q4lxyLIIinz69q6JTx8wzh6yznUMzJRI3+dg==}
+ /turbo-darwin-arm64@1.12.4:
+ resolution: {integrity: sha512-1Uo5iI6xsJ1j9ObsqxYRsa3W26mEbUe6fnj4rQYV6kDaqYD54oAMJ6hM53q9rB8JvFxwdrUXGp3PwTw9A0qqkA==}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
- /turbo-linux-64@1.11.3:
- resolution: {integrity: sha512-SvW7pvTVRGsqtSkII5w+wriZXvxqkluw5FO/MNAdFw0qmoov+PZ237+37/NgArqE3zVn1GX9P6nUx9VO+xcQAg==}
+ /turbo-linux-64@1.12.4:
+ resolution: {integrity: sha512-ONg2aSqKP7LAQOg7ysmU5WpEQp4DGNxSlAiR7um+LKtbmC/UxogbR5+T+Uuq6zGuQ5kJyKjWJ4NhtvUswOqBsA==}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
- /turbo-linux-arm64@1.11.3:
- resolution: {integrity: sha512-YhUfBi1deB3m+3M55X458J6B7RsIS7UtM3P1z13cUIhF+pOt65BgnaSnkHLwETidmhRh8Dl3GelaQGrB3RdCDw==}
+ /turbo-linux-arm64@1.12.4:
+ resolution: {integrity: sha512-9FPufkwdgfIKg/9jj87Cdtftw8o36y27/S2vLN7FTR2pp9c0MQiTBOLVYadUr1FlShupddmaMbTkXEhyt9SdrA==}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
- /turbo-windows-64@1.11.3:
- resolution: {integrity: sha512-s+vEnuM2TiZuAUUUpmBHDr6vnNbJgj+5JYfnYmVklYs16kXh+EppafYQOAkcRIMAh7GjV3pLq5/uGqc7seZeHA==}
+ /turbo-windows-64@1.12.4:
+ resolution: {integrity: sha512-2mOtxHW5Vjh/5rDVu/aFwsMzI+chs8XcEuJHlY1sYOpEymYTz+u6AXbnzRvwZFMrLKr7J7fQOGl+v96sLKbNdA==}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
- /turbo-windows-arm64@1.11.3:
- resolution: {integrity: sha512-ZR5z5Zpc7cASwfdRAV5yNScCZBsgGSbcwiA/u3farCacbPiXsfoWUkz28iyrx21/TRW0bi6dbsB2v17swa8bjw==}
+ /turbo-windows-arm64@1.12.4:
+ resolution: {integrity: sha512-nOY5wae9qnxPOpT1fRuYO0ks6dTwpKMPV6++VkDkamFDLFHUDVM/9kmD2UTeh1yyrKnrZksbb9zmShhmfj1wog==}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
- /turbo@1.11.3:
- resolution: {integrity: sha512-RCJOUFcFMQNIGKSjC9YmA5yVP1qtDiBA0Lv9VIgrXraI5Da1liVvl3VJPsoDNIR9eFMyA/aagx1iyj6UWem5hA==}
+ /turbo@1.12.4:
+ resolution: {integrity: sha512-yUJ7elEUSToiGwFZogXpYKJpQ0BvaMbkEuQECIWtkBLcmWzlMOt6bActsIm29oN83mRU0WbzGt4e8H1KHWedhg==}
hasBin: true
optionalDependencies:
- turbo-darwin-64: 1.11.3
- turbo-darwin-arm64: 1.11.3
- turbo-linux-64: 1.11.3
- turbo-linux-arm64: 1.11.3
- turbo-windows-64: 1.11.3
- turbo-windows-arm64: 1.11.3
+ turbo-darwin-64: 1.12.4
+ turbo-darwin-arm64: 1.12.4
+ turbo-linux-64: 1.12.4
+ turbo-linux-arm64: 1.12.4
+ turbo-windows-64: 1.12.4
+ turbo-windows-arm64: 1.12.4
dev: true
/type-fest@2.19.0:
@@ -7134,7 +6814,7 @@ packages:
/typescript-auto-import-cache@0.3.2:
resolution: {integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==}
dependencies:
- semver: 7.5.4
+ semver: 7.6.0
dev: false
/typescript-lru-cache@2.0.0:
@@ -7146,9 +6826,6 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
- /undici-types@5.26.5:
- resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
-
/unherit@3.0.1:
resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==}
dev: false
@@ -7161,7 +6838,7 @@ packages:
extend: 3.0.2
is-buffer: 2.0.5
is-plain-obj: 4.1.0
- trough: 2.1.0
+ trough: 2.2.0
vfile: 5.3.7
dev: false
@@ -7173,7 +6850,7 @@ packages:
devlop: 1.1.0
extend: 3.0.2
is-plain-obj: 4.1.0
- trough: 2.1.0
+ trough: 2.2.0
vfile: 6.0.1
dev: false
@@ -7250,23 +6927,14 @@ packages:
unist-util-visit-parents: 6.0.1
dev: false
- /unplugin@1.6.0:
- resolution: {integrity: sha512-BfJEpWBu3aE/AyHx8VaNE/WgouoQxgH9baAiH82JjX8cqVyi3uJQstqwD5J+SZxIK326SZIhsSZlALXVBCknTQ==}
- dependencies:
- acorn: 8.11.3
- chokidar: 3.5.3
- webpack-sources: 3.2.3
- webpack-virtual-modules: 0.6.1
- dev: false
-
- /update-browserslist-db@1.0.13(browserslist@4.22.3):
+ /update-browserslist-db@1.0.13(browserslist@4.23.0):
resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
dependencies:
- browserslist: 4.22.3
- escalade: 3.1.1
+ browserslist: 4.23.0
+ escalade: 3.1.2
picocolors: 1.0.0
/uqr@0.1.2:
@@ -7283,10 +6951,10 @@ packages:
optional: true
dependencies:
ip-regex: 4.3.0
- tlds: 1.249.0
+ tlds: 1.250.0
dev: false
- /use-callback-ref@1.3.1(@types/react@18.2.48)(react@18.2.0):
+ /use-callback-ref@1.3.1(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==}
engines: {node: '>=10'}
peerDependencies:
@@ -7296,29 +6964,11 @@ packages:
'@types/react':
optional: true
dependencies:
- '@types/react': 18.2.48
+ '@types/react': 18.2.60
react: 18.2.0
tslib: 2.6.2
dev: false
- /use-context-selector@1.4.1(react-dom@18.2.0)(react@18.2.0)(scheduler@0.23.0):
- resolution: {integrity: sha512-Io2ArvcRO+6MWIhkdfMFt+WKQX+Vb++W8DS2l03z/Vw/rz3BclKpM0ynr4LYGyU85Eke+Yx5oIhTY++QR0ZDoA==}
- peerDependencies:
- react: '>=16.8.0'
- react-dom: '*'
- react-native: '*'
- scheduler: '>=0.19.0'
- peerDependenciesMeta:
- react-dom:
- optional: true
- react-native:
- optional: true
- dependencies:
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- scheduler: 0.23.0
- dev: false
-
/use-debounce@10.0.0(react@18.2.0):
resolution: {integrity: sha512-XRjvlvCB46bah9IBXVnq/ACP2lxqXyZj0D9hj4K5OzNroMDpTEBg8Anuh1/UfRTRs7pLhQ+RiNxxwZu9+MVl1A==}
engines: {node: '>= 16.0.0'}
@@ -7328,7 +6978,7 @@ packages:
react: 18.2.0
dev: false
- /use-sidecar@1.1.2(@types/react@18.2.48)(react@18.2.0):
+ /use-sidecar@1.1.2(@types/react@18.2.60)(react@18.2.0):
resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
engines: {node: '>=10'}
peerDependencies:
@@ -7338,12 +6988,19 @@ packages:
'@types/react':
optional: true
dependencies:
- '@types/react': 18.2.48
+ '@types/react': 18.2.60
detect-node-es: 1.1.0
react: 18.2.0
tslib: 2.6.2
dev: false
+ /use-sync-external-store@1.2.0(react@18.2.0):
+ resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 18.2.0
+
/utf-8-validate@5.0.10:
resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==}
engines: {node: '>=6.14.2'}
@@ -7403,8 +7060,8 @@ packages:
vfile-message: 4.0.2
dev: false
- /virtua@0.23.0(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-ej1U22MH9j214U5RRwlNIhke3EW04fFclrTeFZmdyeQYZgr98csrzol637z5HaGjAh3ONnoKTxJidll6yMQZxw==}
+ /virtua@0.27.5(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-VeiK2eMCHDmNJvP1GO+DB8rX5ACAxrzFRMGIcqoZK+eqnS25C6lSnuZO4XXLK+RmFkPAoHApMZZTf5ngrpcSMw==}
peerDependencies:
react: '>=16.14.0'
react-dom: '>=16.14.0'
@@ -7424,21 +7081,21 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
- /vite-plugin-top-level-await@1.4.1(vite@5.0.12):
+ /vite-plugin-top-level-await@1.4.1(vite@5.1.4):
resolution: {integrity: sha512-hogbZ6yT7+AqBaV6lK9JRNvJDn4/IJvHLu6ET06arNfo0t2IsyCaon7el9Xa8OumH+ESuq//SDf8xscZFE0rWw==}
peerDependencies:
vite: '>=2.8'
dependencies:
'@rollup/plugin-virtual': 3.0.2
- '@swc/core': 1.3.107
+ '@swc/core': 1.4.2
uuid: 9.0.1
- vite: 5.0.12(@types/node@20.11.10)
+ vite: 5.1.4
transitivePeerDependencies:
- '@swc/helpers'
- rollup
dev: true
- /vite-tsconfig-paths@4.3.1(typescript@5.3.3)(vite@5.0.12):
+ /vite-tsconfig-paths@4.3.1(typescript@5.3.3)(vite@5.1.4):
resolution: {integrity: sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==}
peerDependencies:
vite: '*'
@@ -7448,15 +7105,15 @@ packages:
dependencies:
debug: 4.3.4
globrex: 0.1.2
- tsconfck: 3.0.1(typescript@5.3.3)
- vite: 5.0.12(@types/node@20.11.10)
+ tsconfck: 3.0.2(typescript@5.3.3)
+ vite: 5.1.4
transitivePeerDependencies:
- supports-color
- typescript
dev: true
- /vite@5.0.12(@types/node@20.11.10):
- resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==}
+ /vite@5.1.4:
+ resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@@ -7483,14 +7140,13 @@ packages:
terser:
optional: true
dependencies:
- '@types/node': 20.11.10
esbuild: 0.19.12
- postcss: 8.4.33
- rollup: 4.9.6
+ postcss: 8.4.35
+ rollup: 4.12.0
optionalDependencies:
fsevents: 2.3.3
- /vitefu@0.2.5(vite@5.0.12):
+ /vitefu@0.2.5(vite@5.1.4):
resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
peerDependencies:
vite: ^3.0.0 || ^4.0.0 || ^5.0.0
@@ -7498,7 +7154,7 @@ packages:
vite:
optional: true
dependencies:
- vite: 5.0.12(@types/node@20.11.10)
+ vite: 5.1.4
dev: false
/void-elements@3.1.0:
@@ -7506,49 +7162,49 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
- /volar-service-css@0.0.17(@volar/language-service@1.11.1):
- resolution: {integrity: sha512-bEDJykygMzn2+a9ud6KwZZLli9eqarxApAXZuf2CqJJh6Trw1elmbBCo9SlPfqMrIhpFnwV0Sa+Xoc9x5WPeGw==}
+ /volar-service-css@0.0.30(@volar/language-service@2.0.4):
+ resolution: {integrity: sha512-jui+1N0HBfjW43tRfhyZp0axhBee4997BRyX4os8xQm/7cjD2KjAuyz92nMIPRt1QDoG4/7uQT28xNhy0TPJTA==}
peerDependencies:
- '@volar/language-service': ~1.11.0
+ '@volar/language-service': ~2.0.1
peerDependenciesMeta:
'@volar/language-service':
optional: true
dependencies:
- '@volar/language-service': 1.11.1
+ '@volar/language-service': 2.0.4
vscode-css-languageservice: 6.2.12
vscode-uri: 3.0.8
dev: false
- /volar-service-emmet@0.0.17(@volar/language-service@1.11.1):
- resolution: {integrity: sha512-C6hVnuQL52MqaydkrblYUbzIo5ZmIGo1hR8wmpcCjs5uNcjqn8aPqZRfznhLiUSaPHpFC+zQxJwFcZI9/u2iKQ==}
+ /volar-service-emmet@0.0.30(@volar/language-service@2.0.4):
+ resolution: {integrity: sha512-HEeIrmqQ/DTfuQDI9ER5+YReXXjE9f7W6MlBmn5biUuPyizVTGfuILN8pJhmYvmPHCA7qHhU7CJqwE9DAh9AJg==}
peerDependencies:
- '@volar/language-service': ~1.11.0
+ '@volar/language-service': ~2.0.1
peerDependenciesMeta:
'@volar/language-service':
optional: true
dependencies:
- '@volar/language-service': 1.11.1
+ '@volar/language-service': 2.0.4
'@vscode/emmet-helper': 2.9.2
- volar-service-html: 0.0.17(@volar/language-service@1.11.1)
+ volar-service-html: 0.0.30(@volar/language-service@2.0.4)
dev: false
- /volar-service-html@0.0.17(@volar/language-service@1.11.1):
- resolution: {integrity: sha512-OGkP+ZTo13j/+enafGe+esXvda/W4eU78YNLbbHxtV3rnX4odVrewenLJmXiECg6wdQz/PG8rLijZqQnDUYkfw==}
+ /volar-service-html@0.0.30(@volar/language-service@2.0.4):
+ resolution: {integrity: sha512-wW3TEeRTeHv/3mC8Ik6T62SwewMWFungb8ydyEK/2GDHEntBEG/J9wtuh01/J0kYqPerhlT9zhdGB6PGYHAGuA==}
peerDependencies:
- '@volar/language-service': ~1.11.0
+ '@volar/language-service': ~2.0.1
peerDependenciesMeta:
'@volar/language-service':
optional: true
dependencies:
- '@volar/language-service': 1.11.1
+ '@volar/language-service': 2.0.4
vscode-html-languageservice: 5.1.2
vscode-uri: 3.0.8
dev: false
- /volar-service-prettier@0.0.17(@volar/language-service@1.11.1):
- resolution: {integrity: sha512-YYnzZ+OT0M3Bx+xKuoAfs/uVuxk7ofz4dkZDQqjwa9iC63Ay4YGqONtmHd+xsO3lufkEBXlAQCbofDeZbSz3YQ==}
+ /volar-service-prettier@0.0.30(@volar/language-service@2.0.4):
+ resolution: {integrity: sha512-Qdc5Zc0y4hJmJbpIQ52cSDjs0uvVug/e2nuL/XZWPJM6Cr5/3RjjoRVKtDQbKItFYlGk+JH+LSXvwQeD5TXZqg==}
peerDependencies:
- '@volar/language-service': ~1.11.0
+ '@volar/language-service': ~2.0.1
prettier: ^2.2 || ^3.0
peerDependenciesMeta:
'@volar/language-service':
@@ -7556,33 +7212,34 @@ packages:
prettier:
optional: true
dependencies:
- '@volar/language-service': 1.11.1
+ '@volar/language-service': 2.0.4
+ vscode-uri: 3.0.8
dev: false
- /volar-service-typescript-twoslash-queries@0.0.17(@volar/language-service@1.11.1):
- resolution: {integrity: sha512-6FHXK5AWeFzCL6uGmEcbkZmQsaQ0m9IjbeLdgOIQ4KGvauqT2aA1BhdfDJu6vRAFIfXe7xjEJ85keIlHl72tSA==}
+ /volar-service-typescript-twoslash-queries@0.0.30(@volar/language-service@2.0.4):
+ resolution: {integrity: sha512-ahj6woBxhkZu7icQR58x5TnUaS8ZRKn7a+UvY+andmiTWsOaSu85zj36+LPZgZQi1MG+BtjNwUjKoxtZiN51PA==}
peerDependencies:
- '@volar/language-service': ~1.11.0
+ '@volar/language-service': ~2.0.1
peerDependenciesMeta:
'@volar/language-service':
optional: true
dependencies:
- '@volar/language-service': 1.11.1
+ '@volar/language-service': 2.0.4
dev: false
- /volar-service-typescript@0.0.17(@volar/language-service@1.11.1)(@volar/typescript@1.11.1):
- resolution: {integrity: sha512-Krs8pOIo2yoBVoJ91hKT1czhWt9ek7EbuK3MxxgvDYdd4HYHOtHi1eOlb7bFnZMNgFcwsL48yQI9vbPm160s9A==}
+ /volar-service-typescript@0.0.30(@volar/language-service@2.0.4)(@volar/typescript@2.0.4):
+ resolution: {integrity: sha512-jA8c0Mhy9rgAsrgtwocK95Smws1M2E0MxlQ/SVo/rmOGH32cX9UGgI0IENWKa3yagp/khfoemOIQDz/KNhI3zg==}
peerDependencies:
- '@volar/language-service': ~1.11.0
- '@volar/typescript': ~1.11.0
+ '@volar/language-service': ~2.0.1
+ '@volar/typescript': ~2.0.1
peerDependenciesMeta:
'@volar/language-service':
optional: true
dependencies:
- '@volar/language-service': 1.11.1
- '@volar/typescript': 1.11.1
+ '@volar/language-service': 2.0.4
+ '@volar/typescript': 2.0.4
path-browserify: 1.0.1
- semver: 7.5.4
+ semver: 7.6.0
typescript-auto-import-cache: 0.3.2
vscode-languageserver-textdocument: 1.0.11
vscode-nls: 5.2.0
@@ -7650,20 +7307,11 @@ packages:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
dev: false
- /web-streams-polyfill@3.3.2:
- resolution: {integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==}
+ /web-streams-polyfill@3.3.3:
+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
engines: {node: '>= 8'}
dev: false
- /webpack-sources@3.2.3:
- resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
- engines: {node: '>=10.13.0'}
- dev: false
-
- /webpack-virtual-modules@0.6.1:
- resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==}
- dev: false
-
/websocket-polyfill@0.0.3:
resolution: {integrity: sha512-pF3kR8Uaoau78MpUmFfzbIRxXj9PeQrCuPepGE6JIsfsJ/o/iXr07Q2iQNzKSSblQJ0FiGWlS64N4pVSm+O3Dg==}
dependencies:
@@ -7679,7 +7327,7 @@ packages:
dependencies:
bufferutil: 4.0.8
debug: 2.6.9
- es5-ext: 0.10.62
+ es5-ext: 0.10.64
typedarray-to-buffer: 3.1.5
utf-8-validate: 5.0.10
yaeti: 0.0.6
@@ -7762,9 +7410,10 @@ packages:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
dev: false
- /yaml@2.3.4:
- resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==}
+ /yaml@2.4.0:
+ resolution: {integrity: sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==}
engines: {node: '>= 14'}
+ hasBin: true
/yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
@@ -7776,7 +7425,7 @@ packages:
engines: {node: '>=12'}
dependencies:
cliui: 8.0.1
- escalade: 3.1.1
+ escalade: 3.1.2
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
@@ -7796,7 +7445,6 @@ packages:
/zod@3.22.4:
resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==}
- dev: false
/zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore
index 6e06d3b7..aba21e24 100644
--- a/src-tauri/.gitignore
+++ b/src-tauri/.gitignore
@@ -1,6 +1,3 @@
# Generated by Cargo
# will have compiled files and executables
/target/
-
-/bin/depot-*
-/bin/depot
\ No newline at end of file
diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
index cf50d1af..f5780962 100644
--- a/src-tauri/Cargo.lock
+++ b/src-tauri/Cargo.lock
@@ -17,6 +17,16 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+[[package]]
+name = "aead"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0"
+dependencies = [
+ "crypto-common",
+ "generic-array",
+]
+
[[package]]
name = "aes"
version = "0.7.5"
@@ -31,9 +41,9 @@ dependencies = [
[[package]]
name = "aes"
-version = "0.8.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2"
+checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"
dependencies = [
"cfg-if",
"cipher 0.4.4",
@@ -41,13 +51,55 @@ dependencies = [
]
[[package]]
-name = "ahash"
-version = "0.8.7"
+name = "age"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01"
+checksum = "edeef7d7b199195a2d7d7a8155d2d04aee736e60c5c7bdd7097d115369a8817d"
+dependencies = [
+ "age-core",
+ "base64",
+ "bech32",
+ "chacha20poly1305",
+ "cookie-factory",
+ "hmac",
+ "i18n-embed",
+ "i18n-embed-fl",
+ "lazy_static",
+ "nom",
+ "pin-project",
+ "rand 0.8.5",
+ "rust-embed",
+ "scrypt",
+ "sha2",
+ "subtle",
+ "x25519-dalek",
+ "zeroize",
+]
+
+[[package]]
+name = "age-core"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5f11899bc2bbddd135edbc30c36b1924fa59d0746bb45beb5933fafe3fe509b"
+dependencies = [
+ "base64",
+ "chacha20poly1305",
+ "cookie-factory",
+ "hkdf",
+ "io_tee",
+ "nom",
+ "rand 0.8.5",
+ "secrecy",
+ "sha2",
+]
+
+[[package]]
+name = "ahash"
+version = "0.8.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b79b82693f705137f8fb9b37871d99e4f9a7df12b917eed79c3d3954830a60b"
dependencies = [
"cfg-if",
- "getrandom 0.2.12",
"once_cell",
"version_check",
"zerocopy",
@@ -100,9 +152,9 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.11"
+version = "0.6.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5"
+checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -114,9 +166,9 @@ dependencies = [
[[package]]
name = "anstyle"
-version = "1.0.5"
+version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2faccea4cc4ab4a667ce676a30e8ec13922a692c99bb8f5b11f1502c72e04220"
+checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
[[package]]
name = "anstyle-parse"
@@ -148,18 +200,18 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.79"
+version = "1.0.80"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
+checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1"
[[package]]
name = "arboard"
-version = "3.3.0"
+version = "3.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aafb29b107435aa276664c1db8954ac27a6e105cdad3c88287a199eb0e313c08"
+checksum = "1faa3c733d9a3dd6fbaf85da5d162a2e03b2e0033a90dceb0e2a90fdd1e5380a"
dependencies = [
"clipboard-win",
- "core-graphics 0.22.3",
+ "core-graphics",
"image",
"log",
"objc",
@@ -167,10 +219,39 @@ dependencies = [
"objc_id",
"parking_lot",
"thiserror",
- "winapi",
+ "windows-sys 0.48.0",
"x11rb",
]
+[[package]]
+name = "arc-swap"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6"
+
+[[package]]
+name = "as-raw-xcb-connection"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b"
+
+[[package]]
+name = "ashpd"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b22517ee647547c01a687cf9b76074e1c91334032a4324f7243c6ee0f949390"
+dependencies = [
+ "enumflags2",
+ "futures-channel",
+ "futures-util",
+ "rand 0.8.5",
+ "serde",
+ "serde_repr",
+ "tokio",
+ "url",
+ "zbus 4.1.2",
+]
+
[[package]]
name = "async-broadcast"
version = "0.5.1"
@@ -182,14 +263,26 @@ dependencies = [
]
[[package]]
-name = "async-channel"
-version = "2.1.1"
+name = "async-broadcast"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c"
+checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb"
+dependencies = [
+ "event-listener 5.2.0",
+ "event-listener-strategy 0.5.0",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-channel"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3"
dependencies = [
"concurrent-queue",
- "event-listener 4.0.3",
- "event-listener-strategy",
+ "event-listener 5.2.0",
+ "event-listener-strategy 0.5.0",
"futures-core",
"pin-project-lite",
]
@@ -220,6 +313,17 @@ dependencies = [
"futures-lite 1.13.0",
]
+[[package]]
+name = "async-fs"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc19683171f287921f2405677dd2ed2549c3b3bda697a563ebc3a121ace2aba1"
+dependencies = [
+ "async-lock 3.3.0",
+ "blocking",
+ "futures-lite 2.2.0",
+]
+
[[package]]
name = "async-io"
version = "1.13.0"
@@ -252,8 +356,8 @@ dependencies = [
"futures-io",
"futures-lite 2.2.0",
"parking",
- "polling 3.3.2",
- "rustix 0.38.30",
+ "polling 3.5.0",
+ "rustix 0.38.31",
"slab",
"tracing",
"windows-sys 0.52.0",
@@ -275,7 +379,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b"
dependencies = [
"event-listener 4.0.3",
- "event-listener-strategy",
+ "event-listener-strategy 0.4.0",
"pin-project-lite",
]
@@ -292,10 +396,28 @@ dependencies = [
"cfg-if",
"event-listener 3.1.0",
"futures-lite 1.13.0",
- "rustix 0.38.30",
+ "rustix 0.38.31",
"windows-sys 0.48.0",
]
+[[package]]
+name = "async-process"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "451e3cf68011bd56771c79db04a9e333095ab6349f7e47592b788e9b98720cc8"
+dependencies = [
+ "async-channel",
+ "async-io 2.3.1",
+ "async-lock 3.3.0",
+ "async-signal",
+ "blocking",
+ "cfg-if",
+ "event-listener 5.2.0",
+ "futures-lite 2.2.0",
+ "rustix 0.38.31",
+ "windows-sys 0.52.0",
+]
+
[[package]]
name = "async-recursion"
version = "1.0.5"
@@ -304,7 +426,7 @@ checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -319,7 +441,7 @@ dependencies = [
"cfg-if",
"futures-core",
"futures-io",
- "rustix 0.38.30",
+ "rustix 0.38.31",
"signal-hook-registry",
"slab",
"windows-sys 0.48.0",
@@ -339,7 +461,48 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "async-utility"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a349201d80b4aa18d17a34a182bdd7f8ddf845e9e57d2ea130a12e10ef1e3a47"
+dependencies = [
+ "futures-util",
+ "gloo-timers",
+ "tokio",
+ "wasm-bindgen-futures",
+]
+
+[[package]]
+name = "async-wsocket"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d253e375ea899cb131b92a474587e217634e7ea927c24d8098eecbcad0c5c97a"
+dependencies = [
+ "async-utility",
+ "futures-util",
+ "thiserror",
+ "tokio",
+ "tokio-rustls 0.25.0",
+ "tokio-socks",
+ "tokio-tungstenite",
+ "url",
+ "wasm-ws",
+ "webpki-roots 0.26.1",
+]
+
+[[package]]
+name = "async_io_stream"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c"
+dependencies = [
+ "futures",
+ "pharos",
+ "rustc_version",
]
[[package]]
@@ -365,31 +528,12 @@ dependencies = [
"system-deps",
]
-[[package]]
-name = "atoi"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
-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 = "atomic-write-file"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436"
-dependencies = [
- "nix 0.27.1",
- "rand 0.8.5",
-]
-
[[package]]
name = "auto-launch"
version = "0.5.0"
@@ -407,20 +551,6 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-[[package]]
-name = "backoff"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1"
-dependencies = [
- "futures-core",
- "getrandom 0.2.12",
- "instant",
- "pin-project-lite",
- "rand 0.8.5",
- "tokio",
-]
-
[[package]]
name = "backtrace"
version = "0.3.69"
@@ -448,6 +578,12 @@ version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
+[[package]]
+name = "bech32"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445"
+
[[package]]
name = "bincode"
version = "1.3.3"
@@ -457,6 +593,53 @@ dependencies = [
"serde",
]
+[[package]]
+name = "bip39"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f"
+dependencies = [
+ "bitcoin_hashes 0.11.0",
+ "serde",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "bitcoin"
+version = "0.30.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1945a5048598e4189e239d3f809b19bdad4845c4b2ba400d304d2dcf26d2c462"
+dependencies = [
+ "bech32",
+ "bitcoin-private",
+ "bitcoin_hashes 0.12.0",
+ "hex_lit",
+ "secp256k1",
+ "serde",
+]
+
+[[package]]
+name = "bitcoin-private"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57"
+
+[[package]]
+name = "bitcoin_hashes"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4"
+
+[[package]]
+name = "bitcoin_hashes"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501"
+dependencies = [
+ "bitcoin-private",
+ "serde",
+]
+
[[package]]
name = "bitflags"
version = "1.3.2"
@@ -493,7 +676,7 @@ version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cb03d1bed155d89dce0f845b7899b18a9a163e148fd004e1c28421a783e2d8e"
dependencies = [
- "block-padding",
+ "block-padding 0.2.1",
"cipher 0.3.0",
]
@@ -503,6 +686,15 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae"
+[[package]]
+name = "block-padding"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93"
+dependencies = [
+ "generic-array",
+]
+
[[package]]
name = "blocking"
version = "1.5.1"
@@ -542,15 +734,29 @@ dependencies = [
[[package]]
name = "bumpalo"
-version = "3.14.0"
+version = "3.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
+checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b"
[[package]]
name = "bytemuck"
-version = "1.14.1"
+version = "1.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9"
+checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f"
+dependencies = [
+ "bytemuck_derive",
+]
+
+[[package]]
+name = "bytemuck_derive"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
[[package]]
name = "byteorder"
@@ -624,24 +830,25 @@ dependencies = [
[[package]]
name = "cargo-platform"
-version = "0.1.6"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d"
+checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f"
dependencies = [
"serde",
]
[[package]]
name = "cargo_metadata"
-version = "0.14.2"
+version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa"
+checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037"
dependencies = [
"camino",
"cargo-platform",
"semver",
"serde",
"serde_json",
+ "thiserror",
]
[[package]]
@@ -651,16 +858,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719"
dependencies = [
"serde",
- "toml 0.8.2",
+ "toml 0.8.10",
+]
+
+[[package]]
+name = "cbc"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6"
+dependencies = [
+ "cipher 0.4.4",
]
[[package]]
name = "cc"
-version = "1.0.83"
+version = "1.0.88"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc"
dependencies = [
- "jobserver",
"libc",
]
@@ -683,9 +898,9 @@ dependencies = [
[[package]]
name = "cfg-expr"
-version = "0.15.6"
+version = "0.15.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6100bc57b6209840798d95cb2775684849d332f7bd788db2a8c8caf7ef82a41a"
+checksum = "fa50868b64a9a6fda9d593ce778849ea8715cd2a3d2cc17ffdb4a2f2f2f1961d"
dependencies = [
"smallvec",
"target-lexicon",
@@ -704,16 +919,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
[[package]]
-name = "chrono"
-version = "0.4.33"
+name = "cfg_aliases"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb"
+checksum = "77e53693616d3075149f4ead59bdeecd204ac6b8192d8969757601b74bddf00f"
+
+[[package]]
+name = "chacha20"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818"
+dependencies = [
+ "cfg-if",
+ "cipher 0.4.4",
+ "cpufeatures",
+]
+
+[[package]]
+name = "chacha20poly1305"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35"
+dependencies = [
+ "aead",
+ "chacha20",
+ "cipher 0.4.4",
+ "poly1305",
+ "zeroize",
+]
+
+[[package]]
+name = "chrono"
+version = "0.4.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b"
dependencies = [
"android-tzdata",
"iana-time-zone",
"num-traits",
"serde",
- "windows-targets 0.52.0",
+ "windows-targets 0.52.4",
]
[[package]]
@@ -733,57 +978,43 @@ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
dependencies = [
"crypto-common",
"inout",
+ "zeroize",
]
[[package]]
name = "clap"
-version = "4.4.18"
+version = "4.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c"
+checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da"
dependencies = [
"clap_builder",
- "clap_derive",
]
[[package]]
name = "clap_builder"
-version = "4.4.18"
+version = "4.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7"
+checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb"
dependencies = [
"anstream",
"anstyle",
"clap_lex",
- "strsim",
-]
-
-[[package]]
-name = "clap_derive"
-version = "4.4.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote",
- "syn 2.0.48",
+ "strsim 0.11.0",
]
[[package]]
name = "clap_lex"
-version = "0.6.0"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
+checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
[[package]]
name = "clipboard-win"
-version = "4.5.0"
+version = "5.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362"
+checksum = "12f9a0700e0127ba15d1d52dd742097f821cd9c65939303a44d970465040a297"
dependencies = [
"error-code",
- "str-buf",
- "winapi",
]
[[package]]
@@ -796,7 +1027,7 @@ dependencies = [
"block",
"cocoa-foundation",
"core-foundation",
- "core-graphics 0.23.1",
+ "core-graphics",
"foreign-types 0.5.0",
"libc",
"objc",
@@ -847,25 +1078,6 @@ dependencies = [
"crossbeam-utils",
]
-[[package]]
-name = "console"
-version = "0.15.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb"
-dependencies = [
- "encode_unicode",
- "lazy_static",
- "libc",
- "unicode-width",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "const-oid"
-version = "0.9.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
-
[[package]]
name = "constant_time_eq"
version = "0.1.5"
@@ -878,6 +1090,12 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
+[[package]]
+name = "cookie-factory"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b"
+
[[package]]
name = "core-foundation"
version = "0.9.4"
@@ -894,19 +1112,6 @@ version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
-[[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"
@@ -940,44 +1145,20 @@ dependencies = [
"libc",
]
-[[package]]
-name = "crc"
-version = "3.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe"
-dependencies = [
- "crc-catalog",
-]
-
-[[package]]
-name = "crc-catalog"
-version = "2.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
-
[[package]]
name = "crc32fast"
-version = "1.3.2"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-channel"
-version = "0.5.11"
+version = "0.5.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-queue"
-version = "0.3.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35"
+checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95"
dependencies = [
"crossbeam-utils",
]
@@ -995,6 +1176,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
"generic-array",
+ "rand_core 0.6.4",
"typenum",
]
@@ -1022,39 +1204,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
name = "ctor"
-version = "0.2.6"
+version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e"
+checksum = "ad291aa74992b9b7a7e88c38acbbf6ad7e107f1d90ee8775b7bc1fc3394f485c"
dependencies = [
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
name = "curl"
-version = "0.4.44"
+version = "0.4.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22"
+checksum = "1e2161dd6eba090ff1594084e95fd67aeccf04382ffea77999ea94ed42ec67b6"
dependencies = [
"curl-sys",
"libc",
"openssl-probe",
"openssl-sys",
"schannel",
- "socket2 0.4.10",
- "winapi",
+ "socket2 0.5.6",
+ "windows-sys 0.52.0",
]
[[package]]
name = "curl-sys"
-version = "0.4.70+curl-8.5.0"
+version = "0.4.72+curl-8.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c0333d8849afe78a4c8102a429a446bfdd055832af071945520e835ae2d841e"
+checksum = "29cbdc8314c447d11e8fd156dcdd031d9e02a7a976163e396b548c03153bc9ea"
dependencies = [
"cc",
"libc",
@@ -1062,14 +1244,41 @@ dependencies = [
"openssl-sys",
"pkg-config",
"vcpkg",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "curve25519-dalek"
+version = "4.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "curve25519-dalek-derive",
+ "fiat-crypto",
+ "platforms",
+ "rustc_version",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "curve25519-dalek-derive"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
]
[[package]]
name = "darling"
-version = "0.20.4"
+version = "0.20.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da01daa5f6d41c91358398e8db4dde38e292378da1f28300b59ef4732b879454"
+checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391"
dependencies = [
"darling_core",
"darling_macro",
@@ -1077,29 +1286,48 @@ dependencies = [
[[package]]
name = "darling_core"
-version = "0.20.4"
+version = "0.20.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f44f6238b948a3c6c3073cdf53bb0c2d5e024ee27e0f35bfe9d556a12395808a"
+checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
- "strsim",
- "syn 2.0.48",
+ "strsim 0.10.0",
+ "syn 2.0.52",
]
[[package]]
name = "darling_macro"
-version = "0.20.4"
+version = "0.20.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d2d88bd93979b1feb760a6b5c531ac5ba06bd63e74894c377af02faee07b9cd"
+checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f"
dependencies = [
"darling_core",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
+[[package]]
+name = "dashmap"
+version = "5.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
+dependencies = [
+ "cfg-if",
+ "hashbrown 0.14.3",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "data-encoding"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
+
[[package]]
name = "data-url"
version = "0.3.1"
@@ -1107,14 +1335,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a"
[[package]]
-name = "der"
-version = "0.7.8"
+name = "deadpool"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c"
+checksum = "fb84100978c1c7b37f09ed3ce3e5f843af02c2a2c431bae5b19230dad2c1b490"
dependencies = [
- "const-oid",
- "pem-rfc7468",
- "zeroize",
+ "async-trait",
+ "deadpool-runtime",
+ "num_cpus",
+ "tokio",
+]
+
+[[package]]
+name = "deadpool-runtime"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63dfa964fe2a66f3fde91fc70b267fe193d822c7e603e2a675a49a7f46ad3f49"
+dependencies = [
+ "tokio",
+]
+
+[[package]]
+name = "deadpool-sqlite"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8010e36e12f3be22543a5e478b4af20aeead9a700dd69581a5e050a070fc22c"
+dependencies = [
+ "deadpool",
+ "deadpool-sync",
+ "rusqlite",
+]
+
+[[package]]
+name = "deadpool-sync"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8db70494c13cae4ce67b4b4dafdaf828cf0df7237ab5b9e2fcabee4965d0a0a"
+dependencies = [
+ "deadpool-runtime",
]
[[package]]
@@ -1158,7 +1416,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
"block-buffer",
- "const-oid",
"crypto-common",
"subtle",
]
@@ -1211,10 +1468,92 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
[[package]]
-name = "dotenvy"
-version = "0.15.7"
+name = "displaydoc"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
+checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "dlib"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412"
+dependencies = [
+ "libloading 0.8.1",
+]
+
+[[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.52",
+]
+
+[[package]]
+name = "downcast-rs"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
+
+[[package]]
+name = "drm"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0f8a69e60d75ae7dab4ef26a59ca99f2a89d4c142089b537775ae0c198bdcde"
+dependencies = [
+ "bitflags 2.4.2",
+ "bytemuck",
+ "drm-ffi",
+ "drm-fourcc",
+ "rustix 0.38.31",
+]
+
+[[package]]
+name = "drm-ffi"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41334f8405792483e32ad05fbb9c5680ff4e84491883d2947a4757dc54cb2ac6"
+dependencies = [
+ "drm-sys",
+ "rustix 0.38.31",
+]
+
+[[package]]
+name = "drm-fourcc"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4"
+
+[[package]]
+name = "drm-sys"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d09ff881f92f118b11105ba5e34ff8f4adf27b30dae8f12e28c193af1c83176"
+dependencies = [
+ "libc",
+ "linux-raw-sys 0.6.4",
+]
[[package]]
name = "dtoa"
@@ -1238,13 +1577,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
[[package]]
-name = "either"
-version = "1.9.0"
+name = "dyn-clone"
+version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
-dependencies = [
- "serde",
-]
+checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125"
+
+[[package]]
+name = "either"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"
[[package]]
name = "embed-resource"
@@ -1255,7 +1597,7 @@ dependencies = [
"cc",
"memchr",
"rustc_version",
- "toml 0.8.2",
+ "toml 0.8.10",
"vswhom",
"winreg 0.51.0",
]
@@ -1266,12 +1608,6 @@ version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
-[[package]]
-name = "encode_unicode"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
-
[[package]]
name = "encoding_rs"
version = "0.8.33"
@@ -1282,16 +1618,16 @@ dependencies = [
]
[[package]]
-name = "endian-type"
-version = "0.1.2"
+name = "endi"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d"
+checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf"
[[package]]
name = "enumflags2"
-version = "0.7.8"
+version = "0.7.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939"
+checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d"
dependencies = [
"enumflags2_derive",
"serde",
@@ -1299,13 +1635,13 @@ dependencies = [
[[package]]
name = "enumflags2_derive"
-version = "0.7.8"
+version = "0.7.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246"
+checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -1326,24 +1662,9 @@ dependencies = [
[[package]]
name = "error-code"
-version = "2.3.1"
+version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21"
-dependencies = [
- "libc",
- "str-buf",
-]
-
-[[package]]
-name = "etcetera"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943"
-dependencies = [
- "cfg-if",
- "home",
- "windows-sys 0.48.0",
-]
+checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b"
[[package]]
name = "event-listener"
@@ -1373,6 +1694,17 @@ dependencies = [
"pin-project-lite",
]
+[[package]]
+name = "event-listener"
+version = "5.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91"
+dependencies = [
+ "concurrent-queue",
+ "parking",
+ "pin-project-lite",
+]
+
[[package]]
name = "event-listener-strategy"
version = "0.4.0"
@@ -1383,6 +1715,28 @@ dependencies = [
"pin-project-lite",
]
+[[package]]
+name = "event-listener-strategy"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291"
+dependencies = [
+ "event-listener 5.2.0",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "fallible-iterator"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
+
+[[package]]
+name = "fallible-streaming-iterator"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
+
[[package]]
name = "fastrand"
version = "1.9.0"
@@ -1398,17 +1752,6 @@ version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
-[[package]]
-name = "fd-lock"
-version = "3.0.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5"
-dependencies = [
- "cfg-if",
- "rustix 0.38.30",
- "windows-sys 0.48.0",
-]
-
[[package]]
name = "fdeflate"
version = "0.3.4"
@@ -1418,6 +1761,12 @@ dependencies = [
"simd-adler32",
]
+[[package]]
+name = "fiat-crypto"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382"
+
[[package]]
name = "field-offset"
version = "0.3.6"
@@ -1441,10 +1790,23 @@ dependencies = [
]
[[package]]
-name = "finl_unicode"
-version = "1.2.0"
+name = "find-crate"
+version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6"
+checksum = "59a98bbaacea1c0eb6a0876280051b892eb73594fd90cf3b20e9c817029c57d2"
+dependencies = [
+ "toml 0.5.11",
+]
+
+[[package]]
+name = "flatbuffers"
+version = "23.5.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dac53e22462d78c16d64a1cd22371b54cc3fe94aa15e7886a2fa6e5d1ab8640"
+dependencies = [
+ "bitflags 1.3.2",
+ "rustc_version",
+]
[[package]]
name = "flate2"
@@ -1457,14 +1819,47 @@ dependencies = [
]
[[package]]
-name = "flume"
+name = "fluent"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61f69378194459db76abd2ce3952b790db103ceb003008d3d50d97c41ff847a7"
+dependencies = [
+ "fluent-bundle",
+ "unic-langid",
+]
+
+[[package]]
+name = "fluent-bundle"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e242c601dec9711505f6d5bbff5bedd4b61b2469f2e8bb8e57ee7c9747a87ffd"
+dependencies = [
+ "fluent-langneg",
+ "fluent-syntax",
+ "intl-memoizer",
+ "intl_pluralrules",
+ "rustc-hash",
+ "self_cell 0.10.3",
+ "smallvec",
+ "unic-langid",
+]
+
+[[package]]
+name = "fluent-langneg"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94"
+dependencies = [
+ "unic-langid",
+]
+
+[[package]]
+name = "fluent-syntax"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181"
+checksum = "c0abed97648395c902868fee9026de96483933faa54ea3b40d652f7dfe61ca78"
dependencies = [
- "futures-core",
- "futures-sink",
- "spin 0.9.8",
+ "thiserror",
]
[[package]]
@@ -1500,7 +1895,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -1576,17 +1971,6 @@ dependencies = [
"futures-util",
]
-[[package]]
-name = "futures-intrusive"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f"
-dependencies = [
- "futures-core",
- "lock_api",
- "parking_lot",
-]
-
[[package]]
name = "futures-io"
version = "0.3.30"
@@ -1629,7 +2013,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -1772,15 +2156,16 @@ dependencies = [
[[package]]
name = "generator"
-version = "0.7.5"
+version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e"
+checksum = "b5b25e5b3e733153bcab35ee4671b46604b42516163cae442d1601cb716f2ac5"
dependencies = [
"cc",
+ "cfg-if",
"libc",
"log",
"rustversion",
- "windows 0.48.0",
+ "windows 0.53.0",
]
[[package]]
@@ -1793,16 +2178,6 @@ dependencies = [
"version_check",
]
-[[package]]
-name = "gethostname"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb65d4ba3173c56a500b555b532f72c42e8d1fe64962b518897f8959fae2c177"
-dependencies = [
- "libc",
- "winapi",
-]
-
[[package]]
name = "gethostname"
version = "0.4.3"
@@ -1831,8 +2206,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
dependencies = [
"cfg-if",
+ "js-sys",
"libc",
"wasi 0.11.0+wasi-snapshot-preview1",
+ "wasm-bindgen",
]
[[package]]
@@ -1953,11 +2330,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
dependencies = [
"heck",
- "proc-macro-crate 2.0.2",
+ "proc-macro-crate 2.0.0",
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -1986,6 +2363,18 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+[[package]]
+name = "gloo-timers"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "js-sys",
+ "wasm-bindgen",
+]
+
[[package]]
name = "gobject-sys"
version = "0.16.3"
@@ -2057,7 +2446,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -2071,8 +2460,8 @@ dependencies = [
"futures-core",
"futures-sink",
"futures-util",
- "http",
- "indexmap 2.2.1",
+ "http 0.2.11",
+ "indexmap 2.2.4",
"slab",
"tokio",
"tokio-util",
@@ -2109,15 +2498,12 @@ name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
-dependencies = [
- "unicode-segmentation",
-]
[[package]]
name = "hermit-abi"
-version = "0.3.4"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f"
+checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
[[package]]
name = "hex"
@@ -2125,6 +2511,12 @@ version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+[[package]]
+name = "hex_lit"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd"
+
[[package]]
name = "hkdf"
version = "0.12.4"
@@ -2143,15 +2535,6 @@ dependencies = [
"digest",
]
-[[package]]
-name = "home"
-version = "0.5.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
-dependencies = [
- "windows-sys 0.52.0",
-]
-
[[package]]
name = "html5ever"
version = "0.26.0"
@@ -2177,6 +2560,17 @@ dependencies = [
"itoa 1.0.10",
]
+[[package]]
+name = "http"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa 1.0.10",
+]
+
[[package]]
name = "http-body"
version = "0.4.6"
@@ -2184,7 +2578,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
dependencies = [
"bytes",
- "http",
+ "http 0.2.11",
"pin-project-lite",
]
@@ -2217,19 +2611,33 @@ dependencies = [
"futures-core",
"futures-util",
"h2",
- "http",
+ "http 0.2.11",
"http-body",
"httparse",
"httpdate",
"itoa 1.0.10",
"pin-project-lite",
- "socket2 0.5.5",
+ "socket2 0.5.6",
"tokio",
"tower-service",
"tracing",
"want",
]
+[[package]]
+name = "hyper-rustls"
+version = "0.24.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
+dependencies = [
+ "futures-util",
+ "http 0.2.11",
+ "hyper",
+ "rustls 0.21.10",
+ "tokio",
+ "tokio-rustls 0.24.1",
+]
+
[[package]]
name = "hyper-tls"
version = "0.5.0"
@@ -2244,10 +2652,79 @@ dependencies = [
]
[[package]]
-name = "iana-time-zone"
-version = "0.1.59"
+name = "i18n-config"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539"
+checksum = "0c9ce3c48cbc21fd5b22b9331f32b5b51f6ad85d969b99e793427332e76e7640"
+dependencies = [
+ "log",
+ "serde",
+ "serde_derive",
+ "thiserror",
+ "toml 0.8.10",
+ "unic-langid",
+]
+
+[[package]]
+name = "i18n-embed"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94205d95764f5bb9db9ea98fa77f89653365ca748e27161f5bbea2ffd50e459c"
+dependencies = [
+ "arc-swap",
+ "fluent",
+ "fluent-langneg",
+ "fluent-syntax",
+ "i18n-embed-impl",
+ "intl-memoizer",
+ "lazy_static",
+ "log",
+ "parking_lot",
+ "rust-embed",
+ "thiserror",
+ "unic-langid",
+ "walkdir",
+]
+
+[[package]]
+name = "i18n-embed-fl"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fc1f8715195dffc4caddcf1cf3128da15fe5d8a137606ea8856c9300047d5a2"
+dependencies = [
+ "dashmap",
+ "find-crate",
+ "fluent",
+ "fluent-syntax",
+ "i18n-config",
+ "i18n-embed",
+ "lazy_static",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "strsim 0.10.0",
+ "syn 2.0.52",
+ "unic-langid",
+]
+
+[[package]]
+name = "i18n-embed-impl"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81093c4701672f59416582fe3145676126fd23ba5db910acad0793c1108aaa58"
+dependencies = [
+ "find-crate",
+ "i18n-config",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.60"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
dependencies = [
"android_system_properties",
"core-foundation-sys",
@@ -2294,9 +2771,9 @@ dependencies = [
[[package]]
name = "image"
-version = "0.24.8"
+version = "0.24.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23"
+checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d"
dependencies = [
"bytemuck",
"byteorder",
@@ -2319,9 +2796,9 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.2.1"
+version = "2.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "433de089bd45971eecf4668ee0ee8f4cec17db4f8bd8f7bc3197a6ce37aa7d9b"
+checksum = "967d6dd42f16dbf0eb8040cb9e477933562684d3918f7d253f2ff9087fb3e7a3"
dependencies = [
"equivalent",
"hashbrown 0.14.3",
@@ -2343,6 +2820,7 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
dependencies = [
+ "block-padding 0.3.3",
"generic-array",
]
@@ -2353,6 +2831,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
dependencies = [
"cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "intl-memoizer"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c310433e4a310918d6ed9243542a6b83ec1183df95dff8f23f87bb88a264a66f"
+dependencies = [
+ "type-map",
+ "unic-langid",
+]
+
+[[package]]
+name = "intl_pluralrules"
+version = "7.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972"
+dependencies = [
+ "unic-langid",
]
[[package]]
@@ -2366,6 +2866,12 @@ dependencies = [
"windows-sys 0.48.0",
]
+[[package]]
+name = "io_tee"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b3f7cef34251886990511df1c61443aa928499d598a9473929ab5a90a527304"
+
[[package]]
name = "ipnet"
version = "2.9.0"
@@ -2391,15 +2897,6 @@ dependencies = [
"once_cell",
]
-[[package]]
-name = "itertools"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
-dependencies = [
- "either",
-]
-
[[package]]
name = "itoa"
version = "0.4.8"
@@ -2457,15 +2954,6 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
-[[package]]
-name = "jobserver"
-version = "0.1.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"
-dependencies = [
- "libc",
-]
-
[[package]]
name = "jpeg-decoder"
version = "0.3.1"
@@ -2474,9 +2962,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
[[package]]
name = "js-sys"
-version = "0.3.67"
+version = "0.3.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1"
+checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee"
dependencies = [
"wasm-bindgen",
]
@@ -2536,9 +3024,6 @@ name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-dependencies = [
- "spin 0.5.2",
-]
[[package]]
name = "libappindicator"
@@ -2560,15 +3045,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf"
dependencies = [
"gtk-sys",
- "libloading",
+ "libloading 0.7.4",
"once_cell",
]
[[package]]
name = "libc"
-version = "0.2.152"
+version = "0.2.153"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7"
+checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
[[package]]
name = "libloading"
@@ -2581,10 +3066,14 @@ dependencies = [
]
[[package]]
-name = "libm"
-version = "0.2.8"
+name = "libloading"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
+checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161"
+dependencies = [
+ "cfg-if",
+ "windows-sys 0.48.0",
+]
[[package]]
name = "libredox"
@@ -2651,6 +3140,24 @@ version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+[[package]]
+name = "linux-raw-sys"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0b5399f6804fbab912acbd8878ed3532d506b7c951b8f9f164ef90fef39e3f4"
+
+[[package]]
+name = "lnurl-pay"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b628658116d331c9567f6cb22415d726125ff6e328d1fb1b422b1b58afeaec21"
+dependencies = [
+ "bech32",
+ "reqwest",
+ "serde",
+ "serde_json",
+]
+
[[package]]
name = "lock_api"
version = "0.4.11"
@@ -2663,9 +3170,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"
[[package]]
name = "loom"
@@ -2682,14 +3189,24 @@ dependencies = [
"tracing-subscriber",
]
+[[package]]
+name = "lru"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc"
+dependencies = [
+ "hashbrown 0.14.3",
+]
+
[[package]]
name = "lume"
version = "3.0.0"
dependencies = [
+ "age",
"keyring",
+ "nostr-sdk",
"serde",
"serde_json",
- "sqlx-cli",
"tauri",
"tauri-build",
"tauri-plugin-autostart",
@@ -2702,12 +3219,11 @@ dependencies = [
"tauri-plugin-os",
"tauri-plugin-process",
"tauri-plugin-shell",
- "tauri-plugin-sql",
"tauri-plugin-store",
- "tauri-plugin-theme",
"tauri-plugin-updater",
"tauri-plugin-upload",
"tauri-plugin-window-state",
+ "tokio",
"webpage",
]
@@ -2780,16 +3296,6 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
-[[package]]
-name = "md-5"
-version = "0.10.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
-dependencies = [
- "cfg-if",
- "digest",
-]
-
[[package]]
name = "memchr"
version = "2.7.1"
@@ -2797,12 +3303,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
[[package]]
-name = "memoffset"
-version = "0.6.5"
+name = "memmap2"
+version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322"
dependencies = [
- "autocfg",
+ "libc",
]
[[package]]
@@ -2843,9 +3349,9 @@ checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881"
[[package]]
name = "miniz_oxide"
-version = "0.7.1"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
dependencies = [
"adler",
"simd-adler32",
@@ -2864,9 +3370,9 @@ dependencies = [
[[package]]
name = "muda"
-version = "0.11.4"
+version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e406691fa7749604bbc7964bde28a300572d52621bb84540f6907c0f8fe08737"
+checksum = "4c47e7625990fc1af2226ea4f34fb2412b03c12639fcb91868581eb3a6893453"
dependencies = [
"cocoa",
"crossbeam-channel",
@@ -2908,7 +3414,7 @@ dependencies = [
"jni-sys",
"ndk-sys",
"num_enum",
- "raw-window-handle",
+ "raw-window-handle 0.5.2",
"thiserror",
]
@@ -2927,34 +3433,18 @@ dependencies = [
"jni-sys",
]
+[[package]]
+name = "negentropy"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e664971378a3987224f7a0e10059782035e89899ae403718ee07de85bec42afe"
+
[[package]]
name = "new_debug_unreachable"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
-[[package]]
-name = "nibble_vec"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43"
-dependencies = [
- "smallvec",
-]
-
-[[package]]
-name = "nix"
-version = "0.23.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c"
-dependencies = [
- "bitflags 1.3.2",
- "cc",
- "cfg-if",
- "libc",
- "memoffset 0.6.5",
-]
-
[[package]]
name = "nix"
version = "0.26.4"
@@ -2969,13 +3459,15 @@ dependencies = [
[[package]]
name = "nix"
-version = "0.27.1"
+version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
+checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
dependencies = [
"bitflags 2.4.2",
"cfg-if",
+ "cfg_aliases 0.1.1",
"libc",
+ "memoffset 0.9.0",
]
[[package]]
@@ -2995,16 +3487,123 @@ dependencies = [
]
[[package]]
-name = "notify-rust"
-version = "4.10.0"
+name = "nostr"
+version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "827c5edfa80235ded4ab3fe8e9dc619b4f866ef16fe9b1c6b8a7f8692c0f2226"
+checksum = "62abb4201e9d6b8b25660bebcad7bc0eb0cf25ecf9fd139c8d8c36ac455d37da"
dependencies = [
- "log",
- "mac-notification-sys",
+ "aes 0.8.4",
+ "base64",
+ "bip39",
+ "bitcoin",
+ "cbc",
+ "chacha20",
+ "chacha20poly1305",
+ "getrandom 0.2.12",
+ "instant",
+ "js-sys",
+ "negentropy",
+ "once_cell",
+ "reqwest",
+ "scrypt",
"serde",
- "tauri-winrt-notification",
- "zbus",
+ "serde_json",
+ "tracing",
+ "unicode-normalization",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "nostr-database"
+version = "0.28.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "174b81445708157ecaa41f0439a2a0ce6df70f45ddc7a333c4a310347c09a990"
+dependencies = [
+ "async-trait",
+ "flatbuffers",
+ "lru",
+ "nostr",
+ "thiserror",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "nostr-relay-pool"
+version = "0.28.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1621a53bf1bde6fee89726be371931b96542d49e58a221f22c24ea02fb913c4e"
+dependencies = [
+ "async-utility",
+ "async-wsocket",
+ "nostr",
+ "nostr-database",
+ "thiserror",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "nostr-sdk"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "531fbbb39aef79311b60488f2d4aacc5f8156d76a5fb1bb110486746b3cfe873"
+dependencies = [
+ "async-utility",
+ "lnurl-pay",
+ "nostr",
+ "nostr-database",
+ "nostr-relay-pool",
+ "nostr-signer",
+ "nostr-sqlite",
+ "nostr-zapper",
+ "nwc",
+ "thiserror",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "nostr-signer"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "305c33e0ddde9c4288af000cc3fee665190a4ebef4841ce5bcb3eb4a2f473e62"
+dependencies = [
+ "async-utility",
+ "nostr",
+ "nostr-relay-pool",
+ "thiserror",
+ "tokio",
+]
+
+[[package]]
+name = "nostr-sqlite"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b342a7b19d8bd2ab6509bc088c9b52c64211f5ce92462fe40b59c7562c9ea16"
+dependencies = [
+ "async-trait",
+ "deadpool-sqlite",
+ "nostr",
+ "nostr-database",
+ "rusqlite",
+ "thiserror",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "nostr-zapper"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "523d787e19fbca8ad6ae4edf42db266a89d24aa3bfb1ce558ab87f3c5d10e2d5"
+dependencies = [
+ "async-trait",
+ "nostr",
+ "thiserror",
]
[[package]]
@@ -3043,46 +3642,34 @@ dependencies = [
]
[[package]]
-name = "num-bigint-dig"
-version = "0.8.4"
+name = "num-complex"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151"
+checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6"
dependencies = [
- "byteorder",
- "lazy_static",
- "libm",
- "num-integer",
- "num-iter",
"num-traits",
- "rand 0.8.5",
- "smallvec",
- "zeroize",
]
[[package]]
-name = "num-complex"
-version = "0.4.4"
+name = "num-conv"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214"
-dependencies = [
- "num-traits",
-]
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]]
name = "num-integer"
-version = "0.1.45"
+version = "0.1.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
dependencies = [
- "autocfg",
"num-traits",
]
[[package]]
name = "num-iter"
-version = "0.1.43"
+version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
+checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9"
dependencies = [
"autocfg",
"num-integer",
@@ -3103,12 +3690,11 @@ dependencies = [
[[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",
]
[[package]]
@@ -3142,6 +3728,20 @@ dependencies = [
"syn 1.0.109",
]
+[[package]]
+name = "nwc"
+version = "0.28.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc11612a16af0252701ebd71d202e60343606e70a10bba875674dbddd36237e5"
+dependencies = [
+ "async-utility",
+ "nostr",
+ "nostr-relay-pool",
+ "nostr-zapper",
+ "thiserror",
+ "tracing",
+]
+
[[package]]
name = "objc"
version = "0.2.7"
@@ -3215,9 +3815,9 @@ dependencies = [
[[package]]
name = "openssl"
-version = "0.10.63"
+version = "0.10.64"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8"
+checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f"
dependencies = [
"bitflags 2.4.2",
"cfg-if",
@@ -3236,7 +3836,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -3247,18 +3847,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-src"
-version = "300.2.1+3.2.0"
+version = "300.2.3+3.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fe476c29791a5ca0d1273c697e96085bbabbbea2ef7afd5617e78a4b40332d3"
+checksum = "5cff92b6f71555b61bb9315f7c64da3ca43d87531622120fea0195fc761b4843"
dependencies = [
"cc",
]
[[package]]
name = "openssl-sys"
-version = "0.9.99"
+version = "0.9.101"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae"
+checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff"
dependencies = [
"cc",
"libc",
@@ -3370,10 +3970,15 @@ dependencies = [
]
[[package]]
-name = "paste"
-version = "1.0.14"
+name = "password-hash"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166"
+dependencies = [
+ "base64ct",
+ "rand_core 0.6.4",
+ "subtle",
+]
[[package]]
name = "pathdiff"
@@ -3389,17 +3994,18 @@ checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"
dependencies = [
"digest",
"hmac",
- "password-hash",
+ "password-hash 0.4.2",
"sha2",
]
[[package]]
-name = "pem-rfc7468"
-version = "0.7.0"
+name = "pbkdf2"
+version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
+checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2"
dependencies = [
- "base64ct",
+ "digest",
+ "hmac",
]
[[package]]
@@ -3408,6 +4014,16 @@ version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+[[package]]
+name = "pharos"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414"
+dependencies = [
+ "futures",
+ "rustc_version",
+]
+
[[package]]
name = "phf"
version = "0.8.0"
@@ -3512,7 +4128,7 @@ dependencies = [
"phf_shared 0.11.2",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -3542,6 +4158,26 @@ dependencies = [
"siphasher",
]
+[[package]]
+name = "pin-project"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
[[package]]
name = "pin-project-lite"
version = "0.2.13"
@@ -3565,32 +4201,17 @@ dependencies = [
"futures-io",
]
-[[package]]
-name = "pkcs1"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
-dependencies = [
- "der",
- "pkcs8",
- "spki",
-]
-
-[[package]]
-name = "pkcs8"
-version = "0.10.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"
-dependencies = [
- "der",
- "spki",
-]
-
[[package]]
name = "pkg-config"
-version = "0.3.29"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb"
+checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
+
+[[package]]
+name = "platforms"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c"
[[package]]
name = "plist"
@@ -3599,7 +4220,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef"
dependencies = [
"base64",
- "indexmap 2.2.1",
+ "indexmap 2.2.4",
"line-wrap",
"quick-xml 0.31.0",
"serde",
@@ -3608,9 +4229,9 @@ dependencies = [
[[package]]
name = "png"
-version = "0.17.11"
+version = "0.17.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a"
+checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1"
dependencies = [
"bitflags 1.3.2",
"crc32fast",
@@ -3637,18 +4258,29 @@ dependencies = [
[[package]]
name = "polling"
-version = "3.3.2"
+version = "3.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "545c980a3880efd47b2e262f6a4bb6daad6555cf3367aa9c4e52895f69537a41"
+checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9"
dependencies = [
"cfg-if",
"concurrent-queue",
"pin-project-lite",
- "rustix 0.38.30",
+ "rustix 0.38.31",
"tracing",
"windows-sys 0.52.0",
]
+[[package]]
+name = "poly1305"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf"
+dependencies = [
+ "cpufeatures",
+ "opaque-debug",
+ "universal-hash",
+]
+
[[package]]
name = "powerfmt"
version = "0.2.0"
@@ -3679,12 +4311,20 @@ dependencies = [
[[package]]
name = "proc-macro-crate"
-version = "2.0.2"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24"
+checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8"
dependencies = [
- "toml_datetime",
- "toml_edit 0.20.2",
+ "toml_edit 0.20.7",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
+dependencies = [
+ "toml_edit 0.21.1",
]
[[package]]
@@ -3726,15 +4366,6 @@ dependencies = [
"unicode-ident",
]
-[[package]]
-name = "promptly"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9acbc6c5a5b029fe58342f58445acb00ccfe24624e538894bc2f04ce112980ba"
-dependencies = [
- "rustyline",
-]
-
[[package]]
name = "quick-xml"
version = "0.30.0"
@@ -3762,16 +4393,6 @@ dependencies = [
"proc-macro2",
]
-[[package]]
-name = "radix_trie"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd"
-dependencies = [
- "endian-type",
- "nibble_vec",
-]
-
[[package]]
name = "rand"
version = "0.7.3"
@@ -3859,6 +4480,12 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
+[[package]]
+name = "raw-window-handle"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544"
+
[[package]]
name = "read-progress-stream"
version = "1.0.0"
@@ -3936,9 +4563,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]]
name = "reqwest"
-version = "0.11.23"
+version = "0.11.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41"
+checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251"
dependencies = [
"base64",
"bytes",
@@ -3946,9 +4573,10 @@ dependencies = [
"futures-core",
"futures-util",
"h2",
- "http",
+ "http 0.2.11",
"http-body",
"hyper",
+ "hyper-rustls",
"hyper-tls",
"ipnet",
"js-sys",
@@ -3958,12 +4586,17 @@ dependencies = [
"once_cell",
"percent-encoding",
"pin-project-lite",
+ "rustls 0.21.10",
+ "rustls-pemfile",
"serde",
"serde_json",
"serde_urlencoded",
+ "sync_wrapper",
"system-configuration",
"tokio",
"tokio-native-tls",
+ "tokio-rustls 0.24.1",
+ "tokio-socks",
"tokio-util",
"tower-service",
"url",
@@ -3971,15 +4604,17 @@ dependencies = [
"wasm-bindgen-futures",
"wasm-streams",
"web-sys",
+ "webpki-roots 0.25.4",
"winreg 0.50.0",
]
[[package]]
name = "rfd"
-version = "0.12.0"
+version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "241a0deb168c88050d872294f7b3106c1dfa8740942bcc97bc91b98e97b5c501"
+checksum = "373d2fc6310e2d14943d4e66ebed5b774a2b6b3b1610e7377edf124fb2760d6b"
dependencies = [
+ "ashpd",
"block",
"dispatch",
"glib-sys 0.18.1",
@@ -3990,7 +4625,7 @@ dependencies = [
"objc",
"objc-foundation",
"objc_id",
- "raw-window-handle",
+ "raw-window-handle 0.6.0",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
@@ -3998,23 +4633,66 @@ dependencies = [
]
[[package]]
-name = "rsa"
-version = "0.9.6"
+name = "ring"
+version = "0.17.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc"
+checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
dependencies = [
- "const-oid",
- "digest",
- "num-bigint-dig",
- "num-integer",
- "num-traits",
- "pkcs1",
- "pkcs8",
- "rand_core 0.6.4",
- "signature",
- "spki",
- "subtle",
- "zeroize",
+ "cc",
+ "cfg-if",
+ "getrandom 0.2.12",
+ "libc",
+ "spin",
+ "untrusted",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "rusqlite"
+version = "0.30.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d"
+dependencies = [
+ "bitflags 2.4.2",
+ "fallible-iterator",
+ "fallible-streaming-iterator",
+ "hashlink",
+ "libsqlite3-sys",
+ "smallvec",
+]
+
+[[package]]
+name = "rust-embed"
+version = "8.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb78f46d0066053d16d4ca7b898e9343bc3530f71c61d5ad84cd404ada068745"
+dependencies = [
+ "rust-embed-impl",
+ "rust-embed-utils",
+ "walkdir",
+]
+
+[[package]]
+name = "rust-embed-impl"
+version = "8.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b91ac2a3c6c0520a3fb3dd89321177c3c692937c4eb21893378219da10c44fc8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "rust-embed-utils",
+ "syn 2.0.52",
+ "walkdir",
+]
+
+[[package]]
+name = "rust-embed-utils"
+version = "8.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86f69089032567ffff4eada41c573fc43ff466c7db7c5688b2e7969584345581"
+dependencies = [
+ "sha2",
+ "walkdir",
]
[[package]]
@@ -4023,6 +4701,12 @@ version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
[[package]]
name = "rustc_version"
version = "0.4.0"
@@ -4048,9 +4732,9 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.38.30"
+version = "0.38.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca"
+checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
dependencies = [
"bitflags 2.4.2",
"errno",
@@ -4059,41 +4743,79 @@ dependencies = [
"windows-sys 0.52.0",
]
+[[package]]
+name = "rustls"
+version = "0.21.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba"
+dependencies = [
+ "log",
+ "ring",
+ "rustls-webpki 0.101.7",
+ "sct",
+]
+
+[[package]]
+name = "rustls"
+version = "0.22.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41"
+dependencies = [
+ "log",
+ "ring",
+ "rustls-pki-types",
+ "rustls-webpki 0.102.2",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
+dependencies = [
+ "base64",
+]
+
+[[package]]
+name = "rustls-pki-types"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8"
+
+[[package]]
+name = "rustls-webpki"
+version = "0.101.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "rustls-webpki"
+version = "0.102.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610"
+dependencies = [
+ "ring",
+ "rustls-pki-types",
+ "untrusted",
+]
+
[[package]]
name = "rustversion"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
-[[package]]
-name = "rustyline"
-version = "9.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db7826789c0e25614b03e5a54a0717a86f9ff6e6e5247f92b369472869320039"
-dependencies = [
- "bitflags 1.3.2",
- "cfg-if",
- "clipboard-win",
- "dirs-next",
- "fd-lock",
- "libc",
- "log",
- "memchr",
- "nix 0.23.2",
- "radix_trie",
- "scopeguard",
- "smallvec",
- "unicode-segmentation",
- "unicode-width",
- "utf8parse",
- "winapi",
-]
-
[[package]]
name = "ryu"
-version = "1.0.16"
+version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
+checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
[[package]]
name = "safemem"
@@ -4101,6 +4823,15 @@ version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
+[[package]]
+name = "salsa20"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213"
+dependencies = [
+ "cipher 0.4.4",
+]
+
[[package]]
name = "same-file"
version = "1.0.6"
@@ -4119,6 +4850,32 @@ dependencies = [
"windows-sys 0.52.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"
@@ -4131,6 +4888,58 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+[[package]]
+name = "scrypt"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f"
+dependencies = [
+ "password-hash 0.5.0",
+ "pbkdf2 0.12.2",
+ "salsa20",
+ "sha2",
+]
+
+[[package]]
+name = "sct"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "secp256k1"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f"
+dependencies = [
+ "bitcoin_hashes 0.12.0",
+ "rand 0.8.5",
+ "secp256k1-sys",
+ "serde",
+]
+
+[[package]]
+name = "secp256k1-sys"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "secrecy"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e"
+dependencies = [
+ "zeroize",
+]
+
[[package]]
name = "secret-service"
version = "3.0.1"
@@ -4147,7 +4956,7 @@ dependencies = [
"rand 0.8.5",
"serde",
"sha2",
- "zbus",
+ "zbus 3.15.1",
]
[[package]]
@@ -4194,40 +5003,73 @@ dependencies = [
]
[[package]]
-name = "semver"
-version = "1.0.21"
+name = "self_cell"
+version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
+checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d"
+dependencies = [
+ "self_cell 1.0.3",
+]
+
+[[package]]
+name = "self_cell"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba"
+
+[[package]]
+name = "semver"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
dependencies = [
"serde",
]
[[package]]
-name = "serde"
-version = "1.0.196"
+name = "send_wrapper"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
+checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73"
+
+[[package]]
+name = "serde"
+version = "1.0.197"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.196"
+version = "1.0.197"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
+checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
+]
+
+[[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.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79"
+checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0"
dependencies = [
+ "indexmap 2.2.4",
"itoa 1.0.10",
"ryu",
"serde",
@@ -4241,7 +5083,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -4267,16 +5109,17 @@ dependencies = [
[[package]]
name = "serde_with"
-version = "3.5.1"
+version = "3.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5c9fdb6b00a489875b22efd4b78fe2b363b72265cc5f6eb2e2b9ee270e6140c"
+checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270"
dependencies = [
"base64",
"chrono",
"hex",
"indexmap 1.9.3",
- "indexmap 2.2.1",
+ "indexmap 2.2.4",
"serde",
+ "serde_derive",
"serde_json",
"serde_with_macros",
"time",
@@ -4284,14 +5127,14 @@ dependencies = [
[[package]]
name = "serde_with_macros"
-version = "3.5.1"
+version = "3.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbff351eb4b33600a2e138dfa0b10b65a238ea8ff8fb2387c422c5022a3e8298"
+checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d"
dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -4376,16 +5219,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "signature"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
-dependencies = [
- "digest",
- "rand_core 0.6.4",
-]
-
[[package]]
name = "simd-adler32"
version = "0.3.7"
@@ -4425,12 +5258,43 @@ dependencies = [
[[package]]
name = "socket2"
-version = "0.5.5"
+version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
+checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871"
dependencies = [
"libc",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "softbuffer"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071916a85d1db274b4ed57af3a14afb66bd836ae7f82ebb6f1fd3455107830d9"
+dependencies = [
+ "as-raw-xcb-connection",
+ "bytemuck",
+ "cfg_aliases 0.2.0",
+ "cocoa",
+ "core-graphics",
+ "drm",
+ "fastrand 2.0.1",
+ "foreign-types 0.5.0",
+ "js-sys",
+ "log",
+ "memmap2",
+ "objc",
+ "raw-window-handle 0.6.0",
+ "redox_syscall",
+ "rustix 0.38.31",
+ "tiny-xlib",
+ "wasm-bindgen",
+ "wayland-backend",
+ "wayland-client",
+ "wayland-sys",
+ "web-sys",
+ "windows-sys 0.52.0",
+ "x11rb",
]
[[package]]
@@ -4459,267 +5323,11 @@ dependencies = [
"system-deps",
]
-[[package]]
-name = "spin"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
-
[[package]]
name = "spin"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
-dependencies = [
- "lock_api",
-]
-
-[[package]]
-name = "spki"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
-dependencies = [
- "base64ct",
- "der",
-]
-
-[[package]]
-name = "sqlformat"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c"
-dependencies = [
- "itertools",
- "nom",
- "unicode_categories",
-]
-
-[[package]]
-name = "sqlx"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf"
-dependencies = [
- "sqlx-core",
- "sqlx-macros",
- "sqlx-mysql",
- "sqlx-postgres",
- "sqlx-sqlite",
-]
-
-[[package]]
-name = "sqlx-cli"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b941ddc37071bb01d001ec479885a493021f1ca39142d754a05a780a77fff99"
-dependencies = [
- "anyhow",
- "async-trait",
- "backoff",
- "cargo_metadata",
- "chrono",
- "clap",
- "console",
- "dotenvy",
- "filetime",
- "futures",
- "glob",
- "promptly",
- "serde",
- "serde_json",
- "sqlx",
- "tokio",
- "url",
-]
-
-[[package]]
-name = "sqlx-core"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd"
-dependencies = [
- "ahash",
- "atoi",
- "byteorder",
- "bytes",
- "crc",
- "crossbeam-queue",
- "dotenvy",
- "either",
- "event-listener 2.5.3",
- "futures-channel",
- "futures-core",
- "futures-intrusive",
- "futures-io",
- "futures-util",
- "hashlink",
- "hex",
- "indexmap 2.2.1",
- "log",
- "memchr",
- "once_cell",
- "paste",
- "percent-encoding",
- "serde",
- "serde_json",
- "sha2",
- "smallvec",
- "sqlformat",
- "thiserror",
- "time",
- "tokio",
- "tokio-stream",
- "tracing",
- "url",
-]
-
-[[package]]
-name = "sqlx-macros"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5"
-dependencies = [
- "proc-macro2",
- "quote",
- "sqlx-core",
- "sqlx-macros-core",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "sqlx-macros-core"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841"
-dependencies = [
- "atomic-write-file",
- "dotenvy",
- "either",
- "heck",
- "hex",
- "once_cell",
- "proc-macro2",
- "quote",
- "serde",
- "serde_json",
- "sha2",
- "sqlx-core",
- "sqlx-mysql",
- "sqlx-postgres",
- "sqlx-sqlite",
- "syn 1.0.109",
- "tempfile",
- "tokio",
- "url",
-]
-
-[[package]]
-name = "sqlx-mysql"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4"
-dependencies = [
- "atoi",
- "base64",
- "bitflags 2.4.2",
- "byteorder",
- "bytes",
- "crc",
- "digest",
- "dotenvy",
- "either",
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-util",
- "generic-array",
- "hex",
- "hkdf",
- "hmac",
- "itoa 1.0.10",
- "log",
- "md-5",
- "memchr",
- "once_cell",
- "percent-encoding",
- "rand 0.8.5",
- "rsa",
- "serde",
- "sha1",
- "sha2",
- "smallvec",
- "sqlx-core",
- "stringprep",
- "thiserror",
- "time",
- "tracing",
- "whoami",
-]
-
-[[package]]
-name = "sqlx-postgres"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24"
-dependencies = [
- "atoi",
- "base64",
- "bitflags 2.4.2",
- "byteorder",
- "crc",
- "dotenvy",
- "etcetera",
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-util",
- "hex",
- "hkdf",
- "hmac",
- "home",
- "itoa 1.0.10",
- "log",
- "md-5",
- "memchr",
- "once_cell",
- "rand 0.8.5",
- "serde",
- "serde_json",
- "sha1",
- "sha2",
- "smallvec",
- "sqlx-core",
- "stringprep",
- "thiserror",
- "time",
- "tracing",
- "whoami",
-]
-
-[[package]]
-name = "sqlx-sqlite"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490"
-dependencies = [
- "atoi",
- "flume",
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-intrusive",
- "futures-util",
- "libsqlite3-sys",
- "log",
- "percent-encoding",
- "serde",
- "sqlx-core",
- "time",
- "tracing",
- "url",
- "urlencoding",
-]
[[package]]
name = "stable_deref_trait"
@@ -4742,12 +5350,6 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
-[[package]]
-name = "str-buf"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0"
-
[[package]]
name = "string_cache"
version = "0.8.7"
@@ -4774,23 +5376,18 @@ dependencies = [
"quote",
]
-[[package]]
-name = "stringprep"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6"
-dependencies = [
- "finl_unicode",
- "unicode-bidi",
- "unicode-normalization",
-]
-
[[package]]
name = "strsim"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+[[package]]
+name = "strsim"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01"
+
[[package]]
name = "subtle"
version = "2.5.0"
@@ -4821,15 +5418,21 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.48"
+version = "2.0.52"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
+checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
+[[package]]
+name = "sync_wrapper"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+
[[package]]
name = "sys-locale"
version = "0.3.1"
@@ -4869,23 +5472,23 @@ dependencies = [
"cfg-expr",
"heck",
"pkg-config",
- "toml 0.8.2",
+ "toml 0.8.10",
"version-compare",
]
[[package]]
name = "tao"
-version = "0.24.1"
+version = "0.26.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75d4a64cfac8e487c61d778fe4ab8480f162451e8af7f247aafadcb3b2560852"
+checksum = "ccba570365293ca309d60f30fdac2c5271b732dc762e6154e59c85d2c762a0a1"
dependencies = [
"bitflags 1.3.2",
- "cc",
"cocoa",
"core-foundation",
- "core-graphics 0.23.1",
+ "core-graphics",
"crossbeam-channel",
"dispatch",
+ "dlopen2",
"gdkwayland-sys",
"gdkx11-sys",
"gtk",
@@ -4902,7 +5505,7 @@ dependencies = [
"once_cell",
"parking_lot",
"png",
- "raw-window-handle",
+ "raw-window-handle 0.6.0",
"scopeguard",
"tao-macros",
"unicode-segmentation",
@@ -4911,7 +5514,6 @@ dependencies = [
"windows-implement",
"windows-version",
"x11-dl",
- "zbus",
]
[[package]]
@@ -4938,15 +5540,15 @@ dependencies = [
[[package]]
name = "target-lexicon"
-version = "0.12.13"
+version = "0.12.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae"
+checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f"
[[package]]
name = "tauri"
-version = "2.0.0-alpha.21"
+version = "2.0.0-beta.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e9a02f880bf9fcf62b73ea1d7f399601fab7ccc740814f46c3508d38e289722"
+checksum = "b2bd3d5ccf5316833c0f71c645c25585bddf997a16bea652bf3eab8114273cff"
dependencies = [
"anyhow",
"bytes",
@@ -4958,7 +5560,7 @@ dependencies = [
"glob",
"gtk",
"heck",
- "http",
+ "http 0.2.11",
"http-range",
"jni",
"libc",
@@ -4967,13 +5569,14 @@ dependencies = [
"muda",
"objc",
"percent-encoding",
- "raw-window-handle",
+ "raw-window-handle 0.6.0",
"reqwest",
"serde",
"serde_json",
"serde_repr",
"serialize-to-javascript",
"state",
+ "static_assertions",
"swift-rs",
"tauri-build",
"tauri-macros",
@@ -4992,30 +5595,31 @@ dependencies = [
[[package]]
name = "tauri-build"
-version = "2.0.0-alpha.14"
+version = "2.0.0-beta.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6b49822e368ea52ba1afdc4bc90c81f942d3cb2147b1b22d5e7a4f2b96050a5"
+checksum = "3ca30dbed856449b41abed13a5a46655ea2196075e09e99e22fe8ed0958b6aee"
dependencies = [
"anyhow",
"cargo_toml",
"dirs-next",
+ "glob",
"heck",
"json-patch",
- "plist",
+ "schemars",
"semver",
"serde",
"serde_json",
- "swift-rs",
"tauri-utils",
"tauri-winres",
+ "toml 0.8.10",
"walkdir",
]
[[package]]
name = "tauri-codegen"
-version = "2.0.0-alpha.13"
+version = "2.0.0-beta.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0231c790a0842fedb921210b2ee8120dbe0a9f1797be3499abbf52ab80bbb57f"
+checksum = "bf4ed45a0d2a1723ef4ea71d1aa5809c4a8bcaa92de77f6c9a8f4d4f28c5d86a"
dependencies = [
"base64",
"brotli",
@@ -5029,6 +5633,7 @@ dependencies = [
"serde",
"serde_json",
"sha2",
+ "syn 2.0.52",
"tauri-utils",
"thiserror",
"time",
@@ -5039,90 +5644,112 @@ dependencies = [
[[package]]
name = "tauri-macros"
-version = "2.0.0-alpha.13"
+version = "2.0.0-beta.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712da03672a161265bd2e190f007431d8560b5071e68f4ec7b25e9c54fa1b3bb"
+checksum = "d0a75661fb86b350141e78ad54ce9c60346149afc5cbf41de2ca60a1ebc252b3"
dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
"tauri-codegen",
"tauri-utils",
]
[[package]]
-name = "tauri-plugin-autostart"
-version = "2.0.0-alpha.6"
+name = "tauri-plugin"
+version = "2.0.0-beta.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f660808f493581eb766e1e37f06777e01f6607631efe2d542e448fb1d89ea34a"
+checksum = "e9530f0f0d809e77ff9a93da5ff2483faf8fef2cb8ed125ca7b0172cb92685d4"
+dependencies = [
+ "anyhow",
+ "glob",
+ "plist",
+ "schemars",
+ "serde",
+ "serde_json",
+ "tauri-utils",
+ "toml 0.8.10",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-plugin-autostart"
+version = "2.0.0-beta.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a19866b4eac5bd88b1e92e45c0af9906dd98705fa18b50d899d3b0e32a39edf"
dependencies = [
"auto-launch",
"log",
"serde",
"serde_json",
"tauri",
+ "tauri-plugin",
"thiserror",
]
[[package]]
name = "tauri-plugin-cli"
-version = "2.0.0-alpha.6"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af3ce9173dd3ae43c5c7529cce495e89cc9d8773adcd2a3e0efb5123aa052c64"
+checksum = "df28f12dcff443122f36212f4a2f2e8dd4975dc3e8a31daef50c0b62898106cc"
dependencies = [
"clap",
"log",
"serde",
"serde_json",
"tauri",
+ "tauri-plugin",
"thiserror",
]
[[package]]
name = "tauri-plugin-clipboard-manager"
-version = "2.0.0-alpha.6"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9dd33e4675642fc51b5538d42169927e39058e02000baea4651dc47a98bf259b"
+checksum = "0f23317c713c5e7b29692c394219d81e5cab150cf1fa414877426da7071f84d6"
dependencies = [
"arboard",
"log",
"serde",
"serde_json",
"tauri",
- "tauri-build",
+ "tauri-plugin",
"thiserror",
]
[[package]]
name = "tauri-plugin-dialog"
-version = "2.0.0-alpha.7"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a0ff9a134afd29589d6154547a04dee18f5999aa63b91fdf7d58e597264633a"
+checksum = "4ed2ac81ffb8fd76d854578784491bbf8d8baba274fa9e18c0bbdc4ba00b0013"
dependencies = [
"glib 0.16.9",
"log",
- "raw-window-handle",
+ "raw-window-handle 0.6.0",
"rfd",
"serde",
"serde_json",
"tauri",
- "tauri-build",
+ "tauri-plugin",
"tauri-plugin-fs",
"thiserror",
]
[[package]]
name = "tauri-plugin-fs"
-version = "2.0.0-alpha.7"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4930141ae4379cdfdc2270b28bf3d54faf1e757f3f8218f2b5b1366faa2dda79"
+checksum = "c4a556b50d761ec405087bf67e82b3936ddeaf39d4d602a443e2a0d2df6cdb2a"
dependencies = [
"anyhow",
"glob",
+ "schemars",
"serde",
+ "serde_json",
"serde_repr",
"tauri",
+ "tauri-plugin",
"thiserror",
"url",
"uuid",
@@ -5130,17 +5757,19 @@ dependencies = [
[[package]]
name = "tauri-plugin-http"
-version = "2.0.0-alpha.9"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7acc9eb023046eabd552d7e9e7f5afb6a6b3bd61cc67b79a9267b80029fabee4"
+checksum = "7f5c00ebdfdab74d9669460665a1158dacd0cc692bf95a3b7d7e5160ebbd8ad0"
dependencies = [
"data-url",
"glob",
- "http",
+ "http 0.2.11",
"reqwest",
+ "schemars",
"serde",
"serde_json",
"tauri",
+ "tauri-plugin",
"tauri-plugin-fs",
"thiserror",
"url",
@@ -5148,30 +5777,32 @@ dependencies = [
[[package]]
name = "tauri-plugin-notification"
-version = "2.0.0-alpha.7"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5e1cfe331495d0e72b9d48191eec98a54f9e189571b8ec6affb39b90b3df3bc"
+checksum = "a65c040c7f2b764aa03cc1bed36973a90bc08917936c944ec0885bdf5eeaa2fe"
dependencies = [
"log",
- "notify-rust",
+ "mac-notification-sys",
"rand 0.8.5",
"serde",
"serde_json",
"serde_repr",
"tauri",
- "tauri-build",
+ "tauri-plugin",
+ "tauri-winrt-notification",
"thiserror",
"time",
"url",
+ "zbus 4.1.2",
]
[[package]]
name = "tauri-plugin-os"
-version = "2.0.0-alpha.6"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7cfaf07f8dcbfd4b2ce6156c4158d9d1419850ffe4e8146b6e890b5381e6906"
+checksum = "1f9bd936030047ce0143dda585f908f4e8433089c4aa95ef182959283483abfb"
dependencies = [
- "gethostname 0.4.3",
+ "gethostname",
"log",
"os_info",
"serde",
@@ -5179,93 +5810,65 @@ dependencies = [
"serialize-to-javascript",
"sys-locale",
"tauri",
+ "tauri-plugin",
"thiserror",
]
[[package]]
name = "tauri-plugin-process"
-version = "2.0.0-alpha.6"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b55c149c1027bc3de752d51ca9227cfa2ce592a4934735f70c6050360e0b60b3"
+checksum = "324d724d8e12b90681acf7a855e2f73f84825e500ed297ba66b2326ef58527b4"
dependencies = [
"tauri",
+ "tauri-plugin",
]
[[package]]
name = "tauri-plugin-shell"
-version = "2.0.0-alpha.6"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75a85e88ed3da46059825105f604ed57e2151d7718356750c7c6919b7288a828"
+checksum = "bb42a100bd4b6adad6f07455f54c5916d32be79d81e5914478ece45a04560cad"
dependencies = [
"encoding_rs",
"log",
"open",
"os_pipe",
"regex",
+ "schemars",
"serde",
"serde_json",
"shared_child",
"tauri",
+ "tauri-plugin",
"thiserror",
]
-[[package]]
-name = "tauri-plugin-sql"
-version = "2.0.0-alpha.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9253a4159e2c84532407724bb886e4e9ee0186d0e5fae2046920c4a02a30c50d"
-dependencies = [
- "futures-core",
- "log",
- "serde",
- "serde_json",
- "sqlx",
- "tauri",
- "thiserror",
- "time",
- "tokio",
-]
-
[[package]]
name = "tauri-plugin-store"
-version = "2.0.0-alpha.6"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96e9f18d08c7ff875178499ca81a977c0fe7a105a6f18a3779f7a1e907e31f62"
+checksum = "f023f235e8d505f4e6b6a5f15374e7e77e02223f5d56ba6bdcf4fb2dcfc66d96"
dependencies = [
"log",
"serde",
"serde_json",
"tauri",
+ "tauri-plugin",
"thiserror",
]
-[[package]]
-name = "tauri-plugin-theme"
-version = "0.3.0"
-source = "git+https://github.com/wyhaya/tauri-plugin-theme#cc032254c07887068f0aafd578127d276ff7f1c6"
-dependencies = [
- "cocoa",
- "dirs-next",
- "futures-lite 2.2.0",
- "gtk",
- "once_cell",
- "serde",
- "tauri",
- "tintanum",
- "tokio",
-]
-
[[package]]
name = "tauri-plugin-updater"
-version = "2.0.0-alpha.6"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0473197ceb5b436f8b5be139875c54b59fee756f8c15415ef374495de13747c1"
+checksum = "587dfbe753c43e5db6c7f82b399c7c9f548c744ce7485d0f41a55ad7bb31d23c"
dependencies = [
"base64",
"dirs-next",
"flate2",
"futures-util",
- "http",
+ "http 0.2.11",
"minisign-verify",
"percent-encoding",
"reqwest",
@@ -5274,6 +5877,7 @@ dependencies = [
"serde_json",
"tar",
"tauri",
+ "tauri-plugin",
"tempfile",
"thiserror",
"time",
@@ -5284,9 +5888,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-upload"
-version = "2.0.0-alpha.6"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b6b814eb7c66eae2db9b7d76eb571ddc385894cb9aac4c90626d9e93ca1cbe1"
+checksum = "1b0782e222836265338709ad356ffdd58e01c22462f0af4ab728bbf2978efeb3"
dependencies = [
"futures-util",
"log",
@@ -5295,6 +5899,7 @@ dependencies = [
"serde",
"serde_json",
"tauri",
+ "tauri-plugin",
"thiserror",
"tokio",
"tokio-util",
@@ -5302,9 +5907,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-window-state"
-version = "2.0.0-alpha.6"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9509fae907fd4cbd238ac048003778fe9108cb521a6fb58fb8a5f844e0dbcc93"
+checksum = "18ea69612514fd82a41e42079a7783f78a326c413aaede065f0a8000922f5449"
dependencies = [
"bincode",
"bitflags 2.4.2",
@@ -5312,19 +5917,20 @@ dependencies = [
"serde",
"serde_json",
"tauri",
+ "tauri-plugin",
"thiserror",
]
[[package]]
name = "tauri-runtime"
-version = "1.0.0-alpha.8"
+version = "2.0.0-beta.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80d5db66fb4913e3e64211737f4b7febad4d89e433f46cedee997be38ff45c51"
+checksum = "0381b4b96e1f4f39a24ca6472c9b016151b103a54b1425233007fdbc26cf20a8"
dependencies = [
"gtk",
- "http",
+ "http 0.2.11",
"jni",
- "raw-window-handle",
+ "raw-window-handle 0.6.0",
"serde",
"serde_json",
"tauri-utils",
@@ -5335,19 +5941,21 @@ dependencies = [
[[package]]
name = "tauri-runtime-wry"
-version = "1.0.0-alpha.9"
+version = "2.0.0-beta.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "379db5d8c05d0d47a2a86f6e758b2db9f62ba5c8703e6974356121974e170cae"
+checksum = "4eef6a8373c9936b33a58c1bdbdd76fe4603d00ebe72304c0777bf0674e455aa"
dependencies = [
"cocoa",
"gtk",
- "http",
+ "http 0.2.11",
"jni",
"percent-encoding",
- "raw-window-handle",
+ "raw-window-handle 0.6.0",
+ "softbuffer",
"tao",
"tauri-runtime",
"tauri-utils",
+ "url",
"webkit2gtk",
"webview2-com",
"windows 0.52.0",
@@ -5356,11 +5964,12 @@ dependencies = [
[[package]]
name = "tauri-utils"
-version = "2.0.0-alpha.13"
+version = "2.0.0-beta.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9740746f9a44cf7243f0ccaa724ecf09e4655fadd568da898057caad11df031c"
+checksum = "92e35e2f9a5ee8539d00dde621f176647747736a388a07c3083a0cc1b96ba6d7"
dependencies = [
"brotli",
+ "cargo_metadata",
"ctor",
"dunce",
"glob",
@@ -5374,11 +5983,14 @@ dependencies = [
"phf 0.11.2",
"proc-macro2",
"quote",
+ "schemars",
"semver",
"serde",
"serde_json",
"serde_with",
+ "swift-rs",
"thiserror",
+ "toml 0.8.10",
"url",
"walkdir",
]
@@ -5405,14 +6017,13 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.9.0"
+version = "3.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa"
+checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
dependencies = [
"cfg-if",
"fastrand 2.0.1",
- "redox_syscall",
- "rustix 0.38.30",
+ "rustix 0.38.31",
"windows-sys 0.52.0",
]
@@ -5435,29 +6046,29 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
[[package]]
name = "thiserror"
-version = "1.0.56"
+version = "1.0.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
+checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.56"
+version = "1.0.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
+checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
name = "thread_local"
-version = "1.1.7"
+version = "1.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
dependencies = [
"cfg-if",
"once_cell",
@@ -5476,12 +6087,13 @@ dependencies = [
[[package]]
name = "time"
-version = "0.3.31"
+version = "0.3.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e"
+checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749"
dependencies = [
"deranged",
"itoa 1.0.10",
+ "num-conv",
"powerfmt",
"serde",
"time-core",
@@ -5496,21 +6108,33 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
[[package]]
name = "time-macros"
-version = "0.2.16"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f"
+checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774"
dependencies = [
+ "num-conv",
"time-core",
]
[[package]]
-name = "tintanum"
-version = "0.1.0"
+name = "tiny-xlib"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7abbcf9173afc80733c20b7e27a30bc9284d6535bdbde2a70904032de63e16e8"
+checksum = "d4098d49269baa034a8d1eae9bd63e9fa532148d772121dace3bcd6a6c98eb6d"
dependencies = [
- "futures-lite 1.13.0",
- "zbus",
+ "as-raw-xcb-connection",
+ "ctor",
+ "libloading 0.8.1",
+ "tracing",
+]
+
+[[package]]
+name = "tinystr"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece"
+dependencies = [
+ "displaydoc",
]
[[package]]
@@ -5530,18 +6154,21 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.35.1"
+version = "1.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
+checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
dependencies = [
"backtrace",
"bytes",
"libc",
"mio",
"num_cpus",
+ "parking_lot",
"pin-project-lite",
- "socket2 0.5.5",
+ "signal-hook-registry",
+ "socket2 0.5.6",
"tokio-macros",
+ "tracing",
"windows-sys 0.48.0",
]
@@ -5553,7 +6180,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -5567,16 +6194,54 @@ dependencies = [
]
[[package]]
-name = "tokio-stream"
-version = "0.1.14"
+name = "tokio-rustls"
+version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
+checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
dependencies = [
- "futures-core",
- "pin-project-lite",
+ "rustls 0.21.10",
"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.2",
+ "rustls-pki-types",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-socks"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0"
+dependencies = [
+ "either",
+ "futures-util",
+ "thiserror",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-tungstenite"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38"
+dependencies = [
+ "futures-util",
+ "log",
+ "rustls 0.22.2",
+ "rustls-pki-types",
+ "tokio",
+ "tokio-rustls 0.25.0",
+ "tungstenite",
+ "webpki-roots 0.26.1",
+]
+
[[package]]
name = "tokio-util"
version = "0.7.10"
@@ -5591,6 +6256,15 @@ 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"
@@ -5605,21 +6279,21 @@ dependencies = [
[[package]]
name = "toml"
-version = "0.8.2"
+version = "0.8.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d"
+checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
- "toml_edit 0.20.2",
+ "toml_edit 0.22.6",
]
[[package]]
name = "toml_datetime"
-version = "0.6.3"
+version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
+checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
dependencies = [
"serde",
]
@@ -5630,24 +6304,46 @@ version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [
- "indexmap 2.2.1",
+ "indexmap 2.2.4",
"serde",
"serde_spanned",
"toml_datetime",
- "winnow",
+ "winnow 0.5.40",
]
[[package]]
name = "toml_edit"
-version = "0.20.2"
+version = "0.20.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
+checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
dependencies = [
- "indexmap 2.2.1",
+ "indexmap 2.2.4",
+ "toml_datetime",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
+dependencies = [
+ "indexmap 2.2.4",
+ "toml_datetime",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.22.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6"
+dependencies = [
+ "indexmap 2.2.4",
"serde",
"serde_spanned",
"toml_datetime",
- "winnow",
+ "winnow 0.6.3",
]
[[package]]
@@ -5662,7 +6358,6 @@ version = "0.1.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
dependencies = [
- "log",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
@@ -5676,7 +6371,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -5720,12 +6415,12 @@ dependencies = [
[[package]]
name = "tray-icon"
-version = "0.11.2"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd26786733426b0bf632ebab410c162859a911f26c7c9e208b9e329a8ca94481"
+checksum = "7a4d9ddd4a7c0f3b6862af1c4911b529a49db4ee89310d3a258859c2f5053fdd"
dependencies = [
"cocoa",
- "core-graphics 0.23.1",
+ "core-graphics",
"crossbeam-channel",
"dirs-next",
"libappindicator",
@@ -5740,9 +6435,9 @@ dependencies = [
[[package]]
name = "treediff"
-version = "4.0.2"
+version = "4.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303"
+checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5"
dependencies = [
"serde_json",
]
@@ -5753,6 +6448,36 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+[[package]]
+name = "tungstenite"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1"
+dependencies = [
+ "byteorder",
+ "bytes",
+ "data-encoding",
+ "http 1.0.0",
+ "httparse",
+ "log",
+ "rand 0.8.5",
+ "rustls 0.22.2",
+ "rustls-pki-types",
+ "sha1",
+ "thiserror",
+ "url",
+ "utf-8",
+]
+
+[[package]]
+name = "type-map"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6d3364c5e96cb2ad1603037ab253ddd34d7fb72a58bdddf4b7350760fc69a46"
+dependencies = [
+ "rustc-hash",
+]
+
[[package]]
name = "typenum"
version = "1.17.0"
@@ -5770,6 +6495,25 @@ dependencies = [
"winapi",
]
+[[package]]
+name = "unic-langid"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "238722e6d794ed130f91f4ea33e01fcff4f188d92337a21297892521c72df516"
+dependencies = [
+ "unic-langid-impl",
+]
+
+[[package]]
+name = "unic-langid-impl"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bd55a2063fdea4ef1f8633243a7b0524cbeef1905ae04c31a1c9b9775c55bc6"
+dependencies = [
+ "serde",
+ "tinystr",
+]
+
[[package]]
name = "unicode-bidi"
version = "0.3.15"
@@ -5793,21 +6537,25 @@ 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"
-version = "0.1.11"
+name = "universal-hash"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
+checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea"
+dependencies = [
+ "crypto-common",
+ "subtle",
+]
[[package]]
-name = "unicode_categories"
-version = "0.1.1"
+name = "untrusted"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
+checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "url"
@@ -5821,12 +6569,6 @@ dependencies = [
"serde",
]
-[[package]]
-name = "urlencoding"
-version = "2.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
-
[[package]]
name = "utf-8"
version = "0.7.6"
@@ -5931,9 +6673,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.90"
+version = "0.2.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406"
+checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f"
dependencies = [
"cfg-if",
"wasm-bindgen-macro",
@@ -5941,24 +6683,24 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.90"
+version = "0.2.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd"
+checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.40"
+version = "0.4.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461"
+checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97"
dependencies = [
"cfg-if",
"js-sys",
@@ -5968,9 +6710,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.90"
+version = "0.2.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999"
+checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -5978,28 +6720,28 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.90"
+version = "0.2.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7"
+checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.90"
+version = "0.2.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"
+checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838"
[[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",
@@ -6009,10 +6751,76 @@ dependencies = [
]
[[package]]
-name = "web-sys"
-version = "0.3.67"
+name = "wasm-ws"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed"
+checksum = "f5b3a482e27ff54809c0848629d9033179705c5ea2f58e26cf45dc77c34c4984"
+dependencies = [
+ "async_io_stream",
+ "futures",
+ "js-sys",
+ "pharos",
+ "send_wrapper",
+ "thiserror",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "wayland-backend"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40"
+dependencies = [
+ "cc",
+ "downcast-rs",
+ "rustix 0.38.31",
+ "scoped-tls",
+ "smallvec",
+ "wayland-sys",
+]
+
+[[package]]
+name = "wayland-client"
+version = "0.31.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f"
+dependencies = [
+ "bitflags 2.4.2",
+ "rustix 0.38.31",
+ "wayland-backend",
+ "wayland-scanner",
+]
+
+[[package]]
+name = "wayland-scanner"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283"
+dependencies = [
+ "proc-macro2",
+ "quick-xml 0.31.0",
+ "quote",
+]
+
+[[package]]
+name = "wayland-sys"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af"
+dependencies = [
+ "dlib",
+ "log",
+ "once_cell",
+ "pkg-config",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -6076,6 +6884,21 @@ dependencies = [
"url",
]
+[[package]]
+name = "webpki-roots"
+version = "0.25.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
+
+[[package]]
+name = "webpki-roots"
+version = "0.26.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009"
+dependencies = [
+ "rustls-pki-types",
+]
+
[[package]]
name = "webview2-com"
version = "0.28.0"
@@ -6098,7 +6921,7 @@ checksum = "ac1345798ecd8122468840bcdf1b95e5dc6d2206c5e4b0eafa078d061f59c9bc"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -6118,12 +6941,6 @@ version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
-[[package]]
-name = "whoami"
-version = "1.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50"
-
[[package]]
name = "winapi"
version = "0.3.9"
@@ -6149,15 +6966,6 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "winapi-wsapoll"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e"
-dependencies = [
- "winapi",
-]
-
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
@@ -6166,26 +6974,17 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "window-vibrancy"
-version = "0.4.3"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af6abc2b9c56bd95887825a1ce56cde49a2a97c07e28db465d541f5098a2656c"
+checksum = "33082acd404763b315866e14a0d5193f3422c81086657583937a750cdd3ec340"
dependencies = [
"cocoa",
"objc",
- "raw-window-handle",
+ "raw-window-handle 0.6.0",
"windows-sys 0.52.0",
"windows-version",
]
-[[package]]
-name = "windows"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
-dependencies = [
- "windows-targets 0.48.5",
-]
-
[[package]]
name = "windows"
version = "0.51.1"
@@ -6205,7 +7004,17 @@ dependencies = [
"windows-core 0.52.0",
"windows-implement",
"windows-interface",
- "windows-targets 0.52.0",
+ "windows-targets 0.52.4",
+]
+
+[[package]]
+name = "windows"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efc5cf48f83140dcaab716eeaea345f9e93d0018fb81162753a3f76c3397b538"
+dependencies = [
+ "windows-core 0.53.0",
+ "windows-targets 0.52.4",
]
[[package]]
@@ -6223,7 +7032,17 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
- "windows-targets 0.52.0",
+ "windows-targets 0.52.4",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9dcc5b895a6377f1ab9fa55acedab1fd5ac0db66ad1e6c7f47e28a22e446a5dd"
+dependencies = [
+ "windows-result",
+ "windows-targets 0.52.4",
]
[[package]]
@@ -6234,7 +7053,7 @@ checksum = "12168c33176773b86799be25e2a2ba07c7aab9968b37541f1094dbd7a60c8946"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -6245,7 +7064,16 @@ checksum = "9d8dc32e0095a7eeccebd0e3f09e9509365ecb3fc6ac4d6f5f14a3f6392942d1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd19df78e5168dfb0aedc343d1d1b8d422ab2db6756d2dc3fef75035402a3f64"
+dependencies = [
+ "windows-targets 0.52.4",
]
[[package]]
@@ -6272,7 +7100,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.4",
]
[[package]]
@@ -6307,17 +7135,17 @@ dependencies = [
[[package]]
name = "windows-targets"
-version = "0.52.0"
+version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b"
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.4",
+ "windows_aarch64_msvc 0.52.4",
+ "windows_i686_gnu 0.52.4",
+ "windows_i686_msvc 0.52.4",
+ "windows_x86_64_gnu 0.52.4",
+ "windows_x86_64_gnullvm 0.52.4",
+ "windows_x86_64_msvc 0.52.4",
]
[[package]]
@@ -6326,7 +7154,7 @@ 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.4",
]
[[package]]
@@ -6343,9 +7171,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_gnullvm"
-version = "0.52.0"
+version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9"
[[package]]
name = "windows_aarch64_msvc"
@@ -6361,9 +7189,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.52.0"
+version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
+checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675"
[[package]]
name = "windows_i686_gnu"
@@ -6379,9 +7207,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_gnu"
-version = "0.52.0"
+version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
+checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3"
[[package]]
name = "windows_i686_msvc"
@@ -6397,9 +7225,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_i686_msvc"
-version = "0.52.0"
+version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
+checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02"
[[package]]
name = "windows_x86_64_gnu"
@@ -6415,9 +7243,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.52.0"
+version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03"
[[package]]
name = "windows_x86_64_gnullvm"
@@ -6433,9 +7261,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_gnullvm"
-version = "0.52.0"
+version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177"
[[package]]
name = "windows_x86_64_msvc"
@@ -6451,15 +7279,24 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.52.0"
+version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
[[package]]
name = "winnow"
-version = "0.5.35"
+version = "0.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1931d78a9c73861da0134f453bb1f790ce49b2e30eba8410b4b79bac72b46a2d"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winnow"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44e19b97e00a4d3db3cdb9b53c8c5f87151b5689b82cc86c2848cbdcccb2689b"
dependencies = [
"memchr",
]
@@ -6495,21 +7332,21 @@ dependencies = [
[[package]]
name = "wry"
-version = "0.35.2"
+version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3016c47c9b6f7029a9da7cd48af8352327226bba0e955f3c92e2966651365a9"
+checksum = "8b717040ba9771fd88eb428c6ea6b555f8e734ff8534f02c13e8f10d97f5935e"
dependencies = [
"base64",
"block",
- "cfg_aliases",
+ "cfg_aliases 0.1.1",
"cocoa",
- "core-graphics 0.23.1",
+ "core-graphics",
"crossbeam-channel",
"dunce",
"gdkx11",
"gtk",
"html5ever",
- "http",
+ "http 0.2.11",
"javascriptcore-rs",
"jni",
"kuchikiki",
@@ -6521,14 +7358,14 @@ dependencies = [
"objc",
"objc_id",
"once_cell",
- "raw-window-handle",
+ "percent-encoding",
+ "raw-window-handle 0.6.0",
"serde",
"serde_json",
"sha2",
"soup3",
"tao-macros",
"thiserror",
- "url",
"webkit2gtk",
"webkit2gtk-sys",
"webview2-com",
@@ -6561,24 +7398,35 @@ dependencies = [
[[package]]
name = "x11rb"
-version = "0.12.0"
+version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1641b26d4dec61337c35a1b1aaf9e3cba8f46f0b43636c609ab0291a648040a"
+checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a"
dependencies = [
- "gethostname 0.3.0",
- "nix 0.26.4",
- "winapi",
- "winapi-wsapoll",
+ "as-raw-xcb-connection",
+ "gethostname",
+ "libc",
+ "libloading 0.8.1",
+ "once_cell",
+ "rustix 0.38.31",
"x11rb-protocol",
]
[[package]]
name = "x11rb-protocol"
-version = "0.12.0"
+version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82d6c3f9a0fb6701fab8f6cea9b0c0bd5d6876f1f89f7fada07e558077c344bc"
+checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34"
+
+[[package]]
+name = "x25519-dalek"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277"
dependencies = [
- "nix 0.26.4",
+ "curve25519-dalek",
+ "rand_core 0.6.4",
+ "serde",
+ "zeroize",
]
[[package]]
@@ -6589,16 +7437,16 @@ checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f"
dependencies = [
"libc",
"linux-raw-sys 0.4.13",
- "rustix 0.38.30",
+ "rustix 0.38.31",
]
[[package]]
name = "xdg-home"
-version = "1.0.0"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd"
+checksum = "21e5a325c3cb8398ad6cf859c1135b25dd29e186679cf2da7581d9679f63b38e"
dependencies = [
- "nix 0.26.4",
+ "libc",
"winapi",
]
@@ -6615,16 +7463,16 @@ dependencies = [
[[package]]
name = "zbus"
-version = "3.14.1"
+version = "3.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948"
+checksum = "5acecd3f8422f198b1a2f954bcc812fe89f3fa4281646f3da1da7925db80085d"
dependencies = [
- "async-broadcast",
+ "async-broadcast 0.5.1",
"async-executor",
- "async-fs",
+ "async-fs 1.6.0",
"async-io 1.13.0",
"async-lock 2.8.0",
- "async-process",
+ "async-process 1.8.1",
"async-recursion",
"async-task",
"async-trait",
@@ -6649,16 +7497,56 @@ dependencies = [
"uds_windows",
"winapi",
"xdg-home",
- "zbus_macros",
- "zbus_names",
- "zvariant",
+ "zbus_macros 3.15.1",
+ "zbus_names 2.6.0",
+ "zvariant 3.15.1",
+]
+
+[[package]]
+name = "zbus"
+version = "4.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c9ff46f2a25abd690ed072054733e0bc3157e3d4c45f41bd183dce09c2ff8ab9"
+dependencies = [
+ "async-broadcast 0.7.0",
+ "async-executor",
+ "async-fs 2.1.1",
+ "async-io 2.3.1",
+ "async-lock 3.3.0",
+ "async-process 2.1.0",
+ "async-recursion",
+ "async-task",
+ "async-trait",
+ "blocking",
+ "derivative",
+ "enumflags2",
+ "event-listener 5.2.0",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "hex",
+ "nix 0.28.0",
+ "ordered-stream",
+ "rand 0.8.5",
+ "serde",
+ "serde_repr",
+ "sha1",
+ "static_assertions",
+ "tokio",
+ "tracing",
+ "uds_windows",
+ "windows-sys 0.52.0",
+ "xdg-home",
+ "zbus_macros 4.1.2",
+ "zbus_names 3.0.0",
+ "zvariant 4.0.2",
]
[[package]]
name = "zbus_macros"
-version = "3.14.1"
+version = "3.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d"
+checksum = "2207eb71efebda17221a579ca78b45c4c5f116f074eb745c3a172e688ccf89f5"
dependencies = [
"proc-macro-crate 1.3.1",
"proc-macro2",
@@ -6668,6 +7556,20 @@ dependencies = [
"zvariant_utils",
]
+[[package]]
+name = "zbus_macros"
+version = "4.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e0e3852c93dcdb49c9462afe67a2a468f7bd464150d866e861eaf06208633e0"
+dependencies = [
+ "proc-macro-crate 3.1.0",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "syn 1.0.109",
+ "zvariant_utils",
+]
+
[[package]]
name = "zbus_names"
version = "2.6.0"
@@ -6676,7 +7578,18 @@ checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9"
dependencies = [
"serde",
"static_assertions",
- "zvariant",
+ "zvariant 3.15.1",
+]
+
+[[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 4.0.2",
]
[[package]]
@@ -6696,7 +7609,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.52",
]
[[package]]
@@ -6704,6 +7617,20 @@ name = "zeroize"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+dependencies = [
+ "zeroize_derive",
+]
+
+[[package]]
+name = "zeroize_derive"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
[[package]]
name = "zip"
@@ -6711,7 +7638,7 @@ version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261"
dependencies = [
- "aes 0.8.3",
+ "aes 0.8.4",
"byteorder",
"bzip2",
"constant_time_eq",
@@ -6719,7 +7646,7 @@ dependencies = [
"crossbeam-utils",
"flate2",
"hmac",
- "pbkdf2",
+ "pbkdf2 0.11.0",
"sha1",
"time",
"zstd",
@@ -6756,23 +7683,37 @@ dependencies = [
[[package]]
name = "zvariant"
-version = "3.15.0"
+version = "3.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c"
+checksum = "c5b4fcf3660d30fc33ae5cd97e2017b23a96e85afd7a1dd014534cd0bf34ba67"
dependencies = [
"byteorder",
"enumflags2",
"libc",
"serde",
"static_assertions",
- "zvariant_derive",
+ "zvariant_derive 3.15.1",
+]
+
+[[package]]
+name = "zvariant"
+version = "4.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c1b3ca6db667bfada0f1ebfc94b2b1759ba25472ee5373d4551bb892616389a"
+dependencies = [
+ "endi",
+ "enumflags2",
+ "serde",
+ "static_assertions",
+ "url",
+ "zvariant_derive 4.0.2",
]
[[package]]
name = "zvariant_derive"
-version = "3.15.0"
+version = "3.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd"
+checksum = "0277758a8a0afc0e573e80ed5bfd9d9c2b48bd3108ffe09384f9f738c83f4a55"
dependencies = [
"proc-macro-crate 1.3.1",
"proc-macro2",
@@ -6782,10 +7723,23 @@ dependencies = [
]
[[package]]
-name = "zvariant_utils"
-version = "1.0.1"
+name = "zvariant_derive"
+version = "4.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200"
+checksum = "b7a4b236063316163b69039f77ce3117accb41a09567fd24c168e43491e521bc"
+dependencies = [
+ "proc-macro-crate 3.1.0",
+ "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",
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index 2fd4adb6..a0a7c0a4 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -1,52 +1,38 @@
[package]
-name = "lume"
-version = "3.0.0"
-description = "the communication app"
-authors = ["Ren Amamiya"]
-license = "GPL-3.0"
-repository = "https://github.com/lumehq/lume"
-edition = "2021"
+name = "lume"
+version = "3.0.0"
+description = "nostr client"
+authors = ["npub1zfss807aer0j26mwp2la0ume0jqde3823rmu97ra6sgyyg956e0s6xw445"]
+repository = "https://github.com/lumehq/lume"
+edition = "2021"
rust-version = "1.70"
[build-dependencies]
-tauri-build = { version = "2.0.0-alpha", features = [] }
+tauri-build = { version = "2.0.0-beta", features = [] }
[dependencies]
-serde_json = "1.0"
-serde = { version = "1.0", features = ["derive"] }
-tauri = { version = "2.0.0-alpha", features = [ "tray-icon",
- "macos-private-api",
- "native-tls-vendored",
- "protocol-asset",
-] }
-tauri-plugin-cli = "2.0.0-alpha"
-tauri-plugin-clipboard-manager = "2.0.0-alpha"
-tauri-plugin-dialog = "2.0.0-alpha"
-tauri-plugin-fs = "2.0.0-alpha"
-tauri-plugin-http = "2.0.0-alpha"
-tauri-plugin-notification = "2.0.0-alpha"
-tauri-plugin-os = "2.0.0-alpha"
-tauri-plugin-process = "2.0.0-alpha"
-tauri-plugin-shell = "2.0.0-alpha"
-tauri-plugin-updater = "2.0.0-alpha"
-tauri-plugin-autostart = "2.0.0-alpha"
-tauri-plugin-store = "2.0.0-alpha"
-tauri-plugin-upload = "2.0.0-alpha"
-tauri-plugin-window-state = "2.0.0-alpha"
-tauri-plugin-theme = { git = "https://github.com/wyhaya/tauri-plugin-theme" }
-tauri-plugin-sql = {version="2.0.0-alpha", features = [
- "sqlite",
-] }
-sqlx-cli = { version = "0.7.0", default-features = false, features = [
- "sqlite",
-] }
-webpage = { version = "2.0", features = ["serde"] }
-
-[target.'cfg(not(target_os = "linux"))'.dependencies]
-keyring = "2"
-
-[target.'cfg(target_os = "linux")'.dependencies]
-keyring = { version = "2", default_features = false, features = ["linux-secret-service"] }
+nostr-sdk = { version = "0.28", features = ["sqlite"] }
+tokio = { version = "1", features = ["full"] }
+serde_json = "1.0"
+serde = { version = "1.0", features = ["derive"] }
+tauri = { version = "2.0.0-beta", features = ["tray-icon", "macos-private-api", "native-tls-vendored", "protocol-asset"] }
+tauri-plugin-cli = "2.0.0-beta"
+tauri-plugin-clipboard-manager = "2.0.0-beta"
+tauri-plugin-dialog = "2.0.0-beta"
+tauri-plugin-fs = "2.0.0-beta"
+tauri-plugin-http = "2.0.0-beta"
+tauri-plugin-notification = "2.0.0-beta"
+tauri-plugin-os = "2.0.0-beta"
+tauri-plugin-process = "2.0.0-beta"
+tauri-plugin-shell = "2.0.0-beta"
+tauri-plugin-updater = "2.0.0-beta"
+tauri-plugin-autostart = "2.0.0-beta"
+tauri-plugin-store = "2.0.0-beta"
+tauri-plugin-upload = "2.0.0-beta"
+tauri-plugin-window-state = "2.0.0-beta"
+webpage = { version = "2.0", features = ["serde"] }
+keyring = "2"
+age = "0.10.0"
[features]
# by default Tauri runs in production mode
@@ -56,11 +42,14 @@ default = ["custom-protocol"]
# DO NOT remove this
custom-protocol = ["tauri/custom-protocol"]
-# Optimized for bundle size. If you want faster builds comment out/delete this section.
[profile.release]
-lto = true # Enable Link Time Optimization
-opt-level = "z" # Optimize for size.
-codegen-units = 1 # Reduce number of codegen units to increase optimizations.
-panic = "abort" # Abort on panic
-strip = true # Automatically strip symbols from the binary.
-debug = false
+codegen-units = 1
+lto = true
+panic = "abort"
+incremental = false
+opt-level = "z"
+strip = true
+rpath = false
+debug = false
+debug-assertions = false
+overflow-checks = false
diff --git a/src-tauri/capabilities/main.json b/src-tauri/capabilities/main.json
new file mode 100644
index 00000000..ac6f984e
--- /dev/null
+++ b/src-tauri/capabilities/main.json
@@ -0,0 +1,59 @@
+{
+ "$schema": "../gen/schemas/desktop-schema.json",
+ "identifier": "desktop-capability",
+ "description": "Capability for the desktop",
+ "platforms": ["linux", "macOS", "windows"],
+ "windows": [
+ "main",
+ "splash",
+ "editor",
+ "settings",
+ "event-*",
+ "user-*",
+ "column-*"
+ ],
+ "permissions": [
+ "path:default",
+ "event:default",
+ "window:default",
+ "app:default",
+ "resources:default",
+ "menu:default",
+ "tray:default",
+ "notification:allow-is-permission-granted",
+ "notification:allow-request-permission",
+ "notification:default",
+ "os:allow-locale",
+ "os:allow-platform",
+ "updater:allow-check",
+ "updater:default",
+ "window:allow-start-dragging",
+ "store:allow-get",
+ "clipboard-manager:allow-write",
+ "clipboard-manager:allow-read",
+ "webview:allow-create-webview-window",
+ "webview:allow-create-webview",
+ "dialog:allow-open",
+ "fs:allow-read-file",
+ "shell:allow-open",
+ {
+ "identifier": "http:default",
+ "allow": [
+ {
+ "url": "http://**/"
+ },
+ {
+ "url": "https://**/"
+ }
+ ]
+ },
+ {
+ "identifier": "fs:allow-read-text-file",
+ "allow": [
+ {
+ "path": "$RESOURCE/locales/*"
+ }
+ ]
+ }
+ ]
+}
diff --git a/src-tauri/gen/schemas/acl-manifests.json b/src-tauri/gen/schemas/acl-manifests.json
new file mode 100644
index 00000000..d07dae63
--- /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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]},"platforms":["linux","macOS","windows","android","iOS"]}},"permission_sets":{},"global_scope_schema":null},"autostart":{"default_permission":null,"permissions":{"allow-disable":{"identifier":"allow-disable","description":"Enables the disable command without any pre-configured scope.","commands":{"allow":["disable"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-enable":{"identifier":"allow-enable","description":"Enables the enable command without any pre-configured scope.","commands":{"allow":["enable"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-disable":{"identifier":"deny-disable","description":"Denies the disable command without any pre-configured scope.","commands":{"allow":[],"deny":["disable"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-enable":{"identifier":"deny-enable","description":"Denies the enable command without any pre-configured scope.","commands":{"allow":[],"deny":["enable"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]},"platforms":["linux","macOS","windows","android","iOS"]}},"permission_sets":{},"global_scope_schema":null},"cli":{"default_permission":{"identifier":"default","description":"Allows reading the CLI matches","permissions":["allow-cli-matches"]},"permissions":{"allow-cli-matches":{"identifier":"allow-cli-matches","description":"Enables the cli_matches command without any pre-configured scope.","commands":{"allow":["cli_matches"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-cli-matches":{"identifier":"deny-cli-matches","description":"Denies the cli_matches command without any pre-configured scope.","commands":{"allow":[],"deny":["cli_matches"]},"platforms":["linux","macOS","windows","android","iOS"]}},"permission_sets":{},"global_scope_schema":null},"clipboard-manager":{"default_permission":null,"permissions":{"allow-read":{"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-write":{"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-read":{"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-write":{"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope.","commands":{"allow":["confirm"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope.","commands":{"allow":[],"deny":["ask"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope.","commands":{"allow":[],"deny":["confirm"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-exists":{"identifier":"allow-exists","description":"Enables the exists command without any pre-configured scope.","commands":{"allow":["exists"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-fstat":{"identifier":"allow-fstat","description":"Enables the fstat command without any pre-configured scope.","commands":{"allow":["fstat"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-ftruncate":{"identifier":"allow-ftruncate","description":"Enables the ftruncate command without any pre-configured scope.","commands":{"allow":["ftruncate"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-lstat":{"identifier":"allow-lstat","description":"Enables the lstat command without any pre-configured scope.","commands":{"allow":["lstat"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-mkdir":{"identifier":"allow-mkdir","description":"Enables the mkdir command without any pre-configured scope.","commands":{"allow":["mkdir"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-read":{"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-read-dir":{"identifier":"allow-read-dir","description":"Enables the read_dir command without any pre-configured scope.","commands":{"allow":["read_dir"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-read-file":{"identifier":"allow-read-file","description":"Enables the read_file command without any pre-configured scope.","commands":{"allow":["read_file"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-rename":{"identifier":"allow-rename","description":"Enables the rename command without any pre-configured scope.","commands":{"allow":["rename"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-seek":{"identifier":"allow-seek","description":"Enables the seek command without any pre-configured scope.","commands":{"allow":["seek"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-stat":{"identifier":"allow-stat","description":"Enables the stat command without any pre-configured scope.","commands":{"allow":["stat"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-truncate":{"identifier":"allow-truncate","description":"Enables the truncate command without any pre-configured scope.","commands":{"allow":["truncate"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-unwatch":{"identifier":"allow-unwatch","description":"Enables the unwatch command without any pre-configured scope.","commands":{"allow":["unwatch"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-watch":{"identifier":"allow-watch","description":"Enables the watch command without any pre-configured scope.","commands":{"allow":["watch"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-write":{"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-write-file":{"identifier":"allow-write-file","description":"Enables the write_file command without any pre-configured scope.","commands":{"allow":["write_file"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-copy-file":{"identifier":"deny-copy-file","description":"Denies the copy_file command without any pre-configured scope.","commands":{"allow":[],"deny":["copy_file"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-exists":{"identifier":"deny-exists","description":"Denies the exists command without any pre-configured scope.","commands":{"allow":[],"deny":["exists"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-fstat":{"identifier":"deny-fstat","description":"Denies the fstat command without any pre-configured scope.","commands":{"allow":[],"deny":["fstat"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-ftruncate":{"identifier":"deny-ftruncate","description":"Denies the ftruncate command without any pre-configured scope.","commands":{"allow":[],"deny":["ftruncate"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-lstat":{"identifier":"deny-lstat","description":"Denies the lstat command without any pre-configured scope.","commands":{"allow":[],"deny":["lstat"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-mkdir":{"identifier":"deny-mkdir","description":"Denies the mkdir command without any pre-configured scope.","commands":{"allow":[],"deny":["mkdir"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-read":{"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-read-dir":{"identifier":"deny-read-dir","description":"Denies the read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["read_dir"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-read-file":{"identifier":"deny-read-file","description":"Denies the read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-rename":{"identifier":"deny-rename","description":"Denies the rename command without any pre-configured scope.","commands":{"allow":[],"deny":["rename"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-seek":{"identifier":"deny-seek","description":"Denies the seek command without any pre-configured scope.","commands":{"allow":[],"deny":["seek"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-stat":{"identifier":"deny-stat","description":"Denies the stat command without any pre-configured scope.","commands":{"allow":[],"deny":["stat"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-truncate":{"identifier":"deny-truncate","description":"Denies the truncate command without any pre-configured scope.","commands":{"allow":[],"deny":["truncate"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-unwatch":{"identifier":"deny-unwatch","description":"Denies the unwatch command without any pre-configured scope.","commands":{"allow":[],"deny":["unwatch"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-watch":{"identifier":"deny-watch","description":"Denies the watch command without any pre-configured scope.","commands":{"allow":[],"deny":["watch"]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-write":{"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-write-file":{"identifier":"deny-write-file","description":"Denies the write_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_file"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"scope":{"identifier":"scope","description":"An empty permission you can use to modify the global scope.","commands":{"allow":[],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/*"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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/**"}]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]}},"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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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#","properties":{"path":{"type":"string"}},"required":["path"],"title":"Entry","type":"object"}},"http":{"default_permission":{"identifier":"default","description":"Allows all fetch operations","permissions":["allow-fetch","allow-fetch-cancel","allow-fetch-read-body","allow-fetch-send"]},"permissions":{"allow-fetch":{"identifier":"allow-fetch","description":"Enables the fetch command without any pre-configured scope.","commands":{"allow":["fetch"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-fetch-cancel":{"identifier":"allow-fetch-cancel","description":"Enables the fetch_cancel command without any pre-configured scope.","commands":{"allow":["fetch_cancel"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-fetch-read-body":{"identifier":"allow-fetch-read-body","description":"Enables the fetch_read_body command without any pre-configured scope.","commands":{"allow":["fetch_read_body"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-fetch-send":{"identifier":"allow-fetch-send","description":"Enables the fetch_send command without any pre-configured scope.","commands":{"allow":["fetch_send"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-fetch":{"identifier":"deny-fetch","description":"Denies the fetch command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-fetch-cancel":{"identifier":"deny-fetch-cancel","description":"Denies the fetch_cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_cancel"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-fetch-read-body":{"identifier":"deny-fetch-read-body","description":"Denies the fetch_read_body command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_read_body"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-fetch-send":{"identifier":"deny-fetch-send","description":"Denies the fetch_send command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_send"]},"platforms":["linux","macOS","windows","android","iOS"]}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"HTTP scope entry object definition.","properties":{"url":{"description":"A URL that can be accessed by the webview when using the HTTP APIs. The scoped URL is matched against the request URL using a glob pattern.\n\nExamples:\n\n- \"https://*\" or \"https://**\" : allows all HTTPS urls\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"}},"required":["url"],"title":"ScopeEntry","type":"object"}},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]},"platforms":["linux","macOS","windows","android","iOS"]}},"permission_sets":{},"global_scope_schema":null},"notification":{"default_permission":{"identifier":"default","description":"Allows requesting permission, checking permission state and sending notifications","permissions":["allow-is-permission-granted","allow-request-permission","allow-notify"]},"permissions":{"allow-is-permission-granted":{"identifier":"allow-is-permission-granted","description":"Enables the is_permission_granted command without any pre-configured scope.","commands":{"allow":["is_permission_granted"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-notify":{"identifier":"allow-notify","description":"Enables the notify command without any pre-configured scope.","commands":{"allow":["notify"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-request-permission":{"identifier":"allow-request-permission","description":"Enables the request_permission command without any pre-configured scope.","commands":{"allow":["request_permission"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-permission-granted":{"identifier":"deny-is-permission-granted","description":"Denies the is_permission_granted command without any pre-configured scope.","commands":{"allow":[],"deny":["is_permission_granted"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-notify":{"identifier":"deny-notify","description":"Denies the notify command without any pre-configured scope.","commands":{"allow":[],"deny":["notify"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-request-permission":{"identifier":"deny-request-permission","description":"Denies the request_permission command without any pre-configured scope.","commands":{"allow":[],"deny":["request_permission"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-exe-extension":{"identifier":"allow-exe-extension","description":"Enables the exe_extension command without any pre-configured scope.","commands":{"allow":["exe_extension"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-family":{"identifier":"allow-family","description":"Enables the family command without any pre-configured scope.","commands":{"allow":["family"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-hostname":{"identifier":"allow-hostname","description":"Enables the hostname command without any pre-configured scope.","commands":{"allow":["hostname"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-locale":{"identifier":"allow-locale","description":"Enables the locale command without any pre-configured scope.","commands":{"allow":["locale"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-os-type":{"identifier":"allow-os-type","description":"Enables the os_type command without any pre-configured scope.","commands":{"allow":["os_type"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-platform":{"identifier":"allow-platform","description":"Enables the platform command without any pre-configured scope.","commands":{"allow":["platform"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-arch":{"identifier":"deny-arch","description":"Denies the arch command without any pre-configured scope.","commands":{"allow":[],"deny":["arch"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-exe-extension":{"identifier":"deny-exe-extension","description":"Denies the exe_extension command without any pre-configured scope.","commands":{"allow":[],"deny":["exe_extension"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-family":{"identifier":"deny-family","description":"Denies the family command without any pre-configured scope.","commands":{"allow":[],"deny":["family"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-hostname":{"identifier":"deny-hostname","description":"Denies the hostname command without any pre-configured scope.","commands":{"allow":[],"deny":["hostname"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-locale":{"identifier":"deny-locale","description":"Denies the locale command without any pre-configured scope.","commands":{"allow":[],"deny":["locale"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-os-type":{"identifier":"deny-os-type","description":"Denies the os_type command without any pre-configured scope.","commands":{"allow":[],"deny":["os_type"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-platform":{"identifier":"deny-platform","description":"Denies the platform command without any pre-configured scope.","commands":{"allow":[],"deny":["platform"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]},"platforms":["linux","macOS","windows","android","iOS"]}},"permission_sets":{},"global_scope_schema":null},"process":{"default_permission":null,"permissions":{"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-restart":{"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-restart":{"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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."},"command":{"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","command","name","sidecar"],"title":"Entry","type":"object"}},"store":{"default_permission":null,"permissions":{"allow-clear":{"identifier":"allow-clear","description":"Enables the clear command without any pre-configured scope.","commands":{"allow":["clear"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-delete":{"identifier":"allow-delete","description":"Enables the delete command without any pre-configured scope.","commands":{"allow":["delete"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-entries":{"identifier":"allow-entries","description":"Enables the entries command without any pre-configured scope.","commands":{"allow":["entries"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-has":{"identifier":"allow-has","description":"Enables the has command without any pre-configured scope.","commands":{"allow":["has"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-keys":{"identifier":"allow-keys","description":"Enables the keys command without any pre-configured scope.","commands":{"allow":["keys"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-length":{"identifier":"allow-length","description":"Enables the length command without any pre-configured scope.","commands":{"allow":["length"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-load":{"identifier":"allow-load","description":"Enables the load command without any pre-configured scope.","commands":{"allow":["load"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-reset":{"identifier":"allow-reset","description":"Enables the reset command without any pre-configured scope.","commands":{"allow":["reset"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set":{"identifier":"allow-set","description":"Enables the set command without any pre-configured scope.","commands":{"allow":["set"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-values":{"identifier":"allow-values","description":"Enables the values command without any pre-configured scope.","commands":{"allow":["values"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-clear":{"identifier":"deny-clear","description":"Denies the clear command without any pre-configured scope.","commands":{"allow":[],"deny":["clear"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-delete":{"identifier":"deny-delete","description":"Denies the delete command without any pre-configured scope.","commands":{"allow":[],"deny":["delete"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-entries":{"identifier":"deny-entries","description":"Denies the entries command without any pre-configured scope.","commands":{"allow":[],"deny":["entries"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-has":{"identifier":"deny-has","description":"Denies the has command without any pre-configured scope.","commands":{"allow":[],"deny":["has"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-keys":{"identifier":"deny-keys","description":"Denies the keys command without any pre-configured scope.","commands":{"allow":[],"deny":["keys"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-length":{"identifier":"deny-length","description":"Denies the length command without any pre-configured scope.","commands":{"allow":[],"deny":["length"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-load":{"identifier":"deny-load","description":"Denies the load command without any pre-configured scope.","commands":{"allow":[],"deny":["load"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-reset":{"identifier":"deny-reset","description":"Denies the reset command without any pre-configured scope.","commands":{"allow":[],"deny":["reset"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set":{"identifier":"deny-set","description":"Denies the set command without any pre-configured scope.","commands":{"allow":[],"deny":["set"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-values":{"identifier":"deny-values","description":"Denies the values command without any pre-configured scope.","commands":{"allow":[],"deny":["values"]},"platforms":["linux","macOS","windows","android","iOS"]}},"permission_sets":{},"global_scope_schema":null},"tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":[]},"permissions":{"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-check":{"identifier":"deny-check","description":"Denies the check command without any pre-configured scope.","commands":{"allow":[],"deny":["check"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]}},"permission_sets":{},"global_scope_schema":null},"upload":{"default_permission":null,"permissions":{"allow-download":{"identifier":"allow-download","description":"Enables the download command without any pre-configured scope.","commands":{"allow":["download"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-upload":{"identifier":"allow-upload","description":"Enables the upload command without any pre-configured scope.","commands":{"allow":["upload"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-download":{"identifier":"deny-download","description":"Denies the download command without any pre-configured scope.","commands":{"allow":[],"deny":["download"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-upload":{"identifier":"deny-upload","description":"Denies the upload command without any pre-configured scope.","commands":{"allow":[],"deny":["upload"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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-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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]},"platforms":["linux","macOS","windows","android","iOS"]}},"permission_sets":{},"global_scope_schema":null},"window-state":{"default_permission":null,"permissions":{"allow-restore-window-state":{"identifier":"allow-restore-window-state","description":"Enables the restore_window_state command without any pre-configured scope.","commands":{"allow":["restore_window_state"],"deny":[]},"platforms":["linux","macOS","windows","android","iOS"]},"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":[]},"platforms":["linux","macOS","windows","android","iOS"]},"deny-restore-window-state":{"identifier":"deny-restore-window-state","description":"Denies the restore_window_state command without any pre-configured scope.","commands":{"allow":[],"deny":["restore_window_state"]},"platforms":["linux","macOS","windows","android","iOS"]},"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"]},"platforms":["linux","macOS","windows","android","iOS"]}},"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..a9eaf54c
--- /dev/null
+++ b/src-tauri/gen/schemas/capabilities.json
@@ -0,0 +1 @@
+{"desktop-capability":{"identifier":"desktop-capability","description":"Capability for the desktop","local":true,"windows":["main","splash","editor","settings","event-*","user-*","column-*"],"permissions":["path:default","event:default","window:default","app:default","resources:default","menu:default","tray:default","notification:allow-is-permission-granted","notification:allow-request-permission","notification:default","os:allow-locale","os:allow-platform","updater:allow-check","updater:default","window:allow-start-dragging","store:allow-get","clipboard-manager:allow-write","clipboard-manager:allow-read","webview:allow-create-webview-window","webview:allow-create-webview","dialog:allow-open","fs:allow-read-file","shell:allow-open",{"identifier":"http:default","allow":[{"url":"http://**/"},{"url":"https://**/"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"$RESOURCE/locales/*"}]}],"platforms":["linux","macOS","windows"]}}
\ 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..c0b4b0ee
--- /dev/null
+++ b/src-tauri/gen/schemas/desktop-schema.json
@@ -0,0 +1,7001 @@
+{
+ "$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": "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",
+ "windows"
+ ],
+ "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.",
+ "default": [
+ "linux",
+ "macOS",
+ "windows",
+ "android",
+ "iOS"
+ ],
+ "type": "array",
+ "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. Can use glob patterns.",
+ "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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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": "Entry",
+ "type": "object",
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "deny": {
+ "items": {
+ "title": "Entry",
+ "type": "object",
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "identifier"
+ ],
+ "properties": {
+ "identifier": {
+ "oneOf": [
+ {
+ "description": "http:default -> Allows all fetch operations",
+ "type": "string",
+ "enum": [
+ "http:default"
+ ]
+ },
+ {
+ "description": "http:allow-fetch -> Enables the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-cancel -> Enables the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-read-body -> Enables the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-send -> Enables the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-send"
+ ]
+ },
+ {
+ "description": "http:deny-fetch -> Denies the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-cancel -> Denies the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-read-body -> Denies the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-send -> Denies the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-send"
+ ]
+ }
+ ]
+ },
+ "allow": {
+ "items": {
+ "title": "ScopeEntry",
+ "description": "HTTP scope entry object definition.",
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "url": {
+ "description": "A URL that can be accessed by the webview when using the HTTP APIs. The scoped URL is matched against the request URL using a glob pattern.\n\nExamples:\n\n- \"https://*\" or \"https://**\" : allows all HTTPS urls\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "deny": {
+ "items": {
+ "title": "ScopeEntry",
+ "description": "HTTP scope entry object definition.",
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "url": {
+ "description": "A URL that can be accessed by the webview when using the HTTP APIs. The scoped URL is matched against the request URL using a glob pattern.\n\nExamples:\n\n- \"https://*\" or \"https://**\" : allows all HTTPS urls\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "identifier"
+ ],
+ "properties": {
+ "identifier": {
+ "oneOf": [
+ {
+ "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",
+ "command",
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellAllowedArgs"
+ }
+ ]
+ },
+ "command": {
+ "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",
+ "command",
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellAllowedArgs"
+ }
+ ]
+ },
+ "command": {
+ "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+ "type": "string"
+ },
+ "name": {
+ "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+ "type": "string"
+ },
+ "sidecar": {
+ "description": "If this command is a sidecar command.",
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "Identifier": {
+ "oneOf": [
+ {
+ "description": "app:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "app:default"
+ ]
+ },
+ {
+ "description": "app:allow-app-hide -> Enables the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-app-hide"
+ ]
+ },
+ {
+ "description": "app:allow-app-show -> Enables the app_show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-app-show"
+ ]
+ },
+ {
+ "description": "app:allow-name -> Enables the name command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-name"
+ ]
+ },
+ {
+ "description": "app:allow-tauri-version -> Enables the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-tauri-version"
+ ]
+ },
+ {
+ "description": "app:allow-version -> Enables the version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-version"
+ ]
+ },
+ {
+ "description": "app:deny-app-hide -> Denies the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-app-hide"
+ ]
+ },
+ {
+ "description": "app:deny-app-show -> Denies the app_show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-app-show"
+ ]
+ },
+ {
+ "description": "app:deny-name -> Denies the name command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-name"
+ ]
+ },
+ {
+ "description": "app:deny-tauri-version -> Denies the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-tauri-version"
+ ]
+ },
+ {
+ "description": "app:deny-version -> Denies the version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-version"
+ ]
+ },
+ {
+ "description": "autostart:allow-disable -> Enables the disable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:allow-disable"
+ ]
+ },
+ {
+ "description": "autostart:allow-enable -> Enables the enable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:allow-enable"
+ ]
+ },
+ {
+ "description": "autostart:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:allow-is-enabled"
+ ]
+ },
+ {
+ "description": "autostart:deny-disable -> Denies the disable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:deny-disable"
+ ]
+ },
+ {
+ "description": "autostart:deny-enable -> Denies the enable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:deny-enable"
+ ]
+ },
+ {
+ "description": "autostart:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:deny-is-enabled"
+ ]
+ },
+ {
+ "description": "cli:default -> Allows reading the CLI matches",
+ "type": "string",
+ "enum": [
+ "cli:default"
+ ]
+ },
+ {
+ "description": "cli:allow-cli-matches -> Enables the cli_matches command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "cli:allow-cli-matches"
+ ]
+ },
+ {
+ "description": "cli:deny-cli-matches -> Denies the cli_matches command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "cli:deny-cli-matches"
+ ]
+ },
+ {
+ "description": "clipboard-manager:allow-read -> Enables the read command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:allow-read"
+ ]
+ },
+ {
+ "description": "clipboard-manager:allow-write -> Enables the write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:allow-write"
+ ]
+ },
+ {
+ "description": "clipboard-manager:deny-read -> Denies the read command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:deny-read"
+ ]
+ },
+ {
+ "description": "clipboard-manager:deny-write -> Denies the write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:deny-write"
+ ]
+ },
+ {
+ "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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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": "http:default -> Allows all fetch operations",
+ "type": "string",
+ "enum": [
+ "http:default"
+ ]
+ },
+ {
+ "description": "http:allow-fetch -> Enables the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-cancel -> Enables the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-read-body -> Enables the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-send -> Enables the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-send"
+ ]
+ },
+ {
+ "description": "http:deny-fetch -> Denies the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-cancel -> Denies the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-read-body -> Denies the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-send -> Denies the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-send"
+ ]
+ },
+ {
+ "description": "menu:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "menu:default"
+ ]
+ },
+ {
+ "description": "menu:allow-append -> Enables the append command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-append"
+ ]
+ },
+ {
+ "description": "menu:allow-create-default -> Enables the create_default command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-create-default"
+ ]
+ },
+ {
+ "description": "menu:allow-get -> Enables the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-get"
+ ]
+ },
+ {
+ "description": "menu:allow-insert -> Enables the insert command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-insert"
+ ]
+ },
+ {
+ "description": "menu:allow-is-checked -> Enables the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-is-checked"
+ ]
+ },
+ {
+ "description": "menu:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-is-enabled"
+ ]
+ },
+ {
+ "description": "menu:allow-items -> Enables the items command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-items"
+ ]
+ },
+ {
+ "description": "menu:allow-new -> Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-new"
+ ]
+ },
+ {
+ "description": "menu:allow-popup -> Enables the popup command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-popup"
+ ]
+ },
+ {
+ "description": "menu:allow-prepend -> Enables the prepend command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-prepend"
+ ]
+ },
+ {
+ "description": "menu:allow-remove -> Enables the remove command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-remove"
+ ]
+ },
+ {
+ "description": "menu:allow-remove-at -> Enables the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-remove-at"
+ ]
+ },
+ {
+ "description": "menu:allow-set-accelerator -> Enables the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-accelerator"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-app-menu -> Enables the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-app-menu"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-help-menu-for-nsapp -> Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-help-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-window-menu -> Enables the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-window-menu"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-windows-menu-for-nsapp -> Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-windows-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:allow-set-checked -> Enables the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-checked"
+ ]
+ },
+ {
+ "description": "menu:allow-set-enabled -> Enables the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-enabled"
+ ]
+ },
+ {
+ "description": "menu:allow-set-icon -> Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-icon"
+ ]
+ },
+ {
+ "description": "menu:allow-set-text -> Enables the set_text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-text"
+ ]
+ },
+ {
+ "description": "menu:allow-text -> Enables the text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-text"
+ ]
+ },
+ {
+ "description": "menu:deny-append -> Denies the append command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-append"
+ ]
+ },
+ {
+ "description": "menu:deny-create-default -> Denies the create_default command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-create-default"
+ ]
+ },
+ {
+ "description": "menu:deny-get -> Denies the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-get"
+ ]
+ },
+ {
+ "description": "menu:deny-insert -> Denies the insert command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-insert"
+ ]
+ },
+ {
+ "description": "menu:deny-is-checked -> Denies the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-is-checked"
+ ]
+ },
+ {
+ "description": "menu:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-is-enabled"
+ ]
+ },
+ {
+ "description": "menu:deny-items -> Denies the items command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-items"
+ ]
+ },
+ {
+ "description": "menu:deny-new -> Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-new"
+ ]
+ },
+ {
+ "description": "menu:deny-popup -> Denies the popup command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-popup"
+ ]
+ },
+ {
+ "description": "menu:deny-prepend -> Denies the prepend command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-prepend"
+ ]
+ },
+ {
+ "description": "menu:deny-remove -> Denies the remove command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-remove"
+ ]
+ },
+ {
+ "description": "menu:deny-remove-at -> Denies the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-remove-at"
+ ]
+ },
+ {
+ "description": "menu:deny-set-accelerator -> Denies the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-accelerator"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-app-menu -> Denies the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-app-menu"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-help-menu-for-nsapp -> Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-help-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-window-menu -> Denies the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-window-menu"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-windows-menu-for-nsapp -> Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-windows-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:deny-set-checked -> Denies the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-checked"
+ ]
+ },
+ {
+ "description": "menu:deny-set-enabled -> Denies the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-enabled"
+ ]
+ },
+ {
+ "description": "menu:deny-set-icon -> Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-icon"
+ ]
+ },
+ {
+ "description": "menu:deny-set-text -> Denies the set_text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-text"
+ ]
+ },
+ {
+ "description": "menu:deny-text -> Denies the text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-text"
+ ]
+ },
+ {
+ "description": "notification:default -> Allows requesting permission, checking permission state and sending notifications",
+ "type": "string",
+ "enum": [
+ "notification:default"
+ ]
+ },
+ {
+ "description": "notification:allow-is-permission-granted -> Enables the is_permission_granted command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-is-permission-granted"
+ ]
+ },
+ {
+ "description": "notification:allow-notify -> Enables the notify command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-notify"
+ ]
+ },
+ {
+ "description": "notification:allow-request-permission -> Enables the request_permission command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-request-permission"
+ ]
+ },
+ {
+ "description": "notification:deny-is-permission-granted -> Denies the is_permission_granted command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-is-permission-granted"
+ ]
+ },
+ {
+ "description": "notification:deny-notify -> Denies the notify command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-notify"
+ ]
+ },
+ {
+ "description": "notification:deny-request-permission -> Denies the request_permission command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-request-permission"
+ ]
+ },
+ {
+ "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": "process:allow-exit -> Enables the exit command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:allow-exit"
+ ]
+ },
+ {
+ "description": "process:allow-restart -> Enables the restart command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:allow-restart"
+ ]
+ },
+ {
+ "description": "process:deny-exit -> Denies the exit command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:deny-exit"
+ ]
+ },
+ {
+ "description": "process:deny-restart -> Denies the restart command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:deny-restart"
+ ]
+ },
+ {
+ "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"
+ ]
+ },
+ {
+ "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": "store:allow-clear -> Enables the clear command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-clear"
+ ]
+ },
+ {
+ "description": "store:allow-delete -> Enables the delete command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-delete"
+ ]
+ },
+ {
+ "description": "store:allow-entries -> Enables the entries command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-entries"
+ ]
+ },
+ {
+ "description": "store:allow-get -> Enables the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-get"
+ ]
+ },
+ {
+ "description": "store:allow-has -> Enables the has command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-has"
+ ]
+ },
+ {
+ "description": "store:allow-keys -> Enables the keys command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-keys"
+ ]
+ },
+ {
+ "description": "store:allow-length -> Enables the length command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-length"
+ ]
+ },
+ {
+ "description": "store:allow-load -> Enables the load command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-load"
+ ]
+ },
+ {
+ "description": "store:allow-reset -> Enables the reset command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-reset"
+ ]
+ },
+ {
+ "description": "store:allow-save -> Enables the save command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-save"
+ ]
+ },
+ {
+ "description": "store:allow-set -> Enables the set command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-set"
+ ]
+ },
+ {
+ "description": "store:allow-values -> Enables the values command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-values"
+ ]
+ },
+ {
+ "description": "store:deny-clear -> Denies the clear command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-clear"
+ ]
+ },
+ {
+ "description": "store:deny-delete -> Denies the delete command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-delete"
+ ]
+ },
+ {
+ "description": "store:deny-entries -> Denies the entries command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-entries"
+ ]
+ },
+ {
+ "description": "store:deny-get -> Denies the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-get"
+ ]
+ },
+ {
+ "description": "store:deny-has -> Denies the has command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-has"
+ ]
+ },
+ {
+ "description": "store:deny-keys -> Denies the keys command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-keys"
+ ]
+ },
+ {
+ "description": "store:deny-length -> Denies the length command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-length"
+ ]
+ },
+ {
+ "description": "store:deny-load -> Denies the load command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-load"
+ ]
+ },
+ {
+ "description": "store:deny-reset -> Denies the reset command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-reset"
+ ]
+ },
+ {
+ "description": "store:deny-save -> Denies the save command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-save"
+ ]
+ },
+ {
+ "description": "store:deny-set -> Denies the set command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-set"
+ ]
+ },
+ {
+ "description": "store:deny-values -> Denies the values command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-values"
+ ]
+ },
+ {
+ "description": "tray:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "tray:default"
+ ]
+ },
+ {
+ "description": "tray:allow-new -> Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-new"
+ ]
+ },
+ {
+ "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-new -> Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-new"
+ ]
+ },
+ {
+ "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": "upload:allow-download -> Enables the download command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:allow-download"
+ ]
+ },
+ {
+ "description": "upload:allow-upload -> Enables the upload command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:allow-upload"
+ ]
+ },
+ {
+ "description": "upload:deny-download -> Denies the download command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:deny-download"
+ ]
+ },
+ {
+ "description": "upload:deny-upload -> Denies the upload command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:deny-upload"
+ ]
+ },
+ {
+ "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-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-webview-close -> Denies the webview_close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-close"
+ ]
+ },
+ {
+ "description": "webview:deny-webview-position -> Denies the webview_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-position"
+ ]
+ },
+ {
+ "description": "webview:deny-webview-size -> Denies the webview_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-size"
+ ]
+ },
+ {
+ "description": "window:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "window:default"
+ ]
+ },
+ {
+ "description": "window:allow-available-monitors -> Enables the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-available-monitors"
+ ]
+ },
+ {
+ "description": "window:allow-center -> Enables the center command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-center"
+ ]
+ },
+ {
+ "description": "window:allow-close -> Enables the close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-close"
+ ]
+ },
+ {
+ "description": "window:allow-create -> Enables the create command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-create"
+ ]
+ },
+ {
+ "description": "window:allow-current-monitor -> Enables the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-current-monitor"
+ ]
+ },
+ {
+ "description": "window:allow-destroy -> Enables the destroy command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-destroy"
+ ]
+ },
+ {
+ "description": "window:allow-hide -> Enables the hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-hide"
+ ]
+ },
+ {
+ "description": "window:allow-inner-position -> Enables the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-inner-position"
+ ]
+ },
+ {
+ "description": "window:allow-inner-size -> Enables the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-inner-size"
+ ]
+ },
+ {
+ "description": "window:allow-internal-toggle-maximize -> Enables the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-internal-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-is-closable -> Enables the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-closable"
+ ]
+ },
+ {
+ "description": "window:allow-is-decorated -> Enables the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-decorated"
+ ]
+ },
+ {
+ "description": "window:allow-is-focused -> Enables the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-focused"
+ ]
+ },
+ {
+ "description": "window:allow-is-fullscreen -> Enables the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-fullscreen"
+ ]
+ },
+ {
+ "description": "window:allow-is-maximizable -> Enables the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-maximizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-maximized -> Enables the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-maximized"
+ ]
+ },
+ {
+ "description": "window:allow-is-minimizable -> Enables the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-minimizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-minimized -> Enables the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-minimized"
+ ]
+ },
+ {
+ "description": "window:allow-is-resizable -> Enables the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-resizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-visible -> Enables the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-visible"
+ ]
+ },
+ {
+ "description": "window:allow-maximize -> Enables the maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-minimize -> Enables the minimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-minimize"
+ ]
+ },
+ {
+ "description": "window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-outer-position"
+ ]
+ },
+ {
+ "description": "window:allow-outer-size -> Enables the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-outer-size"
+ ]
+ },
+ {
+ "description": "window:allow-primary-monitor -> Enables the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-primary-monitor"
+ ]
+ },
+ {
+ "description": "window:allow-request-user-attention -> Enables the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-request-user-attention"
+ ]
+ },
+ {
+ "description": "window:allow-scale-factor -> Enables the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-scale-factor"
+ ]
+ },
+ {
+ "description": "window:allow-set-always-on-bottom -> Enables the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-always-on-bottom"
+ ]
+ },
+ {
+ "description": "window:allow-set-always-on-top -> Enables the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-always-on-top"
+ ]
+ },
+ {
+ "description": "window:allow-set-closable -> Enables the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-closable"
+ ]
+ },
+ {
+ "description": "window:allow-set-content-protected -> Enables the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-content-protected"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-grab -> Enables the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-grab"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-icon -> Enables the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-icon"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-position -> Enables the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-position"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-visible -> Enables the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-visible"
+ ]
+ },
+ {
+ "description": "window:allow-set-decorations -> Enables the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-decorations"
+ ]
+ },
+ {
+ "description": "window:allow-set-effects -> Enables the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-effects"
+ ]
+ },
+ {
+ "description": "window:allow-set-focus -> Enables the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-focus"
+ ]
+ },
+ {
+ "description": "window:allow-set-fullscreen -> Enables the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-fullscreen"
+ ]
+ },
+ {
+ "description": "window:allow-set-icon -> Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-icon"
+ ]
+ },
+ {
+ "description": "window:allow-set-ignore-cursor-events -> Enables the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-ignore-cursor-events"
+ ]
+ },
+ {
+ "description": "window:allow-set-max-size -> Enables the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-max-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-maximizable -> Enables the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-maximizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-min-size -> Enables the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-min-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-minimizable -> Enables the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-minimizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-position -> Enables the set_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-position"
+ ]
+ },
+ {
+ "description": "window:allow-set-progress-bar -> Enables the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-progress-bar"
+ ]
+ },
+ {
+ "description": "window:allow-set-resizable -> Enables the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-resizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-shadow -> Enables the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-shadow"
+ ]
+ },
+ {
+ "description": "window:allow-set-size -> Enables the set_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-skip-taskbar -> Enables the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-skip-taskbar"
+ ]
+ },
+ {
+ "description": "window:allow-set-title -> Enables the set_title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-title"
+ ]
+ },
+ {
+ "description": "window:allow-set-visible-on-all-workspaces -> Enables the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-visible-on-all-workspaces"
+ ]
+ },
+ {
+ "description": "window:allow-show -> Enables the show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-show"
+ ]
+ },
+ {
+ "description": "window:allow-start-dragging -> Enables the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-start-dragging"
+ ]
+ },
+ {
+ "description": "window:allow-theme -> Enables the theme command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-theme"
+ ]
+ },
+ {
+ "description": "window:allow-title -> Enables the title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-title"
+ ]
+ },
+ {
+ "description": "window:allow-toggle-maximize -> Enables the toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-unmaximize -> Enables the unmaximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-unmaximize"
+ ]
+ },
+ {
+ "description": "window:allow-unminimize -> Enables the unminimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-unminimize"
+ ]
+ },
+ {
+ "description": "window:deny-available-monitors -> Denies the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-available-monitors"
+ ]
+ },
+ {
+ "description": "window:deny-center -> Denies the center command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-center"
+ ]
+ },
+ {
+ "description": "window:deny-close -> Denies the close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-close"
+ ]
+ },
+ {
+ "description": "window:deny-create -> Denies the create command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-create"
+ ]
+ },
+ {
+ "description": "window:deny-current-monitor -> Denies the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-current-monitor"
+ ]
+ },
+ {
+ "description": "window:deny-destroy -> Denies the destroy command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-destroy"
+ ]
+ },
+ {
+ "description": "window:deny-hide -> Denies the hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-hide"
+ ]
+ },
+ {
+ "description": "window:deny-inner-position -> Denies the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-inner-position"
+ ]
+ },
+ {
+ "description": "window:deny-inner-size -> Denies the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-inner-size"
+ ]
+ },
+ {
+ "description": "window:deny-internal-toggle-maximize -> Denies the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-internal-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:deny-is-closable -> Denies the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-closable"
+ ]
+ },
+ {
+ "description": "window:deny-is-decorated -> Denies the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-decorated"
+ ]
+ },
+ {
+ "description": "window:deny-is-focused -> Denies the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-focused"
+ ]
+ },
+ {
+ "description": "window:deny-is-fullscreen -> Denies the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-fullscreen"
+ ]
+ },
+ {
+ "description": "window:deny-is-maximizable -> Denies the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-maximizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-maximized -> Denies the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-maximized"
+ ]
+ },
+ {
+ "description": "window:deny-is-minimizable -> Denies the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-minimizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-minimized -> Denies the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-minimized"
+ ]
+ },
+ {
+ "description": "window:deny-is-resizable -> Denies the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-resizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-visible -> Denies the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-visible"
+ ]
+ },
+ {
+ "description": "window:deny-maximize -> Denies the maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-maximize"
+ ]
+ },
+ {
+ "description": "window:deny-minimize -> Denies the minimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-minimize"
+ ]
+ },
+ {
+ "description": "window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-outer-position"
+ ]
+ },
+ {
+ "description": "window:deny-outer-size -> Denies the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-outer-size"
+ ]
+ },
+ {
+ "description": "window:deny-primary-monitor -> Denies the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-primary-monitor"
+ ]
+ },
+ {
+ "description": "window:deny-request-user-attention -> Denies the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-request-user-attention"
+ ]
+ },
+ {
+ "description": "window:deny-scale-factor -> Denies the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-scale-factor"
+ ]
+ },
+ {
+ "description": "window:deny-set-always-on-bottom -> Denies the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-always-on-bottom"
+ ]
+ },
+ {
+ "description": "window:deny-set-always-on-top -> Denies the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-always-on-top"
+ ]
+ },
+ {
+ "description": "window:deny-set-closable -> Denies the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-closable"
+ ]
+ },
+ {
+ "description": "window:deny-set-content-protected -> Denies the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-content-protected"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-grab -> Denies the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-grab"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-icon -> Denies the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-icon"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-position -> Denies the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-position"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-visible -> Denies the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-visible"
+ ]
+ },
+ {
+ "description": "window:deny-set-decorations -> Denies the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-decorations"
+ ]
+ },
+ {
+ "description": "window:deny-set-effects -> Denies the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-effects"
+ ]
+ },
+ {
+ "description": "window:deny-set-focus -> Denies the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-focus"
+ ]
+ },
+ {
+ "description": "window:deny-set-fullscreen -> Denies the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-fullscreen"
+ ]
+ },
+ {
+ "description": "window:deny-set-icon -> Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-icon"
+ ]
+ },
+ {
+ "description": "window:deny-set-ignore-cursor-events -> Denies the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-ignore-cursor-events"
+ ]
+ },
+ {
+ "description": "window:deny-set-max-size -> Denies the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-max-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-maximizable -> Denies the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-maximizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-min-size -> Denies the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-min-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-minimizable -> Denies the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-minimizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-position -> Denies the set_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-position"
+ ]
+ },
+ {
+ "description": "window:deny-set-progress-bar -> Denies the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-progress-bar"
+ ]
+ },
+ {
+ "description": "window:deny-set-resizable -> Denies the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-resizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-shadow -> Denies the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-shadow"
+ ]
+ },
+ {
+ "description": "window:deny-set-size -> Denies the set_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-skip-taskbar -> Denies the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-skip-taskbar"
+ ]
+ },
+ {
+ "description": "window:deny-set-title -> Denies the set_title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-title"
+ ]
+ },
+ {
+ "description": "window:deny-set-visible-on-all-workspaces -> Denies the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-visible-on-all-workspaces"
+ ]
+ },
+ {
+ "description": "window:deny-show -> Denies the show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-show"
+ ]
+ },
+ {
+ "description": "window:deny-start-dragging -> Denies the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-start-dragging"
+ ]
+ },
+ {
+ "description": "window:deny-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"
+ ]
+ },
+ {
+ "description": "window-state:allow-restore-window-state -> Enables the restore_window_state command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window-state:allow-restore-window-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-restore-window-state -> Denies the restore_window_state command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window-state:deny-restore-window-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..c0b4b0ee
--- /dev/null
+++ b/src-tauri/gen/schemas/macOS-schema.json
@@ -0,0 +1,7001 @@
+{
+ "$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": "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",
+ "windows"
+ ],
+ "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.",
+ "default": [
+ "linux",
+ "macOS",
+ "windows",
+ "android",
+ "iOS"
+ ],
+ "type": "array",
+ "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. Can use glob patterns.",
+ "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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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": "Entry",
+ "type": "object",
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "deny": {
+ "items": {
+ "title": "Entry",
+ "type": "object",
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "identifier"
+ ],
+ "properties": {
+ "identifier": {
+ "oneOf": [
+ {
+ "description": "http:default -> Allows all fetch operations",
+ "type": "string",
+ "enum": [
+ "http:default"
+ ]
+ },
+ {
+ "description": "http:allow-fetch -> Enables the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-cancel -> Enables the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-read-body -> Enables the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-send -> Enables the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-send"
+ ]
+ },
+ {
+ "description": "http:deny-fetch -> Denies the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-cancel -> Denies the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-read-body -> Denies the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-send -> Denies the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-send"
+ ]
+ }
+ ]
+ },
+ "allow": {
+ "items": {
+ "title": "ScopeEntry",
+ "description": "HTTP scope entry object definition.",
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "url": {
+ "description": "A URL that can be accessed by the webview when using the HTTP APIs. The scoped URL is matched against the request URL using a glob pattern.\n\nExamples:\n\n- \"https://*\" or \"https://**\" : allows all HTTPS urls\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "deny": {
+ "items": {
+ "title": "ScopeEntry",
+ "description": "HTTP scope entry object definition.",
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "url": {
+ "description": "A URL that can be accessed by the webview when using the HTTP APIs. The scoped URL is matched against the request URL using a glob pattern.\n\nExamples:\n\n- \"https://*\" or \"https://**\" : allows all HTTPS urls\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "identifier"
+ ],
+ "properties": {
+ "identifier": {
+ "oneOf": [
+ {
+ "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",
+ "command",
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellAllowedArgs"
+ }
+ ]
+ },
+ "command": {
+ "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",
+ "command",
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellAllowedArgs"
+ }
+ ]
+ },
+ "command": {
+ "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+ "type": "string"
+ },
+ "name": {
+ "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+ "type": "string"
+ },
+ "sidecar": {
+ "description": "If this command is a sidecar command.",
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "Identifier": {
+ "oneOf": [
+ {
+ "description": "app:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "app:default"
+ ]
+ },
+ {
+ "description": "app:allow-app-hide -> Enables the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-app-hide"
+ ]
+ },
+ {
+ "description": "app:allow-app-show -> Enables the app_show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-app-show"
+ ]
+ },
+ {
+ "description": "app:allow-name -> Enables the name command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-name"
+ ]
+ },
+ {
+ "description": "app:allow-tauri-version -> Enables the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-tauri-version"
+ ]
+ },
+ {
+ "description": "app:allow-version -> Enables the version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-version"
+ ]
+ },
+ {
+ "description": "app:deny-app-hide -> Denies the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-app-hide"
+ ]
+ },
+ {
+ "description": "app:deny-app-show -> Denies the app_show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-app-show"
+ ]
+ },
+ {
+ "description": "app:deny-name -> Denies the name command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-name"
+ ]
+ },
+ {
+ "description": "app:deny-tauri-version -> Denies the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-tauri-version"
+ ]
+ },
+ {
+ "description": "app:deny-version -> Denies the version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-version"
+ ]
+ },
+ {
+ "description": "autostart:allow-disable -> Enables the disable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:allow-disable"
+ ]
+ },
+ {
+ "description": "autostart:allow-enable -> Enables the enable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:allow-enable"
+ ]
+ },
+ {
+ "description": "autostart:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:allow-is-enabled"
+ ]
+ },
+ {
+ "description": "autostart:deny-disable -> Denies the disable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:deny-disable"
+ ]
+ },
+ {
+ "description": "autostart:deny-enable -> Denies the enable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:deny-enable"
+ ]
+ },
+ {
+ "description": "autostart:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:deny-is-enabled"
+ ]
+ },
+ {
+ "description": "cli:default -> Allows reading the CLI matches",
+ "type": "string",
+ "enum": [
+ "cli:default"
+ ]
+ },
+ {
+ "description": "cli:allow-cli-matches -> Enables the cli_matches command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "cli:allow-cli-matches"
+ ]
+ },
+ {
+ "description": "cli:deny-cli-matches -> Denies the cli_matches command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "cli:deny-cli-matches"
+ ]
+ },
+ {
+ "description": "clipboard-manager:allow-read -> Enables the read command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:allow-read"
+ ]
+ },
+ {
+ "description": "clipboard-manager:allow-write -> Enables the write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:allow-write"
+ ]
+ },
+ {
+ "description": "clipboard-manager:deny-read -> Denies the read command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:deny-read"
+ ]
+ },
+ {
+ "description": "clipboard-manager:deny-write -> Denies the write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:deny-write"
+ ]
+ },
+ {
+ "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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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": "http:default -> Allows all fetch operations",
+ "type": "string",
+ "enum": [
+ "http:default"
+ ]
+ },
+ {
+ "description": "http:allow-fetch -> Enables the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-cancel -> Enables the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-read-body -> Enables the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-send -> Enables the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-send"
+ ]
+ },
+ {
+ "description": "http:deny-fetch -> Denies the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-cancel -> Denies the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-read-body -> Denies the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-send -> Denies the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-send"
+ ]
+ },
+ {
+ "description": "menu:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "menu:default"
+ ]
+ },
+ {
+ "description": "menu:allow-append -> Enables the append command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-append"
+ ]
+ },
+ {
+ "description": "menu:allow-create-default -> Enables the create_default command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-create-default"
+ ]
+ },
+ {
+ "description": "menu:allow-get -> Enables the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-get"
+ ]
+ },
+ {
+ "description": "menu:allow-insert -> Enables the insert command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-insert"
+ ]
+ },
+ {
+ "description": "menu:allow-is-checked -> Enables the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-is-checked"
+ ]
+ },
+ {
+ "description": "menu:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-is-enabled"
+ ]
+ },
+ {
+ "description": "menu:allow-items -> Enables the items command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-items"
+ ]
+ },
+ {
+ "description": "menu:allow-new -> Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-new"
+ ]
+ },
+ {
+ "description": "menu:allow-popup -> Enables the popup command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-popup"
+ ]
+ },
+ {
+ "description": "menu:allow-prepend -> Enables the prepend command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-prepend"
+ ]
+ },
+ {
+ "description": "menu:allow-remove -> Enables the remove command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-remove"
+ ]
+ },
+ {
+ "description": "menu:allow-remove-at -> Enables the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-remove-at"
+ ]
+ },
+ {
+ "description": "menu:allow-set-accelerator -> Enables the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-accelerator"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-app-menu -> Enables the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-app-menu"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-help-menu-for-nsapp -> Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-help-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-window-menu -> Enables the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-window-menu"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-windows-menu-for-nsapp -> Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-windows-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:allow-set-checked -> Enables the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-checked"
+ ]
+ },
+ {
+ "description": "menu:allow-set-enabled -> Enables the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-enabled"
+ ]
+ },
+ {
+ "description": "menu:allow-set-icon -> Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-icon"
+ ]
+ },
+ {
+ "description": "menu:allow-set-text -> Enables the set_text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-text"
+ ]
+ },
+ {
+ "description": "menu:allow-text -> Enables the text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-text"
+ ]
+ },
+ {
+ "description": "menu:deny-append -> Denies the append command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-append"
+ ]
+ },
+ {
+ "description": "menu:deny-create-default -> Denies the create_default command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-create-default"
+ ]
+ },
+ {
+ "description": "menu:deny-get -> Denies the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-get"
+ ]
+ },
+ {
+ "description": "menu:deny-insert -> Denies the insert command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-insert"
+ ]
+ },
+ {
+ "description": "menu:deny-is-checked -> Denies the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-is-checked"
+ ]
+ },
+ {
+ "description": "menu:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-is-enabled"
+ ]
+ },
+ {
+ "description": "menu:deny-items -> Denies the items command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-items"
+ ]
+ },
+ {
+ "description": "menu:deny-new -> Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-new"
+ ]
+ },
+ {
+ "description": "menu:deny-popup -> Denies the popup command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-popup"
+ ]
+ },
+ {
+ "description": "menu:deny-prepend -> Denies the prepend command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-prepend"
+ ]
+ },
+ {
+ "description": "menu:deny-remove -> Denies the remove command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-remove"
+ ]
+ },
+ {
+ "description": "menu:deny-remove-at -> Denies the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-remove-at"
+ ]
+ },
+ {
+ "description": "menu:deny-set-accelerator -> Denies the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-accelerator"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-app-menu -> Denies the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-app-menu"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-help-menu-for-nsapp -> Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-help-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-window-menu -> Denies the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-window-menu"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-windows-menu-for-nsapp -> Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-windows-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:deny-set-checked -> Denies the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-checked"
+ ]
+ },
+ {
+ "description": "menu:deny-set-enabled -> Denies the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-enabled"
+ ]
+ },
+ {
+ "description": "menu:deny-set-icon -> Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-icon"
+ ]
+ },
+ {
+ "description": "menu:deny-set-text -> Denies the set_text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-text"
+ ]
+ },
+ {
+ "description": "menu:deny-text -> Denies the text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-text"
+ ]
+ },
+ {
+ "description": "notification:default -> Allows requesting permission, checking permission state and sending notifications",
+ "type": "string",
+ "enum": [
+ "notification:default"
+ ]
+ },
+ {
+ "description": "notification:allow-is-permission-granted -> Enables the is_permission_granted command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-is-permission-granted"
+ ]
+ },
+ {
+ "description": "notification:allow-notify -> Enables the notify command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-notify"
+ ]
+ },
+ {
+ "description": "notification:allow-request-permission -> Enables the request_permission command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-request-permission"
+ ]
+ },
+ {
+ "description": "notification:deny-is-permission-granted -> Denies the is_permission_granted command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-is-permission-granted"
+ ]
+ },
+ {
+ "description": "notification:deny-notify -> Denies the notify command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-notify"
+ ]
+ },
+ {
+ "description": "notification:deny-request-permission -> Denies the request_permission command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-request-permission"
+ ]
+ },
+ {
+ "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": "process:allow-exit -> Enables the exit command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:allow-exit"
+ ]
+ },
+ {
+ "description": "process:allow-restart -> Enables the restart command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:allow-restart"
+ ]
+ },
+ {
+ "description": "process:deny-exit -> Denies the exit command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:deny-exit"
+ ]
+ },
+ {
+ "description": "process:deny-restart -> Denies the restart command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:deny-restart"
+ ]
+ },
+ {
+ "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"
+ ]
+ },
+ {
+ "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": "store:allow-clear -> Enables the clear command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-clear"
+ ]
+ },
+ {
+ "description": "store:allow-delete -> Enables the delete command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-delete"
+ ]
+ },
+ {
+ "description": "store:allow-entries -> Enables the entries command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-entries"
+ ]
+ },
+ {
+ "description": "store:allow-get -> Enables the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-get"
+ ]
+ },
+ {
+ "description": "store:allow-has -> Enables the has command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-has"
+ ]
+ },
+ {
+ "description": "store:allow-keys -> Enables the keys command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-keys"
+ ]
+ },
+ {
+ "description": "store:allow-length -> Enables the length command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-length"
+ ]
+ },
+ {
+ "description": "store:allow-load -> Enables the load command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-load"
+ ]
+ },
+ {
+ "description": "store:allow-reset -> Enables the reset command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-reset"
+ ]
+ },
+ {
+ "description": "store:allow-save -> Enables the save command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-save"
+ ]
+ },
+ {
+ "description": "store:allow-set -> Enables the set command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-set"
+ ]
+ },
+ {
+ "description": "store:allow-values -> Enables the values command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-values"
+ ]
+ },
+ {
+ "description": "store:deny-clear -> Denies the clear command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-clear"
+ ]
+ },
+ {
+ "description": "store:deny-delete -> Denies the delete command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-delete"
+ ]
+ },
+ {
+ "description": "store:deny-entries -> Denies the entries command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-entries"
+ ]
+ },
+ {
+ "description": "store:deny-get -> Denies the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-get"
+ ]
+ },
+ {
+ "description": "store:deny-has -> Denies the has command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-has"
+ ]
+ },
+ {
+ "description": "store:deny-keys -> Denies the keys command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-keys"
+ ]
+ },
+ {
+ "description": "store:deny-length -> Denies the length command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-length"
+ ]
+ },
+ {
+ "description": "store:deny-load -> Denies the load command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-load"
+ ]
+ },
+ {
+ "description": "store:deny-reset -> Denies the reset command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-reset"
+ ]
+ },
+ {
+ "description": "store:deny-save -> Denies the save command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-save"
+ ]
+ },
+ {
+ "description": "store:deny-set -> Denies the set command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-set"
+ ]
+ },
+ {
+ "description": "store:deny-values -> Denies the values command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-values"
+ ]
+ },
+ {
+ "description": "tray:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "tray:default"
+ ]
+ },
+ {
+ "description": "tray:allow-new -> Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-new"
+ ]
+ },
+ {
+ "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-new -> Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-new"
+ ]
+ },
+ {
+ "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": "upload:allow-download -> Enables the download command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:allow-download"
+ ]
+ },
+ {
+ "description": "upload:allow-upload -> Enables the upload command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:allow-upload"
+ ]
+ },
+ {
+ "description": "upload:deny-download -> Denies the download command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:deny-download"
+ ]
+ },
+ {
+ "description": "upload:deny-upload -> Denies the upload command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:deny-upload"
+ ]
+ },
+ {
+ "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-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-webview-close -> Denies the webview_close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-close"
+ ]
+ },
+ {
+ "description": "webview:deny-webview-position -> Denies the webview_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-position"
+ ]
+ },
+ {
+ "description": "webview:deny-webview-size -> Denies the webview_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-size"
+ ]
+ },
+ {
+ "description": "window:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "window:default"
+ ]
+ },
+ {
+ "description": "window:allow-available-monitors -> Enables the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-available-monitors"
+ ]
+ },
+ {
+ "description": "window:allow-center -> Enables the center command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-center"
+ ]
+ },
+ {
+ "description": "window:allow-close -> Enables the close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-close"
+ ]
+ },
+ {
+ "description": "window:allow-create -> Enables the create command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-create"
+ ]
+ },
+ {
+ "description": "window:allow-current-monitor -> Enables the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-current-monitor"
+ ]
+ },
+ {
+ "description": "window:allow-destroy -> Enables the destroy command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-destroy"
+ ]
+ },
+ {
+ "description": "window:allow-hide -> Enables the hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-hide"
+ ]
+ },
+ {
+ "description": "window:allow-inner-position -> Enables the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-inner-position"
+ ]
+ },
+ {
+ "description": "window:allow-inner-size -> Enables the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-inner-size"
+ ]
+ },
+ {
+ "description": "window:allow-internal-toggle-maximize -> Enables the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-internal-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-is-closable -> Enables the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-closable"
+ ]
+ },
+ {
+ "description": "window:allow-is-decorated -> Enables the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-decorated"
+ ]
+ },
+ {
+ "description": "window:allow-is-focused -> Enables the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-focused"
+ ]
+ },
+ {
+ "description": "window:allow-is-fullscreen -> Enables the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-fullscreen"
+ ]
+ },
+ {
+ "description": "window:allow-is-maximizable -> Enables the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-maximizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-maximized -> Enables the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-maximized"
+ ]
+ },
+ {
+ "description": "window:allow-is-minimizable -> Enables the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-minimizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-minimized -> Enables the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-minimized"
+ ]
+ },
+ {
+ "description": "window:allow-is-resizable -> Enables the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-resizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-visible -> Enables the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-visible"
+ ]
+ },
+ {
+ "description": "window:allow-maximize -> Enables the maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-minimize -> Enables the minimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-minimize"
+ ]
+ },
+ {
+ "description": "window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-outer-position"
+ ]
+ },
+ {
+ "description": "window:allow-outer-size -> Enables the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-outer-size"
+ ]
+ },
+ {
+ "description": "window:allow-primary-monitor -> Enables the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-primary-monitor"
+ ]
+ },
+ {
+ "description": "window:allow-request-user-attention -> Enables the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-request-user-attention"
+ ]
+ },
+ {
+ "description": "window:allow-scale-factor -> Enables the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-scale-factor"
+ ]
+ },
+ {
+ "description": "window:allow-set-always-on-bottom -> Enables the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-always-on-bottom"
+ ]
+ },
+ {
+ "description": "window:allow-set-always-on-top -> Enables the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-always-on-top"
+ ]
+ },
+ {
+ "description": "window:allow-set-closable -> Enables the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-closable"
+ ]
+ },
+ {
+ "description": "window:allow-set-content-protected -> Enables the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-content-protected"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-grab -> Enables the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-grab"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-icon -> Enables the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-icon"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-position -> Enables the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-position"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-visible -> Enables the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-visible"
+ ]
+ },
+ {
+ "description": "window:allow-set-decorations -> Enables the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-decorations"
+ ]
+ },
+ {
+ "description": "window:allow-set-effects -> Enables the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-effects"
+ ]
+ },
+ {
+ "description": "window:allow-set-focus -> Enables the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-focus"
+ ]
+ },
+ {
+ "description": "window:allow-set-fullscreen -> Enables the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-fullscreen"
+ ]
+ },
+ {
+ "description": "window:allow-set-icon -> Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-icon"
+ ]
+ },
+ {
+ "description": "window:allow-set-ignore-cursor-events -> Enables the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-ignore-cursor-events"
+ ]
+ },
+ {
+ "description": "window:allow-set-max-size -> Enables the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-max-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-maximizable -> Enables the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-maximizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-min-size -> Enables the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-min-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-minimizable -> Enables the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-minimizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-position -> Enables the set_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-position"
+ ]
+ },
+ {
+ "description": "window:allow-set-progress-bar -> Enables the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-progress-bar"
+ ]
+ },
+ {
+ "description": "window:allow-set-resizable -> Enables the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-resizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-shadow -> Enables the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-shadow"
+ ]
+ },
+ {
+ "description": "window:allow-set-size -> Enables the set_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-skip-taskbar -> Enables the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-skip-taskbar"
+ ]
+ },
+ {
+ "description": "window:allow-set-title -> Enables the set_title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-title"
+ ]
+ },
+ {
+ "description": "window:allow-set-visible-on-all-workspaces -> Enables the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-visible-on-all-workspaces"
+ ]
+ },
+ {
+ "description": "window:allow-show -> Enables the show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-show"
+ ]
+ },
+ {
+ "description": "window:allow-start-dragging -> Enables the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-start-dragging"
+ ]
+ },
+ {
+ "description": "window:allow-theme -> Enables the theme command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-theme"
+ ]
+ },
+ {
+ "description": "window:allow-title -> Enables the title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-title"
+ ]
+ },
+ {
+ "description": "window:allow-toggle-maximize -> Enables the toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-unmaximize -> Enables the unmaximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-unmaximize"
+ ]
+ },
+ {
+ "description": "window:allow-unminimize -> Enables the unminimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-unminimize"
+ ]
+ },
+ {
+ "description": "window:deny-available-monitors -> Denies the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-available-monitors"
+ ]
+ },
+ {
+ "description": "window:deny-center -> Denies the center command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-center"
+ ]
+ },
+ {
+ "description": "window:deny-close -> Denies the close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-close"
+ ]
+ },
+ {
+ "description": "window:deny-create -> Denies the create command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-create"
+ ]
+ },
+ {
+ "description": "window:deny-current-monitor -> Denies the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-current-monitor"
+ ]
+ },
+ {
+ "description": "window:deny-destroy -> Denies the destroy command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-destroy"
+ ]
+ },
+ {
+ "description": "window:deny-hide -> Denies the hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-hide"
+ ]
+ },
+ {
+ "description": "window:deny-inner-position -> Denies the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-inner-position"
+ ]
+ },
+ {
+ "description": "window:deny-inner-size -> Denies the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-inner-size"
+ ]
+ },
+ {
+ "description": "window:deny-internal-toggle-maximize -> Denies the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-internal-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:deny-is-closable -> Denies the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-closable"
+ ]
+ },
+ {
+ "description": "window:deny-is-decorated -> Denies the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-decorated"
+ ]
+ },
+ {
+ "description": "window:deny-is-focused -> Denies the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-focused"
+ ]
+ },
+ {
+ "description": "window:deny-is-fullscreen -> Denies the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-fullscreen"
+ ]
+ },
+ {
+ "description": "window:deny-is-maximizable -> Denies the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-maximizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-maximized -> Denies the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-maximized"
+ ]
+ },
+ {
+ "description": "window:deny-is-minimizable -> Denies the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-minimizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-minimized -> Denies the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-minimized"
+ ]
+ },
+ {
+ "description": "window:deny-is-resizable -> Denies the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-resizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-visible -> Denies the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-visible"
+ ]
+ },
+ {
+ "description": "window:deny-maximize -> Denies the maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-maximize"
+ ]
+ },
+ {
+ "description": "window:deny-minimize -> Denies the minimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-minimize"
+ ]
+ },
+ {
+ "description": "window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-outer-position"
+ ]
+ },
+ {
+ "description": "window:deny-outer-size -> Denies the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-outer-size"
+ ]
+ },
+ {
+ "description": "window:deny-primary-monitor -> Denies the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-primary-monitor"
+ ]
+ },
+ {
+ "description": "window:deny-request-user-attention -> Denies the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-request-user-attention"
+ ]
+ },
+ {
+ "description": "window:deny-scale-factor -> Denies the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-scale-factor"
+ ]
+ },
+ {
+ "description": "window:deny-set-always-on-bottom -> Denies the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-always-on-bottom"
+ ]
+ },
+ {
+ "description": "window:deny-set-always-on-top -> Denies the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-always-on-top"
+ ]
+ },
+ {
+ "description": "window:deny-set-closable -> Denies the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-closable"
+ ]
+ },
+ {
+ "description": "window:deny-set-content-protected -> Denies the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-content-protected"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-grab -> Denies the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-grab"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-icon -> Denies the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-icon"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-position -> Denies the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-position"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-visible -> Denies the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-visible"
+ ]
+ },
+ {
+ "description": "window:deny-set-decorations -> Denies the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-decorations"
+ ]
+ },
+ {
+ "description": "window:deny-set-effects -> Denies the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-effects"
+ ]
+ },
+ {
+ "description": "window:deny-set-focus -> Denies the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-focus"
+ ]
+ },
+ {
+ "description": "window:deny-set-fullscreen -> Denies the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-fullscreen"
+ ]
+ },
+ {
+ "description": "window:deny-set-icon -> Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-icon"
+ ]
+ },
+ {
+ "description": "window:deny-set-ignore-cursor-events -> Denies the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-ignore-cursor-events"
+ ]
+ },
+ {
+ "description": "window:deny-set-max-size -> Denies the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-max-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-maximizable -> Denies the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-maximizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-min-size -> Denies the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-min-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-minimizable -> Denies the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-minimizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-position -> Denies the set_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-position"
+ ]
+ },
+ {
+ "description": "window:deny-set-progress-bar -> Denies the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-progress-bar"
+ ]
+ },
+ {
+ "description": "window:deny-set-resizable -> Denies the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-resizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-shadow -> Denies the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-shadow"
+ ]
+ },
+ {
+ "description": "window:deny-set-size -> Denies the set_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-skip-taskbar -> Denies the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-skip-taskbar"
+ ]
+ },
+ {
+ "description": "window:deny-set-title -> Denies the set_title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-title"
+ ]
+ },
+ {
+ "description": "window:deny-set-visible-on-all-workspaces -> Denies the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-visible-on-all-workspaces"
+ ]
+ },
+ {
+ "description": "window:deny-show -> Denies the show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-show"
+ ]
+ },
+ {
+ "description": "window:deny-start-dragging -> Denies the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-start-dragging"
+ ]
+ },
+ {
+ "description": "window:deny-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"
+ ]
+ },
+ {
+ "description": "window-state:allow-restore-window-state -> Enables the restore_window_state command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window-state:allow-restore-window-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-restore-window-state -> Denies the restore_window_state command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window-state:deny-restore-window-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/plugin-manifests.json b/src-tauri/gen/schemas/plugin-manifests.json
new file mode 100644
index 00000000..bce9aa56
--- /dev/null
+++ b/src-tauri/gen/schemas/plugin-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":{"version":null,"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]},"scope":{}},"allow-app-show":{"version":null,"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]},"scope":{}},"allow-name":{"version":null,"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]},"scope":{}},"allow-tauri-version":{"version":null,"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]},"scope":{}},"allow-version":{"version":null,"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]},"scope":{}},"deny-app-hide":{"version":null,"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]},"scope":{}},"deny-app-show":{"version":null,"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]},"scope":{}},"deny-name":{"version":null,"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]},"scope":{}},"deny-tauri-version":{"version":null,"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]},"scope":{}},"deny-version":{"version":null,"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"autostart":{"default_permission":null,"permissions":{"allow-disable":{"version":null,"identifier":"allow-disable","description":"Enables the disable command without any pre-configured scope.","commands":{"allow":["disable"],"deny":[]},"scope":{}},"allow-enable":{"version":null,"identifier":"allow-enable","description":"Enables the enable command without any pre-configured scope.","commands":{"allow":["enable"],"deny":[]},"scope":{}},"allow-is-enabled":{"version":null,"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]},"scope":{}},"deny-disable":{"version":null,"identifier":"deny-disable","description":"Denies the disable command without any pre-configured scope.","commands":{"allow":[],"deny":["disable"]},"scope":{}},"deny-enable":{"version":null,"identifier":"deny-enable","description":"Denies the enable command without any pre-configured scope.","commands":{"allow":[],"deny":["enable"]},"scope":{}},"deny-is-enabled":{"version":null,"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"cli":{"default_permission":{"identifier":"default","description":"Allows reading the CLI matches","permissions":["allow-cli-matches"]},"permissions":{"allow-cli-matches":{"version":null,"identifier":"allow-cli-matches","description":"Enables the cli_matches command without any pre-configured scope.","commands":{"allow":["cli_matches"],"deny":[]},"scope":{}},"deny-cli-matches":{"version":null,"identifier":"deny-cli-matches","description":"Denies the cli_matches command without any pre-configured scope.","commands":{"allow":[],"deny":["cli_matches"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"clipboard-manager":{"default_permission":null,"permissions":{"allow-read":{"version":null,"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]},"scope":{}},"allow-write":{"version":null,"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]},"scope":{}},"deny-read":{"version":null,"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]},"scope":{}},"deny-write":{"version":null,"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"dialog":{"default_permission":null,"permissions":{"allow-ask":{"version":null,"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope.","commands":{"allow":["ask"],"deny":[]},"scope":{}},"allow-confirm":{"version":null,"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope.","commands":{"allow":["confirm"],"deny":[]},"scope":{}},"allow-message":{"version":null,"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]},"scope":{}},"allow-open":{"version":null,"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]},"scope":{}},"allow-save":{"version":null,"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]},"scope":{}},"deny-ask":{"version":null,"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope.","commands":{"allow":[],"deny":["ask"]},"scope":{}},"deny-confirm":{"version":null,"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope.","commands":{"allow":[],"deny":["confirm"]},"scope":{}},"deny-message":{"version":null,"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]},"scope":{}},"deny-open":{"version":null,"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]},"scope":{}},"deny-save":{"version":null,"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]},"scope":{}}},"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":{"version":null,"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]},"scope":{}},"allow-emit-to":{"version":null,"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]},"scope":{}},"allow-listen":{"version":null,"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]},"scope":{}},"allow-unlisten":{"version":null,"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]},"scope":{}},"deny-emit":{"version":null,"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]},"scope":{}},"deny-emit-to":{"version":null,"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]},"scope":{}},"deny-listen":{"version":null,"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]},"scope":{}},"deny-unlisten":{"version":null,"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]},"scope":{}}},"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":{"version":null,"identifier":"allow-copy-file","description":"Enables the copy_file command without any pre-configured scope.","commands":{"allow":["copy_file"],"deny":[]},"scope":{}},"allow-create":{"version":null,"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]},"scope":{}},"allow-exists":{"version":null,"identifier":"allow-exists","description":"Enables the exists command without any pre-configured scope.","commands":{"allow":["exists"],"deny":[]},"scope":{}},"allow-fstat":{"version":null,"identifier":"allow-fstat","description":"Enables the fstat command without any pre-configured scope.","commands":{"allow":["fstat"],"deny":[]},"scope":{}},"allow-ftruncate":{"version":null,"identifier":"allow-ftruncate","description":"Enables the ftruncate command without any pre-configured scope.","commands":{"allow":["ftruncate"],"deny":[]},"scope":{}},"allow-lstat":{"version":null,"identifier":"allow-lstat","description":"Enables the lstat command without any pre-configured scope.","commands":{"allow":["lstat"],"deny":[]},"scope":{}},"allow-mkdir":{"version":null,"identifier":"allow-mkdir","description":"Enables the mkdir command without any pre-configured scope.","commands":{"allow":["mkdir"],"deny":[]},"scope":{}},"allow-open":{"version":null,"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]},"scope":{}},"allow-read":{"version":null,"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]},"scope":{}},"allow-read-dir":{"version":null,"identifier":"allow-read-dir","description":"Enables the read_dir command without any pre-configured scope.","commands":{"allow":["read_dir"],"deny":[]},"scope":{}},"allow-read-file":{"version":null,"identifier":"allow-read-file","description":"Enables the read_file command without any pre-configured scope.","commands":{"allow":["read_file"],"deny":[]},"scope":{}},"allow-read-text-file":{"version":null,"identifier":"allow-read-text-file","description":"Enables the read_text_file command without any pre-configured scope.","commands":{"allow":["read_text_file"],"deny":[]},"scope":{}},"allow-read-text-file-lines":{"version":null,"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":[]},"scope":{}},"allow-read-text-file-lines-next":{"version":null,"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":[]},"scope":{}},"allow-remove":{"version":null,"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]},"scope":{}},"allow-rename":{"version":null,"identifier":"allow-rename","description":"Enables the rename command without any pre-configured scope.","commands":{"allow":["rename"],"deny":[]},"scope":{}},"allow-seek":{"version":null,"identifier":"allow-seek","description":"Enables the seek command without any pre-configured scope.","commands":{"allow":["seek"],"deny":[]},"scope":{}},"allow-stat":{"version":null,"identifier":"allow-stat","description":"Enables the stat command without any pre-configured scope.","commands":{"allow":["stat"],"deny":[]},"scope":{}},"allow-truncate":{"version":null,"identifier":"allow-truncate","description":"Enables the truncate command without any pre-configured scope.","commands":{"allow":["truncate"],"deny":[]},"scope":{}},"allow-unwatch":{"version":null,"identifier":"allow-unwatch","description":"Enables the unwatch command without any pre-configured scope.","commands":{"allow":["unwatch"],"deny":[]},"scope":{}},"allow-watch":{"version":null,"identifier":"allow-watch","description":"Enables the watch command without any pre-configured scope.","commands":{"allow":["watch"],"deny":[]},"scope":{}},"allow-write":{"version":null,"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]},"scope":{}},"allow-write-file":{"version":null,"identifier":"allow-write-file","description":"Enables the write_file command without any pre-configured scope.","commands":{"allow":["write_file"],"deny":[]},"scope":{}},"allow-write-text-file":{"version":null,"identifier":"allow-write-text-file","description":"Enables the write_text_file command without any pre-configured scope.","commands":{"allow":["write_text_file"],"deny":[]},"scope":{}},"deny-copy-file":{"version":null,"identifier":"deny-copy-file","description":"Denies the copy_file command without any pre-configured scope.","commands":{"allow":[],"deny":["copy_file"]},"scope":{}},"deny-create":{"version":null,"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]},"scope":{}},"deny-exists":{"version":null,"identifier":"deny-exists","description":"Denies the exists command without any pre-configured scope.","commands":{"allow":[],"deny":["exists"]},"scope":{}},"deny-fstat":{"version":null,"identifier":"deny-fstat","description":"Denies the fstat command without any pre-configured scope.","commands":{"allow":[],"deny":["fstat"]},"scope":{}},"deny-ftruncate":{"version":null,"identifier":"deny-ftruncate","description":"Denies the ftruncate command without any pre-configured scope.","commands":{"allow":[],"deny":["ftruncate"]},"scope":{}},"deny-lstat":{"version":null,"identifier":"deny-lstat","description":"Denies the lstat command without any pre-configured scope.","commands":{"allow":[],"deny":["lstat"]},"scope":{}},"deny-mkdir":{"version":null,"identifier":"deny-mkdir","description":"Denies the mkdir command without any pre-configured scope.","commands":{"allow":[],"deny":["mkdir"]},"scope":{}},"deny-open":{"version":null,"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]},"scope":{}},"deny-read":{"version":null,"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]},"scope":{}},"deny-read-dir":{"version":null,"identifier":"deny-read-dir","description":"Denies the read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["read_dir"]},"scope":{}},"deny-read-file":{"version":null,"identifier":"deny-read-file","description":"Denies the read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file"]},"scope":{}},"deny-read-text-file":{"version":null,"identifier":"deny-read-text-file","description":"Denies the read_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file"]},"scope":{}},"deny-read-text-file-lines":{"version":null,"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"]},"scope":{}},"deny-read-text-file-lines-next":{"version":null,"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"]},"scope":{}},"deny-remove":{"version":null,"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]},"scope":{}},"deny-rename":{"version":null,"identifier":"deny-rename","description":"Denies the rename command without any pre-configured scope.","commands":{"allow":[],"deny":["rename"]},"scope":{}},"deny-seek":{"version":null,"identifier":"deny-seek","description":"Denies the seek command without any pre-configured scope.","commands":{"allow":[],"deny":["seek"]},"scope":{}},"deny-stat":{"version":null,"identifier":"deny-stat","description":"Denies the stat command without any pre-configured scope.","commands":{"allow":[],"deny":["stat"]},"scope":{}},"deny-truncate":{"version":null,"identifier":"deny-truncate","description":"Denies the truncate command without any pre-configured scope.","commands":{"allow":[],"deny":["truncate"]},"scope":{}},"deny-unwatch":{"version":null,"identifier":"deny-unwatch","description":"Denies the unwatch command without any pre-configured scope.","commands":{"allow":[],"deny":["unwatch"]},"scope":{}},"deny-watch":{"version":null,"identifier":"deny-watch","description":"Denies the watch command without any pre-configured scope.","commands":{"allow":[],"deny":["watch"]},"scope":{}},"deny-webview-data-linux":{"version":null,"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":[]},"scope":{}},"deny-webview-data-windows":{"version":null,"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":[]},"scope":{}},"deny-write":{"version":null,"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]},"scope":{}},"deny-write-file":{"version":null,"identifier":"deny-write-file","description":"Denies the write_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_file"]},"scope":{}},"deny-write-text-file":{"version":null,"identifier":"deny-write-text-file","description":"Denies the write_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text_file"]},"scope":{}},"read-all":{"version":null,"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":[]},"scope":{}},"read-dirs":{"version":null,"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":[]},"scope":{}},"read-files":{"version":null,"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":[]},"scope":{}},"read-meta":{"version":null,"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":{}},"scope":{"version":null,"identifier":"scope","description":"An empty permission you can use to modify the global scope.","commands":{"allow":[],"deny":[]},"scope":{}},"scope-app":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":{"version":null,"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":[]},"scope":{}},"write-files":{"version":null,"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":[]},"scope":{}}},"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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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#","properties":{"path":{"type":"string"}},"required":["path"],"title":"Entry","type":"object"}},"http":{"default_permission":{"identifier":"default","description":"Allows all fetch operations","permissions":["allow-fetch","allow-fetch-cancel","allow-fetch-read-body","allow-fetch-send"]},"permissions":{"allow-fetch":{"version":null,"identifier":"allow-fetch","description":"Enables the fetch command without any pre-configured scope.","commands":{"allow":["fetch"],"deny":[]},"scope":{}},"allow-fetch-cancel":{"version":null,"identifier":"allow-fetch-cancel","description":"Enables the fetch_cancel command without any pre-configured scope.","commands":{"allow":["fetch_cancel"],"deny":[]},"scope":{}},"allow-fetch-read-body":{"version":null,"identifier":"allow-fetch-read-body","description":"Enables the fetch_read_body command without any pre-configured scope.","commands":{"allow":["fetch_read_body"],"deny":[]},"scope":{}},"allow-fetch-send":{"version":null,"identifier":"allow-fetch-send","description":"Enables the fetch_send command without any pre-configured scope.","commands":{"allow":["fetch_send"],"deny":[]},"scope":{}},"deny-fetch":{"version":null,"identifier":"deny-fetch","description":"Denies the fetch command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch"]},"scope":{}},"deny-fetch-cancel":{"version":null,"identifier":"deny-fetch-cancel","description":"Denies the fetch_cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_cancel"]},"scope":{}},"deny-fetch-read-body":{"version":null,"identifier":"deny-fetch-read-body","description":"Denies the fetch_read_body command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_read_body"]},"scope":{}},"deny-fetch-send":{"version":null,"identifier":"deny-fetch-send","description":"Denies the fetch_send command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_send"]},"scope":{}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"HTTP scope entry object definition.","properties":{"url":{"description":"A URL that can be accessed by the webview when using the HTTP APIs. The scoped URL is matched against the request URL using a glob pattern.\n\nExamples:\n\n- \"https://*\" or \"https://**\" : allows all HTTPS urls\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"}},"required":["url"],"title":"ScopeEntry","type":"object"}},"menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":[]},"permissions":{"allow-append":{"version":null,"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]},"scope":{}},"allow-create-default":{"version":null,"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]},"scope":{}},"allow-get":{"version":null,"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]},"scope":{}},"allow-insert":{"version":null,"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]},"scope":{}},"allow-is-checked":{"version":null,"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]},"scope":{}},"allow-is-enabled":{"version":null,"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]},"scope":{}},"allow-items":{"version":null,"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]},"scope":{}},"allow-new":{"version":null,"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]},"scope":{}},"allow-popup":{"version":null,"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]},"scope":{}},"allow-prepend":{"version":null,"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]},"scope":{}},"allow-remove":{"version":null,"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]},"scope":{}},"allow-remove-at":{"version":null,"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]},"scope":{}},"allow-set-accelerator":{"version":null,"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]},"scope":{}},"allow-set-as-app-menu":{"version":null,"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":[]},"scope":{}},"allow-set-as-help-menu-for-nsapp":{"version":null,"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":[]},"scope":{}},"allow-set-as-window-menu":{"version":null,"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":[]},"scope":{}},"allow-set-as-windows-menu-for-nsapp":{"version":null,"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":[]},"scope":{}},"allow-set-checked":{"version":null,"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]},"scope":{}},"allow-set-enabled":{"version":null,"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]},"scope":{}},"allow-set-icon":{"version":null,"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]},"scope":{}},"allow-set-text":{"version":null,"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]},"scope":{}},"allow-text":{"version":null,"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]},"scope":{}},"deny-append":{"version":null,"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]},"scope":{}},"deny-create-default":{"version":null,"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]},"scope":{}},"deny-get":{"version":null,"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]},"scope":{}},"deny-insert":{"version":null,"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]},"scope":{}},"deny-is-checked":{"version":null,"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]},"scope":{}},"deny-is-enabled":{"version":null,"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]},"scope":{}},"deny-items":{"version":null,"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]},"scope":{}},"deny-new":{"version":null,"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]},"scope":{}},"deny-popup":{"version":null,"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]},"scope":{}},"deny-prepend":{"version":null,"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]},"scope":{}},"deny-remove":{"version":null,"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]},"scope":{}},"deny-remove-at":{"version":null,"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]},"scope":{}},"deny-set-accelerator":{"version":null,"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]},"scope":{}},"deny-set-as-app-menu":{"version":null,"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"]},"scope":{}},"deny-set-as-help-menu-for-nsapp":{"version":null,"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"]},"scope":{}},"deny-set-as-window-menu":{"version":null,"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"]},"scope":{}},"deny-set-as-windows-menu-for-nsapp":{"version":null,"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"]},"scope":{}},"deny-set-checked":{"version":null,"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]},"scope":{}},"deny-set-enabled":{"version":null,"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]},"scope":{}},"deny-set-icon":{"version":null,"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]},"scope":{}},"deny-set-text":{"version":null,"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]},"scope":{}},"deny-text":{"version":null,"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"notification":{"default_permission":{"identifier":"default","description":"Allows requesting permission, checking permission state and sending notifications","permissions":["allow-is-permission-granted","allow-request-permission","allow-notify"]},"permissions":{"allow-is-permission-granted":{"version":null,"identifier":"allow-is-permission-granted","description":"Enables the is_permission_granted command without any pre-configured scope.","commands":{"allow":["is_permission_granted"],"deny":[]},"scope":{}},"allow-notify":{"version":null,"identifier":"allow-notify","description":"Enables the notify command without any pre-configured scope.","commands":{"allow":["notify"],"deny":[]},"scope":{}},"allow-request-permission":{"version":null,"identifier":"allow-request-permission","description":"Enables the request_permission command without any pre-configured scope.","commands":{"allow":["request_permission"],"deny":[]},"scope":{}},"deny-is-permission-granted":{"version":null,"identifier":"deny-is-permission-granted","description":"Denies the is_permission_granted command without any pre-configured scope.","commands":{"allow":[],"deny":["is_permission_granted"]},"scope":{}},"deny-notify":{"version":null,"identifier":"deny-notify","description":"Denies the notify command without any pre-configured scope.","commands":{"allow":[],"deny":["notify"]},"scope":{}},"deny-request-permission":{"version":null,"identifier":"deny-request-permission","description":"Denies the request_permission command without any pre-configured scope.","commands":{"allow":[],"deny":["request_permission"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"os":{"default_permission":null,"permissions":{"allow-arch":{"version":null,"identifier":"allow-arch","description":"Enables the arch command without any pre-configured scope.","commands":{"allow":["arch"],"deny":[]},"scope":{}},"allow-exe-extension":{"version":null,"identifier":"allow-exe-extension","description":"Enables the exe_extension command without any pre-configured scope.","commands":{"allow":["exe_extension"],"deny":[]},"scope":{}},"allow-family":{"version":null,"identifier":"allow-family","description":"Enables the family command without any pre-configured scope.","commands":{"allow":["family"],"deny":[]},"scope":{}},"allow-hostname":{"version":null,"identifier":"allow-hostname","description":"Enables the hostname command without any pre-configured scope.","commands":{"allow":["hostname"],"deny":[]},"scope":{}},"allow-locale":{"version":null,"identifier":"allow-locale","description":"Enables the locale command without any pre-configured scope.","commands":{"allow":["locale"],"deny":[]},"scope":{}},"allow-os-type":{"version":null,"identifier":"allow-os-type","description":"Enables the os_type command without any pre-configured scope.","commands":{"allow":["os_type"],"deny":[]},"scope":{}},"allow-platform":{"version":null,"identifier":"allow-platform","description":"Enables the platform command without any pre-configured scope.","commands":{"allow":["platform"],"deny":[]},"scope":{}},"allow-version":{"version":null,"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]},"scope":{}},"deny-arch":{"version":null,"identifier":"deny-arch","description":"Denies the arch command without any pre-configured scope.","commands":{"allow":[],"deny":["arch"]},"scope":{}},"deny-exe-extension":{"version":null,"identifier":"deny-exe-extension","description":"Denies the exe_extension command without any pre-configured scope.","commands":{"allow":[],"deny":["exe_extension"]},"scope":{}},"deny-family":{"version":null,"identifier":"deny-family","description":"Denies the family command without any pre-configured scope.","commands":{"allow":[],"deny":["family"]},"scope":{}},"deny-hostname":{"version":null,"identifier":"deny-hostname","description":"Denies the hostname command without any pre-configured scope.","commands":{"allow":[],"deny":["hostname"]},"scope":{}},"deny-locale":{"version":null,"identifier":"deny-locale","description":"Denies the locale command without any pre-configured scope.","commands":{"allow":[],"deny":["locale"]},"scope":{}},"deny-os-type":{"version":null,"identifier":"deny-os-type","description":"Denies the os_type command without any pre-configured scope.","commands":{"allow":[],"deny":["os_type"]},"scope":{}},"deny-platform":{"version":null,"identifier":"deny-platform","description":"Denies the platform command without any pre-configured scope.","commands":{"allow":[],"deny":["platform"]},"scope":{}},"deny-version":{"version":null,"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]},"scope":{}}},"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":{"version":null,"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]},"scope":{}},"allow-dirname":{"version":null,"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]},"scope":{}},"allow-extname":{"version":null,"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]},"scope":{}},"allow-is-absolute":{"version":null,"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]},"scope":{}},"allow-join":{"version":null,"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]},"scope":{}},"allow-normalize":{"version":null,"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]},"scope":{}},"allow-resolve":{"version":null,"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]},"scope":{}},"allow-resolve-directory":{"version":null,"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]},"scope":{}},"deny-basename":{"version":null,"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]},"scope":{}},"deny-dirname":{"version":null,"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]},"scope":{}},"deny-extname":{"version":null,"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]},"scope":{}},"deny-is-absolute":{"version":null,"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]},"scope":{}},"deny-join":{"version":null,"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]},"scope":{}},"deny-normalize":{"version":null,"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]},"scope":{}},"deny-resolve":{"version":null,"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]},"scope":{}},"deny-resolve-directory":{"version":null,"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"process":{"default_permission":null,"permissions":{"allow-exit":{"version":null,"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]},"scope":{}},"allow-restart":{"version":null,"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]},"scope":{}},"deny-exit":{"version":null,"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]},"scope":{}},"deny-restart":{"version":null,"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-close"]},"permissions":{"allow-close":{"version":null,"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]},"scope":{}},"deny-close":{"version":null,"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":null,"permissions":{"allow-execute":{"version":null,"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]},"scope":{}},"allow-kill":{"version":null,"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]},"scope":{}},"allow-open":{"version":null,"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]},"scope":{}},"allow-stdin-write":{"version":null,"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]},"scope":{}},"deny-execute":{"version":null,"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]},"scope":{}},"deny-kill":{"version":null,"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]},"scope":{}},"deny-open":{"version":null,"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]},"scope":{}},"deny-stdin-write":{"version":null,"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]},"scope":{}}},"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."},"command":{"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","command","name","sidecar"],"title":"Entry","type":"object"}},"store":{"default_permission":null,"permissions":{"allow-clear":{"version":null,"identifier":"allow-clear","description":"Enables the clear command without any pre-configured scope.","commands":{"allow":["clear"],"deny":[]},"scope":{}},"allow-delete":{"version":null,"identifier":"allow-delete","description":"Enables the delete command without any pre-configured scope.","commands":{"allow":["delete"],"deny":[]},"scope":{}},"allow-entries":{"version":null,"identifier":"allow-entries","description":"Enables the entries command without any pre-configured scope.","commands":{"allow":["entries"],"deny":[]},"scope":{}},"allow-get":{"version":null,"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]},"scope":{}},"allow-has":{"version":null,"identifier":"allow-has","description":"Enables the has command without any pre-configured scope.","commands":{"allow":["has"],"deny":[]},"scope":{}},"allow-keys":{"version":null,"identifier":"allow-keys","description":"Enables the keys command without any pre-configured scope.","commands":{"allow":["keys"],"deny":[]},"scope":{}},"allow-length":{"version":null,"identifier":"allow-length","description":"Enables the length command without any pre-configured scope.","commands":{"allow":["length"],"deny":[]},"scope":{}},"allow-load":{"version":null,"identifier":"allow-load","description":"Enables the load command without any pre-configured scope.","commands":{"allow":["load"],"deny":[]},"scope":{}},"allow-reset":{"version":null,"identifier":"allow-reset","description":"Enables the reset command without any pre-configured scope.","commands":{"allow":["reset"],"deny":[]},"scope":{}},"allow-save":{"version":null,"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]},"scope":{}},"allow-set":{"version":null,"identifier":"allow-set","description":"Enables the set command without any pre-configured scope.","commands":{"allow":["set"],"deny":[]},"scope":{}},"allow-values":{"version":null,"identifier":"allow-values","description":"Enables the values command without any pre-configured scope.","commands":{"allow":["values"],"deny":[]},"scope":{}},"deny-clear":{"version":null,"identifier":"deny-clear","description":"Denies the clear command without any pre-configured scope.","commands":{"allow":[],"deny":["clear"]},"scope":{}},"deny-delete":{"version":null,"identifier":"deny-delete","description":"Denies the delete command without any pre-configured scope.","commands":{"allow":[],"deny":["delete"]},"scope":{}},"deny-entries":{"version":null,"identifier":"deny-entries","description":"Denies the entries command without any pre-configured scope.","commands":{"allow":[],"deny":["entries"]},"scope":{}},"deny-get":{"version":null,"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]},"scope":{}},"deny-has":{"version":null,"identifier":"deny-has","description":"Denies the has command without any pre-configured scope.","commands":{"allow":[],"deny":["has"]},"scope":{}},"deny-keys":{"version":null,"identifier":"deny-keys","description":"Denies the keys command without any pre-configured scope.","commands":{"allow":[],"deny":["keys"]},"scope":{}},"deny-length":{"version":null,"identifier":"deny-length","description":"Denies the length command without any pre-configured scope.","commands":{"allow":[],"deny":["length"]},"scope":{}},"deny-load":{"version":null,"identifier":"deny-load","description":"Denies the load command without any pre-configured scope.","commands":{"allow":[],"deny":["load"]},"scope":{}},"deny-reset":{"version":null,"identifier":"deny-reset","description":"Denies the reset command without any pre-configured scope.","commands":{"allow":[],"deny":["reset"]},"scope":{}},"deny-save":{"version":null,"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]},"scope":{}},"deny-set":{"version":null,"identifier":"deny-set","description":"Denies the set command without any pre-configured scope.","commands":{"allow":[],"deny":["set"]},"scope":{}},"deny-values":{"version":null,"identifier":"deny-values","description":"Denies the values command without any pre-configured scope.","commands":{"allow":[],"deny":["values"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":[]},"permissions":{"allow-new":{"version":null,"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]},"scope":{}},"allow-set-icon":{"version":null,"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]},"scope":{}},"allow-set-icon-as-template":{"version":null,"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":[]},"scope":{}},"allow-set-menu":{"version":null,"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]},"scope":{}},"allow-set-show-menu-on-left-click":{"version":null,"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":[]},"scope":{}},"allow-set-temp-dir-path":{"version":null,"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":[]},"scope":{}},"allow-set-title":{"version":null,"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]},"scope":{}},"allow-set-tooltip":{"version":null,"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]},"scope":{}},"allow-set-visible":{"version":null,"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]},"scope":{}},"deny-new":{"version":null,"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]},"scope":{}},"deny-set-icon":{"version":null,"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]},"scope":{}},"deny-set-icon-as-template":{"version":null,"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"]},"scope":{}},"deny-set-menu":{"version":null,"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]},"scope":{}},"deny-set-show-menu-on-left-click":{"version":null,"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"]},"scope":{}},"deny-set-temp-dir-path":{"version":null,"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"]},"scope":{}},"deny-set-title":{"version":null,"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]},"scope":{}},"deny-set-tooltip":{"version":null,"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]},"scope":{}},"deny-set-visible":{"version":null,"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]},"scope":{}}},"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":{"version":null,"identifier":"allow-check","description":"Enables the check command without any pre-configured scope.","commands":{"allow":["check"],"deny":[]},"scope":{}},"allow-download-and-install":{"version":null,"identifier":"allow-download-and-install","description":"Enables the download_and_install command without any pre-configured scope.","commands":{"allow":["download_and_install"],"deny":[]},"scope":{}},"deny-check":{"version":null,"identifier":"deny-check","description":"Denies the check command without any pre-configured scope.","commands":{"allow":[],"deny":["check"]},"scope":{}},"deny-download-and-install":{"version":null,"identifier":"deny-download-and-install","description":"Denies the download_and_install command without any pre-configured scope.","commands":{"allow":[],"deny":["download_and_install"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"upload":{"default_permission":null,"permissions":{"allow-download":{"version":null,"identifier":"allow-download","description":"Enables the download command without any pre-configured scope.","commands":{"allow":["download"],"deny":[]},"scope":{}},"allow-upload":{"version":null,"identifier":"allow-upload","description":"Enables the upload command without any pre-configured scope.","commands":{"allow":["upload"],"deny":[]},"scope":{}},"deny-download":{"version":null,"identifier":"deny-download","description":"Denies the download command without any pre-configured scope.","commands":{"allow":[],"deny":["download"]},"scope":{}},"deny-upload":{"version":null,"identifier":"deny-upload","description":"Denies the upload command without any pre-configured scope.","commands":{"allow":[],"deny":["upload"]},"scope":{}}},"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":{"version":null,"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]},"scope":{}},"allow-create-webview-window":{"version":null,"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]},"scope":{}},"allow-internal-toggle-devtools":{"version":null,"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]},"scope":{}},"allow-print":{"version":null,"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]},"scope":{}},"allow-reparent":{"version":null,"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]},"scope":{}},"allow-set-webview-focus":{"version":null,"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]},"scope":{}},"allow-set-webview-position":{"version":null,"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]},"scope":{}},"allow-set-webview-size":{"version":null,"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]},"scope":{}},"allow-webview-close":{"version":null,"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]},"scope":{}},"allow-webview-position":{"version":null,"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]},"scope":{}},"allow-webview-size":{"version":null,"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]},"scope":{}},"deny-create-webview":{"version":null,"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]},"scope":{}},"deny-create-webview-window":{"version":null,"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]},"scope":{}},"deny-internal-toggle-devtools":{"version":null,"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]},"scope":{}},"deny-print":{"version":null,"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]},"scope":{}},"deny-reparent":{"version":null,"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]},"scope":{}},"deny-set-webview-focus":{"version":null,"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]},"scope":{}},"deny-set-webview-position":{"version":null,"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]},"scope":{}},"deny-set-webview-size":{"version":null,"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]},"scope":{}},"deny-webview-close":{"version":null,"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]},"scope":{}},"deny-webview-position":{"version":null,"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]},"scope":{}},"deny-webview-size":{"version":null,"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]},"scope":{}}},"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-theme","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"version":null,"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]},"scope":{}},"allow-center":{"version":null,"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]},"scope":{}},"allow-close":{"version":null,"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]},"scope":{}},"allow-create":{"version":null,"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]},"scope":{}},"allow-current-monitor":{"version":null,"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]},"scope":{}},"allow-destroy":{"version":null,"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]},"scope":{}},"allow-hide":{"version":null,"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]},"scope":{}},"allow-inner-position":{"version":null,"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]},"scope":{}},"allow-inner-size":{"version":null,"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]},"scope":{}},"allow-internal-toggle-maximize":{"version":null,"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]},"scope":{}},"allow-is-closable":{"version":null,"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]},"scope":{}},"allow-is-decorated":{"version":null,"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]},"scope":{}},"allow-is-focused":{"version":null,"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]},"scope":{}},"allow-is-fullscreen":{"version":null,"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]},"scope":{}},"allow-is-maximizable":{"version":null,"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]},"scope":{}},"allow-is-maximized":{"version":null,"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]},"scope":{}},"allow-is-minimizable":{"version":null,"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]},"scope":{}},"allow-is-minimized":{"version":null,"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]},"scope":{}},"allow-is-resizable":{"version":null,"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]},"scope":{}},"allow-is-visible":{"version":null,"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]},"scope":{}},"allow-maximize":{"version":null,"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]},"scope":{}},"allow-minimize":{"version":null,"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]},"scope":{}},"allow-outer-position":{"version":null,"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]},"scope":{}},"allow-outer-size":{"version":null,"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]},"scope":{}},"allow-primary-monitor":{"version":null,"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]},"scope":{}},"allow-request-user-attention":{"version":null,"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]},"scope":{}},"allow-scale-factor":{"version":null,"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]},"scope":{}},"allow-set-always-on-bottom":{"version":null,"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":[]},"scope":{}},"allow-set-always-on-top":{"version":null,"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":[]},"scope":{}},"allow-set-closable":{"version":null,"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]},"scope":{}},"allow-set-content-protected":{"version":null,"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]},"scope":{}},"allow-set-cursor-grab":{"version":null,"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]},"scope":{}},"allow-set-cursor-icon":{"version":null,"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]},"scope":{}},"allow-set-cursor-position":{"version":null,"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]},"scope":{}},"allow-set-cursor-visible":{"version":null,"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]},"scope":{}},"allow-set-decorations":{"version":null,"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]},"scope":{}},"allow-set-effects":{"version":null,"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]},"scope":{}},"allow-set-focus":{"version":null,"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]},"scope":{}},"allow-set-fullscreen":{"version":null,"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]},"scope":{}},"allow-set-icon":{"version":null,"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]},"scope":{}},"allow-set-ignore-cursor-events":{"version":null,"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":[]},"scope":{}},"allow-set-max-size":{"version":null,"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]},"scope":{}},"allow-set-maximizable":{"version":null,"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]},"scope":{}},"allow-set-min-size":{"version":null,"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]},"scope":{}},"allow-set-minimizable":{"version":null,"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]},"scope":{}},"allow-set-position":{"version":null,"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]},"scope":{}},"allow-set-progress-bar":{"version":null,"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]},"scope":{}},"allow-set-resizable":{"version":null,"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]},"scope":{}},"allow-set-shadow":{"version":null,"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]},"scope":{}},"allow-set-size":{"version":null,"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]},"scope":{}},"allow-set-skip-taskbar":{"version":null,"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]},"scope":{}},"allow-set-title":{"version":null,"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]},"scope":{}},"allow-set-visible-on-all-workspaces":{"version":null,"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":[]},"scope":{}},"allow-show":{"version":null,"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]},"scope":{}},"allow-start-dragging":{"version":null,"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]},"scope":{}},"allow-theme":{"version":null,"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]},"scope":{}},"allow-title":{"version":null,"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]},"scope":{}},"allow-toggle-maximize":{"version":null,"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]},"scope":{}},"allow-unmaximize":{"version":null,"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]},"scope":{}},"allow-unminimize":{"version":null,"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]},"scope":{}},"deny-available-monitors":{"version":null,"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]},"scope":{}},"deny-center":{"version":null,"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]},"scope":{}},"deny-close":{"version":null,"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]},"scope":{}},"deny-create":{"version":null,"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]},"scope":{}},"deny-current-monitor":{"version":null,"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]},"scope":{}},"deny-destroy":{"version":null,"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]},"scope":{}},"deny-hide":{"version":null,"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]},"scope":{}},"deny-inner-position":{"version":null,"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]},"scope":{}},"deny-inner-size":{"version":null,"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]},"scope":{}},"deny-internal-toggle-maximize":{"version":null,"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]},"scope":{}},"deny-is-closable":{"version":null,"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]},"scope":{}},"deny-is-decorated":{"version":null,"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]},"scope":{}},"deny-is-focused":{"version":null,"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]},"scope":{}},"deny-is-fullscreen":{"version":null,"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]},"scope":{}},"deny-is-maximizable":{"version":null,"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]},"scope":{}},"deny-is-maximized":{"version":null,"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]},"scope":{}},"deny-is-minimizable":{"version":null,"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]},"scope":{}},"deny-is-minimized":{"version":null,"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]},"scope":{}},"deny-is-resizable":{"version":null,"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]},"scope":{}},"deny-is-visible":{"version":null,"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]},"scope":{}},"deny-maximize":{"version":null,"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]},"scope":{}},"deny-minimize":{"version":null,"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]},"scope":{}},"deny-outer-position":{"version":null,"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]},"scope":{}},"deny-outer-size":{"version":null,"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]},"scope":{}},"deny-primary-monitor":{"version":null,"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]},"scope":{}},"deny-request-user-attention":{"version":null,"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]},"scope":{}},"deny-scale-factor":{"version":null,"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]},"scope":{}},"deny-set-always-on-bottom":{"version":null,"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"]},"scope":{}},"deny-set-always-on-top":{"version":null,"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"]},"scope":{}},"deny-set-closable":{"version":null,"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]},"scope":{}},"deny-set-content-protected":{"version":null,"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]},"scope":{}},"deny-set-cursor-grab":{"version":null,"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]},"scope":{}},"deny-set-cursor-icon":{"version":null,"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]},"scope":{}},"deny-set-cursor-position":{"version":null,"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]},"scope":{}},"deny-set-cursor-visible":{"version":null,"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]},"scope":{}},"deny-set-decorations":{"version":null,"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]},"scope":{}},"deny-set-effects":{"version":null,"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]},"scope":{}},"deny-set-focus":{"version":null,"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]},"scope":{}},"deny-set-fullscreen":{"version":null,"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]},"scope":{}},"deny-set-icon":{"version":null,"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]},"scope":{}},"deny-set-ignore-cursor-events":{"version":null,"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"]},"scope":{}},"deny-set-max-size":{"version":null,"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]},"scope":{}},"deny-set-maximizable":{"version":null,"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]},"scope":{}},"deny-set-min-size":{"version":null,"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]},"scope":{}},"deny-set-minimizable":{"version":null,"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]},"scope":{}},"deny-set-position":{"version":null,"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]},"scope":{}},"deny-set-progress-bar":{"version":null,"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]},"scope":{}},"deny-set-resizable":{"version":null,"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]},"scope":{}},"deny-set-shadow":{"version":null,"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]},"scope":{}},"deny-set-size":{"version":null,"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]},"scope":{}},"deny-set-skip-taskbar":{"version":null,"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]},"scope":{}},"deny-set-title":{"version":null,"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]},"scope":{}},"deny-set-visible-on-all-workspaces":{"version":null,"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"]},"scope":{}},"deny-show":{"version":null,"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]},"scope":{}},"deny-start-dragging":{"version":null,"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]},"scope":{}},"deny-theme":{"version":null,"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]},"scope":{}},"deny-title":{"version":null,"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]},"scope":{}},"deny-toggle-maximize":{"version":null,"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]},"scope":{}},"deny-unmaximize":{"version":null,"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]},"scope":{}},"deny-unminimize":{"version":null,"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null},"window-state":{"default_permission":null,"permissions":{"allow-restore-window-state":{"version":null,"identifier":"allow-restore-window-state","description":"Enables the restore_window_state command without any pre-configured scope.","commands":{"allow":["restore_window_state"],"deny":[]},"scope":{}},"allow-save-window-state":{"version":null,"identifier":"allow-save-window-state","description":"Enables the save_window_state command without any pre-configured scope.","commands":{"allow":["save_window_state"],"deny":[]},"scope":{}},"deny-restore-window-state":{"version":null,"identifier":"deny-restore-window-state","description":"Denies the restore_window_state command without any pre-configured scope.","commands":{"allow":[],"deny":["restore_window_state"]},"scope":{}},"deny-save-window-state":{"version":null,"identifier":"deny-save-window-state","description":"Denies the save_window_state command without any pre-configured scope.","commands":{"allow":[],"deny":["save_window_state"]},"scope":{}}},"permission_sets":{},"global_scope_schema":null}}
\ No newline at end of file
diff --git a/src-tauri/gen/schemas/windows-schema.json b/src-tauri/gen/schemas/windows-schema.json
new file mode 100644
index 00000000..e05e7844
--- /dev/null
+++ b/src-tauri/gen/schemas/windows-schema.json
@@ -0,0 +1,7001 @@
+{
+ "$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": "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",
+ "windows"
+ ],
+ "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 applies.",
+ "default": [
+ "linux",
+ "macOS",
+ "windows",
+ "android",
+ "iOS"
+ ],
+ "type": "array",
+ "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. Can use glob patterns.",
+ "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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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": "Entry",
+ "type": "object",
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "deny": {
+ "items": {
+ "title": "Entry",
+ "type": "object",
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "identifier"
+ ],
+ "properties": {
+ "identifier": {
+ "oneOf": [
+ {
+ "description": "http:default -> Allows all fetch operations",
+ "type": "string",
+ "enum": [
+ "http:default"
+ ]
+ },
+ {
+ "description": "http:allow-fetch -> Enables the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-cancel -> Enables the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-read-body -> Enables the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-send -> Enables the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-send"
+ ]
+ },
+ {
+ "description": "http:deny-fetch -> Denies the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-cancel -> Denies the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-read-body -> Denies the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-send -> Denies the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-send"
+ ]
+ }
+ ]
+ },
+ "allow": {
+ "items": {
+ "title": "ScopeEntry",
+ "description": "HTTP scope entry object definition.",
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "url": {
+ "description": "A URL that can be accessed by the webview when using the HTTP APIs. The scoped URL is matched against the request URL using a glob pattern.\n\nExamples:\n\n- \"https://*\" or \"https://**\" : allows all HTTPS urls\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "deny": {
+ "items": {
+ "title": "ScopeEntry",
+ "description": "HTTP scope entry object definition.",
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "url": {
+ "description": "A URL that can be accessed by the webview when using the HTTP APIs. The scoped URL is matched against the request URL using a glob pattern.\n\nExamples:\n\n- \"https://*\" or \"https://**\" : allows all HTTPS urls\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "identifier"
+ ],
+ "properties": {
+ "identifier": {
+ "oneOf": [
+ {
+ "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",
+ "command",
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellAllowedArgs"
+ }
+ ]
+ },
+ "command": {
+ "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",
+ "command",
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellAllowedArgs"
+ }
+ ]
+ },
+ "command": {
+ "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+ "type": "string"
+ },
+ "name": {
+ "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+ "type": "string"
+ },
+ "sidecar": {
+ "description": "If this command is a sidecar command.",
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "Identifier": {
+ "oneOf": [
+ {
+ "description": "app:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "app:default"
+ ]
+ },
+ {
+ "description": "app:allow-app-hide -> Enables the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-app-hide"
+ ]
+ },
+ {
+ "description": "app:allow-app-show -> Enables the app_show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-app-show"
+ ]
+ },
+ {
+ "description": "app:allow-name -> Enables the name command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-name"
+ ]
+ },
+ {
+ "description": "app:allow-tauri-version -> Enables the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-tauri-version"
+ ]
+ },
+ {
+ "description": "app:allow-version -> Enables the version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:allow-version"
+ ]
+ },
+ {
+ "description": "app:deny-app-hide -> Denies the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-app-hide"
+ ]
+ },
+ {
+ "description": "app:deny-app-show -> Denies the app_show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-app-show"
+ ]
+ },
+ {
+ "description": "app:deny-name -> Denies the name command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-name"
+ ]
+ },
+ {
+ "description": "app:deny-tauri-version -> Denies the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-tauri-version"
+ ]
+ },
+ {
+ "description": "app:deny-version -> Denies the version command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "app:deny-version"
+ ]
+ },
+ {
+ "description": "autostart:allow-disable -> Enables the disable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:allow-disable"
+ ]
+ },
+ {
+ "description": "autostart:allow-enable -> Enables the enable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:allow-enable"
+ ]
+ },
+ {
+ "description": "autostart:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:allow-is-enabled"
+ ]
+ },
+ {
+ "description": "autostart:deny-disable -> Denies the disable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:deny-disable"
+ ]
+ },
+ {
+ "description": "autostart:deny-enable -> Denies the enable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:deny-enable"
+ ]
+ },
+ {
+ "description": "autostart:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "autostart:deny-is-enabled"
+ ]
+ },
+ {
+ "description": "cli:default -> Allows reading the CLI matches",
+ "type": "string",
+ "enum": [
+ "cli:default"
+ ]
+ },
+ {
+ "description": "cli:allow-cli-matches -> Enables the cli_matches command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "cli:allow-cli-matches"
+ ]
+ },
+ {
+ "description": "cli:deny-cli-matches -> Denies the cli_matches command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "cli:deny-cli-matches"
+ ]
+ },
+ {
+ "description": "clipboard-manager:allow-read -> Enables the read command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:allow-read"
+ ]
+ },
+ {
+ "description": "clipboard-manager:allow-write -> Enables the write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:allow-write"
+ ]
+ },
+ {
+ "description": "clipboard-manager:deny-read -> Denies the read command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:deny-read"
+ ]
+ },
+ {
+ "description": "clipboard-manager:deny-write -> Denies the write command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "clipboard-manager:deny-write"
+ ]
+ },
+ {
+ "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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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 recusrive 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": "http:default -> Allows all fetch operations",
+ "type": "string",
+ "enum": [
+ "http:default"
+ ]
+ },
+ {
+ "description": "http:allow-fetch -> Enables the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-cancel -> Enables the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-read-body -> Enables the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:allow-fetch-send -> Enables the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:allow-fetch-send"
+ ]
+ },
+ {
+ "description": "http:deny-fetch -> Denies the fetch command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-cancel -> Denies the fetch_cancel command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-cancel"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-read-body -> Denies the fetch_read_body command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-read-body"
+ ]
+ },
+ {
+ "description": "http:deny-fetch-send -> Denies the fetch_send command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "http:deny-fetch-send"
+ ]
+ },
+ {
+ "description": "menu:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "menu:default"
+ ]
+ },
+ {
+ "description": "menu:allow-append -> Enables the append command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-append"
+ ]
+ },
+ {
+ "description": "menu:allow-create-default -> Enables the create_default command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-create-default"
+ ]
+ },
+ {
+ "description": "menu:allow-get -> Enables the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-get"
+ ]
+ },
+ {
+ "description": "menu:allow-insert -> Enables the insert command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-insert"
+ ]
+ },
+ {
+ "description": "menu:allow-is-checked -> Enables the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-is-checked"
+ ]
+ },
+ {
+ "description": "menu:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-is-enabled"
+ ]
+ },
+ {
+ "description": "menu:allow-items -> Enables the items command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-items"
+ ]
+ },
+ {
+ "description": "menu:allow-new -> Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-new"
+ ]
+ },
+ {
+ "description": "menu:allow-popup -> Enables the popup command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-popup"
+ ]
+ },
+ {
+ "description": "menu:allow-prepend -> Enables the prepend command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-prepend"
+ ]
+ },
+ {
+ "description": "menu:allow-remove -> Enables the remove command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-remove"
+ ]
+ },
+ {
+ "description": "menu:allow-remove-at -> Enables the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-remove-at"
+ ]
+ },
+ {
+ "description": "menu:allow-set-accelerator -> Enables the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-accelerator"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-app-menu -> Enables the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-app-menu"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-help-menu-for-nsapp -> Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-help-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-window-menu -> Enables the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-window-menu"
+ ]
+ },
+ {
+ "description": "menu:allow-set-as-windows-menu-for-nsapp -> Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-as-windows-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:allow-set-checked -> Enables the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-checked"
+ ]
+ },
+ {
+ "description": "menu:allow-set-enabled -> Enables the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-enabled"
+ ]
+ },
+ {
+ "description": "menu:allow-set-icon -> Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-icon"
+ ]
+ },
+ {
+ "description": "menu:allow-set-text -> Enables the set_text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-set-text"
+ ]
+ },
+ {
+ "description": "menu:allow-text -> Enables the text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:allow-text"
+ ]
+ },
+ {
+ "description": "menu:deny-append -> Denies the append command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-append"
+ ]
+ },
+ {
+ "description": "menu:deny-create-default -> Denies the create_default command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-create-default"
+ ]
+ },
+ {
+ "description": "menu:deny-get -> Denies the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-get"
+ ]
+ },
+ {
+ "description": "menu:deny-insert -> Denies the insert command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-insert"
+ ]
+ },
+ {
+ "description": "menu:deny-is-checked -> Denies the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-is-checked"
+ ]
+ },
+ {
+ "description": "menu:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-is-enabled"
+ ]
+ },
+ {
+ "description": "menu:deny-items -> Denies the items command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-items"
+ ]
+ },
+ {
+ "description": "menu:deny-new -> Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-new"
+ ]
+ },
+ {
+ "description": "menu:deny-popup -> Denies the popup command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-popup"
+ ]
+ },
+ {
+ "description": "menu:deny-prepend -> Denies the prepend command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-prepend"
+ ]
+ },
+ {
+ "description": "menu:deny-remove -> Denies the remove command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-remove"
+ ]
+ },
+ {
+ "description": "menu:deny-remove-at -> Denies the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-remove-at"
+ ]
+ },
+ {
+ "description": "menu:deny-set-accelerator -> Denies the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-accelerator"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-app-menu -> Denies the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-app-menu"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-help-menu-for-nsapp -> Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-help-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-window-menu -> Denies the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-window-menu"
+ ]
+ },
+ {
+ "description": "menu:deny-set-as-windows-menu-for-nsapp -> Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-as-windows-menu-for-nsapp"
+ ]
+ },
+ {
+ "description": "menu:deny-set-checked -> Denies the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-checked"
+ ]
+ },
+ {
+ "description": "menu:deny-set-enabled -> Denies the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-enabled"
+ ]
+ },
+ {
+ "description": "menu:deny-set-icon -> Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-icon"
+ ]
+ },
+ {
+ "description": "menu:deny-set-text -> Denies the set_text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-set-text"
+ ]
+ },
+ {
+ "description": "menu:deny-text -> Denies the text command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "menu:deny-text"
+ ]
+ },
+ {
+ "description": "notification:default -> Allows requesting permission, checking permission state and sending notifications",
+ "type": "string",
+ "enum": [
+ "notification:default"
+ ]
+ },
+ {
+ "description": "notification:allow-is-permission-granted -> Enables the is_permission_granted command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-is-permission-granted"
+ ]
+ },
+ {
+ "description": "notification:allow-notify -> Enables the notify command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-notify"
+ ]
+ },
+ {
+ "description": "notification:allow-request-permission -> Enables the request_permission command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:allow-request-permission"
+ ]
+ },
+ {
+ "description": "notification:deny-is-permission-granted -> Denies the is_permission_granted command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-is-permission-granted"
+ ]
+ },
+ {
+ "description": "notification:deny-notify -> Denies the notify command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-notify"
+ ]
+ },
+ {
+ "description": "notification:deny-request-permission -> Denies the request_permission command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "notification:deny-request-permission"
+ ]
+ },
+ {
+ "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": "process:allow-exit -> Enables the exit command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:allow-exit"
+ ]
+ },
+ {
+ "description": "process:allow-restart -> Enables the restart command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:allow-restart"
+ ]
+ },
+ {
+ "description": "process:deny-exit -> Denies the exit command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:deny-exit"
+ ]
+ },
+ {
+ "description": "process:deny-restart -> Denies the restart command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "process:deny-restart"
+ ]
+ },
+ {
+ "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"
+ ]
+ },
+ {
+ "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": "store:allow-clear -> Enables the clear command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-clear"
+ ]
+ },
+ {
+ "description": "store:allow-delete -> Enables the delete command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-delete"
+ ]
+ },
+ {
+ "description": "store:allow-entries -> Enables the entries command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-entries"
+ ]
+ },
+ {
+ "description": "store:allow-get -> Enables the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-get"
+ ]
+ },
+ {
+ "description": "store:allow-has -> Enables the has command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-has"
+ ]
+ },
+ {
+ "description": "store:allow-keys -> Enables the keys command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-keys"
+ ]
+ },
+ {
+ "description": "store:allow-length -> Enables the length command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-length"
+ ]
+ },
+ {
+ "description": "store:allow-load -> Enables the load command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-load"
+ ]
+ },
+ {
+ "description": "store:allow-reset -> Enables the reset command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-reset"
+ ]
+ },
+ {
+ "description": "store:allow-save -> Enables the save command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-save"
+ ]
+ },
+ {
+ "description": "store:allow-set -> Enables the set command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-set"
+ ]
+ },
+ {
+ "description": "store:allow-values -> Enables the values command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:allow-values"
+ ]
+ },
+ {
+ "description": "store:deny-clear -> Denies the clear command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-clear"
+ ]
+ },
+ {
+ "description": "store:deny-delete -> Denies the delete command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-delete"
+ ]
+ },
+ {
+ "description": "store:deny-entries -> Denies the entries command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-entries"
+ ]
+ },
+ {
+ "description": "store:deny-get -> Denies the get command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-get"
+ ]
+ },
+ {
+ "description": "store:deny-has -> Denies the has command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-has"
+ ]
+ },
+ {
+ "description": "store:deny-keys -> Denies the keys command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-keys"
+ ]
+ },
+ {
+ "description": "store:deny-length -> Denies the length command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-length"
+ ]
+ },
+ {
+ "description": "store:deny-load -> Denies the load command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-load"
+ ]
+ },
+ {
+ "description": "store:deny-reset -> Denies the reset command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-reset"
+ ]
+ },
+ {
+ "description": "store:deny-save -> Denies the save command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-save"
+ ]
+ },
+ {
+ "description": "store:deny-set -> Denies the set command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-set"
+ ]
+ },
+ {
+ "description": "store:deny-values -> Denies the values command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "store:deny-values"
+ ]
+ },
+ {
+ "description": "tray:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "tray:default"
+ ]
+ },
+ {
+ "description": "tray:allow-new -> Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:allow-new"
+ ]
+ },
+ {
+ "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-new -> Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "tray:deny-new"
+ ]
+ },
+ {
+ "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": "upload:allow-download -> Enables the download command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:allow-download"
+ ]
+ },
+ {
+ "description": "upload:allow-upload -> Enables the upload command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:allow-upload"
+ ]
+ },
+ {
+ "description": "upload:deny-download -> Denies the download command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:deny-download"
+ ]
+ },
+ {
+ "description": "upload:deny-upload -> Denies the upload command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "upload:deny-upload"
+ ]
+ },
+ {
+ "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-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-webview-close -> Denies the webview_close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-close"
+ ]
+ },
+ {
+ "description": "webview:deny-webview-position -> Denies the webview_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-position"
+ ]
+ },
+ {
+ "description": "webview:deny-webview-size -> Denies the webview_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "webview:deny-webview-size"
+ ]
+ },
+ {
+ "description": "window:default -> Default permissions for the plugin.",
+ "type": "string",
+ "enum": [
+ "window:default"
+ ]
+ },
+ {
+ "description": "window:allow-available-monitors -> Enables the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-available-monitors"
+ ]
+ },
+ {
+ "description": "window:allow-center -> Enables the center command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-center"
+ ]
+ },
+ {
+ "description": "window:allow-close -> Enables the close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-close"
+ ]
+ },
+ {
+ "description": "window:allow-create -> Enables the create command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-create"
+ ]
+ },
+ {
+ "description": "window:allow-current-monitor -> Enables the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-current-monitor"
+ ]
+ },
+ {
+ "description": "window:allow-destroy -> Enables the destroy command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-destroy"
+ ]
+ },
+ {
+ "description": "window:allow-hide -> Enables the hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-hide"
+ ]
+ },
+ {
+ "description": "window:allow-inner-position -> Enables the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-inner-position"
+ ]
+ },
+ {
+ "description": "window:allow-inner-size -> Enables the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-inner-size"
+ ]
+ },
+ {
+ "description": "window:allow-internal-toggle-maximize -> Enables the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-internal-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-is-closable -> Enables the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-closable"
+ ]
+ },
+ {
+ "description": "window:allow-is-decorated -> Enables the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-decorated"
+ ]
+ },
+ {
+ "description": "window:allow-is-focused -> Enables the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-focused"
+ ]
+ },
+ {
+ "description": "window:allow-is-fullscreen -> Enables the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-fullscreen"
+ ]
+ },
+ {
+ "description": "window:allow-is-maximizable -> Enables the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-maximizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-maximized -> Enables the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-maximized"
+ ]
+ },
+ {
+ "description": "window:allow-is-minimizable -> Enables the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-minimizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-minimized -> Enables the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-minimized"
+ ]
+ },
+ {
+ "description": "window:allow-is-resizable -> Enables the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-resizable"
+ ]
+ },
+ {
+ "description": "window:allow-is-visible -> Enables the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-is-visible"
+ ]
+ },
+ {
+ "description": "window:allow-maximize -> Enables the maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-minimize -> Enables the minimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-minimize"
+ ]
+ },
+ {
+ "description": "window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-outer-position"
+ ]
+ },
+ {
+ "description": "window:allow-outer-size -> Enables the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-outer-size"
+ ]
+ },
+ {
+ "description": "window:allow-primary-monitor -> Enables the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-primary-monitor"
+ ]
+ },
+ {
+ "description": "window:allow-request-user-attention -> Enables the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-request-user-attention"
+ ]
+ },
+ {
+ "description": "window:allow-scale-factor -> Enables the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-scale-factor"
+ ]
+ },
+ {
+ "description": "window:allow-set-always-on-bottom -> Enables the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-always-on-bottom"
+ ]
+ },
+ {
+ "description": "window:allow-set-always-on-top -> Enables the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-always-on-top"
+ ]
+ },
+ {
+ "description": "window:allow-set-closable -> Enables the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-closable"
+ ]
+ },
+ {
+ "description": "window:allow-set-content-protected -> Enables the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-content-protected"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-grab -> Enables the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-grab"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-icon -> Enables the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-icon"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-position -> Enables the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-position"
+ ]
+ },
+ {
+ "description": "window:allow-set-cursor-visible -> Enables the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-cursor-visible"
+ ]
+ },
+ {
+ "description": "window:allow-set-decorations -> Enables the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-decorations"
+ ]
+ },
+ {
+ "description": "window:allow-set-effects -> Enables the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-effects"
+ ]
+ },
+ {
+ "description": "window:allow-set-focus -> Enables the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-focus"
+ ]
+ },
+ {
+ "description": "window:allow-set-fullscreen -> Enables the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-fullscreen"
+ ]
+ },
+ {
+ "description": "window:allow-set-icon -> Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-icon"
+ ]
+ },
+ {
+ "description": "window:allow-set-ignore-cursor-events -> Enables the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-ignore-cursor-events"
+ ]
+ },
+ {
+ "description": "window:allow-set-max-size -> Enables the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-max-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-maximizable -> Enables the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-maximizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-min-size -> Enables the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-min-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-minimizable -> Enables the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-minimizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-position -> Enables the set_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-position"
+ ]
+ },
+ {
+ "description": "window:allow-set-progress-bar -> Enables the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-progress-bar"
+ ]
+ },
+ {
+ "description": "window:allow-set-resizable -> Enables the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-resizable"
+ ]
+ },
+ {
+ "description": "window:allow-set-shadow -> Enables the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-shadow"
+ ]
+ },
+ {
+ "description": "window:allow-set-size -> Enables the set_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-size"
+ ]
+ },
+ {
+ "description": "window:allow-set-skip-taskbar -> Enables the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-skip-taskbar"
+ ]
+ },
+ {
+ "description": "window:allow-set-title -> Enables the set_title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-title"
+ ]
+ },
+ {
+ "description": "window:allow-set-visible-on-all-workspaces -> Enables the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-set-visible-on-all-workspaces"
+ ]
+ },
+ {
+ "description": "window:allow-show -> Enables the show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-show"
+ ]
+ },
+ {
+ "description": "window:allow-start-dragging -> Enables the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-start-dragging"
+ ]
+ },
+ {
+ "description": "window:allow-theme -> Enables the theme command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-theme"
+ ]
+ },
+ {
+ "description": "window:allow-title -> Enables the title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-title"
+ ]
+ },
+ {
+ "description": "window:allow-toggle-maximize -> Enables the toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:allow-unmaximize -> Enables the unmaximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-unmaximize"
+ ]
+ },
+ {
+ "description": "window:allow-unminimize -> Enables the unminimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:allow-unminimize"
+ ]
+ },
+ {
+ "description": "window:deny-available-monitors -> Denies the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-available-monitors"
+ ]
+ },
+ {
+ "description": "window:deny-center -> Denies the center command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-center"
+ ]
+ },
+ {
+ "description": "window:deny-close -> Denies the close command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-close"
+ ]
+ },
+ {
+ "description": "window:deny-create -> Denies the create command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-create"
+ ]
+ },
+ {
+ "description": "window:deny-current-monitor -> Denies the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-current-monitor"
+ ]
+ },
+ {
+ "description": "window:deny-destroy -> Denies the destroy command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-destroy"
+ ]
+ },
+ {
+ "description": "window:deny-hide -> Denies the hide command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-hide"
+ ]
+ },
+ {
+ "description": "window:deny-inner-position -> Denies the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-inner-position"
+ ]
+ },
+ {
+ "description": "window:deny-inner-size -> Denies the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-inner-size"
+ ]
+ },
+ {
+ "description": "window:deny-internal-toggle-maximize -> Denies the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-internal-toggle-maximize"
+ ]
+ },
+ {
+ "description": "window:deny-is-closable -> Denies the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-closable"
+ ]
+ },
+ {
+ "description": "window:deny-is-decorated -> Denies the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-decorated"
+ ]
+ },
+ {
+ "description": "window:deny-is-focused -> Denies the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-focused"
+ ]
+ },
+ {
+ "description": "window:deny-is-fullscreen -> Denies the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-fullscreen"
+ ]
+ },
+ {
+ "description": "window:deny-is-maximizable -> Denies the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-maximizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-maximized -> Denies the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-maximized"
+ ]
+ },
+ {
+ "description": "window:deny-is-minimizable -> Denies the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-minimizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-minimized -> Denies the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-minimized"
+ ]
+ },
+ {
+ "description": "window:deny-is-resizable -> Denies the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-resizable"
+ ]
+ },
+ {
+ "description": "window:deny-is-visible -> Denies the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-is-visible"
+ ]
+ },
+ {
+ "description": "window:deny-maximize -> Denies the maximize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-maximize"
+ ]
+ },
+ {
+ "description": "window:deny-minimize -> Denies the minimize command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-minimize"
+ ]
+ },
+ {
+ "description": "window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-outer-position"
+ ]
+ },
+ {
+ "description": "window:deny-outer-size -> Denies the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-outer-size"
+ ]
+ },
+ {
+ "description": "window:deny-primary-monitor -> Denies the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-primary-monitor"
+ ]
+ },
+ {
+ "description": "window:deny-request-user-attention -> Denies the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-request-user-attention"
+ ]
+ },
+ {
+ "description": "window:deny-scale-factor -> Denies the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-scale-factor"
+ ]
+ },
+ {
+ "description": "window:deny-set-always-on-bottom -> Denies the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-always-on-bottom"
+ ]
+ },
+ {
+ "description": "window:deny-set-always-on-top -> Denies the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-always-on-top"
+ ]
+ },
+ {
+ "description": "window:deny-set-closable -> Denies the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-closable"
+ ]
+ },
+ {
+ "description": "window:deny-set-content-protected -> Denies the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-content-protected"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-grab -> Denies the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-grab"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-icon -> Denies the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-icon"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-position -> Denies the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-position"
+ ]
+ },
+ {
+ "description": "window:deny-set-cursor-visible -> Denies the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-cursor-visible"
+ ]
+ },
+ {
+ "description": "window:deny-set-decorations -> Denies the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-decorations"
+ ]
+ },
+ {
+ "description": "window:deny-set-effects -> Denies the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-effects"
+ ]
+ },
+ {
+ "description": "window:deny-set-focus -> Denies the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-focus"
+ ]
+ },
+ {
+ "description": "window:deny-set-fullscreen -> Denies the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-fullscreen"
+ ]
+ },
+ {
+ "description": "window:deny-set-icon -> Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-icon"
+ ]
+ },
+ {
+ "description": "window:deny-set-ignore-cursor-events -> Denies the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-ignore-cursor-events"
+ ]
+ },
+ {
+ "description": "window:deny-set-max-size -> Denies the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-max-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-maximizable -> Denies the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-maximizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-min-size -> Denies the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-min-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-minimizable -> Denies the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-minimizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-position -> Denies the set_position command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-position"
+ ]
+ },
+ {
+ "description": "window:deny-set-progress-bar -> Denies the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-progress-bar"
+ ]
+ },
+ {
+ "description": "window:deny-set-resizable -> Denies the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-resizable"
+ ]
+ },
+ {
+ "description": "window:deny-set-shadow -> Denies the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-shadow"
+ ]
+ },
+ {
+ "description": "window:deny-set-size -> Denies the set_size command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-size"
+ ]
+ },
+ {
+ "description": "window:deny-set-skip-taskbar -> Denies the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-skip-taskbar"
+ ]
+ },
+ {
+ "description": "window:deny-set-title -> Denies the set_title command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-title"
+ ]
+ },
+ {
+ "description": "window:deny-set-visible-on-all-workspaces -> Denies the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-set-visible-on-all-workspaces"
+ ]
+ },
+ {
+ "description": "window:deny-show -> Denies the show command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-show"
+ ]
+ },
+ {
+ "description": "window:deny-start-dragging -> Denies the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window:deny-start-dragging"
+ ]
+ },
+ {
+ "description": "window:deny-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"
+ ]
+ },
+ {
+ "description": "window-state:allow-restore-window-state -> Enables the restore_window_state command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window-state:allow-restore-window-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-restore-window-state -> Denies the restore_window_state command without any pre-configured scope.",
+ "type": "string",
+ "enum": [
+ "window-state:deny-restore-window-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/locales/en.json b/src-tauri/locales/en.json
index 8400f6f8..1d96ffe3 100644
--- a/src-tauri/locales/en.json
+++ b/src-tauri/locales/en.json
@@ -1,295 +1,298 @@
{
- "global": {
- "relay": "Relay",
- "back": "Back",
- "continue": "Continue",
- "loading": "Loading",
- "error": "Error",
- "moveLeft": "Move Left",
- "moveRight": "Move Right",
- "newColumn": "New Column",
- "inspect": "Inspect",
- "loadMore": "Load more",
- "delete": "Delete",
- "refresh": "Refresh",
- "cancel": "Cancel",
- "save": "Save",
- "post": "Post",
- "update": "Update",
- "noResult": "No results found.",
- "emptyFeedTitle": "This feed is empty",
- "emptyFeedSubtitle": "You can follow more users to build up your timeline",
- "apiKey": "API Key",
- "skip": "Skip",
- "close": "Close"
- },
- "nip89": {
- "unsupported": "Lume isn't support this event",
- "openWith": "Open with"
- },
- "note": {
- "showThread": "Show thread",
- "showMore": "Show more",
- "error": "Failed to fetch event.",
- "posted": "posted",
- "replied": "replied",
- "reposted": "reposted",
- "menu": {
- "viewThread": "View thread",
- "copyLink": "Copy shareable link",
- "copyNoteId": "Copy note ID",
- "copyAuthorId": "Copy author ID",
- "viewAuthor": "View author",
- "pinAuthor": "Pin author",
- "copyRaw": "Copy raw event",
- "mute": "Mute"
- },
- "buttons": {
- "pin": "Pin",
- "pinTooltip": "Pin Note",
- "repost": "Repost",
- "quote": "Quote",
- "viewProfile": "View profile"
- },
- "zap": {
- "zap": "Zap",
- "tooltip": "Send zap",
- "modalTitle": "Send zap to",
- "messagePlaceholder": "Enter message (optional)",
- "buttonFinish": "Zapped",
- "buttonLoading": "Processing...",
- "invoiceButton": "Scan to zap",
- "invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..."
- },
- "reply": {
- "single": "reply",
- "plural": "replies",
- "empty": "Be the first to Reply!"
- }
- },
- "user": {
- "avatar": "Avatar",
- "displayName": "Display Name",
- "name": "Name",
- "bio": "Bio",
- "lna": "Lightning address",
- "website": "Website",
- "verified": "Verified",
- "unverified": "Unverified",
- "follow": "Follow",
- "unfollow": "Unfollow",
- "latestPosts": "Latest posts",
- "avatarButton": "Change avatar",
- "coverButton": "Change cover",
- "editProfile": "Edit profile",
- "settings": "Settings",
- "logout": "Log out",
- "logoutConfirmTitle": "Are you sure!",
- "logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account."
- },
- "editor": {
- "title": "New Post",
- "placeholder": "What are you up to?",
- "successMessage": "Your note has been published successfully.",
- "replyPlaceholder": "Post your reply"
- },
- "search": {
- "placeholder": "Type something to search...",
- "empty": "Try searching for people, notes, or keywords"
- },
- "welcome": {
- "title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.",
- "signup": "Join Nostr",
- "login": "Login",
- "footer": "Before joining Nostr, you can take time to learn more about Nostr"
- },
- "login": {
- "title": "Welcome back, anon!",
- "footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID",
- "loginWithAddress": "Login with Nostr Address",
- "loginWithBunker": "Login with nsecBunker",
- "or": "Or continue with",
- "loginWithPrivkey": "Login with Private Key"
- },
- "loginWithAddress": {
- "title": "Enter your Nostr Address"
- },
- "loginWithBunker": {
- "title": "Enter your nsecbunker token"
- },
- "loginWithPrivkey": {
- "title": "Enter your Private Key",
- "subtitle": "Lume will put your private key to <1>{{service}}1>.\nIt will be secured by your OS."
- },
- "signup": {
- "title": "Let's Get Started",
- "subtitle": "Choose one of methods below to create your account",
- "selfManageMethod": "Self-Managed",
- "selfManageMethodDescription": "You create your keys and keep them safe.",
- "providerMethod": "Managed by Provider",
- "providerMethodDescription": "A 3rd party provider will handle your sign in keys for you."
- },
- "signupWithSelfManage": {
- "title": "This is your new Account Key",
- "subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.",
- "confirm1": "I understand the risk of lost private key.",
- "confirm2": "I will make sure keep it safe and not sharing with anyone.",
- "confirm3": "I understand I cannot recover private key.",
- "button": "Save key & Continue"
- },
- "signupWithProvider": {
- "title": "Let's set up your account on Nostr",
- "username": "Username *",
- "chooseProvider": "Choose a Provider",
- "usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account",
- "email": "Backup Email (optional)",
- "emailFooter": "Use for recover your account if you lose your password"
- },
- "onboardingSettings": {
- "title": "You're almost ready to use Lume.",
- "subtitle": "Let's start personalizing your experience.",
- "notification": {
- "title": "Push notification",
- "subtitle": "Enabling push notifications will allow you to receive notifications from Lume."
- },
- "lowPower": {
- "title": "Low Power Mode",
- "subtitle": "Limited relay connection and hide all media, sustainable for low network environment."
- },
- "translation": {
- "title": "Translation (nostr.wine)",
- "subtitle": "Translate text to your preferred language, powered by Nostr Wine."
- },
- "footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later."
- },
- "relays": {
- "global": "Global",
- "follows": "Follows",
- "sidebar": {
- "title": "Connected relays",
- "empty": "Empty."
- },
- "relayView": {
- "empty": "Could not load relay information 😬",
- "owner": "Owner",
- "contact": "Contact",
- "software": "Software",
- "nips": "Supported NIPs",
- "limit": "Limitation",
- "payment": "Open payment website",
- "paymentNote": "You need to make a payment to connect this relay"
- }
- },
- "suggestion": {
- "title": "Suggested Follows",
- "error": "Error. Cannot get trending users",
- "button": "Save & Go back"
- },
- "interests": {
- "title": "Interests",
- "subtitle": "Pick things you'd like to see in your home feed.",
- "edit": "Edit Interest",
- "followAll": "Follow All",
- "unfollowAll": "Unfollow All"
- },
- "settings": {
- "general": {
- "title": "General",
- "update": {
- "title": "Update",
- "subtitle": "Automatically download new update"
- },
- "lowPower": {
- "title": "Low Power",
- "subtitle": "Sustainable for low network environment"
- },
- "startup": {
- "title": "Startup",
- "subtitle": "Launch Lume at Login"
- },
- "media": {
- "title": "Media",
- "subtitle": "Automatically load media"
- },
- "hashtag": {
- "title": "Hashtag",
- "subtitle": "Show all hashtags in content"
- },
- "notification": {
- "title": "Notification",
- "subtitle": "Automatically send notification"
- },
- "translation": {
- "title": "Translation",
- "subtitle": "Translate text to your language"
- },
- "appearance": {
- "title": "Appearance",
- "light": "Light",
- "dark": "Dark",
- "system": "System"
- }
- },
- "user": {
- "title": "User"
- },
- "zap": {
- "title": "Zap",
- "nwc": "Connection String"
- },
- "backup": {
- "title": "Backup",
- "privkey": {
- "title": "Private key",
- "button": "Remove private key"
- }
- },
- "advanced": {
- "title": "Advanced",
- "cache": {
- "title": "Cache",
- "subtitle": "Use for boost up nostr connection",
- "button": "Clear"
- },
- "instant": {
- "title": "Instant Zap",
- "subtitle": "Zap with default amount, no confirmation"
- },
- "defaultAmount": "Default amount"
- },
- "about": {
- "title": "About",
- "version": "Version",
- "checkUpdate": "Check for update",
- "installUpdate": "Install"
- }
- },
- "onboarding": {
- "home": {
- "title": "Your account was successfully created!",
- "subtitle": "For starters, let's set up your profile.",
- "profileSettings": "Profile Settings"
- },
- "profile": {
- "title": "About you",
- "subtitle": "Tell Lume about yourself to start building your home feed."
- },
- "finish": {
- "title": "Profile setup complete!",
- "subtitle": "You can exit the setup here and start using Lume.",
- "report": "Report a issue"
- }
- },
- "activity": {
- "title": "Activity",
- "empty": "Yo! Nothing new yet.",
- "mention": "mention you",
- "repost": "reposted",
- "zap": "zapped",
- "newReply": "New reply",
- "boost": "Boost",
- "boostSubtitle": "@ Someone has reposted to your note",
- "conversation": "Conversation",
- "conversationSubtitle": "@ Someone has replied to your note"
- }
+ "global": {
+ "relay": "Relay",
+ "back": "Back",
+ "continue": "Continue",
+ "loading": "Loading",
+ "error": "Error",
+ "moveLeft": "Move Left",
+ "moveRight": "Move Right",
+ "newColumn": "New Column",
+ "inspect": "Inspect",
+ "loadMore": "Load more",
+ "delete": "Delete",
+ "refresh": "Refresh",
+ "cancel": "Cancel",
+ "save": "Save",
+ "post": "Post",
+ "update": "Update",
+ "noResult": "No results found.",
+ "emptyFeedTitle": "This feed is empty",
+ "emptyFeedSubtitle": "You can follow more users to build up your timeline",
+ "apiKey": "API Key",
+ "skip": "Skip",
+ "close": "Close"
+ },
+ "nip89": {
+ "unsupported": "Lume isn't support this event",
+ "openWith": "Open with"
+ },
+ "note": {
+ "showThread": "Show thread",
+ "showMore": "Show more",
+ "error": "Failed to fetch event.",
+ "posted": "posted",
+ "replied": "replied",
+ "reposted": "reposted",
+ "menu": {
+ "viewThread": "View thread",
+ "copyLink": "Copy shareable link",
+ "copyNoteId": "Copy note ID",
+ "copyAuthorId": "Copy author ID",
+ "viewAuthor": "View author",
+ "pinAuthor": "Pin author",
+ "copyRaw": "Copy raw event",
+ "mute": "Mute"
+ },
+ "buttons": {
+ "pin": "Pin",
+ "pinTooltip": "Pin Note",
+ "repost": "Repost",
+ "quote": "Quote",
+ "viewProfile": "View profile",
+ "reply": "Reply this note",
+ "open": "Open in new window"
+ },
+ "zap": {
+ "zap": "Zap",
+ "tooltip": "Send zap",
+ "modalTitle": "Send zap to",
+ "messagePlaceholder": "Enter message (optional)",
+ "buttonFinish": "Zapped",
+ "buttonLoading": "Processing...",
+ "invoiceButton": "Scan to zap",
+ "invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..."
+ },
+ "reply": {
+ "single": "reply",
+ "plural": "replies",
+ "empty": "Be the first to Reply!"
+ }
+ },
+ "user": {
+ "avatar": "Avatar",
+ "displayName": "Display Name",
+ "name": "Name",
+ "bio": "Bio",
+ "lna": "Lightning address",
+ "website": "Website",
+ "verified": "Verified",
+ "unverified": "Unverified",
+ "follow": "Follow",
+ "unfollow": "Unfollow",
+ "latestPosts": "Latest posts",
+ "avatarButton": "Change avatar",
+ "coverButton": "Change cover",
+ "editProfile": "Edit profile",
+ "settings": "Settings",
+ "logout": "Log out",
+ "logoutConfirmTitle": "Are you sure!",
+ "logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account."
+ },
+ "editor": {
+ "title": "New Post",
+ "placeholder": "What are you up to?",
+ "successMessage": "Your note has been published successfully.",
+ "replyPlaceholder": "Post your reply"
+ },
+ "search": {
+ "placeholder": "Type something to search...",
+ "empty": "Try searching for people, notes, or keywords"
+ },
+ "welcome": {
+ "title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.",
+ "signup": "Join Nostr",
+ "login": "Login",
+ "footer": "Before joining Nostr, you can take time to learn more about Nostr"
+ },
+ "login": {
+ "title": "Welcome back, anon!",
+ "subtitle": "We're so excited to see you again!",
+ "footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID",
+ "loginWithAddress": "Login with Nostr Address",
+ "loginWithBunker": "Login with nsecBunker",
+ "or": "Or continue with",
+ "loginWithPrivkey": "Login with Private Key"
+ },
+ "loginWithAddress": {
+ "title": "Enter your Nostr Address"
+ },
+ "loginWithBunker": {
+ "title": "Enter your nsecbunker token"
+ },
+ "loginWithPrivkey": {
+ "title": "Enter your Private Key",
+ "subtitle": "Lume will put your private key to <1>{{service}}1>.\nIt will be secured by your OS."
+ },
+ "signup": {
+ "title": "Let's Get Started",
+ "subtitle": "Choose one of methods below to create your account",
+ "selfManageMethod": "Self-Managed",
+ "selfManageMethodDescription": "You create your keys and keep them safe.",
+ "providerMethod": "Managed by Provider",
+ "providerMethodDescription": "A 3rd party provider will handle your sign in keys for you."
+ },
+ "backup": {
+ "title": "This is your new sign in key",
+ "subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.",
+ "confirm1": "I understand the risk of lost private key.",
+ "confirm2": "I will make sure keep it safe and not sharing with anyone.",
+ "confirm3": "I understand I cannot recover private key.",
+ "button": "Save & Continue"
+ },
+ "signupWithProvider": {
+ "title": "Let's set up your account on Nostr",
+ "username": "Username *",
+ "chooseProvider": "Choose a Provider",
+ "usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account",
+ "email": "Backup Email (optional)",
+ "emailFooter": "Use for recover your account if you lose your password"
+ },
+ "onboardingSettings": {
+ "title": "You're almost ready to use Lume.",
+ "subtitle": "Let's start personalizing your experience.",
+ "notification": {
+ "title": "Push notification",
+ "subtitle": "Enabling push notifications will allow you to receive notifications from Lume."
+ },
+ "lowPower": {
+ "title": "Low Power Mode",
+ "subtitle": "Limited relay connection and hide all media, sustainable for low network environment."
+ },
+ "translation": {
+ "title": "Translation (nostr.wine)",
+ "subtitle": "Translate text to your preferred language, powered by Nostr Wine."
+ },
+ "footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later."
+ },
+ "relays": {
+ "global": "Global",
+ "follows": "Follows",
+ "sidebar": {
+ "title": "Connected relays",
+ "empty": "Empty."
+ },
+ "relayView": {
+ "empty": "Could not load relay information 😬",
+ "owner": "Owner",
+ "contact": "Contact",
+ "software": "Software",
+ "nips": "Supported NIPs",
+ "limit": "Limitation",
+ "payment": "Open payment website",
+ "paymentNote": "You need to make a payment to connect this relay"
+ }
+ },
+ "suggestion": {
+ "title": "Suggested Follows",
+ "error": "Error. Cannot get trending users",
+ "button": "Save & Go back"
+ },
+ "interests": {
+ "title": "Interests",
+ "subtitle": "Pick things you'd like to see in your home feed.",
+ "edit": "Edit Interest",
+ "followAll": "Follow All",
+ "unfollowAll": "Unfollow All"
+ },
+ "settings": {
+ "general": {
+ "title": "General",
+ "update": {
+ "title": "Update",
+ "subtitle": "Automatically download new update"
+ },
+ "lowPower": {
+ "title": "Low Power",
+ "subtitle": "Sustainable for low network environment"
+ },
+ "startup": {
+ "title": "Startup",
+ "subtitle": "Launch Lume at Login"
+ },
+ "media": {
+ "title": "Media",
+ "subtitle": "Automatically load media"
+ },
+ "hashtag": {
+ "title": "Hashtag",
+ "subtitle": "Show all hashtags in content"
+ },
+ "notification": {
+ "title": "Notification",
+ "subtitle": "Automatically send notification"
+ },
+ "translation": {
+ "title": "Translation",
+ "subtitle": "Translate text to your language"
+ },
+ "appearance": {
+ "title": "Appearance",
+ "light": "Light",
+ "dark": "Dark",
+ "system": "System"
+ }
+ },
+ "user": {
+ "title": "User"
+ },
+ "zap": {
+ "title": "Zap",
+ "nwc": "Connection String"
+ },
+ "backup": {
+ "title": "Backup",
+ "privkey": {
+ "title": "Private key",
+ "button": "Remove private key"
+ }
+ },
+ "advanced": {
+ "title": "Advanced",
+ "cache": {
+ "title": "Cache",
+ "subtitle": "Use for boost up nostr connection",
+ "button": "Clear"
+ },
+ "instant": {
+ "title": "Instant Zap",
+ "subtitle": "Zap with default amount, no confirmation"
+ },
+ "defaultAmount": "Default amount"
+ },
+ "about": {
+ "title": "About",
+ "version": "Version",
+ "checkUpdate": "Check for update",
+ "installUpdate": "Install"
+ }
+ },
+ "onboarding": {
+ "home": {
+ "title": "Your account was successfully created!",
+ "subtitle": "For starters, let's set up your profile.",
+ "profileSettings": "Profile Settings"
+ },
+ "profile": {
+ "title": "About you",
+ "subtitle": "Tell Lume about yourself to start building your home feed."
+ },
+ "finish": {
+ "title": "Profile setup complete!",
+ "subtitle": "You can exit the setup here and start using Lume.",
+ "report": "Report a issue"
+ }
+ },
+ "activity": {
+ "title": "Activity",
+ "empty": "Yo! Nothing new yet.",
+ "mention": "mention you",
+ "repost": "reposted",
+ "zap": "zapped",
+ "newReply": "New reply",
+ "boost": "Boost",
+ "boostSubtitle": "@ Someone has reposted to your note",
+ "conversation": "Conversation",
+ "conversationSubtitle": "@ Someone has replied to your note"
+ }
}
diff --git a/src-tauri/migrations/20230418013219_initial_data.sql b/src-tauri/migrations/20230418013219_initial_data.sql
deleted file mode 100644
index 09916b7c..00000000
--- a/src-tauri/migrations/20230418013219_initial_data.sql
+++ /dev/null
@@ -1,59 +0,0 @@
--- create accounts table
-CREATE TABLE
- accounts (
- id INTEGER NOT NULL PRIMARY KEY,
- pubkey TEXT NOT NULL UNIQUE,
- is_active INTEGER NOT NULL DEFAULT 0,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
- );
-
--- create ndk cache users table
-CREATE TABLE
- ndk_users (
- pubkey TEXT NOT NULL PRIMARY KEY,
- profile TEXT,
- createdAt NUMBER
- );
-
--- create ndk cache events table
-CREATE TABLE
- ndk_events (
- id TEXT NOT NULL PRIMARY KEY,
- pubkey TEXT,
- content TEXT,
- kind NUMBER,
- createdAt NUMBER,
- relay TEXT,
- event TEXT
- );
-
--- create ndk cache eventtags table
-CREATE TABLE
- ndk_eventtags (
- id TEXT NOT NULL PRIMARY KEY,
- eventId TEXT,
- tag TEXT,
- value TEXT,
- tagValue TEXT
- );
-
--- create settings table
-CREATE TABLE
- settings (
- id INTEGER NOT NULL PRIMARY KEY,
- key TEXT NOT NULL,
- value TEXT NOT NULL,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
- );
-
--- create columns table
-CREATE TABLE
- columns (
- id INTEGER NOT NULL PRIMARY KEY,
- account_id INTEGER NOT NULL,
- kind INTEGER NOT NULL,
- title TEXT NOT NULL,
- content TEXT NOT NULL,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- FOREIGN KEY (account_id) REFERENCES accounts (id)
- );
diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs
index 58ce6ede..1434139e 100644
--- a/src-tauri/src/commands.rs
+++ b/src-tauri/src/commands.rs
@@ -1,3 +1,2 @@
pub mod folder;
pub mod opg;
-pub mod secret;
diff --git a/src-tauri/src/commands/folder.rs b/src-tauri/src/commands/folder.rs
index 2bea7d0b..4b41b6fa 100644
--- a/src-tauri/src/commands/folder.rs
+++ b/src-tauri/src/commands/folder.rs
@@ -1,4 +1,5 @@
use std::process::Command;
+use tauri::Manager;
#[tauri::command]
pub async fn show_in_folder(path: String) {
@@ -46,3 +47,26 @@ pub async fn show_in_folder(path: String) {
Command::new("open").args(["-R", &path]).spawn().unwrap();
}
}
+
+#[tauri::command]
+pub fn get_all_nsecs(app_handle: tauri::AppHandle) -> Result, ()> {
+ let dir = app_handle.path().app_config_dir().unwrap();
+
+ if let Ok(paths) = std::fs::read_dir(dir) {
+ let files = paths
+ .filter_map(|res| res.ok())
+ .map(|dir_entry| dir_entry.path())
+ .filter_map(|path| {
+ if path.extension().map_or(false, |ext| ext == "nsec") {
+ Some(path.file_name().unwrap().to_str().unwrap().to_string())
+ } else {
+ None
+ }
+ })
+ .collect::>();
+
+ Ok(files)
+ } else {
+ Err(())
+ }
+}
diff --git a/src-tauri/src/commands/opg.rs b/src-tauri/src/commands/opg.rs
index 2d570e96..94a083ee 100644
--- a/src-tauri/src/commands/opg.rs
+++ b/src-tauri/src/commands/opg.rs
@@ -16,35 +16,39 @@ pub fn fetch_opg(url: String) -> Result {
options.max_redirections = 3;
options.timeout = Duration::from_secs(15);
- let info = Webpage::from_url(&url, options).expect("Failed");
- let html = info.html;
+ let info = Webpage::from_url(&url, options);
- let result = OpenGraphResponse {
- title: html
- .opengraph
- .properties
- .get("title")
- .cloned()
- .unwrap_or_default(),
- description: html
- .opengraph
- .properties
- .get("description")
- .cloned()
- .unwrap_or_default(),
- url: html
- .opengraph
- .properties
- .get("url")
- .cloned()
- .unwrap_or_default(),
- image: html
- .opengraph
- .images
- .get(0)
- .and_then(|i| Some(i.url.clone()))
- .unwrap_or_default(),
- };
+ if let Ok(data) = info {
+ let html = data.html;
+ let result = OpenGraphResponse {
+ title: html
+ .opengraph
+ .properties
+ .get("title")
+ .cloned()
+ .unwrap_or_default(),
+ description: html
+ .opengraph
+ .properties
+ .get("description")
+ .cloned()
+ .unwrap_or_default(),
+ url: html
+ .opengraph
+ .properties
+ .get("url")
+ .cloned()
+ .unwrap_or_default(),
+ image: html
+ .opengraph
+ .images
+ .get(0)
+ .and_then(|i| Some(i.url.clone()))
+ .unwrap_or_default(),
+ };
- Ok(result.into())
+ Ok(result.into())
+ } else {
+ Err(())
+ }
}
diff --git a/src-tauri/src/commands/secret.rs b/src-tauri/src/commands/secret.rs
deleted file mode 100644
index 71ba6c0d..00000000
--- a/src-tauri/src/commands/secret.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-use keyring::Entry;
-
-#[tauri::command]
-pub fn secure_save(key: String, value: String) -> Result<(), ()> {
- let entry = Entry::new("Lume", &key).expect("Failed to create entry");
- let _ = entry.set_password(&value);
- Ok(())
-}
-
-#[tauri::command]
-pub fn secure_load(key: String) -> Result {
- let entry = Entry::new("Lume", &key).expect("Failed to create entry");
- if let Ok(password) = entry.get_password() {
- Ok(password.into())
- } else {
- Err("Not found".into())
- }
-}
-
-#[tauri::command]
-pub fn secure_remove(key: String) -> Result<(), ()> {
- let entry = Entry::new("Lume", &key).expect("Failed to remove entry");
- let _ = entry.delete_password();
- Ok(())
-}
diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
index 0ce13303..6dae87f6 100644
--- a/src-tauri/src/main.rs
+++ b/src-tauri/src/main.rs
@@ -4,35 +4,74 @@
)]
pub mod commands;
+pub mod nostr;
+pub mod tray;
+use age::secrecy::ExposeSecret;
+use keyring::Entry;
+use nostr_sdk::prelude::*;
+use tauri::Manager;
use tauri_plugin_autostart::MacosLauncher;
-use tauri_plugin_sql::{Migration, MigrationKind};
-use tauri_plugin_theme::ThemePlugin;
+
+pub struct Nostr {
+ client: Client,
+}
fn main() {
- let mut ctx = tauri::generate_context!();
tauri::Builder::default()
.setup(|app| {
- #[cfg(desktop)]
- app
- .handle()
- .plugin(tauri_plugin_updater::Builder::new().build())?;
+ let _tray = tray::create_tray(app.handle()).unwrap();
+ let handle = app.handle().clone();
+ let config_dir = handle.path().app_config_dir().unwrap();
+ let keyring_entry = Entry::new("Lume Secret Storage", "AppKey").unwrap();
+
+ // Create new master key if not exist
+ if let Err(_) = keyring_entry.get_password() {
+ let app_key = age::x25519::Identity::generate().to_string();
+ let app_secret = app_key.expose_secret();
+ let _ = keyring_entry.set_password(app_secret);
+ }
+
+ tauri::async_runtime::spawn(async move {
+ // Create nostr database connection
+ let nostr_db = SQLiteDatabase::open(config_dir.join("nostr.db"))
+ .await
+ .expect("Open database failed.");
+
+ // Create nostr connection
+ let client = ClientBuilder::default().database(nostr_db).build();
+
+ // Add some bootstrap relays
+ // #TODO: Pull bootstrap relays from user's settings
+ client
+ .add_relay("wss://nostr.mutinywallet.com")
+ .await
+ .unwrap_or_default();
+ client
+ .add_relay("wss://relay.nostr.band")
+ .await
+ .unwrap_or_default();
+ client
+ .add_relay("wss://relay.damus.io")
+ .await
+ .unwrap_or_default();
+ client
+ .add_relay("wss://purplepag.es")
+ .await
+ .unwrap_or_default();
+
+ // Connect
+ client.connect().await;
+
+ // Update global state
+ handle.manage(Nostr {
+ client: client.into(),
+ })
+ });
+
Ok(())
})
- .plugin(
- tauri_plugin_sql::Builder::default()
- .add_migrations(
- "sqlite:lume_v3.db",
- vec![Migration {
- version: 20230418013219,
- description: "initial data",
- sql: include_str!("../migrations/20230418013219_initial_data.sql"),
- kind: MigrationKind::Up,
- }],
- )
- .build(),
- )
- .plugin(ThemePlugin::init(ctx.config_mut()))
+ .plugin(tauri_plugin_store::Builder::default().build())
.plugin(tauri_plugin_clipboard_manager::init())
.plugin(tauri_plugin_dialog::init())
.plugin(tauri_plugin_fs::init())
@@ -42,18 +81,54 @@ fn main() {
.plugin(tauri_plugin_process::init())
.plugin(tauri_plugin_shell::init())
.plugin(tauri_plugin_upload::init())
- .plugin(tauri_plugin_window_state::Builder::default().build())
+ .plugin(tauri_plugin_updater::Builder::new().build())
.plugin(tauri_plugin_autostart::init(
MacosLauncher::LaunchAgent,
Some(vec![]),
))
.invoke_handler(tauri::generate_handler![
- commands::secret::secure_save,
- commands::secret::secure_load,
- commands::secret::secure_remove,
+ nostr::keys::create_keys,
+ nostr::keys::save_key,
+ nostr::keys::get_public_key,
+ nostr::keys::update_signer,
+ nostr::keys::verify_signer,
+ nostr::keys::load_selected_account,
+ nostr::keys::event_to_bech32,
+ nostr::keys::user_to_bech32,
+ nostr::keys::verify_nip05,
+ nostr::metadata::get_profile,
+ nostr::metadata::get_contact_list,
+ nostr::metadata::get_contact_metadata,
+ nostr::metadata::create_profile,
+ nostr::metadata::follow,
+ nostr::metadata::unfollow,
+ nostr::metadata::set_interest,
+ nostr::metadata::get_interest,
+ nostr::metadata::set_settings,
+ nostr::metadata::get_settings,
+ nostr::metadata::get_nwc_status,
+ nostr::metadata::set_nwc,
+ nostr::metadata::zap_profile,
+ nostr::metadata::zap_event,
+ nostr::event::get_event,
+ nostr::event::get_events_from,
+ nostr::event::get_local_events,
+ nostr::event::get_global_events,
+ nostr::event::get_event_thread,
+ nostr::event::publish,
+ nostr::event::repost,
+ nostr::event::upvote,
+ nostr::event::downvote,
commands::folder::show_in_folder,
+ commands::folder::get_all_nsecs,
commands::opg::fetch_opg,
])
- .run(ctx)
- .expect("error while running tauri application");
+ .build(tauri::generate_context!())
+ .expect("error while running tauri application")
+ .run(|_app_handle, event| match event {
+ tauri::RunEvent::ExitRequested { api, .. } => {
+ api.prevent_exit();
+ }
+ _ => {}
+ });
}
diff --git a/src-tauri/src/nostr.rs b/src-tauri/src/nostr.rs
new file mode 100644
index 00000000..7dc1f87f
--- /dev/null
+++ b/src-tauri/src/nostr.rs
@@ -0,0 +1,4 @@
+pub mod event;
+pub mod keys;
+pub mod metadata;
+pub mod relay;
diff --git a/src-tauri/src/nostr/event.rs b/src-tauri/src/nostr/event.rs
new file mode 100644
index 00000000..6913b8f4
--- /dev/null
+++ b/src-tauri/src/nostr/event.rs
@@ -0,0 +1,213 @@
+use crate::Nostr;
+use nostr_sdk::prelude::*;
+use std::{str::FromStr, time::Duration};
+use tauri::State;
+
+#[tauri::command]
+pub async fn get_event(id: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ let event_id: Option = match Nip19::from_bech32(id) {
+ Ok(val) => match val {
+ Nip19::EventId(id) => Some(id),
+ Nip19::Event(event) => Some(event.event_id),
+ _ => None,
+ },
+ Err(_) => match EventId::from_hex(id) {
+ Ok(val) => Some(val),
+ Err(_) => None,
+ },
+ };
+
+ if let Some(id) = event_id {
+ let filter = Filter::new().id(id);
+
+ if let Ok(events) = &client
+ .get_events_of(vec![filter], Some(Duration::from_secs(10)))
+ .await
+ {
+ if let Some(event) = events.first() {
+ Ok(event.as_json())
+ } else {
+ Err("Event not found with current relay list".into())
+ }
+ } else {
+ Err("Event not found with current relay list".into())
+ }
+ } else {
+ Err("EventId is not valid".into())
+ }
+}
+
+#[tauri::command]
+pub async fn get_events_from(
+ id: &str,
+ limit: usize,
+ until: Option<&str>,
+ state: State<'_, Nostr>,
+) -> Result, String> {
+ let client = &state.client;
+ let f_until = match until {
+ Some(until) => Timestamp::from_str(until).unwrap(),
+ None => Timestamp::now(),
+ };
+
+ if let Ok(author) = PublicKey::from_str(id) {
+ let filter = Filter::new()
+ .kinds(vec![Kind::TextNote, Kind::Repost])
+ .authors(vec![author])
+ .limit(limit)
+ .until(f_until);
+
+ if let Ok(events) = client
+ .get_events_of(vec![filter], Some(Duration::from_secs(10)))
+ .await
+ {
+ Ok(events)
+ } else {
+ Err("Get text event failed".into())
+ }
+ } else {
+ Err("Parse author failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn get_local_events(
+ limit: usize,
+ until: Option<&str>,
+ state: State<'_, Nostr>,
+) -> Result, String> {
+ let client = &state.client;
+ let f_until = match until {
+ Some(until) => Timestamp::from_str(until).unwrap(),
+ None => Timestamp::now(),
+ };
+
+ let contact_list = client
+ .get_contact_list_public_keys(Some(Duration::from_secs(10)))
+ .await;
+
+ if let Ok(authors) = contact_list {
+ if authors.len() == 0 {
+ return Err("Get text event failed".into());
+ }
+
+ let filter = Filter::new()
+ .kinds(vec![Kind::TextNote, Kind::Repost])
+ .authors(authors)
+ .limit(limit)
+ .until(f_until);
+
+ if let Ok(events) = client
+ .get_events_of(vec![filter], Some(Duration::from_secs(10)))
+ .await
+ {
+ Ok(events)
+ } else {
+ Err("Get text event failed".into())
+ }
+ } else {
+ Err("Get contact list failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn get_global_events(
+ limit: usize,
+ until: Option<&str>,
+ state: State<'_, Nostr>,
+) -> Result, String> {
+ let client = &state.client;
+ let f_until = match until {
+ Some(until) => Timestamp::from_str(until).unwrap(),
+ None => Timestamp::now(),
+ };
+
+ let filter = Filter::new()
+ .kinds(vec![Kind::TextNote, Kind::Repost])
+ .limit(limit)
+ .until(f_until);
+
+ if let Ok(events) = client
+ .get_events_of(vec![filter], Some(Duration::from_secs(10)))
+ .await
+ {
+ Ok(events)
+ } else {
+ Err("Get text event failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn get_event_thread(id: &str, state: State<'_, Nostr>) -> Result, ()> {
+ let client = &state.client;
+ let event_id = EventId::from_hex(id).unwrap();
+ let filter = Filter::new().kinds(vec![Kind::TextNote]).event(event_id);
+
+ if let Ok(events) = client
+ .get_events_of(vec![filter], Some(Duration::from_secs(10)))
+ .await
+ {
+ Ok(events)
+ } else {
+ Err(())
+ }
+}
+
+#[tauri::command]
+pub async fn publish(
+ content: &str,
+ tags: Vec>,
+ state: State<'_, Nostr>,
+) -> Result {
+ let client = &state.client;
+ let final_tags = tags.into_iter().map(|val| Tag::parse(val).unwrap());
+
+ if let Ok(event_id) = client.publish_text_note(content, final_tags).await {
+ Ok(event_id.to_bech32().unwrap())
+ } else {
+ Err("Publish text note failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn repost(id: &str, pubkey: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ let public_key = PublicKey::from_str(pubkey).unwrap();
+ let event_id = EventId::from_hex(id).unwrap();
+
+ let event = client
+ .repost_event(event_id, public_key)
+ .await
+ .expect("Repost failed");
+
+ Ok(event)
+}
+
+#[tauri::command]
+pub async fn upvote(id: &str, pubkey: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ let public_key = PublicKey::from_str(pubkey).unwrap();
+ let event_id = EventId::from_hex(id).unwrap();
+
+ let event = client
+ .like(event_id, public_key)
+ .await
+ .expect("Upvote failed");
+
+ Ok(event)
+}
+
+#[tauri::command]
+pub async fn downvote(id: &str, pubkey: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ let public_key = PublicKey::from_str(pubkey).unwrap();
+ let event_id = EventId::from_hex(id).unwrap();
+
+ let event = client
+ .dislike(event_id, public_key)
+ .await
+ .expect("Downvote failed");
+
+ Ok(event)
+}
diff --git a/src-tauri/src/nostr/keys.rs b/src-tauri/src/nostr/keys.rs
new file mode 100644
index 00000000..1a528986
--- /dev/null
+++ b/src-tauri/src/nostr/keys.rs
@@ -0,0 +1,206 @@
+use crate::Nostr;
+use keyring::Entry;
+use nostr_sdk::prelude::*;
+use std::io::{BufReader, Read};
+use std::iter;
+use std::time::Duration;
+use std::{fs::File, io::Write, str::FromStr};
+use tauri::{Manager, State};
+
+#[derive(serde::Serialize)]
+pub struct CreateKeysResponse {
+ npub: String,
+ nsec: String,
+}
+
+#[tauri::command]
+pub fn create_keys() -> Result {
+ let keys = Keys::generate();
+ let public_key = keys.public_key();
+ let secret_key = keys.secret_key().expect("secret key failed");
+
+ let result = CreateKeysResponse {
+ npub: public_key.to_bech32().expect("npub failed"),
+ nsec: secret_key.to_bech32().expect("nsec failed"),
+ };
+
+ Ok(result.into())
+}
+
+#[tauri::command]
+pub async fn save_key(
+ nsec: &str,
+ app_handle: tauri::AppHandle,
+ state: State<'_, Nostr>,
+) -> Result {
+ if let Ok(nostr_secret_key) = SecretKey::from_bech32(nsec) {
+ let nostr_keys = Keys::new(nostr_secret_key);
+ let nostr_npub = nostr_keys.public_key().to_bech32().unwrap();
+ let signer = NostrSigner::Keys(nostr_keys);
+
+ // Update client's signer
+ let client = &state.client;
+ client.set_signer(Some(signer)).await;
+
+ let keyring_entry = Entry::new("Lume Secret Storage", "AppKey").unwrap();
+ let secret_key = keyring_entry.get_password().unwrap();
+ let app_key = age::x25519::Identity::from_str(&secret_key).unwrap();
+ let app_pubkey = app_key.to_public();
+
+ let config_dir = app_handle.path().app_config_dir().unwrap();
+ let encryptor =
+ age::Encryptor::with_recipients(vec![Box::new(app_pubkey)]).expect("we provided a recipient");
+
+ let file_ext = ".nsec".to_owned();
+ let file_path = nostr_npub + &file_ext;
+ let mut file = File::create(config_dir.join(file_path)).unwrap();
+ let mut writer = encryptor
+ .wrap_output(&mut file)
+ .expect("Init writer failed");
+ writer
+ .write_all(nsec.as_bytes())
+ .expect("Write nsec failed");
+ writer.finish().expect("Save nsec failed");
+
+ Ok(true)
+ } else {
+ Ok(false)
+ }
+}
+
+#[tauri::command]
+pub fn get_public_key(nsec: &str) -> Result {
+ let secret_key = SecretKey::from_bech32(nsec).unwrap();
+ let keys = Keys::new(secret_key);
+ Ok(
+ keys
+ .public_key()
+ .to_bech32()
+ .expect("get public key failed"),
+ )
+}
+
+#[tauri::command]
+pub async fn update_signer(nsec: &str, state: State<'_, Nostr>) -> Result<(), ()> {
+ let client = &state.client;
+ let secret_key = SecretKey::from_bech32(nsec).unwrap();
+ let keys = Keys::new(secret_key);
+ let signer = NostrSigner::Keys(keys);
+
+ client.set_signer(Some(signer)).await;
+
+ Ok(())
+}
+
+#[tauri::command]
+pub async fn verify_signer(state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+
+ if let Ok(_) = client.signer().await {
+ Ok(true)
+ } else {
+ Ok(false)
+ }
+}
+
+#[tauri::command]
+pub async fn load_selected_account(
+ npub: &str,
+ app_handle: tauri::AppHandle,
+ state: State<'_, Nostr>,
+) -> Result {
+ let client = &state.client;
+ let config_dir = app_handle.path().app_config_dir().unwrap();
+ let keyring_entry = Entry::new("Lume Secret Storage", "AppKey").unwrap();
+
+ // Get master password
+ if let Ok(key) = keyring_entry.get_password() {
+ // Build master key
+ let app_key = age::x25519::Identity::from_str(&key.to_string()).unwrap();
+
+ // Open nsec file
+ if let Ok(file) = File::open(config_dir.join(npub)) {
+ let file_buf = BufReader::new(file);
+ let decryptor = match age::Decryptor::new_buffered(file_buf).expect("Decryptor failed") {
+ age::Decryptor::Recipients(d) => d,
+ _ => unreachable!(),
+ };
+
+ let mut decrypted = vec![];
+ let mut reader = decryptor
+ .decrypt(iter::once(&app_key as &dyn age::Identity))
+ .expect("Decrypt nsec file failed");
+ reader
+ .read_to_end(&mut decrypted)
+ .expect("Read secret key failed");
+
+ // Get decrypted nsec key
+ let nsec_key = String::from_utf8(decrypted).unwrap();
+
+ // Build nostr signer
+ let secret_key = SecretKey::from_bech32(nsec_key).expect("Get secret key failed");
+ let keys = Keys::new(secret_key);
+ let public_key = keys.public_key();
+ let signer = NostrSigner::Keys(keys);
+
+ // Update signer
+ client.set_signer(Some(signer)).await;
+
+ // Get user's relay list
+ let filter = Filter::new()
+ .author(public_key)
+ .kind(Kind::RelayList)
+ .limit(1);
+ let query = client
+ .get_events_of(vec![filter], Some(Duration::from_secs(10)))
+ .await;
+
+ // Connect user's relay list
+ if let Ok(events) = query {
+ if let Some(event) = events.first() {
+ let list = nip65::extract_relay_list(&event);
+ for item in list.into_iter() {
+ client
+ .connect_relay(item.0.to_string())
+ .await
+ .unwrap_or_default();
+ }
+ }
+ }
+
+ Ok(true)
+ } else {
+ Ok(false)
+ }
+ } else {
+ Err("App Key not found".into())
+ }
+}
+
+#[tauri::command]
+pub fn event_to_bech32(id: &str, relays: Vec) -> Result {
+ let event_id = EventId::from_hex(id).unwrap();
+ let event = Nip19Event::new(event_id, relays);
+
+ Ok(event.to_bech32().unwrap())
+}
+
+#[tauri::command]
+pub fn user_to_bech32(key: &str, relays: Vec) -> Result {
+ let pubkey = PublicKey::from_str(key).unwrap();
+ let profile = Nip19Profile::new(pubkey, relays);
+
+ Ok(profile.to_bech32().unwrap())
+}
+
+#[tauri::command(async)]
+pub async fn verify_nip05(key: &str, nip05: &str) -> Result {
+ let public_key = PublicKey::from_str(key).unwrap();
+ let status = nip05::verify(public_key, nip05, None).await;
+
+ if let Ok(_) = status {
+ Ok(true)
+ } else {
+ Ok(false)
+ }
+}
diff --git a/src-tauri/src/nostr/metadata.rs b/src-tauri/src/nostr/metadata.rs
new file mode 100644
index 00000000..3169530b
--- /dev/null
+++ b/src-tauri/src/nostr/metadata.rs
@@ -0,0 +1,364 @@
+use crate::Nostr;
+use nostr_sdk::prelude::*;
+use std::{str::FromStr, time::Duration};
+use tauri::State;
+
+#[derive(serde::Serialize)]
+pub struct CacheContact {
+ pubkey: String,
+ profile: Metadata,
+}
+
+#[tauri::command]
+pub async fn get_profile(id: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ let public_key: Option = match Nip19::from_bech32(id) {
+ Ok(val) => match val {
+ Nip19::Pubkey(pubkey) => Some(pubkey),
+ Nip19::Profile(profile) => Some(profile.public_key),
+ _ => None,
+ },
+ Err(_) => match PublicKey::from_str(id) {
+ Ok(val) => Some(val),
+ Err(_) => None,
+ },
+ };
+
+ if let Some(author) = public_key {
+ let filter = Filter::new().author(author).kind(Kind::Metadata).limit(1);
+ let query = client
+ .get_events_of(vec![filter], Some(Duration::from_secs(10)))
+ .await;
+
+ if let Ok(events) = query {
+ if let Some(event) = events.first() {
+ if let Ok(metadata) = Metadata::from_json(&event.content) {
+ Ok(metadata)
+ } else {
+ Err("Parse metadata failed".into())
+ }
+ } else {
+ let rand_metadata = Metadata::new();
+ Ok(rand_metadata)
+ }
+ } else {
+ Err("Get metadata failed".into())
+ }
+ } else {
+ Err("Public Key is not valid".into())
+ }
+}
+
+#[tauri::command]
+pub async fn get_contact_list(state: State<'_, Nostr>) -> Result, String> {
+ let client = &state.client;
+
+ if let Ok(contact_list) = client.get_contact_list(Some(Duration::from_secs(10))).await {
+ let list = contact_list
+ .into_iter()
+ .map(|f| f.public_key.to_hex())
+ .collect();
+
+ Ok(list)
+ } else {
+ Err("Contact list not found".into())
+ }
+}
+
+#[tauri::command]
+pub async fn get_contact_metadata(state: State<'_, Nostr>) -> Result, String> {
+ let client = &state.client;
+
+ if let Ok(contact_list) = client
+ .get_contact_list_metadata(Some(Duration::from_secs(10)))
+ .await
+ {
+ let list: Vec = contact_list
+ .into_iter()
+ .map(|(id, metadata)| CacheContact {
+ pubkey: id.to_hex(),
+ profile: metadata,
+ })
+ .collect();
+
+ Ok(list)
+ } else {
+ Err("Contact list not found".into())
+ }
+}
+
+#[tauri::command]
+pub async fn create_profile(
+ name: &str,
+ display_name: &str,
+ about: &str,
+ picture: &str,
+ banner: &str,
+ nip05: &str,
+ lud16: &str,
+ website: &str,
+ state: State<'_, Nostr>,
+) -> Result {
+ let client = &state.client;
+ let metadata = Metadata::new()
+ .name(name)
+ .display_name(display_name)
+ .about(about)
+ .nip05(nip05)
+ .lud16(lud16)
+ .picture(Url::parse(picture).unwrap())
+ .banner(Url::parse(banner).unwrap())
+ .website(Url::parse(website).unwrap());
+
+ if let Ok(event_id) = client.set_metadata(&metadata).await {
+ Ok(event_id)
+ } else {
+ Err(())
+ }
+}
+
+#[tauri::command]
+pub async fn follow(
+ id: &str,
+ alias: Option<&str>,
+ state: State<'_, Nostr>,
+) -> Result {
+ let client = &state.client;
+ let public_key = PublicKey::from_str(id).unwrap();
+ let contact = Contact::new(public_key, None, alias);
+ let contact_list = client.get_contact_list(Some(Duration::from_secs(10))).await;
+
+ if let Ok(mut old_list) = contact_list {
+ old_list.push(contact);
+ let new_list = old_list.into_iter();
+
+ if let Ok(event_id) = client.set_contact_list(new_list).await {
+ Ok(event_id)
+ } else {
+ Err("Follow failed".into())
+ }
+ } else {
+ Err("Follow failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn unfollow(id: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ let public_key = PublicKey::from_str(id).unwrap();
+ let contact_list = client.get_contact_list(Some(Duration::from_secs(10))).await;
+
+ if let Ok(mut old_list) = contact_list {
+ let index = old_list
+ .iter()
+ .position(|x| x.public_key == public_key)
+ .unwrap();
+ old_list.remove(index);
+
+ let new_list = old_list.into_iter();
+
+ if let Ok(event_id) = client.set_contact_list(new_list).await {
+ Ok(event_id)
+ } else {
+ Err("Follow failed".into())
+ }
+ } else {
+ Err("Follow failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn set_interest(content: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ let tag = Tag::Identifier("lume_user_interest".into());
+ let builder = EventBuilder::new(Kind::ApplicationSpecificData, content, vec![tag]);
+
+ if let Ok(event_id) = client.send_event_builder(builder).await {
+ Ok(event_id)
+ } else {
+ Err("Set interest failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn get_interest(id: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ let public_key: Option = match Nip19::from_bech32(id) {
+ Ok(val) => match val {
+ Nip19::Pubkey(pubkey) => Some(pubkey),
+ Nip19::Profile(profile) => Some(profile.public_key),
+ _ => None,
+ },
+ Err(_) => match PublicKey::from_str(id) {
+ Ok(val) => Some(val),
+ Err(_) => None,
+ },
+ };
+
+ if let Some(author) = public_key {
+ let filter = Filter::new()
+ .author(author)
+ .kind(Kind::ApplicationSpecificData)
+ .identifier("lume_user_interest")
+ .limit(1);
+
+ let query = client
+ .get_events_of(vec![filter], Some(Duration::from_secs(10)))
+ .await;
+
+ if let Ok(events) = query {
+ if let Some(event) = events.first() {
+ Ok(event.content.to_string())
+ } else {
+ Err("User interest not found".into())
+ }
+ } else {
+ Err("User interest not found".into())
+ }
+ } else {
+ Err("Get interest failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn set_settings(content: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ let tag = Tag::Identifier("lume_user_settings".into());
+ let builder = EventBuilder::new(Kind::ApplicationSpecificData, content, vec![tag]);
+
+ if let Ok(event_id) = client.send_event_builder(builder).await {
+ Ok(event_id)
+ } else {
+ Err("Set interest failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn get_settings(id: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ let public_key: Option = match Nip19::from_bech32(id) {
+ Ok(val) => match val {
+ Nip19::Pubkey(pubkey) => Some(pubkey),
+ Nip19::Profile(profile) => Some(profile.public_key),
+ _ => None,
+ },
+ Err(_) => match PublicKey::from_str(id) {
+ Ok(val) => Some(val),
+ Err(_) => None,
+ },
+ };
+
+ if let Some(author) = public_key {
+ let filter = Filter::new()
+ .author(author)
+ .kind(Kind::ApplicationSpecificData)
+ .identifier("lume_user_settings")
+ .limit(1);
+
+ let query = client
+ .get_events_of(vec![filter], Some(Duration::from_secs(10)))
+ .await;
+
+ if let Ok(events) = query {
+ if let Some(event) = events.first() {
+ Ok(event.content.to_string())
+ } else {
+ Err("User settings not found".into())
+ }
+ } else {
+ Err("User settings not found".into())
+ }
+ } else {
+ Err("Get settings failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn get_nwc_status(state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ let zapper = client.zapper().await.is_ok();
+
+ Ok(zapper)
+}
+
+#[tauri::command]
+pub async fn set_nwc(uri: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+
+ if let Ok(uri) = NostrWalletConnectURI::from_str(&uri) {
+ if let Ok(nwc) = NWC::new(uri).await {
+ let _ = client.set_zapper(nwc);
+ Ok(true)
+ } else {
+ Ok(false)
+ }
+ } else {
+ Err("Set NWC failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn zap_profile(
+ id: &str,
+ amount: u64,
+ message: &str,
+ state: State<'_, Nostr>,
+) -> Result {
+ let client = &state.client;
+ let public_key: Option = match Nip19::from_bech32(id) {
+ Ok(val) => match val {
+ Nip19::Pubkey(pubkey) => Some(pubkey),
+ Nip19::Profile(profile) => Some(profile.public_key),
+ _ => None,
+ },
+ Err(_) => match PublicKey::from_str(id) {
+ Ok(val) => Some(val),
+ Err(_) => None,
+ },
+ };
+
+ if let Some(recipient) = public_key {
+ let details = ZapDetails::new(ZapType::Public).message(message);
+
+ if let Ok(_) = client.zap(recipient, amount, Some(details)).await {
+ Ok(true)
+ } else {
+ Err("Zap profile failed".into())
+ }
+ } else {
+ Err("Parse public key failed".into())
+ }
+}
+
+#[tauri::command]
+pub async fn zap_event(
+ id: &str,
+ amount: u64,
+ message: &str,
+ state: State<'_, Nostr>,
+) -> Result {
+ let client = &state.client;
+ let event_id: Option = match Nip19::from_bech32(id) {
+ Ok(val) => match val {
+ Nip19::EventId(id) => Some(id),
+ Nip19::Event(event) => Some(event.event_id),
+ _ => None,
+ },
+ Err(_) => match EventId::from_hex(id) {
+ Ok(val) => Some(val),
+ Err(_) => None,
+ },
+ };
+
+ if let Some(recipient) = event_id {
+ let details = ZapDetails::new(ZapType::Public).message(message);
+
+ if let Ok(_) = client.zap(recipient, amount, Some(details)).await {
+ Ok(true)
+ } else {
+ Err("Zap event failed".into())
+ }
+ } else {
+ Err("Parse public key failed".into())
+ }
+}
diff --git a/src-tauri/src/nostr/relay.rs b/src-tauri/src/nostr/relay.rs
new file mode 100644
index 00000000..434feaaf
--- /dev/null
+++ b/src-tauri/src/nostr/relay.rs
@@ -0,0 +1,32 @@
+use crate::Nostr;
+use nostr_sdk::prelude::*;
+use tauri::State;
+
+#[tauri::command]
+pub async fn list_connected_relays(state: State<'_, Nostr>) -> Result, ()> {
+ let client = &state.client;
+ let relays = client.relays().await;
+ let list: Vec = relays.into_keys().collect();
+
+ Ok(list)
+}
+
+#[tauri::command]
+pub async fn connect_relay(relay: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ if let Ok(_) = client.add_relay(relay).await {
+ Ok(true)
+ } else {
+ Ok(false)
+ }
+}
+
+#[tauri::command]
+pub async fn remove_relay(relay: &str, state: State<'_, Nostr>) -> Result {
+ let client = &state.client;
+ if let Ok(_) = client.remove_relay(relay).await {
+ Ok(true)
+ } else {
+ Ok(false)
+ }
+}
diff --git a/src-tauri/src/tray.rs b/src-tauri/src/tray.rs
new file mode 100644
index 00000000..d1716725
--- /dev/null
+++ b/src-tauri/src/tray.rs
@@ -0,0 +1,40 @@
+use tauri::{tray::ClickType, Manager, Runtime};
+
+pub fn create_tray(app: &tauri::AppHandle) -> tauri::Result<()> {
+ let menu = tauri::menu::MenuBuilder::new(app)
+ .item(&tauri::menu::MenuItem::with_id(app, "quit", "Quit", true, None::<&str>).unwrap())
+ .build()
+ .unwrap();
+
+ let tray = tauri::tray::TrayIconBuilder::with_id("main_tray")
+ .tooltip("Lume")
+ .icon(tauri::Icon::Rgba {
+ rgba: include_bytes!("../icons/icon.png").to_vec(),
+ width: 500,
+ height: 500,
+ })
+ .icon_as_template(true)
+ .menu(&menu)
+ .build(app)
+ .unwrap();
+
+ tray.on_menu_event(move |app, event| match event.id.0.as_str() {
+ "quit" => {
+ let handle = app.app_handle();
+ handle.exit(0);
+ }
+ _ => {}
+ });
+
+ tray.on_tray_icon_event(|tray, event| {
+ if event.click_type == ClickType::Left {
+ let app = tray.app_handle();
+ if let Some(window) = app.get_webview_window("main") {
+ let _ = window.show();
+ let _ = window.set_focus();
+ }
+ }
+ });
+
+ Ok(())
+}
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
index 9c5a8427..94fd20ac 100644
--- a/src-tauri/tauri.conf.json
+++ b/src-tauri/tauri.conf.json
@@ -1,125 +1,110 @@
{
- "$schema": "../node_modules/@tauri-apps/cli/schema.json",
- "build": {
- "beforeBuildCommand": "pnpm run build",
- "beforeDevCommand": "pnpm run dev",
- "devPath": "http://localhost:3000",
- "distDir": "../dist",
- "withGlobalTauri": true
- },
- "package": {
- "productName": "Lume",
- "version": "3.0.1"
- },
- "plugins": {
- "fs": {
- "scope": [
- "$APPDATA/*",
- "$DATA/*",
- "$LOCALDATA/*",
- "$DESKTOP/*",
- "$DOCUMENT/*",
- "$DOWNLOAD/*",
- "$HOME/*",
- "$PICTURE/*",
- "$PUBLIC/*",
- "$VIDEO/*",
- "$RESOURCE",
- "$RESOURCE/*",
- "$RESOURCE/**",
- "$RESOURCE/locales/*"
- ]
- },
- "http": {
- "scope": ["http://**/", "https://**/"]
- },
- "shell": {
- "open": true,
- "scope": []
- },
- "updater": {
- "endpoints": [
- "https://lus.reya3772.workers.dev/v1/{{target}}/{{arch}}/{{current_version}}",
- "https://lus.reya3772.workers.dev/{{target}}/{{current_version}}"
- ]
- }
- },
- "tauri": {
- "bundle": {
- "active": true,
- "category": "SocialNetworking",
- "deb": {
- "depends": []
- },
- "externalBin": [],
- "resources": ["resources/*", "./locales/*"],
- "icon": [
- "icons/32x32.png",
- "icons/128x128.png",
- "icons/128x128@2x.png",
- "icons/icon.icns",
- "icons/icon.ico"
- ],
- "copyright": "",
- "identifier": "nu.lume.Lume",
- "longDescription": "nostr client for desktop",
- "shortDescription": "nostr client",
- "targets": "all",
- "updater": {
- "active": true,
- "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEU3OTdCMkM3RjU5QzE2NzkKUldSNUZwejF4N0tYNTVHYjMrU0JkL090SlEyNUVLYU5TM2hTU3RXSWtEWngrZWJ4a0pydUhXZHEK",
- "windows": {
- "installMode": "quiet"
- }
- },
- "appimage": {
- "bundleMediaFramework": true
- },
- "rpm": {
- "epoch": 0,
- "files": {},
- "release": "1"
- },
- "macOS": {
- "entitlements": null,
- "exceptionDomain": "",
- "frameworks": [],
- "license": "../LICENSE",
- "minimumSystemVersion": "10.15.0",
- "providerShortName": null,
- "signingIdentity": null
- },
- "windows": {
- "certificateThumbprint": null,
- "digestAlgorithm": "sha256",
- "timestampUrl": ""
- }
- },
- "security": {
- "assetProtocol": {
- "enable": true,
- "scope": [
- "$APPDATA/*",
- "$DATA/*",
- "$LOCALDATA/*",
- "$DESKTOP/*",
- "$DOCUMENT/*",
- "$DOWNLOAD/*",
- "$HOME/*",
- "$PICTURE/*",
- "$PUBLIC/*",
- "$VIDEO/*",
- "$APPCONFIG/*",
- "$RESOURCE/*"
- ]
- },
- "dangerousDisableAssetCspModification": false,
- "dangerousRemoteDomainIpcAccess": [],
- "freezePrototype": false
- },
- "trayIcon": {
- "iconPath": "icons/tray.png"
- },
- "macOSPrivateApi": true
- }
+ "$schema": "../node_modules/@tauri-apps/cli/schema.json",
+ "productName": "Lume",
+ "version": "3.0.1",
+ "identifier": "nu.lume.Lume",
+ "build": {
+ "beforeBuildCommand": "pnpm run build",
+ "beforeDevCommand": "pnpm desktop:dev",
+ "devUrl": "http://localhost:3000",
+ "frontendDist": "../dist"
+ },
+ "app": {
+ "macOSPrivateApi": true,
+ "withGlobalTauri": true,
+ "security": {
+ "assetProtocol": {
+ "enable": true,
+ "scope": [
+ "$APPDATA/*",
+ "$DATA/*",
+ "$LOCALDATA/*",
+ "$DESKTOP/*",
+ "$DOCUMENT/*",
+ "$DOWNLOAD/*",
+ "$HOME/*",
+ "$PICTURE/*",
+ "$PUBLIC/*",
+ "$VIDEO/*",
+ "$APPCONFIG/*",
+ "$RESOURCE/*"
+ ]
+ }
+ }
+ },
+ "bundle": {
+ "licenseFile": "../LICENSE",
+ "longDescription": "nostr client for desktop",
+ "shortDescription": "nostr client",
+ "targets": "all",
+ "active": true,
+ "category": "SocialNetworking",
+ "resources": ["resources/*", "./locales/*"],
+ "icon": [
+ "icons/32x32.png",
+ "icons/128x128.png",
+ "icons/128x128@2x.png",
+ "icons/icon.icns",
+ "icons/icon.ico"
+ ],
+ "linux": {
+ "appimage": {
+ "bundleMediaFramework": true,
+ "files": {}
+ },
+ "deb": {
+ "files": {}
+ },
+ "rpm": {
+ "epoch": 0,
+ "files": {},
+ "release": "1"
+ }
+ },
+ "macOS": {
+ "dmg": {
+ "appPosition": {
+ "x": 180,
+ "y": 170
+ },
+ "applicationFolderPosition": {
+ "x": 480,
+ "y": 170
+ },
+ "windowSize": {
+ "height": 400,
+ "width": 660
+ }
+ },
+ "files": {},
+ "minimumSystemVersion": "10.15"
+ },
+ "windows": {
+ "allowDowngrades": true,
+ "certificateThumbprint": null,
+ "digestAlgorithm": "sha256",
+ "nsis": null,
+ "timestampUrl": null,
+ "tsp": false,
+ "webviewFixedRuntimePath": null,
+ "webviewInstallMode": {
+ "silent": true,
+ "type": "downloadBootstrapper"
+ },
+ "wix": null
+ }
+ },
+ "plugins": {
+ "updater": {
+ "active": true,
+ "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEU3OTdCMkM3RjU5QzE2NzkKUldSNUZwejF4N0tYNTVHYjMrU0JkL090SlEyNUVLYU5TM2hTU3RXSWtEWngrZWJ4a0pydUhXZHEK",
+ "windows": {
+ "installMode": "quiet"
+ },
+ "endpoints": [
+ "https://lus.reya3772.workers.dev/v1/{{target}}/{{arch}}/{{current_version}}",
+ "https://lus.reya3772.workers.dev/{{target}}/{{current_version}}"
+ ]
+ }
+ }
}
diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json
index 229bd3cc..0712704c 100644
--- a/src-tauri/tauri.linux.conf.json
+++ b/src-tauri/tauri.linux.conf.json
@@ -1,19 +1,17 @@
{
- "$schema": "../node_modules/@tauri-apps/cli/schema.json",
- "tauri": {
- "windows": [
- {
- "width": 1080,
- "height": 800,
- "minWidth": 1080,
- "minHeight": 800,
- "resizable": true,
- "title": "Lume",
- "center": true,
- "fullscreen": false,
- "fileDropEnabled": true,
- "decorations": true
- }
- ]
- }
+ "$schema": "../node_modules/@tauri-apps/cli/schema.json",
+ "app": {
+ "windows": [
+ {
+ "title": "Lume",
+ "label": "main",
+ "titleBarStyle": "Overlay",
+ "width": 1080,
+ "height": 800,
+ "minWidth": 1080,
+ "minHeight": 800,
+ "center": true
+ }
+ ]
+ }
}
diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json
index e0cb1d5e..7f0b505b 100644
--- a/src-tauri/tauri.macos.conf.json
+++ b/src-tauri/tauri.macos.conf.json
@@ -1,25 +1,19 @@
{
- "$schema": "../node_modules/@tauri-apps/cli/schema.json",
- "tauri": {
- "windows": [
- {
- "width": 1080,
- "height": 800,
- "minWidth": 1080,
- "minHeight": 800,
- "resizable": true,
- "title": "Lume",
- "titleBarStyle": "Overlay",
- "center": true,
- "fullscreen": false,
- "hiddenTitle": true,
- "fileDropEnabled": true,
- "decorations": true,
- "transparent": true,
- "windowEffects": {
- "effects": ["sidebar"]
- }
- }
- ]
- }
+ "$schema": "../node_modules/@tauri-apps/cli/schema.json",
+ "app": {
+ "windows": [
+ {
+ "title": "Lume",
+ "label": "main",
+ "titleBarStyle": "Overlay",
+ "width": 1080,
+ "height": 800,
+ "minWidth": 1080,
+ "minHeight": 800,
+ "center": true,
+ "hiddenTitle": true,
+ "decorations": true
+ }
+ ]
+ }
}
diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json
index 8472ef4a..4afd7720 100644
--- a/src-tauri/tauri.windows.conf.json
+++ b/src-tauri/tauri.windows.conf.json
@@ -1,20 +1,16 @@
{
- "$schema": "../node_modules/@tauri-apps/cli/schema.json",
- "tauri": {
- "windows": [
- {
- "width": 1080,
- "height": 800,
- "minWidth": 1080,
- "minHeight": 800,
- "resizable": true,
- "title": "Lume",
- "center": true,
- "fullscreen": false,
- "hiddenTitle": true,
- "fileDropEnabled": true,
- "decorations": false
- }
- ]
- }
+ "$schema": "../node_modules/@tauri-apps/cli/schema.json",
+ "app": {
+ "windows": [
+ {
+ "title": "Lume",
+ "label": "main",
+ "width": 1080,
+ "height": 800,
+ "minWidth": 1080,
+ "minHeight": 800,
+ "center": true
+ }
+ ]
+ }
}
diff --git a/turbo.json b/turbo.json
index b30f8f39..16a57f16 100644
--- a/turbo.json
+++ b/turbo.json
@@ -2,10 +2,12 @@
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
- "outputs": ["dist/**"]
+ "outputs": ["dist/**"],
+ "cache": false
},
"dev": {
- "cache": true
+ "cache": false,
+ "persistent": true
},
"type-check": {}
}