From 4dfbb437f90adf4f7dc44e4cacc26d8567f761f6 Mon Sep 17 00:00:00 2001 From: Tyson Lupul Date: Thu, 5 Feb 2026 20:51:59 +0000 Subject: [PATCH] Wallet receive flow (#15) (#52) * Pin sharp via pnpm override, add wallet receive * Revert toast success styling * Route receive through wallet connect * Simplify receive invoice validation * Polish receive modal layout * Clarify NWC client config * Adjust wallet action layout on mobile --- package.json | 5 +- pnpm-lock.yaml | 662 ++++++++++-------------- src/app/components/WalletPay.svelte | 20 +- src/app/components/WalletReceive.svelte | 118 +++++ src/app/components/Zap.svelte | 3 +- src/app/core/commands.ts | 79 ++- src/lib/util.ts | 2 + src/routes/settings/wallet/+page.svelte | 39 +- 8 files changed, 525 insertions(+), 403 deletions(-) create mode 100644 src/app/components/WalletReceive.svelte diff --git a/package.json b/package.json index 41494cda..8cd96080 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,9 @@ ], "onlyBuiltDependencies": [ "sharp" - ] + ], + "overrides": { + "sharp": "0.35.0-rc.0" + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2014aaac..94d8fcc3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + sharp: 0.35.0-rc.0 + importers: .: @@ -814,6 +817,9 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -1025,6 +1031,143 @@ packages: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.35.0-rc.0': + resolution: {integrity: sha512-qGq6hAHtaw9LZ4ViG2VsNRN48RADueCfva7PRQmpCedUxqyxgcyimqGluAhzhy+zolF5i8RoTxgw83k7cDkajQ==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.35.0-rc.0': + resolution: {integrity: sha512-Q6JwikkCXL4gFDF4hT6YwvczaVRugcdQH2qgjRBkRQwT9og0W36tvTAN05f0Z+KTCM/q6ugrushz0xCkt9ydqg==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.3.0-rc.2': + resolution: {integrity: sha512-qwcc01+1duh9jpAhtd/dzp5MsxqITuiLFHgAMTYrZQFZFkabYyamHMwngrMjeS+BpTWDkNjOhHlq13Y7Ya/ByQ==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.3.0-rc.2': + resolution: {integrity: sha512-NBSf8NuzHYthnWpanDN/KXQCN7T59XlWZrDEAb5IdvwIm0Mglj9FDrJkF6RmIZSiLJXMcdUHeQkvAjqerMconQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.3.0-rc.2': + resolution: {integrity: sha512-HWpu3wRqss0vqze56Y/peCrMOsILjoorwU0ZiqF4dYQIl03dD4k71tHstC2/y+7KqNtgb7+ItSdXJydfwspDyA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.3.0-rc.2': + resolution: {integrity: sha512-tyXAQ0WCfXZf2dwm7F+IN/t/s324EcdpbW3dh8rwh8NHIkijeHGyiAHs45Bs8SnsTM/RjR+uPigxFMF/QYAiTw==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.3.0-rc.2': + resolution: {integrity: sha512-lfJrlawp2PjxBu3Nh/2EOsgigNgr2o8MOG3XS2ibkKpJ3K/1YcUu9sTQV0S/n8+ak2R9MmJ3uTJqRVjdYkwWxg==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.3.0-rc.2': + resolution: {integrity: sha512-2WUcL/k7uk6i5ZSXCQmOGgGxwsfKEtJA28vNfFb6gT+Zv7vdAMbnjjGMFRtTT7RUcFHgN2olvhfnEjtIMY49MQ==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.3.0-rc.2': + resolution: {integrity: sha512-wx8/WmVA+kwLfwEN6UzjFlRz6erSibq4nGItfH3Nv+OITCjx8pH3Sl67T0tbwjU3M24GOcDFBIJ6rB+2oXbMzQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.3.0-rc.2': + resolution: {integrity: sha512-Rk8oOssrmTzhiuhDMPCw5Gadd4/mj5QPqrkxbg0R1VEaQeNo51d4YNbIokEDp2PqSTo+unUs6SHN8prkFKHP5A==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.3.0-rc.2': + resolution: {integrity: sha512-K2TaPlrPox8uf3K01R8S+AfhPqVVWlEK6+RxkJNGasN0k1iFhu9hMhWl7+sEiWj2V30TKcppRqQWUv7H3qym9w==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.3.0-rc.2': + resolution: {integrity: sha512-88HtWiP7sBX6rb1Hw7cf3H+1ufkB+YocfeMFtmAg6oOc8hvNcby8MVPyE7GL+YD7LKPBadcScaeVnGzYWYRaMQ==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.35.0-rc.0': + resolution: {integrity: sha512-6pdCj+H0+sNsX7vpbxF2FhDF+fe7Hc/mfjlG5caFVUrACIMMOMc962xTE0Y1+XE3EWM8hUmGp3y6hISjJDnwYA==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.35.0-rc.0': + resolution: {integrity: sha512-oy0+atKDov9vn9mMVlyS0V2BTKTFzR3cFhZ9ilF98vnGSvrWdevUlfjNdTE5pN/xZq6z0GnkIAUL5KJhwh5yzQ==} + engines: {node: '>=20.9.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.35.0-rc.0': + resolution: {integrity: sha512-SvX6E6h/i/zhhGheJiSHbFb3loglNDi+H6wEpnPdp5SGlyiJabLVco93kHBeo4lkfQAwYACRW+yFhRfNhhZO3Q==} + engines: {node: '>=20.9.0'} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.35.0-rc.0': + resolution: {integrity: sha512-EY+6k/u87hfZgBXJaNNRwEN1ACPHUudcW2ObVmNA1eADnFircVvdPjvKUCc5bVwzjmG1imzNJWoapIB9wZheFQ==} + engines: {node: '>=20.9.0'} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.35.0-rc.0': + resolution: {integrity: sha512-owTWB3KiGs03QpcHFGNBToB5DIEuCsHugzVS7h8Za6f2W0Nw8qedJF5oSIr71nBj4jF4NmTMd5w7EFOOKn8pFA==} + engines: {node: '>=20.9.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.35.0-rc.0': + resolution: {integrity: sha512-XQoXfEHwz0TTtf6DMT7rLXNc7qb7okjSe+8vzusdTuqVXBi+km+Jwvc9DKL9azMWKR4TR/ArvQ7Y5dFnckb9VA==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.35.0-rc.0': + resolution: {integrity: sha512-hfCXVq35g/zA+Lpa3x1gUXHLi0rLWUPbVGpbPox2zyx2byfKXf5Lcq6xoMJUrQkmT+s8BaOP8TbmhG8ZQgUFyw==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.35.0-rc.0': + resolution: {integrity: sha512-TsV3KFF9i2wKHHsXnRz9N5H66swuDqpk+KPiTugbtdTo+um33BoFZC7F+Ty+DBoOWf4TT+j7IiJfpen5bC5FRw==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.35.0-rc.0': + resolution: {integrity: sha512-5eRvTRqUbNDEd999tRRwXaEO5CERA1WDiVrNDgh+g0IlhCJ79jQkfTE+/dKEO8VbhUwVT6qWFjse+/3KjXhUKg==} + engines: {node: '>=20.9.0'} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.35.0-rc.0': + resolution: {integrity: sha512-AW+wX3E8quoHOIrUabEdT3DPDFxudfReIQybB6I1edBFqy28qNCQRNDK/5gJJeAldDBGaauZmpK251jQH1cFpQ==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.35.0-rc.0': + resolution: {integrity: sha512-vqIlxnnNi10JmMrHrs1WdR8yikIY7PWVSPRHldA8qQd5GnwlX2f0NR/apjaIin78VLIyk7ENsd/TZ82gG+WeFg==} + engines: {node: ^20.9.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.35.0-rc.0': + resolution: {integrity: sha512-BFoIdQaVGnx9S39C5n4913n2jLEg4J8JSM/zyxGVk6lz8QayPvxsLCj5KT1iUs1QO8Ly1c3IA7/xQA5hiPn+zA==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [win32] + '@ionic/cli-framework-output@2.2.8': resolution: {integrity: sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==} engines: {node: '>=16.0.0'} @@ -1872,14 +2015,6 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - b4a@1.7.3: - resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} - peerDependencies: - react-native-b4a: '*' - peerDependenciesMeta: - react-native-b4a: - optional: true - babel-plugin-polyfill-corejs2@0.4.15: resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} peerDependencies: @@ -1898,44 +2033,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.8.2: - resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} - peerDependencies: - bare-abort-controller: '*' - peerDependenciesMeta: - bare-abort-controller: - optional: true - - bare-fs@4.5.2: - resolution: {integrity: sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==} - engines: {bare: '>=1.16.0'} - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - - bare-os@3.6.2: - resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.7.0: - resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - - bare-url@2.3.2: - resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1951,9 +2048,6 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - blueimp-canvas-to-blob@3.29.0: resolution: {integrity: sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg==} @@ -1992,9 +2086,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2049,9 +2140,6 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -2090,13 +2178,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -2325,14 +2406,6 @@ packages: resolution: {integrity: sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==} engines: {node: '>=8.6'} - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2443,9 +2516,6 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -2589,23 +2659,13 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - events-universal@1.0.1: - resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} - events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -2678,9 +2738,6 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -2768,9 +2825,6 @@ packages: gitconfiglocal@1.0.0: resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2886,9 +2940,6 @@ packages: idb@8.0.3: resolution: {integrity: sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2938,9 +2989,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.4: - resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -3323,10 +3371,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -3380,9 +3424,6 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -3414,9 +3455,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - native-run@2.0.3: resolution: {integrity: sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==} engines: {node: '>=16.0.0'} @@ -3428,13 +3466,6 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - node-abi@3.87.0: - resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} - engines: {node: '>=10'} - - node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -3737,11 +3768,6 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - hasBin: true - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3896,9 +3922,6 @@ packages: prosemirror-view@1.41.5: resolution: {integrity: sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==} - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -3933,10 +3956,6 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -4130,9 +4149,9 @@ packages: sharp-ico@0.1.5: resolution: {integrity: sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q==} - sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} + sharp@0.35.0-rc.0: + resolution: {integrity: sha512-tZKJk5VENxgwbJp9PBGv/nzq13HSL4L51LC1eOaXHUwAryMMHdz/KEXgqsOFyLjxF4OyGQR6YfnnVvP8zrZKsA==} + engines: {node: '>=20.9.0'} shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -4161,18 +4180,9 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - simple-plist@1.3.1: resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} - simple-swizzle@0.2.4: - resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} - sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} @@ -4241,9 +4251,6 @@ packages: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} - streamx@2.23.0: - resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -4290,10 +4297,6 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -4346,19 +4349,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tar-fs@2.1.4: - resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} - - tar-fs@3.1.1: - resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -4381,9 +4371,6 @@ packages: engines: {node: '>=10'} hasBin: true - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} @@ -4482,9 +4469,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -5570,17 +5554,14 @@ snapshots: fs-extra: 10.1.0 node-fetch: 2.7.0 node-html-parser: 5.4.2 - sharp: 0.32.6 + sharp: 0.35.0-rc.0 tslib: 2.6.2 yargs: 17.7.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - - bare-abort-controller - - bare-buffer - encoding - - react-native-b4a - supports-color - typescript @@ -5688,6 +5669,11 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -5838,6 +5824,102 @@ snapshots: '@hutson/parse-repository-url@3.0.2': {} + '@img/colour@1.0.0': {} + + '@img/sharp-darwin-arm64@0.35.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.3.0-rc.2 + optional: true + + '@img/sharp-darwin-x64@0.35.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.3.0-rc.2 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.3.0-rc.2': + optional: true + + '@img/sharp-libvips-darwin-x64@1.3.0-rc.2': + optional: true + + '@img/sharp-libvips-linux-arm64@1.3.0-rc.2': + optional: true + + '@img/sharp-libvips-linux-arm@1.3.0-rc.2': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.3.0-rc.2': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.3.0-rc.2': + optional: true + + '@img/sharp-libvips-linux-s390x@1.3.0-rc.2': + optional: true + + '@img/sharp-libvips-linux-x64@1.3.0-rc.2': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.3.0-rc.2': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.3.0-rc.2': + optional: true + + '@img/sharp-linux-arm64@0.35.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.0-rc.2 + optional: true + + '@img/sharp-linux-arm@0.35.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.3.0-rc.2 + optional: true + + '@img/sharp-linux-ppc64@0.35.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.3.0-rc.2 + optional: true + + '@img/sharp-linux-riscv64@0.35.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.3.0-rc.2 + optional: true + + '@img/sharp-linux-s390x@0.35.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.3.0-rc.2 + optional: true + + '@img/sharp-linux-x64@0.35.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.3.0-rc.2 + optional: true + + '@img/sharp-linuxmusl-arm64@0.35.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.3.0-rc.2 + optional: true + + '@img/sharp-linuxmusl-x64@0.35.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.3.0-rc.2 + optional: true + + '@img/sharp-wasm32@0.35.0-rc.0': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.35.0-rc.0': + optional: true + + '@img/sharp-win32-ia32@0.35.0-rc.0': + optional: true + + '@img/sharp-win32-x64@0.35.0-rc.0': + optional: true + '@ionic/cli-framework-output@2.2.8': dependencies: '@ionic/utils-terminal': 2.3.5 @@ -6560,13 +6642,9 @@ snapshots: cac: 6.7.14 colorette: 2.0.20 consola: 3.4.2 - sharp: 0.32.6 + sharp: 0.35.0-rc.0 sharp-ico: 0.1.5 unconfig: 0.3.13 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a '@vite-pwa/sveltekit@0.6.8(@sveltejs/kit@2.50.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.48.0)(vite@5.4.21(@types/node@25.0.10)(terser@5.46.0)))(svelte@5.48.0)(typescript@5.9.3)(vite@5.4.21(@types/node@25.0.10)(terser@5.46.0)))(@vite-pwa/assets-generator@0.2.6)(vite-plugin-pwa@0.21.2(@vite-pwa/assets-generator@0.2.6)(vite@5.4.21(@types/node@25.0.10)(terser@5.46.0))(workbox-build@7.3.0)(workbox-window@7.3.0))': dependencies: @@ -6797,8 +6875,6 @@ snapshots: axobject-query@4.1.0: {} - b4a@1.7.3: {} - babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.28.6): dependencies: '@babel/compat-data': 7.28.6 @@ -6825,43 +6901,6 @@ snapshots: balanced-match@1.0.2: {} - bare-events@2.8.2: {} - - bare-fs@4.5.2: - dependencies: - bare-events: 2.8.2 - bare-path: 3.0.0 - bare-stream: 2.7.0(bare-events@2.8.2) - bare-url: 2.3.2 - fast-fifo: 1.3.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - optional: true - - bare-os@3.6.2: - optional: true - - bare-path@3.0.0: - dependencies: - bare-os: 3.6.2 - optional: true - - bare-stream@2.7.0(bare-events@2.8.2): - dependencies: - streamx: 2.23.0 - optionalDependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - optional: true - - bare-url@2.3.2: - dependencies: - bare-path: 3.0.0 - optional: true - base64-js@1.5.1: {} baseline-browser-mapping@2.9.17: {} @@ -6870,12 +6909,6 @@ snapshots: binary-extensions@2.3.0: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - blueimp-canvas-to-blob@3.29.0: {} boolbase@1.0.0: {} @@ -6917,11 +6950,6 @@ snapshots: buffer-from@1.1.2: {} - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -6986,8 +7014,6 @@ snapshots: dependencies: readdirp: 4.1.2 - chownr@1.1.4: {} - chownr@2.0.0: {} classnames@2.5.1: {} @@ -7026,16 +7052,6 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.4 - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - colorette@2.0.20: {} commander@12.1.0: {} @@ -7289,12 +7305,6 @@ snapshots: decode-bmp: 0.2.1 to-data-view: 1.1.0 - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - deep-extend@0.6.0: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -7409,10 +7419,6 @@ snapshots: emoji-regex@8.0.0: {} - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - entities@2.2.0: {} entities@4.5.0: {} @@ -7652,20 +7658,10 @@ snapshots: esutils@2.0.3: {} - events-universal@1.0.1: - dependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - bare-abort-controller - events@3.3.0: {} - expand-template@2.0.3: {} - fast-deep-equal@3.1.3: {} - fast-fifo@1.3.2: {} - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -7739,8 +7735,6 @@ snapshots: fraction.js@5.3.4: {} - fs-constants@1.0.0: {} - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -7845,8 +7839,6 @@ snapshots: dependencies: ini: 1.3.8 - github-from-package@0.0.0: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -7956,8 +7948,6 @@ snapshots: idb@8.0.3: {} - ieee754@1.2.1: {} - ignore@5.3.2: {} ignore@7.0.5: {} @@ -7998,8 +7988,6 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.4: {} - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -8337,8 +8325,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mimic-response@3.1.0: {} - min-indent@1.0.1: {} minimatch@10.1.1: @@ -8388,8 +8374,6 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - mkdirp-classic@0.5.3: {} - mkdirp@1.0.4: {} modify-values@1.0.1: {} @@ -8410,8 +8394,6 @@ snapshots: nanoid@3.3.11: {} - napi-build-utils@2.0.0: {} - native-run@2.0.3: dependencies: '@ionic/utils-fs': 3.1.7 @@ -8432,12 +8414,6 @@ snapshots: neo-async@2.6.2: {} - node-abi@3.87.0: - dependencies: - semver: 7.7.3 - - node-addon-api@6.1.0: {} - node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -8713,21 +8689,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.3: - dependencies: - detect-libc: 2.1.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 2.0.0 - node-abi: 3.87.0 - pump: 3.0.3 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.4 - tunnel-agent: 0.6.0 - prelude-ls@1.2.1: {} prettier-plugin-svelte@3.4.1(prettier@3.8.1)(svelte@5.48.0): @@ -8859,11 +8820,6 @@ snapshots: prosemirror-state: 1.4.4 prosemirror-transform: 1.11.0 - pump@3.0.3: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -8888,13 +8844,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -9140,26 +9089,38 @@ snapshots: dependencies: decode-ico: 0.4.1 ico-endec: 0.1.6 - sharp: 0.32.6 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a + sharp: 0.35.0-rc.0 - sharp@0.32.6: + sharp@0.35.0-rc.0: dependencies: - color: 4.2.3 + '@img/colour': 1.0.0 detect-libc: 2.1.2 - node-addon-api: 6.1.0 - prebuild-install: 7.1.3 semver: 7.7.3 - simple-get: 4.0.1 - tar-fs: 3.1.1 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a + optionalDependencies: + '@img/sharp-darwin-arm64': 0.35.0-rc.0 + '@img/sharp-darwin-x64': 0.35.0-rc.0 + '@img/sharp-libvips-darwin-arm64': 1.3.0-rc.2 + '@img/sharp-libvips-darwin-x64': 1.3.0-rc.2 + '@img/sharp-libvips-linux-arm': 1.3.0-rc.2 + '@img/sharp-libvips-linux-arm64': 1.3.0-rc.2 + '@img/sharp-libvips-linux-ppc64': 1.3.0-rc.2 + '@img/sharp-libvips-linux-riscv64': 1.3.0-rc.2 + '@img/sharp-libvips-linux-s390x': 1.3.0-rc.2 + '@img/sharp-libvips-linux-x64': 1.3.0-rc.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.0-rc.2 + '@img/sharp-libvips-linuxmusl-x64': 1.3.0-rc.2 + '@img/sharp-linux-arm': 0.35.0-rc.0 + '@img/sharp-linux-arm64': 0.35.0-rc.0 + '@img/sharp-linux-ppc64': 0.35.0-rc.0 + '@img/sharp-linux-riscv64': 0.35.0-rc.0 + '@img/sharp-linux-s390x': 0.35.0-rc.0 + '@img/sharp-linux-x64': 0.35.0-rc.0 + '@img/sharp-linuxmusl-arm64': 0.35.0-rc.0 + '@img/sharp-linuxmusl-x64': 0.35.0-rc.0 + '@img/sharp-wasm32': 0.35.0-rc.0 + '@img/sharp-win32-arm64': 0.35.0-rc.0 + '@img/sharp-win32-ia32': 0.35.0-rc.0 + '@img/sharp-win32-x64': 0.35.0-rc.0 shebang-command@2.0.0: dependencies: @@ -9197,24 +9158,12 @@ snapshots: signal-exit@3.0.7: {} - simple-concat@1.0.1: {} - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - simple-plist@1.3.1: dependencies: bplist-creator: 0.1.0 bplist-parser: 0.3.1 plist: 3.1.0 - simple-swizzle@0.2.4: - dependencies: - is-arrayish: 0.3.4 - sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 @@ -9279,15 +9228,6 @@ snapshots: stream-buffers@2.2.0: {} - streamx@2.23.0: - dependencies: - events-universal: 1.0.1 - fast-fifo: 1.3.2 - text-decoder: 1.2.3 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -9359,8 +9299,6 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} sucrase@3.35.1: @@ -9461,42 +9399,6 @@ snapshots: - tsx - yaml - tar-fs@2.1.4: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.3 - tar-stream: 2.2.0 - - tar-fs@3.1.1: - dependencies: - pump: 3.0.3 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 4.5.2 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tar-stream@3.1.7: - dependencies: - b4a: 1.7.3 - fast-fifo: 1.3.2 - streamx: 2.23.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - tar@6.2.1: dependencies: chownr: 2.0.0 @@ -9530,12 +9432,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - text-decoder@1.2.3: - dependencies: - b4a: 1.7.3 - transitivePeerDependencies: - - react-native-b4a - text-extensions@1.9.0: {} thenify-all@1.6.0: @@ -9626,10 +9522,6 @@ snapshots: tslib@2.8.1: {} - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 diff --git a/src/app/components/WalletPay.svelte b/src/app/components/WalletPay.svelte index 53699f77..57b48307 100644 --- a/src/app/components/WalletPay.svelte +++ b/src/app/components/WalletPay.svelte @@ -14,6 +14,7 @@ import ModalTitle from "@lib/components/ModalTitle.svelte" import ModalSubtitle from "@lib/components/ModalSubtitle.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte" + import {errorMessage} from "@lib/util" import {payInvoice} from "@app/core/commands" import {pushToast} from "@app/util/toast" import {clearModals} from "@app/util/modal" @@ -29,14 +30,18 @@ loading = true try { - await payInvoice(invoice!.paymentRequest, sats * 1000) + if (hasAmount) { + await payInvoice(invoice!.paymentRequest) + } else { + await payInvoice(invoice!.paymentRequest, sats * 1000) + } pushToast({message: `Payment sent!`}) clearModals() } catch (e) { console.error(e) - const message = String(e).replace(/^.*Error: /, "") + const message = errorMessage(e) pushToast({ theme: "error", @@ -50,6 +55,7 @@ let loading = $state(false) let invoice: Invoice | undefined = $state() let sats = $state(0) + const hasAmount = $derived((invoice?.satoshi ?? 0) > 0) @@ -60,7 +66,7 @@ {#if invoice}
- {#if $session?.wallet?.type === "webln" && invoice.satoshi === 0} + {#if $session?.wallet?.type === "webln" && !hasAmount}

Uh oh! It looks like your current wallet doesn't support invoices without an amount. See if you can get a lightning invoice with a pre-set amount. @@ -101,7 +107,13 @@ Go back - + {#if invoice} + + {:else} + + {/if} + + diff --git a/src/app/components/Zap.svelte b/src/app/components/Zap.svelte index e842a4a2..62fd3e77 100644 --- a/src/app/components/Zap.svelte +++ b/src/app/components/Zap.svelte @@ -17,6 +17,7 @@ import ModalSubtitle from "@lib/components/ModalSubtitle.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte" import EmojiButton from "@lib/components/EmojiButton.svelte" + import {errorMessage} from "@lib/util" import ProfileLink from "@app/components/ProfileLink.svelte" import {payInvoice} from "@app/core/commands" import {pushToast} from "@app/util/toast" @@ -85,7 +86,7 @@ } catch (e) { console.error(e) - const message = String(e).replace(/^.*Error: /, "") + const message = errorMessage(e) pushToast({ theme: "error", diff --git a/src/app/core/commands.ts b/src/app/core/commands.ts index a169d6a3..4fbb9c55 100644 --- a/src/app/core/commands.ts +++ b/src/app/core/commands.ts @@ -425,6 +425,22 @@ export const publishLeaveRequest = (params: LeaveRequestParams) => export const getWebLn = () => (window as any).webln +export const getNwcClient = () => { + const $session = session.get() + + if (!$session?.wallet || $session.wallet.type !== "nwc") { + throw new Error("No NWC wallet is connected") + } + + const {info} = $session.wallet + + if (info.nostrWalletConnectUrl) { + return new nwc.NWCClient({nostrWalletConnectUrl: info.nostrWalletConnectUrl}) + } + + return new nwc.NWCClient(info) +} + export const payInvoice = async (invoice: string, msats?: number) => { const $session = session.get() @@ -435,7 +451,7 @@ export const payInvoice = async (invoice: string, msats?: number) => { if ($session.wallet.type === "nwc") { const params: {invoice: string; amount?: number} = {invoice} if (msats) params.amount = msats - return new nwc.NWCClient($session.wallet.info).payInvoice(params) + return getNwcClient().payInvoice(params) } else if ($session.wallet.type === "webln") { if (msats) throw new Error("Unable to pay zero invoices with webln") return getWebLn() @@ -444,6 +460,67 @@ export const payInvoice = async (invoice: string, msats?: number) => { } } +export type CreateInvoiceParams = { + sats: number + description?: string +} + +export const createInvoice = async ({ + sats, + description = "Receive via lightning", +}: CreateInvoiceParams) => { + const $session = session.get() + + if (!$session?.wallet) { + throw new Error("No wallet is connected") + } + + const satAmount = Math.floor(sats) + + if (!Number.isFinite(satAmount) || satAmount <= 0) { + throw new Error("Invalid satoshi amount") + } + + if ($session.wallet.type === "nwc") { + const createdInvoice = await getNwcClient().makeInvoice({ + amount: satAmount * 1000, + description, + }) + + if (!createdInvoice.invoice) { + throw new Error("NWC wallet failed to return an invoice") + } + + return createdInvoice.invoice + } + + if ($session.wallet.type === "webln") { + const webLn = getWebLn() + + if (!webLn) { + throw new Error("WebLN not available") + } + + await webLn.enable() + + const response = await webLn.makeInvoice({ + amount: satAmount, + defaultMemo: description, + }) + + const paymentRequest = + typeof response === "string" ? response : response?.paymentRequest || response?.pr || "" + + if (!paymentRequest) { + throw new Error("Invalid payment request returned from WebLN") + } + + return paymentRequest + } + + throw new Error("Unsupported wallet type") +} + // File upload export const normalizeBlossomUrl = (url: string) => normalizeUrl(url.replace(/^ws/, "http")) diff --git a/src/lib/util.ts b/src/lib/util.ts index ab23de01..a1ae8d5b 100644 --- a/src/lib/util.ts +++ b/src/lib/util.ts @@ -17,6 +17,8 @@ export const daysBetween = (start: number, end: number) => [...range(start, end, export const ucFirst = (s: string) => s.slice(0, 1).toUpperCase() + s.slice(1) +export const errorMessage = (err: unknown) => String(err).replace(/^.*Error: /, "") + export const buildUrl = (base: string | URL, ...pathname: string[]) => { const url = new URL(base) diff --git a/src/routes/settings/wallet/+page.svelte b/src/routes/settings/wallet/+page.svelte index 4af6442a..fed15a08 100644 --- a/src/routes/settings/wallet/+page.svelte +++ b/src/routes/settings/wallet/+page.svelte @@ -3,10 +3,12 @@ import {LOCALE} from "@welshman/lib" import {displayRelayUrl, isNWCWallet, fromMsats} from "@welshman/util" import {session, pubkey, profilesByPubkey} from "@welshman/app" - import Bolt from "@assets/icons/bolt.svg?dataurl" + import DownloadMinimalistic from "@assets/icons/download-minimalistic.svg?dataurl" + import UploadMinimalistic from "@assets/icons/upload-minimalistic.svg?dataurl" import Icon from "@lib/components/Icon.svelte" import Button from "@lib/components/Button.svelte" import WalletPay from "@app/components/WalletPay.svelte" + import WalletReceive from "@app/components/WalletReceive.svelte" import WalletConnect from "@app/components/WalletConnect.svelte" import WalletDisconnect from "@app/components/WalletDisconnect.svelte" import WalletUpdateReceivingAddress from "@app/components/WalletUpdateReceivingAddress.svelte" @@ -31,6 +33,13 @@ ) const pay = () => pushModal(WalletPay) + const receive = () => { + if ($session?.wallet) { + pushModal(WalletReceive) + } else { + pushModal(WalletConnect) + } + }

@@ -94,10 +103,24 @@

{/if} - +
+ +
+ + +
+
{:else}

No wallet connected

{/if} @@ -122,10 +145,4 @@
{/if} -
- -