This commit is contained in:
Ren Amamiya 2023-08-12 11:18:10 +07:00
parent 36b2acba6a
commit bb089bb259
27 changed files with 502 additions and 481 deletions

View File

@ -19,16 +19,12 @@
"dependencies": {
"@ctrl/magnet-link": "^3.1.2",
"@headlessui/react": "^1.7.16",
"@noble/ciphers": "^0.2.0",
"@noble/curves": "^1.1.0",
"@noble/hashes": "^1.3.1",
"@nostr-dev-kit/ndk": "^0.8.7",
"@nostr-dev-kit/ndk": "^0.8.11",
"@nostr-fetch/adapter-ndk": "^0.11.0",
"@radix-ui/react-collapsible": "^1.0.3",
"@radix-ui/react-dialog": "^1.0.4",
"@radix-ui/react-popover": "^1.0.6",
"@radix-ui/react-tooltip": "^1.0.6",
"@scure/base": "^1.1.1",
"@tanstack/react-query": "^4.32.6",
"@tanstack/react-query-devtools": "^4.32.6",
"@tanstack/react-virtual": "3.0.0-beta.54",
@ -63,7 +59,7 @@
"html-to-text": "^9.0.5",
"immer": "^10.0.2",
"light-bolt11-decoder": "^3.0.0",
"lru-cache": "^10.0.0",
"lru-cache": "^10.0.1",
"nostr-fetch": "^0.12.2",
"nostr-tools": "^1.14.0",
"qrcode.react": "^3.1.0",
@ -73,7 +69,7 @@
"react-hotkeys-hook": "^4.4.1",
"react-markdown": "^8.0.7",
"react-player": "^2.12.0",
"react-router-dom": "^6.14.2",
"react-router-dom": "^6.15.0",
"react-string-replace": "^1.1.1",
"react-virtuoso": "^4.5.0",
"remark-gfm": "^3.0.1",
@ -85,7 +81,7 @@
"@tauri-apps/cli": "2.0.0-alpha.10",
"@trivago/prettier-plugin-sort-imports": "^4.2.0",
"@types/html-to-text": "^9.0.1",
"@types/node": "^18.17.4",
"@types/node": "^18.17.5",
"@types/react": "^18.2.20",
"@types/react-dom": "^18.2.7",
"@types/youtube-player": "^5.5.7",
@ -97,7 +93,7 @@
"cross-env": "^7.0.3",
"csstype": "^3.1.2",
"encoding": "^0.1.13",
"eslint": "^8.46.0",
"eslint": "^8.47.0",
"eslint-config-prettier": "^8.10.0",
"eslint-plugin-jsx-a11y": "^6.7.1",
"eslint-plugin-react": "^7.33.1",

View File

@ -7,21 +7,12 @@ dependencies:
'@headlessui/react':
specifier: ^1.7.16
version: 1.7.16(react-dom@18.2.0)(react@18.2.0)
'@noble/ciphers':
specifier: ^0.2.0
version: 0.2.0
'@noble/curves':
specifier: ^1.1.0
version: 1.1.0
'@noble/hashes':
specifier: ^1.3.1
version: 1.3.1
'@nostr-dev-kit/ndk':
specifier: ^0.8.7
version: 0.8.7(typescript@4.9.5)
specifier: ^0.8.11
version: 0.8.11(typescript@4.9.5)
'@nostr-fetch/adapter-ndk':
specifier: ^0.11.0
version: 0.11.0(@nostr-dev-kit/ndk@0.8.7)(nostr-fetch@0.12.2)
version: 0.11.0(@nostr-dev-kit/ndk@0.8.11)(nostr-fetch@0.12.2)
'@radix-ui/react-collapsible':
specifier: ^1.0.3
version: 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0)
@ -34,9 +25,6 @@ dependencies:
'@radix-ui/react-tooltip':
specifier: ^1.0.6
version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0)
'@scure/base':
specifier: ^1.1.1
version: 1.1.1
'@tanstack/react-query':
specifier: ^4.32.6
version: 4.32.6(react-dom@18.2.0)(react@18.2.0)
@ -51,46 +39,46 @@ dependencies:
version: 2.0.0-alpha.5
'@tauri-apps/plugin-app':
specifier: github:tauri-apps/tauri-plugin-app#v2
version: github.com/tauri-apps/tauri-plugin-app/dbfef70e44dc82156e79301742b656fd797a1473
version: github.com/tauri-apps/tauri-plugin-app/f8b21651dfa42f42e080488568010ff3bbeb7350
'@tauri-apps/plugin-autostart':
specifier: github:tauri-apps/tauri-plugin-autostart#v2
version: github.com/tauri-apps/tauri-plugin-autostart/33968b8b0aae857f045aeb17741bcff27440f6d3
version: github.com/tauri-apps/tauri-plugin-autostart/0b6ccaa31eccdeec47ca0425f7696846aa3a5f46
'@tauri-apps/plugin-clipboard-manager':
specifier: github:tauri-apps/tauri-plugin-clipboard-manager#v2
version: github.com/tauri-apps/tauri-plugin-clipboard-manager/549ca993a47ae7aafff635d99fc3e6dc124b9181
version: github.com/tauri-apps/tauri-plugin-clipboard-manager/32e302b07e3ea11b59c55d4fc100516ac49a4968
'@tauri-apps/plugin-dialog':
specifier: github:tauri-apps/tauri-plugin-dialog#v2
version: github.com/tauri-apps/tauri-plugin-dialog/2a358d18e865b31c6878f91bd068cfe36d00d639
version: github.com/tauri-apps/tauri-plugin-dialog/2d74ae009691b50e6498fb814a77c59b6798f2ac
'@tauri-apps/plugin-fs':
specifier: github:tauri-apps/tauri-plugin-fs#v2
version: github.com/tauri-apps/tauri-plugin-fs/60e8dec66d2582cc39ebdd7b7101e9c96c23e52a
version: github.com/tauri-apps/tauri-plugin-fs/0dd45ead4ca3cc8b426614fa47ad9227e9ed2053
'@tauri-apps/plugin-http':
specifier: github:tauri-apps/tauri-plugin-http#v2
version: github.com/tauri-apps/tauri-plugin-http/6d45e3ecae761f1990ed6366e6138c69775c58d8
version: github.com/tauri-apps/tauri-plugin-http/27b519b63419db048d2d30945ff34b2234975ccd
'@tauri-apps/plugin-notification':
specifier: github:tauri-apps/tauri-plugin-notification#v2
version: github.com/tauri-apps/tauri-plugin-notification/9989c95217af5abcf847e790cb74dda485c0459a
version: github.com/tauri-apps/tauri-plugin-notification/7878980ee8cb97437f343cc31b97a1b666e324d4
'@tauri-apps/plugin-os':
specifier: github:tauri-apps/tauri-plugin-os#v2
version: github.com/tauri-apps/tauri-plugin-os/a63d34fddb1bd97d6a634a1881e5cc26910e115f
version: github.com/tauri-apps/tauri-plugin-os/e4dda0ceff72cbc762937e79c104522a8866b840
'@tauri-apps/plugin-process':
specifier: github:tauri-apps/tauri-plugin-process#v2
version: github.com/tauri-apps/tauri-plugin-process/ed3f8f78ddecc72c926239f5a10ec6ce1b8c353e
version: github.com/tauri-apps/tauri-plugin-process/eec5dc8d37c80b2c1ebb7eb8e4cb976eed221a9d
'@tauri-apps/plugin-shell':
specifier: github:tauri-apps/tauri-plugin-shell#v2
version: github.com/tauri-apps/tauri-plugin-shell/e538c5178508060d6fc1d1f8b03fa8f40fb53626
version: github.com/tauri-apps/tauri-plugin-shell/f76cb0019364f40b9411eac5f5fdf6fd04b3e538
'@tauri-apps/plugin-sql':
specifier: github:tauri-apps/tauri-plugin-sql#v2
version: github.com/tauri-apps/tauri-plugin-sql/0591e9f63e0f86be79c209f4bcb564ccce4bd05c
version: github.com/tauri-apps/tauri-plugin-sql/62eb3e4c9f084c1238cf7ab00d47148c034be207
'@tauri-apps/plugin-store':
specifier: github:tauri-apps/tauri-plugin-store#v2
version: github.com/tauri-apps/tauri-plugin-store/2f5e470ba6d746b54da46fcb3eb10325fa224351
version: github.com/tauri-apps/tauri-plugin-store/ddb10b0776a670028c1a56bbe922aba02fd32484
'@tauri-apps/plugin-stronghold':
specifier: github:tauri-apps/tauri-plugin-stronghold#v2
version: github.com/tauri-apps/tauri-plugin-stronghold/a87861766f3520b5fc1ea1f34665d814bbee9b06
version: github.com/tauri-apps/tauri-plugin-stronghold/9b2878280d1ab9da3d1a56c6f73bc1384b93f705
'@tauri-apps/plugin-upload':
specifier: github:tauri-apps/tauri-plugin-upload#v2
version: github.com/tauri-apps/tauri-plugin-upload/3c17e7170f54aa3bad3ee4c534f423ace2b06552
version: github.com/tauri-apps/tauri-plugin-upload/58fa4ca197cfd55292f77ede59f241014806963a
'@tauri-apps/plugin-window':
specifier: 2.0.0-alpha.0
version: 2.0.0-alpha.0
@ -140,8 +128,8 @@ dependencies:
specifier: ^3.0.0
version: 3.0.0
lru-cache:
specifier: ^10.0.0
version: 10.0.0
specifier: ^10.0.1
version: 10.0.1
nostr-fetch:
specifier: ^0.12.2
version: 0.12.2
@ -170,8 +158,8 @@ dependencies:
specifier: ^2.12.0
version: 2.12.0(react@18.2.0)
react-router-dom:
specifier: ^6.14.2
version: 6.14.2(react-dom@18.2.0)(react@18.2.0)
specifier: ^6.15.0
version: 6.15.0(react-dom@18.2.0)(react@18.2.0)
react-string-replace:
specifier: ^1.1.1
version: 1.1.1
@ -202,8 +190,8 @@ devDependencies:
specifier: ^9.0.1
version: 9.0.1
'@types/node':
specifier: ^18.17.4
version: 18.17.4
specifier: ^18.17.5
version: 18.17.5
'@types/react':
specifier: ^18.2.20
version: 18.2.20
@ -215,10 +203,10 @@ devDependencies:
version: 5.5.7
'@typescript-eslint/eslint-plugin':
specifier: ^5.62.0
version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@4.9.5)
version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@4.9.5)
'@typescript-eslint/parser':
specifier: ^5.62.0
version: 5.62.0(eslint@8.46.0)(typescript@4.9.5)
version: 5.62.0(eslint@8.47.0)(typescript@4.9.5)
'@vitejs/plugin-react-swc':
specifier: ^3.3.2
version: 3.3.2(vite@4.4.9)
@ -238,20 +226,20 @@ devDependencies:
specifier: ^0.1.13
version: 0.1.13
eslint:
specifier: ^8.46.0
version: 8.46.0
specifier: ^8.47.0
version: 8.47.0
eslint-config-prettier:
specifier: ^8.10.0
version: 8.10.0(eslint@8.46.0)
version: 8.10.0(eslint@8.47.0)
eslint-plugin-jsx-a11y:
specifier: ^6.7.1
version: 6.7.1(eslint@8.46.0)
version: 6.7.1(eslint@8.47.0)
eslint-plugin-react:
specifier: ^7.33.1
version: 7.33.1(eslint@8.46.0)
version: 7.33.1(eslint@8.47.0)
eslint-plugin-simple-import-sort:
specifier: ^10.0.0
version: 10.0.0(eslint@8.46.0)
version: 10.0.0(eslint@8.47.0)
husky:
specifier: ^8.0.3
version: 8.0.3
@ -281,7 +269,7 @@ devDependencies:
version: 4.9.5
vite:
specifier: ^4.4.9
version: 4.4.9(@types/node@18.17.4)
version: 4.4.9(@types/node@18.17.5)
vite-plugin-top-level-await:
specifier: ^1.3.1
version: 1.3.1(vite@4.4.9)
@ -826,27 +814,27 @@ packages:
dev: true
optional: true
/@eslint-community/eslint-utils@4.4.0(eslint@8.46.0):
/@eslint-community/eslint-utils@4.4.0(eslint@8.47.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.46.0
eslint-visitor-keys: 3.4.2
eslint: 8.47.0
eslint-visitor-keys: 3.4.3
/@eslint-community/regexpp@4.6.2:
resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
/@eslint/eslintrc@2.1.1:
resolution: {integrity: sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==}
/@eslint/eslintrc@2.1.2:
resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
ajv: 6.12.6
debug: 4.3.4
espree: 9.6.1
globals: 13.20.0
globals: 13.21.0
ignore: 5.2.4
import-fresh: 3.3.0
js-yaml: 4.1.0
@ -855,8 +843,8 @@ packages:
transitivePeerDependencies:
- supports-color
/@eslint/js@8.46.0:
resolution: {integrity: sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==}
/@eslint/js@8.47.0:
resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
/@floating-ui/core@1.4.1:
@ -965,10 +953,6 @@ packages:
'@jridgewell/sourcemap-codec': 1.4.15
dev: true
/@noble/ciphers@0.2.0:
resolution: {integrity: sha512-6YBxJDAapHSdd3bLDv6x2wRPwq4QFMUaB3HvljNBUTThDd12eSm7/3F+2lnfzx2jvM+S6Nsy0jEt9QbPqSwqRw==}
dev: false
/@noble/curves@1.1.0:
resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==}
dependencies:
@ -1006,20 +990,20 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.15.0
/@nostr-dev-kit/ndk@0.8.7(typescript@4.9.5):
resolution: {integrity: sha512-42gj4WHYm8ZDETBoBVEOJq/An4Pvmj6LVYghgwYUualXqG07NPh8uImbEew9fdbD+NKQnPA+TfzLhq83dUWW8Q==}
/@nostr-dev-kit/ndk@0.8.11(typescript@4.9.5):
resolution: {integrity: sha512-tWUycJN25GUWzMjby7rnv5ekvFlEROaNaFlCYtnFLLS0RzIm/cyj6PlhKqXV4NvN3miG+PdYMsK+ZrG3FJCBgQ==}
dependencies:
'@noble/hashes': 1.3.1
'@noble/secp256k1': 2.0.0
'@scure/base': 1.1.1
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@4.9.5)
'@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@4.9.5)
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@4.9.5)
'@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@4.9.5)
debug: 4.3.4
esbuild: 0.17.19
esbuild-plugin-alias: 0.2.1
eslint: 8.46.0
eslint-config-prettier: 8.10.0(eslint@8.46.0)
eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)
eslint: 8.47.0
eslint-config-prettier: 8.10.0(eslint@8.47.0)
eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)
esm-loader-typescript: 1.0.5
eventemitter3: 5.0.1
light-bolt11-decoder: 3.0.0
@ -1035,13 +1019,13 @@ packages:
- typescript
dev: false
/@nostr-fetch/adapter-ndk@0.11.0(@nostr-dev-kit/ndk@0.8.7)(nostr-fetch@0.12.2):
/@nostr-fetch/adapter-ndk@0.11.0(@nostr-dev-kit/ndk@0.8.11)(nostr-fetch@0.12.2):
resolution: {integrity: sha512-Otl7SEzm9ecqyHB10bpYXBu1qpqJEnipp7dZ4qcA9LeJAtM38fnYKUD34HX0JXA9EDjtc6VS5UNZe544xC9GCg==}
peerDependencies:
'@nostr-dev-kit/ndk': ^0.5.0
nostr-fetch: ^0.11.0
dependencies:
'@nostr-dev-kit/ndk': 0.8.7(typescript@4.9.5)
'@nostr-dev-kit/ndk': 0.8.11(typescript@4.9.5)
'@nostr-fetch/kernel': 0.11.0
nostr-fetch: 0.12.2
dev: false
@ -1591,9 +1575,9 @@ packages:
type-fest: 2.19.0
dev: false
/@remix-run/router@1.7.2:
resolution: {integrity: sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==}
engines: {node: '>=14'}
/@remix-run/router@1.8.0:
resolution: {integrity: sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==}
engines: {node: '>=14.0.0'}
dev: false
/@rollup/plugin-virtual@3.0.1:
@ -1636,8 +1620,8 @@ packages:
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
dev: false
/@swc/core-darwin-arm64@1.3.75:
resolution: {integrity: sha512-anDnx9L465lGbjB2mvcV54NGHW6illr0IDvVV7JmkabYUVneaRdQvTr0tbHv3xjHnjrK1wuwVOHKV0LcQF2tnQ==}
/@swc/core-darwin-arm64@1.3.76:
resolution: {integrity: sha512-ovviEhZ/1E81Z9OGrO0ivLWk4VCa3I3ZzM+cd3gugglRRwVwtlIaoIYqY5S3KiCAupDd1+UCl5X7Vbio7a/V8g==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
@ -1645,8 +1629,8 @@ packages:
dev: true
optional: true
/@swc/core-darwin-x64@1.3.75:
resolution: {integrity: sha512-dIHDfrLmeZfr2xwi1whO7AmzdI3HdamgvxthaL+S8L1x8TeczAZEvsmZTjy3s8p3Va4rbGXcb3+uBhmfkqCbfw==}
/@swc/core-darwin-x64@1.3.76:
resolution: {integrity: sha512-tcySTDqs0SHCebtW35sCdcLWsmTEo7bEwx0gNL/spetqVT9fpFi6qU8qcnt7i2KaZHbeNl9g1aadu+Yrni+GzA==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
@ -1654,8 +1638,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm-gnueabihf@1.3.75:
resolution: {integrity: sha512-qeJmvMGrjC6xt+G0R4kVqqxvlhxJx7tTzhcEoWgLJnfvGZiF6SJdsef4OSM7HuReXrlBoEtJbfGPrLJtbV+C0w==}
/@swc/core-linux-arm-gnueabihf@1.3.76:
resolution: {integrity: sha512-apgzpGWy1AwoMF4urAAASsAjE7rEzZFIF+p6utuxhS7cNHzE0AyEVDYJbo+pzBdlZ8orBdzzsHtFwoEgKOjebA==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
@ -1663,8 +1647,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm64-gnu@1.3.75:
resolution: {integrity: sha512-sqA9JqHEJBF4AdNuwo5zRqq0HC3l31SPsG9zpRa4nRzG5daBBJ80H7fi6PZQud1rfNNq+Q08gjYrdrxwHstvjw==}
/@swc/core-linux-arm64-gnu@1.3.76:
resolution: {integrity: sha512-c3c0zz6S0eludqidDpuqbadE0WT3OZczyQxe9Vw8lFFXES85mvNGtwYzyGK2o7TICpsuHrndwDIoYpmpWk879g==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
@ -1672,8 +1656,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm64-musl@1.3.75:
resolution: {integrity: sha512-95rQT5xTAL3eKhMJbJbLsZHHP9EUlh1rcrFoLf0gUApoVF8g94QjZ9hYZiI72mMP5WPjgTEXQVnVB9O2GxeaLw==}
/@swc/core-linux-arm64-musl@1.3.76:
resolution: {integrity: sha512-Is3bpq7F2qtlnkzEeOD6HIZJPpOmu3q6c82lKww90Q0NnrlSluVMozTHJgwVoFZyizH7uLnk0LuNcEAWLnmJIw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
@ -1681,8 +1665,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-x64-gnu@1.3.75:
resolution: {integrity: sha512-If7UpAhnPduMmtC+TSgPpZ1UXZfp2hIpjUFxpeCmHHYLS6Fn/2GZC5hpEiu+wvFJF0hzPh93eNAHa9gUxGUG+w==}
/@swc/core-linux-x64-gnu@1.3.76:
resolution: {integrity: sha512-iwCeRzd9oSvUzqt7nU6p/ztceAWfnO9XVxBn502R5gs6QCBbE1HCKrWHDO77aKPK7ss+0NcIGHvXTd9L8/wRzw==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
@ -1690,8 +1674,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-x64-musl@1.3.75:
resolution: {integrity: sha512-HOhxX0YNHTElCZqIviquka3CGYTN8rSQ6BdFfSk/K0O+ZEHx3qGte0qr+gGLPF/237GxreUkp3OMaWKuURtuCg==}
/@swc/core-linux-x64-musl@1.3.76:
resolution: {integrity: sha512-a671g4tW8kyFeuICsgq4uB9ukQfiIyXJT4V6YSnmqhCTz5mazWuDxZ5wKnx/1g5nXTl+U5cWH2TZaCJatp4GKA==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
@ -1699,8 +1683,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-arm64-msvc@1.3.75:
resolution: {integrity: sha512-7QPI+mvBXAerVfWahrgBNe+g7fK8PuetxFnZSEmXUcDXvWcdJXAndD7GjAJzbDyjQpLKHbsDKMiHYvfNxZoN/A==}
/@swc/core-win32-arm64-msvc@1.3.76:
resolution: {integrity: sha512-+swEFtjdMezS0vKUhJC3psdSDtOJGY5pEOt4e8XOPvn7aQpKQ9LfF49XVtIwDSk5SGuWtVoLFzkSY3reWUJCyg==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
@ -1708,8 +1692,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-ia32-msvc@1.3.75:
resolution: {integrity: sha512-EfABCy4Wlq7O5ShWsm32FgDkSjyeyj/SQ4wnUIvWpkXhgfT1iNXky7KRU1HtX+SmnVk/k/NnabVZpIklYbjtZA==}
/@swc/core-win32-ia32-msvc@1.3.76:
resolution: {integrity: sha512-5CqwAykpGBJ3PqGLOlWGLGIPpBAG1IwWVDUfro3hhjQ7XJxV5Z1aQf5V5OJ90HJVtrEAVx2xx59UV/Dh081LOg==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
@ -1717,8 +1701,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-x64-msvc@1.3.75:
resolution: {integrity: sha512-cTvP0pOD9C3pSp1cwtt85ZsrUkQz8RZfSPhM+jCGxKxmoowDCnInoOQ4Ica/ehyuUnQ4/IstSdYtYpO5yzPDJg==}
/@swc/core-win32-x64-msvc@1.3.76:
resolution: {integrity: sha512-CiMpWLLlR3Cew9067E7XxaLBwYYJ90r9EhGSO6V1pvYSWj7ET/Ppmtj1ZhzPJMqRXAP6xflfl5R5o4ee1m4WLA==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
@ -1726,8 +1710,8 @@ packages:
dev: true
optional: true
/@swc/core@1.3.75:
resolution: {integrity: sha512-YLqd5oZVnaOq/OzkjRSsJUQqAfKYiD0fzUyVUPVlNNCoQEfVfSMcXH80hLmYe9aDH0T/a7qEMjWyIr/0kWqy1A==}
/@swc/core@1.3.76:
resolution: {integrity: sha512-aYYTA2aVYkwJAZepQXtPnkUthhOfn8qd6rsh+lrJxonFrjmpI7RHt2tMDVTXP6XDX7fvnvrVtT1bwZfmBFPh0Q==}
engines: {node: '>=10'}
requiresBuild: true
peerDependencies:
@ -1736,16 +1720,16 @@ packages:
'@swc/helpers':
optional: true
optionalDependencies:
'@swc/core-darwin-arm64': 1.3.75
'@swc/core-darwin-x64': 1.3.75
'@swc/core-linux-arm-gnueabihf': 1.3.75
'@swc/core-linux-arm64-gnu': 1.3.75
'@swc/core-linux-arm64-musl': 1.3.75
'@swc/core-linux-x64-gnu': 1.3.75
'@swc/core-linux-x64-musl': 1.3.75
'@swc/core-win32-arm64-msvc': 1.3.75
'@swc/core-win32-ia32-msvc': 1.3.75
'@swc/core-win32-x64-msvc': 1.3.75
'@swc/core-darwin-arm64': 1.3.76
'@swc/core-darwin-x64': 1.3.76
'@swc/core-linux-arm-gnueabihf': 1.3.76
'@swc/core-linux-arm64-gnu': 1.3.76
'@swc/core-linux-arm64-musl': 1.3.76
'@swc/core-linux-x64-gnu': 1.3.76
'@swc/core-linux-x64-musl': 1.3.76
'@swc/core-win32-arm64-msvc': 1.3.76
'@swc/core-win32-ia32-msvc': 1.3.76
'@swc/core-win32-x64-msvc': 1.3.76
dev: true
/@tailwindcss/typography@0.5.9(tailwindcss@3.3.3):
@ -2309,8 +2293,8 @@ packages:
resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
dev: false
/@types/node@18.17.4:
resolution: {integrity: sha512-ATL4WLgr7/W40+Sp1WnNTSKbgVn6Pvhc/2RHAdt8fl6NsQyp4oPCi2eKcGOvA494bwf1K/W6nGgZ9TwDqvpjdw==}
/@types/node@18.17.5:
resolution: {integrity: sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA==}
dev: true
/@types/normalize-package-data@2.4.1:
@ -2358,7 +2342,7 @@ packages:
resolution: {integrity: sha512-W8F4eoTIvzXeNrT3JroQPimZLXnlJA8smYygHZUKFPVoYwgs/OhJkA1VBhL3iSs57OQkuINqHlY4SmMT5wtnJg==}
dev: true
/@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@4.9.5):
/@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@4.9.5):
resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -2370,12 +2354,12 @@ packages:
optional: true
dependencies:
'@eslint-community/regexpp': 4.6.2
'@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@4.9.5)
'@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@4.9.5)
'@typescript-eslint/scope-manager': 5.62.0
'@typescript-eslint/type-utils': 5.62.0(eslint@8.46.0)(typescript@4.9.5)
'@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@4.9.5)
'@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5)
'@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5)
debug: 4.3.4
eslint: 8.46.0
eslint: 8.47.0
graphemer: 1.4.0
ignore: 5.2.4
natural-compare-lite: 1.4.0
@ -2385,7 +2369,7 @@ packages:
transitivePeerDependencies:
- supports-color
/@typescript-eslint/parser@5.62.0(eslint@8.46.0)(typescript@4.9.5):
/@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@4.9.5):
resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -2399,7 +2383,7 @@ packages:
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5)
debug: 4.3.4
eslint: 8.46.0
eslint: 8.47.0
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
@ -2411,7 +2395,7 @@ packages:
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/visitor-keys': 5.62.0
/@typescript-eslint/type-utils@5.62.0(eslint@8.46.0)(typescript@4.9.5):
/@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@4.9.5):
resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -2422,9 +2406,9 @@ packages:
optional: true
dependencies:
'@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5)
'@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@4.9.5)
'@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5)
debug: 4.3.4
eslint: 8.46.0
eslint: 8.47.0
tsutils: 3.21.0(typescript@4.9.5)
typescript: 4.9.5
transitivePeerDependencies:
@ -2454,19 +2438,19 @@ packages:
transitivePeerDependencies:
- supports-color
/@typescript-eslint/utils@5.62.0(eslint@8.46.0)(typescript@4.9.5):
/@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@4.9.5):
resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
'@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0)
'@types/json-schema': 7.0.12
'@types/semver': 7.5.0
'@typescript-eslint/scope-manager': 5.62.0
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5)
eslint: 8.46.0
eslint: 8.47.0
eslint-scope: 5.1.1
semver: 7.5.4
transitivePeerDependencies:
@ -2478,15 +2462,15 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
'@typescript-eslint/types': 5.62.0
eslint-visitor-keys: 3.4.2
eslint-visitor-keys: 3.4.3
/@vitejs/plugin-react-swc@3.3.2(vite@4.4.9):
resolution: {integrity: sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==}
peerDependencies:
vite: ^4
dependencies:
'@swc/core': 1.3.75
vite: 4.4.9(@types/node@18.17.4)
'@swc/core': 1.3.76
vite: 4.4.9(@types/node@18.17.5)
transitivePeerDependencies:
- '@swc/helpers'
dev: true
@ -3456,13 +3440,13 @@ packages:
engines: {node: '>=12'}
dev: false
/eslint-config-prettier@8.10.0(eslint@8.46.0):
/eslint-config-prettier@8.10.0(eslint@8.47.0):
resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
dependencies:
eslint: 8.46.0
eslint: 8.47.0
/eslint-formatter-pretty@4.1.0:
resolution: {integrity: sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==}
@ -3488,7 +3472,7 @@ packages:
- supports-color
dev: false
/eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.46.0):
/eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0):
resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
engines: {node: '>=4'}
peerDependencies:
@ -3509,15 +3493,15 @@ packages:
eslint-import-resolver-webpack:
optional: true
dependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@4.9.5)
'@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@4.9.5)
debug: 3.2.7
eslint: 8.46.0
eslint: 8.47.0
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
dev: false
/eslint-plugin-import@2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0):
/eslint-plugin-import@2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0):
resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==}
engines: {node: '>=4'}
peerDependencies:
@ -3527,16 +3511,16 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@4.9.5)
'@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@4.9.5)
array-includes: 3.1.6
array.prototype.findlastindex: 1.2.2
array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1
debug: 3.2.7
doctrine: 2.1.0
eslint: 8.46.0
eslint: 8.47.0
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.46.0)
eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0)
has: 1.0.3
is-core-module: 2.13.0
is-glob: 4.0.3
@ -3553,7 +3537,7 @@ packages:
- supports-color
dev: false
/eslint-plugin-jsx-a11y@6.7.1(eslint@8.46.0):
/eslint-plugin-jsx-a11y@6.7.1(eslint@8.47.0):
resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==}
engines: {node: '>=4.0'}
peerDependencies:
@ -3568,7 +3552,7 @@ packages:
axobject-query: 3.2.1
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
eslint: 8.46.0
eslint: 8.47.0
has: 1.0.3
jsx-ast-utils: 3.3.5
language-tags: 1.0.5
@ -3578,7 +3562,7 @@ packages:
semver: 6.3.1
dev: true
/eslint-plugin-react@7.33.1(eslint@8.46.0):
/eslint-plugin-react@7.33.1(eslint@8.47.0):
resolution: {integrity: sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==}
engines: {node: '>=4'}
peerDependencies:
@ -3588,7 +3572,7 @@ packages:
array.prototype.flatmap: 1.3.1
array.prototype.tosorted: 1.1.1
doctrine: 2.1.0
eslint: 8.46.0
eslint: 8.47.0
estraverse: 5.3.0
jsx-ast-utils: 3.3.5
minimatch: 3.1.2
@ -3602,12 +3586,12 @@ packages:
string.prototype.matchall: 4.0.8
dev: true
/eslint-plugin-simple-import-sort@10.0.0(eslint@8.46.0):
/eslint-plugin-simple-import-sort@10.0.0(eslint@8.47.0):
resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==}
peerDependencies:
eslint: '>=5.0.0'
dependencies:
eslint: 8.46.0
eslint: 8.47.0
dev: true
/eslint-rule-docs@1.1.235:
@ -3628,19 +3612,19 @@ packages:
esrecurse: 4.3.0
estraverse: 5.3.0
/eslint-visitor-keys@3.4.2:
resolution: {integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==}
/eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
/eslint@8.46.0:
resolution: {integrity: sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==}
/eslint@8.47.0:
resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
hasBin: true
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
'@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0)
'@eslint-community/regexpp': 4.6.2
'@eslint/eslintrc': 2.1.1
'@eslint/js': 8.46.0
'@eslint/eslintrc': 2.1.2
'@eslint/js': 8.47.0
'@humanwhocodes/config-array': 0.11.10
'@humanwhocodes/module-importer': 1.0.1
'@nodelib/fs.walk': 1.2.8
@ -3651,7 +3635,7 @@ packages:
doctrine: 3.0.0
escape-string-regexp: 4.0.0
eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.2
eslint-visitor-keys: 3.4.3
espree: 9.6.1
esquery: 1.5.0
esutils: 2.0.3
@ -3659,7 +3643,7 @@ packages:
file-entry-cache: 6.0.1
find-up: 5.0.0
glob-parent: 6.0.2
globals: 13.20.0
globals: 13.21.0
graphemer: 1.4.0
ignore: 5.2.4
imurmurhash: 0.1.4
@ -3692,7 +3676,7 @@ packages:
dependencies:
acorn: 8.10.0
acorn-jsx: 5.3.2(acorn@8.10.0)
eslint-visitor-keys: 3.4.2
eslint-visitor-keys: 3.4.3
/esquery@1.5.0:
resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
@ -3984,8 +3968,8 @@ packages:
engines: {node: '>=4'}
dev: true
/globals@13.20.0:
resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
/globals@13.21.0:
resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==}
engines: {node: '>=8'}
dependencies:
type-fest: 0.20.2
@ -4642,8 +4626,8 @@ packages:
dependencies:
js-tokens: 4.0.0
/lru-cache@10.0.0:
resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==}
/lru-cache@10.0.1:
resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==}
engines: {node: 14 || >=16.14}
dev: false
@ -5656,7 +5640,7 @@ packages:
resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==}
engines: {node: '>=16 || 14 >=14.17'}
dependencies:
lru-cache: 10.0.0
lru-cache: 10.0.1
minipass: 5.0.0
dev: false
@ -6178,26 +6162,26 @@ packages:
use-sidecar: 1.1.2(@types/react@18.2.20)(react@18.2.0)
dev: false
/react-router-dom@6.14.2(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==}
engines: {node: '>=14'}
/react-router-dom@6.15.0(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: '>=16.8'
react-dom: '>=16.8'
dependencies:
'@remix-run/router': 1.7.2
'@remix-run/router': 1.8.0
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
react-router: 6.14.2(react@18.2.0)
react-router: 6.15.0(react@18.2.0)
dev: false
/react-router@6.14.2(react@18.2.0):
resolution: {integrity: sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==}
engines: {node: '>=14'}
/react-router@6.15.0(react@18.2.0):
resolution: {integrity: sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: '>=16.8'
dependencies:
'@remix-run/router': 1.7.2
'@remix-run/router': 1.8.0
react: 18.2.0
dev: false
@ -7238,9 +7222,9 @@ packages:
vite: '>=2.8'
dependencies:
'@rollup/plugin-virtual': 3.0.1
'@swc/core': 1.3.75
'@swc/core': 1.3.76
uuid: 9.0.0
vite: 4.4.9(@types/node@18.17.4)
vite: 4.4.9(@types/node@18.17.5)
transitivePeerDependencies:
- '@swc/helpers'
- rollup
@ -7257,13 +7241,13 @@ packages:
debug: 4.3.4
globrex: 0.1.2
tsconfck: 2.1.2(typescript@4.9.5)
vite: 4.4.9(@types/node@18.17.4)
vite: 4.4.9(@types/node@18.17.5)
transitivePeerDependencies:
- supports-color
- typescript
dev: true
/vite@4.4.9(@types/node@18.17.4):
/vite@4.4.9(@types/node@18.17.5):
resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@ -7291,7 +7275,7 @@ packages:
terser:
optional: true
dependencies:
'@types/node': 18.17.4
'@types/node': 18.17.5
esbuild: 0.18.20
postcss: 8.4.27
rollup: 3.28.0
@ -7446,112 +7430,112 @@ packages:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
dev: false
github.com/tauri-apps/tauri-plugin-app/dbfef70e44dc82156e79301742b656fd797a1473:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-app/tar.gz/dbfef70e44dc82156e79301742b656fd797a1473}
github.com/tauri-apps/tauri-plugin-app/f8b21651dfa42f42e080488568010ff3bbeb7350:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-app/tar.gz/f8b21651dfa42f42e080488568010ff3bbeb7350}
name: '@tauri-apps/plugin-app'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-autostart/33968b8b0aae857f045aeb17741bcff27440f6d3:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-autostart/tar.gz/33968b8b0aae857f045aeb17741bcff27440f6d3}
github.com/tauri-apps/tauri-plugin-autostart/0b6ccaa31eccdeec47ca0425f7696846aa3a5f46:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-autostart/tar.gz/0b6ccaa31eccdeec47ca0425f7696846aa3a5f46}
name: '@tauri-apps/plugin-autostart'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-clipboard-manager/549ca993a47ae7aafff635d99fc3e6dc124b9181:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-clipboard-manager/tar.gz/549ca993a47ae7aafff635d99fc3e6dc124b9181}
github.com/tauri-apps/tauri-plugin-clipboard-manager/32e302b07e3ea11b59c55d4fc100516ac49a4968:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-clipboard-manager/tar.gz/32e302b07e3ea11b59c55d4fc100516ac49a4968}
name: '@tauri-apps/plugin-clipboard-manager'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-dialog/2a358d18e865b31c6878f91bd068cfe36d00d639:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-dialog/tar.gz/2a358d18e865b31c6878f91bd068cfe36d00d639}
github.com/tauri-apps/tauri-plugin-dialog/2d74ae009691b50e6498fb814a77c59b6798f2ac:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-dialog/tar.gz/2d74ae009691b50e6498fb814a77c59b6798f2ac}
name: '@tauri-apps/plugin-dialog'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-fs/60e8dec66d2582cc39ebdd7b7101e9c96c23e52a:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-fs/tar.gz/60e8dec66d2582cc39ebdd7b7101e9c96c23e52a}
github.com/tauri-apps/tauri-plugin-fs/0dd45ead4ca3cc8b426614fa47ad9227e9ed2053:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-fs/tar.gz/0dd45ead4ca3cc8b426614fa47ad9227e9ed2053}
name: '@tauri-apps/plugin-fs'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-http/6d45e3ecae761f1990ed6366e6138c69775c58d8:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-http/tar.gz/6d45e3ecae761f1990ed6366e6138c69775c58d8}
github.com/tauri-apps/tauri-plugin-http/27b519b63419db048d2d30945ff34b2234975ccd:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-http/tar.gz/27b519b63419db048d2d30945ff34b2234975ccd}
name: '@tauri-apps/plugin-http'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-notification/9989c95217af5abcf847e790cb74dda485c0459a:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-notification/tar.gz/9989c95217af5abcf847e790cb74dda485c0459a}
github.com/tauri-apps/tauri-plugin-notification/7878980ee8cb97437f343cc31b97a1b666e324d4:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-notification/tar.gz/7878980ee8cb97437f343cc31b97a1b666e324d4}
name: '@tauri-apps/plugin-notification'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-os/a63d34fddb1bd97d6a634a1881e5cc26910e115f:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-os/tar.gz/a63d34fddb1bd97d6a634a1881e5cc26910e115f}
github.com/tauri-apps/tauri-plugin-os/e4dda0ceff72cbc762937e79c104522a8866b840:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-os/tar.gz/e4dda0ceff72cbc762937e79c104522a8866b840}
name: '@tauri-apps/plugin-os'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-process/ed3f8f78ddecc72c926239f5a10ec6ce1b8c353e:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-process/tar.gz/ed3f8f78ddecc72c926239f5a10ec6ce1b8c353e}
github.com/tauri-apps/tauri-plugin-process/eec5dc8d37c80b2c1ebb7eb8e4cb976eed221a9d:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-process/tar.gz/eec5dc8d37c80b2c1ebb7eb8e4cb976eed221a9d}
name: '@tauri-apps/plugin-process'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-shell/e538c5178508060d6fc1d1f8b03fa8f40fb53626:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-shell/tar.gz/e538c5178508060d6fc1d1f8b03fa8f40fb53626}
github.com/tauri-apps/tauri-plugin-shell/f76cb0019364f40b9411eac5f5fdf6fd04b3e538:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-shell/tar.gz/f76cb0019364f40b9411eac5f5fdf6fd04b3e538}
name: '@tauri-apps/plugin-shell'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-sql/0591e9f63e0f86be79c209f4bcb564ccce4bd05c:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-sql/tar.gz/0591e9f63e0f86be79c209f4bcb564ccce4bd05c}
github.com/tauri-apps/tauri-plugin-sql/62eb3e4c9f084c1238cf7ab00d47148c034be207:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-sql/tar.gz/62eb3e4c9f084c1238cf7ab00d47148c034be207}
name: '@tauri-apps/plugin-sql'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-store/2f5e470ba6d746b54da46fcb3eb10325fa224351:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-store/tar.gz/2f5e470ba6d746b54da46fcb3eb10325fa224351}
github.com/tauri-apps/tauri-plugin-store/ddb10b0776a670028c1a56bbe922aba02fd32484:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-store/tar.gz/ddb10b0776a670028c1a56bbe922aba02fd32484}
name: '@tauri-apps/plugin-store'
version: 2.0.0-alpha.0
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-stronghold/a87861766f3520b5fc1ea1f34665d814bbee9b06:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-stronghold/tar.gz/a87861766f3520b5fc1ea1f34665d814bbee9b06}
github.com/tauri-apps/tauri-plugin-stronghold/9b2878280d1ab9da3d1a56c6f73bc1384b93f705:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-stronghold/tar.gz/9b2878280d1ab9da3d1a56c6f73bc1384b93f705}
name: '@tauri-apps/plugin-stronghold'
version: 2.0.0-alpha.1
dependencies:
'@tauri-apps/api': 2.0.0-alpha.5
dev: false
github.com/tauri-apps/tauri-plugin-upload/3c17e7170f54aa3bad3ee4c534f423ace2b06552:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-upload/tar.gz/3c17e7170f54aa3bad3ee4c534f423ace2b06552}
github.com/tauri-apps/tauri-plugin-upload/58fa4ca197cfd55292f77ede59f241014806963a:
resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-upload/tar.gz/58fa4ca197cfd55292f77ede59f241014806963a}
name: '@tauri-apps/plugin-upload'
version: 2.0.0-alpha.0
dependencies:

