diff --git a/package.json b/package.json index fe86f03b..f8814139 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2705876d..a4ee7ec8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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: diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index b94caab6..587b23eb 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -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", ] diff --git a/src/app/auth/onboarding/step-3.tsx b/src/app/auth/onboarding/step-3.tsx index 63bfedeb..dea51bcc 100644 --- a/src/app/auth/onboarding/step-3.tsx +++ b/src/app/auth/onboarding/step-3.tsx @@ -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(); - 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) => { diff --git a/src/app/chats/components/messages/item.tsx b/src/app/chats/components/messages/item.tsx index 789d3f58..bb742659 100644 --- a/src/app/chats/components/messages/item.tsx +++ b/src/app/chats/components/messages/item.tsx @@ -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 (
@@ -31,13 +26,8 @@ export function ChatMessageItem({

- {content.parsed} + {data.content}

- {content.images.length > 0 && } - {content.videos.length > 0 && } - {content.links.length > 0 && } - {content.notes.length > 0 && - content.notes.map((note: string) => )}
diff --git a/src/app/chats/components/self.tsx b/src/app/chats/components/self.tsx index 685b1945..f56336f2 100644 --- a/src/app/chats/components/self.tsx +++ b/src/app/chats/components/self.tsx @@ -15,9 +15,7 @@ export function ChatsListSelfItem({ data }: { data: { pubkey: string } }) { return (
-
-
-
+
); } diff --git a/src/app/space/components/blocks/hashtag.tsx b/src/app/space/components/blocks/hashtag.tsx index dfc56260..20504c95 100644 --- a/src/app/space/components/blocks/hashtag.tsx +++ b/src/app/space/components/blocks/hashtag.tsx @@ -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(); diff --git a/src/app/space/components/blocks/user.tsx b/src/app/space/components/blocks/user.tsx index c1f743fe..bc09dfb1 100644 --- a/src/app/space/components/blocks/user.tsx +++ b/src/app/space/components/blocks/user.tsx @@ -14,15 +14,14 @@ import { LumeEvent, Widget } from '@utils/types'; export function UserBlock({ params }: { params: Widget }) { const parentRef = useRef(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 }) {
-

- Latest activities -

+

Latest postrs

{status === 'loading' ? (
@@ -57,7 +54,7 @@ export function UserBlock({ params }: { params: Widget }) {

- No new posts about this hashtag in 48 hours ago + No new posts from this user in 48 hours ago

diff --git a/src/app/trending/components/profile.tsx b/src/app/trending/components/profile.tsx index 390b7576..5148d203 100644 --- a/src/app/trending/components/profile.tsx +++ b/src/app/trending/components/profile.tsx @@ -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'; diff --git a/src/app/trending/components/trendingNotes.tsx b/src/app/trending/components/trendingNotes.tsx index 3afb77b9..7fd30e39 100644 --- a/src/app/trending/components/trendingNotes.tsx +++ b/src/app/trending/components/trendingNotes.tsx @@ -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 (
diff --git a/src/app/trending/components/trendingProfiles.tsx b/src/app/trending/components/trendingProfiles.tsx index 1defa9a2..d65a778e 100644 --- a/src/app/trending/components/trendingProfiles.tsx +++ b/src/app/trending/components/trendingProfiles.tsx @@ -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 (
@@ -44,7 +44,7 @@ export function TrendingProfiles() {
) : (
- {data.map((item) => ( + {data?.map((item) => ( ))}
diff --git a/src/app/users/components/feed.tsx b/src/app/users/components/feed.tsx index 49e47b4f..57814896 100644 --- a/src/app/users/components/feed.tsx +++ b/src/app/users/components/feed.tsx @@ -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({ diff --git a/src/app/users/index.tsx b/src/app/users/index.tsx index 9bfa0a37..19fef911 100644 --- a/src/app/users/index.tsx +++ b/src/app/users/index.tsx @@ -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({ diff --git a/src/libs/ndk/instance.ts b/src/libs/ndk/instance.ts index fad760e3..7b5a334b 100644 --- a/src/libs/ndk/instance.ts +++ b/src/libs/ndk/instance.ts @@ -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([]); const cacheAdapter = useMemo(() => new TauriAdapter(), []); - const fetcher = useMemo( - () => (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, }; }; diff --git a/src/libs/ndk/provider.tsx b/src/libs/ndk/provider.tsx index 26c39f9b..58011bb8 100644 --- a/src/libs/ndk/provider.tsx +++ b/src/libs/ndk/provider.tsx @@ -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({ ndk: new NDK({}), relayUrls: [], - fetcher: undefined, }); const NDKProvider = ({ children }: PropsWithChildren) => { - const { ndk, relayUrls, fetcher } = NDKInstance(); + const { ndk, relayUrls } = NDKInstance(); return ( {children} diff --git a/src/libs/nip44.ts b/src/libs/nip44.ts deleted file mode 100644 index d5716804..00000000 --- a/src/libs/nip44.ts +++ /dev/null @@ -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; -} diff --git a/src/libs/openGraph.tsx b/src/libs/openGraph.tsx index f53da9f1..3ef87cdf 100644 --- a/src/libs/openGraph.tsx +++ b/src/libs/openGraph.tsx @@ -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 = {}; - 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 | 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 = {}; + 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); } diff --git a/src/shared/composer/composer.tsx b/src/shared/composer/composer.tsx index bc69659f..5fe92f78 100644 --- a/src/shared/composer/composer.tsx +++ b/src/shared/composer/composer.tsx @@ -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'); diff --git a/src/shared/composer/modal.tsx b/src/shared/composer/modal.tsx index 12560670..3cf0b35e 100644 --- a/src/shared/composer/modal.tsx +++ b/src/shared/composer/modal.tsx @@ -42,7 +42,7 @@ export function ComposerModal() {
- New Post + New Postr
diff --git a/src/shared/notes/mentions/user.tsx b/src/shared/notes/mentions/user.tsx index 40166fa0..36d947b8 100644 --- a/src/shared/notes/mentions/user.tsx +++ b/src/shared/notes/mentions/user.tsx @@ -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, }) } diff --git a/src/shared/notes/replies/list.tsx b/src/shared/notes/replies/list.tsx index 7a5a7891..e501218e 100644 --- a/src/shared/notes/replies/list.tsx +++ b/src/shared/notes/replies/list.tsx @@ -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') { diff --git a/src/shared/notification/modal.tsx b/src/shared/notification/modal.tsx index f66f24d5..ab4cc45f 100644 --- a/src/shared/notification/modal.tsx +++ b/src/shared/notification/modal.tsx @@ -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[]; }, diff --git a/src/shared/notification/types/mention.tsx b/src/shared/notification/types/mention.tsx index b6ff48db..5f38c8ab 100644 --- a/src/shared/notification/types/mention.tsx +++ b/src/shared/notification/types/mention.tsx @@ -17,7 +17,7 @@ export function NotiMention({ event }: { event: NDKEvent }) {
-

reply your post

+

reply your postr

{createdAt}
diff --git a/src/shared/notification/types/repost.tsx b/src/shared/notification/types/repost.tsx index e2df325d..8ca745be 100644 --- a/src/shared/notification/types/repost.tsx +++ b/src/shared/notification/types/repost.tsx @@ -14,7 +14,7 @@ export function NotiRepost({ event }: { event: NDKEvent }) {
-

repost your post

+

repost your postr

{createdAt} diff --git a/src/utils/hooks/useNostr.tsx b/src/utils/hooks/useNostr.tsx index d867feb2..fedbeb72 100644 --- a/src/utils/hooks/useNostr.tsx +++ b/src/utils/hooks/useNostr.tsx @@ -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(prevFollow || []); const lruNetwork = new LRUCache({ 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'); diff --git a/src/utils/hooks/useOpenGraph.tsx b/src/utils/hooks/useOpenGraph.tsx index ce3b5ed2..fc3d9a46 100644 --- a/src/utils/hooks/useOpenGraph.tsx +++ b/src/utils/hooks/useOpenGraph.tsx @@ -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; }, diff --git a/src/utils/hooks/useSocial.tsx b/src/utils/hooks/useSocial.tsx index 6b706a3e..aee0dcc7 100644 --- a/src/utils/hooks/useSocial.tsx +++ b/src/utils/hooks/useSocial.tsx @@ -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(