From 42eb882f527b92320528948bf4085f4a1627d50e Mon Sep 17 00:00:00 2001 From: reya Date: Fri, 27 Oct 2023 17:45:08 +0700 Subject: [PATCH 01/14] update dependencies --- package.json | 57 +- pnpm-lock.yaml | 2199 +++++++++++----------- src-tauri/Cargo.lock | 471 ++--- src-tauri/Cargo.toml | 2 - src-tauri/src/main.rs | 2 - src/libs/storage/instance.ts | 2 +- src/shared/avatarUploader.tsx | 1 + src/shared/bannerUploader.tsx | 1 + src/shared/notes/actions/zap.tsx | 2 +- src/shared/notes/kinds/articleDetail.tsx | 3 +- src/shared/notes/kinds/text.tsx | 5 +- src/shared/user.tsx | 3 +- src/utils/hooks/useOpenGraph.ts | 2 +- 13 files changed, 1405 insertions(+), 1345 deletions(-) diff --git a/package.json b/package.json index affc0670..802ee3d6 100644 --- a/package.json +++ b/package.json @@ -32,22 +32,20 @@ "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-toolbar": "^1.0.4", "@radix-ui/react-tooltip": "^1.0.7", - "@tanstack/react-query": "4.36.1", - "@tauri-apps/api": "2.0.0-alpha.8", - "@tauri-apps/cli": "2.0.0-alpha.15", - "@tauri-apps/plugin-app": "2.0.0-alpha.1", - "@tauri-apps/plugin-clipboard-manager": "2.0.0-alpha.1", - "@tauri-apps/plugin-dialog": "2.0.0-alpha.1", - "@tauri-apps/plugin-fs": "2.0.0-alpha.1", - "@tauri-apps/plugin-http": "2.0.0-alpha.1", - "@tauri-apps/plugin-notification": "2.0.0-alpha.1", - "@tauri-apps/plugin-os": "2.0.0-alpha.2", - "@tauri-apps/plugin-process": "2.0.0-alpha.1", - "@tauri-apps/plugin-shell": "2.0.0-alpha.1", - "@tauri-apps/plugin-sql": "2.0.0-alpha.1", - "@tauri-apps/plugin-updater": "2.0.0-alpha.1", - "@tauri-apps/plugin-upload": "2.0.0-alpha.1", - "@tauri-apps/plugin-window": "2.0.0-alpha.1", + "@tanstack/react-query": "^5.0.5", + "@tauri-apps/api": "^2.0.0-alpha.9", + "@tauri-apps/cli": "^2.0.0-alpha.16", + "@tauri-apps/plugin-clipboard-manager": "^2.0.0-alpha.2", + "@tauri-apps/plugin-dialog": "^2.0.0-alpha.2", + "@tauri-apps/plugin-fs": "^2.0.0-alpha.2", + "@tauri-apps/plugin-http": "^2.0.0-alpha.2", + "@tauri-apps/plugin-notification": "^2.0.0-alpha.2", + "@tauri-apps/plugin-os": "^2.0.0-alpha.3", + "@tauri-apps/plugin-process": "^2.0.0-alpha.2", + "@tauri-apps/plugin-shell": "^2.0.0-alpha.2", + "@tauri-apps/plugin-sql": "^2.0.0-alpha.2", + "@tauri-apps/plugin-updater": "^2.0.0-alpha.2", + "@tauri-apps/plugin-upload": "^2.0.0-alpha.2", "@tiptap/extension-character-count": "^2.1.12", "@tiptap/extension-document": "^2.1.12", "@tiptap/extension-image": "^2.1.12", @@ -60,7 +58,7 @@ "@tiptap/starter-kit": "^2.1.12", "@tiptap/suggestion": "^2.1.12", "dayjs": "^1.11.10", - "destr": "^2.0.1", + "destr": "^2.0.2", "framer-motion": "^10.16.4", "html-to-text": "^9.0.5", "light-bolt11-decoder": "^3.0.0", @@ -77,48 +75,49 @@ "react-dom": "^18.2.0", "react-hook-form": "^7.47.0", "react-hotkeys-hook": "^4.4.1", - "react-markdown": "^8.0.7", + "react-markdown": "^9.0.0", "react-router-dom": "^6.17.0", "react-string-replace": "^1.1.1", "reactflow": "^11.9.4", - "remark-gfm": "^3.0.1", + "rehype-external-links": "^3.0.0", + "remark-gfm": "^4.0.0", "sonner": "^1.0.3", "tailwind-scrollbar": "^3.0.5", "tauri-controls": "^0.2.0", "tippy.js": "^6.3.7", "tiptap-markdown": "^0.8.2", - "virtua": "^0.15.0", - "zustand": "^4.4.3" + "virtua": "^0.15.4", + "zustand": "^4.4.4" }, "devDependencies": { "@tailwindcss/typography": "^0.5.10", - "@trivago/prettier-plugin-sort-imports": "^4.2.0", + "@trivago/prettier-plugin-sort-imports": "^4.2.1", "@types/html-to-text": "^9.0.3", - "@types/node": "^20.8.7", - "@types/react": "^18.2.29", + "@types/node": "^20.8.9", + "@types/react": "^18.2.33", "@types/react-dom": "^18.2.14", "@types/youtube-player": "^5.5.9", - "@typescript-eslint/eslint-plugin": "^6.8.0", - "@typescript-eslint/parser": "^6.8.0", + "@typescript-eslint/eslint-plugin": "^6.9.0", + "@typescript-eslint/parser": "^6.9.0", "@vitejs/plugin-react-swc": "^3.4.0", "autoprefixer": "^10.4.16", "clsx": "^2.0.0", "cross-env": "^7.0.3", "csstype": "^3.1.2", "encoding": "^0.1.13", - "eslint": "^8.51.0", + "eslint": "^8.52.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-react": "^7.33.2", "eslint-plugin-simple-import-sort": "^10.0.0", "husky": "^8.0.3", - "lint-staged": "^14.0.1", + "lint-staged": "^15.0.2", "postcss": "^8.4.31", "prettier": "^3.0.3", "prettier-plugin-tailwindcss": "^0.5.6", "prop-types": "^15.8.1", "tailwind-merge": "^1.14.0", - "tailwindcss": "^3.3.3", + "tailwindcss": "^3.3.5", "typescript": "^5.2.2", "vite": "^4.5.0", "vite-tsconfig-paths": "^4.2.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 05121e25..0736a890 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,79 +22,73 @@ dependencies: version: 0.13.0(@nostr-dev-kit/ndk@2.0.3)(nostr-fetch@0.13.0) '@radix-ui/react-alert-dialog': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-toolbar': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': - specifier: 4.36.1 - version: 4.36.1(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.0.5 + version: 5.0.5(react-dom@18.2.0)(react@18.2.0) '@tauri-apps/api': - specifier: 2.0.0-alpha.8 - version: 2.0.0-alpha.8 + specifier: ^2.0.0-alpha.9 + version: 2.0.0-alpha.9 '@tauri-apps/cli': - specifier: 2.0.0-alpha.15 - version: 2.0.0-alpha.15 - '@tauri-apps/plugin-app': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 + specifier: ^2.0.0-alpha.16 + version: 2.0.0-alpha.16 '@tauri-apps/plugin-clipboard-manager': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 - '@tauri-apps/plugin-dialog': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 - '@tauri-apps/plugin-fs': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 - '@tauri-apps/plugin-http': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 - '@tauri-apps/plugin-notification': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 - '@tauri-apps/plugin-os': - specifier: 2.0.0-alpha.2 + specifier: ^2.0.0-alpha.2 version: 2.0.0-alpha.2 + '@tauri-apps/plugin-dialog': + specifier: ^2.0.0-alpha.2 + version: 2.0.0-alpha.2 + '@tauri-apps/plugin-fs': + specifier: ^2.0.0-alpha.2 + version: 2.0.0-alpha.2 + '@tauri-apps/plugin-http': + specifier: ^2.0.0-alpha.2 + version: 2.0.0-alpha.2 + '@tauri-apps/plugin-notification': + specifier: ^2.0.0-alpha.2 + version: 2.0.0-alpha.2 + '@tauri-apps/plugin-os': + specifier: ^2.0.0-alpha.3 + version: 2.0.0-alpha.3 '@tauri-apps/plugin-process': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 + specifier: ^2.0.0-alpha.2 + version: 2.0.0-alpha.2 '@tauri-apps/plugin-shell': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 + specifier: ^2.0.0-alpha.2 + version: 2.0.0-alpha.2 '@tauri-apps/plugin-sql': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 + specifier: ^2.0.0-alpha.2 + version: 2.0.0-alpha.2 '@tauri-apps/plugin-updater': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 + specifier: ^2.0.0-alpha.2 + version: 2.0.0-alpha.2 '@tauri-apps/plugin-upload': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 - '@tauri-apps/plugin-window': - specifier: 2.0.0-alpha.1 - version: 2.0.0-alpha.1 + specifier: ^2.0.0-alpha.2 + version: 2.0.0-alpha.2 '@tiptap/extension-character-count': specifier: ^2.1.12 version: 2.1.12(@tiptap/core@2.1.12)(@tiptap/pm@2.1.12) @@ -132,8 +126,8 @@ dependencies: specifier: ^1.11.10 version: 1.11.10 destr: - specifier: ^2.0.1 - version: 2.0.1 + specifier: ^2.0.2 + version: 2.0.2 framer-motion: specifier: ^10.16.4 version: 10.16.4(react-dom@18.2.0)(react@18.2.0) @@ -183,8 +177,8 @@ dependencies: specifier: ^4.4.1 version: 4.4.1(react-dom@18.2.0)(react@18.2.0) react-markdown: - specifier: ^8.0.7 - version: 8.0.7(@types/react@18.2.29)(react@18.2.0) + specifier: ^9.0.0 + version: 9.0.0(@types/react@18.2.33)(react@18.2.0) react-router-dom: specifier: ^6.17.0 version: 6.17.0(react-dom@18.2.0)(react@18.2.0) @@ -193,19 +187,22 @@ dependencies: version: 1.1.1 reactflow: specifier: ^11.9.4 - version: 11.9.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + version: 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + rehype-external-links: + specifier: ^3.0.0 + version: 3.0.0 remark-gfm: - specifier: ^3.0.1 - version: 3.0.1 + specifier: ^4.0.0 + version: 4.0.0 sonner: specifier: ^1.0.3 version: 1.0.3(react-dom@18.2.0)(react@18.2.0) tailwind-scrollbar: specifier: ^3.0.5 - version: 3.0.5(tailwindcss@3.3.3) + version: 3.0.5(tailwindcss@3.3.5) tauri-controls: specifier: ^0.2.0 - version: 0.2.0(@tauri-apps/plugin-os@2.0.0-alpha.2)(@tauri-apps/plugin-window@2.0.0-alpha.1)(clsx@2.0.0)(react-dom@18.2.0)(react@18.2.0)(tailwind-merge@1.14.0) + version: 0.2.0(@tauri-apps/plugin-os@2.0.0-alpha.3)(@tauri-apps/plugin-window@2.0.0-alpha.1)(clsx@2.0.0)(react-dom@18.2.0)(react@18.2.0)(tailwind-merge@1.14.0) tippy.js: specifier: ^6.3.7 version: 6.3.7 @@ -213,28 +210,28 @@ dependencies: specifier: ^0.8.2 version: 0.8.2(@tiptap/core@2.1.12) virtua: - specifier: ^0.15.0 - version: 0.15.0(react-dom@18.2.0)(react@18.2.0) + specifier: ^0.15.4 + version: 0.15.4(react-dom@18.2.0)(react@18.2.0) zustand: - specifier: ^4.4.3 - version: 4.4.3(@types/react@18.2.29)(react@18.2.0) + specifier: ^4.4.4 + version: 4.4.4(@types/react@18.2.33)(react@18.2.0) devDependencies: '@tailwindcss/typography': specifier: ^0.5.10 - version: 0.5.10(tailwindcss@3.3.3) + version: 0.5.10(tailwindcss@3.3.5) '@trivago/prettier-plugin-sort-imports': - specifier: ^4.2.0 - version: 4.2.0(prettier@3.0.3) + specifier: ^4.2.1 + version: 4.2.1(prettier@3.0.3) '@types/html-to-text': specifier: ^9.0.3 version: 9.0.3 '@types/node': - specifier: ^20.8.7 - version: 20.8.7 + specifier: ^20.8.9 + version: 20.8.9 '@types/react': - specifier: ^18.2.29 - version: 18.2.29 + specifier: ^18.2.33 + version: 18.2.33 '@types/react-dom': specifier: ^18.2.14 version: 18.2.14 @@ -242,11 +239,11 @@ devDependencies: specifier: ^5.5.9 version: 5.5.9 '@typescript-eslint/eslint-plugin': - specifier: ^6.8.0 - version: 6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2) + specifier: ^6.9.0 + version: 6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.52.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^6.8.0 - version: 6.8.0(eslint@8.51.0)(typescript@5.2.2) + specifier: ^6.9.0 + version: 6.9.0(eslint@8.52.0)(typescript@5.2.2) '@vitejs/plugin-react-swc': specifier: ^3.4.0 version: 3.4.0(vite@4.5.0) @@ -266,26 +263,26 @@ devDependencies: specifier: ^0.1.13 version: 0.1.13 eslint: - specifier: ^8.51.0 - version: 8.51.0 + specifier: ^8.52.0 + version: 8.52.0 eslint-config-prettier: specifier: ^9.0.0 - version: 9.0.0(eslint@8.51.0) + version: 9.0.0(eslint@8.52.0) eslint-plugin-jsx-a11y: specifier: ^6.7.1 - version: 6.7.1(eslint@8.51.0) + version: 6.7.1(eslint@8.52.0) eslint-plugin-react: specifier: ^7.33.2 - version: 7.33.2(eslint@8.51.0) + version: 7.33.2(eslint@8.52.0) eslint-plugin-simple-import-sort: specifier: ^10.0.0 - version: 10.0.0(eslint@8.51.0) + version: 10.0.0(eslint@8.52.0) husky: specifier: ^8.0.3 version: 8.0.3 lint-staged: - specifier: ^14.0.1 - version: 14.0.1 + specifier: ^15.0.2 + version: 15.0.2 postcss: specifier: ^8.4.31 version: 8.4.31 @@ -294,7 +291,7 @@ devDependencies: version: 3.0.3 prettier-plugin-tailwindcss: specifier: ^0.5.6 - version: 0.5.6(@trivago/prettier-plugin-sort-imports@4.2.0)(prettier@3.0.3) + version: 0.5.6(@trivago/prettier-plugin-sort-imports@4.2.1)(prettier@3.0.3) prop-types: specifier: ^15.8.1 version: 15.8.1 @@ -302,14 +299,14 @@ devDependencies: specifier: ^1.14.0 version: 1.14.0 tailwindcss: - specifier: ^3.3.3 - version: 3.3.3 + specifier: ^3.3.5 + version: 3.3.5 typescript: specifier: ^5.2.2 version: 5.2.2 vite: specifier: ^4.5.0 - version: 4.5.0(@types/node@20.8.7) + version: 4.5.0(@types/node@20.8.9) vite-tsconfig-paths: specifier: ^4.2.1 version: 4.2.1(typescript@5.2.2)(vite@4.5.0) @@ -385,7 +382,6 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 - dev: false /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} @@ -527,24 +523,6 @@ packages: '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - /@babel/traverse@7.17.3: - resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.17.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.17.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/traverse@7.23.2: resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} @@ -561,7 +539,6 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: false /@babel/types@7.17.0: resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} @@ -790,18 +767,18 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.51.0 + eslint: 8.52.0 eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.9.1: - resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -822,8 +799,8 @@ packages: - supports-color dev: true - /@eslint/js@8.51.0: - resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} + /@eslint/js@8.52.0: + resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -863,16 +840,16 @@ packages: resolution: {integrity: sha512-MRLgI6WxCCLgrar+qDqm/UhKs+V6yXzNm4y1bJRAuN72nkKT+TjTJHCmk9GjTngR3FrOfLbeMsPwBxCmbvfrLQ==} engines: {node: '>=14'} dependencies: - crypto-js: 4.1.1 + crypto-js: 4.2.0 events: 3.3.0 nostr-tools: 1.13.1 dev: false - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -884,8 +861,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true /@jridgewell/gen-mapping@0.3.3: @@ -1021,7 +998,7 @@ packages: '@babel/runtime': 7.23.2 dev: false - /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} peerDependencies: '@types/react': '*' @@ -1036,18 +1013,18 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -1061,14 +1038,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} peerDependencies: '@types/react': '*' @@ -1082,17 +1059,17 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: '@types/react': '*' @@ -1107,20 +1084,20 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' @@ -1134,17 +1111,17 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.29)(react@18.2.0): + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -1154,11 +1131,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.29 + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-context@1.0.1(@types/react@18.2.29)(react@18.2.0): + /@radix-ui/react-context@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -1168,11 +1145,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.29 + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: '@types/react': '*' @@ -1187,26 +1164,26 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.29)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) dev: false - /@radix-ui/react-direction@1.0.1(@types/react@18.2.29)(react@18.2.0): + /@radix-ui/react-direction@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: '@types/react': '*' @@ -1216,11 +1193,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.29 + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' @@ -1235,17 +1212,17 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} peerDependencies: '@types/react': '*' @@ -1260,19 +1237,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.29)(react@18.2.0): + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -1282,11 +1259,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.29 + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: '@types/react': '*' @@ -1300,16 +1277,16 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A==} peerDependencies: '@types/react': '*' @@ -1324,21 +1301,21 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.29)(react@18.2.0): + /@radix-ui/react-id@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -1348,12 +1325,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} peerDependencies: '@types/react': '*' @@ -1368,30 +1345,30 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.29)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) dev: false - /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} peerDependencies: '@types/react': '*' @@ -1406,27 +1383,27 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.29)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) dev: false - /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: '@types/react': '*' @@ -1441,22 +1418,22 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.29)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.29 + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: '@types/react': '*' @@ -1470,14 +1447,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -1491,15 +1468,15 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -1513,14 +1490,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: '@types/react': '*' @@ -1535,21 +1512,21 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} peerDependencies: '@types/react': '*' @@ -1563,14 +1540,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-slot@1.0.2(@types/react@18.2.29)(react@18.2.0): + /@radix-ui/react-slot@1.0.2(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -1580,12 +1557,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} peerDependencies: '@types/react': '*' @@ -1600,19 +1577,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} peerDependencies: '@types/react': '*' @@ -1627,15 +1604,15 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==} peerDependencies: '@types/react': '*' @@ -1650,19 +1627,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} peerDependencies: '@types/react': '*' @@ -1677,24 +1654,24 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 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.29)(react@18.2.0): + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: '@types/react': '*' @@ -1704,11 +1681,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.29 + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.29)(react@18.2.0): + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: '@types/react': '*' @@ -1718,12 +1695,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.29)(react@18.2.0): + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: '@types/react': '*' @@ -1733,12 +1710,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.29)(react@18.2.0): + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: '@types/react': '*' @@ -1748,11 +1725,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.29 + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.29)(react@18.2.0): + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: '@types/react': '*' @@ -1763,11 +1740,11 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.29 + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.29)(react@18.2.0): + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' @@ -1777,12 +1754,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.29)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 react: 18.2.0 dev: false - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: '@types/react': '*' @@ -1796,8 +1773,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.29 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -1809,39 +1786,39 @@ packages: '@babel/runtime': 7.23.2 dev: false - /@reactflow/background@11.3.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/background@11.3.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-bgwvqWxF09chwmdkyClpYEMaewBspdwjgLbbFlLf4SpWPFMYyuvCBQrcISsvy/EDEWO9i3Uj9ktgGAhvtSQsmA==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.9.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.29)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/controls@11.2.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/controls@11.2.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-x6e5p9iHjC6gd+4SoZ3DOOp0F1MefGKQ8hT6yPVdqxfo1+rV2WhrWvrX/MCoEu12Dp7457LdLfa0giy3aho8tQ==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.9.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.29)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/core@11.9.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/core@11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Ko7nKPOYalwDTTbRHi2+QXDiidSAcpUzGN3G+0B+QysLZkcaPCkpkMjjHiDC4c/Z1BJBzs1FRJg/T6BXaBnYkg==} peerDependencies: react: '>=17' @@ -1857,19 +1834,19 @@ packages: d3-zoom: 3.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.29)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/minimap@11.7.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/minimap@11.7.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Jo1R+uDey9IV7O2s3m0gK2+cZpg9M8hq2EZJb3NGfOSzMAPhj3mby0fNJIgTzycreuht0TpA51c2YfjGI3YIOw==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.9.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@types/d3-selection': 3.0.8 '@types/d3-zoom': 3.0.6 classcat: 5.0.4 @@ -1877,41 +1854,41 @@ packages: d3-zoom: 3.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.29)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/node-resizer@2.2.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/node-resizer@2.2.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+p271/hAsM5M1+RQTWW/02pbNkCHeGXwxGimIlL1tMIagyuko0NX2vOz2B8jxJnPKlF09Wj18BcXBNUm3nDcSg==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.9.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 d3-drag: 3.0.0 d3-selection: 3.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.29)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/node-toolbar@1.3.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/node-toolbar@1.3.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-TfcmpXHRBb2mUfzKGjburiU6FWqRME9pPFs1OwIC1z5e9BjupQhNDEKEk8XHi7PKL/mAiDfwuGXaM1BVVFuPqw==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.9.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.29)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer @@ -1980,8 +1957,8 @@ packages: selderee: 0.11.0 dev: false - /@swc/core-darwin-arm64@1.3.93: - resolution: {integrity: sha512-gEKgk7FVIgltnIfDO6GntyuQBBlAYg5imHpRgLxB1zSI27ijVVkksc6QwISzFZAhKYaBWIsFSVeL9AYSziAF7A==} + /@swc/core-darwin-arm64@1.3.95: + resolution: {integrity: sha512-VAuBAP3MNetO/yBIBzvorUXq7lUBwhfpJxYViSxyluMwtoQDhE/XWN598TWMwMl1ZuImb56d7eUsuFdjgY7pJw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -1989,8 +1966,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.3.93: - resolution: {integrity: sha512-ZQPxm/fXdDQtn3yrYSL/gFfA8OfZ5jTi33yFQq6vcg/Y8talpZ+MgdSlYM0FkLrZdMTYYTNFiuBQuuvkA+av+Q==} + /@swc/core-darwin-x64@1.3.95: + resolution: {integrity: sha512-20vF2rvUsN98zGLZc+dsEdHvLoCuiYq/1B+TDeE4oolgTFDmI1jKO+m44PzWjYtKGU9QR95sZ6r/uec0QC5O4Q==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -1998,8 +1975,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.93: - resolution: {integrity: sha512-OYFMMI2yV+aNe3wMgYhODxHdqUB/jrK0SEMHHS44GZpk8MuBXEF+Mcz4qjkY5Q1EH7KVQqXb/gVWwdgTHpjM2A==} + /@swc/core-linux-arm-gnueabihf@1.3.95: + resolution: {integrity: sha512-oEudEM8PST1MRNGs+zu0cx5i9uP8TsLE4/L9HHrS07Ck0RJ3DCj3O2fU832nmLe2QxnAGPwBpSO9FntLfOiWEQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -2007,8 +1984,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.3.93: - resolution: {integrity: sha512-BT4dT78odKnJMNiq5HdjBsv29CiIdcCcImAPxeFqAeFw1LL6gh9nzI8E96oWc+0lVT5lfhoesCk4Qm7J6bty8w==} + /@swc/core-linux-arm64-gnu@1.3.95: + resolution: {integrity: sha512-pIhFI+cuC1aYg+0NAPxwT/VRb32f2ia8oGxUjQR6aJg65gLkUYQzdwuUmpMtFR2WVf7WVFYxUnjo4UyMuyh3ng==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -2016,8 +1993,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.3.93: - resolution: {integrity: sha512-yH5fWEl1bktouC0mhh0Chuxp7HEO4uCtS/ly1Vmf18gs6wZ8DOOkgAEVv2dNKIryy+Na++ljx4Ym7C8tSJTrLw==} + /@swc/core-linux-arm64-musl@1.3.95: + resolution: {integrity: sha512-ZpbTr+QZDT4OPJfjPAmScqdKKaT+wGurvMU5AhxLaf85DuL8HwUwwlL0n1oLieLc47DwIJEMuKQkYhXMqmJHlg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -2025,8 +2002,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.3.93: - resolution: {integrity: sha512-OFUdx64qvrGJhXKEyxosHxgoUVgba2ztYh7BnMiU5hP8lbI8G13W40J0SN3CmFQwPP30+3oEbW7LWzhKEaYjlg==} + /@swc/core-linux-x64-gnu@1.3.95: + resolution: {integrity: sha512-n9SuHEFtdfSJ+sHdNXNRuIOVprB8nbsz+08apKfdo4lEKq6IIPBBAk5kVhPhkjmg2dFVHVo4Tr/OHXM1tzWCCw==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -2034,8 +2011,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.3.93: - resolution: {integrity: sha512-4B8lSRwEq1XYm6xhxHhvHmKAS7pUp1Q7E33NQ2TlmFhfKvCOh86qvThcjAOo57x8DRwmpvEVrqvpXtYagMN6Ig==} + /@swc/core-linux-x64-musl@1.3.95: + resolution: {integrity: sha512-L1JrVlsXU3LC0WwmVnMK9HrOT2uhHahAoPNMJnZQpc18a0paO9fqifPG8M/HjNRffMUXR199G/phJsf326UvVg==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -2043,8 +2020,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.3.93: - resolution: {integrity: sha512-BHShlxtkven8ZjjvZ5QR6sC5fZCJ9bMujEkiha6W4cBUTY7ce7qGFyHmQd+iPC85d9kD/0cCiX/Xez8u0BhO7w==} + /@swc/core-win32-arm64-msvc@1.3.95: + resolution: {integrity: sha512-YaP4x/aZbUyNdqCBpC2zL8b8n58MEpOUpmOIZK6G1SxGi+2ENht7gs7+iXpWPc0sy7X3YPKmSWMAuui0h8lgAA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -2052,8 +2029,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.3.93: - resolution: {integrity: sha512-nEwNWnz4JzYAK6asVvb92yeylfxMYih7eMQOnT7ZVlZN5ba9WF29xJ6kcQKs9HRH6MvWhz9+wRgv3FcjlU6HYA==} + /@swc/core-win32-ia32-msvc@1.3.95: + resolution: {integrity: sha512-w0u3HI916zT4BC/57gOd+AwAEjXeUlQbGJ9H4p/gzs1zkSHtoDQghVUNy3n/ZKp9KFod/95cA8mbVF9t1+6epQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -2061,8 +2038,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.3.93: - resolution: {integrity: sha512-jibQ0zUr4kwJaQVwgmH+svS04bYTPnPw/ZkNInzxS+wFAtzINBYcU8s2PMWbDb2NGYiRSEeoSGyAvS9H+24JFA==} + /@swc/core-win32-x64-msvc@1.3.95: + resolution: {integrity: sha512-5RGnMt0S6gg4Gc6QtPUJ3Qs9Un4sKqccEzgH/tj7V/DVTJwKdnBKxFZfgQ34OR2Zpz7zGOn889xwsFVXspVWNA==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -2070,8 +2047,8 @@ packages: dev: true optional: true - /@swc/core@1.3.93: - resolution: {integrity: sha512-690GRr1wUGmGYZHk7fUduX/JUwViMF2o74mnZYIWEcJaCcd9MQfkhsxPBtjeg6tF+h266/Cf3RPYhsFBzzxXcA==} + /@swc/core@1.3.95: + resolution: {integrity: sha512-PMrNeuqIusq9DPDooV3FfNEbZuTu5jKAc04N3Hm6Uk2Fl49cqElLFQ4xvl4qDmVDz97n3n/C1RE0/f6WyGPEiA==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -2083,16 +2060,16 @@ packages: '@swc/counter': 0.1.2 '@swc/types': 0.1.5 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.93 - '@swc/core-darwin-x64': 1.3.93 - '@swc/core-linux-arm-gnueabihf': 1.3.93 - '@swc/core-linux-arm64-gnu': 1.3.93 - '@swc/core-linux-arm64-musl': 1.3.93 - '@swc/core-linux-x64-gnu': 1.3.93 - '@swc/core-linux-x64-musl': 1.3.93 - '@swc/core-win32-arm64-msvc': 1.3.93 - '@swc/core-win32-ia32-msvc': 1.3.93 - '@swc/core-win32-x64-msvc': 1.3.93 + '@swc/core-darwin-arm64': 1.3.95 + '@swc/core-darwin-x64': 1.3.95 + '@swc/core-linux-arm-gnueabihf': 1.3.95 + '@swc/core-linux-arm64-gnu': 1.3.95 + '@swc/core-linux-arm64-musl': 1.3.95 + '@swc/core-linux-x64-gnu': 1.3.95 + '@swc/core-linux-x64-musl': 1.3.95 + '@swc/core-win32-arm64-msvc': 1.3.95 + '@swc/core-win32-ia32-msvc': 1.3.95 + '@swc/core-win32-x64-msvc': 1.3.95 dev: true /@swc/counter@0.1.2: @@ -2103,7 +2080,7 @@ packages: resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} dev: true - /@tailwindcss/typography@0.5.10(tailwindcss@3.3.3): + /@tailwindcss/typography@0.5.10(tailwindcss@3.3.5): resolution: {integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' @@ -2112,18 +2089,18 @@ packages: lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.3.3 + tailwindcss: 3.3.5 dev: true - /@tanstack/query-core@4.36.1: - resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} + /@tanstack/query-core@5.0.5: + resolution: {integrity: sha512-MThCETMkHDHTnFZHp71L+SqTtD5d6XHftFCVR1xRJdWM3qGrlQ2VCXaj0SKVcyJej2e1Opa2c7iknu1llxCDNQ==} dev: false - /@tanstack/react-query@4.36.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} + /@tanstack/react-query@5.0.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ZG0Q4HZ0iuI8mWiZ2/MdVYPHbrmAVhMn7+gLOkxJh6zLIgCL4luSZlohzN5Xt4MjxfxxWioO1nemwpudaTsmQg==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 react-native: '*' peerDependenciesMeta: react-dom: @@ -2131,10 +2108,9 @@ packages: react-native: optional: true dependencies: - '@tanstack/query-core': 4.36.1 + '@tanstack/query-core': 5.0.5 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - use-sync-external-store: 1.2.0(react@18.2.0) dev: false /@tauri-apps/api@2.0.0-alpha.6: @@ -2147,8 +2123,13 @@ packages: engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} dev: false - /@tauri-apps/cli-darwin-arm64@2.0.0-alpha.15: - resolution: {integrity: sha512-PxmXanPZtSLtDJyEoj538//cauKoyc/sExAO0fTwJ+o8y2NZB/qQfpbdMIloQQnusRwh+6RjOr0Zs5Y6nBhO5Q==} + /@tauri-apps/api@2.0.0-alpha.9: + resolution: {integrity: sha512-Q5BiIQa2ToICdaJSYZdmtwbKSfdk+uQbQ7xMnbWI5C5C3frEVFlT92kVXgZFKIwrTLZBWHfiowkPR6rbFqAHIg==} + engines: {node: '>= 18', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + dev: false + + /@tauri-apps/cli-darwin-arm64@2.0.0-alpha.16: + resolution: {integrity: sha512-T/yu8+m4XrI1Ja5aVnsv4v5aGqIvwz1egHarMgh4LXrlMioJ60BoxDPfenaUokO6NVee212woFSmH6p4S7V8PA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -2156,8 +2137,8 @@ packages: dev: false optional: true - /@tauri-apps/cli-darwin-x64@2.0.0-alpha.15: - resolution: {integrity: sha512-IcJGd6mIwQQ9xQhmkNHWjERJoGYpZEknhWeU8a2MnuosX8c9O/zmKWey4ol2KPrumMdmbh8QZzPyh9986GmnUA==} + /@tauri-apps/cli-darwin-x64@2.0.0-alpha.16: + resolution: {integrity: sha512-mhYB/UPeyn++GI0Tt8y90WmHU75Fh9yZ7cBtRCrF94kOOEldQGYqS26dwhsRrSgnNYB7vYvVPhHzQsKWziParQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -2165,8 +2146,8 @@ packages: dev: false optional: true - /@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-alpha.15: - resolution: {integrity: sha512-zD88WJaEZ49BzgmIgj0RVFF/zKrB+NYHEDwmvt60eehQCPfnMuE5/asj0Gp4YJRZ07jZzDfzMCdTGbwWsLnZEA==} + /@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-alpha.16: + resolution: {integrity: sha512-YP+4BSNN2ESgPnoIO37nw5tOi2k2rrU2eoeJHxQpOmRrQakjBrcZFP1HGjY3cOturexIKUALH69Ol9K6WzrJIQ==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -2174,8 +2155,8 @@ packages: dev: false optional: true - /@tauri-apps/cli-linux-arm64-gnu@2.0.0-alpha.15: - resolution: {integrity: sha512-rmHIZsEb1RT5Ny4hjeK7LC3MRqWLZBfiKC29DX5UzhJySb9g0UeR2esx1PMX6kuU8DOC0RBr8xpEmoTNMtFJ3Q==} + /@tauri-apps/cli-linux-arm64-gnu@2.0.0-alpha.16: + resolution: {integrity: sha512-mP/I6AdlRnrbZBUMKJWo4JsZStYD+7szh/1oo4zmDfWx0z6HUzgN6gxL+CR0pLex4kCJGUNeo1aZCGBJKzEdHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2183,8 +2164,8 @@ packages: dev: false optional: true - /@tauri-apps/cli-linux-arm64-musl@2.0.0-alpha.15: - resolution: {integrity: sha512-l3oix62YRE/vjpdxWq38NwZ61yg1vCcGAdfHaSt+Um/ojZHudekchQx56sEh7IMxsHxEtipxZdNEb1WsyAa5JA==} + /@tauri-apps/cli-linux-arm64-musl@2.0.0-alpha.16: + resolution: {integrity: sha512-i58pTClYkn9BBhMShNycRUJD+cfxHs+PV5PPHhBJdi3+zpL0zHNTlZAjTMpO/o4hmTYhw1rbk+kPzXEaiAnt0w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2192,8 +2173,8 @@ packages: dev: false optional: true - /@tauri-apps/cli-linux-x64-gnu@2.0.0-alpha.15: - resolution: {integrity: sha512-m7jWcyA4URtfvM4ySN1G3mO6gQP0qULawP9henks/bcrx2DU5xFP7WFxUxQhlWEtjwtJOI/NscQfzUEE6igs+Q==} + /@tauri-apps/cli-linux-x64-gnu@2.0.0-alpha.16: + resolution: {integrity: sha512-GLb0+MvoC6/7l5HXhF3Ii1Uodg6K6l8tfSaQ7H8qplp9oVgMvNi8yd9myRT8SYApjsC1pViXTib+5n2pp3VS0A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2201,8 +2182,8 @@ packages: dev: false optional: true - /@tauri-apps/cli-linux-x64-musl@2.0.0-alpha.15: - resolution: {integrity: sha512-Xa4JTnYbebnLAMY7JdNuUDgnv/wWA4a8fbg1288kckq3aRXb+ETTV3Tlr/rnsx1s3TpECmSkXjTIvNecvsqjTA==} + /@tauri-apps/cli-linux-x64-musl@2.0.0-alpha.16: + resolution: {integrity: sha512-pZXuwVQpInzW8YjmhJsDPx3ovfVFbKJkUnXTgmVe8RvQSh6BxCSLyq8z4WG6zBRBdpjg8L5jVM8/MWf/QhdCVg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2210,8 +2191,8 @@ packages: dev: false optional: true - /@tauri-apps/cli-win32-arm64-msvc@2.0.0-alpha.15: - resolution: {integrity: sha512-YOKmqenjwQkwBesJ3rYWnJ2renRhPAWIdIoTRhMnDacRk28mMWizsGWLT7ZDbYi7AHMR6jMk0eYgAKKd+uBjFg==} + /@tauri-apps/cli-win32-arm64-msvc@2.0.0-alpha.16: + resolution: {integrity: sha512-YB1urpcOfSMRhKi+0Cj8I2T+dlU2Vqqc/ao+8O4wiHibGFyGIcuL/DJfC/7nHyFUngac7Shyz8/VRKgvd/jEvw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -2219,8 +2200,8 @@ packages: dev: false optional: true - /@tauri-apps/cli-win32-ia32-msvc@2.0.0-alpha.15: - resolution: {integrity: sha512-Z8yMn6jKSCN8atdWwIzHNoqd+kS684RpgFoZhftcxtqYDXfSgU63KLasKu2Wu12a/7TmXqHGHlEBst9nD2VSLw==} + /@tauri-apps/cli-win32-ia32-msvc@2.0.0-alpha.16: + resolution: {integrity: sha512-IdODN3LwzwCaJOv1muiOhy0yD3IAIdu2UGacEukM9gnJ1VsK/JqU9ufH0SAFQkxKTWc6wpKykEAfuSNRlMIa5A==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -2228,8 +2209,8 @@ packages: dev: false optional: true - /@tauri-apps/cli-win32-x64-msvc@2.0.0-alpha.15: - resolution: {integrity: sha512-fcIXUgI1PKeAj2cp7vvXDssWcXxhauCyvtJPmaCVl5pk+5aJlOSx5TPjv0BRyaIO8l4IPW1IakvTRcDvEAQHRw==} + /@tauri-apps/cli-win32-x64-msvc@2.0.0-alpha.16: + resolution: {integrity: sha512-T2kg6o3Ca5cC2i5BdjsGCym0yZ64c9BGO5cmtCCrIardMTYB3hUHDvekOmKviBfqQbIsBHGZfnLDDbmjnwTLvA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2237,93 +2218,87 @@ packages: dev: false optional: true - /@tauri-apps/cli@2.0.0-alpha.15: - resolution: {integrity: sha512-eMMD5MXJDt/j37IGBP501Ov3lux+mrA1WT4EjTk+Oaw4t8fb8ncb7yvbVZ6qyzVo7WHplIGKRzyV0CyZXZropQ==} + /@tauri-apps/cli@2.0.0-alpha.16: + resolution: {integrity: sha512-zh2psjmHLkoHZkzUN1aPqcOE4KTLRTRJdd+K8CsD/y5nbQdek8qjc8ToohV2FNHDkBq0O/yETsPmPPLgQfhVhg==} engines: {node: '>= 10'} hasBin: true optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.0.0-alpha.15 - '@tauri-apps/cli-darwin-x64': 2.0.0-alpha.15 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-alpha.15 - '@tauri-apps/cli-linux-arm64-gnu': 2.0.0-alpha.15 - '@tauri-apps/cli-linux-arm64-musl': 2.0.0-alpha.15 - '@tauri-apps/cli-linux-x64-gnu': 2.0.0-alpha.15 - '@tauri-apps/cli-linux-x64-musl': 2.0.0-alpha.15 - '@tauri-apps/cli-win32-arm64-msvc': 2.0.0-alpha.15 - '@tauri-apps/cli-win32-ia32-msvc': 2.0.0-alpha.15 - '@tauri-apps/cli-win32-x64-msvc': 2.0.0-alpha.15 + '@tauri-apps/cli-darwin-arm64': 2.0.0-alpha.16 + '@tauri-apps/cli-darwin-x64': 2.0.0-alpha.16 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-alpha.16 + '@tauri-apps/cli-linux-arm64-gnu': 2.0.0-alpha.16 + '@tauri-apps/cli-linux-arm64-musl': 2.0.0-alpha.16 + '@tauri-apps/cli-linux-x64-gnu': 2.0.0-alpha.16 + '@tauri-apps/cli-linux-x64-musl': 2.0.0-alpha.16 + '@tauri-apps/cli-win32-arm64-msvc': 2.0.0-alpha.16 + '@tauri-apps/cli-win32-ia32-msvc': 2.0.0-alpha.16 + '@tauri-apps/cli-win32-x64-msvc': 2.0.0-alpha.16 dev: false - /@tauri-apps/plugin-app@2.0.0-alpha.1: - resolution: {integrity: sha512-DKlbG4ymoa8xDKdK36adPlZYeY8wcDQfi/XJG4qxhK6YC4GLrM1sG5eQgjVKheDI6wDQC5CiUjhnvddXVFUPTg==} + /@tauri-apps/plugin-clipboard-manager@2.0.0-alpha.2: + resolution: {integrity: sha512-NLs8rHLoWXJWGA+I5fVbQIscsRpndjA9ueEm6FjFl3PrfVIft3rW5qck3l0qDIjmtWPm5xDvzZP3VDcpfm93xg==} dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 + '@tauri-apps/api': 2.0.0-alpha.9 dev: false - /@tauri-apps/plugin-clipboard-manager@2.0.0-alpha.1: - resolution: {integrity: sha512-zXybHu31RCx58ZGU7/kUHcvoXW2AX6kBXBZsKHv4rYe7Z869WmDLDC7iU23/dAJLu7xAPTJzJ/HbeMfbrfJ4hg==} + /@tauri-apps/plugin-dialog@2.0.0-alpha.2: + resolution: {integrity: sha512-tsMXiDR5mS+gL80xtKRSDPtBlnoywboIpDsEEzTyE8UZsngEXVQL4xsIF8qfMub5VIOt0iCcLGiPwU4pm7a3Wg==} dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 + '@tauri-apps/api': 2.0.0-alpha.9 dev: false - /@tauri-apps/plugin-dialog@2.0.0-alpha.1: - resolution: {integrity: sha512-Fqv7zB7qvR6DkcH1dafHcRRNWRSFwj637/G2MQ+kKrmk1ErfV95lcYjpIhmUaETQSPKeogSI6A78kSnO89cvHQ==} + /@tauri-apps/plugin-fs@2.0.0-alpha.2: + resolution: {integrity: sha512-8wt4I53gtU7iAtAAMLxihPl5w91Zh99iSpzdxJDIDShcglYMMXU/xmSiIE4CF6ccw68AH0j7dKqSYPELVRy/dg==} dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 + '@tauri-apps/api': 2.0.0-alpha.9 dev: false - /@tauri-apps/plugin-fs@2.0.0-alpha.1: - resolution: {integrity: sha512-snIDRAFgg3vi73TwiDQkM3+zBTDRvBXgGd7BAsSW7MQ+/3cJM4XcyPcYkv9X6jpgIiQrbWsDGs/KM4ob247K7A==} + /@tauri-apps/plugin-http@2.0.0-alpha.2: + resolution: {integrity: sha512-PceQGKaVxX+ziFYAzjDKdCEHC61NJE3QSZAwtG9cFWl75BkGxzh8ZuRqryYTPtNtD/fonOI4KDiqAeaXXJQNKQ==} dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 + '@tauri-apps/api': 2.0.0-alpha.9 dev: false - /@tauri-apps/plugin-http@2.0.0-alpha.1: - resolution: {integrity: sha512-Ss9tR7JWmOcQEbHRdXXjjd+3nIPurqvuJwduIFrU3z0DQ0A+gtWVgyNMrQm+PAtJvw7FZlZDt8YMNIi7eEkJHg==} + /@tauri-apps/plugin-notification@2.0.0-alpha.2: + resolution: {integrity: sha512-B3+KvlBgcEaDX818dj1yaS1hUqwEOAS1WjPYEU/1wOm2im3tbsop/18dRAfD5zykXHn1EFRclU73xpzz9816yA==} dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 + '@tauri-apps/api': 2.0.0-alpha.9 dev: false - /@tauri-apps/plugin-notification@2.0.0-alpha.1: - resolution: {integrity: sha512-/U046gKo0RsPsi7OTQEuu2ezWrhBNheTMA+iyMWb65N9mMSORul66Y1oKXzJOqeMsSQcL4V+WPz+6wzMGHY7lQ==} + /@tauri-apps/plugin-os@2.0.0-alpha.3: + resolution: {integrity: sha512-a2P3/Kv0KittnyKG7deBPqRz9HjyH7rwMicgYzFYk9Ye0hpEVEJq30bxo0dUi+UTZV96L2yO/hp8medcDI6rrw==} dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 + '@tauri-apps/api': 2.0.0-alpha.9 dev: false - /@tauri-apps/plugin-os@2.0.0-alpha.2: - resolution: {integrity: sha512-5N20UFcgx+d415xupGfxb4vS7L/cx0X+I6DlJJ+xuO1y123+NLthFpnXxU3XH2TZXIZ36Rkfqz5uZO+xf+9JUQ==} + /@tauri-apps/plugin-process@2.0.0-alpha.2: + resolution: {integrity: sha512-5ilc3ZYuLTt+WAL0Q0MjxTdIjchKYLkqcFe7qqVgkl9iBAAsUCc6G9ikZpNyLEParsJaY63mOZX3iPc3ZTEdEg==} dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 + '@tauri-apps/api': 2.0.0-alpha.9 dev: false - /@tauri-apps/plugin-process@2.0.0-alpha.1: - resolution: {integrity: sha512-ljTtJmuuURR1Q+H8zvbMX9pmMZdJQWMXGsUEK2aBNlUo4qE2AniXLjoaE1jJQ1NF2LKptJRSY1bSUi+OyEkjGg==} + /@tauri-apps/plugin-shell@2.0.0-alpha.2: + resolution: {integrity: sha512-LLf4rdFJ7kv1EY44JaaZDf88k8PUoYG0MXhBD5gEibRxpA73XCQRKPjBvLl5QS6am1CpTaZPaAJTYsoMeBGctA==} dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 + '@tauri-apps/api': 2.0.0-alpha.9 dev: false - /@tauri-apps/plugin-shell@2.0.0-alpha.1: - resolution: {integrity: sha512-vH4ODw/7pmMHackh1F+/uGmBXNGArVJ8FRO0xyL0xjPsMxbba4o90FJ7eiITENznBZRKn3JFaTedh8KhAZqU/g==} + /@tauri-apps/plugin-sql@2.0.0-alpha.2: + resolution: {integrity: sha512-ADAH7exXWF4C7CUuNjCKYzkPMelf+654d6Xr9fBKpRiNVI1M2wymoNOMwC35NN7K/wguqv9AYh+Veo17GZkrFg==} dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 + '@tauri-apps/api': 2.0.0-alpha.9 dev: false - /@tauri-apps/plugin-sql@2.0.0-alpha.1: - resolution: {integrity: sha512-HzFjcISMnkYR4lSOEAvtOUUT/YIMU2mz+oVGdVzVYAM5gzt8Xmooapp66UCJ/ugTlpd0angSkqfRgU3eQVS7Mg==} + /@tauri-apps/plugin-updater@2.0.0-alpha.2: + resolution: {integrity: sha512-j6RHPmZlvqm2vwQXbI6aZLCtllyv1qwTOih42PFIP0NHh7L1Ea+jStN0pZk0whHD72F9fcXv4eWexGlwBNa5dg==} dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 + '@tauri-apps/api': 2.0.0-alpha.9 dev: false - /@tauri-apps/plugin-updater@2.0.0-alpha.1: - resolution: {integrity: sha512-rJoVc/N8gg1MkUOFZdx5h39V47elddwnOjs0sAPhaGfwct7okmFMRnXpN/MwHoprTkK2+6EDLOvhf0jFMiy4JA==} + /@tauri-apps/plugin-upload@2.0.0-alpha.2: + resolution: {integrity: sha512-YWkk2c+ZB8qaHVepmBHgtceyCtZ7Ov8vNuBeH6tXWHsHya/x2LyX+TVLIOsp3Y/xMLmgMNpFiaCumNtCCRWvqw==} dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 - dev: false - - /@tauri-apps/plugin-upload@2.0.0-alpha.1: - resolution: {integrity: sha512-MSQesuCrQqPJtn1kbO428sz2M2q+G/jrOV2J3nxVrxUkISQvn2vK/vmMZ8e3p/dT5hdzs10Xz6KC9GZ67BCMVg==} - dependencies: - '@tauri-apps/api': 2.0.0-alpha.6 + '@tauri-apps/api': 2.0.0-alpha.9 dev: false /@tauri-apps/plugin-window@2.0.0-alpha.1: @@ -2631,8 +2606,8 @@ packages: '@tiptap/pm': 2.1.12 dev: false - /@trivago/prettier-plugin-sort-imports@4.2.0(prettier@3.0.3): - resolution: {integrity: sha512-YBepjbt+ZNBVmN3ev1amQH3lWCmHyt5qTbLCp/syXJRu/Kw2koXh44qayB1gMRxcL/gV8egmjN5xWSrYyfUtyw==} + /@trivago/prettier-plugin-sort-imports@4.2.1(prettier@3.0.3): + resolution: {integrity: sha512-iuy2MPVURGdxILTchHr15VAioItuYBejKfcTmQFlxIuqA7jeaT6ngr5aUIG6S6U096d6a6lJCgaOwlRrPLlOPg==} peerDependencies: '@vue/compiler-sfc': 3.x prettier: 2.x - 3.x @@ -2642,7 +2617,7 @@ packages: dependencies: '@babel/generator': 7.17.7 '@babel/parser': 7.23.0 - '@babel/traverse': 7.17.3 + '@babel/traverse': 7.23.2 '@babel/types': 7.17.0 javascript-natural-sort: 0.7.1 lodash: 4.17.21 @@ -2840,10 +2815,10 @@ packages: resolution: {integrity: sha512-uK2z1ZHJyC0nQRbuovXFt4mzXDwf27vQeUWNhfKGwRcWW429GOhP8HxUHlM6TLH4bzmlv/HlEjpvJh3JfmGsAA==} dev: false - /@types/hast@2.3.7: - resolution: {integrity: sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw==} + /@types/hast@3.0.2: + resolution: {integrity: sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==} dependencies: - '@types/unist': 2.0.9 + '@types/unist': 3.0.1 dev: false /@types/html-to-text@9.0.3: @@ -2865,10 +2840,10 @@ packages: '@types/mdurl': 1.0.4 dev: false - /@types/mdast@3.0.14: - resolution: {integrity: sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==} + /@types/mdast@4.0.2: + resolution: {integrity: sha512-tYR83EignvhYO9iU3kDg8V28M0jqyh9zzp5GV+EO+AYnyUl3P5ltkTeJuTiFZQFz670FSb3EwT/6LQdX+UdKfw==} dependencies: - '@types/unist': 2.0.9 + '@types/unist': 3.0.1 dev: false /@types/mdurl@1.0.4: @@ -2879,10 +2854,10 @@ packages: resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} dev: false - /@types/node@20.8.7: - resolution: {integrity: sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==} + /@types/node@20.8.9: + resolution: {integrity: sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==} dependencies: - undici-types: 5.25.3 + undici-types: 5.26.5 dev: true /@types/object.omit@3.0.2: @@ -2899,10 +2874,10 @@ packages: /@types/react-dom@18.2.14: resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} dependencies: - '@types/react': 18.2.29 + '@types/react': 18.2.33 - /@types/react@18.2.29: - resolution: {integrity: sha512-Z+ZrIRocWtdD70j45izShRwDuiB4JZqDegqMFW/I8aG5DxxLKOzVNoq62UIO82v9bdgi+DO1jvsb9sTEZUSm+Q==} + /@types/react@18.2.33: + resolution: {integrity: sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==} dependencies: '@types/prop-types': 15.7.9 '@types/scheduler': 0.16.5 @@ -2919,16 +2894,16 @@ packages: resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} dev: false - /@types/unist@2.0.9: - resolution: {integrity: sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==} + /@types/unist@3.0.1: + resolution: {integrity: sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==} dev: false /@types/youtube-player@5.5.9: resolution: {integrity: sha512-l2Q7ESxMv6HK2jc6I1qwMMGbh5bpHYQVCpXs0GsFmzaXoPibX50pHzs+PGfmegDY8TvmMGKWBgGI16ytqK6iIw==} dev: true - /@typescript-eslint/eslint-plugin@6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==} + /@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -2938,14 +2913,14 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 6.8.0(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.8.0 - '@typescript-eslint/type-utils': 6.8.0(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.8.0(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.8.0 + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.9.0(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.9.0 + '@typescript-eslint/type-utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.9.0 debug: 4.3.4 - eslint: 8.51.0 + eslint: 8.52.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -2956,8 +2931,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.8.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==} + /@typescript-eslint/parser@6.9.0(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2966,27 +2941,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.8.0 - '@typescript-eslint/types': 6.8.0 - '@typescript-eslint/typescript-estree': 6.8.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.8.0 + '@typescript-eslint/scope-manager': 6.9.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.9.0 debug: 4.3.4 - eslint: 8.51.0 + eslint: 8.52.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.8.0: - resolution: {integrity: sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==} + /@typescript-eslint/scope-manager@6.9.0: + resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.8.0 - '@typescript-eslint/visitor-keys': 6.8.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/visitor-keys': 6.9.0 dev: true - /@typescript-eslint/type-utils@6.8.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==} + /@typescript-eslint/type-utils@6.9.0(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2995,23 +2970,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.8.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.8.0(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.51.0 + eslint: 8.52.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.8.0: - resolution: {integrity: sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==} + /@typescript-eslint/types@6.9.0: + resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.8.0(typescript@5.2.2): - resolution: {integrity: sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==} + /@typescript-eslint/typescript-estree@6.9.0(typescript@5.2.2): + resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -3019,8 +2994,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.8.0 - '@typescript-eslint/visitor-keys': 6.8.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/visitor-keys': 6.9.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -3031,54 +3006,57 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.8.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==} + /@typescript-eslint/utils@6.9.0(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) '@types/json-schema': 7.0.14 '@types/semver': 7.5.4 - '@typescript-eslint/scope-manager': 6.8.0 - '@typescript-eslint/types': 6.8.0 - '@typescript-eslint/typescript-estree': 6.8.0(typescript@5.2.2) - eslint: 8.51.0 + '@typescript-eslint/scope-manager': 6.9.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) + eslint: 8.52.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.8.0: - resolution: {integrity: sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==} + /@typescript-eslint/visitor-keys@6.9.0: + resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.8.0 + '@typescript-eslint/types': 6.9.0 eslint-visitor-keys: 3.4.3 dev: true + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + /@vitejs/plugin-react-swc@3.4.0(vite@4.5.0): resolution: {integrity: sha512-m7UaA4Uvz82N/0EOVpZL4XsFIakRqrFKeSNxa1FBLSXGvWrWRBwmZb4qxk+ZIVAZcW3c3dn5YosomDgx62XWcQ==} peerDependencies: vite: ^4 dependencies: - '@swc/core': 1.3.93 - vite: 4.5.0(@types/node@20.8.7) + '@swc/core': 1.3.95 + vite: 4.5.0(@types/node@20.8.9) transitivePeerDependencies: - '@swc/helpers' dev: true - /acorn-jsx@5.3.2(acorn@8.10.0): + /acorn-jsx@5.3.2(acorn@8.11.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.10.0 + acorn: 8.11.1 dev: true - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + /acorn@8.11.1: + resolution: {integrity: sha512-IJTNCJMRHfRfb8un89z1QtS0x890C2QUrUxFMK8zy+RizcId6mfnqOf68Bu9YkDgpLYuvCm6aYbwDatXVZPjMQ==} engines: {node: '>=0.4.0'} hasBin: true @@ -3158,7 +3136,7 @@ packages: /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 is-array-buffer: 3.0.2 dev: true @@ -3166,10 +3144,10 @@ packages: resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 is-string: 1.0.7 dev: true @@ -3182,30 +3160,30 @@ packages: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 dev: true /array.prototype.flatmap@1.3.2: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 dev: true /array.prototype.tosorted@1.1.2: resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 dev: true /arraybuffer.prototype.slice@1.0.2: @@ -3213,10 +3191,10 @@ packages: engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 dev: true @@ -3239,7 +3217,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.22.1 - caniuse-lite: 1.0.30001550 + caniuse-lite: 1.0.30001554 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -3291,8 +3269,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001550 - electron-to-chromium: 1.4.559 + caniuse-lite: 1.0.30001554 + electron-to-chromium: 1.4.568 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) @@ -3304,11 +3282,12 @@ packages: node-gyp-build: 4.6.1 dev: false - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: function-bind: 1.1.2 - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 dev: true /callsites@3.1.0: @@ -3320,8 +3299,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - /caniuse-lite@1.0.30001550: - resolution: {integrity: sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ==} + /caniuse-lite@1.0.30001554: + resolution: {integrity: sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==} /case-anything@2.1.13: resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} @@ -3421,8 +3400,8 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false - /commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} dev: true @@ -3458,8 +3437,8 @@ packages: which: 2.0.2 dev: true - /crypto-js@4.1.1: - resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} dev: false /cssesc@3.0.0: @@ -3600,9 +3579,9 @@ packages: resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 gopd: 1.0.1 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 dev: true /define-properties@1.2.1: @@ -3610,7 +3589,7 @@ packages: engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.1 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 object-keys: 1.1.1 dev: true @@ -3618,14 +3597,20 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - /destr@2.0.1: - resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} + /destr@2.0.2: + resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} dev: false /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + /dexie@3.2.4: resolution: {integrity: sha512-VKoTQRSv7+RnffpOJ3Dh6ozknBqzWw/F3iqMdsZg958R0AS8AnY9x9d1lbwENr0gzeGJHXKcGhAMRaqys6SxqA==} engines: {node: '>=6.0'} @@ -3634,11 +3619,6 @@ packages: /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: false - /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -3694,8 +3674,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.559: - resolution: {integrity: sha512-iS7KhLYCSJbdo3rUSkhDTVuFNCV34RKs2UaB9Ecr7VlqzjjWW//0nfsFF5dtDmyXlZQaDYYtID5fjtC/6lpRug==} + /electron-to-chromium@1.4.568: + resolution: {integrity: sha512-3TCOv8+BY6Ltpt1/CmGBMups2IdKOyfEmz4J8yIS4xLSeMm0Rf+psSaxLuswG9qMKt+XbNbmADybtXGpTFlbDg==} /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -3717,26 +3697,26 @@ packages: engines: {node: '>=0.12'} dev: false - /es-abstract@1.22.2: - resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 - has: 1.0.4 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.5 + hasown: 2.0.0 + internal-slot: 1.0.6 is-array-buffer: 3.0.2 is-callable: 1.2.7 is-negative-zero: 2.0.2 @@ -3745,7 +3725,7 @@ packages: is-string: 1.0.7 is-typed-array: 1.1.12 is-weakref: 1.0.2 - object-inspect: 1.13.0 + object-inspect: 1.13.1 object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.5.1 @@ -3759,41 +3739,41 @@ packages: typed-array-byte-offset: 1.0.0 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true /es-iterator-helpers@1.0.15: resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} dependencies: asynciterator.prototype: 1.0.0 - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - es-set-tostringtag: 2.0.1 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.2 function-bind: 1.1.2 - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 globalthis: 1.0.3 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.5 + internal-slot: 1.0.6 iterator.prototype: 1.1.2 safe-array-concat: 1.0.1 dev: true - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 - has: 1.0.4 + get-intrinsic: 1.2.2 has-tostringtag: 1.0.0 + hasown: 2.0.0 dev: true - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - has: 1.0.4 + hasown: 2.0.0 dev: true /es-to-primitive@1.2.1: @@ -3877,16 +3857,16 @@ packages: engines: {node: '>=12'} dev: false - /eslint-config-prettier@9.0.0(eslint@8.51.0): + /eslint-config-prettier@9.0.0(eslint@8.52.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.51.0 + eslint: 8.52.0 dev: true - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.51.0): + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.52.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: @@ -3901,7 +3881,7 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.51.0 + eslint: 8.52.0 has: 1.0.4 jsx-ast-utils: 3.3.5 language-tags: 1.0.5 @@ -3911,7 +3891,7 @@ packages: semver: 6.3.1 dev: true - /eslint-plugin-react@7.33.2(eslint@8.51.0): + /eslint-plugin-react@7.33.2(eslint@8.52.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: @@ -3922,7 +3902,7 @@ packages: array.prototype.tosorted: 1.1.2 doctrine: 2.1.0 es-iterator-helpers: 1.0.15 - eslint: 8.51.0 + eslint: 8.52.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -3936,12 +3916,12 @@ packages: string.prototype.matchall: 4.0.10 dev: true - /eslint-plugin-simple-import-sort@10.0.0(eslint@8.51.0): + /eslint-plugin-simple-import-sort@10.0.0(eslint@8.52.0): resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} peerDependencies: eslint: '>=5.0.0' dependencies: - eslint: 8.51.0 + eslint: 8.52.0 dev: true /eslint-scope@7.2.2: @@ -3957,18 +3937,19 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.51.0: - resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} + /eslint@8.52.0: + resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) - '@eslint-community/regexpp': 4.9.1 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.51.0 - '@humanwhocodes/config-array': 0.11.11 + '@eslint/js': 8.52.0 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -4007,8 +3988,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.11.1 + acorn-jsx: 5.3.2(acorn@8.11.1) eslint-visitor-keys: 3.4.3 dev: true @@ -4044,18 +4025,18 @@ packages: engines: {node: '>=0.8.x'} dev: false - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} dependencies: cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 + get-stream: 8.0.1 + human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 npm-run-path: 5.1.0 onetime: 6.0.0 - signal-exit: 3.0.7 + signal-exit: 4.1.0 strip-final-newline: 3.0.0 dev: true @@ -4184,15 +4165,14 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true /function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 functions-have-names: 1.2.3 dev: true @@ -4205,13 +4185,13 @@ packages: engines: {node: '>=6.9.0'} dev: false - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: function-bind: 1.1.2 - has: 1.0.4 has-proto: 1.0.1 has-symbols: 1.0.3 + hasown: 2.0.0 dev: true /get-nonce@1.0.1: @@ -4219,17 +4199,17 @@ packages: engines: {node: '>=6'} dev: false - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} dev: true /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 dev: true /glob-parent@5.1.2: @@ -4302,7 +4282,7 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 dev: true /graphemer@1.4.0: @@ -4322,10 +4302,10 @@ packages: engines: {node: '>=8'} dev: true - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 dev: true /has-proto@1.0.1: @@ -4348,9 +4328,38 @@ packages: /has@1.0.4: resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} + dev: true - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + dependencies: + '@types/hast': 3.0.2 + dev: false + + /hast-util-to-jsx-runtime@2.2.0: + resolution: {integrity: sha512-wSlp23N45CMjDg/BPW8zvhEi3R+8eRE1qFbjEyAUzMCzu2l1Wzwakq+Tlia9nkCtEl5mDxa7nKHsvYJ6Gfn21A==} + dependencies: + '@types/hast': 3.0.2 + '@types/unist': 3.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + dev: false + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.2 dev: false /html-to-text@9.0.5: @@ -4364,6 +4373,10 @@ packages: selderee: 0.11.0 dev: false + /html-url-attributes@3.0.0: + resolution: {integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==} + dev: false + /htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} dependencies: @@ -4373,9 +4386,9 @@ packages: entities: 4.5.0 dev: false - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} dev: true /husky@8.0.3: @@ -4422,12 +4435,12 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 - has: 1.0.4 + get-intrinsic: 1.2.2 + hasown: 2.0.0 side-channel: 1.0.4 dev: true @@ -4437,11 +4450,16 @@ packages: loose-envify: 1.4.0 dev: false + /is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-typed-array: 1.1.12 dev: true @@ -4468,24 +4486,19 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false - /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} dev: true - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - has: 1.0.4 + hasown: 2.0.0 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -4508,7 +4521,7 @@ packages: /is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-fullwidth-code-point@4.0.0: @@ -4570,7 +4583,7 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true @@ -4581,7 +4594,7 @@ packages: /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-stream@3.0.0: @@ -4607,7 +4620,7 @@ packages: resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true /is-typedarray@1.0.0: @@ -4621,14 +4634,14 @@ packages: /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 dev: true /isarray@2.0.5: @@ -4648,7 +4661,7 @@ packages: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.4 set-function-name: 2.0.1 @@ -4757,34 +4770,28 @@ packages: uc.micro: 1.0.6 dev: false - /lint-staged@14.0.1: - resolution: {integrity: sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==} - engines: {node: ^16.14.0 || >=18.0.0} + /lint-staged@15.0.2: + resolution: {integrity: sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==} + engines: {node: '>=18.12.0'} hasBin: true dependencies: chalk: 5.3.0 - commander: 11.0.0 + commander: 11.1.0 debug: 4.3.4 - execa: 7.2.0 + execa: 8.0.1 lilconfig: 2.1.0 - listr2: 6.6.1 + listr2: 7.0.2 micromatch: 4.0.5 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.3.1 + yaml: 2.3.3 transitivePeerDependencies: - - enquirer - supports-color dev: true - /listr2@6.6.1: - resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} + /listr2@7.0.2: + resolution: {integrity: sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==} engines: {node: '>=16.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true dependencies: cli-truncate: 3.1.0 colorette: 2.0.20 @@ -4879,135 +4886,140 @@ packages: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: false - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + /mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} dependencies: - '@types/mdast': 3.0.14 - '@types/unist': 2.0.9 - unist-util-visit: 4.1.2 - dev: false - - /mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - dependencies: - '@types/mdast': 3.0.14 + '@types/mdast': 4.0.2 escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 dev: false - /mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} dependencies: - '@types/mdast': 3.0.14 - '@types/unist': 2.0.9 + '@types/mdast': 4.0.2 + '@types/unist': 3.0.1 decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color dev: false - /mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} dependencies: - '@types/mdast': 3.0.14 + '@types/mdast': 4.0.2 ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 dev: false - /mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + /mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} dependencies: - '@types/mdast': 3.0.14 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 + '@types/mdast': 4.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color dev: false - /mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} dependencies: - '@types/mdast': 3.0.14 - mdast-util-to-markdown: 1.5.0 + '@types/mdast': 4.0.2 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color dev: false - /mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} dependencies: - '@types/mdast': 3.0.14 + '@types/mdast': 4.0.2 + devlop: 1.1.0 markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: false - /mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} dependencies: - '@types/mdast': 3.0.14 - mdast-util-to-markdown: 1.5.0 - dev: false - - /mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 + '@types/mdast': 4.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: false - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + /mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} dependencies: - '@types/mdast': 3.0.14 - unist-util-is: 5.2.1 + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color dev: false - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + /mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} dependencies: - '@types/hast': 2.3.7 - '@types/mdast': 3.0.14 - mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.2.0 + '@types/mdast': 4.0.2 + unist-util-is: 6.0.0 + dev: false + + /mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + dependencies: + '@types/hast': 3.0.2 + '@types/mdast': 4.0.2 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 dev: false - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} dependencies: - '@types/mdast': 3.0.14 - '@types/unist': 2.0.9 + '@types/mdast': 4.0.2 + '@types/unist': 3.0.1 longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 - unist-util-visit: 4.1.2 + mdast-util-phrasing: 4.0.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 zwitch: 2.0.4 dev: false - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} dependencies: - '@types/mdast': 3.0.14 + '@types/mdast': 4.0.2 dev: false /mdurl@1.0.1: @@ -5026,249 +5038,249 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} dependencies: decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + /micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + /micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 2.0.0 dev: false - /micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + /micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} dependencies: - micromark-extension-gfm-autolink-literal: 1.0.5 - micromark-extension-gfm-footnote: 1.1.2 - micromark-extension-gfm-strikethrough: 1.0.7 - micromark-extension-gfm-table: 1.0.7 - micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 dev: false - /micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + /micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.0 dev: false - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.0 dev: false - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} dependencies: decode-named-character-reference: 1.0.2 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 dev: false - /micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} dev: false - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} dev: false - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.0 dev: false - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 2.0.0 dev: false - /micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 dev: false - /micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} dev: false - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} dev: false - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} dependencies: '@types/debug': 4.1.10 debug: 4.3.4 decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 transitivePeerDependencies: - supports-color dev: false @@ -5316,11 +5328,6 @@ packages: dependencies: brace-expansion: 1.1.11 - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false - /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: false @@ -5427,8 +5434,8 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - /object-inspect@1.13.0: - resolution: {integrity: sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true /object-keys@1.1.1: @@ -5440,7 +5447,7 @@ packages: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 @@ -5450,25 +5457,25 @@ packages: resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /object.fromentries@2.0.7: resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /object.hasown@1.1.3: resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} dependencies: define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /object.omit@3.0.0: @@ -5489,9 +5496,9 @@ packages: resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /once@1.4.0: @@ -5685,7 +5692,7 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-tailwindcss@0.5.6(@trivago/prettier-plugin-sort-imports@4.2.0)(prettier@3.0.3): + /prettier-plugin-tailwindcss@0.5.6(@trivago/prettier-plugin-sort-imports@4.2.1)(prettier@3.0.3): resolution: {integrity: sha512-2Xgb+GQlkPAUCFi3sV+NOYcSI5XgduvDBL2Zt/hwJudeKXkyvRS65c38SB0yb9UB40+1rL83I6m0RtlOQ8eHdg==} engines: {node: '>=14.21.3'} peerDependencies: @@ -5737,7 +5744,7 @@ packages: prettier-plugin-twig-melody: optional: true dependencies: - '@trivago/prettier-plugin-sort-imports': 4.2.0(prettier@3.0.3) + '@trivago/prettier-plugin-sort-imports': 4.2.1(prettier@3.0.3) prettier: 3.0.3 dev: true @@ -5753,6 +5760,7 @@ packages: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 + dev: true /property-information@6.3.0: resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==} @@ -5966,39 +5974,32 @@ packages: /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: false - - /react-markdown@8.0.7(@types/react@18.2.29)(react@18.2.0): - resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} + /react-markdown@9.0.0(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-v6yNf3AB8GfJ8lCpUvzxAXKxgsHpdmWPlcVRQ6Nocsezp255E/IDrF31kLQsPJeB/cKto/geUwjU36wH784FCA==} peerDependencies: - '@types/react': '>=16' - react: '>=16' + '@types/react': '>=18' + react: '>=18' dependencies: - '@types/hast': 2.3.7 - '@types/prop-types': 15.7.9 - '@types/react': 18.2.29 - '@types/unist': 2.0.9 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 2.0.1 - prop-types: 15.8.1 - property-information: 6.3.0 + '@types/hast': 3.0.2 + '@types/react': 18.2.33 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.2.0 + html-url-attributes: 3.0.0 + mdast-util-to-hast: 13.0.2 + micromark-util-sanitize-uri: 2.0.0 react: 18.2.0 - react-is: 18.2.0 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unified: 10.1.2 - unist-util-visit: 4.1.2 - vfile: 5.3.7 + remark-parse: 11.0.0 + remark-rehype: 11.0.0 + unified: 11.0.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 transitivePeerDependencies: - supports-color dev: false - /react-remove-scroll-bar@2.3.4(@types/react@18.2.29)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -6008,13 +6009,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.29 + '@types/react': 18.2.33 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.29)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.33)(react@18.2.0) tslib: 2.6.2 dev: false - /react-remove-scroll@2.5.5(@types/react@18.2.29)(react@18.2.0): + /react-remove-scroll@2.5.5(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -6024,13 +6025,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.29 + '@types/react': 18.2.33 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.29)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.29)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.33)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.33)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.0(@types/react@18.2.29)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.29)(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.33)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.33)(react@18.2.0) dev: false /react-router-dom@6.17.0(react-dom@18.2.0)(react@18.2.0): @@ -6061,7 +6062,7 @@ packages: engines: {node: '>=0.12.0'} dev: false - /react-style-singleton@2.2.1(@types/react@18.2.29)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -6071,7 +6072,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.29 + '@types/react': 18.2.33 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 @@ -6085,18 +6086,18 @@ packages: loose-envify: 1.4.0 dev: false - /reactflow@11.9.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0): + /reactflow@11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-IHAKBkJngNvU9y1vZ5Nw9rvA3Z+zc9geTgQQIi9qq9Y9knGLlDDr9KfsjbFMew9AycAAgVg8TvBEakF4IT5lqg==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/background': 11.3.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/controls': 11.2.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/core': 11.9.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/minimap': 11.7.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-resizer': 2.2.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-toolbar': 1.3.4(@types/react@18.2.29)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/background': 11.3.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/controls': 11.2.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/minimap': 11.7.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-resizer': 2.2.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-toolbar': 1.3.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -6119,10 +6120,10 @@ packages: resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 globalthis: 1.0.3 which-builtin-type: 1.1.3 dev: true @@ -6134,39 +6135,62 @@ packages: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 set-function-name: 2.0.1 dev: true - /remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + /rehype-external-links@3.0.0: + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} dependencies: - '@types/mdast': 3.0.14 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 - unified: 10.1.2 + '@types/hast': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + dev: false + + /remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + dependencies: + '@types/mdast': 4.0.2 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 transitivePeerDependencies: - supports-color dev: false - /remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} dependencies: - '@types/mdast': 3.0.14 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 + '@types/mdast': 4.0.2 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 transitivePeerDependencies: - supports-color dev: false - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + /remark-rehype@11.0.0: + resolution: {integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==} dependencies: - '@types/hast': 2.3.7 - '@types/mdast': 3.0.14 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 + '@types/hast': 3.0.2 + '@types/mdast': 4.0.2 + mdast-util-to-hast: 13.0.2 + unified: 11.0.4 + vfile: 6.0.1 + dev: false + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.2 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 dev: false /resolve-from@4.0.0: @@ -6178,7 +6202,7 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -6186,7 +6210,7 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -6230,19 +6254,12 @@ packages: dependencies: queue-microtask: 1.2.3 - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - dependencies: - mri: 1.2.0 - dev: false - /safe-array-concat@1.0.1: resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 isarray: 2.0.5 dev: true @@ -6250,8 +6267,8 @@ packages: /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-regex: 1.1.4 dev: true @@ -6283,13 +6300,23 @@ packages: lru-cache: 6.0.0 dev: true + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + /set-function-name@2.0.1: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.1 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 dev: true /shebang-command@2.0.0: @@ -6307,15 +6334,20 @@ packages: /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.13.0 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 dev: true /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -6369,12 +6401,12 @@ packages: /string.prototype.matchall@4.0.10: resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 - internal-slot: 1.0.5 + internal-slot: 1.0.6 regexp.prototype.flags: 1.5.1 set-function-name: 2.0.1 side-channel: 1.0.4 @@ -6384,25 +6416,25 @@ packages: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /strip-ansi@6.0.1: @@ -6468,17 +6500,17 @@ packages: /tailwind-merge@1.14.0: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} - /tailwind-scrollbar@3.0.5(tailwindcss@3.3.3): + /tailwind-scrollbar@3.0.5(tailwindcss@3.3.5): resolution: {integrity: sha512-0ZwxTivevqq9BY9fRP9zDjHl7Tu+J5giBGbln+0O1R/7nHtBUKnjQcA1aTIhK7Oyjp6Uc/Dj6/dn8Dq58k5Uww==} engines: {node: '>=12.13.0'} peerDependencies: tailwindcss: 3.x dependencies: - tailwindcss: 3.3.3 + tailwindcss: 3.3.5 dev: false - /tailwindcss@3.3.3: - resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} + /tailwindcss@3.3.5: + resolution: {integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -6507,7 +6539,7 @@ packages: transitivePeerDependencies: - ts-node - /tauri-controls@0.2.0(@tauri-apps/plugin-os@2.0.0-alpha.2)(@tauri-apps/plugin-window@2.0.0-alpha.1)(clsx@2.0.0)(react-dom@18.2.0)(react@18.2.0)(tailwind-merge@1.14.0): + /tauri-controls@0.2.0(@tauri-apps/plugin-os@2.0.0-alpha.3)(@tauri-apps/plugin-window@2.0.0-alpha.1)(clsx@2.0.0)(react-dom@18.2.0)(react@18.2.0)(tailwind-merge@1.14.0): resolution: {integrity: sha512-/IDXLhcqGRjNN7QKfzgyr2y4QfnWT9MSIdqxrjH2oElXyngSo/cQltTb8LT6h/sH/7gRiSQMvQBEmavfn9Hk0w==} peerDependencies: '@tauri-apps/plugin-os': 2.0.0-alpha.2 @@ -6518,7 +6550,7 @@ packages: tailwind-merge: ^1.14.0 dependencies: '@tauri-apps/api': 2.0.0-alpha.8 - '@tauri-apps/plugin-os': 2.0.0-alpha.2 + '@tauri-apps/plugin-os': 2.0.0-alpha.3 '@tauri-apps/plugin-window': 2.0.0-alpha.1 clsx: 2.0.0 react: 18.2.0 @@ -6649,8 +6681,8 @@ packages: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-typed-array: 1.1.12 dev: true @@ -6658,7 +6690,7 @@ packages: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -6669,7 +6701,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -6678,7 +6710,7 @@ packages: /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 is-typed-array: 1.1.12 dev: true @@ -6705,69 +6737,65 @@ packages: /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 dev: true - /undici-types@5.25.3: - resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} dependencies: - '@types/unist': 2.0.9 + '@types/unist': 3.0.1 bail: 2.0.2 + devlop: 1.1.0 extend: 3.0.2 - is-buffer: 2.0.5 is-plain-obj: 4.1.0 trough: 2.1.0 - vfile: 5.3.7 + vfile: 6.0.1 dev: false - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - dev: false - - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} dependencies: - '@types/unist': 2.0.9 + '@types/unist': 3.0.1 dev: false - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} dependencies: - '@types/unist': 2.0.9 + '@types/unist': 3.0.1 dev: false - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: - '@types/unist': 2.0.9 + '@types/unist': 3.0.1 dev: false - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} dependencies: - '@types/unist': 2.0.9 - unist-util-is: 5.2.1 + '@types/unist': 3.0.1 + unist-util-is: 6.0.0 dev: false - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} dependencies: - '@types/unist': 2.0.9 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 + '@types/unist': 3.0.1 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 dev: false /unplugin@1.5.0: resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==} dependencies: - acorn: 8.10.0 + acorn: 8.11.1 chokidar: 3.5.3 webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 @@ -6789,7 +6817,7 @@ packages: punycode: 2.3.0 dev: true - /use-callback-ref@1.3.0(@types/react@18.2.29)(react@18.2.0): + /use-callback-ref@1.3.0(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: @@ -6799,12 +6827,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.29 + '@types/react': 18.2.33 react: 18.2.0 tslib: 2.6.2 dev: false - /use-sidecar@1.1.2(@types/react@18.2.29)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -6814,7 +6842,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.29 + '@types/react': 18.2.33 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 @@ -6844,35 +6872,23 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 + '@types/unist': 3.0.1 + unist-util-stringify-position: 4.0.0 dev: false - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} dependencies: - '@types/unist': 2.0.9 - unist-util-stringify-position: 3.0.3 + '@types/unist': 3.0.1 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 dev: false - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - dependencies: - '@types/unist': 2.0.9 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: false - - /virtua@0.15.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-kzwin55Tj85tcpNO7p5p7U12+wT6+CJaDSr98BTNKD6t7QEmigDwE7h6dcP170LrY8tW+scsMUtipcroSeSpAw==} + /virtua@0.15.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-gC52UMvipt5ejDuolszdMAIapoDZul3cpsYIznjEUUbws169/dFHRwzzoI7e5niViDBBt6e+N4RnicGdcuc0UQ==} peerDependencies: react: '>=16.14.0' react-dom: '>=16.14.0' @@ -6892,13 +6908,13 @@ packages: debug: 4.3.4 globrex: 0.1.2 tsconfck: 2.1.2(typescript@5.2.2) - vite: 4.5.0(@types/node@20.8.7) + vite: 4.5.0(@types/node@20.8.9) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@4.5.0(@types/node@20.8.7): + /vite@4.5.0(@types/node@20.8.9): resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -6926,7 +6942,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.8.7 + '@types/node': 20.8.9 esbuild: 0.18.20 postcss: 8.4.31 rollup: 3.29.4 @@ -7000,7 +7016,7 @@ packages: isarray: 2.0.5 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true /which-collection@1.0.1: @@ -7012,12 +7028,12 @@ packages: is-weakset: 2.0.2 dev: true - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 @@ -7056,11 +7072,6 @@ packages: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - dev: true - /yaml@2.3.3: resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} engines: {node: '>= 14'} @@ -7070,8 +7081,8 @@ packages: engines: {node: '>=10'} dev: true - /zustand@4.4.3(@types/react@18.2.29)(react@18.2.0): - resolution: {integrity: sha512-oRy+X3ZazZvLfmv6viIaQmtLOMeij1noakIsK/Y47PWYhT8glfXzQ4j0YcP5i0P0qI1A4rIB//SGROGyZhx91A==} + /zustand@4.4.4(@types/react@18.2.33)(react@18.2.0): + resolution: {integrity: sha512-5UTUIAiHMNf5+mFp7/AnzJXS7+XxktULFN0+D1sCiZWyX7ZG+AQpqs2qpYrynRij4QvoDdCD+U+bmg/cG3Ucxw==} engines: {node: '>=12.7.0'} peerDependencies: '@types/react': '>=16.8' @@ -7085,7 +7096,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.29 + '@types/react': 18.2.33 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index fdc8258a..e45b1c15 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -42,14 +42,15 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "getrandom 0.2.10", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -231,9 +232,9 @@ dependencies = [ "log", "parking", "polling", - "rustix 0.37.25", + "rustix 0.37.27", "slab", - "socket2 0.4.9", + "socket2 0.4.10", "waker-fn", ] @@ -259,7 +260,7 @@ dependencies = [ "cfg-if", "event-listener 3.0.0", "futures-lite", - "rustix 0.38.19", + "rustix 0.38.21", "windows-sys 0.48.0", ] @@ -286,7 +287,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.19", + "rustix 0.38.21", "signal-hook-registry", "slab", "windows-sys 0.48.0", @@ -396,9 +397,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.4" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "base64ct" @@ -680,9 +681,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.6" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" +checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" dependencies = [ "clap_builder", "clap_derive", @@ -690,9 +691,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.6" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" +checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" dependencies = [ "anstream", "anstyle", @@ -702,9 +703,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.2" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", @@ -714,9 +715,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "clipboard-win" @@ -892,9 +893,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -991,12 +992,12 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.26" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +checksum = "37e366bff8cd32dd8754b0991fb66b279dc48f598c3a18914852a6673deef583" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.38", ] [[package]] @@ -1010,7 +1011,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "socket2 0.4.9", + "socket2 0.4.10", "winapi", ] @@ -1218,7 +1219,7 @@ checksum = "f54cc3e827ee1c3812239a9a41dede7b4d7d5d5464faa32d71bd7cba28ce2cb2" dependencies = [ "cc", "rustc_version", - "toml 0.8.2", + "toml 0.8.5", "vswhom", "winreg 0.51.0", ] @@ -1347,7 +1348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5" dependencies = [ "cfg-if", - "rustix 0.38.19", + "rustix 0.38.21", "windows-sys 0.48.0", ] @@ -1478,9 +1479,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -1493,9 +1494,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -1503,15 +1504,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -1531,9 +1532,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-lite" @@ -1552,9 +1553,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", @@ -1563,21 +1564,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -1936,9 +1937,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" dependencies = [ "ahash", "allocator-api2", @@ -1950,7 +1951,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.14.1", + "hashbrown 0.14.2", ] [[package]] @@ -2066,7 +2067,7 @@ dependencies = [ "httpdate", "itoa 1.0.9", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -2168,15 +2169,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ "equivalent", - "hashbrown 0.14.1", + "hashbrown 0.14.2", "serde", ] [[package]] name = "infer" -version = "0.12.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a898e4b7951673fce96614ce5751d13c40fc5674bc2d759288e46c3ab62598b3" +checksum = "cb33622da908807a06f9513c19b3c1ad50fab3e4137d82a78107d502075aa199" dependencies = [ "cfb", ] @@ -2212,9 +2213,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-docker" @@ -2525,7 +2526,6 @@ dependencies = [ "sqlx-cli", "tauri", "tauri-build", - "tauri-plugin-app", "tauri-plugin-autostart", "tauri-plugin-cli", "tauri-plugin-clipboard-manager", @@ -2541,7 +2541,6 @@ dependencies = [ "tauri-plugin-store", "tauri-plugin-updater", "tauri-plugin-upload", - "tauri-plugin-window", "webpage", ] @@ -2687,9 +2686,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -3083,9 +3082,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.1.5+3.1.3" +version = "300.1.6+3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "559068e4c12950d7dcaa1857a61725c0d38d4fc03ff8e070ab31a75d6e316491" +checksum = "439fac53e092cd7442a3660c85dde4643ab3b5bd39040912388dcdabf6b88085" dependencies = [ "cc", ] @@ -3262,9 +3261,17 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ - "phf_macros 0.10.0", "phf_shared 0.10.0", - "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros 0.11.2", + "phf_shared 0.11.2", ] [[package]] @@ -3307,6 +3314,16 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand 0.8.5", +] + [[package]] name = "phf_macros" version = "0.8.0" @@ -3323,16 +3340,15 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.10.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", + "phf_generator 0.11.2", + "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.38", ] [[package]] @@ -3353,6 +3369,15 @@ dependencies = [ "siphasher", ] +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -3405,14 +3430,14 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "plist" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdc0001cfea3db57a2e24bc0d818e9e20e554b5f97fabb9bc231dc240269ae06" +checksum = "9a4a0cfc5fb21a09dc6af4bf834cf10d4a32fccd9e2ea468c4b1751a097487aa" dependencies = [ "base64", "indexmap 1.9.3", "line-wrap", - "quick-xml 0.29.0", + "quick-xml", "serde", "time", ] @@ -3522,15 +3547,6 @@ dependencies = [ "rustyline", ] -[[package]] -name = "quick-xml" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51" -dependencies = [ - "memchr", -] - [[package]] name = "quick-xml" version = "0.30.0" @@ -3806,31 +3822,28 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.20" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" dependencies = [ "cc", + "getrandom 0.2.10", "libc", - "once_cell", - "spin 0.5.2", + "spin 0.9.8", "untrusted", - "web-sys", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "rsa" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab43bb47d23c1a631b4b680199a45255dce26fa9ab2fa902581f624ff13e6a8" +checksum = "86ef35bf3e7fe15a53c4ab08a998e42271eab13eb0db224126bc7bc4c4bad96d" dependencies = [ - "byteorder", "const-oid", "digest", "num-bigint-dig", "num-integer", - "num-iter", "num-traits", "pkcs1", "pkcs8", @@ -3858,9 +3871,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.25" +version = "0.37.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4eb579851244c2c03e7c24f501c3432bed80b8f720af1d6e5b0e0f01555a035" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" dependencies = [ "bitflags 1.3.2", "errno", @@ -3872,9 +3885,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.19" +version = "0.38.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed" +checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" dependencies = [ "bitflags 2.4.1", "errno", @@ -3885,9 +3898,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" dependencies = [ "ring", "rustls-webpki", @@ -3905,9 +3918,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.6" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ "ring", "untrusted", @@ -3987,9 +4000,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ "ring", "untrusted", @@ -4068,18 +4081,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.189" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" dependencies = [ "proc-macro2", "quote", @@ -4110,9 +4123,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ "serde", ] @@ -4279,9 +4292,9 @@ checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -4289,9 +4302,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys 0.48.0", @@ -4736,7 +4749,7 @@ dependencies = [ "cfg-expr", "heck", "pkg-config", - "toml 0.8.2", + "toml 0.8.5", "version-compare", ] @@ -4784,7 +4797,7 @@ dependencies = [ "url", "uuid", "windows 0.48.0", - "windows-implement", + "windows-implement 0.48.0", "x11-dl", "zbus", ] @@ -4813,15 +4826,15 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.11" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" [[package]] name = "tauri" -version = "2.0.0-alpha.15" +version = "2.0.0-alpha.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8f1dc82ad6bf8a689b131febee60020e84193b7fdb9c21bbb344c3d9f25de4" +checksum = "350fce27e96fda5a5741ae200ebf775cc3423c682154224cfbd78066db777fc6" dependencies = [ "anyhow", "bytes", @@ -4829,6 +4842,7 @@ dependencies = [ "dirs-next", "embed_plist", "futures-util", + "getrandom 0.2.10", "glib", "glob", "gtk", @@ -4842,7 +4856,6 @@ dependencies = [ "objc", "once_cell", "percent-encoding", - "rand 0.8.5", "raw-window-handle", "reqwest", "serde", @@ -4860,17 +4873,17 @@ dependencies = [ "tokio", "tray-icon", "url", - "uuid", "webkit2gtk", "webview2-com", + "window-vibrancy", "windows 0.48.0", ] [[package]] name = "tauri-build" -version = "2.0.0-alpha.9" +version = "2.0.0-alpha.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59048e05398d7d53e2d73d7f7fd14fbab53ec9f90f4b91e3c08f263e07ffc569" +checksum = "55e3fe1435d7bcf64d15182815f5e1b0b05ec71cd365ed5055204efb5436ebc4" dependencies = [ "anyhow", "cargo_toml", @@ -4888,9 +4901,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.0-alpha.8" +version = "2.0.0-alpha.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8acf40451edf9ccd16d110cb10e9959fec6ccca286c5cc66b859878f8aa9a7b" +checksum = "ff206ba5a7de8f20068f36d5fa49756a9fd375a156a2332278273b6d0dc57033" dependencies = [ "base64", "brotli", @@ -4914,9 +4927,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.0-alpha.8" +version = "2.0.0-alpha.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7037ba4260be47f4d6dab8c781bd15910ef1d3c16c74bf3e3c47e69c250ab82" +checksum = "d29a29d42cca831a9d9c8be91412ef6416813e7307e8dcfd1df38f3b13f3cc73" dependencies = [ "heck", "proc-macro2", @@ -4926,18 +4939,10 @@ dependencies = [ "tauri-utils", ] -[[package]] -name = "tauri-plugin-app" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" -dependencies = [ - "tauri", -] - [[package]] name = "tauri-plugin-autostart" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "auto-launch", "log", @@ -4949,8 +4954,8 @@ dependencies = [ [[package]] name = "tauri-plugin-cli" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "clap", "log", @@ -4962,8 +4967,8 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "arboard", "log", @@ -4976,8 +4981,8 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "glib", "log", @@ -4993,8 +4998,8 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "anyhow", "glob", @@ -5006,8 +5011,8 @@ dependencies = [ [[package]] name = "tauri-plugin-http" -version = "2.0.0-alpha.3" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.4" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "data-url", "glob", @@ -5023,8 +5028,8 @@ dependencies = [ [[package]] name = "tauri-plugin-notification" -version = "2.0.0-alpha.3" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.4" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "log", "notify-rust", @@ -5041,8 +5046,8 @@ dependencies = [ [[package]] name = "tauri-plugin-os" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "gethostname 0.4.3", "log", @@ -5057,16 +5062,16 @@ dependencies = [ [[package]] name = "tauri-plugin-process" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "tauri", ] [[package]] name = "tauri-plugin-shell" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "encoding_rs", "log", @@ -5082,8 +5087,8 @@ dependencies = [ [[package]] name = "tauri-plugin-single-instance" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "log", "serde", @@ -5096,8 +5101,8 @@ dependencies = [ [[package]] name = "tauri-plugin-sql" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "futures-core", "log", @@ -5112,8 +5117,8 @@ dependencies = [ [[package]] name = "tauri-plugin-store" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "log", "serde", @@ -5124,11 +5129,12 @@ dependencies = [ [[package]] name = "tauri-plugin-updater" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "base64", "dirs-next", + "flate2", "futures-util", "http", "minisign-verify", @@ -5149,8 +5155,8 @@ dependencies = [ [[package]] name = "tauri-plugin-upload" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" +version = "2.0.0-alpha.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#76cfdc32b4593acfdfed95bf3028cdba0d83fe61" dependencies = [ "futures-util", "log", @@ -5164,21 +5170,11 @@ dependencies = [ "tokio-util", ] -[[package]] -name = "tauri-plugin-window" -version = "2.0.0-alpha.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#1240631840060f98b493c3cd01120ac2b65e88f2" -dependencies = [ - "serde", - "tauri", - "thiserror", -] - [[package]] name = "tauri-runtime" -version = "1.0.0-alpha.2" +version = "1.0.0-alpha.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34b124f7731f3981deba3b643b2f1c8eaff59f3d6929edb401e1fc929ad93df" +checksum = "c373492a8e2d369c638bff48fc07abbe7292f8ddb867bc3b992fb7ea10006212" dependencies = [ "gtk", "http", @@ -5189,26 +5185,23 @@ dependencies = [ "tauri-utils", "thiserror", "url", - "uuid", "windows 0.48.0", ] [[package]] name = "tauri-runtime-wry" -version = "1.0.0-alpha.3" +version = "1.0.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b94248fbaf1169c1fb085a2c43f49af3de650f6972a64d6f2bdf876c60949d5" +checksum = "ef7b8a49504f67c65a55188013439edf815356a6f8e2a9d2ed005120a201c98f" dependencies = [ "cocoa 0.24.1", "gtk", "http", "jni", "percent-encoding", - "rand 0.8.5", "raw-window-handle", "tauri-runtime", "tauri-utils", - "uuid", "webkit2gtk", "webview2-com", "windows 0.48.0", @@ -5217,9 +5210,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.0-alpha.8" +version = "2.0.0-alpha.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "931ead8db578bc2f9aee6636345fe5b900cfa2b9985a1783913200fab5e607f1" +checksum = "4b821e0e6b5b94c6bde3c95568f5161eb70939a7b0d511f79c0cf85fed3b29c9" dependencies = [ "brotli", "ctor", @@ -5232,7 +5225,7 @@ dependencies = [ "kuchikiki", "log", "memchr", - "phf 0.10.1", + "phf 0.11.2", "proc-macro2", "quote", "semver", @@ -5242,7 +5235,7 @@ dependencies = [ "thiserror", "url", "walkdir", - "windows 0.48.0", + "windows 0.51.1", ] [[package]] @@ -5261,20 +5254,20 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "006851c9ccefa3c38a7646b8cec804bb429def3da10497bfa977179869c3e8e2" dependencies = [ - "quick-xml 0.30.0", + "quick-xml", "windows 0.51.1", ] [[package]] name = "tempfile" -version = "3.8.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand 2.0.1", - "redox_syscall 0.3.5", - "rustix 0.38.19", + "redox_syscall 0.4.1", + "rustix 0.38.21", "windows-sys 0.48.0", ] @@ -5297,18 +5290,18 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", @@ -5392,7 +5385,7 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.4", + "socket2 0.5.5", "tokio-macros", "windows-sys 0.48.0", ] @@ -5431,9 +5424,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -5457,21 +5450,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "3efaf127c78d5339cc547cce4e4d973bd5e4f56e949a06d091c082ebeef2f800" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.20.5", ] [[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", ] @@ -5491,9 +5484,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "782bf6c2ddf761c1e7855405e8975472acf76f7f36d0d4328bd3b7a2fae12a85" dependencies = [ "indexmap 2.0.2", "serde", @@ -5510,9 +5503,9 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.39" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2ef2af84856a50c1d430afce2fdded0a4ec7eda868db86409b4543df0797f9" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "log", "pin-project-lite", @@ -5543,12 +5536,12 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] @@ -5661,9 +5654,9 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" @@ -5943,8 +5936,8 @@ dependencies = [ "webview2-com-macros", "webview2-com-sys", "windows 0.48.0", - "windows-implement", - "windows-interface", + "windows-implement 0.48.0", + "windows-interface 0.48.0", ] [[package]] @@ -6025,6 +6018,18 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "window-vibrancy" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5931735e675b972fada30c7a402915d4d827aa5ef6c929c133d640c4b785e963" +dependencies = [ + "cocoa 0.25.0", + "objc", + "raw-window-handle", + "windows-sys 0.48.0", +] + [[package]] name = "windows" version = "0.44.0" @@ -6040,8 +6045,8 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.48.0", + "windows-interface 0.48.0", "windows-targets 0.48.5", ] @@ -6052,6 +6057,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" dependencies = [ "windows-core", + "windows-implement 0.51.1", + "windows-interface 0.51.1", "windows-targets 0.48.5", ] @@ -6085,6 +6092,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "windows-implement" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb2b158efec5af20d8846836622f50a87e6556b9153a42772fa047f773c0e555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "windows-interface" version = "0.48.0" @@ -6096,6 +6114,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "windows-interface" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0546e63e1ce64c04403d2311fa0e3ab5ae3a367bd524b4a38d8d8d18c70cfa76" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "windows-metadata" version = "0.48.0" @@ -6314,7 +6343,7 @@ dependencies = [ "webkit2gtk-sys", "webview2-com", "windows 0.48.0", - "windows-implement", + "windows-implement 0.48.0", ] [[package]] @@ -6456,6 +6485,26 @@ dependencies = [ "zvariant", ] +[[package]] +name = "zerocopy" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81ba595b9f2772fbee2312de30eeb80ec773b4cb2f1e8098db024afadda6c06f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772666c41fb6dceaf520b564b962d738a8e1a83b41bd48945f50837aed78bb1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "zeroize" version = "1.6.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 049e6797..1559a253 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -18,7 +18,6 @@ tauri = { version = "2.0.0-alpha", features = [ "macos-private-api", "native-tls-vendored", ] } -tauri-plugin-app = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-cli = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-clipboard-manager = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-dialog = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } @@ -29,7 +28,6 @@ tauri-plugin-os = { git = "https://github.com/tauri-apps/plugins-workspace", bra tauri-plugin-process = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-shell = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-updater = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } -tauri-plugin-window = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-single-instance = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-autostart = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-store = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 24b5a5ee..d59d0edc 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -114,7 +114,6 @@ fn main() { .plugin(tauri_plugin_updater::Builder::new().build())?; Ok(()) }) - .plugin(tauri_plugin_app::init()) .plugin(tauri_plugin_clipboard_manager::init()) .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_fs::init()) @@ -125,7 +124,6 @@ fn main() { .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_upload::init()) .plugin(tauri_plugin_updater::Builder::new().build()) - .plugin(tauri_plugin_window::init()) .plugin( tauri_plugin_sql::Builder::default() .add_migrations( diff --git a/src/libs/storage/instance.ts b/src/libs/storage/instance.ts index a13eecab..cfe84e83 100644 --- a/src/libs/storage/instance.ts +++ b/src/libs/storage/instance.ts @@ -1,5 +1,5 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/primitives'; import { Platform } from '@tauri-apps/plugin-os'; import Database from '@tauri-apps/plugin-sql'; diff --git a/src/shared/avatarUploader.tsx b/src/shared/avatarUploader.tsx index f46f5369..1a870867 100644 --- a/src/shared/avatarUploader.tsx +++ b/src/shared/avatarUploader.tsx @@ -1,5 +1,6 @@ import { message, open } from '@tauri-apps/plugin-dialog'; import { readBinaryFile } from '@tauri-apps/plugin-fs'; +import { fetch } from '@tauri-apps/plugin-http'; import { Dispatch, SetStateAction, useState } from 'react'; import { LoaderIcon, PlusIcon } from '@shared/icons'; diff --git a/src/shared/bannerUploader.tsx b/src/shared/bannerUploader.tsx index 84d88495..5ec88b5c 100644 --- a/src/shared/bannerUploader.tsx +++ b/src/shared/bannerUploader.tsx @@ -1,5 +1,6 @@ import { message, open } from '@tauri-apps/plugin-dialog'; import { readBinaryFile } from '@tauri-apps/plugin-fs'; +import { fetch } from '@tauri-apps/plugin-http'; import { Dispatch, SetStateAction, useState } from 'react'; import { LoaderIcon, PlusIcon } from '@shared/icons'; diff --git a/src/shared/notes/actions/zap.tsx b/src/shared/notes/actions/zap.tsx index 08ba3d86..9b2828c2 100644 --- a/src/shared/notes/actions/zap.tsx +++ b/src/shared/notes/actions/zap.tsx @@ -1,7 +1,7 @@ import { webln } from '@getalby/sdk'; import { SendPaymentResponse } from '@getalby/sdk/dist/types'; import * as Dialog from '@radix-ui/react-dialog'; -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/primitives'; import { message } from '@tauri-apps/plugin-dialog'; import { QRCodeSVG } from 'qrcode.react'; import { useEffect, useRef, useState } from 'react'; diff --git a/src/shared/notes/kinds/articleDetail.tsx b/src/shared/notes/kinds/articleDetail.tsx index 5cee404e..724a8cc4 100644 --- a/src/shared/notes/kinds/articleDetail.tsx +++ b/src/shared/notes/kinds/articleDetail.tsx @@ -1,6 +1,7 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; import ReactMarkdown from 'react-markdown'; import { Link } from 'react-router-dom'; +import rehypeExternalLinks from 'rehype-external-links'; import remarkGfm from 'remark-gfm'; import { Boost, Hashtag, Invoice, MentionUser } from '@shared/notes'; @@ -32,6 +33,7 @@ export function ArticleDetailNote({ event }: { event: NDKEvent }) { { const cleanURL = new URL(href); @@ -59,7 +61,6 @@ export function ArticleDetailNote({ event }: { event: NDKEvent }) { } }, }} - linkTarget={'_blank'} > {event.content} diff --git a/src/shared/notes/kinds/text.tsx b/src/shared/notes/kinds/text.tsx index f061738d..2e14c2e1 100644 --- a/src/shared/notes/kinds/text.tsx +++ b/src/shared/notes/kinds/text.tsx @@ -1,6 +1,7 @@ import { memo } from 'react'; import ReactMarkdown from 'react-markdown'; import { Link } from 'react-router-dom'; +import rehypeExternalLinks from 'rehype-external-links'; import remarkGfm from 'remark-gfm'; import { @@ -25,9 +26,9 @@ export function TextNote(props: { content?: string }) { {props.content} @@ -40,6 +41,7 @@ export function TextNote(props: { content?: string }) { { const cleanURL = new URL(href); @@ -69,7 +71,6 @@ export function TextNote(props: { content?: string }) { }} disallowedElements={['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'pre', 'code']} unwrapDisallowed={true} - linkTarget={'_blank'} > {richContent.parsed} diff --git a/src/shared/user.tsx b/src/shared/user.tsx index 7d6baf71..3322d45f 100644 --- a/src/shared/user.tsx +++ b/src/shared/user.tsx @@ -4,6 +4,7 @@ import { minidenticon } from 'minidenticons'; import { memo } from 'react'; import ReactMarkdown from 'react-markdown'; import { Link } from 'react-router-dom'; +import rehypeExternalLinks from 'rehype-external-links'; import remarkGfm from 'remark-gfm'; import { RepostIcon, WorldIcon } from '@shared/icons'; @@ -168,10 +169,10 @@ export const User = memo(function User({

{user?.about || user?.bio || 'No bio'} diff --git a/src/utils/hooks/useOpenGraph.ts b/src/utils/hooks/useOpenGraph.ts index 320b94f4..12cb8e74 100644 --- a/src/utils/hooks/useOpenGraph.ts +++ b/src/utils/hooks/useOpenGraph.ts @@ -1,5 +1,5 @@ import { useQuery } from '@tanstack/react-query'; -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/primitives'; import { Opengraph } from '@utils/types'; From 555c8ec08aa41ef7f62292d345a82ce8a99edf7c Mon Sep 17 00:00:00 2001 From: reya Date: Sat, 28 Oct 2023 07:35:39 +0700 Subject: [PATCH 02/14] migrate to tanstack query v5 --- package.json | 4 +- pnpm-lock.yaml | 92 +++++++++---------- .../auth/components/features/followList.tsx | 14 ++- src/app/auth/onboarding/enrich.tsx | 17 ++-- src/app/auth/onboarding/relays.tsx | 14 ++- src/app/chats/chat.tsx | 10 +- src/app/chats/components/chatListItem.tsx | 2 +- src/app/chats/components/mediaUploader.tsx | 3 - src/app/chats/index.tsx | 20 ++-- src/app/error.tsx | 8 -- src/app/explore/components/groupTitle.tsx | 2 +- .../explore/components/userLatestPosts.tsx | 10 +- src/app/explore/components/userWithDrawer.tsx | 2 +- src/app/new/components/mentionPopupItem.tsx | 2 +- src/app/notes/article.tsx | 2 +- src/app/notes/text.tsx | 2 +- src/app/relays/components/relayEventList.tsx | 14 +-- src/app/relays/components/relayForm.tsx | 5 +- src/app/relays/components/relayList.tsx | 24 ++--- src/app/relays/components/userRelay.tsx | 16 ++-- src/app/settings/components/version.tsx | 15 +-- src/app/users/components/modal.tsx | 4 +- src/app/users/components/stats.tsx | 18 ++-- src/app/users/index.tsx | 22 +++-- src/shared/accounts/active.tsx | 2 +- src/shared/nip05.tsx | 20 ++-- src/shared/notes/child.tsx | 2 +- src/shared/notes/kinds/repost.tsx | 16 ++-- src/shared/notes/mentions/note.tsx | 2 +- src/shared/notes/metadata.tsx | 18 ++-- src/shared/notes/preview/link.tsx | 2 +- src/shared/notes/stats.tsx | 13 +-- src/shared/notification/notifyNote.tsx | 2 +- src/shared/user.tsx | 2 +- src/shared/widgets/eventLoader.tsx | 4 +- src/shared/widgets/global/articles.tsx | 12 +-- src/shared/widgets/global/files.tsx | 12 +-- src/shared/widgets/global/hashtag.tsx | 12 +-- src/shared/widgets/local/articles.tsx | 3 +- src/shared/widgets/local/feeds.tsx | 3 +- src/shared/widgets/local/files.tsx | 3 +- src/shared/widgets/local/follows.tsx | 3 +- src/shared/widgets/local/network.tsx | 3 +- src/shared/widgets/local/thread.tsx | 2 +- src/shared/widgets/local/user.tsx | 20 ++-- .../widgets/nostrBand/trendingAccounts.tsx | 20 ++-- .../widgets/nostrBand/trendingNotes.tsx | 20 ++-- src/shared/widgets/nostrBandUserProfile.tsx | 23 +++-- src/utils/hooks/useEvent.ts | 14 ++- src/utils/hooks/useOpenGraph.ts | 18 ++-- src/utils/hooks/useProfile.ts | 22 ++--- 51 files changed, 290 insertions(+), 305 deletions(-) diff --git a/package.json b/package.json index 802ee3d6..10d8edcb 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "html-to-text": "^9.0.5", "light-bolt11-decoder": "^3.0.0", "lru-cache": "^10.0.1", - "media-chrome": "^1.4.4", + "media-chrome": "^1.4.5", "million": "^2.6.4", "minidenticons": "^4.2.0", "nostr-fetch": "^0.13.0", @@ -86,7 +86,7 @@ "tauri-controls": "^0.2.0", "tippy.js": "^6.3.7", "tiptap-markdown": "^0.8.2", - "virtua": "^0.15.4", + "virtua": "^0.15.6", "zustand": "^4.4.4" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0736a890..57e70a85 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,43 +51,43 @@ dependencies: specifier: ^5.0.5 version: 5.0.5(react-dom@18.2.0)(react@18.2.0) '@tauri-apps/api': - specifier: ^2.0.0-alpha.9 + specifier: 2.0.0-alpha.9 version: 2.0.0-alpha.9 '@tauri-apps/cli': - specifier: ^2.0.0-alpha.16 + specifier: 2.0.0-alpha.16 version: 2.0.0-alpha.16 '@tauri-apps/plugin-clipboard-manager': - specifier: ^2.0.0-alpha.2 + specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-dialog': - specifier: ^2.0.0-alpha.2 + specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-fs': - specifier: ^2.0.0-alpha.2 + specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-http': - specifier: ^2.0.0-alpha.2 + specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-notification': - specifier: ^2.0.0-alpha.2 + specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-os': - specifier: ^2.0.0-alpha.3 + specifier: 2.0.0-alpha.3 version: 2.0.0-alpha.3 '@tauri-apps/plugin-process': - specifier: ^2.0.0-alpha.2 + specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-shell': - specifier: ^2.0.0-alpha.2 + specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-sql': - specifier: ^2.0.0-alpha.2 + specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-updater': - specifier: ^2.0.0-alpha.2 + specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-upload': - specifier: ^2.0.0-alpha.2 + specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tiptap/extension-character-count': specifier: ^2.1.12 @@ -141,8 +141,8 @@ dependencies: specifier: ^10.0.1 version: 10.0.1 media-chrome: - specifier: ^1.4.4 - version: 1.4.4 + specifier: ^1.4.5 + version: 1.4.5 million: specifier: ^2.6.4 version: 2.6.4 @@ -210,8 +210,8 @@ dependencies: specifier: ^0.8.2 version: 0.8.2(@tiptap/core@2.1.12) virtua: - specifier: ^0.15.4 - version: 0.15.4(react-dom@18.2.0)(react@18.2.0) + specifier: ^0.15.6 + version: 0.15.6(react-dom@18.2.0)(react@18.2.0) zustand: specifier: ^4.4.4 version: 4.4.4(@types/react@18.2.33)(react@18.2.0) @@ -2549,9 +2549,9 @@ packages: prosemirror-schema-list: 1.3.0 prosemirror-state: 1.4.3 prosemirror-tables: 1.3.4 - prosemirror-trailing-node: 2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.1) + prosemirror-trailing-node: 2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.2) prosemirror-transform: 1.8.0 - prosemirror-view: 1.32.1 + prosemirror-view: 1.32.2 dev: false /@tiptap/react@2.1.12(@tiptap/core@2.1.12)(@tiptap/pm@2.1.12)(react-dom@18.2.0)(react@18.2.0): @@ -3047,16 +3047,16 @@ packages: - '@swc/helpers' dev: true - /acorn-jsx@5.3.2(acorn@8.11.1): + /acorn-jsx@5.3.2(acorn@8.11.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.1 + acorn: 8.11.2 dev: true - /acorn@8.11.1: - resolution: {integrity: sha512-IJTNCJMRHfRfb8un89z1QtS0x890C2QUrUxFMK8zy+RizcId6mfnqOf68Bu9YkDgpLYuvCm6aYbwDatXVZPjMQ==} + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} engines: {node: '>=0.4.0'} hasBin: true @@ -3217,7 +3217,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.22.1 - caniuse-lite: 1.0.30001554 + caniuse-lite: 1.0.30001555 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -3269,8 +3269,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001554 - electron-to-chromium: 1.4.568 + caniuse-lite: 1.0.30001555 + electron-to-chromium: 1.4.569 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) @@ -3299,8 +3299,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - /caniuse-lite@1.0.30001554: - resolution: {integrity: sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==} + /caniuse-lite@1.0.30001555: + resolution: {integrity: sha512-NzbUFKUnJ3DTcq6YyZB6+qqhfD112uR3uoEnkmfzm2wVzUNsFkU7AwBjKQ654Sp5cau0JxhFyRSn/tQZ+XfygA==} /case-anything@2.1.13: resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} @@ -3674,8 +3674,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.568: - resolution: {integrity: sha512-3TCOv8+BY6Ltpt1/CmGBMups2IdKOyfEmz4J8yIS4xLSeMm0Rf+psSaxLuswG9qMKt+XbNbmADybtXGpTFlbDg==} + /electron-to-chromium@1.4.569: + resolution: {integrity: sha512-LsrJjZ0IbVy12ApW3gpYpcmHS3iRxH4bkKOW98y1/D+3cvDUWGcbzbsFinfUS8knpcZk/PG/2p/RnkMCYN7PVg==} /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -3988,8 +3988,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.1 - acorn-jsx: 5.3.2(acorn@8.11.1) + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 dev: true @@ -5026,8 +5026,8 @@ packages: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: false - /media-chrome@1.4.4: - resolution: {integrity: sha512-L3EImWE2ft3dEXnku7mwEl71L8GWFvsnqQQsmtlbuLqekCkIACjL1KjLErReALB9JmrY19ffB4GeGZjLZDwALg==} + /media-chrome@1.4.5: + resolution: {integrity: sha512-WRi+4XV4oCx8nwUEhhKxqF78mdQDVTPHgq2g/Mkt8C8lmIaca9WwnahZ0MHx8fy8XAEaiIv1B25555lpvZncJQ==} dev: false /merge-stream@2.0.0: @@ -5791,7 +5791,7 @@ packages: dependencies: prosemirror-state: 1.4.3 prosemirror-transform: 1.8.0 - prosemirror-view: 1.32.1 + prosemirror-view: 1.32.2 dev: false /prosemirror-gapcursor@1.3.2: @@ -5800,7 +5800,7 @@ packages: prosemirror-keymap: 1.2.2 prosemirror-model: 1.19.3 prosemirror-state: 1.4.3 - prosemirror-view: 1.32.1 + prosemirror-view: 1.32.2 dev: false /prosemirror-history@1.3.2: @@ -5808,7 +5808,7 @@ packages: dependencies: prosemirror-state: 1.4.3 prosemirror-transform: 1.8.0 - prosemirror-view: 1.32.1 + prosemirror-view: 1.32.2 rope-sequence: 1.3.4 dev: false @@ -5867,7 +5867,7 @@ packages: dependencies: prosemirror-model: 1.19.3 prosemirror-transform: 1.8.0 - prosemirror-view: 1.32.1 + prosemirror-view: 1.32.2 dev: false /prosemirror-tables@1.3.4: @@ -5877,10 +5877,10 @@ packages: prosemirror-model: 1.19.3 prosemirror-state: 1.4.3 prosemirror-transform: 1.8.0 - prosemirror-view: 1.32.1 + prosemirror-view: 1.32.2 dev: false - /prosemirror-trailing-node@2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.1): + /prosemirror-trailing-node@2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.2): resolution: {integrity: sha512-8zcZORYj/8WEwsGo6yVCRXFMOfBo0Ub3hCUvmoWIZYfMP26WqENU0mpEP27w7mt8buZWuGrydBewr0tOArPb1Q==} peerDependencies: prosemirror-model: ^1.19.0 @@ -5892,7 +5892,7 @@ packages: escape-string-regexp: 4.0.0 prosemirror-model: 1.19.3 prosemirror-state: 1.4.3 - prosemirror-view: 1.32.1 + prosemirror-view: 1.32.2 dev: false /prosemirror-transform@1.8.0: @@ -5901,8 +5901,8 @@ packages: prosemirror-model: 1.19.3 dev: false - /prosemirror-view@1.32.1: - resolution: {integrity: sha512-9SnB4HBgRczzTyIMZLPE1iszegL04hNfUyS8uPtP1RPxNM2NTCiIs8KwNsJU4nbZO9rxJTwVTv7Jm3zU4CR78A==} + /prosemirror-view@1.32.2: + resolution: {integrity: sha512-l2RQUGaiDI8SG8ZjWIkjT8yjGmNwdzMFMzQmxv/Kh8Vx+ICnz5R+K0mrOS16rhfjX7n2t4emU0goh7TerQC3mw==} dependencies: prosemirror-model: 1.19.3 prosemirror-state: 1.4.3 @@ -6795,7 +6795,7 @@ packages: /unplugin@1.5.0: resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==} dependencies: - acorn: 8.11.1 + acorn: 8.11.2 chokidar: 3.5.3 webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 @@ -6887,8 +6887,8 @@ packages: vfile-message: 4.0.2 dev: false - /virtua@0.15.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-gC52UMvipt5ejDuolszdMAIapoDZul3cpsYIznjEUUbws169/dFHRwzzoI7e5niViDBBt6e+N4RnicGdcuc0UQ==} + /virtua@0.15.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-j9EfyAmpp6VwuHmnXkWpzciHRdlY7XGPzZg3ZqOPFW+phNUnFQALYdrThc3CYHZFsj380ieIegdjPGS+Qbkuyg==} peerDependencies: react: '>=16.14.0' react-dom: '>=16.14.0' diff --git a/src/app/auth/components/features/followList.tsx b/src/app/auth/components/features/followList.tsx index a6da52a3..1fcf7909 100644 --- a/src/app/auth/components/features/followList.tsx +++ b/src/app/auth/components/features/followList.tsx @@ -9,9 +9,9 @@ import { User } from '@shared/user'; export function FollowList() { const { db } = useStorage(); const { ndk } = useNDK(); - const { status, data } = useQuery( - ['follows'], - async () => { + const { status, data } = useQuery({ + queryKey: ['follows'], + queryFn: async () => { const user = ndk.getUser({ hexpubkey: db.account.pubkey }); const follows = await user.follows(); const followsAsArr = []; @@ -29,16 +29,14 @@ export function FollowList() { return followsAsArr; }, - { - refetchOnWindowFocus: false, - } - ); + refetchOnWindowFocus: false, + }); return (
Your follows
- {status === 'loading' ? ( + {status === 'pending' ? ( ) : (
diff --git a/src/app/auth/onboarding/enrich.tsx b/src/app/auth/onboarding/enrich.tsx index 350a2698..37de605e 100644 --- a/src/app/auth/onboarding/enrich.tsx +++ b/src/app/auth/onboarding/enrich.tsx @@ -17,12 +17,15 @@ import { arrayToNIP02 } from '@utils/transform'; export function OnboardEnrichScreen() { const { ndk } = useNDK(); const { db } = useStorage(); - const { status, data } = useQuery(['trending-profiles-widget'], async () => { - const res = await fetch('https://api.nostr.band/v0/trending/profiles'); - if (!res.ok) { - throw new Error('Error'); - } - return res.json(); + const { status, data } = useQuery({ + queryKey: ['trending-profiles-widget'], + queryFn: async () => { + const res = await fetch('https://api.nostr.band/v0/trending/profiles'); + if (!res.ok) { + throw new Error('Error'); + } + return res.json(); + }, }); const [loading, setLoading] = useState(false); @@ -90,7 +93,7 @@ export function OnboardEnrichScreen() {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/app/auth/onboarding/relays.tsx b/src/app/auth/onboarding/relays.tsx index 3c940fae..04f38471 100644 --- a/src/app/auth/onboarding/relays.tsx +++ b/src/app/auth/onboarding/relays.tsx @@ -24,15 +24,13 @@ export function OnboardRelaysScreen() { const { db } = useStorage(); const { ndk } = useNDK(); const { getAllRelaysByUsers } = useNostr(); - const { status, data } = useQuery( - ['relays'], - async () => { + const { status, data } = useQuery({ + queryKey: ['relays'], + queryFn: async () => { return await getAllRelaysByUsers(); }, - { - refetchOnWindowFocus: false, - } - ); + refetchOnWindowFocus: false, + }); const toggleRelay = (relay: string) => { if (relays.has(relay)) { @@ -89,7 +87,7 @@ export function OnboardRelaysScreen() {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/app/chats/chat.tsx b/src/app/chats/chat.tsx index 52571662..243cbae9 100644 --- a/src/app/chats/chat.tsx +++ b/src/app/chats/chat.tsx @@ -22,8 +22,12 @@ export function ChatScreen() { const { ndk } = useNDK(); const { pubkey } = useParams(); const { fetchNIP04Messages } = useNostr(); - const { status, data } = useQuery(['nip04-dm', pubkey], async () => { - return await fetchNIP04Messages(pubkey); + const { status, data } = useQuery({ + queryKey: ['nip04-dm', pubkey], + queryFn: async () => { + return await fetchNIP04Messages(pubkey); + }, + refetchOnWindowFocus: false, }); const renderItem = useCallback( @@ -69,7 +73,7 @@ export function ChatScreen() {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/app/chats/components/chatListItem.tsx b/src/app/chats/components/chatListItem.tsx index 6d5e2f0d..99f1707d 100644 --- a/src/app/chats/components/chatListItem.tsx +++ b/src/app/chats/components/chatListItem.tsx @@ -19,7 +19,7 @@ export const ChatListItem = memo(function ChatListItem({ event }: { event: NDKEv const svgURI = 'data:image/svg+xml;utf8,' + encodeURIComponent(minidenticon(event.pubkey, 90, 50)); - if (status === 'loading') { + if (status === 'pending') { return (
diff --git a/src/app/chats/components/mediaUploader.tsx b/src/app/chats/components/mediaUploader.tsx index 54127889..de4b8ac6 100644 --- a/src/app/chats/components/mediaUploader.tsx +++ b/src/app/chats/components/mediaUploader.tsx @@ -3,14 +3,11 @@ import { Dispatch, SetStateAction, useState } from 'react'; import { LoaderIcon, MediaIcon } from '@shared/icons'; -import { useNostr } from '@utils/hooks/useNostr'; - export function MediaUploader({ setState, }: { setState: Dispatch>; }) { - const { upload } = useNostr(); const [loading, setLoading] = useState(false); const uploadMedia = async () => { diff --git a/src/app/chats/index.tsx b/src/app/chats/index.tsx index ea5ed2f7..67698c9a 100644 --- a/src/app/chats/index.tsx +++ b/src/app/chats/index.tsx @@ -11,18 +11,16 @@ import { useNostr } from '@utils/hooks/useNostr'; export function ChatsScreen() { const { getAllNIP04Chats } = useNostr(); - const { status, data } = useQuery( - ['nip04-chats'], - async () => { + const { status, data } = useQuery({ + queryKey: ['nip04-chats'], + queryFn: async () => { return await getAllNIP04Chats(); }, - { - refetchOnWindowFocus: false, - refetchOnMount: false, - refetchOnReconnect: false, - staleTime: Infinity, - } - ); + refetchOnWindowFocus: false, + refetchOnMount: false, + refetchOnReconnect: false, + staleTime: Infinity, + }); const renderItem = useCallback( (event: NDKEvent) => { @@ -43,7 +41,7 @@ export function ChatsScreen() {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/app/error.tsx b/src/app/error.tsx index 815bef80..8b667ec8 100644 --- a/src/app/error.tsx +++ b/src/app/error.tsx @@ -8,7 +8,6 @@ interface RouteError { interface DebugInfo { os: null | string; - version: null | string; appDir: null | string; } @@ -18,24 +17,20 @@ export function ErrorScreen() { const [debugInfo, setDebugInfo] = useState({ os: null, - version: null, appDir: null, }); useEffect(() => { async function getInformation() { const { platform, version } = await import('@tauri-apps/plugin-os'); - const { getVersion } = await import('@tauri-apps/plugin-app'); const { appConfigDir } = await import('@tauri-apps/api/path'); const platformName = await platform(); const osVersion = await version(); - const appVersion = await getVersion(); const appDir = await appConfigDir(); setDebugInfo({ os: platformName + ' ' + osVersion, - version: appVersion, appDir: appDir, }); } @@ -59,9 +54,6 @@ export function ErrorScreen() {

Current location: {location.pathname}

-

- App version: {debugInfo.version} -

Platform: {debugInfo.os}

diff --git a/src/app/explore/components/groupTitle.tsx b/src/app/explore/components/groupTitle.tsx index 8a6ca858..1d9c1ca6 100644 --- a/src/app/explore/components/groupTitle.tsx +++ b/src/app/explore/components/groupTitle.tsx @@ -5,7 +5,7 @@ import { useProfile } from '@utils/hooks/useProfile'; export const GroupTitle = memo(function GroupTitle({ pubkey }: { pubkey: string }) { const { status, user } = useProfile(pubkey); - if (status === 'loading') { + if (status === 'pending') { return
; } diff --git a/src/app/explore/components/userLatestPosts.tsx b/src/app/explore/components/userLatestPosts.tsx index 4a6f18bc..62b553c2 100644 --- a/src/app/explore/components/userLatestPosts.tsx +++ b/src/app/explore/components/userLatestPosts.tsx @@ -16,8 +16,12 @@ import { useNostr } from '@utils/hooks/useNostr'; export function UserLatestPosts({ pubkey }: { pubkey: string }) { const { getEventsByPubkey } = useNostr(); - const { status, data } = useQuery(['user-posts', pubkey], async () => { - return await getEventsByPubkey(pubkey); + const { status, data } = useQuery({ + queryKey: ['user-posts', pubkey], + queryFn: async () => { + return await getEventsByPubkey(pubkey); + }, + refetchOnWindowFocus: false, }); const renderItem = useCallback( @@ -60,7 +64,7 @@ export function UserLatestPosts({ pubkey }: { pubkey: string }) { Latest post
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/app/explore/components/userWithDrawer.tsx b/src/app/explore/components/userWithDrawer.tsx index 54ac60a9..a2271c4e 100644 --- a/src/app/explore/components/userWithDrawer.tsx +++ b/src/app/explore/components/userWithDrawer.tsx @@ -84,7 +84,7 @@ export const UserWithDrawer = memo(function UserWithDrawer({
- {status === 'loading' ? ( + {status === 'pending' ? (

Loading...

diff --git a/src/app/new/components/mentionPopupItem.tsx b/src/app/new/components/mentionPopupItem.tsx index de27f95e..c2fa6614 100644 --- a/src/app/new/components/mentionPopupItem.tsx +++ b/src/app/new/components/mentionPopupItem.tsx @@ -6,7 +6,7 @@ import { displayNpub } from '@utils/shortenKey'; export function MentionPopupItem({ pubkey, embed }: { pubkey: string; embed?: string }) { const { status, user } = useProfile(pubkey, embed); - if (status === 'loading') { + if (status === 'pending') { return (
diff --git a/src/app/notes/article.tsx b/src/app/notes/article.tsx index 7b636f5e..77a73e34 100644 --- a/src/app/notes/article.tsx +++ b/src/app/notes/article.tsx @@ -72,7 +72,7 @@ export function ArticleNoteScreen() {
- {status === 'loading' ? ( + {status === 'pending' ? (
Loading...
) : (
diff --git a/src/app/notes/text.tsx b/src/app/notes/text.tsx index 24ea353d..8d832a96 100644 --- a/src/app/notes/text.tsx +++ b/src/app/notes/text.tsx @@ -91,7 +91,7 @@ export function TextNoteScreen() {
- {status === 'loading' ? ( + {status === 'pending' ? (
Loading...
) : (
diff --git a/src/app/relays/components/relayEventList.tsx b/src/app/relays/components/relayEventList.tsx index 7333a2cd..399e1666 100644 --- a/src/app/relays/components/relayEventList.tsx +++ b/src/app/relays/components/relayEventList.tsx @@ -17,9 +17,9 @@ import { export function RelayEventList({ relayUrl }: { relayUrl: string }) { const { fetcher } = useNDK(); - const { status, data } = useQuery( - ['relay-event'], - async () => { + const { status, data } = useQuery({ + queryKey: ['relay-event'], + queryFn: async () => { const url = 'wss://' + relayUrl; const events = await fetcher.fetchLatestEvents( [url], @@ -30,8 +30,8 @@ export function RelayEventList({ relayUrl }: { relayUrl: string }) { ); return events as unknown as NDKEvent[]; }, - { refetchOnWindowFocus: false } - ); + refetchOnWindowFocus: false, + }); const renderItem = useCallback( (event: NDKEvent) => { @@ -70,7 +70,7 @@ export function RelayEventList({ relayUrl }: { relayUrl: string }) { return (
- {status === 'loading' ? ( + {status === 'pending' ? (
@@ -78,7 +78,7 @@ export function RelayEventList({ relayUrl }: { relayUrl: string }) {
) : ( - +
{data.map((item) => renderItem(item))}
diff --git a/src/app/relays/components/relayForm.tsx b/src/app/relays/components/relayForm.tsx index 7bb6ea4b..63115414 100644 --- a/src/app/relays/components/relayForm.tsx +++ b/src/app/relays/components/relayForm.tsx @@ -25,7 +25,10 @@ export function RelayForm() { const res = await db.createRelay(url); if (!res) return setError("You're already using this relay"); - queryClient.invalidateQueries(['user-relay']); + queryClient.invalidateQueries({ + queryKey: ['user-relay'], + }); + setError(''); setUrl(''); } else { diff --git a/src/app/relays/components/relayList.tsx b/src/app/relays/components/relayList.tsx index c9723bf5..e92221e4 100644 --- a/src/app/relays/components/relayList.tsx +++ b/src/app/relays/components/relayList.tsx @@ -17,18 +17,16 @@ export function RelayList() { const { getAllRelaysByUsers } = useNostr(); const { db } = useStorage(); - const { status, data } = useQuery( - ['relays'], - async () => { + const { status, data } = useQuery({ + queryKey: ['relays'], + queryFn: async () => { return await getAllRelaysByUsers(); }, - { - refetchOnWindowFocus: false, - refetchOnMount: false, - refetchOnReconnect: false, - staleTime: Infinity, - } - ); + refetchOnWindowFocus: false, + refetchOnMount: false, + refetchOnReconnect: false, + staleTime: Infinity, + }); const inspectRelay = (relayUrl: string) => { const url = new URL(relayUrl); @@ -40,12 +38,14 @@ export function RelayList() { const res = await db.createRelay(url); if (!res) await message("You're aldready connected to this relay"); - queryClient.invalidateQueries(['user-relay']); + queryClient.invalidateQueries({ + queryKey: ['user-relay'], + }); }; return (
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/app/relays/components/userRelay.tsx b/src/app/relays/components/userRelay.tsx index ad9af7c0..9c8e97ea 100644 --- a/src/app/relays/components/userRelay.tsx +++ b/src/app/relays/components/userRelay.tsx @@ -12,22 +12,24 @@ export function UserRelay() { const { relayUrls } = useNDK(); const { db } = useStorage(); - const { status, data } = useQuery( - ['user-relay'], - async () => { + const { status, data } = useQuery({ + queryKey: ['user-relay'], + queryFn: async () => { return await db.getExplicitRelayUrls(); }, - { refetchOnWindowFocus: false } - ); + refetchOnWindowFocus: false, + }); const removeRelay = async (relayUrl: string) => { await db.removeRelay(relayUrl); - queryClient.invalidateQueries(['user-relay']); + queryClient.invalidateQueries({ + queryKey: ['user-relay'], + }); }; return (
- {status === 'loading' ? ( + {status === 'pending' ? (

Loading...

) : (
diff --git a/src/app/settings/components/version.tsx b/src/app/settings/components/version.tsx index e199311b..ac5ac2ac 100644 --- a/src/app/settings/components/version.tsx +++ b/src/app/settings/components/version.tsx @@ -1,17 +1,4 @@ -import { getVersion } from '@tauri-apps/plugin-app'; -import { useEffect, useState } from 'react'; - export function VersionSetting() { - const [version, setVersion] = useState(''); - - useEffect(() => { - async function checkVersion() { - const appVersion = await getVersion(); - setVersion(appVersion); - } - checkVersion(); - }, []); - return (
@@ -21,7 +8,7 @@ export function VersionSetting() {
- {version} + 2
); diff --git a/src/app/users/components/modal.tsx b/src/app/users/components/modal.tsx index 454805b8..4765ae11 100644 --- a/src/app/users/components/modal.tsx +++ b/src/app/users/components/modal.tsx @@ -210,7 +210,9 @@ export function EditProfileModal() { if (publishedRelays) { // invalid cache - queryClient.invalidateQueries(['user', db.account.pubkey]); + queryClient.invalidateQueries({ + queryKey: ['user', db.account.pubkey] + }); // reset form reset(); // reset state diff --git a/src/app/users/components/stats.tsx b/src/app/users/components/stats.tsx index 26367520..a2c99998 100644 --- a/src/app/users/components/stats.tsx +++ b/src/app/users/components/stats.tsx @@ -5,15 +5,19 @@ import { LoaderIcon } from '@shared/icons'; import { compactNumber } from '@utils/number'; export function UserStats({ pubkey }: { pubkey: string }) { - const { status, data } = useQuery(['user-metadata', pubkey], async () => { - const res = await fetch(`https://api.nostr.band/v0/stats/profile/${pubkey}`); - if (!res.ok) { - throw new Error('Error'); - } - return await res.json(); + const { status, data } = useQuery({ + queryKey: ['user-metadata', pubkey], + + ...async () => { + const res = await fetch(`https://api.nostr.band/v0/stats/profile/${pubkey}`); + if (!res.ok) { + throw new Error('Error'); + } + return await res.json(); + }, }); - if (status === 'loading') { + if (status === 'pending') { return (
diff --git a/src/app/users/index.tsx b/src/app/users/index.tsx index 5fb5dcbc..d2c09b3c 100644 --- a/src/app/users/index.tsx +++ b/src/app/users/index.tsx @@ -19,14 +19,18 @@ import { export function UserScreen() { const { pubkey } = useParams(); const { ndk } = useNDK(); - const { status, data } = useQuery(['user-feed', pubkey], async () => { - const events = await ndk.fetchEvents({ - kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Article], - authors: [pubkey], - limit: 50, - }); - const sorted = [...events].sort((a, b) => b.created_at - a.created_at); - return sorted; + const { status, data } = useQuery({ + queryKey: ['user-feed', pubkey], + queryFn: async () => { + const events = await ndk.fetchEvents({ + kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Article], + authors: [pubkey], + limit: 50, + }); + const sorted = [...events].sort((a, b) => b.created_at - a.created_at); + return sorted; + }, + refetchOnWindowFocus: false, }); // render event match event kind @@ -73,7 +77,7 @@ export function UserScreen() { Latest posts
- {status === 'loading' ? ( + {status === 'pending' ? (
Loading...
) : data.length === 0 ? (
diff --git a/src/shared/accounts/active.tsx b/src/shared/accounts/active.tsx index 5a9658ec..cd6c5984 100644 --- a/src/shared/accounts/active.tsx +++ b/src/shared/accounts/active.tsx @@ -94,7 +94,7 @@ export function ActiveAccount() { ); }, []); - if (status === 'loading') { + if (status === 'pending') { return (
); diff --git a/src/shared/nip05.tsx b/src/shared/nip05.tsx index 4ba38545..a570eb4b 100644 --- a/src/shared/nip05.tsx +++ b/src/shared/nip05.tsx @@ -20,9 +20,9 @@ export const NIP05 = memo(function NIP05({ nip05: string; className?: string; }) { - const { status, data } = useQuery( - ['nip05', nip05], - async () => { + const { status, data } = useQuery({ + queryKey: ['nip05', nip05], + queryFn: async () => { try { const localPath = nip05.split('@')[0]; const service = nip05.split('@')[1]; @@ -47,15 +47,13 @@ export const NIP05 = memo(function NIP05({ throw new Error(`Failed to verify NIP-05, error: ${e}`); } }, - { - refetchOnMount: false, - refetchOnReconnect: false, - refetchOnWindowFocus: false, - staleTime: Infinity, - } - ); + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + staleTime: Infinity, + }); - if (status === 'loading') { + if (status === 'pending') {
; } diff --git a/src/shared/notes/child.tsx b/src/shared/notes/child.tsx index e9221cc8..7f5fffe5 100644 --- a/src/shared/notes/child.tsx +++ b/src/shared/notes/child.tsx @@ -30,7 +30,7 @@ export function ChildNote({ id, root }: { id: string; root?: string }) { } }; - if (status === 'loading') { + if (status === 'pending') { return ( <>
diff --git a/src/shared/notes/kinds/repost.tsx b/src/shared/notes/kinds/repost.tsx index b80e73be..fd095bfb 100644 --- a/src/shared/notes/kinds/repost.tsx +++ b/src/shared/notes/kinds/repost.tsx @@ -28,9 +28,9 @@ export function Repost({ event.content.length > 0 ? JSON.parse(event.content) : null; const { ndk } = useNDK(); - const { status, isError, data } = useQuery( - ['repost', event.id], - async () => { + const { status, isError, data } = useQuery({ + queryKey: ['repost', event.id], + queryFn: async () => { const id = event.tags.find((el) => el[0] === 'e')[1]; if (!id) throw new Error('wrong id'); @@ -39,11 +39,9 @@ export function Repost({ return ndkEvent; }, - { - enabled: embedEvent === null, - refetchOnWindowFocus: false, - } - ); + enabled: embedEvent === null, + refetchOnWindowFocus: false, + }); const renderKind = useCallback((repostEvent: NDKEvent) => { switch (repostEvent.kind) { @@ -87,7 +85,7 @@ export function Repost({ ); } - if (status === 'loading') { + if (status === 'pending') { return (
diff --git a/src/shared/notes/mentions/note.tsx b/src/shared/notes/mentions/note.tsx index bce2ee38..1e463446 100644 --- a/src/shared/notes/mentions/note.tsx +++ b/src/shared/notes/mentions/note.tsx @@ -46,7 +46,7 @@ export const MentionNote = memo(function MentionNote({ id }: { id: string }) { } }; - if (status === 'loading') { + if (status === 'pending') { return (
diff --git a/src/shared/notes/metadata.tsx b/src/shared/notes/metadata.tsx index cd4c46a5..8d6de8c5 100644 --- a/src/shared/notes/metadata.tsx +++ b/src/shared/notes/metadata.tsx @@ -17,9 +17,9 @@ export function NoteMetadata({ id }: { id: string }) { const { db } = useStorage(); const { ndk } = useNDK(); - const { status, data } = useQuery( - ['note-metadata', id], - async () => { + const { status, data } = useQuery({ + queryKey: ['note-metadata', id], + queryFn: async () => { let replies = 0; let zap = 0; const users = []; @@ -53,14 +53,12 @@ export function NoteMetadata({ id }: { id: string }) { return { replies, users, zap }; }, - { - enabled: !!ndk, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - } - ); + enabled: !!ndk, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + }); - if (status === 'loading') { + if (status === 'pending') { return (
diff --git a/src/shared/notes/preview/link.tsx b/src/shared/notes/preview/link.tsx index 8652e917..eeecbc70 100644 --- a/src/shared/notes/preview/link.tsx +++ b/src/shared/notes/preview/link.tsx @@ -8,7 +8,7 @@ export function LinkPreview({ urls }: { urls: string[] }) { return (
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/notes/stats.tsx b/src/shared/notes/stats.tsx index 8c24bf14..147a06c5 100644 --- a/src/shared/notes/stats.tsx +++ b/src/shared/notes/stats.tsx @@ -10,9 +10,9 @@ import { compactNumber } from '@utils/number'; export function NoteStats({ id }: { id: string }) { const { ndk } = useNDK(); - const { status, data } = useQuery( - ['note-stats', id], - async () => { + const { status, data } = useQuery({ + queryKey: ['note-stats', id], + queryFn: async () => { let reactions = 0; let reposts = 0; let zaps = 0; @@ -48,10 +48,11 @@ export function NoteStats({ id }: { id: string }) { return { reposts, reactions, zaps }; }, - { refetchOnWindowFocus: false, refetchOnReconnect: false } - ); + refetchOnWindowFocus: false, + refetchOnReconnect: false, + }); - if (status === 'loading') { + if (status === 'pending') { return (
diff --git a/src/shared/notification/notifyNote.tsx b/src/shared/notification/notifyNote.tsx index 9ec26ea5..44466e75 100644 --- a/src/shared/notification/notifyNote.tsx +++ b/src/shared/notification/notifyNote.tsx @@ -62,7 +62,7 @@ export function NotifyNote({ event }: { event: NDKEvent }) { } }; - if (status === 'loading') { + if (status === 'pending') { return (
diff --git a/src/shared/user.tsx b/src/shared/user.tsx index 3322d45f..65b2f364 100644 --- a/src/shared/user.tsx +++ b/src/shared/user.tsx @@ -46,7 +46,7 @@ export const User = memo(function User({ const svgURI = 'data:image/svg+xml;utf8,' + encodeURIComponent(minidenticon(pubkey, 90, 50)); - if (status === 'loading') { + if (status === 'pending') { if (variant === 'avatar') { return (
diff --git a/src/shared/widgets/eventLoader.tsx b/src/shared/widgets/eventLoader.tsx index 0e373c69..76b6e089 100644 --- a/src/shared/widgets/eventLoader.tsx +++ b/src/shared/widgets/eventLoader.tsx @@ -29,7 +29,9 @@ export function EventLoader({ firstTime }: { firstTime: boolean }) { setProgress(100); setIsFetched(); // invalidate queries - queryClient.invalidateQueries(['local-network-widget']); + queryClient.invalidateQueries({ + queryKey: ['local-network-widget'] + }); await db.updateLastLogin(); } } diff --git a/src/shared/widgets/global/articles.tsx b/src/shared/widgets/global/articles.tsx index 7d202cd6..cc79f203 100644 --- a/src/shared/widgets/global/articles.tsx +++ b/src/shared/widgets/global/articles.tsx @@ -14,9 +14,9 @@ import { Widget } from '@utils/types'; export function GlobalArticlesWidget({ params }: { params: Widget }) { const { ndk } = useNDK(); - const { status, data } = useQuery( - ['global-articles'], - async () => { + const { status, data } = useQuery({ + queryKey: ['global-articles'], + queryFn: async () => { const events = await ndk.fetchEvents({ kinds: [NDKKind.Article], limit: 200, @@ -24,8 +24,8 @@ export function GlobalArticlesWidget({ params }: { params: Widget }) { const sortedEvents = [...events].sort((x, y) => y.created_at - x.created_at); return sortedEvents; }, - { refetchOnWindowFocus: false } - ); + refetchOnWindowFocus: false, + }); // render event match event kind const renderItem = useCallback( @@ -43,7 +43,7 @@ export function GlobalArticlesWidget({ params }: { params: Widget }) {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/global/files.tsx b/src/shared/widgets/global/files.tsx index 05011ea2..d6628b17 100644 --- a/src/shared/widgets/global/files.tsx +++ b/src/shared/widgets/global/files.tsx @@ -15,9 +15,9 @@ import { Widget } from '@utils/types'; export function GlobalFilesWidget({ params }: { params: Widget }) { const { ndk } = useNDK(); - const { status, data } = useQuery( - ['global-file-sharing'], - async () => { + const { status, data } = useQuery({ + queryKey: ['global-file-sharing'], + queryFn: async () => { const events = await ndk.fetchEvents({ // @ts-expect-error, NDK not support file metadata yet kinds: [1063], @@ -26,8 +26,8 @@ export function GlobalFilesWidget({ params }: { params: Widget }) { const sortedEvents = [...events].sort((x, y) => y.created_at - x.created_at); return sortedEvents; }, - { refetchOnWindowFocus: false } - ); + refetchOnWindowFocus: false, + }); // render event match event kind const renderItem = useCallback( @@ -45,7 +45,7 @@ export function GlobalFilesWidget({ params }: { params: Widget }) {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/global/hashtag.tsx b/src/shared/widgets/global/hashtag.tsx index 13c31ce5..99c2b67f 100644 --- a/src/shared/widgets/global/hashtag.tsx +++ b/src/shared/widgets/global/hashtag.tsx @@ -22,9 +22,9 @@ import { Widget } from '@utils/types'; export function GlobalHashtagWidget({ params }: { params: Widget }) { const { ndk } = useNDK(); - const { status, data } = useQuery( - ['hashtag-' + params.title], - async () => { + const { status, data } = useQuery({ + queryKey: ['hashtag-' + params.title], + queryFn: async () => { const events = await ndk.fetchEvents({ kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Article], '#t': [params.content], @@ -33,8 +33,8 @@ export function GlobalHashtagWidget({ params }: { params: Widget }) { const sortedEvents = [...events].sort((x, y) => y.created_at - x.created_at); return sortedEvents; }, - { refetchOnWindowFocus: false } - ); + refetchOnWindowFocus: false, + }); // render event match event kind const renderItem = useCallback( @@ -75,7 +75,7 @@ export function GlobalHashtagWidget({ params }: { params: Widget }) {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/local/articles.tsx b/src/shared/widgets/local/articles.tsx index a4892c53..78a0ced6 100644 --- a/src/shared/widgets/local/articles.tsx +++ b/src/shared/widgets/local/articles.tsx @@ -17,6 +17,7 @@ export function LocalArticlesWidget({ params }: { params: Widget }) { const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ['local-articles'], + initialPageParam: 0, queryFn: async ({ pageParam = 0 }) => { return await db.getAllEventsByKinds([NDKKind.Article], 20, pageParam); }, @@ -45,7 +46,7 @@ export function LocalArticlesWidget({ params }: { params: Widget }) {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/local/feeds.tsx b/src/shared/widgets/local/feeds.tsx index c4cd52cd..c69fa1fe 100644 --- a/src/shared/widgets/local/feeds.tsx +++ b/src/shared/widgets/local/feeds.tsx @@ -24,6 +24,7 @@ export function LocalFeedsWidget({ params }: { params: Widget }) { const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ['group-feeds-' + params.id], + initialPageParam: 0, queryFn: async ({ pageParam = 0 }) => { const authors = JSON.parse(params.content); return await db.getAllEventsByAuthors(authors, 20, pageParam); @@ -81,7 +82,7 @@ export function LocalFeedsWidget({ params }: { params: Widget }) {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/local/files.tsx b/src/shared/widgets/local/files.tsx index 7beec3d2..541a1c05 100644 --- a/src/shared/widgets/local/files.tsx +++ b/src/shared/widgets/local/files.tsx @@ -17,6 +17,7 @@ export function LocalFilesWidget({ params }: { params: Widget }) { const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ['local-file-sharing'], + initialPageParam: 0, queryFn: async ({ pageParam = 0 }) => { return await db.getAllEventsByKinds([1063], 20, pageParam); }, @@ -45,7 +46,7 @@ export function LocalFilesWidget({ params }: { params: Widget }) {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/local/follows.tsx b/src/shared/widgets/local/follows.tsx index 9d9b6326..f69833a7 100644 --- a/src/shared/widgets/local/follows.tsx +++ b/src/shared/widgets/local/follows.tsx @@ -24,6 +24,7 @@ export function LocalFollowsWidget({ params }: { params: Widget }) { const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ['follows-' + params.title], + initialPageParam: 0, queryFn: async ({ pageParam = 0 }) => { return await db.getAllEventsByAuthors(db.account.follows, 20, pageParam); }, @@ -80,7 +81,7 @@ export function LocalFollowsWidget({ params }: { params: Widget }) {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/local/network.tsx b/src/shared/widgets/local/network.tsx index 3c34eb1a..7f6c8138 100644 --- a/src/shared/widgets/local/network.tsx +++ b/src/shared/widgets/local/network.tsx @@ -29,6 +29,7 @@ export function LocalNetworkWidget() { const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ['local-network-widget'], + initialPageParam: 0, queryFn: async ({ pageParam = 0 }) => { return await db.getAllEvents(20, pageParam); }, @@ -136,7 +137,7 @@ export function LocalNetworkWidget() {
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/local/thread.tsx b/src/shared/widgets/local/thread.tsx index 63683f1c..bff4be31 100644 --- a/src/shared/widgets/local/thread.tsx +++ b/src/shared/widgets/local/thread.tsx @@ -43,7 +43,7 @@ export function LocalThreadWidget({ params }: { params: Widget }) { - {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/local/user.tsx b/src/shared/widgets/local/user.tsx index 975a1382..c436ebc6 100644 --- a/src/shared/widgets/local/user.tsx +++ b/src/shared/widgets/local/user.tsx @@ -23,9 +23,9 @@ import { Widget } from '@utils/types'; export function LocalUserWidget({ params }: { params: Widget }) { const { ndk } = useNDK(); - const { status, data } = useQuery( - ['user-posts', params.content], - async () => { + const { status, data } = useQuery({ + queryKey: ['user-posts', params.content], + queryFn: async () => { const events = await ndk.fetchEvents({ // @ts-expect-error, NDK not support file metadata yet kinds: [NDKKind.Text, NDKKind.Repost, 1063, NDKKind.Article], @@ -35,13 +35,11 @@ export function LocalUserWidget({ params }: { params: Widget }) { const sortedEvents = [...events].sort((x, y) => y.created_at - x.created_at); return sortedEvents; }, - { - staleTime: Infinity, - refetchOnMount: false, - refetchOnReconnect: false, - refetchOnWindowFocus: false, - } - ); + staleTime: Infinity, + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + }); // render event match event kind const renderItem = useCallback( @@ -90,7 +88,7 @@ export function LocalUserWidget({ params }: { params: Widget }) { Latest posts
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/nostrBand/trendingAccounts.tsx b/src/shared/widgets/nostrBand/trendingAccounts.tsx index 2c38c311..4a0e9d13 100644 --- a/src/shared/widgets/nostrBand/trendingAccounts.tsx +++ b/src/shared/widgets/nostrBand/trendingAccounts.tsx @@ -13,9 +13,9 @@ interface Response { } export function TrendingAccountsWidget({ params }: { params: Widget }) { - const { status, data } = useQuery( - ['trending-profiles-widget'], - async () => { + const { status, data } = useQuery({ + queryKey: ['trending-profiles-widget'], + queryFn: async () => { const res = await fetch('https://api.nostr.band/v0/trending/profiles'); if (!res.ok) { throw new Error('Error'); @@ -24,19 +24,17 @@ export function TrendingAccountsWidget({ params }: { params: Widget }) { if (!json.profiles) return []; return json.profiles; }, - { - refetchOnMount: false, - refetchOnReconnect: false, - refetchOnWindowFocus: false, - staleTime: Infinity, - } - ); + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + staleTime: Infinity, + }); return (
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/nostrBand/trendingNotes.tsx b/src/shared/widgets/nostrBand/trendingNotes.tsx index c5f2adf3..46beb1ad 100644 --- a/src/shared/widgets/nostrBand/trendingNotes.tsx +++ b/src/shared/widgets/nostrBand/trendingNotes.tsx @@ -14,9 +14,9 @@ interface Response { } export function TrendingNotesWidget({ params }: { params: Widget }) { - const { status, data } = useQuery( - ['trending-notes-widget'], - async () => { + const { status, data } = useQuery({ + queryKey: ['trending-notes-widget'], + queryFn: async () => { const res = await fetch('https://api.nostr.band/v0/trending/notes'); if (!res.ok) { throw new Error('failed to fecht trending notes'); @@ -25,19 +25,17 @@ export function TrendingNotesWidget({ params }: { params: Widget }) { if (!json.notes) return null; return json.notes; }, - { - refetchOnMount: false, - refetchOnReconnect: false, - refetchOnWindowFocus: false, - staleTime: Infinity, - } - ); + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + staleTime: Infinity, + }); return (
- {status === 'loading' ? ( + {status === 'pending' ? (
diff --git a/src/shared/widgets/nostrBandUserProfile.tsx b/src/shared/widgets/nostrBandUserProfile.tsx index 19cc3a5e..97b045c0 100644 --- a/src/shared/widgets/nostrBandUserProfile.tsx +++ b/src/shared/widgets/nostrBandUserProfile.tsx @@ -3,6 +3,7 @@ import { useQuery } from '@tanstack/react-query'; import { useEffect, useState } from 'react'; import { toast } from 'sonner'; +import { useNDK } from '@libs/ndk/provider'; import { useStorage } from '@libs/storage/provider'; import { FollowIcon, UnfollowIcon } from '@shared/icons'; @@ -18,20 +19,18 @@ export interface Profile { export function NostrBandUserProfile({ data }: { data: Profile }) { const { db } = useStorage(); - const { ndk } = useStorage(); - const { status, data: userStats } = useQuery( - ['user-stats', data.pubkey], - async () => { + const { ndk } = useNDK(); + const { status, data: userStats } = useQuery({ + queryKey: ['user-stats', data.pubkey], + queryFn: async () => { const res = await fetch(`https://api.nostr.band/v0/stats/profile/${data.pubkey}`); return res.json(); }, - { - refetchOnMount: false, - refetchOnReconnect: false, - refetchOnWindowFocus: false, - staleTime: Infinity, - } - ); + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + staleTime: Infinity, + }); const embedProfile = data.profile ? JSON.parse(data.profile.content) : null; const profile = embedProfile; @@ -137,7 +136,7 @@ export function NostrBandUserProfile({ data }: { data: Profile }) {

- {status === 'loading' ? ( + {status === 'pending' ? (

Loading...

) : (
diff --git a/src/utils/hooks/useEvent.ts b/src/utils/hooks/useEvent.ts index 04439286..31cfc918 100644 --- a/src/utils/hooks/useEvent.ts +++ b/src/utils/hooks/useEvent.ts @@ -12,9 +12,9 @@ export function useEvent( ) { const { db } = useStorage(); const { ndk } = useNDK(); - const { status, data } = useQuery( - ['event', id], - async () => { + const { status, data } = useQuery({ + queryKey: ['event', id], + queryFn: async () => { // return event refer from naddr if (naddr) { const rEvents = await ndk.fetchEvents({ @@ -45,11 +45,9 @@ export function useEvent( return event; }, - { - enabled: !!ndk, - refetchOnWindowFocus: false, - } - ); + enabled: !!ndk, + refetchOnWindowFocus: false, + }); return { status, data }; } diff --git a/src/utils/hooks/useOpenGraph.ts b/src/utils/hooks/useOpenGraph.ts index 12cb8e74..eb65a860 100644 --- a/src/utils/hooks/useOpenGraph.ts +++ b/src/utils/hooks/useOpenGraph.ts @@ -4,22 +4,20 @@ import { invoke } from '@tauri-apps/api/primitives'; import { Opengraph } from '@utils/types'; export function useOpenGraph(url: string) { - const { status, data, error } = useQuery( - ['opg', url], - async () => { + const { status, data, error } = useQuery({ + queryKey: ['opg', url], + queryFn: async () => { const res: Opengraph = await invoke('opengraph', { url }); if (!res) { throw new Error('fetch preview failed'); } return res; }, - { - staleTime: Infinity, - refetchOnWindowFocus: false, - refetchOnMount: false, - refetchOnReconnect: false, - } - ); + staleTime: Infinity, + refetchOnWindowFocus: false, + refetchOnMount: false, + refetchOnReconnect: false, + }); return { status, diff --git a/src/utils/hooks/useProfile.ts b/src/utils/hooks/useProfile.ts index 2630fbf3..b2fa2e7d 100644 --- a/src/utils/hooks/useProfile.ts +++ b/src/utils/hooks/useProfile.ts @@ -9,9 +9,9 @@ export function useProfile(pubkey: string, embed?: string) { status, data: user, error, - } = useQuery( - ['user', pubkey], - async () => { + } = useQuery({ + queryKey: ['user', pubkey], + queryFn: async () => { if (embed) { const profile: NDKUserProfile = JSON.parse(embed); return profile; @@ -21,15 +21,13 @@ export function useProfile(pubkey: string, embed?: string) { const user = ndk.getUser({ hexpubkey: cleanPubkey }); return await user.fetchProfile(); }, - { - enabled: !!ndk, - staleTime: Infinity, - refetchOnMount: false, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - retry: 2, - } - ); + enabled: !!ndk, + staleTime: Infinity, + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + retry: 2, + }); return { status, user, error }; } From 60b803f419de658d39a96fc2798f82c0ec087b28 Mon Sep 17 00:00:00 2001 From: reya Date: Sat, 28 Oct 2023 07:51:42 +0700 Subject: [PATCH 03/14] unify upload function --- src/app/chats/components/mediaUploader.tsx | 13 ++++-- src/app/new/components/mediaUploader.tsx | 52 +++------------------- src/shared/avatarUploader.tsx | 45 ++++--------------- src/shared/bannerUploader.tsx | 45 ++++--------------- src/utils/hooks/useNostr.ts | 39 ++++++++++++++++ 5 files changed, 73 insertions(+), 121 deletions(-) diff --git a/src/app/chats/components/mediaUploader.tsx b/src/app/chats/components/mediaUploader.tsx index de4b8ac6..165b9470 100644 --- a/src/app/chats/components/mediaUploader.tsx +++ b/src/app/chats/components/mediaUploader.tsx @@ -3,20 +3,25 @@ import { Dispatch, SetStateAction, useState } from 'react'; import { LoaderIcon, MediaIcon } from '@shared/icons'; +import { useNostr } from '@utils/hooks/useNostr'; + export function MediaUploader({ setState, }: { setState: Dispatch>; }) { + const { upload } = useNostr(); const [loading, setLoading] = useState(false); const uploadMedia = async () => { setLoading(true); - const image = await upload(null); - if (image.url) { - setState((prev: string) => `${prev}\n${image.url}`); + + const image = await upload(['mp4', 'mp3', 'webm', 'mkv', 'avi', 'mov']); + + if (image) { + setState((prev: string) => `${prev}\n${image}`); + setLoading(false); } - setLoading(false); }; return ( diff --git a/src/app/new/components/mediaUploader.tsx b/src/app/new/components/mediaUploader.tsx index 947b64ee..89cdba11 100644 --- a/src/app/new/components/mediaUploader.tsx +++ b/src/app/new/components/mediaUploader.tsx @@ -1,11 +1,13 @@ -import { message, open } from '@tauri-apps/plugin-dialog'; -import { readBinaryFile } from '@tauri-apps/plugin-fs'; +import { message } from '@tauri-apps/plugin-dialog'; import { Editor } from '@tiptap/react'; import { useState } from 'react'; import { MediaIcon } from '@shared/icons'; +import { useNostr } from '@utils/hooks/useNostr'; + export function MediaUploader({ editor }: { editor: Editor }) { + const { upload } = useNostr(); const [loading, setLoading] = useState(false); const uploadToNostrBuild = async () => { @@ -13,52 +15,12 @@ export function MediaUploader({ editor }: { editor: Editor }) { // start loading setLoading(true); - const selected = await open({ - multiple: false, - filters: [ - { - name: 'Media', - extensions: [ - 'png', - 'jpeg', - 'jpg', - 'gif', - 'mp4', - 'mp3', - 'webm', - 'mkv', - 'avi', - 'mov', - ], - }, - ], - }); + const image = await upload(['mp4', 'mp3', 'webm', 'mkv', 'avi', 'mov']); - if (!selected) { - setLoading(false); - return; - } - - const file = await readBinaryFile(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) { - const json = await res.json(); - const content = json.data[0]; - - editor.commands.setImage({ src: content.url }); + if (image) { + editor.commands.setImage({ src: image }); editor.commands.createParagraphNear(); - // stop loading setLoading(false); } } catch (e) { diff --git a/src/shared/avatarUploader.tsx b/src/shared/avatarUploader.tsx index 1a870867..f5e3ea3f 100644 --- a/src/shared/avatarUploader.tsx +++ b/src/shared/avatarUploader.tsx @@ -1,15 +1,16 @@ -import { message, open } from '@tauri-apps/plugin-dialog'; -import { readBinaryFile } from '@tauri-apps/plugin-fs'; -import { fetch } from '@tauri-apps/plugin-http'; +import { message } from '@tauri-apps/plugin-dialog'; import { Dispatch, SetStateAction, useState } from 'react'; import { LoaderIcon, PlusIcon } from '@shared/icons'; +import { useNostr } from '@utils/hooks/useNostr'; + export function AvatarUploader({ setPicture, }: { setPicture: Dispatch>; }) { + const { upload } = useNostr(); const [loading, setLoading] = useState(false); const uploadAvatar = async () => { @@ -17,42 +18,14 @@ export function AvatarUploader({ // start loading setLoading(true); - const selected = await open({ - multiple: false, - filters: [ - { - name: 'Image', - extensions: ['png', 'jpeg', 'jpg', 'gif'], - }, - ], - }); + const image = await upload(); - if (!selected) { - setLoading(false); - return; - } - - const file = await readBinaryFile(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) { - const json = await res.json(); - const content = json.data[0]; - - setPicture(content.url); - - // stop loading + if (image) { + setPicture(image); setLoading(false); } + + return; } catch (e) { // stop loading setLoading(false); diff --git a/src/shared/bannerUploader.tsx b/src/shared/bannerUploader.tsx index 5ec88b5c..b3e308be 100644 --- a/src/shared/bannerUploader.tsx +++ b/src/shared/bannerUploader.tsx @@ -1,15 +1,16 @@ -import { message, open } from '@tauri-apps/plugin-dialog'; -import { readBinaryFile } from '@tauri-apps/plugin-fs'; -import { fetch } from '@tauri-apps/plugin-http'; +import { message } from '@tauri-apps/plugin-dialog'; import { Dispatch, SetStateAction, useState } from 'react'; import { LoaderIcon, PlusIcon } from '@shared/icons'; +import { useNostr } from '@utils/hooks/useNostr'; + export function BannerUploader({ setBanner, }: { setBanner: Dispatch>; }) { + const { upload } = useNostr(); const [loading, setLoading] = useState(false); const uploadBanner = async () => { @@ -17,42 +18,14 @@ export function BannerUploader({ // start loading setLoading(true); - const selected = await open({ - multiple: false, - filters: [ - { - name: 'Image', - extensions: ['png', 'jpeg', 'jpg', 'gif'], - }, - ], - }); + const image = await upload(); - if (!selected) { - setLoading(false); - return; - } - - const file = await readBinaryFile(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) { - const json = await res.json(); - const content = json.data[0]; - - setBanner(content.url); - - // stop loading + if (image) { + setBanner(image); setLoading(false); } + + return; } catch (e) { // stop loading setLoading(false); diff --git a/src/utils/hooks/useNostr.ts b/src/utils/hooks/useNostr.ts index 4bd9a316..a02b996e 100644 --- a/src/utils/hooks/useNostr.ts +++ b/src/utils/hooks/useNostr.ts @@ -1,4 +1,7 @@ import { NDKEvent, NDKFilter, NDKKind, NDKSubscription } from '@nostr-dev-kit/ndk'; +import { open } from '@tauri-apps/plugin-dialog'; +import { readBinaryFile } from '@tauri-apps/plugin-fs'; +import { fetch } from '@tauri-apps/plugin-http'; import { LRUCache } from 'lru-cache'; import { NostrEventExt } from 'nostr-fetch'; import { useMemo } from 'react'; @@ -239,6 +242,41 @@ export function useNostr() { return res; }; + const upload = async (ext: string[] = []) => { + const defaultExts = ['png', 'jpeg', 'jpg', 'gif'].concat(ext); + + const selected = await open({ + multiple: false, + filters: [ + { + name: 'Image', + extensions: defaultExts, + }, + ], + }); + + if (!selected) return null; + + const file = await readBinaryFile(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; + }; + return { sub, getAllNIP04Chats, @@ -250,5 +288,6 @@ export function useNostr() { fetchNIP04Messages, fetchAllReplies, createZap, + upload, }; } From 6685d9af382c5d305f0bee2357504390e8703547 Mon Sep 17 00:00:00 2001 From: reya Date: Sat, 28 Oct 2023 08:29:38 +0700 Subject: [PATCH 04/14] update user component --- src/shared/user.tsx | 139 ++++++++++++++++++++++++---------- src/utils/hooks/useProfile.ts | 3 +- 2 files changed, 103 insertions(+), 39 deletions(-) diff --git a/src/shared/user.tsx b/src/shared/user.tsx index 65b2f364..f9df835e 100644 --- a/src/shared/user.tsx +++ b/src/shared/user.tsx @@ -2,10 +2,7 @@ import * as Avatar from '@radix-ui/react-avatar'; import * as HoverCard from '@radix-ui/react-hover-card'; import { minidenticon } from 'minidenticons'; import { memo } from 'react'; -import ReactMarkdown from 'react-markdown'; import { Link } from 'react-router-dom'; -import rehypeExternalLinks from 'rehype-external-links'; -import remarkGfm from 'remark-gfm'; import { RepostIcon, WorldIcon } from '@shared/icons'; import { NIP05 } from '@shared/nip05'; @@ -46,39 +43,16 @@ export const User = memo(function User({ const svgURI = 'data:image/svg+xml;utf8,' + encodeURIComponent(minidenticon(pubkey, 90, 50)); - if (status === 'pending') { - if (variant === 'avatar') { + if (variant === 'mention') { + if (status === 'pending') { return ( -
- ); - } - - if (variant === 'mention' || variant === 'notify') { - return ( -
-
+
+
); } - if (variant === 'stacked') { - return ( -
- ); - } - - return ( -
-
-
-
-
-
- ); - } - - if (variant === 'mention') { return (
@@ -113,6 +87,15 @@ export const User = memo(function User({ } if (variant === 'notify') { + if (status === 'pending') { + return ( +
+
+
+
+ ); + } + return (
@@ -143,6 +126,19 @@ export const User = memo(function User({ } if (variant === 'large') { + if (status === 'pending') { + return ( +
+
+
+
+
+
+
+
+ ); + } + return (
@@ -167,15 +163,9 @@ export const User = memo(function User({

{user?.name || user?.display_name || user?.displayName}

- +

{user?.about || user?.bio || 'No bio'} - +

{user?.website ? ( @@ -195,6 +185,18 @@ export const User = memo(function User({ } if (variant === 'simple') { + if (status === 'pending') { + return ( +
+
+
+
+
+
+
+ ); + } + return (
@@ -227,6 +229,12 @@ export const User = memo(function User({ } if (variant === 'avatar') { + if (status === 'pending') { + return ( +
+ ); + } + return ( + ); + } + return ( + ); + } + return ( + ); + } + return ( +
+ +
+
+
+
+
+
+ ); + } + return (
@@ -353,6 +393,18 @@ export const User = memo(function User({ } if (variant === 'thread') { + if (status === 'pending') { + return ( +
+
+
+
+
+
+
+ ); + } + return (
@@ -386,6 +438,17 @@ export const User = memo(function User({ ); } + if (status === 'pending') { + return ( +
+
+
+
+
+
+ ); + } + return (
diff --git a/src/utils/hooks/useProfile.ts b/src/utils/hooks/useProfile.ts index b2fa2e7d..6f73237e 100644 --- a/src/utils/hooks/useProfile.ts +++ b/src/utils/hooks/useProfile.ts @@ -17,8 +17,9 @@ export function useProfile(pubkey: string, embed?: string) { return profile; } - const cleanPubkey = pubkey.replace('-', ''); + const cleanPubkey = pubkey.replace(/[^a-zA-Z0-9]/g, ''); const user = ndk.getUser({ hexpubkey: cleanPubkey }); + return await user.fetchProfile(); }, enabled: !!ndk, From ace58ecdd56b175a3f7ac138c6d10ce3ce011fb2 Mon Sep 17 00:00:00 2001 From: reya Date: Sat, 28 Oct 2023 14:36:12 +0700 Subject: [PATCH 05/14] refactor text parser --- pnpm-lock.yaml | 26 ++--- src/shared/notes/kinds/text.tsx | 81 ++------------- src/shared/user.tsx | 4 +- src/utils/parser.ts | 124 ----------------------- src/utils/parser.tsx | 173 ++++++++++++++++++++++++++++++++ src/utils/types.d.ts | 3 +- 6 files changed, 200 insertions(+), 211 deletions(-) delete mode 100644 src/utils/parser.ts create mode 100644 src/utils/parser.tsx diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 57e70a85..11781526 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,43 +51,43 @@ dependencies: specifier: ^5.0.5 version: 5.0.5(react-dom@18.2.0)(react@18.2.0) '@tauri-apps/api': - specifier: 2.0.0-alpha.9 + specifier: ^2.0.0-alpha.9 version: 2.0.0-alpha.9 '@tauri-apps/cli': - specifier: 2.0.0-alpha.16 + specifier: ^2.0.0-alpha.16 version: 2.0.0-alpha.16 '@tauri-apps/plugin-clipboard-manager': - specifier: 2.0.0-alpha.2 + specifier: ^2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-dialog': - specifier: 2.0.0-alpha.2 + specifier: ^2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-fs': - specifier: 2.0.0-alpha.2 + specifier: ^2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-http': - specifier: 2.0.0-alpha.2 + specifier: ^2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-notification': - specifier: 2.0.0-alpha.2 + specifier: ^2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-os': - specifier: 2.0.0-alpha.3 + specifier: ^2.0.0-alpha.3 version: 2.0.0-alpha.3 '@tauri-apps/plugin-process': - specifier: 2.0.0-alpha.2 + specifier: ^2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-shell': - specifier: 2.0.0-alpha.2 + specifier: ^2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-sql': - specifier: 2.0.0-alpha.2 + specifier: ^2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-updater': - specifier: 2.0.0-alpha.2 + specifier: ^2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tauri-apps/plugin-upload': - specifier: 2.0.0-alpha.2 + specifier: ^2.0.0-alpha.2 version: 2.0.0-alpha.2 '@tiptap/extension-character-count': specifier: ^2.1.12 diff --git a/src/shared/notes/kinds/text.tsx b/src/shared/notes/kinds/text.tsx index 2e14c2e1..bddf6f85 100644 --- a/src/shared/notes/kinds/text.tsx +++ b/src/shared/notes/kinds/text.tsx @@ -1,84 +1,23 @@ import { memo } from 'react'; -import ReactMarkdown from 'react-markdown'; -import { Link } from 'react-router-dom'; -import rehypeExternalLinks from 'rehype-external-links'; -import remarkGfm from 'remark-gfm'; -import { - Boost, - Hashtag, - ImagePreview, - Invoice, - LinkPreview, - MentionNote, - MentionUser, - VideoPreview, -} from '@shared/notes'; +import { ImagePreview, LinkPreview, MentionNote, VideoPreview } from '@shared/notes'; import { parser } from '@utils/parser'; export function TextNote(props: { content?: string }) { - const richContent = parser(props.content) ?? null; - - if (!richContent) { - return ( -
- - {props.content} - -
- ); - } + const richContent = parser(props.content); return (
- { - const cleanURL = new URL(href); - cleanURL.search = ''; - return ( - - {cleanURL.hostname + cleanURL.pathname} - - ); - }, - del: ({ children }) => { - const key = children[0] as string; - if (typeof key !== 'string') return; - if (key.startsWith('pub') && key.length > 50 && key.length < 100) { - return ; - } - if (key.startsWith('tag')) { - return ; - } - if (key.startsWith('boost')) { - return ; - } - if (key.startsWith('lnbc')) { - return ; - } - }, - }} - disallowedElements={['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'pre', 'code']} - unwrapDisallowed={true} - > +
{richContent.parsed} - - {richContent.images.length > 0 && } - {richContent.videos.length > 0 && } - {richContent.links.length > 0 && } - {richContent.notes.length > 0 && - richContent.notes.map((note: string) => )} +
+ {richContent.images.length ? : null} + {richContent.videos.length ? : null} + {richContent.links.length ? : null} + {richContent.notes.map((note: string) => ( + + ))}
); } diff --git a/src/shared/user.tsx b/src/shared/user.tsx index f9df835e..7371be2b 100644 --- a/src/shared/user.tsx +++ b/src/shared/user.tsx @@ -440,9 +440,9 @@ export const User = memo(function User({ if (status === 'pending') { return ( -
+
-
+
diff --git a/src/utils/parser.ts b/src/utils/parser.ts deleted file mode 100644 index ffafdd24..00000000 --- a/src/utils/parser.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { nip19 } from 'nostr-tools'; -import { AddressPointer, EventPointer, ProfilePointer } from 'nostr-tools/lib/nip19'; - -import { RichContent } from '@utils/types'; - -function isURL(string: string) { - try { - const url = new URL(string); - if (url.protocol.length > 0) { - if (url.protocol === 'https:' || url.protocol === 'http:') { - return true; - } else { - return false; - } - } - return true; - } catch (e) { - return false; - } -} - -export function parser(eventContent: string) { - if (!eventContent) return ''; - - try { - const content: RichContent = { - parsed: null, - images: [], - videos: [], - links: [], - notes: [], - }; - - const parse = eventContent.split(/\s/gm).map((word) => { - // url - if (isURL(word)) { - const url = new URL(word); - url.search = ''; - - if (url.pathname.match(/\.(jpg|jpeg|gif|png|webp|avif)$/)) { - // image url - content.images.push(word); - // remove url from original content - return word.replace(word, ''); - } - - if (url.pathname.match(/\.(mp4|mov|webm|wmv|flv|mts|avi|ogv|mkv|mp3|m3u8)$/)) { - // video - content.videos.push(word); - // remove url from original content - return word.replace(word, ''); - } - - content.links.push(url.toString()); - } - - // hashtag - if (word.startsWith('#') && word.length > 1) { - return word.replace(word, `~tag-${word}~`); - } - - // boost - if (word.startsWith('$prism') && word.length > 1) { - return word.replace(word, `~boost-${word}~`); - } - - // nostr account references (depreciated) - if (word.startsWith('@npub1')) { - const npub = word.replace('@', '').replace(/[^a-zA-Z0-9 ]/g, ''); - return word.replace(word, `~pub-${nip19.decode(npub).data}~`); - } - - // nostr account references - if (word.startsWith('nostr:npub1') || word.startsWith('npub1')) { - const npub = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); - return word.replace(word, `~pub-${nip19.decode(npub).data}~`); - } - - // nostr profile references - if (word.startsWith('nostr:nprofile1') || word.startsWith('nprofile1')) { - const nprofile = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); - const decoded = nip19.decode(nprofile).data as ProfilePointer; - return word.replace(word, `~pub-${decoded.pubkey}~`); - } - - // nostr account references - if (word.startsWith('nostr:note1') || word.startsWith('note1')) { - const note = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); - content.notes.push(nip19.decode(note).data as string); - return word.replace(word, ''); - } - - // nostr event references - if (word.startsWith('nostr:nevent1') || word.startsWith('nevent1')) { - const nevent = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); - const decoded = nip19.decode(nevent).data as EventPointer; - content.notes.push(decoded.id); - return word.replace(word, ''); - } - - // nostr address references - if (word.startsWith('nostr:naddr1') || word.startsWith('naddr1')) { - const naddr = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); - const decoded = nip19.decode(naddr).data as AddressPointer; - return word.replace(word, `~pub-${decoded.pubkey}~`); - } - - // lightning invoice - if (word.startsWith('lnbc') && word.length > 60) { - return word.replace(word, `~lnbc-${word}~`); - } - - // normal word - return word; - }); - - // update content with parsed version - content.parsed = parse.join(' '); - - return content; - } catch (e) { - console.error('cannot parse content, error: ', e); - } -} diff --git a/src/utils/parser.tsx b/src/utils/parser.tsx new file mode 100644 index 00000000..2441dcf7 --- /dev/null +++ b/src/utils/parser.tsx @@ -0,0 +1,173 @@ +import { nip19 } from 'nostr-tools'; +import { + AddressPointer, + EventPointer, + ProfilePointer, +} from 'nostr-tools/lib/types/nip19'; +import { Link } from 'react-router-dom'; +import reactStringReplace from 'react-string-replace'; + +import { Boost, Hashtag, Invoice, MentionUser } from '@shared/notes'; + +import { RichContent } from '@utils/types'; + +function isURL(string: string) { + try { + const url = new URL(string); + if (url.protocol.length > 0) { + if (url.protocol === 'https:' || url.protocol === 'http:') { + return true; + } else { + return false; + } + } + return true; + } catch (e) { + return false; + } +} + +export function parser(eventContent: string) { + const content: RichContent = { + parsed: null, + images: [], + videos: [], + links: [], + notes: [], + }; + + const parsed = eventContent.split(/\s/gm).map((word) => { + // nostr note references + if (word.startsWith('nostr:note1') || word.startsWith('note1')) { + const note = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); + content.notes.push(nip19.decode(note).data as string); + return word.replace(word, ' '); + } + + // nostr event references + if (word.startsWith('nostr:nevent1') || word.startsWith('nevent1')) { + const nevent = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); + const decoded = nip19.decode(nevent).data as EventPointer; + content.notes.push(decoded.id); + return word.replace(word, ' '); + } + + // url + if (isURL(word)) { + const url = new URL(word); + url.search = ''; + + if (url.pathname.match(/\.(jpg|jpeg|gif|png|webp|avif)$/)) { + // image url + content.images.push(word); + // remove url from original content + return word.replace(word, ' '); + } + + if (url.pathname.match(/\.(mp4|mov|webm|wmv|flv|mts|avi|ogv|mkv|mp3|m3u8)$/)) { + // video url + content.videos.push(word); + // remove url from original content + return word.replace(word, ' '); + } + + // normal url + if (content.links.length < 1) { + content.links.push(url.toString()); + return word.replace(word, ' '); + } else { + return reactStringReplace(word, word, (match, i) => ( + <> + {' '} + + {word} + {' '} + + )); + } + } + + // hashtag + if (word.startsWith('#') && word.length > 1) { + return reactStringReplace(word, word, (match, i) => ( + <> + {' '} + {' '} + + )); + } + + // boost + if (word.startsWith('$prism') && word.length > 1) { + return reactStringReplace(word, word, (match, i) => ( + <> + {' '} + {' '} + + )); + } + + // nostr account references (depreciated) + if (word.startsWith('@npub1')) { + const npub = word.replace('@', '').replace(/[^a-zA-Z0-9 ]/g, ''); + return reactStringReplace(word, word, (match, i) => ( + <> + {' '} + {' '} + + )); + } + + // nostr account references + if (word.startsWith('nostr:npub1') || word.startsWith('npub1')) { + const npub = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); + return reactStringReplace(word, word, (match, i) => ( + <> + {' '} + {' '} + + )); + } + + // nostr profile references + if (word.startsWith('nostr:nprofile1') || word.startsWith('nprofile1')) { + const nprofile = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); + const decoded = nip19.decode(nprofile).data as ProfilePointer; + return reactStringReplace(word, word, (match, i) => ( + <> + {' '} + {' '} + + )); + } + + // nostr address references + if (word.startsWith('nostr:naddr1') || word.startsWith('naddr1')) { + const naddr = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); + const decoded = nip19.decode(naddr).data as AddressPointer; + return reactStringReplace(word, word, (match, i) => ( + <> + {' '} + {' '} + + )); + } + + // lightning invoice + if (word.startsWith('lnbc') && word.length > 60) { + return reactStringReplace(word, word, (match, i) => ( + <> + {' '} + {' '} + + )); + } + + // normal word + return ' ' + word + ' '; + }); + + // update content with parsed version + content.parsed = parsed; + return content; +} diff --git a/src/utils/types.d.ts b/src/utils/types.d.ts index 9c42afa2..a9e13585 100644 --- a/src/utils/types.d.ts +++ b/src/utils/types.d.ts @@ -1,8 +1,9 @@ import { type NDKEvent, type NDKUserProfile } from '@nostr-dev-kit/ndk'; import { type Response } from '@tauri-apps/plugin-http'; +import { ReactNode } from 'react'; export interface RichContent { - parsed: string; + parsed: string | ReactNode[]; images: string[]; videos: string[]; links: string[]; From 0b25a4a04b3b2fe144147d260edb8d930cc445b3 Mon Sep 17 00:00:00 2001 From: reya Date: Sun, 29 Oct 2023 11:07:05 +0700 Subject: [PATCH 06/14] add ndk cache tauri --- .../20231028083224_add_ndk_cache_table.sql | 27 ++++ src-tauri/src/main.rs | 20 ++- src/libs/ndk/cache.ts | 96 +++++--------- src/libs/ndk/instance.ts | 4 +- src/libs/storage/instance.ts | 119 +++++++++++++++++- src/shared/user.tsx | 2 +- src/shared/widgets/eventLoader.tsx | 15 ++- src/shared/widgets/local/notification.tsx | 7 +- src/utils/hooks/useEvent.ts | 14 +-- src/utils/hooks/useNostr.ts | 3 +- src/utils/hooks/useProfile.ts | 2 - src/utils/types.d.ts | 24 ++++ 12 files changed, 236 insertions(+), 97 deletions(-) create mode 100644 src-tauri/migrations/20231028083224_add_ndk_cache_table.sql diff --git a/src-tauri/migrations/20231028083224_add_ndk_cache_table.sql b/src-tauri/migrations/20231028083224_add_ndk_cache_table.sql new file mode 100644 index 00000000..d1440e3d --- /dev/null +++ b/src-tauri/migrations/20231028083224_add_ndk_cache_table.sql @@ -0,0 +1,27 @@ +-- Add migration script here +CREATE TABLE + ndk_users ( + pubkey TEXT NOT NULL PRIMARY KEY, + profile TEXT, + createdAt NUMBER + ); + +CREATE TABLE + ndk_events ( + id TEXT NOT NULL PRIMARY KEY, + pubkey TEXT, + content TEXT, + kind NUMBER, + createdAt NUMBER, + relay TEXT, + event TEXT + ); + +CREATE TABLE + ndk_eventtags ( + id TEXT NOT NULL PRIMARY KEY, + eventId TEXT, + tag TEXT, + value TEXT, + tagValue TEXT + ); diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index d59d0edc..34938251 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -128,12 +128,20 @@ fn main() { tauri_plugin_sql::Builder::default() .add_migrations( "sqlite:lume_v2.db", - vec![Migration { - version: 20230418013219, - description: "initial data", - sql: include_str!("../migrations/20230418013219_initial_data.sql"), - kind: MigrationKind::Up, - }], + vec![ + Migration { + version: 20230418013219, + description: "initial data", + sql: include_str!("../migrations/20230418013219_initial_data.sql"), + kind: MigrationKind::Up, + }, + Migration { + version: 20231028083224, + description: "add ndk cache table", + sql: include_str!("../migrations/20231028083224_add_ndk_cache_table.sql"), + kind: MigrationKind::Up, + }, + ], ) .build(), ) diff --git a/src/libs/ndk/cache.ts b/src/libs/ndk/cache.ts index 782c0b1a..b5c2450f 100644 --- a/src/libs/ndk/cache.ts +++ b/src/libs/ndk/cache.ts @@ -5,60 +5,30 @@ import type { NDKFilter, NDKSubscription, NDKUserProfile, + NostrEvent, } from '@nostr-dev-kit/ndk'; -import _debug from 'debug'; +import { LRUCache } from 'lru-cache'; import { matchFilter } from 'nostr-tools'; -import { LRUCache } from 'typescript-lru-cache'; -import { createDatabase, db } from './db'; +import { LumeStorage } from '@libs/storage/instance'; -export { db } from './db'; - -interface NDKCacheAdapterDexieOptions { - /** - * The name of the database to use - */ - dbName?: string; - - /** - * Debug instance to use for logging - */ - debug?: debug.IDebugger; - - /** - * The number of seconds to store events in Dexie (IndexedDB) before they expire - * Defaults to 3600 seconds (1 hour) - */ - expirationTime?: number; - - /** - * Number of profiles to keep in an LRU cache - */ - profileCacheSize?: number | 'disabled'; -} - -export default class NDKCacheAdapterDexie implements NDKCacheAdapter { - public debug: debug.Debugger; - private expirationTime; - readonly locking; +export default class NDKCacheAdapterTauri implements NDKCacheAdapter { + public db: LumeStorage; public profiles?: LRUCache; private dirtyProfiles: Set = new Set(); + readonly locking: boolean; - constructor(opts: NDKCacheAdapterDexieOptions = {}) { - createDatabase(opts.dbName || 'ndk'); - this.debug = opts.debug || _debug('ndk:dexie-adapter'); + constructor(db: LumeStorage) { + this.db = db; this.locking = true; - this.expirationTime = opts.expirationTime || 3600; - if (opts.profileCacheSize !== 'disabled') { - this.profiles = new LRUCache({ - maxSize: opts.profileCacheSize || 100000, - }); + this.profiles = new LRUCache({ + max: 100000, + }); - setInterval(() => { - this.dumpProfiles(); - }, 1000 * 10); - } + setInterval(() => { + this.dumpProfiles(); + }, 1000 * 10); } public async query(subscription: NDKSubscription): Promise { @@ -73,9 +43,9 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { let profile = this.profiles.get(pubkey); if (!profile) { - const user = await db.users.get({ pubkey }); + const user = await this.db.getCacheUser(pubkey); if (user) { - profile = user.profile; + profile = user.profile as NDKUserProfile; this.profiles.set(pubkey, profile); } } @@ -126,7 +96,7 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { if (event.isParamReplaceable()) { const replaceableId = `${event.kind}:${event.pubkey}:${event.tagId()}`; - const existingEvent = await db.events.where({ id: replaceableId }).first(); + const existingEvent = await this.db.getCacheEvent(replaceableId); if ( existingEvent && event.created_at && @@ -137,7 +107,7 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { } if (addEvent) { - db.events.put({ + this.db.setCacheEvent({ id: event.tagId(), pubkey: event.pubkey, content: event.content, @@ -153,7 +123,7 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { event.tags.forEach((tag) => { if (tag[0].length !== 1) return; - db.eventTags.put({ + this.db.setCacheEventTag({ id: `${event.id}:${tag[0]}:${tag[1]}`, eventId: event.id, tag: tag[0], @@ -182,9 +152,9 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { if (hasAllKeys && filter.authors) { for (const pubkey of filter.authors) { - const events = await db.events.where({ pubkey }).toArray(); + const events = await this.db.getCacheEventsByPubkey(pubkey); for (const event of events) { - let rawEvent; + let rawEvent: NostrEvent; try { rawEvent = JSON.parse(event.event); } catch (e) { @@ -218,9 +188,9 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { if (hasAllKeys && filter.kinds) { for (const kind of filter.kinds) { - const events = await db.events.where({ kind }).toArray(); + const events = await this.db.getCacheEventsByKind(kind); for (const event of events) { - let rawEvent; + let rawEvent: NostrEvent; try { rawEvent = JSON.parse(event.event); } catch (e) { @@ -252,10 +222,10 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { if (hasAllKeys && filter.ids) { for (const id of filter.ids) { - const event = await db.events.where({ id }).first(); + const event = await this.db.getCacheEvent(id); if (!event) continue; - let rawEvent; + let rawEvent: NostrEvent; try { rawEvent = JSON.parse(event.event); } catch (e) { @@ -295,10 +265,10 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { for (const author of filter.authors) { for (const dTag of filter['#d']) { const replaceableId = `${kind}:${author}:${dTag}`; - const event = await db.events.where({ id: replaceableId }).first(); + const event = await this.db.getCacheEvent(replaceableId); if (!event) continue; - let rawEvent; + let rawEvent: NostrEvent; try { rawEvent = JSON.parse(event.event); } catch (e) { @@ -335,10 +305,10 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { if (filter.kinds && filter.authors) { for (const kind of filter.kinds) { for (const author of filter.authors) { - const events = await db.events.where({ kind, pubkey: author }).toArray(); + const events = await this.db.getCacheEventsByKindAndAuthor(kind, author); for (const event of events) { - let rawEvent; + let rawEvent: NostrEvent; try { rawEvent = JSON.parse(event.event); } catch (e) { @@ -400,12 +370,12 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { } for (const value of values) { - const eventTags = await db.eventTags.where({ tagValue: tag + value }).toArray(); + const eventTags = await this.db.getCacheEventTagsByTagValue(tag + value); if (!eventTags.length) continue; const eventIds = eventTags.map((t) => t.eventId); - const events = await db.events.where('id').anyOf(eventIds).toArray(); + const events = await this.db.getCacheEvents(eventIds); for (const event of events) { let rawEvent; try { @@ -441,13 +411,13 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { profiles.push({ pubkey, - profile, + profile: JSON.stringify(profile), createdAt: Date.now(), }); } if (profiles.length) { - await db.users.bulkPut(profiles); + await this.db.setCacheProfiles(profiles); } this.dirtyProfiles.clear(); diff --git a/src/libs/ndk/instance.ts b/src/libs/ndk/instance.ts index 1fc844c9..56d5f0e4 100644 --- a/src/libs/ndk/instance.ts +++ b/src/libs/ndk/instance.ts @@ -1,11 +1,11 @@ import NDK, { NDKNip46Signer, NDKPrivateKeySigner } from '@nostr-dev-kit/ndk'; -import NDKCacheAdapterDexie from '@nostr-dev-kit/ndk-cache-dexie'; import { ndkAdapter } from '@nostr-fetch/adapter-ndk'; import { message } from '@tauri-apps/plugin-dialog'; import { fetch } from '@tauri-apps/plugin-http'; import { NostrFetcher } from 'nostr-fetch'; import { useEffect, useMemo, useState } from 'react'; +import NDKCacheAdapterTauri from '@libs/ndk/cache'; import { useStorage } from '@libs/storage/provider'; export const NDKInstance = () => { @@ -77,7 +77,7 @@ export const NDKInstance = () => { const outboxSetting = await db.getSettingValue('outbox'); const explicitRelayUrls = await getExplicitRelays(); - const dexieAdapter = new NDKCacheAdapterDexie({ dbName: 'lume_ndkcache' }); + const dexieAdapter = new NDKCacheAdapterTauri(db); const instance = new NDK({ explicitRelayUrls, cacheAdapter: dexieAdapter, diff --git a/src/libs/storage/instance.ts b/src/libs/storage/instance.ts index cfe84e83..d973222f 100644 --- a/src/libs/storage/instance.ts +++ b/src/libs/storage/instance.ts @@ -6,7 +6,15 @@ import Database from '@tauri-apps/plugin-sql'; import { FULL_RELAYS } from '@stores/constants'; import { rawEvent } from '@utils/transform'; -import { Account, DBEvent, Relays, Widget } from '@utils/types'; +import type { + Account, + DBEvent, + NDKCacheEvent, + NDKCacheEventTag, + NDKCacheUser, + Relays, + Widget, +} from '@utils/types'; export class LumeStorage { public db: Database; @@ -37,6 +45,115 @@ export class LumeStorage { return await invoke('secure_remove', { key }); } + 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 < 1) 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 < 1) 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 < 1) 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 < 1) 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 < 1) 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 < 1) 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 < 1) 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 checkAccount() { const result: Array<{ total: string }> = await this.db.select( 'SELECT COUNT(*) AS "total" FROM accounts;' diff --git a/src/shared/user.tsx b/src/shared/user.tsx index 7371be2b..02449461 100644 --- a/src/shared/user.tsx +++ b/src/shared/user.tsx @@ -189,7 +189,7 @@ export const User = memo(function User({ return (
-
+
diff --git a/src/shared/widgets/eventLoader.tsx b/src/shared/widgets/eventLoader.tsx index 76b6e089..3917af3a 100644 --- a/src/shared/widgets/eventLoader.tsx +++ b/src/shared/widgets/eventLoader.tsx @@ -19,19 +19,18 @@ export function EventLoader({ firstTime }: { firstTime: boolean }) { useEffect(() => { async function getEvents() { const events = await getAllEventsSinceLastLogin(); - console.log('total new events has found: ', events.data.length); + console.log('total new events has found: ', events.length); - const promises = await Promise.all( - events.data.map(async (event) => await db.createEvent(event)) - ); - - if (promises) { + if (events) { setProgress(100); setIsFetched(); + // invalidate queries - queryClient.invalidateQueries({ - queryKey: ['local-network-widget'] + await queryClient.invalidateQueries({ + queryKey: ['local-network-widget'], }); + + // update last login time, use for next fetch await db.updateLastLogin(); } } diff --git a/src/shared/widgets/local/notification.tsx b/src/shared/widgets/local/notification.tsx index b0134c56..ce969d37 100644 --- a/src/shared/widgets/local/notification.tsx +++ b/src/shared/widgets/local/notification.tsx @@ -10,6 +10,7 @@ import { TitleBar } from '@shared/titleBar'; import { WidgetWrapper } from '@shared/widgets'; import { useActivities } from '@stores/activities'; +import { useWidgets } from '@stores/widgets'; import { useNostr } from '@utils/hooks/useNostr'; import { Widget } from '@utils/types'; @@ -23,6 +24,8 @@ export function LocalNotificationWidget({ params }: { params: Widget }) { state.setActivities, ]); + const isFetched = useWidgets((state) => state.isFetched); + const renderEvent = useCallback( (event: NDKEvent) => { if (event.pubkey === db.account.pubkey) return null; @@ -37,8 +40,8 @@ export function LocalNotificationWidget({ params }: { params: Widget }) { setActivities(events); } - getActivities(); - }, []); + if (isFetched) getActivities(); + }, [isFetched]); return ( diff --git a/src/utils/hooks/useEvent.ts b/src/utils/hooks/useEvent.ts index 31cfc918..b4b00dab 100644 --- a/src/utils/hooks/useEvent.ts +++ b/src/utils/hooks/useEvent.ts @@ -3,14 +3,12 @@ import { useQuery } from '@tanstack/react-query'; import { AddressPointer } from 'nostr-tools/lib/types/nip19'; import { useNDK } from '@libs/ndk/provider'; -import { useStorage } from '@libs/storage/provider'; export function useEvent( id: undefined | string, naddr?: undefined | AddressPointer, embed?: undefined | string ) { - const { db } = useStorage(); const { ndk } = useNDK(); const { status, data } = useQuery({ queryKey: ['event', id], @@ -33,20 +31,16 @@ export function useEvent( return event; } - // get event from db - const dbEvent = await db.getEventByID(id); - if (dbEvent) return dbEvent; - - // get event from relay if event in db not present + // get event from relay const event = await ndk.fetchEvent(id); if (!event) return Promise.reject(new Error('event not found')); - await db.createEvent(event); - return event; }, - enabled: !!ndk, refetchOnWindowFocus: false, + refetchOnMount: false, + refetchOnReconnect: false, + staleTime: Infinity, }); return { status, data }; diff --git a/src/utils/hooks/useNostr.ts b/src/utils/hooks/useNostr.ts index a02b996e..ed44e08e 100644 --- a/src/utils/hooks/useNostr.ts +++ b/src/utils/hooks/useNostr.ts @@ -186,10 +186,9 @@ export function useNostr() { { since: since } )) as unknown as NDKEvent[]; - return { status: 'ok', message: 'fetch completed', data: events }; + return events; } catch (e) { console.error('prefetch events failed, error: ', e); - return { status: 'failed', message: e }; } }; diff --git a/src/utils/hooks/useProfile.ts b/src/utils/hooks/useProfile.ts index 6f73237e..498d0897 100644 --- a/src/utils/hooks/useProfile.ts +++ b/src/utils/hooks/useProfile.ts @@ -22,12 +22,10 @@ export function useProfile(pubkey: string, embed?: string) { return await user.fetchProfile(); }, - enabled: !!ndk, staleTime: Infinity, refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, - retry: 2, }); return { status, user, error }; diff --git a/src/utils/types.d.ts b/src/utils/types.d.ts index a9e13585..ba8794ae 100644 --- a/src/utils/types.d.ts +++ b/src/utils/types.d.ts @@ -115,3 +115,27 @@ export interface Resources { title: string; data: Array; } + +export interface NDKCacheUser { + pubkey: string; + profile: string | NDKUserProfile; + createdAt: number; +} + +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; +} From e7738fb128f17c0ea1d04fb6113551b0ada20e5b Mon Sep 17 00:00:00 2001 From: reya Date: Mon, 30 Oct 2023 16:29:49 +0700 Subject: [PATCH 07/14] refactor newsfeed widget --- package.json | 2 + pnpm-lock.yaml | 36 ++++ src/app/space/index.tsx | 4 +- src/main.jsx | 20 +- src/shared/notes/kinds/repost.tsx | 30 +-- src/shared/notes/skeleton.tsx | 14 +- src/shared/notes/wrapper.tsx | 26 ++- src/shared/widgets/eventLoader.tsx | 78 -------- src/shared/widgets/index.ts | 3 +- src/shared/widgets/local/follows.tsx | 2 - src/shared/widgets/local/network.tsx | 184 ----------------- src/shared/widgets/newsfeed.tsx | 187 ++++++++++++++++++ .../widgets/{local => }/notification.tsx | 7 +- src/stores/widgets.ts | 2 + vite.config.ts | 8 +- 15 files changed, 277 insertions(+), 326 deletions(-) delete mode 100644 src/shared/widgets/eventLoader.tsx delete mode 100644 src/shared/widgets/local/network.tsx create mode 100644 src/shared/widgets/newsfeed.tsx rename src/shared/widgets/{local => }/notification.tsx (93%) diff --git a/package.json b/package.json index 10d8edcb..0b7e1437 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,9 @@ "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-toolbar": "^1.0.4", "@radix-ui/react-tooltip": "^1.0.7", + "@tanstack/query-sync-storage-persister": "^5.4.3", "@tanstack/react-query": "^5.0.5", + "@tanstack/react-query-persist-client": "^5.4.3", "@tauri-apps/api": "^2.0.0-alpha.9", "@tauri-apps/cli": "^2.0.0-alpha.16", "@tauri-apps/plugin-clipboard-manager": "^2.0.0-alpha.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11781526..b3f5fdfd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,9 +47,15 @@ dependencies: '@radix-ui/react-tooltip': specifier: ^1.0.7 version: 1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@tanstack/query-sync-storage-persister': + specifier: ^5.4.3 + version: 5.4.3 '@tanstack/react-query': specifier: ^5.0.5 version: 5.0.5(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-persist-client': + specifier: ^5.4.3 + version: 5.4.3(@tanstack/react-query@5.0.5)(react-dom@18.2.0)(react@18.2.0) '@tauri-apps/api': specifier: ^2.0.0-alpha.9 version: 2.0.0-alpha.9 @@ -2096,6 +2102,36 @@ packages: resolution: {integrity: sha512-MThCETMkHDHTnFZHp71L+SqTtD5d6XHftFCVR1xRJdWM3qGrlQ2VCXaj0SKVcyJej2e1Opa2c7iknu1llxCDNQ==} dev: false + /@tanstack/query-core@5.4.3: + resolution: {integrity: sha512-fnI9ORjcuLGm1sNrKatKIosRQUpuqcD4SV7RqRSVmj8JSicX2aoMyKryHEBpVQvf6N4PaBVgBxQomjsbsGPssQ==} + dev: false + + /@tanstack/query-persist-client-core@5.4.3: + resolution: {integrity: sha512-0MZazQMVXmmVyf/ce2ug0CoSkT02VA4ZhkT3F1/tIINxGuH2KlhKWQc9puqJzTazUpXfRdBK9+lMPqpkA16FEQ==} + dependencies: + '@tanstack/query-core': 5.4.3 + dev: false + + /@tanstack/query-sync-storage-persister@5.4.3: + resolution: {integrity: sha512-53e2O8lLaeBZ26myG6zQt5Ix16XmkcqJrsrSP2ZZzP5Ii6XwBq061djaEMTNbWYenYpmDqQIxAye/J6zQZ0QiA==} + dependencies: + '@tanstack/query-core': 5.4.3 + '@tanstack/query-persist-client-core': 5.4.3 + dev: false + + /@tanstack/react-query-persist-client@5.4.3(@tanstack/react-query@5.0.5)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-gpusG6IG6rnmdRT3onSjmRVG60K3BlsdUQifBVeLdi4uen1rvRAiB5a7jr4hFVMItzS9C4jBxJMWt/DmZpy6Ow==} + peerDependencies: + '@tanstack/react-query': ^5.4.3 + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@tanstack/query-persist-client-core': 5.4.3 + '@tanstack/react-query': 5.0.5(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@tanstack/react-query@5.0.5(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-ZG0Q4HZ0iuI8mWiZ2/MdVYPHbrmAVhMn7+gLOkxJh6zLIgCL4luSZlohzN5Xt4MjxfxxWioO1nemwpudaTsmQg==} peerDependencies: diff --git a/src/app/space/index.tsx b/src/app/space/index.tsx index 97c1557f..5ffee4d6 100644 --- a/src/app/space/index.tsx +++ b/src/app/space/index.tsx @@ -16,10 +16,10 @@ import { LocalFeedsWidget, LocalFilesWidget, LocalFollowsWidget, - LocalNetworkWidget, LocalNotificationWidget, LocalThreadWidget, LocalUserWidget, + NewsfeedWidget, TrendingAccountsWidget, TrendingNotesWidget, XfeedsWidget, @@ -44,7 +44,7 @@ export function SpaceScreen() { if (!widget) return; switch (widget.kind) { case WidgetKinds.local.network: - return ; + return ; case WidgetKinds.local.follows: return ; case WidgetKinds.local.feeds: diff --git a/src/main.jsx b/src/main.jsx index 1e152d8e..88fe7483 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,4 +1,6 @@ -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { createSyncStoragePersister } from '@tanstack/query-sync-storage-persister'; +import { QueryClient } from '@tanstack/react-query'; +import { PersistQueryClientProvider } from '@tanstack/react-query-persist-client'; import { createRoot } from 'react-dom/client'; import { Toaster } from 'sonner'; @@ -7,18 +9,28 @@ import { StorageProvider } from '@libs/storage/provider'; import App from './app'; -const queryClient = new QueryClient(); +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + gcTime: 1000 * 60 * 60 * 24, // 24 hours + }, + }, +}); + +const persister = createSyncStoragePersister({ + storage: window.localStorage, +}); const container = document.getElementById('root'); const root = createRoot(container); root.render( - + - + ); diff --git a/src/shared/notes/kinds/repost.tsx b/src/shared/notes/kinds/repost.tsx index fd095bfb..45645ef7 100644 --- a/src/shared/notes/kinds/repost.tsx +++ b/src/shared/notes/kinds/repost.tsx @@ -2,7 +2,6 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { useQuery } from '@tanstack/react-query'; import { nip19 } from 'nostr-tools'; import { memo, useCallback } from 'react'; -import { twMerge } from 'tailwind-merge'; import { useNDK } from '@libs/ndk/provider'; @@ -17,13 +16,7 @@ import { } from '@shared/notes'; import { User } from '@shared/user'; -export function Repost({ - event, - lighter = false, -}: { - event: NDKEvent; - lighter?: boolean; -}) { +export function Repost({ event }: { event: NDKEvent }) { const embedEvent: null | NDKEvent = event.content.length > 0 ? JSON.parse(event.content) : null; @@ -59,12 +52,7 @@ export function Repost({ if (embedEvent) { return (
-
+
-
+
@@ -133,12 +116,7 @@ export function Repost({ return (
-
+
diff --git a/src/shared/notes/skeleton.tsx b/src/shared/notes/skeleton.tsx index a0385c2b..6fdde6ce 100644 --- a/src/shared/notes/skeleton.tsx +++ b/src/shared/notes/skeleton.tsx @@ -2,17 +2,17 @@ export function NoteSkeleton() { return (
-
+
-
+
-
+
-
-
-
-
+
+
+
+
diff --git a/src/shared/notes/wrapper.tsx b/src/shared/notes/wrapper.tsx index 27d6d5b5..464e4eb3 100644 --- a/src/shared/notes/wrapper.tsx +++ b/src/shared/notes/wrapper.tsx @@ -1,6 +1,5 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; -import { ReactElement, cloneElement } from 'react'; -import { twMerge } from 'tailwind-merge'; +import { ReactElement, cloneElement, useMemo } from 'react'; import { ChildNote, NoteActions } from '@shared/notes'; import { User } from '@shared/user'; @@ -8,25 +7,22 @@ import { User } from '@shared/user'; export function NoteWrapper({ event, children, - root, - reply, - lighter = false, }: { event: NDKEvent; children: ReactElement; - repost?: boolean; - root?: string; - reply?: string; - lighter?: boolean; }) { + const root = useMemo(() => { + if (event.tags?.[0]?.[0] === 'e' && !event.tags?.[0]?.[3]) { + return event.tags[0][1]; + } + return event.tags.find((el) => el[3] === 'root')?.[1]; + }, [event]); + + const reply = useMemo(() => event.tags.find((el) => el[3] === 'reply')?.[1], []); + return (
-
+
{root && }
{reply && }
diff --git a/src/shared/widgets/eventLoader.tsx b/src/shared/widgets/eventLoader.tsx deleted file mode 100644 index 3917af3a..00000000 --- a/src/shared/widgets/eventLoader.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { useQueryClient } from '@tanstack/react-query'; -import { useEffect, useState } from 'react'; - -import { useStorage } from '@libs/storage/provider'; - -import { useWidgets } from '@stores/widgets'; - -import { useNostr } from '@utils/hooks/useNostr'; - -export function EventLoader({ firstTime }: { firstTime: boolean }) { - const { db } = useStorage(); - const { getAllEventsSinceLastLogin } = useNostr(); - - const [progress, setProgress] = useState(0); - - const queryClient = useQueryClient(); - const setIsFetched = useWidgets((state) => state.setIsFetched); - - useEffect(() => { - async function getEvents() { - const events = await getAllEventsSinceLastLogin(); - console.log('total new events has found: ', events.length); - - if (events) { - setProgress(100); - setIsFetched(); - - // invalidate queries - await queryClient.invalidateQueries({ - queryKey: ['local-network-widget'], - }); - - // update last login time, use for next fetch - await db.updateLastLogin(); - } - } - - // only start download if progress === 0 - if (progress === 0) getEvents(); - - // auto increase progress after 2 secs - setInterval(() => setProgress((prev) => (prev += 5)), 2000); - }, []); - - return ( -
-
-
- {firstTime ? ( -
- 👋 -

- Hello, this is the first time you're using Lume -

-

- Lume is downloading all events since the last 24 hours. It will auto - refresh when it done, please be patient -

-
- ) : ( -
-

- Downloading all events while you're away... -

-
- )} -
-
-
-
-
-
- ); -} diff --git a/src/shared/widgets/index.ts b/src/shared/widgets/index.ts index 0402c585..61bb53fb 100644 --- a/src/shared/widgets/index.ts +++ b/src/shared/widgets/index.ts @@ -6,7 +6,6 @@ export * from './local/thread'; export * from './local/files'; export * from './local/articles'; export * from './local/follows'; -export * from './local/notification'; export * from './global/articles'; export * from './global/files'; export * from './global/hashtag'; @@ -16,3 +15,5 @@ export * from './tmp/feeds'; export * from './tmp/hashtag'; export * from './other/learnNostr'; export * from './eventLoader'; +export * from './newsfeed'; +export * from './notification'; diff --git a/src/shared/widgets/local/follows.tsx b/src/shared/widgets/local/follows.tsx index f69833a7..cb2836fb 100644 --- a/src/shared/widgets/local/follows.tsx +++ b/src/shared/widgets/local/follows.tsx @@ -46,8 +46,6 @@ export function LocalFollowsWidget({ params }: { params: Widget }) { diff --git a/src/shared/widgets/local/network.tsx b/src/shared/widgets/local/network.tsx deleted file mode 100644 index 7f6c8138..00000000 --- a/src/shared/widgets/local/network.tsx +++ /dev/null @@ -1,184 +0,0 @@ -import { NDKEvent, NDKFilter, NDKKind } from '@nostr-dev-kit/ndk'; -import { useInfiniteQuery } from '@tanstack/react-query'; -import { useCallback, useEffect, useMemo } from 'react'; -import { VList } from 'virtua'; - -import { useStorage } from '@libs/storage/provider'; - -import { ArrowRightCircleIcon, ArrowRightIcon, LoaderIcon } from '@shared/icons'; -import { - MemoizedArticleNote, - MemoizedFileNote, - MemoizedRepost, - MemoizedTextNote, - NoteWrapper, - UnknownNote, -} from '@shared/notes'; -import { NoteSkeleton } from '@shared/notes/skeleton'; -import { TitleBar } from '@shared/titleBar'; -import { EventLoader, WidgetWrapper } from '@shared/widgets'; - -import { WidgetKinds, useWidgets } from '@stores/widgets'; - -import { useNostr } from '@utils/hooks/useNostr'; -import { DBEvent } from '@utils/types'; - -export function LocalNetworkWidget() { - const { sub } = useNostr(); - const { db } = useStorage(); - const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = - useInfiniteQuery({ - queryKey: ['local-network-widget'], - initialPageParam: 0, - queryFn: async ({ pageParam = 0 }) => { - return await db.getAllEvents(20, pageParam); - }, - getNextPageParam: (lastPage) => lastPage.nextCursor, - }); - - const setWidget = useWidgets((state) => state.setWidget); - const isFetched = useWidgets((state) => state.isFetched); - const dbEvents = useMemo( - () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), - [data] - ); - - // render event match event kind - const renderItem = useCallback( - (dbEvent: DBEvent) => { - const event: NDKEvent = JSON.parse(dbEvent.event as string); - switch (event.kind) { - case NDKKind.Text: - return ( - - - - ); - case NDKKind.Repost: - return ; - case 1063: - return ( - - - - ); - case NDKKind.Article: - return ( - - - - ); - default: - return ( - - - - ); - } - }, - [dbEvents] - ); - - const openTrendingWidgets = async () => { - setWidget(db, { - kind: WidgetKinds.nostrBand.trendingAccounts, - title: 'Trending Accounts', - content: '', - }); - }; - - // subscribe for new event - // sub will be managed by lru-cache - useEffect(() => { - if (db.account && db.account.circles.length > 0 && dbEvents.length > 0) { - const filter: NDKFilter = { - kinds: [NDKKind.Text, NDKKind.Repost], - authors: db.account.circles, - since: Math.floor(Date.now() / 1000), - }; - - sub(filter, async (event) => { - await db.createEvent(event); - }); - } - }, [data]); - - if (db.account.circles.length < 1) { - return ( - -
-
-

👋

-

You have not follow anyone yet

-
- If you are new to Nostr, you can click button below to open trending users - and start follow some of theme -
- -
-
-
- ); - } - - return ( - - -
- {status === 'pending' ? ( -
-
- -
-
- ) : dbEvents.length === 0 ? ( - - ) : ( - - {!isFetched ? : null} - {dbEvents.map((item) => renderItem(item))} -
- {dbEvents.length > 0 ? ( - - ) : null} -
-
- - )} -
- - ); -} diff --git a/src/shared/widgets/newsfeed.tsx b/src/shared/widgets/newsfeed.tsx new file mode 100644 index 00000000..fa6a7f74 --- /dev/null +++ b/src/shared/widgets/newsfeed.tsx @@ -0,0 +1,187 @@ +import { NDKEvent, NDKFilter, NDKKind } from '@nostr-dev-kit/ndk'; +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { useCallback, useEffect } from 'react'; +import { VList } from 'virtua'; + +import { useNDK } from '@libs/ndk/provider'; +import { useStorage } from '@libs/storage/provider'; + +import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; +import { + MemoizedArticleNote, + MemoizedFileNote, + MemoizedRepost, + MemoizedTextNote, + NoteSkeleton, + NoteWrapper, + UnknownNote, +} from '@shared/notes'; +import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; + +import { nHoursAgo } from '@utils/date'; +import { useNostr } from '@utils/hooks/useNostr'; + +export function NewsfeedWidget() { + const { db } = useStorage(); + const { sub } = useNostr(); + const { relayUrls, ndk, fetcher } = useNDK(); + const { status, data } = useQuery({ + queryKey: ['newsfeed'], + queryFn: async ({ signal }: { signal: AbortSignal }) => { + const rootIds = new Set(); + const dedupQueue = new Set(); + + const events = await fetcher.fetchAllEvents( + relayUrls, + { + kinds: [NDKKind.Text, NDKKind.Repost, 1063, NDKKind.Article], + authors: db.account.circles, + }, + { + since: db.account.last_login_at === 0 ? nHoursAgo(4) : db.account.last_login_at, + }, + { abortSignal: signal } + ); + + const ndkEvents = events.map((event) => { + return new NDKEvent(ndk, event); + }); + + ndkEvents.forEach((event) => { + const tags = event.tags.filter((el) => el[0] === 'e'); + if (tags && tags.length > 0) { + const rootId = tags.filter((el) => el[3] === 'root')[1] ?? tags[0][1]; + if (rootIds.has(rootId)) return dedupQueue.add(event.id); + rootIds.add(rootId); + } + }); + + return ndkEvents + .filter((event) => !dedupQueue.has(event.id)) + .sort((a, b) => b.created_at - a.created_at); + }, + }); + + const queryClient = useQueryClient(); + const mutation = useMutation({ + mutationFn: async () => { + const currentLastEvent = data.at(-1); + const lastCreatedAt = currentLastEvent.created_at - 1; + + const rootIds = new Set(); + const dedupQueue = new Set(); + + const events = await fetcher.fetchLatestEvents( + relayUrls, + { + kinds: [NDKKind.Text, NDKKind.Repost, 1063, NDKKind.Article], + authors: db.account.circles, + }, + 100, + { + asOf: lastCreatedAt, + } + ); + + const ndkEvents = events.map((event) => { + return new NDKEvent(ndk, event); + }); + + ndkEvents.forEach((event) => { + const tags = event.tags.filter((el) => el[0] === 'e'); + if (tags && tags.length > 0) { + const rootId = tags.filter((el) => el[3] === 'root')[1] ?? tags[0][1]; + if (rootIds.has(rootId)) return dedupQueue.add(event.id); + rootIds.add(rootId); + } + }); + + return ndkEvents + .filter((event) => !dedupQueue.has(event.id)) + .sort((a, b) => b.created_at - a.created_at); + }, + onSuccess: async (data) => { + queryClient.setQueryData(['newsfeed'], (old: NDKEvent[]) => [...old, ...data]); + }, + }); + + const renderItem = useCallback((event: NDKEvent) => { + switch (event.kind) { + case NDKKind.Text: + return ( + + + + ); + case NDKKind.Repost: + return ; + case 1063: + return ( + + + + ); + case NDKKind.Article: + return ( + + + + ); + default: + return ( + + + + ); + } + }, []); + + useEffect(() => { + if (db.account && db.account.circles.length > 0) { + const filter: NDKFilter = { + kinds: [NDKKind.Text, NDKKind.Repost], + authors: db.account.circles, + since: Math.floor(Date.now() / 1000), + }; + + sub(filter, async (event) => { + queryClient.setQueryData(['newsfeed'], (old: NDKEvent[]) => [event, ...old]); + }); + } + }, []); + + return ( + + + + {status === 'pending' ? ( +
+
+
+ +
+
+
+ +
+
+ ) : ( + data.map((item) => renderItem(item)) + )} +
+ {data ? ( + + ) : null} +
+
+
+ ); +} diff --git a/src/shared/widgets/local/notification.tsx b/src/shared/widgets/notification.tsx similarity index 93% rename from src/shared/widgets/local/notification.tsx rename to src/shared/widgets/notification.tsx index ce969d37..b0134c56 100644 --- a/src/shared/widgets/local/notification.tsx +++ b/src/shared/widgets/notification.tsx @@ -10,7 +10,6 @@ import { TitleBar } from '@shared/titleBar'; import { WidgetWrapper } from '@shared/widgets'; import { useActivities } from '@stores/activities'; -import { useWidgets } from '@stores/widgets'; import { useNostr } from '@utils/hooks/useNostr'; import { Widget } from '@utils/types'; @@ -24,8 +23,6 @@ export function LocalNotificationWidget({ params }: { params: Widget }) { state.setActivities, ]); - const isFetched = useWidgets((state) => state.isFetched); - const renderEvent = useCallback( (event: NDKEvent) => { if (event.pubkey === db.account.pubkey) return null; @@ -40,8 +37,8 @@ export function LocalNotificationWidget({ params }: { params: Widget }) { setActivities(events); } - if (isFetched) getActivities(); - }, [isFetched]); + getActivities(); + }, []); return ( diff --git a/src/stores/widgets.ts b/src/stores/widgets.ts index 1b6f3adb..d572b053 100644 --- a/src/stores/widgets.ts +++ b/src/stores/widgets.ts @@ -132,12 +132,14 @@ export const useWidgets = create()( fetchWidgets: async (db: LumeStorage) => { const dbWidgets = await db.getWidgets(); + /* dbWidgets.unshift({ id: '9998', title: 'Notification', content: '', kind: WidgetKinds.local.notification, }); + */ dbWidgets.unshift({ id: '9999', diff --git a/vite.config.ts b/vite.config.ts index 7d785431..c1c99d70 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,10 +1,14 @@ import react from '@vitejs/plugin-react-swc'; -//import million from 'million/compiler'; +import million from 'million/compiler'; import { defineConfig } from 'vite'; import viteTsconfigPaths from 'vite-tsconfig-paths'; export default defineConfig({ - plugins: [/*million.vite({ auto: true, mute: true }),*/ react(), viteTsconfigPaths()], + plugins: [ + million.vite({ optimize: false, auto: true, mute: true }), + react(), + viteTsconfigPaths(), + ], envPrefix: ['VITE_', 'TAURI_'], build: { target: process.env.TAURI_PLATFORM === 'windows' ? 'chrome105' : 'safari13', From fd5ecc18a9ee29d34a6559d99c653cc831a4c0d3 Mon Sep 17 00:00:00 2001 From: reya Date: Wed, 1 Nov 2023 08:07:49 +0700 Subject: [PATCH 08/14] refactor all widgets --- src/app/auth/onboarding/hashtag.tsx | 2 +- src/app/space/components/toggle.tsx | 21 ++- src/app/space/components/widgetList.tsx | 104 ++++++------ src/app/space/index.tsx | 166 +++++++++++-------- src/libs/storage/instance.ts | 3 +- src/shared/accounts/active.tsx | 79 +--------- src/shared/navigation.tsx | 4 +- src/shared/notes/actions.tsx | 11 +- src/shared/notes/kinds/file.tsx | 10 +- src/shared/notes/kinds/text.tsx | 12 +- src/shared/notes/mentions/hashtag.tsx | 23 +-- src/shared/notes/mentions/invoice.tsx | 4 +- src/shared/notes/mentions/note.tsx | 25 ++- src/shared/notes/mentions/user.tsx | 20 +-- src/shared/notes/metadata.tsx | 18 +-- src/shared/notes/preview/link.tsx | 16 +- src/shared/notification/notifyNote.tsx | 24 +-- src/shared/titleBar.tsx | 6 +- src/shared/widgets/global/articles.tsx | 110 ++++++++----- src/shared/widgets/global/files.tsx | 114 +++++++++----- src/shared/widgets/global/hashtag.tsx | 164 +++++++++++-------- src/shared/widgets/index.ts | 4 - src/shared/widgets/local/articles.tsx | 126 ++++++++------- src/shared/widgets/local/feeds.tsx | 201 +++++++++++------------- src/shared/widgets/local/files.tsx | 130 +++++++-------- src/shared/widgets/local/follows.tsx | 140 ----------------- src/shared/widgets/local/user.tsx | 20 ++- src/shared/widgets/newsfeed.tsx | 173 +++++++++----------- src/shared/widgets/notification.tsx | 182 ++++++++++++++++----- src/shared/widgets/other/learnNostr.tsx | 70 --------- src/shared/widgets/tmp/feeds.tsx | 14 +- src/shared/widgets/tmp/hashtag.tsx | 18 +-- src/stores/activities.ts | 32 ---- src/stores/constants.ts | 103 ++++++++++++ src/stores/widgets.ts | 183 --------------------- src/utils/hooks/useNostr.ts | 5 +- src/utils/hooks/useWidget.ts | 30 ++++ 37 files changed, 1096 insertions(+), 1271 deletions(-) delete mode 100644 src/shared/widgets/local/follows.tsx delete mode 100644 src/shared/widgets/other/learnNostr.tsx delete mode 100644 src/stores/activities.ts delete mode 100644 src/stores/widgets.ts create mode 100644 src/utils/hooks/useWidget.ts diff --git a/src/app/auth/onboarding/hashtag.tsx b/src/app/auth/onboarding/hashtag.tsx index 1175ecf4..5a4b8de3 100644 --- a/src/app/auth/onboarding/hashtag.tsx +++ b/src/app/auth/onboarding/hashtag.tsx @@ -6,8 +6,8 @@ import { useStorage } from '@libs/storage/provider'; import { ArrowLeftIcon, CheckCircleIcon, LoaderIcon } from '@shared/icons'; +import { WidgetKinds } from '@stores/constants'; import { useOnboarding } from '@stores/onboarding'; -import { WidgetKinds } from '@stores/widgets'; const data = [ { hashtag: '#bitcoin' }, diff --git a/src/app/space/components/toggle.tsx b/src/app/space/components/toggle.tsx index 931de796..9fe73b43 100644 --- a/src/app/space/components/toggle.tsx +++ b/src/app/space/components/toggle.tsx @@ -1,23 +1,20 @@ -import { useStorage } from '@libs/storage/provider'; +import { PlusIcon } from '@shared/icons'; +import { WidgetWrapper } from '@shared/widgets'; -import { HandArrowDownIcon, PlusIcon } from '@shared/icons'; +import { WidgetKinds } from '@stores/constants'; -import { WidgetKinds, useWidgets } from '@stores/widgets'; +import { useWidget } from '@utils/hooks/useWidget'; export function ToggleWidgetList() { - const { db } = useStorage(); - const setWidget = useWidgets((state) => state.setWidget); + const { addWidget } = useWidget(); return ( -
-
-
- -
+ +
-
+ ); } diff --git a/src/app/space/components/widgetList.tsx b/src/app/space/components/widgetList.tsx index 4229f931..0ace2c0a 100644 --- a/src/app/space/components/widgetList.tsx +++ b/src/app/space/components/widgetList.tsx @@ -1,7 +1,5 @@ import { useCallback } from 'react'; -import { useStorage } from '@libs/storage/provider'; - import { ArticleIcon, BellIcon, @@ -13,22 +11,15 @@ import { TrendingIcon, } from '@shared/icons'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; -import { DefaultWidgets, WidgetKinds, useWidgets } from '@stores/widgets'; +import { DefaultWidgets, WidgetKinds } from '@stores/constants'; -import { Widget, WidgetGroup, WidgetGroupItem } from '@utils/types'; +import { useWidget } from '@utils/hooks/useWidget'; +import { Widget, WidgetGroup } from '@utils/types'; export function WidgetList({ params }: { params: Widget }) { - const { db } = useStorage(); - const [setWidget, removeWidget] = useWidgets((state) => [ - state.setWidget, - state.removeWidget, - ]); - - const openWidget = (widget: WidgetGroupItem) => { - setWidget(db, { kind: widget.kind, title: widget.title, content: '' }); - removeWidget(db, params.id); - }; + const { addWidget } = useWidget(); const renderIcon = useCallback( (kind: number) => { @@ -71,52 +62,51 @@ export function WidgetList({ params }: { params: Widget }) { [DefaultWidgets] ); - const renderItem = useCallback( - (row: WidgetGroup, index: number) => { - return ( -
-

- {row.title} -

-
- {row.data.map((item, index) => ( - - ))} -
+ ) : ( +
+ {renderIcon(item.kind)} +
+ )} +
+
+ {item.title} +
+

+ {item.description} +

+
+ + ))}
- ); - }, - [DefaultWidgets] - ); +
+ ); + }, []); return ( -
+
@@ -139,6 +129,6 @@ export function WidgetList({ params }: { params: Widget }) {
-
+
); } diff --git a/src/app/space/index.tsx b/src/app/space/index.tsx index 5ffee4d6..dd63dc9b 100644 --- a/src/app/space/index.tsx +++ b/src/app/space/index.tsx @@ -1,4 +1,5 @@ -import { useCallback, useEffect, useRef } from 'react'; +import { useQuery } from '@tanstack/react-query'; +import { useCallback, useRef, useState } from 'react'; import { VList, VListHandle } from 'virtua'; import { ToggleWidgetList } from '@app/space/components/toggle'; @@ -11,99 +12,134 @@ import { GlobalArticlesWidget, GlobalFilesWidget, GlobalHashtagWidget, - LearnNostrWidget, LocalArticlesWidget, LocalFeedsWidget, LocalFilesWidget, - LocalFollowsWidget, - LocalNotificationWidget, LocalThreadWidget, LocalUserWidget, NewsfeedWidget, + NotificationWidget, TrendingAccountsWidget, TrendingNotesWidget, XfeedsWidget, XhashtagWidget, } from '@shared/widgets'; -import { WidgetKinds, useWidgets } from '@stores/widgets'; +import { WidgetKinds } from '@stores/constants'; import { Widget } from '@utils/types'; export function SpaceScreen() { + const ref = useRef(null); + const [selectedIndex, setSelectedIndex] = useState(-1); + const { db } = useStorage(); - const vlistRef = useRef(null); + const { status, data } = useQuery({ + queryKey: ['widgets'], + queryFn: async () => { + const dbWidgets = await db.getWidgets(); + const defaultWidgets = [ + { + id: '9998', + title: 'Notification', + content: '', + kind: WidgetKinds.local.notification, + }, + { + id: '9999', + title: 'Newsfeed', + content: '', + kind: WidgetKinds.local.network, + }, + ]; - const [widgets, fetchWidgets] = useWidgets((state) => [ - state.widgets, - state.fetchWidgets, - ]); - - const renderItem = useCallback( - (widget: Widget) => { - if (!widget) return; - switch (widget.kind) { - case WidgetKinds.local.network: - return ; - case WidgetKinds.local.follows: - return ; - case WidgetKinds.local.feeds: - return ; - case WidgetKinds.local.files: - return ; - case WidgetKinds.local.articles: - return ; - case WidgetKinds.local.user: - return ; - case WidgetKinds.local.thread: - return ; - case WidgetKinds.global.hashtag: - return ; - case WidgetKinds.global.articles: - return ; - case WidgetKinds.global.files: - return ; - case WidgetKinds.nostrBand.trendingAccounts: - return ; - case WidgetKinds.nostrBand.trendingNotes: - return ; - case WidgetKinds.tmp.xfeed: - return ; - case WidgetKinds.tmp.xhashtag: - return ; - case WidgetKinds.tmp.list: - return ; - case WidgetKinds.other.learnNostr: - return ; - case WidgetKinds.local.notification: - return ; - default: - return null; - } + return [...defaultWidgets, ...dbWidgets]; }, - [widgets] - ); + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + staleTime: Infinity, + }); - useEffect(() => { - fetchWidgets(db); + const renderItem = useCallback((widget: Widget) => { + switch (widget.kind) { + case WidgetKinds.local.feeds: + return ; + case WidgetKinds.local.files: + return ; + case WidgetKinds.local.articles: + return ; + case WidgetKinds.local.user: + return ; + case WidgetKinds.local.thread: + return ; + case WidgetKinds.global.hashtag: + return ; + case WidgetKinds.global.articles: + return ; + case WidgetKinds.global.files: + return ; + case WidgetKinds.nostrBand.trendingAccounts: + return ; + case WidgetKinds.nostrBand.trendingNotes: + return ; + case WidgetKinds.tmp.xfeed: + return ; + case WidgetKinds.tmp.xhashtag: + return ; + case WidgetKinds.tmp.list: + return ; + case WidgetKinds.local.notification: + return ; + case WidgetKinds.local.network: + return ; + default: + return null; + } }, []); + if (status === 'pending') { + return ( +
+ +
+ ); + } + return ( { + if (!ref.current) return; + switch (e.code) { + case 'ArrowLeft': { + e.preventDefault(); + const prevIndex = Math.max(selectedIndex - 1, 0); + setSelectedIndex(prevIndex); + ref.current.scrollToIndex(prevIndex, { + align: 'center', + smooth: true, + }); + break; + } + case 'ArrowRight': { + e.preventDefault(); + const nextIndex = Math.min(selectedIndex + 1, data.length - 1); + setSelectedIndex(nextIndex); + ref.current.scrollToIndex(nextIndex, { + align: 'center', + smooth: true, + }); + break; + } + } + }} > - {!widgets ? ( -
- -
- ) : ( - widgets.map((widget) => renderItem(widget)) - )} + {data.map((widget) => renderItem(widget))}
); diff --git a/src/libs/storage/instance.ts b/src/libs/storage/instance.ts index d973222f..3e7a0250 100644 --- a/src/libs/storage/instance.ts +++ b/src/libs/storage/instance.ts @@ -254,7 +254,8 @@ export class LumeStorage { } public async removeWidget(id: string) { - return await this.db.execute('DELETE FROM widgets WHERE id = $1;', [id]); + const res = await this.db.execute('DELETE FROM widgets WHERE id = $1;', [id]); + if (res) return id; } public async createEvent(event: NDKEvent) { diff --git a/src/shared/accounts/active.tsx b/src/shared/accounts/active.tsx index cd6c5984..85dd7dc7 100644 --- a/src/shared/accounts/active.tsx +++ b/src/shared/accounts/active.tsx @@ -1,99 +1,22 @@ -import { NDKFilter, NDKKind } from '@nostr-dev-kit/ndk'; import * as Avatar from '@radix-ui/react-avatar'; import { minidenticon } from 'minidenticons'; -import { useEffect } from 'react'; -import { Link, useLocation } from 'react-router-dom'; +import { Link } from 'react-router-dom'; -import { useNDK } from '@libs/ndk/provider'; import { useStorage } from '@libs/storage/provider'; import { AccountMoreActions } from '@shared/accounts/more'; import { NetworkStatusIndicator } from '@shared/networkStatusIndicator'; -import { useActivities } from '@stores/activities'; - -import { useNostr } from '@utils/hooks/useNostr'; import { useProfile } from '@utils/hooks/useProfile'; -import { sendNativeNotification } from '@utils/notification'; export function ActiveAccount() { const { db } = useStorage(); - const { ndk } = useNDK(); const { status, user } = useProfile(db.account.pubkey); - const { sub } = useNostr(); - - const location = useLocation(); - const addActivity = useActivities((state) => state.addActivity); - const addNewMessage = useActivities((state) => state.addNewMessage); const svgURI = 'data:image/svg+xml;utf8,' + encodeURIComponent(minidenticon(db.account.pubkey, 90, 50)); - useEffect(() => { - const filter: NDKFilter = { - kinds: [ - NDKKind.Text, - NDKKind.EncryptedDirectMessage, - NDKKind.Repost, - NDKKind.Reaction, - NDKKind.Zap, - ], - since: Math.floor(Date.now() / 1000), - '#p': [db.account.pubkey], - }; - - sub( - filter, - async (event) => { - console.log('receive event: ', event.id); - - if (event.kind !== NDKKind.EncryptedDirectMessage) { - addActivity(event); - } - - const user = ndk.getUser({ hexpubkey: event.pubkey }); - await user.fetchProfile(); - - switch (event.kind) { - case NDKKind.Text: - return await sendNativeNotification( - `${user.profile.displayName || user.profile.name} has replied to your note` - ); - case NDKKind.EncryptedDirectMessage: { - if (location.pathname !== '/chats') { - addNewMessage(); - return await sendNativeNotification( - `${ - user.profile.displayName || user.profile.name - } has send you a encrypted message` - ); - } else { - break; - } - } - case NDKKind.Repost: - return await sendNativeNotification( - `${user.profile.displayName || user.profile.name} has reposted to your note` - ); - case NDKKind.Reaction: - return await sendNativeNotification( - `${user.profile.displayName || user.profile.name} has reacted ${ - event.content - } to your note` - ); - case NDKKind.Zap: - return await sendNativeNotification( - `${user.profile.displayName || user.profile.name} has zapped to your note` - ); - default: - break; - } - }, - false - ); - }, []); - if (status === 'pending') { return (
diff --git a/src/shared/navigation.tsx b/src/shared/navigation.tsx index 1a1108a6..f814441c 100644 --- a/src/shared/navigation.tsx +++ b/src/shared/navigation.tsx @@ -11,12 +11,10 @@ import { RelayIcon, } from '@shared/icons'; -import { useActivities } from '@stores/activities'; - import { compactNumber } from '@utils/number'; export function Navigation() { - const newMessages = useActivities((state) => state.newMessages); + const newMessages = 0; return (
diff --git a/src/shared/notes/actions.tsx b/src/shared/notes/actions.tsx index b99b58e4..2c399257 100644 --- a/src/shared/notes/actions.tsx +++ b/src/shared/notes/actions.tsx @@ -1,14 +1,14 @@ import * as Tooltip from '@radix-ui/react-tooltip'; -import { useStorage } from '@libs/storage/provider'; - import { FocusIcon } from '@shared/icons'; import { NoteReaction } from '@shared/notes/actions/reaction'; import { NoteReply } from '@shared/notes/actions/reply'; import { NoteRepost } from '@shared/notes/actions/repost'; import { NoteZap } from '@shared/notes/actions/zap'; -import { WidgetKinds, useWidgets } from '@stores/widgets'; +import { WidgetKinds } from '@stores/constants'; + +import { useWidget } from '@utils/hooks/useWidget'; export function NoteActions({ id, @@ -21,8 +21,7 @@ export function NoteActions({ extraButtons?: boolean; root?: string; }) { - const { db } = useStorage(); - const setWidget = useWidgets((state) => state.setWidget); + const { addWidget } = useWidget(); return ( @@ -40,7 +39,7 @@ export function NoteActions({ ); } diff --git a/src/shared/notes/mentions/invoice.tsx b/src/shared/notes/mentions/invoice.tsx index f8133d46..d9c11f0c 100644 --- a/src/shared/notes/mentions/invoice.tsx +++ b/src/shared/notes/mentions/invoice.tsx @@ -3,8 +3,8 @@ import { memo } from 'react'; export const Invoice = memo(function Invoice({ invoice }: { invoice: string }) { return ( - +
- +
); }); diff --git a/src/shared/notes/mentions/note.tsx b/src/shared/notes/mentions/note.tsx index 1e463446..e5de7205 100644 --- a/src/shared/notes/mentions/note.tsx +++ b/src/shared/notes/mentions/note.tsx @@ -2,8 +2,6 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { nip19 } from 'nostr-tools'; import { memo } from 'react'; -import { useStorage } from '@libs/storage/provider'; - import { ArticleNote, FileNote, @@ -14,20 +12,23 @@ import { } from '@shared/notes'; import { User } from '@shared/user'; -import { WidgetKinds, useWidgets } from '@stores/widgets'; +import { WidgetKinds } from '@stores/constants'; import { useEvent } from '@utils/hooks/useEvent'; +import { useWidget } from '@utils/hooks/useWidget'; export const MentionNote = memo(function MentionNote({ id }: { id: string }) { - const { db } = useStorage(); const { status, data } = useEvent(id); - - const setWidget = useWidgets((state) => state.setWidget); + const { addWidget } = useWidget(); const openThread = (event, thread: string) => { const selection = window.getSelection(); if (selection.toString().length === 0) { - setWidget(db, { kind: WidgetKinds.local.thread, title: 'Thread', content: thread }); + addWidget.mutate({ + kind: WidgetKinds.local.thread, + title: 'Thread', + content: thread, + }); } else { event.stopPropagation(); } @@ -74,15 +75,13 @@ export const MentionNote = memo(function MentionNote({ id }: { id: string }) { } return ( -
openThread(e, id)} - onKeyDown={(e) => openThread(e, id)} - role="button" - tabIndex={0} className="mt-3 cursor-default rounded-lg border border-neutral-300 bg-neutral-200 p-3 dark:border-neutral-700 dark:bg-neutral-800" > -
{renderKind(data)}
-
+
{renderKind(data)}
+ ); }); diff --git a/src/shared/notes/mentions/user.tsx b/src/shared/notes/mentions/user.tsx index 80a9679f..b659ab8b 100644 --- a/src/shared/notes/mentions/user.tsx +++ b/src/shared/notes/mentions/user.tsx @@ -1,30 +1,26 @@ import { memo } from 'react'; -import { useStorage } from '@libs/storage/provider'; - -import { WidgetKinds, useWidgets } from '@stores/widgets'; +import { WidgetKinds } from '@stores/constants'; import { useProfile } from '@utils/hooks/useProfile'; +import { useWidget } from '@utils/hooks/useWidget'; export const MentionUser = memo(function MentionUser({ pubkey }: { pubkey: string }) { - const { db } = useStorage(); const { user } = useProfile(pubkey); - - const setWidget = useWidgets((state) => state.setWidget); + const { addWidget } = useWidget(); return ( - - setWidget(db, { + addWidget.mutate({ kind: WidgetKinds.local.user, title: user?.name || user?.display_name || user?.displayName, content: pubkey, }) } onKeyDown={() => - setWidget(db, { + addWidget.mutate({ kind: WidgetKinds.local.user, title: user?.name || user?.display_name || user?.displayName, content: pubkey, @@ -38,6 +34,6 @@ export const MentionUser = memo(function MentionUser({ pubkey }: { pubkey: strin user?.displayName || user?.username || 'unknown')} - + ); }); diff --git a/src/shared/notes/metadata.tsx b/src/shared/notes/metadata.tsx index 8d6de8c5..035ef8eb 100644 --- a/src/shared/notes/metadata.tsx +++ b/src/shared/notes/metadata.tsx @@ -3,19 +3,13 @@ import { useQuery } from '@tanstack/react-query'; import { decode } from 'light-bolt11-decoder'; import { useNDK } from '@libs/ndk/provider'; -import { useStorage } from '@libs/storage/provider'; import { LoaderIcon } from '@shared/icons'; import { User } from '@shared/user'; -import { WidgetKinds, useWidgets } from '@stores/widgets'; - import { compactNumber } from '@utils/number'; export function NoteMetadata({ id }: { id: string }) { - const setWidget = useWidgets((state) => state.setWidget); - - const { db } = useStorage(); const { ndk } = useNDK(); const { status, data } = useQuery({ queryKey: ['note-metadata', id], @@ -89,17 +83,7 @@ export function NoteMetadata({ id }: { id: string }) {
- · diff --git a/src/shared/notes/preview/link.tsx b/src/shared/notes/preview/link.tsx index eeecbc70..2a488fd4 100644 --- a/src/shared/notes/preview/link.tsx +++ b/src/shared/notes/preview/link.tsx @@ -2,6 +2,10 @@ import { Link } from 'react-router-dom'; import { useOpenGraph } from '@utils/hooks/useOpenGraph'; +function isImage(url: string) { + return /^https?:\/\/.+\.(jpg|jpeg|png|webp|avif)$/.test(url); +} + export function LinkPreview({ urls }: { urls: string[] }) { const { status, data, error } = useOpenGraph(urls[0]); const domain = new URL(urls[0]); @@ -37,25 +41,25 @@ export function LinkPreview({ urls }: { urls: string[] }) {
) : ( <> - {data.image && ( + {isImage(data.image) ? ( {urls[0]} - )} -
-
+ ) : null} +
+
{data.title && (
{data.title}
)} - {data.description && ( + {data.description ? (

{data.description}

- )} + ) : null}
{domain.hostname} diff --git a/src/shared/notification/notifyNote.tsx b/src/shared/notification/notifyNote.tsx index 44466e75..f6ebcd6c 100644 --- a/src/shared/notification/notifyNote.tsx +++ b/src/shared/notification/notifyNote.tsx @@ -1,7 +1,5 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; -import { useStorage } from '@libs/storage/provider'; - import { ArticleNote, FileNote, @@ -11,33 +9,37 @@ import { } from '@shared/notes'; import { User } from '@shared/user'; -import { WidgetKinds, useWidgets } from '@stores/widgets'; +import { WidgetKinds } from '@stores/constants'; import { formatCreatedAt } from '@utils/createdAt'; import { useEvent } from '@utils/hooks/useEvent'; +import { useWidget } from '@utils/hooks/useWidget'; export function NotifyNote({ event }: { event: NDKEvent }) { const createdAt = formatCreatedAt(event.created_at, false); const rootEventId = event.tags.find((el) => el[0] === 'e')?.[1]; - const { db } = useStorage(); const { status, data } = useEvent(rootEventId); - - const setWidget = useWidgets((state) => state.setWidget); + const { addWidget } = useWidget(); const openThread = (event, thread: string) => { const selection = window.getSelection(); if (selection.toString().length === 0) { - setWidget(db, { kind: WidgetKinds.local.thread, title: 'Thread', content: thread }); + addWidget.mutate({ + kind: WidgetKinds.local.thread, + title: 'Thread', + content: thread, + }); } else { event.stopPropagation(); } }; const renderKind = (event: NDKEvent) => { + if (!event) return null; switch (event.kind) { case NDKKind.Text: - return ; + return ; case NDKKind.Article: return ; case 1063: @@ -88,13 +90,13 @@ export function NotifyNote({ event }: { event: NDKEvent }) { {event.kind === 1 ? : null}
openThread(e, data.id)} - onKeyDown={(e) => openThread(e, data.id)} + onClick={(e) => openThread(e, data?.id)} + onKeyDown={(e) => openThread(e, data?.id)} role="button" tabIndex={0} className="cursor-default rounded-lg border border-neutral-300 bg-neutral-200 p-3 dark:border-neutral-700 dark:bg-neutral-800" > - +
{renderKind(data)}
diff --git a/src/shared/titleBar.tsx b/src/shared/titleBar.tsx index fe3fbb92..7bb8d3ba 100644 --- a/src/shared/titleBar.tsx +++ b/src/shared/titleBar.tsx @@ -3,11 +3,11 @@ import { useStorage } from '@libs/storage/provider'; import { CancelIcon } from '@shared/icons'; import { User } from '@shared/user'; -import { useWidgets } from '@stores/widgets'; +import { useWidget } from '@utils/hooks/useWidget'; export function TitleBar({ id, title }: { id?: string; title?: string }) { const { db } = useStorage(); - const remove = useWidgets((state) => state.removeWidget); + const { removeWidget } = useWidget(); return (
@@ -33,7 +33,7 @@ export function TitleBar({ id, title }: { id?: string; title?: string }) { {id !== '9999' ? ( + ) : null} +
+ ); } diff --git a/src/shared/widgets/global/files.tsx b/src/shared/widgets/global/files.tsx index d6628b17..eefc7a6f 100644 --- a/src/shared/widgets/global/files.tsx +++ b/src/shared/widgets/global/files.tsx @@ -1,66 +1,76 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; -import { useQuery } from '@tanstack/react-query'; -import { useCallback } from 'react'; +import { useInfiniteQuery } from '@tanstack/react-query'; +import { useMemo } from 'react'; import { VList } from 'virtua'; import { useNDK } from '@libs/ndk/provider'; -import { LoaderIcon } from '@shared/icons'; +import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { FileNote, NoteWrapper } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; import { WidgetWrapper } from '@shared/widgets'; -import { nHoursAgo } from '@utils/date'; +import { FETCH_LIMIT } from '@stores/constants'; + import { Widget } from '@utils/types'; export function GlobalFilesWidget({ params }: { params: Widget }) { - const { ndk } = useNDK(); - const { status, data } = useQuery({ - queryKey: ['global-file-sharing'], - queryFn: async () => { - const events = await ndk.fetchEvents({ - // @ts-expect-error, NDK not support file metadata yet - kinds: [1063], - since: nHoursAgo(24), - }); - const sortedEvents = [...events].sort((x, y) => y.created_at - x.created_at); - return sortedEvents; - }, - refetchOnWindowFocus: false, - }); + const { ndk, relayUrls, fetcher } = useNDK(); + const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = + useInfiniteQuery({ + queryKey: ['global-files'], + initialPageParam: 0, + queryFn: async ({ + signal, + pageParam, + }: { + signal: AbortSignal; + pageParam: number; + }) => { + const events = await fetcher.fetchLatestEvents( + relayUrls, + { + kinds: [1063], + }, + FETCH_LIMIT, + { asOf: pageParam === 0 ? undefined : pageParam, abortSignal: signal } + ); - // render event match event kind - const renderItem = useCallback( - (event: NDKEvent) => { - return ( - - - - ); - }, + const ndkEvents = events.map((event) => { + return new NDKEvent(ndk, event); + }); + + return ndkEvents.sort((a, b) => b.created_at - a.created_at); + }, + getNextPageParam: (lastPage) => { + const lastEvent = lastPage.at(-1); + if (!lastEvent) return; + return lastEvent.created_at - 1; + }, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + }); + + const allEvents = useMemo( + () => (data ? data.pages.flatMap((page) => page) : []), [data] ); return ( -
+ {status === 'pending' ? ( -
-
- -

- Loading file sharing event... -

-
+
+
- ) : data.length === 0 ? ( + ) : allEvents.length === 0 ? (
empty feeds

- Oops, it looks like there are no file sharing events. + Oops, it looks like there are no files.

You can close this widget @@ -69,12 +79,32 @@ export function GlobalFilesWidget({ params }: { params: Widget }) {

) : ( - - {data.map((item) => renderItem(item))} -
- + allEvents.map((item) => ( + + + + )) )} -
+
+ {hasNextPage ? ( + + ) : null} +
+
); } diff --git a/src/shared/widgets/global/hashtag.tsx b/src/shared/widgets/global/hashtag.tsx index 99c2b67f..f1b88abe 100644 --- a/src/shared/widgets/global/hashtag.tsx +++ b/src/shared/widgets/global/hashtag.tsx @@ -1,11 +1,11 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; -import { useQuery } from '@tanstack/react-query'; -import { useCallback } from 'react'; +import { useInfiniteQuery } from '@tanstack/react-query'; +import { useCallback, useMemo } from 'react'; import { VList } from 'virtua'; import { useNDK } from '@libs/ndk/provider'; -import { LoaderIcon } from '@shared/icons'; +import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { ArticleNote, FileNote, @@ -17,74 +17,94 @@ import { import { TitleBar } from '@shared/titleBar'; import { WidgetWrapper } from '@shared/widgets'; -import { nHoursAgo } from '@utils/date'; +import { FETCH_LIMIT } from '@stores/constants'; + import { Widget } from '@utils/types'; export function GlobalHashtagWidget({ params }: { params: Widget }) { - const { ndk } = useNDK(); - const { status, data } = useQuery({ - queryKey: ['hashtag-' + params.title], - queryFn: async () => { - const events = await ndk.fetchEvents({ - kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Article], - '#t': [params.content], - since: nHoursAgo(24), - }); - const sortedEvents = [...events].sort((x, y) => y.created_at - x.created_at); - return sortedEvents; - }, - refetchOnWindowFocus: false, - }); + const { ndk, relayUrls, fetcher } = useNDK(); + const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = + useInfiniteQuery({ + queryKey: ['hashtag-' + params.title], + initialPageParam: 0, + queryFn: async ({ + signal, + pageParam, + }: { + signal: AbortSignal; + pageParam: number; + }) => { + const events = await fetcher.fetchLatestEvents( + relayUrls, + { + kinds: [NDKKind.Text, NDKKind.Repost, 1063, NDKKind.Article], + '#t': [params.content], + }, + FETCH_LIMIT, + { asOf: pageParam === 0 ? undefined : pageParam, abortSignal: signal } + ); - // render event match event kind - const renderItem = useCallback( - (event: NDKEvent) => { - switch (event.kind) { - case NDKKind.Text: - return ( - - - - ); - case NDKKind.Repost: - return ; - case 1063: - return ( - - - - ); - case NDKKind.Article: - return ( - - - - ); - default: - return ( - - - - ); - } - }, + const ndkEvents = events.map((event) => { + return new NDKEvent(ndk, event); + }); + + return ndkEvents.sort((a, b) => b.created_at - a.created_at); + }, + getNextPageParam: (lastPage) => { + const lastEvent = lastPage.at(-1); + if (!lastEvent) return; + return lastEvent.created_at - 1; + }, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + }); + + const allEvents = useMemo( + () => (data ? data.pages.flatMap((page) => page) : []), [data] ); + // render event match event kind + const renderItem = useCallback((event: NDKEvent) => { + switch (event.kind) { + case NDKKind.Text: + return ( + + + + ); + case NDKKind.Repost: + return ; + case 1063: + return ( + + + + ); + case NDKKind.Article: + return ( + + + + ); + default: + return ( + + + + ); + } + }, []); + return ( -
+ {status === 'pending' ? (
-
- -

- Loading event related to the hashtag {params.title}... -

-
+
- ) : data.length === 0 ? ( + ) : allEvents.length === 0 ? (
empty feeds @@ -93,18 +113,34 @@ export function GlobalHashtagWidget({ params }: { params: Widget }) { Oops, it looks like there are no events related to {params.title}.

- You can close this widget or try with other hashtag + You can close this widget

) : ( - - {data.map((item) => renderItem(item))} -
- + allEvents.map((item) => renderItem(item)) )} -
+
+ {hasNextPage ? ( + + ) : null} +
+
); } diff --git a/src/shared/widgets/index.ts b/src/shared/widgets/index.ts index 61bb53fb..f23db79a 100644 --- a/src/shared/widgets/index.ts +++ b/src/shared/widgets/index.ts @@ -1,11 +1,9 @@ export * from './wrapper'; export * from './local/feeds'; -export * from './local/network'; export * from './local/user'; export * from './local/thread'; export * from './local/files'; export * from './local/articles'; -export * from './local/follows'; export * from './global/articles'; export * from './global/files'; export * from './global/hashtag'; @@ -13,7 +11,5 @@ export * from './nostrBand/trendingNotes'; export * from './nostrBand/trendingAccounts'; export * from './tmp/feeds'; export * from './tmp/hashtag'; -export * from './other/learnNostr'; -export * from './eventLoader'; export * from './newsfeed'; export * from './notification'; diff --git a/src/shared/widgets/local/articles.tsx b/src/shared/widgets/local/articles.tsx index 78a0ced6..6bc44dc6 100644 --- a/src/shared/widgets/local/articles.tsx +++ b/src/shared/widgets/local/articles.tsx @@ -1,8 +1,9 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { useInfiniteQuery } from '@tanstack/react-query'; -import { useCallback, useMemo } from 'react'; +import { useMemo } from 'react'; import { VList } from 'virtua'; +import { useNDK } from '@libs/ndk/provider'; import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; @@ -10,52 +11,63 @@ import { ArticleNote, NoteWrapper } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; import { WidgetWrapper } from '@shared/widgets'; -import { DBEvent, Widget } from '@utils/types'; +import { FETCH_LIMIT } from '@stores/constants'; + +import { Widget } from '@utils/types'; export function LocalArticlesWidget({ params }: { params: Widget }) { const { db } = useStorage(); + const { ndk, relayUrls, fetcher } = useNDK(); const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ['local-articles'], initialPageParam: 0, - queryFn: async ({ pageParam = 0 }) => { - return await db.getAllEventsByKinds([NDKKind.Article], 20, pageParam); + queryFn: async ({ + signal, + pageParam, + }: { + signal: AbortSignal; + pageParam: number; + }) => { + const events = await fetcher.fetchLatestEvents( + relayUrls, + { + kinds: [NDKKind.Article], + authors: db.account.circles, + }, + FETCH_LIMIT, + { asOf: pageParam === 0 ? undefined : pageParam, abortSignal: signal } + ); + + const ndkEvents = events.map((event) => { + return new NDKEvent(ndk, event); + }); + + return ndkEvents.sort((a, b) => b.created_at - a.created_at); }, - getNextPageParam: (lastPage) => lastPage.nextCursor, + getNextPageParam: (lastPage) => { + const lastEvent = lastPage.at(-1); + if (!lastEvent) return; + return lastEvent.created_at - 1; + }, + refetchOnWindowFocus: false, + refetchOnReconnect: false, }); - const dbEvents = useMemo( - () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), - [data] - ); - - // render event match event kind - const renderItem = useCallback( - (dbEvent: DBEvent) => { - const event: NDKEvent = JSON.parse(dbEvent.event as string); - return ( - - - - ); - }, + const allEvents = useMemo( + () => (data ? data.pages.flatMap((page) => page) : []), [data] ); return ( -
+ {status === 'pending' ? ( -
-
- -

- Loading article... -

-
+
+
- ) : dbEvents.length === 0 ? ( + ) : allEvents.length === 0 ? (
empty feeds @@ -70,38 +82,32 @@ export function LocalArticlesWidget({ params }: { params: Widget }) {
) : ( - - {dbEvents.map((item) => renderItem(item))} -
- {dbEvents.length > 0 ? ( - - ) : null} -
-
- + allEvents.map((item) => ( + + + + )) )} -
+
+ {hasNextPage ? ( + + ) : null} +
+
); } diff --git a/src/shared/widgets/local/feeds.tsx b/src/shared/widgets/local/feeds.tsx index c69fa1fe..29979aa9 100644 --- a/src/shared/widgets/local/feeds.tsx +++ b/src/shared/widgets/local/feeds.tsx @@ -3,141 +3,132 @@ import { useInfiniteQuery } from '@tanstack/react-query'; import { useCallback, useMemo } from 'react'; import { VList } from 'virtua'; -import { useStorage } from '@libs/storage/provider'; +import { useNDK } from '@libs/ndk/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { - ArticleNote, - FileNote, + MemoizedArticleNote, + MemoizedFileNote, + MemoizedRepost, + MemoizedTextNote, + NoteSkeleton, NoteWrapper, - Repost, - TextNote, UnknownNote, } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; import { WidgetWrapper } from '@shared/widgets'; -import { DBEvent, Widget } from '@utils/types'; +import { FETCH_LIMIT } from '@stores/constants'; + +import { Widget } from '@utils/types'; export function LocalFeedsWidget({ params }: { params: Widget }) { - const { db } = useStorage(); + const { relayUrls, ndk, fetcher } = useNDK(); const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ['group-feeds-' + params.id], initialPageParam: 0, - queryFn: async ({ pageParam = 0 }) => { - const authors = JSON.parse(params.content); - return await db.getAllEventsByAuthors(authors, 20, pageParam); + queryFn: async ({ + signal, + pageParam, + }: { + signal: AbortSignal; + pageParam: number; + }) => { + const events = await fetcher.fetchLatestEvents( + relayUrls, + { + kinds: [NDKKind.Text, NDKKind.Repost, 1063, NDKKind.Article], + authors: JSON.parse(params.content), + }, + FETCH_LIMIT, + { asOf: pageParam === 0 ? undefined : pageParam, abortSignal: signal } + ); + + const ndkEvents = events.map((event) => { + return new NDKEvent(ndk, event); + }); + + return ndkEvents.sort((a, b) => b.created_at - a.created_at); }, - getNextPageParam: (lastPage) => lastPage.nextCursor, + getNextPageParam: (lastPage) => { + const lastEvent = lastPage.at(-1); + if (!lastEvent) return; + return lastEvent.created_at - 1; + }, + refetchOnWindowFocus: false, + refetchOnReconnect: false, }); - const dbEvents = useMemo( - () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), + const allEvents = useMemo( + () => (data ? data.pages.flatMap((page) => page) : []), [data] ); - // render event match event kind - const renderItem = useCallback( - (dbEvent: DBEvent) => { - const event: NDKEvent = JSON.parse(dbEvent.event as string); - switch (event.kind) { - case NDKKind.Text: - return ( - - - - ); - case NDKKind.Repost: - return ; - case 1063: - return ( - - - - ); - case NDKKind.Article: - return ( - - - - ); - default: - return ( - - - - ); - } - }, - [dbEvents] - ); + const renderItem = useCallback((event: NDKEvent) => { + switch (event.kind) { + case NDKKind.Text: + return ( + + + + ); + case NDKKind.Repost: + return ; + case 1063: + return ( + + + + ); + case NDKKind.Article: + return ( + + + + ); + default: + return ( + + + + ); + } + }, []); return ( -
+ {status === 'pending' ? ( -
-
- -

- Loading newsfeed... -

-
-
- ) : dbEvents.length === 0 ? ( -
-
- empty feeds -
-

- Oops, it looks like there are no posts. -

-

- You can close this widget -

-
+
+
+
) : ( - - {dbEvents.map((item) => renderItem(item))} -
- {dbEvents.length > 0 ? ( - - ) : null} -
-
- + allEvents.map((item) => renderItem(item)) )} -
+
+ {hasNextPage ? ( + + ) : null} +
+
); } diff --git a/src/shared/widgets/local/files.tsx b/src/shared/widgets/local/files.tsx index 541a1c05..e36dc59a 100644 --- a/src/shared/widgets/local/files.tsx +++ b/src/shared/widgets/local/files.tsx @@ -1,8 +1,9 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; import { useInfiniteQuery } from '@tanstack/react-query'; -import { useCallback, useMemo } from 'react'; +import { useMemo } from 'react'; import { VList } from 'virtua'; +import { useNDK } from '@libs/ndk/provider'; import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; @@ -10,58 +11,69 @@ import { FileNote, NoteWrapper } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; import { WidgetWrapper } from '@shared/widgets'; -import { DBEvent, Widget } from '@utils/types'; +import { FETCH_LIMIT } from '@stores/constants'; + +import { Widget } from '@utils/types'; export function LocalFilesWidget({ params }: { params: Widget }) { const { db } = useStorage(); + const { ndk, relayUrls, fetcher } = useNDK(); const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ - queryKey: ['local-file-sharing'], + queryKey: ['local-files'], initialPageParam: 0, - queryFn: async ({ pageParam = 0 }) => { - return await db.getAllEventsByKinds([1063], 20, pageParam); + queryFn: async ({ + signal, + pageParam, + }: { + signal: AbortSignal; + pageParam: number; + }) => { + const events = await fetcher.fetchLatestEvents( + relayUrls, + { + kinds: [1063], + authors: db.account.circles, + }, + FETCH_LIMIT, + { asOf: pageParam === 0 ? undefined : pageParam, abortSignal: signal } + ); + + const ndkEvents = events.map((event) => { + return new NDKEvent(ndk, event); + }); + + return ndkEvents.sort((a, b) => b.created_at - a.created_at); }, - getNextPageParam: (lastPage) => lastPage.nextCursor, + getNextPageParam: (lastPage) => { + const lastEvent = lastPage.at(-1); + if (!lastEvent) return; + return lastEvent.created_at - 1; + }, + refetchOnWindowFocus: false, + refetchOnReconnect: false, }); - const dbEvents = useMemo( - () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), - [data] - ); - - // render event match event kind - const renderItem = useCallback( - (dbEvent: DBEvent) => { - const event: NDKEvent = JSON.parse(dbEvent.event as string); - return ( - - - - ); - }, + const allEvents = useMemo( + () => (data ? data.pages.flatMap((page) => page) : []), [data] ); return ( -
+ {status === 'pending' ? ( -
-
- -

- Loading file sharing event... -

-
+
+
- ) : dbEvents.length === 0 ? ( + ) : allEvents.length === 0 ? (
empty feeds

- Oops, it looks like there are no file sharing events. + Oops, it looks like there are no files.

You can close this widget @@ -70,38 +82,32 @@ export function LocalFilesWidget({ params }: { params: Widget }) {

) : ( - - {dbEvents.map((item) => renderItem(item))} -
- {dbEvents.length > 0 ? ( - - ) : null} -
-
- + allEvents.map((item) => ( + + + + )) )} -
+
+ {hasNextPage ? ( + + ) : null} +
+
); } diff --git a/src/shared/widgets/local/follows.tsx b/src/shared/widgets/local/follows.tsx deleted file mode 100644 index cb2836fb..00000000 --- a/src/shared/widgets/local/follows.tsx +++ /dev/null @@ -1,140 +0,0 @@ -import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; -import { useInfiniteQuery } from '@tanstack/react-query'; -import { useCallback, useMemo } from 'react'; -import { VList } from 'virtua'; - -import { useStorage } from '@libs/storage/provider'; - -import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; -import { - MemoizedArticleNote, - MemoizedFileNote, - MemoizedRepost, - MemoizedTextNote, - NoteWrapper, - UnknownNote, -} from '@shared/notes'; -import { TitleBar } from '@shared/titleBar'; -import { WidgetWrapper } from '@shared/widgets'; - -import { DBEvent, Widget } from '@utils/types'; - -export function LocalFollowsWidget({ params }: { params: Widget }) { - const { db } = useStorage(); - const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = - useInfiniteQuery({ - queryKey: ['follows-' + params.title], - initialPageParam: 0, - queryFn: async ({ pageParam = 0 }) => { - return await db.getAllEventsByAuthors(db.account.follows, 20, pageParam); - }, - getNextPageParam: (lastPage) => lastPage.nextCursor, - }); - - const dbEvents = useMemo( - () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), - [data] - ); - - // render event match event kind - const renderItem = useCallback( - (dbEvent: DBEvent) => { - const event: NDKEvent = JSON.parse(dbEvent.event as string); - switch (event.kind) { - case NDKKind.Text: - return ( - - - - ); - case NDKKind.Repost: - return ; - case 1063: - return ( - - - - ); - case NDKKind.Article: - return ( - - - - ); - default: - return ( - - - - ); - } - }, - [dbEvents] - ); - - return ( - - -
- {status === 'pending' ? ( -
-
- -

- Loading post... -

-
-
- ) : dbEvents.length === 0 ? ( -
-
- empty feeds -
-

- Oops, it looks like there are no posts. -

-

- You can close this widget -

-
-
-
- ) : ( - - {dbEvents.map((item) => renderItem(item))} -
- {dbEvents.length > 0 ? ( - - ) : null} -
-
- - )} -
- - ); -} diff --git a/src/shared/widgets/local/user.tsx b/src/shared/widgets/local/user.tsx index c436ebc6..4f6311f7 100644 --- a/src/shared/widgets/local/user.tsx +++ b/src/shared/widgets/local/user.tsx @@ -26,14 +26,30 @@ export function LocalUserWidget({ params }: { params: Widget }) { const { status, data } = useQuery({ queryKey: ['user-posts', params.content], queryFn: async () => { + const rootIds = new Set(); + const dedupQueue = new Set(); + const events = await ndk.fetchEvents({ // @ts-expect-error, NDK not support file metadata yet kinds: [NDKKind.Text, NDKKind.Repost, 1063, NDKKind.Article], authors: [params.content], since: nHoursAgo(24), }); - const sortedEvents = [...events].sort((x, y) => y.created_at - x.created_at); - return sortedEvents; + + const ndkEvents = [...events]; + + ndkEvents.forEach((event) => { + const tags = event.tags.filter((el) => el[0] === 'e'); + if (tags && tags.length > 0) { + const rootId = tags.filter((el) => el[3] === 'root')[1] ?? tags[0][1]; + if (rootIds.has(rootId)) return dedupQueue.add(event.id); + rootIds.add(rootId); + } + }); + + return ndkEvents + .filter((event) => !dedupQueue.has(event.id)) + .sort((a, b) => b.created_at - a.created_at); }, staleTime: Infinity, refetchOnMount: false, diff --git a/src/shared/widgets/newsfeed.tsx b/src/shared/widgets/newsfeed.tsx index fa6a7f74..ab080eae 100644 --- a/src/shared/widgets/newsfeed.tsx +++ b/src/shared/widgets/newsfeed.tsx @@ -1,6 +1,6 @@ import { NDKEvent, NDKFilter, NDKKind } from '@nostr-dev-kit/ndk'; -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; -import { useCallback, useEffect } from 'react'; +import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query'; +import { useCallback, useEffect, useMemo } from 'react'; import { VList } from 'virtua'; import { useNDK } from '@libs/ndk/provider'; @@ -19,92 +19,66 @@ import { import { TitleBar } from '@shared/titleBar'; import { WidgetWrapper } from '@shared/widgets'; -import { nHoursAgo } from '@utils/date'; import { useNostr } from '@utils/hooks/useNostr'; export function NewsfeedWidget() { + const queryClient = useQueryClient(); + const { db } = useStorage(); const { sub } = useNostr(); const { relayUrls, ndk, fetcher } = useNDK(); - const { status, data } = useQuery({ - queryKey: ['newsfeed'], - queryFn: async ({ signal }: { signal: AbortSignal }) => { - const rootIds = new Set(); - const dedupQueue = new Set(); + const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = + useInfiniteQuery({ + queryKey: ['newsfeed'], + initialPageParam: 0, + queryFn: async ({ + signal, + pageParam, + }: { + signal: AbortSignal; + pageParam: number; + }) => { + const rootIds = new Set(); + const dedupQueue = new Set(); - const events = await fetcher.fetchAllEvents( - relayUrls, - { - kinds: [NDKKind.Text, NDKKind.Repost, 1063, NDKKind.Article], - authors: db.account.circles, - }, - { - since: db.account.last_login_at === 0 ? nHoursAgo(4) : db.account.last_login_at, - }, - { abortSignal: signal } - ); + const events = await fetcher.fetchLatestEvents( + relayUrls, + { + kinds: [NDKKind.Text, NDKKind.Repost, 1063, NDKKind.Article], + authors: db.account.circles, + }, + 50, + { asOf: pageParam === 0 ? undefined : pageParam, abortSignal: signal } + ); - const ndkEvents = events.map((event) => { - return new NDKEvent(ndk, event); - }); + const ndkEvents = events.map((event) => { + return new NDKEvent(ndk, event); + }); - ndkEvents.forEach((event) => { - const tags = event.tags.filter((el) => el[0] === 'e'); - if (tags && tags.length > 0) { - const rootId = tags.filter((el) => el[3] === 'root')[1] ?? tags[0][1]; - if (rootIds.has(rootId)) return dedupQueue.add(event.id); - rootIds.add(rootId); - } - }); + ndkEvents.forEach((event) => { + const tags = event.tags.filter((el) => el[0] === 'e'); + if (tags && tags.length > 0) { + const rootId = tags.filter((el) => el[3] === 'root')[1] ?? tags[0][1]; + if (rootIds.has(rootId)) return dedupQueue.add(event.id); + rootIds.add(rootId); + } + }); - return ndkEvents - .filter((event) => !dedupQueue.has(event.id)) - .sort((a, b) => b.created_at - a.created_at); - }, - }); + return ndkEvents + .filter((event) => !dedupQueue.has(event.id)) + .sort((a, b) => b.created_at - a.created_at); + }, + getNextPageParam: (lastPage) => { + const lastEvent = lastPage.at(-1); + if (!lastEvent) return; + return lastEvent.created_at - 1; + }, + }); - const queryClient = useQueryClient(); - const mutation = useMutation({ - mutationFn: async () => { - const currentLastEvent = data.at(-1); - const lastCreatedAt = currentLastEvent.created_at - 1; - - const rootIds = new Set(); - const dedupQueue = new Set(); - - const events = await fetcher.fetchLatestEvents( - relayUrls, - { - kinds: [NDKKind.Text, NDKKind.Repost, 1063, NDKKind.Article], - authors: db.account.circles, - }, - 100, - { - asOf: lastCreatedAt, - } - ); - - const ndkEvents = events.map((event) => { - return new NDKEvent(ndk, event); - }); - - ndkEvents.forEach((event) => { - const tags = event.tags.filter((el) => el[0] === 'e'); - if (tags && tags.length > 0) { - const rootId = tags.filter((el) => el[3] === 'root')[1] ?? tags[0][1]; - if (rootIds.has(rootId)) return dedupQueue.add(event.id); - rootIds.add(rootId); - } - }); - - return ndkEvents - .filter((event) => !dedupQueue.has(event.id)) - .sort((a, b) => b.created_at - a.created_at); - }, - onSuccess: async (data) => { - queryClient.setQueryData(['newsfeed'], (old: NDKEvent[]) => [...old, ...data]); - }, - }); + const allEvents = useMemo( + () => (data ? data.pages.flatMap((page) => page) : []), + [data] + ); const renderItem = useCallback((event: NDKEvent) => { switch (event.kind) { @@ -138,46 +112,55 @@ export function NewsfeedWidget() { }, []); useEffect(() => { - if (db.account && db.account.circles.length > 0) { + if (status === 'success' && db.account && db.account.circles.length > 0) { + queryClient.fetchQuery({ queryKey: ['notification'] }); + const filter: NDKFilter = { kinds: [NDKKind.Text, NDKKind.Repost], authors: db.account.circles, since: Math.floor(Date.now() / 1000), }; - sub(filter, async (event) => { - queryClient.setQueryData(['newsfeed'], (old: NDKEvent[]) => [event, ...old]); - }); + sub( + filter, + async (event) => { + queryClient.setQueryData(['newsfeed'], (old: NDKEvent[]) => [event, ...old]); + }, + false, + 'newsfeed' + ); } - }, []); + }, [status]); return ( {status === 'pending' ? ( -
-
-
- -
-
-
- +
+
+
) : ( - data.map((item) => renderItem(item)) + allEvents.map((item) => renderItem(item)) )}
- {data ? ( + {hasNextPage ? ( ) : null}
diff --git a/src/shared/widgets/notification.tsx b/src/shared/widgets/notification.tsx index b0134c56..104226d5 100644 --- a/src/shared/widgets/notification.tsx +++ b/src/shared/widgets/notification.tsx @@ -1,59 +1,145 @@ -import { NDKEvent } from '@nostr-dev-kit/ndk'; -import { useCallback, useEffect } from 'react'; +import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; +import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query'; +import { useCallback, useEffect, useMemo } from 'react'; import { VList } from 'virtua'; +import { useNDK } from '@libs/ndk/provider'; import { useStorage } from '@libs/storage/provider'; -import { LoaderIcon } from '@shared/icons'; +import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; +import { NoteSkeleton } from '@shared/notes'; import { NotifyNote } from '@shared/notification/notifyNote'; import { TitleBar } from '@shared/titleBar'; import { WidgetWrapper } from '@shared/widgets'; -import { useActivities } from '@stores/activities'; - import { useNostr } from '@utils/hooks/useNostr'; -import { Widget } from '@utils/types'; +import { sendNativeNotification } from '@utils/notification'; + +export function NotificationWidget() { + const queryClient = useQueryClient(); -export function LocalNotificationWidget({ params }: { params: Widget }) { const { db } = useStorage(); - const { getAllActivities } = useNostr(); + const { sub } = useNostr(); + const { ndk, relayUrls, fetcher } = useNDK(); + const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = + useInfiniteQuery({ + queryKey: ['notification'], + initialPageParam: 0, + queryFn: async ({ + signal, + pageParam, + }: { + signal: AbortSignal; + pageParam: number; + }) => { + const events = await fetcher.fetchLatestEvents( + relayUrls, + { + kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Reaction, NDKKind.Zap], + '#p': [db.account.pubkey], + }, + 50, + { asOf: pageParam === 0 ? undefined : pageParam, abortSignal: signal } + ); - const [activities, setActivities] = useActivities((state) => [ - state.activities, - state.setActivities, - ]); + const ndkEvents = events.map((event) => { + return new NDKEvent(ndk, event); + }); - const renderEvent = useCallback( - (event: NDKEvent) => { - if (event.pubkey === db.account.pubkey) return null; - return ; - }, - [activities] + return ndkEvents.sort((a, b) => b.created_at - a.created_at); + }, + getNextPageParam: (lastPage) => { + const lastEvent = lastPage.at(-1); + if (!lastEvent) return; + return lastEvent.created_at - 1; + }, + enabled: false, + }); + + const allEvents = useMemo( + () => (data ? data.pages.flatMap((page) => page) : []), + [data] ); - useEffect(() => { - async function getActivities() { - const events = await getAllActivities(48); - setActivities(events); - } - - getActivities(); + const renderEvent = useCallback((event: NDKEvent) => { + if (event.pubkey === db.account.pubkey) return null; + return ; }, []); + useEffect(() => { + if (status === 'success' && db.account) { + const filter = { + kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Reaction, NDKKind.Zap], + '#p': [db.account.pubkey], + since: Math.floor(Date.now() / 1000), + }; + + sub( + filter, + async (event) => { + queryClient.setQueryData(['notification'], (old: NDKEvent[]) => [ + event, + ...old, + ]); + + const user = ndk.getUser({ hexpubkey: event.pubkey }); + await user.fetchProfile(); + + switch (event.kind) { + case NDKKind.Text: + return await sendNativeNotification( + `${ + user.profile.displayName || user.profile.name + } has replied to your note` + ); + case NDKKind.EncryptedDirectMessage: { + if (location.pathname !== '/chats') { + return await sendNativeNotification( + `${ + user.profile.displayName || user.profile.name + } has send you a encrypted message` + ); + } else { + break; + } + } + case NDKKind.Repost: + return await sendNativeNotification( + `${ + user.profile.displayName || user.profile.name + } has reposted to your note` + ); + case NDKKind.Reaction: + return await sendNativeNotification( + `${user.profile.displayName || user.profile.name} has reacted ${ + event.content + } to your note` + ); + case NDKKind.Zap: + return await sendNativeNotification( + `${user.profile.displayName || user.profile.name} has zapped to your note` + ); + default: + break; + } + }, + false, + 'notification' + ); + } + }, [status]); + return ( - -
- {!activities ? ( -
-
- -

- Loading... -

+ + + {status === 'pending' ? ( +
+
+
- ) : activities.length < 1 ? ( + ) : allEvents.length < 1 ? (

🎉

@@ -61,12 +147,28 @@ export function LocalNotificationWidget({ params }: { params: Widget }) {

) : ( - - {activities.map((event) => renderEvent(event))} -
- + allEvents.map((event) => renderEvent(event)) )} -
+
+ {hasNextPage ? ( + + ) : null} +
+
); } diff --git a/src/shared/widgets/other/learnNostr.tsx b/src/shared/widgets/other/learnNostr.tsx deleted file mode 100644 index 0888a746..00000000 --- a/src/shared/widgets/other/learnNostr.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { useNavigate } from 'react-router-dom'; - -import { ArrowRightIcon } from '@shared/icons'; -import { TitleBar } from '@shared/titleBar'; -import { WidgetWrapper } from '@shared/widgets'; - -import { useResources } from '@stores/resources'; - -import { Widget } from '@utils/types'; - -export function LearnNostrWidget({ params }: { params: Widget }) { - const navigate = useNavigate(); - const openResource = useResources((state) => state.openResource); - const resources = useResources((state) => state.resources); - const seens = useResources((state) => state.seens); - - const open = (naddr: string) => { - // add resource to seen list - openResource(naddr); - // redirect - navigate(`/notes/article/${naddr}`); - }; - - return ( - - -
- {resources.map((resource, index) => ( -
-

- {resource.title} -

-
- {resource.data.length ? ( - resource.data.map((item, index) => ( - - )) - ) : ( -
-

- More resources are coming, stay tuned. -

-
- )} -
-
- ))} -
-
- ); -} diff --git a/src/shared/widgets/tmp/feeds.tsx b/src/shared/widgets/tmp/feeds.tsx index d046c159..2178a404 100644 --- a/src/shared/widgets/tmp/feeds.tsx +++ b/src/shared/widgets/tmp/feeds.tsx @@ -5,17 +5,15 @@ import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, CheckCircleIcon } from '@shared/icons'; import { User } from '@shared/user'; -import { WidgetKinds, useWidgets } from '@stores/widgets'; +import { WidgetKinds } from '@stores/constants'; +import { useWidget } from '@utils/hooks/useWidget'; import { Widget } from '@utils/types'; export function XfeedsWidget({ params }: { params: Widget }) { const { db } = useStorage(); + const { addWidget, removeWidget } = useWidget(); - const [setWidget, removeWidget] = useWidgets((state) => [ - state.setWidget, - state.removeWidget, - ]); const [title, setTitle] = useState(''); const [groups, setGroups] = useState>([]); @@ -28,17 +26,17 @@ export function XfeedsWidget({ params }: { params: Widget }) { }; const cancel = () => { - removeWidget(db, params.id); + removeWidget.mutate(params.id); }; const submit = async () => { - setWidget(db, { + addWidget.mutate({ kind: WidgetKinds.local.feeds, title: title || 'Group', content: JSON.stringify(groups), }); // remove temp widget - removeWidget(db, params.id); + removeWidget.mutate(params.id); }; return ( diff --git a/src/shared/widgets/tmp/hashtag.tsx b/src/shared/widgets/tmp/hashtag.tsx index 973dd9a7..278abd4a 100644 --- a/src/shared/widgets/tmp/hashtag.tsx +++ b/src/shared/widgets/tmp/hashtag.tsx @@ -1,11 +1,10 @@ import { Resolver, useForm } from 'react-hook-form'; -import { useStorage } from '@libs/storage/provider'; - import { ArrowRightCircleIcon } from '@shared/icons'; -import { WidgetKinds, useWidgets } from '@stores/widgets'; +import { WidgetKinds } from '@stores/constants'; +import { useWidget } from '@utils/hooks/useWidget'; import { Widget } from '@utils/types'; type FormValues = { @@ -27,12 +26,7 @@ const resolver: Resolver = async (values) => { }; export function XhashtagWidget({ params }: { params: Widget }) { - const [setWidget, removeWidget] = useWidgets((state) => [ - state.setWidget, - state.removeWidget, - ]); - - const { db } = useStorage(); + const { addWidget, removeWidget } = useWidget(); const { register, setError, @@ -41,18 +35,18 @@ export function XhashtagWidget({ params }: { params: Widget }) { } = useForm({ resolver }); const cancel = () => { - removeWidget(db, params.id); + removeWidget.mutate(params.id); }; const onSubmit = async (data: FormValues) => { try { - setWidget(db, { + addWidget.mutate({ kind: WidgetKinds.global.hashtag, title: data.hashtag, content: data.hashtag.replace('#', ''), }); // remove temp widget - removeWidget(db, params.id); + removeWidget.mutate(params.id); } catch (e) { setError('hashtag', { type: 'custom', diff --git a/src/stores/activities.ts b/src/stores/activities.ts deleted file mode 100644 index 0265a9e5..00000000 --- a/src/stores/activities.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { NDKEvent } from '@nostr-dev-kit/ndk'; -import { create } from 'zustand'; - -interface ActivitiesState { - activities: Array; - newMessages: number; - setActivities: (events: NDKEvent[]) => void; - addActivity: (event: NDKEvent) => void; - addNewMessage: () => void; - clearNewMessage: () => void; -} - -export const useActivities = create((set) => ({ - activities: null, - newMessages: 0, - setActivities: (events: NDKEvent[]) => { - set(() => ({ - activities: events, - })); - }, - addActivity: (event: NDKEvent) => { - set((state) => ({ - activities: state.activities ? [event, ...state.activities] : [event], - })); - }, - addNewMessage: () => { - set((state) => ({ newMessages: state.newMessages + 1 })); - }, - clearNewMessage: () => { - set(() => ({ newMessages: 0 })); - }, -})); diff --git a/src/stores/constants.ts b/src/stores/constants.ts index 5a76cdfc..46bc3f2c 100644 --- a/src/stores/constants.ts +++ b/src/stores/constants.ts @@ -1,3 +1,5 @@ +import { WidgetGroup } from '@utils/types'; + export const FULL_RELAYS = [ 'wss://relay.damus.io', 'wss://relay.primal.net', @@ -5,3 +7,104 @@ export const FULL_RELAYS = [ 'wss://relay.nostr.band/all', 'wss://nostr.mutinywallet.com', ]; + +export const FETCH_LIMIT = 50; + +export const WidgetKinds = { + local: { + network: 100, + feeds: 101, + files: 102, + articles: 103, + user: 104, + thread: 105, + follows: 106, + notification: 107, + }, + global: { + feeds: 1000, + files: 1001, + articles: 1002, + hashtag: 1003, + }, + nostrBand: { + trendingAccounts: 1, + trendingNotes: 2, + }, + other: { + learnNostr: 90000, + }, + tmp: { + list: 10000, + xfeed: 10001, + xhashtag: 10002, + }, +}; + +export const DefaultWidgets: Array = [ + { + title: 'Circles / Follows', + data: [ + { + kind: WidgetKinds.tmp.xfeed, + title: 'Group feeds', + description: 'All posts from specific people you want to keep up with', + }, + { + kind: WidgetKinds.local.files, + title: 'Files', + description: 'All files shared by people in your circle', + }, + { + kind: WidgetKinds.local.articles, + title: 'Articles', + description: 'All articles shared by people in your circle', + }, + ], + }, + { + title: 'Global', + data: [ + { + kind: WidgetKinds.tmp.xhashtag, + title: 'Hashtag', + description: 'All posts have a specific hashtag', + }, + { + kind: WidgetKinds.global.files, + title: 'Files', + description: 'All files shared by people in your current relay set', + }, + { + kind: WidgetKinds.global.articles, + title: 'Articles', + description: 'All articles shared by people in your current relay set', + }, + ], + }, + { + title: 'nostr.band', + data: [ + { + kind: WidgetKinds.nostrBand.trendingAccounts, + title: 'Accounts', + description: 'Trending accounts from the last 24 hours', + }, + { + kind: WidgetKinds.nostrBand.trendingNotes, + title: 'Notes', + description: 'Trending notes from the last 24 hours', + }, + ], + }, + { + title: 'Other', + data: [ + { + kind: WidgetKinds.local.notification, + title: 'Notification', + description: 'Everything happens around you', + }, + ], + }, +]; diff --git a/src/stores/widgets.ts b/src/stores/widgets.ts deleted file mode 100644 index d572b053..00000000 --- a/src/stores/widgets.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { create } from 'zustand'; -import { createJSONStorage, persist } from 'zustand/middleware'; - -import { LumeStorage } from '@libs/storage/instance'; - -import { Widget, WidgetGroup } from '@utils/types'; - -interface WidgetState { - widgets: null | Array; - isFetched: boolean; - fetchWidgets: (db: LumeStorage) => void; - setWidget: (db: LumeStorage, { kind, title, content }: Widget) => void; - removeWidget: (db: LumeStorage, id: string) => void; - reorderWidget: (id: string, position: number) => void; - setIsFetched: () => void; -} - -export const WidgetKinds = { - local: { - network: 100, - feeds: 101, - files: 102, - articles: 103, - user: 104, - thread: 105, - follows: 106, - notification: 107, - }, - global: { - feeds: 1000, - files: 1001, - articles: 1002, - hashtag: 1003, - }, - nostrBand: { - trendingAccounts: 1, - trendingNotes: 2, - }, - other: { - learnNostr: 90000, - }, - tmp: { - list: 10000, - xfeed: 10001, - xhashtag: 10002, - }, -}; - -export const DefaultWidgets: Array = [ - { - title: 'Circles / Follows', - data: [ - { - kind: WidgetKinds.tmp.xfeed, - title: 'Group feeds', - description: 'All posts from specific people you want to keep up with', - }, - { - kind: WidgetKinds.local.files, - title: 'Files', - description: 'All files shared by people in your circle', - }, - { - kind: WidgetKinds.local.articles, - title: 'Articles', - description: 'All articles shared by people in your circle', - }, - { - kind: WidgetKinds.local.follows, - title: 'Follows', - description: 'All posts from people you are following', - }, - ], - }, - { - title: 'Global', - data: [ - { - kind: WidgetKinds.tmp.xhashtag, - title: 'Hashtag', - description: 'All posts have a specific hashtag', - }, - { - kind: WidgetKinds.global.files, - title: 'Files', - description: 'All files shared by people in your current relay set', - }, - { - kind: WidgetKinds.global.articles, - title: 'Articles', - description: 'All articles shared by people in your current relay set', - }, - ], - }, - { - title: 'nostr.band', - data: [ - { - kind: WidgetKinds.nostrBand.trendingAccounts, - title: 'Accounts', - description: 'Trending accounts from the last 24 hours', - }, - { - kind: WidgetKinds.nostrBand.trendingNotes, - title: 'Notes', - description: 'Trending notes from the last 24 hours', - }, - ], - }, - { - title: 'Other', - data: [ - { - kind: WidgetKinds.local.notification, - title: 'Notification', - description: 'Everything happens around you', - }, - { - kind: WidgetKinds.other.learnNostr, - title: 'Learn Nostr', - description: 'All things you need to know about Nostr', - }, - ], - }, -]; - -export const useWidgets = create()( - persist( - (set) => ({ - widgets: null, - isFetched: false, - fetchWidgets: async (db: LumeStorage) => { - const dbWidgets = await db.getWidgets(); - - /* - dbWidgets.unshift({ - id: '9998', - title: 'Notification', - content: '', - kind: WidgetKinds.local.notification, - }); - */ - - dbWidgets.unshift({ - id: '9999', - title: '', - content: '', - kind: WidgetKinds.local.network, - }); - - set({ widgets: dbWidgets }); - }, - setWidget: async (db: LumeStorage, { kind, title, content }: Widget) => { - const widget: Widget = await db.createWidget(kind, title, content); - set((state) => ({ widgets: [...state.widgets, widget] })); - }, - removeWidget: async (db: LumeStorage, id: string) => { - await db.removeWidget(id); - set((state) => ({ widgets: state.widgets.filter((widget) => widget.id !== id) })); - }, - reorderWidget: (id: string, position: number) => { - set((state) => { - const widgets = [...state.widgets]; - const widget = widgets.find((widget) => widget.id === id); - if (!widget) return { widgets }; - - const idx = widgets.indexOf(widget); - widgets.splice(idx, 1); - widgets.splice(position, 0, widget); - - return { widgets }; - }); - }, - setIsFetched: () => { - set({ isFetched: true }); - }, - }), - { - name: 'widgets', - storage: createJSONStorage(() => sessionStorage), - } - ) -); diff --git a/src/utils/hooks/useNostr.ts b/src/utils/hooks/useNostr.ts index ed44e08e..00145054 100644 --- a/src/utils/hooks/useNostr.ts +++ b/src/utils/hooks/useNostr.ts @@ -29,11 +29,12 @@ export function useNostr() { const sub = async ( filter: NDKFilter, callback: (event: NDKEvent) => void, - groupable?: boolean + groupable?: boolean, + subKey?: string ) => { if (!ndk) throw new Error('NDK instance not found'); - const key = JSON.stringify(filter); + const key = subKey ?? JSON.stringify(filter); if (!subManager.get(key)) { const subEvent = ndk.subscribe(filter, { closeOnEose: false, diff --git a/src/utils/hooks/useWidget.ts b/src/utils/hooks/useWidget.ts new file mode 100644 index 00000000..b2203162 --- /dev/null +++ b/src/utils/hooks/useWidget.ts @@ -0,0 +1,30 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; + +import { useStorage } from '@libs/storage/provider'; + +import { Widget } from '@utils/types'; + +export function useWidget() { + const { db } = useStorage(); + const queryClient = useQueryClient(); + + const addWidget = useMutation({ + mutationFn: async (widget: Widget) => { + return await db.createWidget(widget.kind, widget.title, widget.content); + }, + onSuccess: (data) => { + queryClient.setQueryData(['widgets'], (old: Widget[]) => [...old, data]); + }, + }); + + const removeWidget = useMutation({ + mutationFn: async (id: string) => { + return await db.removeWidget(id); + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['widgets'] }); + }, + }); + + return { addWidget, removeWidget }; +} From e218ebee8906a0e3ad89cbaa8bac689be6cf874b Mon Sep 17 00:00:00 2001 From: reya Date: Wed, 1 Nov 2023 10:05:08 +0700 Subject: [PATCH 09/14] refactor text parser --- package.json | 2 + pnpm-lock.yaml | 74 +++++++----- src/shared/notes/kinds/text.tsx | 37 +++++- src/shared/notes/mentions/note.tsx | 7 +- src/shared/widgets/newsfeed.tsx | 8 +- src/shared/widgets/notification.tsx | 11 +- src/utils/parser.ts | 132 +++++++++++++++++++++ src/utils/parser.tsx | 173 ---------------------------- src/utils/types.d.ts | 3 +- 9 files changed, 234 insertions(+), 213 deletions(-) create mode 100644 src/utils/parser.ts delete mode 100644 src/utils/parser.tsx diff --git a/package.json b/package.json index 0b7e1437..b2767e85 100644 --- a/package.json +++ b/package.json @@ -63,8 +63,10 @@ "destr": "^2.0.2", "framer-motion": "^10.16.4", "html-to-text": "^9.0.5", + "immer": "^10.0.3", "light-bolt11-decoder": "^3.0.0", "lru-cache": "^10.0.1", + "markdown-to-jsx": "^7.3.2", "media-chrome": "^1.4.5", "million": "^2.6.4", "minidenticons": "^4.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3f5fdfd..5a0dd272 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -140,12 +140,18 @@ dependencies: html-to-text: specifier: ^9.0.5 version: 9.0.5 + immer: + specifier: ^10.0.3 + version: 10.0.3 light-bolt11-decoder: specifier: ^3.0.0 version: 3.0.0 lru-cache: specifier: ^10.0.1 version: 10.0.1 + markdown-to-jsx: + specifier: ^7.3.2 + version: 7.3.2(react@18.2.0) media-chrome: specifier: ^1.4.5 version: 1.4.5 @@ -193,7 +199,7 @@ dependencies: version: 1.1.1 reactflow: specifier: ^11.9.4 - version: 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 11.9.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) rehype-external-links: specifier: ^3.0.0 version: 3.0.0 @@ -220,7 +226,7 @@ dependencies: version: 0.15.6(react-dom@18.2.0)(react@18.2.0) zustand: specifier: ^4.4.4 - version: 4.4.4(@types/react@18.2.33)(react@18.2.0) + version: 4.4.4(@types/react@18.2.33)(immer@10.0.3)(react@18.2.0) devDependencies: '@tailwindcss/typography': @@ -1792,39 +1798,39 @@ packages: '@babel/runtime': 7.23.2 dev: false - /@reactflow/background@11.3.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/background@11.3.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-bgwvqWxF09chwmdkyClpYEMaewBspdwjgLbbFlLf4SpWPFMYyuvCBQrcISsvy/EDEWO9i3Uj9ktgGAhvtSQsmA==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(immer@10.0.3)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/controls@11.2.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/controls@11.2.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-x6e5p9iHjC6gd+4SoZ3DOOp0F1MefGKQ8hT6yPVdqxfo1+rV2WhrWvrX/MCoEu12Dp7457LdLfa0giy3aho8tQ==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(immer@10.0.3)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/core@11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/core@11.9.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Ko7nKPOYalwDTTbRHi2+QXDiidSAcpUzGN3G+0B+QysLZkcaPCkpkMjjHiDC4c/Z1BJBzs1FRJg/T6BXaBnYkg==} peerDependencies: react: '>=17' @@ -1840,19 +1846,19 @@ packages: d3-zoom: 3.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(immer@10.0.3)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/minimap@11.7.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/minimap@11.7.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Jo1R+uDey9IV7O2s3m0gK2+cZpg9M8hq2EZJb3NGfOSzMAPhj3mby0fNJIgTzycreuht0TpA51c2YfjGI3YIOw==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) '@types/d3-selection': 3.0.8 '@types/d3-zoom': 3.0.6 classcat: 5.0.4 @@ -1860,41 +1866,41 @@ packages: d3-zoom: 3.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(immer@10.0.3)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/node-resizer@2.2.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/node-resizer@2.2.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+p271/hAsM5M1+RQTWW/02pbNkCHeGXwxGimIlL1tMIagyuko0NX2vOz2B8jxJnPKlF09Wj18BcXBNUm3nDcSg==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 d3-drag: 3.0.0 d3-selection: 3.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(immer@10.0.3)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/node-toolbar@1.3.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@reactflow/node-toolbar@1.3.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-TfcmpXHRBb2mUfzKGjburiU6FWqRME9pPFs1OwIC1z5e9BjupQhNDEKEk8XHi7PKL/mAiDfwuGXaM1BVVFuPqw==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.4(@types/react@18.2.33)(react@18.2.0) + zustand: 4.4.4(@types/react@18.2.33)(immer@10.0.3)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer @@ -4445,6 +4451,10 @@ packages: engines: {node: '>= 4'} dev: true + /immer@10.0.3: + resolution: {integrity: sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==} + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -4922,6 +4932,15 @@ packages: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: false + /markdown-to-jsx@7.3.2(react@18.2.0): + resolution: {integrity: sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==} + engines: {node: '>= 10'} + peerDependencies: + react: '>= 0.14.0' + dependencies: + react: 18.2.0 + dev: false + /mdast-util-find-and-replace@3.0.1: resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} dependencies: @@ -6122,18 +6141,18 @@ packages: loose-envify: 1.4.0 dev: false - /reactflow@11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /reactflow@11.9.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-IHAKBkJngNvU9y1vZ5Nw9rvA3Z+zc9geTgQQIi9qq9Y9knGLlDDr9KfsjbFMew9AycAAgVg8TvBEakF4IT5lqg==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/background': 11.3.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/controls': 11.2.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/core': 11.9.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/minimap': 11.7.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-resizer': 2.2.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-toolbar': 1.3.4(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/background': 11.3.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/controls': 11.2.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/minimap': 11.7.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-resizer': 2.2.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-toolbar': 1.3.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -7117,7 +7136,7 @@ packages: engines: {node: '>=10'} dev: true - /zustand@4.4.4(@types/react@18.2.33)(react@18.2.0): + /zustand@4.4.4(@types/react@18.2.33)(immer@10.0.3)(react@18.2.0): resolution: {integrity: sha512-5UTUIAiHMNf5+mFp7/AnzJXS7+XxktULFN0+D1sCiZWyX7ZG+AQpqs2qpYrynRij4QvoDdCD+U+bmg/cG3Ucxw==} engines: {node: '>=12.7.0'} peerDependencies: @@ -7133,6 +7152,7 @@ packages: optional: true dependencies: '@types/react': 18.2.33 + immer: 10.0.3 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false diff --git a/src/shared/notes/kinds/text.tsx b/src/shared/notes/kinds/text.tsx index 47064ec0..857c5fc0 100644 --- a/src/shared/notes/kinds/text.tsx +++ b/src/shared/notes/kinds/text.tsx @@ -1,6 +1,16 @@ +import Markdown from 'markdown-to-jsx'; import { memo } from 'react'; -import { ImagePreview, LinkPreview, MentionNote, VideoPreview } from '@shared/notes'; +import { + Boost, + Hashtag, + ImagePreview, + Invoice, + LinkPreview, + MentionNote, + MentionUser, + VideoPreview, +} from '@shared/notes'; import { parser } from '@utils/parser'; @@ -17,9 +27,30 @@ export function TextNote(props: { content?: string; truncate?: boolean }) { return (
-
+ str, + forceBlock: true, + enforceAtxHeadings: true, + }} + className="break-p prose prose-neutral max-w-none select-text whitespace-pre-line leading-normal dark:prose-invert prose-headings:mb-1 prose-headings:mt-3 prose-p:mb-0 prose-p:mt-0 prose-p:last:mb-1 prose-a:font-normal prose-a:text-blue-500 prose-blockquote:mb-1 prose-blockquote:mt-1 prose-blockquote:border-l-[2px] prose-blockquote:border-blue-500 prose-blockquote:pl-2 prose-pre:whitespace-pre-wrap prose-pre:bg-white/10 prose-ol:m-0 prose-ol:mb-1 prose-ul:mb-1 prose-ul:mt-1 prose-img:mb-2 prose-img:mt-3 prose-hr:mx-0 prose-hr:my-2 hover:prose-a:text-blue-600 prose-a:hover:underline" + > {richContent.parsed} -
+ {richContent.images.length ? : null} {richContent.videos.length ? : null} {richContent.links.length ? : null} diff --git a/src/shared/notes/mentions/note.tsx b/src/shared/notes/mentions/note.tsx index e5de7205..059d5019 100644 --- a/src/shared/notes/mentions/note.tsx +++ b/src/shared/notes/mentions/note.tsx @@ -75,13 +75,14 @@ export const MentionNote = memo(function MentionNote({ id }: { id: string }) { } return ( - +
); }); diff --git a/src/shared/widgets/newsfeed.tsx b/src/shared/widgets/newsfeed.tsx index ab080eae..12a9c510 100644 --- a/src/shared/widgets/newsfeed.tsx +++ b/src/shared/widgets/newsfeed.tsx @@ -124,7 +124,13 @@ export function NewsfeedWidget() { sub( filter, async (event) => { - queryClient.setQueryData(['newsfeed'], (old: NDKEvent[]) => [event, ...old]); + queryClient.setQueryData( + ['newsfeed'], + (prev: { pageParams: number; pages: Array }) => ({ + ...prev, + pages: [[event], ...prev.pages], + }) + ); }, false, 'newsfeed' diff --git a/src/shared/widgets/notification.tsx b/src/shared/widgets/notification.tsx index 104226d5..2265803f 100644 --- a/src/shared/widgets/notification.tsx +++ b/src/shared/widgets/notification.tsx @@ -77,10 +77,13 @@ export function NotificationWidget() { sub( filter, async (event) => { - queryClient.setQueryData(['notification'], (old: NDKEvent[]) => [ - event, - ...old, - ]); + queryClient.setQueryData( + ['notification'], + (prev: { pageParams: number; pages: Array }) => ({ + ...prev, + pages: [[event], ...prev.pages], + }) + ); const user = ndk.getUser({ hexpubkey: event.pubkey }); await user.fetchProfile(); diff --git a/src/utils/parser.ts b/src/utils/parser.ts new file mode 100644 index 00000000..42d1fac4 --- /dev/null +++ b/src/utils/parser.ts @@ -0,0 +1,132 @@ +import { nip19 } from 'nostr-tools'; +import { + AddressPointer, + EventPointer, + ProfilePointer, +} from 'nostr-tools/lib/types/nip19'; + +import { RichContent } from '@utils/types'; + +function isURL(string: string) { + try { + const url = new URL(string); + if (url.protocol.length > 0) { + if (url.protocol === 'https:' || url.protocol === 'http:') { + return true; + } else { + return false; + } + } + return true; + } catch (e) { + return false; + } +} + +export function parser(content: string) { + const richContent: RichContent = { + parsed: null, + images: [], + videos: [], + links: [], + notes: [], + }; + + const parsed = content + .trim() + .split(/(\s+)/) + .map((word) => { + // url + if (isURL(word)) { + const url = new URL(word); + url.search = ''; + + if (url.pathname.match(/\.(jpg|jpeg|gif|png|webp|avif)$/)) { + // image url + richContent.images.push(word); + // remove url from original content + return word.replace(word, ''); + } + + if (url.pathname.match(/\.(mp4|mov|webm|wmv|flv|mts|avi|ogv|mkv|mp3|m3u8)$/)) { + // video url + richContent.videos.push(word); + // remove url from original content + return word.replace(word, ''); + } + + // normal url + if (richContent.links.length < 1) { + richContent.links.push(url.toString()); + } + } + + // hashtag + if (word.startsWith('#') && word.length > 1) { + return word.replace(word, ``); + } + + // boost + if (word.startsWith('$prism') && word.length > 1) { + return word.replace(word, ``); + } + + // nostr account references (depreciated) + if (word.startsWith('@npub1')) { + const npub = word.replace('@', '').replace(/[^a-zA-Z0-9 ]/g, ''); + return word.replace( + word, + `` + ); + } + + // nostr account references + if (word.startsWith('nostr:npub1') || word.startsWith('npub1')) { + const npub = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); + return word.replace( + word, + `` + ); + } + + // nostr profile references + if (word.startsWith('nostr:nprofile1') || word.startsWith('nprofile1')) { + const nprofile = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); + const decoded = nip19.decode(nprofile).data as ProfilePointer; + return word.replace(word, ``); + } + + // nostr address references + if (word.startsWith('nostr:naddr1') || word.startsWith('naddr1')) { + const naddr = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); + const decoded = nip19.decode(naddr).data as AddressPointer; + return word.replace(word, ``); + } + + // lightning invoice + if (word.startsWith('lnbc') && word.length > 60) { + return word.replace(word, ``); + } + + // nostr note references + if (word.startsWith('nostr:note1') || word.startsWith('note1')) { + const note = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); + richContent.notes.push(nip19.decode(note).data as string); + return word.replace(word, ''); + } + + // nostr event references + if (word.startsWith('nostr:nevent1') || word.startsWith('nevent1')) { + const nevent = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); + const decoded = nip19.decode(nevent).data as EventPointer; + richContent.notes.push(decoded.id); + return word.replace(word, ''); + } + + return word; + }); + + // update content with parsed version + richContent.parsed = parsed.join(' ').trim(); + return richContent; +} diff --git a/src/utils/parser.tsx b/src/utils/parser.tsx deleted file mode 100644 index 2441dcf7..00000000 --- a/src/utils/parser.tsx +++ /dev/null @@ -1,173 +0,0 @@ -import { nip19 } from 'nostr-tools'; -import { - AddressPointer, - EventPointer, - ProfilePointer, -} from 'nostr-tools/lib/types/nip19'; -import { Link } from 'react-router-dom'; -import reactStringReplace from 'react-string-replace'; - -import { Boost, Hashtag, Invoice, MentionUser } from '@shared/notes'; - -import { RichContent } from '@utils/types'; - -function isURL(string: string) { - try { - const url = new URL(string); - if (url.protocol.length > 0) { - if (url.protocol === 'https:' || url.protocol === 'http:') { - return true; - } else { - return false; - } - } - return true; - } catch (e) { - return false; - } -} - -export function parser(eventContent: string) { - const content: RichContent = { - parsed: null, - images: [], - videos: [], - links: [], - notes: [], - }; - - const parsed = eventContent.split(/\s/gm).map((word) => { - // nostr note references - if (word.startsWith('nostr:note1') || word.startsWith('note1')) { - const note = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); - content.notes.push(nip19.decode(note).data as string); - return word.replace(word, ' '); - } - - // nostr event references - if (word.startsWith('nostr:nevent1') || word.startsWith('nevent1')) { - const nevent = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); - const decoded = nip19.decode(nevent).data as EventPointer; - content.notes.push(decoded.id); - return word.replace(word, ' '); - } - - // url - if (isURL(word)) { - const url = new URL(word); - url.search = ''; - - if (url.pathname.match(/\.(jpg|jpeg|gif|png|webp|avif)$/)) { - // image url - content.images.push(word); - // remove url from original content - return word.replace(word, ' '); - } - - if (url.pathname.match(/\.(mp4|mov|webm|wmv|flv|mts|avi|ogv|mkv|mp3|m3u8)$/)) { - // video url - content.videos.push(word); - // remove url from original content - return word.replace(word, ' '); - } - - // normal url - if (content.links.length < 1) { - content.links.push(url.toString()); - return word.replace(word, ' '); - } else { - return reactStringReplace(word, word, (match, i) => ( - <> - {' '} - - {word} - {' '} - - )); - } - } - - // hashtag - if (word.startsWith('#') && word.length > 1) { - return reactStringReplace(word, word, (match, i) => ( - <> - {' '} - {' '} - - )); - } - - // boost - if (word.startsWith('$prism') && word.length > 1) { - return reactStringReplace(word, word, (match, i) => ( - <> - {' '} - {' '} - - )); - } - - // nostr account references (depreciated) - if (word.startsWith('@npub1')) { - const npub = word.replace('@', '').replace(/[^a-zA-Z0-9 ]/g, ''); - return reactStringReplace(word, word, (match, i) => ( - <> - {' '} - {' '} - - )); - } - - // nostr account references - if (word.startsWith('nostr:npub1') || word.startsWith('npub1')) { - const npub = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); - return reactStringReplace(word, word, (match, i) => ( - <> - {' '} - {' '} - - )); - } - - // nostr profile references - if (word.startsWith('nostr:nprofile1') || word.startsWith('nprofile1')) { - const nprofile = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); - const decoded = nip19.decode(nprofile).data as ProfilePointer; - return reactStringReplace(word, word, (match, i) => ( - <> - {' '} - {' '} - - )); - } - - // nostr address references - if (word.startsWith('nostr:naddr1') || word.startsWith('naddr1')) { - const naddr = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); - const decoded = nip19.decode(naddr).data as AddressPointer; - return reactStringReplace(word, word, (match, i) => ( - <> - {' '} - {' '} - - )); - } - - // lightning invoice - if (word.startsWith('lnbc') && word.length > 60) { - return reactStringReplace(word, word, (match, i) => ( - <> - {' '} - {' '} - - )); - } - - // normal word - return ' ' + word + ' '; - }); - - // update content with parsed version - content.parsed = parsed; - return content; -} diff --git a/src/utils/types.d.ts b/src/utils/types.d.ts index ba8794ae..0c427925 100644 --- a/src/utils/types.d.ts +++ b/src/utils/types.d.ts @@ -1,9 +1,8 @@ import { type NDKEvent, type NDKUserProfile } from '@nostr-dev-kit/ndk'; import { type Response } from '@tauri-apps/plugin-http'; -import { ReactNode } from 'react'; export interface RichContent { - parsed: string | ReactNode[]; + parsed: string; images: string[]; videos: string[]; links: string[]; From f2dddf97f582bc133c5751970aab935c175b1ee7 Mon Sep 17 00:00:00 2001 From: reya Date: Wed, 1 Nov 2023 13:01:52 +0700 Subject: [PATCH 10/14] polish --- package.json | 4 - pnpm-lock.yaml | 679 +---------------------- src/app/space/components/widgetList.tsx | 31 +- src/shared/notes/kinds/articleDetail.tsx | 41 +- src/shared/notes/kinds/file.tsx | 78 +-- src/shared/notes/kinds/text.tsx | 2 +- src/shared/notes/mentions/note.tsx | 6 +- src/shared/notes/preview/image.tsx | 2 +- src/shared/notes/preview/link.tsx | 105 ++-- src/shared/notes/preview/video.tsx | 2 +- src/stores/constants.ts | 2 +- 11 files changed, 115 insertions(+), 837 deletions(-) diff --git a/package.json b/package.json index b2767e85..6b28367f 100644 --- a/package.json +++ b/package.json @@ -79,12 +79,8 @@ "react-dom": "^18.2.0", "react-hook-form": "^7.47.0", "react-hotkeys-hook": "^4.4.1", - "react-markdown": "^9.0.0", "react-router-dom": "^6.17.0", - "react-string-replace": "^1.1.1", "reactflow": "^11.9.4", - "rehype-external-links": "^3.0.0", - "remark-gfm": "^4.0.0", "sonner": "^1.0.3", "tailwind-scrollbar": "^3.0.5", "tauri-controls": "^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a0dd272..9476c679 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -188,24 +188,12 @@ dependencies: react-hotkeys-hook: specifier: ^4.4.1 version: 4.4.1(react-dom@18.2.0)(react@18.2.0) - react-markdown: - specifier: ^9.0.0 - version: 9.0.0(@types/react@18.2.33)(react@18.2.0) react-router-dom: specifier: ^6.17.0 version: 6.17.0(react-dom@18.2.0)(react@18.2.0) - react-string-replace: - specifier: ^1.1.1 - version: 1.1.1 reactflow: specifier: ^11.9.4 version: 11.9.4(@types/react@18.2.33)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) - rehype-external-links: - specifier: ^3.0.0 - version: 3.0.0 - remark-gfm: - specifier: ^4.0.0 - version: 4.0.0 sonner: specifier: ^1.0.3 version: 1.0.3(react-dom@18.2.0)(react@18.2.0) @@ -2847,22 +2835,10 @@ packages: '@types/d3-zoom': 3.0.6 dev: false - /@types/debug@4.1.10: - resolution: {integrity: sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==} - dependencies: - '@types/ms': 0.7.33 - dev: false - /@types/geojson@7946.0.12: resolution: {integrity: sha512-uK2z1ZHJyC0nQRbuovXFt4mzXDwf27vQeUWNhfKGwRcWW429GOhP8HxUHlM6TLH4bzmlv/HlEjpvJh3JfmGsAA==} dev: false - /@types/hast@3.0.2: - resolution: {integrity: sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==} - dependencies: - '@types/unist': 3.0.1 - dev: false - /@types/html-to-text@9.0.3: resolution: {integrity: sha512-ImzcLdHN3+zghCoZcA+vWd/t0GhM10S7lnvSq9YA6lbo4HGK10WIJ7n+NI7mbeVZeUtgrmK5fXM66kZcws1oHA==} dev: true @@ -2882,20 +2858,10 @@ packages: '@types/mdurl': 1.0.4 dev: false - /@types/mdast@4.0.2: - resolution: {integrity: sha512-tYR83EignvhYO9iU3kDg8V28M0jqyh9zzp5GV+EO+AYnyUl3P5ltkTeJuTiFZQFz670FSb3EwT/6LQdX+UdKfw==} - dependencies: - '@types/unist': 3.0.1 - dev: false - /@types/mdurl@1.0.4: resolution: {integrity: sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A==} dev: false - /@types/ms@0.7.33: - resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} - dev: false - /@types/node@20.8.9: resolution: {integrity: sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==} dependencies: @@ -2936,10 +2902,6 @@ packages: resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} dev: false - /@types/unist@3.0.1: - resolution: {integrity: sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==} - dev: false - /@types/youtube-player@5.5.9: resolution: {integrity: sha512-l2Q7ESxMv6HK2jc6I1qwMMGbh5bpHYQVCpXs0GsFmzaXoPibX50pHzs+PGfmegDY8TvmMGKWBgGI16ytqK6iIw==} dev: true @@ -3077,6 +3039,7 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true /@vitejs/plugin-react-swc@3.4.0(vite@4.5.0): resolution: {integrity: sha512-m7UaA4Uvz82N/0EOVpZL4XsFIakRqrFKeSNxa1FBLSXGvWrWRBwmZb4qxk+ZIVAZcW3c3dn5YosomDgx62XWcQ==} @@ -3283,10 +3246,6 @@ packages: dequal: 2.0.3 dev: true - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: false - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3349,10 +3308,6 @@ packages: engines: {node: '>=12.13'} dev: false - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: false - /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3374,10 +3329,6 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: false - /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -3438,10 +3389,6 @@ packages: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} dev: true - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false - /commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -3602,12 +3549,6 @@ packages: dependencies: ms: 2.1.2 - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - dependencies: - character-entities: 2.0.2 - dev: false - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -3638,6 +3579,7 @@ packages: /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + dev: true /destr@2.0.2: resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} @@ -3647,12 +3589,6 @@ packages: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dependencies: - dequal: 2.0.3 - dev: false - /dexie@3.2.4: resolution: {integrity: sha512-VKoTQRSv7+RnffpOJ3Dh6ozknBqzWw/F3iqMdsZg958R0AS8AnY9x9d1lbwENr0gzeGJHXKcGhAMRaqys6SxqA==} engines: {node: '>=6.0'} @@ -3894,11 +3830,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: false - /eslint-config-prettier@9.0.0(eslint@8.52.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true @@ -4088,10 +4019,6 @@ packages: type: 2.7.2 dev: false - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false - /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4378,32 +4305,6 @@ packages: dependencies: function-bind: 1.1.2 - /hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - dependencies: - '@types/hast': 3.0.2 - dev: false - - /hast-util-to-jsx-runtime@2.2.0: - resolution: {integrity: sha512-wSlp23N45CMjDg/BPW8zvhEi3R+8eRE1qFbjEyAUzMCzu2l1Wzwakq+Tlia9nkCtEl5mDxa7nKHsvYJ6Gfn21A==} - dependencies: - '@types/hast': 3.0.2 - '@types/unist': 3.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - property-information: 6.3.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unist-util-position: 5.0.0 - vfile-message: 4.0.2 - dev: false - - /hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - dependencies: - '@types/hast': 3.0.2 - dev: false - /html-to-text@9.0.5: resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} engines: {node: '>=14'} @@ -4415,10 +4316,6 @@ packages: selderee: 0.11.0 dev: false - /html-url-attributes@3.0.0: - resolution: {integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==} - dev: false - /htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} dependencies: @@ -4477,10 +4374,6 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: false - /internal-slot@1.0.6: resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} @@ -4496,11 +4389,6 @@ packages: loose-envify: 1.4.0 dev: false - /is-absolute-url@4.0.1: - resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false - /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -4613,11 +4501,6 @@ packages: engines: {node: '>=8'} dev: true - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false - /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -4881,10 +4764,6 @@ packages: wrap-ansi: 8.1.0 dev: true - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: false - /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -4928,10 +4807,6 @@ packages: uc.micro: 1.0.6 dev: false - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: false - /markdown-to-jsx@7.3.2(react@18.2.0): resolution: {integrity: sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==} engines: {node: '>= 10'} @@ -4941,142 +4816,6 @@ packages: react: 18.2.0 dev: false - /mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - dependencies: - '@types/mdast': 4.0.2 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - - /mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} - dependencies: - '@types/mdast': 4.0.2 - '@types/unist': 3.0.1 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} - dependencies: - '@types/mdast': 4.0.2 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.0.1 - dev: false - - /mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} - dependencies: - '@types/mdast': 4.0.2 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - dependencies: - '@types/mdast': 4.0.2 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - dependencies: - '@types/mdast': 4.0.2 - devlop: 1.1.0 - markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - dependencies: - '@types/mdast': 4.0.2 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} - dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-gfm-autolink-literal: 2.0.0 - mdast-util-gfm-footnote: 2.0.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-phrasing@4.0.0: - resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} - dependencies: - '@types/mdast': 4.0.2 - unist-util-is: 6.0.0 - dev: false - - /mdast-util-to-hast@13.0.2: - resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} - dependencies: - '@types/hast': 3.0.2 - '@types/mdast': 4.0.2 - '@ungap/structured-clone': 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - dev: false - - /mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} - dependencies: - '@types/mdast': 4.0.2 - '@types/unist': 3.0.1 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.0.0 - mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - dev: false - - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - dependencies: - '@types/mdast': 4.0.2 - dev: false - /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: false @@ -5093,253 +4832,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /micromark-core-commonmark@2.0.0: - resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} - dependencies: - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-footnote@2.0.0: - resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-table@2.0.0: - resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - dependencies: - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-task-list-item@2.0.1: - resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - dependencies: - micromark-extension-gfm-autolink-literal: 2.0.0 - micromark-extension-gfm-footnote: 2.0.0 - micromark-extension-gfm-strikethrough: 2.0.0 - micromark-extension-gfm-table: 2.0.0 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.0.1 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-character@2.0.1: - resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} - dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - dev: false - - /micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - dev: false - - /micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} - dependencies: - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-subtokenize@2.0.0: - resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - dev: false - - /micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - dev: false - - /micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - dependencies: - '@types/debug': 4.1.10 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -5817,10 +5309,6 @@ packages: react-is: 16.13.1 dev: true - /property-information@6.3.0: - resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==} - dev: false - /prosemirror-changeset@2.2.1: resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} dependencies: @@ -6031,29 +5519,6 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true - /react-markdown@9.0.0(@types/react@18.2.33)(react@18.2.0): - resolution: {integrity: sha512-v6yNf3AB8GfJ8lCpUvzxAXKxgsHpdmWPlcVRQ6Nocsezp255E/IDrF31kLQsPJeB/cKto/geUwjU36wH784FCA==} - peerDependencies: - '@types/react': '>=18' - react: '>=18' - dependencies: - '@types/hast': 3.0.2 - '@types/react': 18.2.33 - devlop: 1.1.0 - hast-util-to-jsx-runtime: 2.2.0 - html-url-attributes: 3.0.0 - mdast-util-to-hast: 13.0.2 - micromark-util-sanitize-uri: 2.0.0 - react: 18.2.0 - remark-parse: 11.0.0 - remark-rehype: 11.0.0 - unified: 11.0.4 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: false - /react-remove-scroll-bar@2.3.4(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} @@ -6112,11 +5577,6 @@ packages: react: 18.2.0 dev: false - /react-string-replace@1.1.1: - resolution: {integrity: sha512-26TUbLzLfHQ5jO5N7y3Mx88eeKo0Ml0UjCQuX4BMfOd/JX+enQqlKpL1CZnmjeBRvQE8TR+ds9j1rqx9CxhKHQ==} - engines: {node: '>=0.12.0'} - dev: false - /react-style-singleton@2.2.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} @@ -6195,59 +5655,6 @@ packages: set-function-name: 2.0.1 dev: true - /rehype-external-links@3.0.0: - resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} - dependencies: - '@types/hast': 3.0.2 - '@ungap/structured-clone': 1.2.0 - hast-util-is-element: 3.0.0 - is-absolute-url: 4.0.1 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 - dev: false - - /remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} - dependencies: - '@types/mdast': 4.0.2 - mdast-util-gfm: 3.0.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - dependencies: - '@types/mdast': 4.0.2 - mdast-util-from-markdown: 2.0.0 - micromark-util-types: 2.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-rehype@11.0.0: - resolution: {integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==} - dependencies: - '@types/hast': 3.0.2 - '@types/mdast': 4.0.2 - mdast-util-to-hast: 13.0.2 - unified: 11.0.4 - vfile: 6.0.1 - dev: false - - /remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - dependencies: - '@types/mdast': 4.0.2 - mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 - dev: false - /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -6435,10 +5842,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false - /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -6516,12 +5919,6 @@ packages: engines: {node: '>=8'} dev: true - /style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} - dependencies: - inline-style-parser: 0.1.1 - dev: false - /sucrase@3.34.0: resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} engines: {node: '>=8'} @@ -6661,14 +6058,6 @@ packages: dependencies: is-number: 7.0.0 - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false - - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: false - /ts-api-utils@1.0.3(typescript@5.2.2): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} @@ -6802,51 +6191,6 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} - dependencies: - '@types/unist': 3.0.1 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 6.0.1 - dev: false - - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - dependencies: - '@types/unist': 3.0.1 - dev: false - - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - dependencies: - '@types/unist': 3.0.1 - dev: false - - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - dependencies: - '@types/unist': 3.0.1 - dev: false - - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - dependencies: - '@types/unist': 3.0.1 - unist-util-is: 6.0.0 - dev: false - - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - dependencies: - '@types/unist': 3.0.1 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - /unplugin@1.5.0: resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==} dependencies: @@ -6927,21 +6271,6 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - dependencies: - '@types/unist': 3.0.1 - unist-util-stringify-position: 4.0.0 - dev: false - - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - dependencies: - '@types/unist': 3.0.1 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - dev: false - /virtua@0.15.6(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-j9EfyAmpp6VwuHmnXkWpzciHRdlY7XGPzZg3ZqOPFW+phNUnFQALYdrThc3CYHZFsj380ieIegdjPGS+Qbkuyg==} peerDependencies: @@ -7156,7 +6485,3 @@ packages: react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false - - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: false diff --git a/src/app/space/components/widgetList.tsx b/src/app/space/components/widgetList.tsx index 0ace2c0a..31c8fab5 100644 --- a/src/app/space/components/widgetList.tsx +++ b/src/app/space/components/widgetList.tsx @@ -16,10 +16,15 @@ import { WidgetWrapper } from '@shared/widgets'; import { DefaultWidgets, WidgetKinds } from '@stores/constants'; import { useWidget } from '@utils/hooks/useWidget'; -import { Widget, WidgetGroup } from '@utils/types'; +import { Widget, WidgetGroup, WidgetGroupItem } from '@utils/types'; export function WidgetList({ params }: { params: Widget }) { - const { addWidget } = useWidget(); + const { addWidget, removeWidget } = useWidget(); + + const open = (item: WidgetGroupItem) => { + addWidget.mutate({ kind: item.kind, title: item.title, content: '' }); + removeWidget.mutate(params.id); + }; const renderIcon = useCallback( (kind: number) => { @@ -65,20 +70,16 @@ export function WidgetList({ params }: { params: Widget }) { const renderItem = useCallback((row: WidgetGroup, index: number) => { return (
-

- {row.title} -

-
+

{row.title}

+
{row.data.map((item, index) => (
); } if (type === 'video') { return ( -
- - -
+ + ); } return ( -
- - {url} - +
+
); } diff --git a/src/shared/notes/kinds/text.tsx b/src/shared/notes/kinds/text.tsx index 857c5fc0..1c90e4c8 100644 --- a/src/shared/notes/kinds/text.tsx +++ b/src/shared/notes/kinds/text.tsx @@ -26,7 +26,7 @@ export function TextNote(props: { content?: string; truncate?: boolean }) { } return ( -
+
+
); @@ -58,7 +58,7 @@ export const MentionNote = memo(function MentionNote({ id }: { id: string }) { if (status === 'error') { const noteLink = `https://njump.me/${nip19.noteEncode(id)}`; return ( -
+
lume @@ -79,7 +79,7 @@ export const MentionNote = memo(function MentionNote({ id }: { id: string }) {
openThread(e, id)} - className="mt-3 cursor-default rounded-lg border border-neutral-300 bg-neutral-200 p-3 dark:border-neutral-700 dark:bg-neutral-800" + className="w-full cursor-default rounded-lg border border-neutral-300 bg-neutral-200 p-3 dark:border-neutral-700 dark:bg-neutral-800" >
{renderKind(data)}
diff --git a/src/shared/notes/preview/image.tsx b/src/shared/notes/preview/image.tsx index 9f9d740c..cfc7f42c 100644 --- a/src/shared/notes/preview/image.tsx +++ b/src/shared/notes/preview/image.tsx @@ -11,7 +11,7 @@ export function ImagePreview({ urls }: { urls: string[] }) { }; return ( -
+
{urls.map((url) => (
- {status === 'pending' ? ( -
-
-
-
-
- - {domain.hostname} - -
+ if (status === 'pending') { + return ( +
+
+
+
+
+ + {domain.hostname} +
- ) : ( - - {error ? ( -
-

- Can't fetch open graph, click to open webpage -

- - {domain.hostname} - -
- ) : ( - <> - {isImage(data.image) ? ( - {urls[0]} - ) : null} -
-
- {data.title && ( -
- {data.title} -
- )} - {data.description ? ( -

- {data.description} -

- ) : null} -
- - {domain.hostname} - -
- +
+ ); + } + + return ( + + {isImage(data.image) ? ( + {urls[0]} + ) : null} +
+
+ {data.title && ( +
+ {data.title} +
)} - - )} -
+ {data.description ? ( +

+ {data.description} +

+ ) : null} +
+ + {domain.hostname} + +
+ ); } diff --git a/src/shared/notes/preview/video.tsx b/src/shared/notes/preview/video.tsx index 681da5a1..4b5f61ac 100644 --- a/src/shared/notes/preview/video.tsx +++ b/src/shared/notes/preview/video.tsx @@ -11,7 +11,7 @@ import { memo } from 'react'; export const VideoPreview = memo(function VideoPreview({ urls }: { urls: string[] }) { return ( -
+
{urls.map((url) => (