74
src-tauri/Cargo.lock generated
View File

@ -88,9 +88,9 @@ dependencies = [
[[package]]
name = "aho-corasick"
version = "1.0.2"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
checksum = "86b8f9420f797f2d9e935edf629310eb938a0d839f984e25327f3c7eed22300c"
dependencies = [
"memchr",
]
@ -287,9 +287,9 @@ dependencies = [
[[package]]
name = "async-lock"
version = "2.7.0"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7"
checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b"
dependencies = [
"event-listener",
]
@ -331,9 +331,9 @@ checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae"
[[package]]
name = "async-trait"
version = "0.1.72"
version = "0.1.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09"
checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
dependencies = [
"proc-macro2",
"quote",
@ -460,9 +460,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.3.3"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42"
checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
dependencies = [
"serde",
]
@ -1476,7 +1476,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5"
dependencies = [
"cfg-if",
"rustix 0.38.7",
"rustix 0.38.8",
"windows-sys 0.48.0",
]
@ -2417,7 +2417,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
dependencies = [
"hermit-abi",
"rustix 0.38.7",
"rustix 0.38.8",
"windows-sys 0.48.0",
]
@ -2712,9 +2712,9 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
[[package]]
name = "mac-notification-sys"
version = "0.5.8"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abc434554ad0e640d772f7f262aa28e61d485212533d3673abe5f3d1729bd42a"
checksum = "9402858e87f85f88bf518bd2e68450640df1c99b1ddb3ea28c4d5d823bb54cdd"
dependencies = [
"cc",
"dirs-next",
@ -3942,11 +3942,11 @@ dependencies = [
[[package]]
name = "rustix"
version = "0.38.7"
version = "0.38.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "172891ebdceb05aa0005f533a6cbfca599ddd7d966f6f5d4d9b2e70478e70399"
checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f"
dependencies = [
"bitflags 2.3.3",
"bitflags 2.4.0",
"errno",
"libc",
"linux-raw-sys 0.4.5",
@ -4533,7 +4533,7 @@ checksum = "8ca69bf415b93b60b80dc8fda3cb4ef52b2336614d8da2de5456cc942a110482"
dependencies = [
"atoi",
"base64 0.21.2",
"bitflags 2.3.3",
"bitflags 2.4.0",
"byteorder",
"bytes",
"crc",
@ -4576,7 +4576,7 @@ checksum = "a0db2df1b8731c3651e204629dd55e52adbae0462fa1bdcbed56a2302c18181e"
dependencies = [
"atoi",
"base64 0.21.2",
"bitflags 2.3.3",
"bitflags 2.4.0",
"byteorder",
"crc",
"dotenvy",
@ -5007,7 +5007,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-app"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"tauri",
]
@ -5015,7 +5015,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-autostart"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"auto-launch",
"log",
@ -5028,7 +5028,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-clipboard-manager"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"arboard",
"log",
@ -5042,7 +5042,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-dialog"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"glib",
"log",
@ -5059,7 +5059,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-fs"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"anyhow",
"glob",
@ -5072,7 +5072,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-http"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"data-url",
"glob",
@ -5089,7 +5089,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-notification"
version = "2.0.0-alpha.1"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"log",
"notify-rust",
@ -5107,7 +5107,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-os"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"gethostname 0.4.3",
"log",
@ -5123,7 +5123,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-process"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"tauri",
]
@ -5131,7 +5131,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-shell"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"encoding_rs",
"log",
@ -5148,7 +5148,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-single-instance"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"log",
"serde",
@ -5162,7 +5162,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-sql"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"futures-core",
"log",
@ -5178,7 +5178,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-store"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"log",
"serde",
@ -5190,7 +5190,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-stronghold"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"hex",
"iota-crypto 0.23.0",
@ -5206,7 +5206,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-updater"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"base64 0.21.2",
"dirs-next",
@ -5231,7 +5231,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-upload"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"futures-util",
"log",
@ -5248,7 +5248,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-window"
version = "2.0.0-alpha.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#4ab90f048eab2918344f97dc8e04413a404e392d"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#d5a7c77a8d0e7912a6b07b22ed329004edd6e80b"
dependencies = [
"serde",
"tauri",
@ -5355,7 +5355,7 @@ dependencies = [
"cfg-if",
"fastrand 2.0.0",
"redox_syscall 0.3.5",
"rustix 0.38.7",
"rustix 0.38.8",
"windows-sys 0.48.0",
]
@ -6343,9 +6343,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
[[package]]
name = "winnow"
version = "0.5.4"
version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acaaa1190073b2b101e15083c38ee8ec891b5e05cbee516521e94ec008f61e64"
checksum = "5504cc7644f4b593cbc05c4a55bf9bd4e94b867c3c0bd440934174d50482427d"
dependencies = [
"memchr",
]

View File

@ -24,16 +24,12 @@ export function OnboardStep3Screen() {
const { publish } = useNostr();
const { account } = useAccount();
const { fetcher, relayUrls } = useNDK();
const { ndk } = useNDK();
const { status, data } = useQuery(
['relays'],
async () => {
const tmp = new Map<string, string>();
const events = await fetcher.fetchAllEvents(
relayUrls,
{ kinds: [10002], authors: account.follows },
{ since: 0 }
);
const events = await ndk.fetchEvents({ kinds: [10002], authors: account.follows });
if (events) {
events.forEach((event) => {

View File

@ -1,9 +1,6 @@
import { useDecryptMessage } from '@app/chats/hooks/useDecryptMessage';
import { MentionNote } from '@shared/notes/mentions/note';
import { ImagePreview } from '@shared/notes/preview/image';
import { LinkPreview } from '@shared/notes/preview/link';
import { VideoPreview } from '@shared/notes/preview/video';
import { NoteContent } from '@shared/notes';
import { User } from '@shared/user';
import { parser } from '@utils/parser';
@ -22,8 +19,6 @@ export function ChatMessageItem({
if (decryptedContent) {
data['content'] = decryptedContent;
}
// parse the note content
const content = parser(data);
return (
<div className="flex h-min min-h-min w-full select-text flex-col px-5 py-3 hover:bg-white/10">
@ -31,13 +26,8 @@ export function ChatMessageItem({
<User pubkey={data.sender_pubkey} time={data.created_at} isChat={true} />
<div className="-mt-[20px] pl-[49px]">
<p className="select-text whitespace-pre-line break-words text-base text-white">
{content.parsed}
{data.content}
</p>
{content.images.length > 0 && <ImagePreview urls={content.images} />}
{content.videos.length > 0 && <VideoPreview urls={content.videos} />}
{content.links.length > 0 && <LinkPreview urls={content.links} />}
{content.notes.length > 0 &&
content.notes.map((note: string) => <MentionNote key={note} id={note} />)}
</div>
</div>
</div>

View File

@ -15,9 +15,7 @@ export function ChatsListSelfItem({ data }: { data: { pubkey: string } }) {
return (
<div className="inline-flex h-9 items-center gap-2.5 rounded-md px-2">
<div className="relative h-6 w-6 shrink-0 animate-pulse rounded bg-white/10" />
<div>
<div className="h-2.5 w-full animate-pulse truncate rounded bg-white/10 text-base font-medium" />
</div>
<div className="h-2.5 w-2/3 animate-pulse rounded bg-white/10" />
</div>
);
}

View File

@ -11,14 +11,14 @@ import { nHoursAgo } from '@utils/date';
import { LumeEvent, Widget } from '@utils/types';
export function HashtagBlock({ params }: { params: Widget }) {
const { relayUrls, fetcher } = useNDK();
const { ndk } = useNDK();
const { status, data } = useQuery(['hashtag', params.content], async () => {
const events = (await fetcher.fetchAllEvents(
relayUrls,
{ kinds: [1], '#t': [params.content] },
{ since: nHoursAgo(24) }
)) as unknown as LumeEvent[];
return events;
const events = await ndk.fetchEvents({
kinds: [1],
'#t': [params.content],
since: nHoursAgo(24),
});
return [...events] as unknown as LumeEvent[];
});
const parentRef = useRef();

View File

@ -14,15 +14,14 @@ import { LumeEvent, Widget } from '@utils/types';
export function UserBlock({ params }: { params: Widget }) {
const parentRef = useRef<HTMLDivElement>(null);
const { fetcher, relayUrls } = useNDK();
const { ndk } = useNDK();
const { status, data } = useQuery(['user-feed', params.content], async () => {
const events = await fetcher.fetchAllEvents(
relayUrls,
{ kinds: [1], authors: [params.content] },
{ since: nHoursAgo(48) },
{ sort: true }
);
return events as unknown as LumeEvent[];
const events = await ndk.fetchEvents({
kinds: [1],
authors: [params.content],
since: nHoursAgo(48),
});
return [...events] as unknown as LumeEvent[];
});
const rowVirtualizer = useVirtualizer({
@ -42,9 +41,7 @@ export function UserBlock({ params }: { params: Widget }) {
<UserProfile pubkey={params.content} />
</div>
<div>
<h3 className="mt-4 px-3 text-lg font-semibold text-white">
Latest activities
</h3>
<h3 className="mt-4 px-3 text-lg font-semibold text-white">Latest postrs</h3>
<div className="flex h-full w-full flex-col justify-between gap-1.5 pb-10">
{status === 'loading' ? (
<div className="px-3 py-1.5">
@ -57,7 +54,7 @@ export function UserBlock({ params }: { params: Widget }) {
<div className="rounded-xl bg-white/10 px-3 py-6">
<div className="flex flex-col items-center gap-4">
<p className="text-center text-sm text-white">
No new posts about this hashtag in 48 hours ago
No new posts from this user in 48 hours ago
</p>
</div>
</div>

View File

@ -1,4 +1,5 @@
import { useQuery } from '@tanstack/react-query';
import { fetch } from '@tauri-apps/plugin-http';
import { useEffect, useState } from 'react';
import { FollowIcon, LoaderIcon, UnfollowIcon } from '@shared/icons';

View File

@ -8,21 +8,19 @@ import { TitleBar } from '@shared/titleBar';
import { LumeEvent } from '@utils/types';
interface Response {
ok: boolean;
data: {
notes: Array<{ event: LumeEvent }>;
};
notes: Array<{ event: LumeEvent }>;
}
export function TrendingNotes() {
const { status, data, error } = useQuery(
['trending-notes'],
async () => {
const res: Response = await fetch('https://api.nostr.band/v0/trending/notes');
const res = await fetch('https://api.nostr.band/v0/trending/notes');
if (!res.ok) {
throw new Error('Error');
}
return res.data?.notes;
const json: Response = await res.json();
return json.notes;
},
{
refetchOnMount: false,
@ -32,6 +30,8 @@ export function TrendingNotes() {
}
);
console.log('notes: ', data);
return (
<div className="scrollbar-hide relative h-full w-[400px] shrink-0 overflow-y-auto bg-white/10 pb-20">
<TitleBar title="Trending Posts" />

View File

@ -7,21 +7,19 @@ import { NoteSkeleton } from '@shared/notes/skeleton';
import { TitleBar } from '@shared/titleBar';
interface Response {
ok: boolean;
data: {
profiles: Array<{ pubkey: string }>;
};
profiles: Array<{ pubkey: string }>;
}
export function TrendingProfiles() {
const { status, data, error } = useQuery(
['trending-profiles'],
async () => {
const res: Response = await fetch('https://api.nostr.band/v0/trending/profiles');
const res = await fetch('https://api.nostr.band/v0/trending/profiles');
if (!res.ok) {
throw new Error('Error');
}
return res.data?.profiles;
const json: Response = await res.json();
return json.profiles;
},
{
refetchOnMount: false,
@ -31,6 +29,8 @@ export function TrendingProfiles() {
}
);
console.log('profiles: ', data);
return (
<div className="scrollbar-hide relative h-full w-[400px] shrink-0 overflow-y-auto bg-white/10 pb-20">
<TitleBar title="Trending Profiles" />
@ -44,7 +44,7 @@ export function TrendingProfiles() {
</div>
) : (
<div className="relative flex w-full flex-col gap-3 px-3 pt-1.5">
{data.map((item) => (
{data?.map((item) => (
<Profile key={item.pubkey} data={item} />
))}
</div>

View File

@ -12,15 +12,14 @@ import { LumeEvent } from '@utils/types';
export function UserFeed({ pubkey }: { pubkey: string }) {
const parentRef = useRef();
const { fetcher, relayUrls } = useNDK();
const { ndk } = useNDK();
const { status, data } = useQuery(['user-feed', pubkey], async () => {
const events = await fetcher.fetchAllEvents(
relayUrls,
{ kinds: [1], authors: [pubkey] },
{ since: nHoursAgo(48) },
{ sort: true }
);
return events as unknown as LumeEvent[];
const events = await ndk.fetchEvents({
kinds: [1],
authors: [pubkey],
since: nHoursAgo(48),
});
return [...events] as unknown as LumeEvent[];
});
const rowVirtualizer = useVirtualizer({

View File

@ -16,15 +16,14 @@ export function UserScreen() {
const parentRef = useRef();
const { pubkey } = useParams();
const { fetcher, relayUrls } = useNDK();
const { ndk } = useNDK();
const { status, data } = useQuery(['user-feed', pubkey], async () => {
const events = await fetcher.fetchAllEvents(
relayUrls,
{ kinds: [1], authors: [pubkey] },
{ since: nHoursAgo(48) },
{ sort: true }
);
return events as unknown as LumeEvent[];
const events = await ndk.fetchEvents({
kinds: [1],
authors: [pubkey],
since: nHoursAgo(48),
});
return [...events] as unknown as LumeEvent[];
});
const rowVirtualizer = useVirtualizer({

View File

@ -1,8 +1,6 @@
// inspire by: https://github.com/nostr-dev-kit/ndk-react/
import NDK from '@nostr-dev-kit/ndk';
import { ndkAdapter } from '@nostr-fetch/adapter-ndk';
import { fetch } from '@tauri-apps/plugin-http';
import { NostrFetcher } from 'nostr-fetch';
import { useEffect, useMemo, useState } from 'react';
import TauriAdapter from '@libs/ndk/cache';
@ -15,10 +13,6 @@ export const NDKInstance = () => {
const [relayUrls, setRelayUrls] = useState<string[]>([]);
const cacheAdapter = useMemo(() => new TauriAdapter(), []);
const fetcher = useMemo<NostrFetcher>(
() => (ndk ? NostrFetcher.withCustomPool(ndkAdapter(ndk)) : undefined),
[ndk]
);
// TODO: fully support NIP-11
async function verifyRelays(relays: string[]) {
@ -37,7 +31,6 @@ export const NDKInstance = () => {
try {
const res = await fetch(url, {
method: 'GET',
headers: { Accept: 'application/nostr+json' },
});
@ -67,7 +60,7 @@ export const NDKInstance = () => {
const instance = new NDK({ explicitRelayUrls, cacheAdapter });
try {
await instance.connect();
await instance.connect(10000);
} catch (error) {
throw new Error('NDK instance init failed: ', error);
}
@ -87,6 +80,5 @@ export const NDKInstance = () => {
return {
ndk,
relayUrls,
fetcher,
};
};

View File

@ -1,6 +1,5 @@
// source: https://github.com/nostr-dev-kit/ndk-react/
import NDK from '@nostr-dev-kit/ndk';
import { NostrFetcher } from 'nostr-fetch';
import { PropsWithChildren, createContext, useContext } from 'react';
import { NDKInstance } from '@libs/ndk/instance';
@ -8,24 +7,21 @@ import { NDKInstance } from '@libs/ndk/instance';
interface NDKContext {
ndk: NDK;
relayUrls: string[];
fetcher: NostrFetcher;
}
const NDKContext = createContext<NDKContext>({
ndk: new NDK({}),
relayUrls: [],
fetcher: undefined,
});
const NDKProvider = ({ children }: PropsWithChildren<object>) => {
const { ndk, relayUrls, fetcher } = NDKInstance();
const { ndk, relayUrls } = NDKInstance();
return (
<NDKContext.Provider
value={{
ndk,
relayUrls,
fetcher,
}}
>
{children}

View File

@ -1,44 +0,0 @@
// source: https://github.com/nbd-wtf/nostr-tools/blob/b1fc8ab401b8074f53e6a05a1a6a13422fb01b2d/nip44.ts
import { xchacha20 } from '@noble/ciphers/chacha';
import { secp256k1 } from '@noble/curves/secp256k1';
import { sha256 } from '@noble/hashes/sha256';
import { randomBytes } from '@noble/hashes/utils';
import { base64 } from '@scure/base';
export function getConversationKey(privkeyA: string, pubkeyB: string) {
const key = secp256k1.getSharedSecret(privkeyA, '02' + pubkeyB);
return sha256(key.slice(1, 33));
}
export function nip44Encrypt(
privkey: string,
pubkey: string,
text: string,
ver = 1
): string {
if (ver !== 1) throw new Error('NIP44: unknown encryption version');
const key = getConversationKey(privkey, pubkey);
const nonce = randomBytes(24);
const plaintext = new TextEncoder().encode(text);
const ciphertext = xchacha20(key, nonce, plaintext, plaintext);
const ctb64 = base64.encode(ciphertext);
const nonceb64 = base64.encode(nonce);
return JSON.stringify({ ciphertext: ctb64, nonce: nonceb64, v: 1 });
}
export function nip44Decrypt(privkey: string, pubkey: string, data: string): string {
const dt = JSON.parse(data);
if (dt.v !== 1) throw new Error('NIP44: unknown encryption version');
let { ciphertext, nonce } = dt;
ciphertext = base64.decode(ciphertext);
nonce = base64.decode(nonce);
const key = getConversationKey(privkey, pubkey);
const plaintext = xchacha20(key, nonce, ciphertext, ciphertext);
const text = new TextDecoder('utf-8').decode(plaintext);
return text;
}

View File

@ -19,7 +19,13 @@ interface IPreFetchedResource {
imagesPropertyType?: string;
proxyUrl?: string;
url: string;
data: any;
data: string;
}
function throwOnLoopback(address: string) {
if (OPENGRAPH.REGEX_LOOPBACK.test(address)) {
throw new Error('SSRF request detected, trying to query host');
}
}
function metaTag(doc: cheerio.CheerioAPI, type: string, attr: string) {
@ -28,42 +34,42 @@ function metaTag(doc: cheerio.CheerioAPI, type: string, attr: string) {
}
function metaTagContent(doc: cheerio.CheerioAPI, type: string, attr: string) {
return doc(`meta[${attr}='${type}']`).attr('content');
return doc(`meta[${attr}='${type}']`).attr(`content`);
}
function getTitle(doc: cheerio.CheerioAPI) {
let title =
metaTagContent(doc, 'og:title', 'property') ||
metaTagContent(doc, 'og:title', 'name');
metaTagContent(doc, `og:title`, `property`) ||
metaTagContent(doc, `og:title`, `name`);
if (!title) {
title = doc('title').text();
title = doc(`title`).text();
}
return title;
}
function getSiteName(doc: cheerio.CheerioAPI) {
const siteName =
metaTagContent(doc, 'og:site_name', 'property') ||
metaTagContent(doc, 'og:site_name', 'name');
metaTagContent(doc, `og:site_name`, `property`) ||
metaTagContent(doc, `og:site_name`, `name`);
return siteName;
}
function getDescription(doc: cheerio.CheerioAPI) {
const description =
metaTagContent(doc, 'description', 'name') ||
metaTagContent(doc, 'Description', 'name') ||
metaTagContent(doc, 'og:description', 'property');
metaTagContent(doc, `description`, `name`) ||
metaTagContent(doc, `Description`, `name`) ||
metaTagContent(doc, `og:description`, `property`);
return description;
}
function getMediaType(doc: cheerio.CheerioAPI) {
const node = metaTag(doc, 'medium', 'name');
const node = metaTag(doc, `medium`, `name`);
if (node) {
const content = node.attr('content');
return content === 'image' ? 'photo' : content;
const content = node.attr(`content`);
return content === `image` ? `photo` : content;
}
return (
metaTagContent(doc, 'og:type', 'property') || metaTagContent(doc, 'og:type', 'name')
metaTagContent(doc, `og:type`, `property`) || metaTagContent(doc, `og:type`, `name`)
);
}
@ -77,14 +83,14 @@ function getImages(
let src: string | undefined;
let dic: Record<string, boolean> = {};
const imagePropertyType = imagesPropertyType ?? 'og';
const imagePropertyType = imagesPropertyType ?? `og`;
nodes =
metaTag(doc, `${imagePropertyType}:image`, 'property') ||
metaTag(doc, `${imagePropertyType}:image`, 'name');
metaTag(doc, `${imagePropertyType}:image`, `property`) ||
metaTag(doc, `${imagePropertyType}:image`, `name`);
if (nodes) {
nodes.each((_: number, node: cheerio.Element) => {
if (node.type === 'tag') {
if (node.type === `tag`) {
src = node.attribs.content;
if (src) {
src = new URL(src, rootUrl).href;
@ -95,18 +101,18 @@ function getImages(
}
if (images.length <= 0 && !imagesPropertyType) {
src = doc('link[rel=image_src]').attr('href');
src = doc(`link[rel=image_src]`).attr(`href`);
if (src) {
src = new URL(src, rootUrl).href;
images = [src];
} else {
nodes = doc('img');
nodes = doc(`img`);
if (nodes?.length) {
dic = {};
images = [];
nodes.each((_: number, node: cheerio.Element) => {
if (node.type === 'tag') src = node.attribs.src;
if (node.type === `tag`) src = node.attribs.src;
if (src && !dic[src]) {
dic[src] = true;
// width = node.attribs.width;
@ -135,32 +141,32 @@ function getVideos(doc: cheerio.CheerioAPI) {
let videoObj;
let index;
const nodes = metaTag(doc, 'og:video', 'property') || metaTag(doc, 'og:video', 'name');
const nodes = metaTag(doc, `og:video`, `property`) || metaTag(doc, `og:video`, `name`);
if (nodes?.length) {
nodeTypes =
metaTag(doc, 'og:video:type', 'property') || metaTag(doc, 'og:video:type', 'name');
metaTag(doc, `og:video:type`, `property`) || metaTag(doc, `og:video:type`, `name`);
nodeSecureUrls =
metaTag(doc, 'og:video:secure_url', 'property') ||
metaTag(doc, 'og:video:secure_url', 'name');
metaTag(doc, `og:video:secure_url`, `property`) ||
metaTag(doc, `og:video:secure_url`, `name`);
width =
metaTagContent(doc, 'og:video:width', 'property') ||
metaTagContent(doc, 'og:video:width', 'name');
metaTagContent(doc, `og:video:width`, `property`) ||
metaTagContent(doc, `og:video:width`, `name`);
height =
metaTagContent(doc, 'og:video:height', 'property') ||
metaTagContent(doc, 'og:video:height', 'name');
metaTagContent(doc, `og:video:height`, `property`) ||
metaTagContent(doc, `og:video:height`, `name`);
for (index = 0; index < nodes.length; index += 1) {
const node = nodes[index];
if (node.type === 'tag') video = node.attribs.content;
if (node.type === `tag`) video = node.attribs.content;
nodeType = nodeTypes?.[index];
if (nodeType?.type === 'tag') {
if (nodeType?.type === `tag`) {
videoType = nodeType ? nodeType.attribs.content : null;
}
nodeSecureUrl = nodeSecureUrls?.[index];
if (nodeSecureUrl?.type === 'tag') {
if (nodeSecureUrl?.type === `tag`) {
videoSecureUrl = nodeSecureUrl ? nodeSecureUrl.attribs.content : null;
}
@ -171,7 +177,7 @@ function getVideos(doc: cheerio.CheerioAPI) {
width,
height,
};
if (videoType && videoType.indexOf('video/') === 0) {
if (videoType && videoType.indexOf(`video/`) === 0) {
videos.splice(0, 0, videoObj);
} else {
videos.push(videoObj);
@ -193,7 +199,7 @@ function getFavicons(doc: cheerio.CheerioAPI, rootUrl: string) {
let nodes: cheerio.Cheerio<cheerio.Element> | never[] = [];
let src: string | undefined;
const relSelectors = ['rel=icon', `rel="shortcut icon"`, 'rel=apple-touch-icon'];
const relSelectors = [`rel=icon`, `rel="shortcut icon"`, `rel=apple-touch-icon`];
relSelectors.forEach((relSelector) => {
// look for all icon tags
@ -202,9 +208,9 @@ function getFavicons(doc: cheerio.CheerioAPI, rootUrl: string) {
// collect all images from icon tags
if (nodes.length) {
nodes.each((_: number, node: cheerio.Element) => {
if (node.type === 'tag') src = node.attribs.href;
if (node.type === `tag`) src = node.attribs.href;
if (src) {
src = new URL(rootUrl).href;
src = new URL(src, rootUrl).href;
images.push(src);
}
});
@ -222,7 +228,7 @@ function getFavicons(doc: cheerio.CheerioAPI, rootUrl: string) {
function parseImageResponse(url: string, contentType: string) {
return {
url,
mediaType: 'image',
mediaType: `image`,
contentType,
favicons: [getDefaultFavicon(url)],
};
@ -231,7 +237,7 @@ function parseImageResponse(url: string, contentType: string) {
function parseAudioResponse(url: string, contentType: string) {
return {
url,
mediaType: 'audio',
mediaType: `audio`,
contentType,
favicons: [getDefaultFavicon(url)],
};
@ -240,7 +246,7 @@ function parseAudioResponse(url: string, contentType: string) {
function parseVideoResponse(url: string, contentType: string) {
return {
url,
mediaType: 'video',
mediaType: `video`,
contentType,
favicons: [getDefaultFavicon(url)],
};
@ -249,7 +255,7 @@ function parseVideoResponse(url: string, contentType: string) {
function parseApplicationResponse(url: string, contentType: string) {
return {
url,
mediaType: 'application',
mediaType: `application`,
contentType,
favicons: [getDefaultFavicon(url)],
};
@ -268,7 +274,7 @@ function parseTextResponse(
title: getTitle(doc),
siteName: getSiteName(doc),
description: getDescription(doc),
mediaType: getMediaType(doc) || 'website',
mediaType: getMediaType(doc) || `website`,
contentType,
images: getImages(doc, url, options.imagesPropertyType),
videos: getVideos(doc),
@ -287,11 +293,11 @@ function parseUnknownResponse(
function parseResponse(response: IPreFetchedResource, options?: ILinkPreviewOptions) {
try {
let contentType = response.headers['content-type'];
let contentType = response.headers[`content-type`];
// console.warn(`original content type`, contentType);
if (contentType?.indexOf(';')) {
if (contentType?.indexOf(`;`)) {
// eslint-disable-next-line prefer-destructuring
contentType = contentType.split(';')[0];
contentType = contentType.split(`;`)[0];
// console.warn(`splitting content type`, contentType);
}
@ -330,19 +336,117 @@ function parseResponse(response: IPreFetchedResource, options?: ILinkPreviewOpti
}
}
export async function getLinkPreview(text: string) {
const fetchUrl = text;
const options = {
method: 'GET',
timeout: 5,
};
let response = await fetch(fetchUrl, options);
if (response.status > 300 && response.status < 309) {
const forwardedUrl = response.headers.location || '';
response = await fetch(forwardedUrl, options);
/**
* Parses the text, extracts the first link it finds and does a HTTP request
* to fetch the website content, afterwards it tries to parse the internal HTML
* and extract the information via meta tags
* @param text string, text to be parsed
* @param options ILinkPreviewOptions
*/
export async function getLinkPreview(text: string, options?: ILinkPreviewOptions) {
if (!text || typeof text !== `string`) {
throw new Error(`link-preview-js did not receive a valid url or text`);
}
return parseResponse(response);
const detectedUrl = text
.replace(/\n/g, ` `)
.split(` `)
.find((token) => OPENGRAPH.REGEX_VALID_URL.test(token));
if (!detectedUrl) {
throw new Error(`link-preview-js did not receive a valid a url or text`);
}
if (options?.followRedirects === `manual` && !options?.handleRedirects) {
throw new Error(
`link-preview-js followRedirects is set to manual, but no handleRedirects function was provided`
);
}
if (options?.resolveDNSHost) {
const resolvedUrl = await options.resolveDNSHost(detectedUrl);
throwOnLoopback(resolvedUrl);
}
const timeout = options?.timeout ?? 3000; // 3 second timeout default
const controller = new AbortController();
const timeoutCounter = setTimeout(() => controller.abort(), timeout);
const fetchOptions = {
headers: options?.headers ?? {},
redirect: options?.followRedirects ?? `error`,
signal: controller.signal,
};
const fetchUrl = options?.proxyUrl ? options.proxyUrl.concat(detectedUrl) : detectedUrl;
// Seems like fetchOptions type definition is out of date
// https://github.com/node-fetch/node-fetch/issues/741
let response = await fetch(fetchUrl, fetchOptions as any).catch((e) => {
if (e.name === `AbortError`) {
throw new Error(`Request timeout`);
}
clearTimeout(timeoutCounter);
throw e;
});
if (
response.status > 300 &&
response.status < 309 &&
fetchOptions.redirect === `manual` &&
options?.handleRedirects
) {
const forwardedUrl = response.headers.get(`location`) || ``;
if (!options.handleRedirects(fetchUrl, forwardedUrl)) {
throw new Error(`link-preview-js could not handle redirect`);
}
if (options?.resolveDNSHost) {
const resolvedUrl = await options.resolveDNSHost(forwardedUrl);
throwOnLoopback(resolvedUrl);
}
response = await fetch(forwardedUrl, fetchOptions as any);
}
clearTimeout(timeoutCounter);
const headers: Record<string, string> = {};
response.headers.forEach((header, key) => {
headers[key] = header;
});
const normalizedResponse: IPreFetchedResource = {
url: options?.proxyUrl ? response.url.replace(options.proxyUrl, ``) : response.url,
headers,
data: await response.text(),
};
return parseResponse(normalizedResponse, options);
}
/**
* Skip the library fetching the website for you, instead pass a response object
* from whatever source you get and use the internal parsing of the HTML to return
* the necessary information
* @param response Preview Response
* @param options IPreviewLinkOptions
*/
export async function getPreviewFromContent(
response: IPreFetchedResource,
options?: ILinkPreviewOptions
) {
if (!response || typeof response !== `object`) {
throw new Error(`link-preview-js did not receive a valid response object`);
}
if (!response.url) {
throw new Error(`link-preview-js did not receive a valid response object`);
}
return parseResponse(response, options);
}

View File

@ -111,7 +111,7 @@ export function Composer() {
await publish({ content: serializedContent, kind: 1, tags });
// send native notifiation
await sendNativeNotification('Publish post successfully');
await sendNativeNotification('Publish postr successfully');
// update state
setStatus('done');

View File

@ -42,7 +42,7 @@ export function ComposerModal() {
<ChevronRightIcon className="h-4 w-4 text-white/50" />
</span>
<div className="inline-flex h-7 w-max items-center justify-center gap-0.5 rounded bg-white/10 pl-3 pr-1.5 text-sm font-medium text-white">
New Post
New Postr
<ChevronDownIcon className="h-4 w-4" />
</div>
</div>

View File

@ -14,7 +14,7 @@ export function MentionUser({ pubkey }: { pubkey: string }) {
onClick={() =>
setWidget({
kind: BLOCK_KINDS.user,
title: user?.nip05 || user?.name || user?.displayNam,
title: user?.nip05 || user?.name || user?.display_name,
content: pubkey,
})
}

View File

@ -7,22 +7,25 @@ import { NoteSkeleton, Reply } from '@shared/notes';
import { LumeEvent } from '@utils/types';
export function RepliesList({ id }: { id: string }) {
const { relayUrls, fetcher } = useNDK();
const { ndk } = useNDK();
const { status, data } = useQuery(['thread', id], async () => {
const events = (await fetcher.fetchAllEvents(
relayUrls,
{ kinds: [1], '#e': [id] },
{ since: 0 }
)) as unknown as LumeEvent[];
if (events.length > 0) {
const events = await ndk.fetchEvents({
kinds: [1],
'#e': [id],
since: 0,
});
const array = [...events] as unknown as LumeEvent[];
if (array.length > 0) {
const replies = new Set();
events.forEach((event) => {
array.forEach((event) => {
const tags = event.tags.filter((el) => el[0] === 'e' && el[1] !== id);
if (tags.length > 0) {
tags.forEach((tag) => {
const rootIndex = events.findIndex((el) => el.id === tag[1]);
const rootIndex = array.findIndex((el) => el.id === tag[1]);
if (rootIndex) {
const rootEvent = events[rootIndex];
const rootEvent = array[rootIndex];
if (rootEvent.replies) {
rootEvent.replies.push(event);
} else {
@ -33,10 +36,10 @@ export function RepliesList({ id }: { id: string }) {
});
}
});
const cleanEvents = events.filter((ev) => !replies.has(ev.id));
const cleanEvents = array.filter((ev) => !replies.has(ev.id));
return cleanEvents;
}
return events;
return array;
});
if (status === 'loading') {

View File

@ -12,16 +12,16 @@ import { nHoursAgo } from '@utils/date';
import { LumeEvent } from '@utils/types';
export function NotificationModal({ pubkey }: { pubkey: string }) {
const { fetcher, relayUrls } = useNDK();
const { ndk } = useNDK();
const { status, data } = useQuery(
['notification', pubkey],
async () => {
const events = await fetcher.fetchAllEvents(
relayUrls,
{ '#p': [pubkey], kinds: [1, 6, 7, 9735] },
{ since: nHoursAgo(24) }
);
const filterSelf = events.filter((el) => el.pubkey !== pubkey);
const events = await ndk.fetchEvents({
'#p': [pubkey],
kinds: [1, 6, 7, 9735],
since: nHoursAgo(24),
});
const filterSelf = [...events].filter((el) => el.pubkey !== pubkey);
const sorted = filterSelf.sort((a, b) => a.created_at - b.created_at);
return sorted as unknown as LumeEvent[];
},

View File

@ -17,7 +17,7 @@ export function NotiMention({ event }: { event: NDKEvent }) {
<div className="flex items-start justify-between">
<div className="flex items-start gap-1">
<NotiUser pubkey={event.pubkey} />
<p className="leading-none text-white/50">reply your post</p>
<p className="leading-none text-white/50">reply your postr</p>
</div>
<span className="leading-none text-white/50">{createdAt}</span>
</div>

View File

@ -14,7 +14,7 @@ export function NotiRepost({ event }: { event: NDKEvent }) {
<div className="flex items-start justify-between">
<div className="flex items-start gap-1">
<NotiUser pubkey={event.pubkey} />
<p className="leading-none text-white/50">repost your post</p>
<p className="leading-none text-white/50">repost your postr</p>
</div>
<div>
<span className="leading-none text-white/50">{createdAt}</span>

View File

@ -1,8 +1,10 @@
import { NDKEvent, NDKKind, NDKPrivateKeySigner, NDKUser } from '@nostr-dev-kit/ndk';
import { ndkAdapter } from '@nostr-fetch/adapter-ndk';
import destr from 'destr';
import { LRUCache } from 'lru-cache';
import { NostrEvent } from 'nostr-fetch';
import { NostrFetcher } from 'nostr-fetch';
import { nip19 } from 'nostr-tools';
import { useMemo } from 'react';
import { useNDK } from '@libs/ndk/provider';
import {
@ -19,11 +21,12 @@ import { nHoursAgo } from '@utils/date';
import { useAccount } from '@utils/hooks/useAccount';
export function useNostr() {
const privkey = useStronghold((state) => state.privkey);
const { ndk, relayUrls, fetcher } = useNDK();
const { ndk, relayUrls } = useNDK();
const { account } = useAccount();
const fetcher = useMemo(() => NostrFetcher.withCustomPool(ndkAdapter(ndk)), [ndk]);
const privkey = useStronghold((state) => state.privkey);
async function fetchNetwork(prevFollow?: string[]) {
const follows = new Set<string>(prevFollow || []);
const lruNetwork = new LRUCache<string, string, void>({ max: 300 });
@ -43,14 +46,9 @@ export function useNostr() {
// fetch network
if (!account.network) {
console.log("fetching user's network...");
const events = await fetcher.fetchAllEvents(
relayUrls,
{ kinds: [3], authors: [...follows] },
{ since: 0 },
{ skipVerification: true }
);
const events = await ndk.fetchEvents({ kinds: [3], authors: [...follows] });
events.forEach((event: NostrEvent) => {
events.forEach((event: NDKEvent) => {
event.tags.forEach((tag) => {
if (tag[0] === 'p') lruNetwork.set(tag[1], tag[1]);
});
@ -88,9 +86,11 @@ export function useNostr() {
const events = await fetcher.fetchAllEvents(
relayUrls,
{ kinds: [1], authors: network },
{ since: since },
{ skipVerification: true }
{
kinds: [1],
authors: network,
},
{ since: since }
);
for (const event of events) {
@ -117,17 +117,25 @@ export function useNostr() {
if (!ndk) return { status: 'failed', message: 'NDK instance not found' };
const lastLogin = await getLastLogin();
const incomingMessages = await fetcher.fetchAllEvents(
const outgoingMessages = await fetcher.fetchAllEvents(
relayUrls,
{
kinds: [4],
'#p': [account.pubkey],
authors: [account.pubkey],
},
{ since: lastLogin },
{ skipVerification: true }
{ since: lastLogin }
);
for (const event of incomingMessages) {
const incomingMessages = await fetcher.fetchAllEvents(
relayUrls,
{ kinds: [4], '#p': [account.pubkey] },
{ since: lastLogin }
);
const messages = [...outgoingMessages, ...incomingMessages];
for (const event of messages) {
const receiverPubkey = event.tags.find((t) => t[0] === 'p')[1] || account.pubkey;
await createChat(
event.id,
@ -172,11 +180,11 @@ export function useNostr() {
return event;
};
const createZap = async (event: NostrEvent, amount: number, message?: string) => {
// @ts-expect-error, LumeEvent to NostrEvent
const createZap = async (event: NDKEvent, amount: number, message?: string) => {
// @ts-expect-error, LumeEvent to NDKEvent
event.id = event.event_id;
// @ts-expect-error, LumeEvent to NostrEvent
// @ts-expect-error, LumeEvent to NDKEvent
if (typeof event.content !== 'string') event.content = event.content.original;
if (typeof event.tags === 'string') event.tags = destr(event.tags);
@ -188,6 +196,7 @@ export function useNostr() {
ndk.signer = signer;
}
// @ts-expect-error, LumeEvent to NDKEvent
const ndkEvent = new NDKEvent(ndk, event);
const res = await ndkEvent.zap(amount, message ?? 'zap from lume');

View File

@ -8,7 +8,7 @@ export function useOpenGraph(url: string) {
async () => {
const res = await getLinkPreview(url);
if (!res) {
throw new Error("Can' fetch");
throw new Error('fetch preview failed');
}
return res;
},

View File

@ -5,25 +5,26 @@ import { createNote } from '@libs/storage';
import { nHoursAgo } from '@utils/date';
import { useAccount } from '@utils/hooks/useAccount';
import { nip02ToArray } from '@utils/transform';
import { useNostr } from './useNostr';
import { useNostr } from '@utils/hooks/useNostr';
export function useSocial() {
const queryClient = useQueryClient();
const { publish } = useNostr();
const { fetcher, relayUrls } = useNDK();
const { ndk } = useNDK();
const { account } = useAccount();
const { status, data: userFollows } = useQuery(
['userFollows', account.pubkey],
async () => {
const res = await fetcher.fetchLastEvent(relayUrls, {
kinds: [3],
authors: [account.pubkey],
const keys = [];
const user = ndk.getUser({ hexpubkey: account.pubkey });
const follows = await user.follows();
follows.forEach((item) => {
keys.push(item.hexpubkey);
});
const list = nip02ToArray(res.tags);
return list;
return keys;
},
{
enabled: account ? true : false,
@ -67,11 +68,11 @@ export function useSocial() {
});
// fetch events
const events = await fetcher.fetchAllEvents(
relayUrls,
{ authors: [pubkey], kinds: [1, 6] },
{ since: nHoursAgo(48) }
);
const events = await ndk.fetchEvents({
authors: [pubkey],
kinds: [1, 6],
since: nHoursAgo(24),
});
for (const event of events) {
await createNote(