atmosphere explorer pdsls.dev
atproto tool typescript

init

juli.ee e1224663 0ee79770

verified
Changed files
+329 -340
src
utils
types
views
+6 -8
package.json
··· 9 9 "serve": "vite preview" 10 10 }, 11 11 "devDependencies": { 12 - "@iconify-json/lucide": "^1.2.73", 12 + "@iconify-json/lucide": "^1.2.74", 13 13 "@iconify/tailwind4": "^1.1.0", 14 14 "@tailwindcss/vite": "^4.1.17", 15 15 "prettier": "^3.6.2", ··· 17 17 "prettier-plugin-tailwindcss": "^0.7.1", 18 18 "tailwindcss": "^4.1.17", 19 19 "typescript": "^5.9.3", 20 - "vite": "^7.2.2", 20 + "vite": "^7.2.4", 21 21 "vite-plugin-solid": "^2.11.10" 22 22 }, 23 23 "dependencies": { ··· 26 26 "@atcute/client": "^4.0.5", 27 27 "@atcute/crypto": "^2.2.6", 28 28 "@atcute/did-plc": "^0.2.0", 29 - "@atcute/identity": "^1.1.2", 29 + "@atcute/identity": "^1.1.3", 30 30 "@atcute/identity-resolver": "^1.1.4", 31 - "@atcute/leaflet": "^1.0.12", 32 - "@atcute/lexicon-doc": "^1.3.0", 33 - "@atcute/lexicon-resolver": "^0.1.3", 34 - "@atcute/lexicons": "^1.2.3", 31 + "@atcute/lexicon-doc": "^2.0.1", 32 + "@atcute/lexicon-resolver": "^0.1.4", 33 + "@atcute/lexicons": "^1.2.4", 35 34 "@atcute/oauth-browser-client": "^2.0.1", 36 35 "@atcute/repo": "^0.1.0", 37 - "@atcute/tangled": "^1.0.12", 38 36 "@atcute/tid": "^1.0.3", 39 37 "@codemirror/commands": "^6.10.0", 40 38 "@codemirror/lang-json": "^6.0.2",
+177 -202
pnpm-lock.yaml
··· 24 24 specifier: ^0.2.0 25 25 version: 0.2.0 26 26 '@atcute/identity': 27 - specifier: ^1.1.2 28 - version: 1.1.2 27 + specifier: ^1.1.3 28 + version: 1.1.3 29 29 '@atcute/identity-resolver': 30 30 specifier: ^1.1.4 31 - version: 1.1.4(@atcute/identity@1.1.2) 32 - '@atcute/leaflet': 33 - specifier: ^1.0.12 34 - version: 1.0.12 31 + version: 1.1.4(@atcute/identity@1.1.3) 35 32 '@atcute/lexicon-doc': 36 - specifier: ^1.3.0 37 - version: 1.3.0 33 + specifier: ^2.0.1 34 + version: 2.0.1 38 35 '@atcute/lexicon-resolver': 39 - specifier: ^0.1.3 40 - version: 0.1.3(@atcute/identity-resolver@1.1.4(@atcute/identity@1.1.2))(@atcute/identity@1.1.2) 36 + specifier: ^0.1.4 37 + version: 0.1.4(@atcute/identity-resolver@1.1.4(@atcute/identity@1.1.3))(@atcute/identity@1.1.3) 41 38 '@atcute/lexicons': 42 - specifier: ^1.2.3 43 - version: 1.2.3 39 + specifier: ^1.2.4 40 + version: 1.2.4 44 41 '@atcute/oauth-browser-client': 45 42 specifier: ^2.0.1 46 43 version: 2.0.1 47 44 '@atcute/repo': 48 45 specifier: ^0.1.0 49 46 version: 0.1.0 50 - '@atcute/tangled': 51 - specifier: ^1.0.12 52 - version: 1.0.12 53 47 '@atcute/tid': 54 48 specifier: ^1.0.3 55 49 version: 1.0.3 ··· 94 88 version: 1.9.10 95 89 devDependencies: 96 90 '@iconify-json/lucide': 97 - specifier: ^1.2.73 98 - version: 1.2.73 91 + specifier: ^1.2.74 92 + version: 1.2.74 99 93 '@iconify/tailwind4': 100 94 specifier: ^1.1.0 101 95 version: 1.1.0(tailwindcss@4.1.17) 102 96 '@tailwindcss/vite': 103 97 specifier: ^4.1.17 104 - version: 4.1.17(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 98 + version: 4.1.17(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 105 99 prettier: 106 100 specifier: ^3.6.2 107 101 version: 3.6.2 ··· 118 112 specifier: ^5.9.3 119 113 version: 5.9.3 120 114 vite: 121 - specifier: ^7.2.2 122 - version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 115 + specifier: ^7.2.4 116 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 123 117 vite-plugin-solid: 124 118 specifier: ^2.11.10 125 - version: 2.11.10(solid-js@1.9.10)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 119 + version: 2.11.10(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 126 120 127 121 packages: 128 122 ··· 144 138 '@atcute/car@5.0.0': 145 139 resolution: {integrity: sha512-OIY2xTXv8lSpZsDSn/UYQtJSMvDw5Hi4Q+uyvmiqSM+fht08QRAEq/nxa5YFciPZ3nfDFnZ3//EgJw7QhkSXLQ==} 146 140 147 - '@atcute/cbor@2.2.7': 148 - resolution: {integrity: sha512-/mwAF0gnokOphceZqFq3uzMGdd8sbw5y6bxF8CRutRkCCUcpjjpJc5fkLwhxyGgOveF3mZuHE6p7t/+IAqb7Aw==} 141 + '@atcute/cbor@2.2.8': 142 + resolution: {integrity: sha512-UzOAN9BuN6JCXgn0ryV8qZuRJUDrNqrbLd6EFM8jc6RYssjRyGRxNy6RZ1NU/07Hd8Tq/0pz8+nQiMu5Zai5uw==} 149 143 150 144 '@atcute/cid@2.2.6': 151 145 resolution: {integrity: sha512-bTAHHbJ24p+E//V4KCS4xdmd39o211jJswvqQOevj7vk+5IYcgDLx1ryZWZ1sEPOo9x875li/kj5gpKL14RDwQ==} ··· 164 158 peerDependencies: 165 159 '@atcute/identity': ^1.0.0 166 160 167 - '@atcute/identity@1.1.2': 168 - resolution: {integrity: sha512-vn0RN7SUF6N0sEPG9yyT6a0MzpfVS8BhsiLtB8OeS4qp2rLMQW33pelCpNitP1N+fq03MFlDGzs5p7K4qMs4cA==} 161 + '@atcute/identity@1.1.3': 162 + resolution: {integrity: sha512-oIqPoI8TwWeQxvcLmFEZLdN2XdWcaLVtlm8pNk0E72As9HNzzD9pwKPrLr3rmTLRIoULPPFmq9iFNsTeCIU9ng==} 169 163 170 - '@atcute/leaflet@1.0.12': 171 - resolution: {integrity: sha512-T5laBTl8vwzy0eZXBy07IQSjsLqhbZmRJsffnNQ6XMSc+lnCZ/NHfuKy8TNJbDU6dc26Z7o5l0ELfWz5QESo+w==} 164 + '@atcute/lexicon-doc@2.0.1': 165 + resolution: {integrity: sha512-yWgcBYkvifczVODZSgdVkIljzIfdh50t+QXjkDL/FSu2RP43NGBEZ5xfZqJcT68/UoyE+doSg0dhvOEIlVGU/A==} 172 166 173 - '@atcute/lexicon-doc@1.3.0': 174 - resolution: {integrity: sha512-92mW9mBVXMbchF+aZP9L/5aziE+wyzHKc8LJH8rp0vabwni+ajkKlCk0otrneCKUB21RsNIRMk0zTbTRKRBXrA==} 175 - 176 - '@atcute/lexicon-resolver@0.1.3': 177 - resolution: {integrity: sha512-4AOS3KKm60GtBfl7ue/35xwZlylAuX5V2xmXnAmNoiN3vIauNkYawwRqgtni5q+EIV9R7p4D8tzkv58NaZ8fEQ==} 167 + '@atcute/lexicon-resolver@0.1.4': 168 + resolution: {integrity: sha512-8MAN3wrlP+PvyAbzHgzavaGeNNHq/r0LDEV4ABqDozHIZ2pcLR3O3J40UdiGW6ldeC/YciSkkmpl6f/zP3sXzw==} 178 169 peerDependencies: 179 170 '@atcute/identity': ^1.1.0 180 171 '@atcute/identity-resolver': ^1.1.3 181 172 182 - '@atcute/lexicons@1.2.3': 183 - resolution: {integrity: sha512-ZNfNWS4jaR8VgWSSBaWRSSmwFeP134BmvpTt9JmM2x5vRoXeIFthxU9USY8ZV4vm0GPoxEMgkDin8HIlnFTg2w==} 173 + '@atcute/lexicons@1.2.4': 174 + resolution: {integrity: sha512-s6fl/SVjQMv7jiitLCcZ434X+VrTsJt7Fl9iJg8WXHJIELRz/U0sNUoP++oWd7bvPy1Vcd2Wnm+YtTm/Zn7AIQ==} 184 175 185 176 '@atcute/mst@0.1.0': 186 177 resolution: {integrity: sha512-h+iDToKEnBpigk2DOHjSqY63vJtjYKUIztqu1CZ0P+I54wV2SrgoqAXAT1xrW6A1Iup8cjTv+U2H5WVG4KxPLw==} ··· 193 184 194 185 '@atcute/repo@0.1.0': 195 186 resolution: {integrity: sha512-INiYAuma8dydBu7cqd2WVpcXh3mzhIepYBUqFWAK5MqMulPRLTRCc/9GW3G9pxYrOdlvLCVamG2Jf8XK0nuFEw==} 196 - 197 - '@atcute/tangled@1.0.12': 198 - resolution: {integrity: sha512-JKA5sOhd8SLhDFhY+PKHqLLytQBBKSiwcaEzfYUJBeyfvqXFPNNAwvRbe3VST4IQ3izoOu3O0R9/b1mjL45UzA==} 199 187 200 188 '@atcute/tid@1.0.3': 201 189 resolution: {integrity: sha512-wfMJx1IMdnu0CZgWl0uR4JO2s6PGT1YPhpytD4ZHzEYKKQVuqV6Eb/7vieaVo1eYNMp2FrY67FZObeR7utRl2w==} ··· 294 282 resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 295 283 engines: {node: '>= 18'} 296 284 297 - '@codemirror/autocomplete@6.19.1': 298 - resolution: {integrity: sha512-q6NenYkEy2fn9+JyjIxMWcNjzTL/IhwqfzOut1/G3PrIFkrbl4AL7Wkse5tLrQUUyqGoAKU5+Pi5jnnXxH5HGw==} 285 + '@codemirror/autocomplete@6.20.0': 286 + resolution: {integrity: sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==} 299 287 300 288 '@codemirror/commands@6.10.0': 301 289 resolution: {integrity: sha512-2xUIc5mHXQzT16JnyOFkh8PvfeXuIut3pslWGfsGOhxP/lpgRm9HOl/mpzLErgt5mXDovqA0d11P21gofRLb9w==} ··· 634 622 '@codemirror/view': ^6.0.0 635 623 '@lezer/highlight': ^1.0.0 636 624 637 - '@iconify-json/lucide@1.2.73': 638 - resolution: {integrity: sha512-++HFkqDNu4jqG5+vYT+OcVj9OiuPCw9wQuh8G5QWQnBRSJ9eKwSStiU8ORgOoK07xJsm/0VIHySMniXUUXP9Gw==} 625 + '@iconify-json/lucide@1.2.74': 626 + resolution: {integrity: sha512-vDoGHcDZdWgUbt9J3TCJlxFzX/Mw0vUIAoZdkfI2mINOi1/cgVZHivgZ8QtiGlepskTL3PcG8t93Ky/vtQgXGA==} 639 627 640 628 '@iconify/tailwind4@1.1.0': 641 629 resolution: {integrity: sha512-HqgAYtYk4eFtLvdYfhQrBRT9ohToh+VJJVhHtJ7B4Qhw+J+mRPvGC9Wr6Cgtb36YbIWqBxWuBaAUw9TE/8m2/w==} ··· 688 676 '@noble/secp256k1@3.0.0': 689 677 resolution: {integrity: sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg==} 690 678 691 - '@rollup/rollup-android-arm-eabi@4.53.2': 692 - resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==} 679 + '@rollup/rollup-android-arm-eabi@4.53.3': 680 + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} 693 681 cpu: [arm] 694 682 os: [android] 695 683 696 - '@rollup/rollup-android-arm64@4.53.2': 697 - resolution: {integrity: sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==} 684 + '@rollup/rollup-android-arm64@4.53.3': 685 + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} 698 686 cpu: [arm64] 699 687 os: [android] 700 688 701 - '@rollup/rollup-darwin-arm64@4.53.2': 702 - resolution: {integrity: sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==} 689 + '@rollup/rollup-darwin-arm64@4.53.3': 690 + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} 703 691 cpu: [arm64] 704 692 os: [darwin] 705 693 706 - '@rollup/rollup-darwin-x64@4.53.2': 707 - resolution: {integrity: sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==} 694 + '@rollup/rollup-darwin-x64@4.53.3': 695 + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} 708 696 cpu: [x64] 709 697 os: [darwin] 710 698 711 - '@rollup/rollup-freebsd-arm64@4.53.2': 712 - resolution: {integrity: sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==} 699 + '@rollup/rollup-freebsd-arm64@4.53.3': 700 + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} 713 701 cpu: [arm64] 714 702 os: [freebsd] 715 703 716 - '@rollup/rollup-freebsd-x64@4.53.2': 717 - resolution: {integrity: sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==} 704 + '@rollup/rollup-freebsd-x64@4.53.3': 705 + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} 718 706 cpu: [x64] 719 707 os: [freebsd] 720 708 721 - '@rollup/rollup-linux-arm-gnueabihf@4.53.2': 722 - resolution: {integrity: sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==} 709 + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 710 + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} 723 711 cpu: [arm] 724 712 os: [linux] 725 713 726 - '@rollup/rollup-linux-arm-musleabihf@4.53.2': 727 - resolution: {integrity: sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==} 714 + '@rollup/rollup-linux-arm-musleabihf@4.53.3': 715 + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} 728 716 cpu: [arm] 729 717 os: [linux] 730 718 731 - '@rollup/rollup-linux-arm64-gnu@4.53.2': 732 - resolution: {integrity: sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==} 719 + '@rollup/rollup-linux-arm64-gnu@4.53.3': 720 + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} 733 721 cpu: [arm64] 734 722 os: [linux] 735 723 736 - '@rollup/rollup-linux-arm64-musl@4.53.2': 737 - resolution: {integrity: sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==} 724 + '@rollup/rollup-linux-arm64-musl@4.53.3': 725 + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} 738 726 cpu: [arm64] 739 727 os: [linux] 740 728 741 - '@rollup/rollup-linux-loong64-gnu@4.53.2': 742 - resolution: {integrity: sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==} 729 + '@rollup/rollup-linux-loong64-gnu@4.53.3': 730 + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} 743 731 cpu: [loong64] 744 732 os: [linux] 745 733 746 - '@rollup/rollup-linux-ppc64-gnu@4.53.2': 747 - resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} 734 + '@rollup/rollup-linux-ppc64-gnu@4.53.3': 735 + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} 748 736 cpu: [ppc64] 749 737 os: [linux] 750 738 751 - '@rollup/rollup-linux-riscv64-gnu@4.53.2': 752 - resolution: {integrity: sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==} 739 + '@rollup/rollup-linux-riscv64-gnu@4.53.3': 740 + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} 753 741 cpu: [riscv64] 754 742 os: [linux] 755 743 756 - '@rollup/rollup-linux-riscv64-musl@4.53.2': 757 - resolution: {integrity: sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==} 744 + '@rollup/rollup-linux-riscv64-musl@4.53.3': 745 + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} 758 746 cpu: [riscv64] 759 747 os: [linux] 760 748 761 - '@rollup/rollup-linux-s390x-gnu@4.53.2': 762 - resolution: {integrity: sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==} 749 + '@rollup/rollup-linux-s390x-gnu@4.53.3': 750 + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} 763 751 cpu: [s390x] 764 752 os: [linux] 765 753 766 - '@rollup/rollup-linux-x64-gnu@4.53.2': 767 - resolution: {integrity: sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==} 754 + '@rollup/rollup-linux-x64-gnu@4.53.3': 755 + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} 768 756 cpu: [x64] 769 757 os: [linux] 770 758 771 - '@rollup/rollup-linux-x64-musl@4.53.2': 772 - resolution: {integrity: sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==} 759 + '@rollup/rollup-linux-x64-musl@4.53.3': 760 + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} 773 761 cpu: [x64] 774 762 os: [linux] 775 763 776 - '@rollup/rollup-openharmony-arm64@4.53.2': 777 - resolution: {integrity: sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==} 764 + '@rollup/rollup-openharmony-arm64@4.53.3': 765 + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} 778 766 cpu: [arm64] 779 767 os: [openharmony] 780 768 781 - '@rollup/rollup-win32-arm64-msvc@4.53.2': 782 - resolution: {integrity: sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==} 769 + '@rollup/rollup-win32-arm64-msvc@4.53.3': 770 + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} 783 771 cpu: [arm64] 784 772 os: [win32] 785 773 786 - '@rollup/rollup-win32-ia32-msvc@4.53.2': 787 - resolution: {integrity: sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==} 774 + '@rollup/rollup-win32-ia32-msvc@4.53.3': 775 + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} 788 776 cpu: [ia32] 789 777 os: [win32] 790 778 791 - '@rollup/rollup-win32-x64-gnu@4.53.2': 792 - resolution: {integrity: sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==} 779 + '@rollup/rollup-win32-x64-gnu@4.53.3': 780 + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} 793 781 cpu: [x64] 794 782 os: [win32] 795 783 796 - '@rollup/rollup-win32-x64-msvc@4.53.2': 797 - resolution: {integrity: sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==} 784 + '@rollup/rollup-win32-x64-msvc@4.53.3': 785 + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} 798 786 cpu: [x64] 799 787 os: [win32] 800 788 ··· 957 945 solid-js: 958 946 optional: true 959 947 960 - baseline-browser-mapping@2.8.28: 961 - resolution: {integrity: sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==} 948 + baseline-browser-mapping@2.8.30: 949 + resolution: {integrity: sha512-aTUKW4ptQhS64+v2d6IkPzymEzzhw+G0bA1g3uBRV3+ntkH+svttKseW5IOR4Ed6NUVKqnY7qT3dKvzQ7io4AA==} 962 950 hasBin: true 963 951 964 952 boolbase@1.0.0: ··· 976 964 resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 977 965 engines: {node: '>= 0.4'} 978 966 979 - caniuse-lite@1.0.30001755: 980 - resolution: {integrity: sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==} 967 + caniuse-lite@1.0.30001756: 968 + resolution: {integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==} 981 969 982 970 cheerio-select@2.1.0: 983 971 resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} ··· 1069 1057 resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 1070 1058 engines: {node: '>= 0.4'} 1071 1059 1072 - electron-to-chromium@1.5.254: 1073 - resolution: {integrity: sha512-DcUsWpVhv9svsKRxnSCZ86SjD+sp32SGidNB37KpqXJncp1mfUgKbHvBomE89WJDbfVKw1mdv5+ikrvd43r+Bg==} 1060 + electron-to-chromium@1.5.259: 1061 + resolution: {integrity: sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ==} 1074 1062 1075 1063 encoding-sniffer@0.2.1: 1076 1064 resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} ··· 1520 1508 resolve-pkg-maps@1.0.0: 1521 1509 resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1522 1510 1523 - rollup@4.53.2: 1524 - resolution: {integrity: sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==} 1511 + rollup@4.53.3: 1512 + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} 1525 1513 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1526 1514 hasBin: true 1527 1515 ··· 1617 1605 '@testing-library/jest-dom': 1618 1606 optional: true 1619 1607 1620 - vite@7.2.2: 1621 - resolution: {integrity: sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==} 1608 + vite@7.2.4: 1609 + resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==} 1622 1610 engines: {node: ^20.19.0 || >=22.12.0} 1623 1611 hasBin: true 1624 1612 peerDependencies: ··· 1703 1691 1704 1692 '@atcute/atproto@3.1.9': 1705 1693 dependencies: 1706 - '@atcute/lexicons': 1.2.3 1694 + '@atcute/lexicons': 1.2.4 1707 1695 1708 1696 '@atcute/bluesky@3.2.10': 1709 1697 dependencies: 1710 1698 '@atcute/atproto': 3.1.9 1711 - '@atcute/lexicons': 1.2.3 1699 + '@atcute/lexicons': 1.2.4 1712 1700 1713 1701 '@atcute/car@3.1.3': 1714 1702 dependencies: 1715 - '@atcute/cbor': 2.2.7 1703 + '@atcute/cbor': 2.2.8 1716 1704 '@atcute/cid': 2.2.6 1717 1705 '@atcute/uint8array': 1.0.5 1718 1706 '@atcute/varint': 1.0.3 ··· 1720 1708 1721 1709 '@atcute/car@5.0.0': 1722 1710 dependencies: 1723 - '@atcute/cbor': 2.2.7 1711 + '@atcute/cbor': 2.2.8 1724 1712 '@atcute/cid': 2.2.6 1725 1713 '@atcute/uint8array': 1.0.5 1726 1714 '@atcute/varint': 1.0.3 1727 1715 1728 - '@atcute/cbor@2.2.7': 1716 + '@atcute/cbor@2.2.8': 1729 1717 dependencies: 1730 1718 '@atcute/cid': 2.2.6 1731 1719 '@atcute/multibase': 1.1.6 ··· 1738 1726 1739 1727 '@atcute/client@4.0.5': 1740 1728 dependencies: 1741 - '@atcute/identity': 1.1.2 1742 - '@atcute/lexicons': 1.2.3 1729 + '@atcute/identity': 1.1.3 1730 + '@atcute/lexicons': 1.2.4 1743 1731 1744 1732 '@atcute/crypto@2.2.6': 1745 1733 dependencies: ··· 1749 1737 1750 1738 '@atcute/did-plc@0.2.0': 1751 1739 dependencies: 1752 - '@atcute/cbor': 2.2.7 1740 + '@atcute/cbor': 2.2.8 1753 1741 '@atcute/cid': 2.2.6 1754 1742 '@atcute/crypto': 2.2.6 1755 - '@atcute/identity': 1.1.2 1756 - '@atcute/lexicons': 1.2.3 1743 + '@atcute/identity': 1.1.3 1744 + '@atcute/lexicons': 1.2.4 1757 1745 '@atcute/multibase': 1.1.6 1758 1746 '@atcute/uint8array': 1.0.5 1759 1747 '@badrap/valita': 0.4.6 1760 1748 1761 - '@atcute/identity-resolver@1.1.4(@atcute/identity@1.1.2)': 1749 + '@atcute/identity-resolver@1.1.4(@atcute/identity@1.1.3)': 1762 1750 dependencies: 1763 - '@atcute/identity': 1.1.2 1764 - '@atcute/lexicons': 1.2.3 1751 + '@atcute/identity': 1.1.3 1752 + '@atcute/lexicons': 1.2.4 1765 1753 '@atcute/util-fetch': 1.0.3 1766 1754 '@badrap/valita': 0.4.6 1767 1755 1768 - '@atcute/identity@1.1.2': 1756 + '@atcute/identity@1.1.3': 1769 1757 dependencies: 1770 - '@atcute/lexicons': 1.2.3 1758 + '@atcute/lexicons': 1.2.4 1771 1759 '@badrap/valita': 0.4.6 1772 1760 1773 - '@atcute/leaflet@1.0.12': 1774 - dependencies: 1775 - '@atcute/atproto': 3.1.9 1776 - '@atcute/lexicons': 1.2.3 1777 - 1778 - '@atcute/lexicon-doc@1.3.0': 1761 + '@atcute/lexicon-doc@2.0.1': 1779 1762 dependencies: 1780 - '@atcute/lexicons': 1.2.3 1763 + '@atcute/identity': 1.1.3 1764 + '@atcute/lexicons': 1.2.4 1781 1765 '@badrap/valita': 0.4.6 1782 1766 1783 - '@atcute/lexicon-resolver@0.1.3(@atcute/identity-resolver@1.1.4(@atcute/identity@1.1.2))(@atcute/identity@1.1.2)': 1767 + '@atcute/lexicon-resolver@0.1.4(@atcute/identity-resolver@1.1.4(@atcute/identity@1.1.3))(@atcute/identity@1.1.3)': 1784 1768 dependencies: 1785 - '@atcute/car': 5.0.0 1786 - '@atcute/cbor': 2.2.7 1787 - '@atcute/cid': 2.2.6 1788 1769 '@atcute/crypto': 2.2.6 1789 - '@atcute/identity': 1.1.2 1790 - '@atcute/identity-resolver': 1.1.4(@atcute/identity@1.1.2) 1791 - '@atcute/lexicon-doc': 1.3.0 1792 - '@atcute/lexicons': 1.2.3 1770 + '@atcute/identity': 1.1.3 1771 + '@atcute/identity-resolver': 1.1.4(@atcute/identity@1.1.3) 1772 + '@atcute/lexicon-doc': 2.0.1 1773 + '@atcute/lexicons': 1.2.4 1793 1774 '@atcute/repo': 0.1.0 1794 - '@atcute/uint8array': 1.0.5 1795 1775 '@atcute/util-fetch': 1.0.3 1796 1776 '@badrap/valita': 0.4.6 1797 1777 1798 - '@atcute/lexicons@1.2.3': 1778 + '@atcute/lexicons@1.2.4': 1799 1779 dependencies: 1800 1780 '@standard-schema/spec': 1.0.0 1801 1781 esm-env: 1.2.2 1802 1782 1803 1783 '@atcute/mst@0.1.0': 1804 1784 dependencies: 1805 - '@atcute/cbor': 2.2.7 1785 + '@atcute/cbor': 2.2.8 1806 1786 '@atcute/cid': 2.2.6 1807 1787 '@atcute/uint8array': 1.0.5 1808 1788 ··· 1813 1793 '@atcute/oauth-browser-client@2.0.1': 1814 1794 dependencies: 1815 1795 '@atcute/client': 4.0.5 1816 - '@atcute/identity': 1.1.2 1817 - '@atcute/identity-resolver': 1.1.4(@atcute/identity@1.1.2) 1818 - '@atcute/lexicons': 1.2.3 1796 + '@atcute/identity': 1.1.3 1797 + '@atcute/identity-resolver': 1.1.4(@atcute/identity@1.1.3) 1798 + '@atcute/lexicons': 1.2.4 1819 1799 '@atcute/multibase': 1.1.6 1820 1800 '@atcute/uint8array': 1.0.5 1821 1801 nanoid: 5.1.6 ··· 1823 1803 '@atcute/repo@0.1.0': 1824 1804 dependencies: 1825 1805 '@atcute/car': 5.0.0 1826 - '@atcute/cbor': 2.2.7 1806 + '@atcute/cbor': 2.2.8 1827 1807 '@atcute/cid': 2.2.6 1828 1808 '@atcute/crypto': 2.2.6 1829 - '@atcute/lexicons': 1.2.3 1809 + '@atcute/lexicons': 1.2.4 1830 1810 '@atcute/mst': 0.1.0 1831 1811 '@atcute/uint8array': 1.0.5 1832 1812 1833 - '@atcute/tangled@1.0.12': 1834 - dependencies: 1835 - '@atcute/atproto': 3.1.9 1836 - '@atcute/lexicons': 1.2.3 1837 - 1838 1813 '@atcute/tid@1.0.3': {} 1839 1814 1840 1815 '@atcute/uint8array@1.0.5': {} ··· 1958 1933 1959 1934 '@badrap/valita@0.4.6': {} 1960 1935 1961 - '@codemirror/autocomplete@6.19.1': 1936 + '@codemirror/autocomplete@6.20.0': 1962 1937 dependencies: 1963 1938 '@codemirror/language': 6.11.3 1964 1939 '@codemirror/state': 6.5.2 ··· 2173 2148 '@codemirror/view': 6.38.8 2174 2149 '@lezer/highlight': 1.2.3 2175 2150 2176 - '@iconify-json/lucide@1.2.73': 2151 + '@iconify-json/lucide@1.2.74': 2177 2152 dependencies: 2178 2153 '@iconify/types': 2.0.0 2179 2154 ··· 2260 2235 2261 2236 '@noble/secp256k1@3.0.0': {} 2262 2237 2263 - '@rollup/rollup-android-arm-eabi@4.53.2': 2238 + '@rollup/rollup-android-arm-eabi@4.53.3': 2264 2239 optional: true 2265 2240 2266 - '@rollup/rollup-android-arm64@4.53.2': 2241 + '@rollup/rollup-android-arm64@4.53.3': 2267 2242 optional: true 2268 2243 2269 - '@rollup/rollup-darwin-arm64@4.53.2': 2244 + '@rollup/rollup-darwin-arm64@4.53.3': 2270 2245 optional: true 2271 2246 2272 - '@rollup/rollup-darwin-x64@4.53.2': 2247 + '@rollup/rollup-darwin-x64@4.53.3': 2273 2248 optional: true 2274 2249 2275 - '@rollup/rollup-freebsd-arm64@4.53.2': 2250 + '@rollup/rollup-freebsd-arm64@4.53.3': 2276 2251 optional: true 2277 2252 2278 - '@rollup/rollup-freebsd-x64@4.53.2': 2253 + '@rollup/rollup-freebsd-x64@4.53.3': 2279 2254 optional: true 2280 2255 2281 - '@rollup/rollup-linux-arm-gnueabihf@4.53.2': 2256 + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 2282 2257 optional: true 2283 2258 2284 - '@rollup/rollup-linux-arm-musleabihf@4.53.2': 2259 + '@rollup/rollup-linux-arm-musleabihf@4.53.3': 2285 2260 optional: true 2286 2261 2287 - '@rollup/rollup-linux-arm64-gnu@4.53.2': 2262 + '@rollup/rollup-linux-arm64-gnu@4.53.3': 2288 2263 optional: true 2289 2264 2290 - '@rollup/rollup-linux-arm64-musl@4.53.2': 2265 + '@rollup/rollup-linux-arm64-musl@4.53.3': 2291 2266 optional: true 2292 2267 2293 - '@rollup/rollup-linux-loong64-gnu@4.53.2': 2268 + '@rollup/rollup-linux-loong64-gnu@4.53.3': 2294 2269 optional: true 2295 2270 2296 - '@rollup/rollup-linux-ppc64-gnu@4.53.2': 2271 + '@rollup/rollup-linux-ppc64-gnu@4.53.3': 2297 2272 optional: true 2298 2273 2299 - '@rollup/rollup-linux-riscv64-gnu@4.53.2': 2274 + '@rollup/rollup-linux-riscv64-gnu@4.53.3': 2300 2275 optional: true 2301 2276 2302 - '@rollup/rollup-linux-riscv64-musl@4.53.2': 2277 + '@rollup/rollup-linux-riscv64-musl@4.53.3': 2303 2278 optional: true 2304 2279 2305 - '@rollup/rollup-linux-s390x-gnu@4.53.2': 2280 + '@rollup/rollup-linux-s390x-gnu@4.53.3': 2306 2281 optional: true 2307 2282 2308 - '@rollup/rollup-linux-x64-gnu@4.53.2': 2283 + '@rollup/rollup-linux-x64-gnu@4.53.3': 2309 2284 optional: true 2310 2285 2311 - '@rollup/rollup-linux-x64-musl@4.53.2': 2286 + '@rollup/rollup-linux-x64-musl@4.53.3': 2312 2287 optional: true 2313 2288 2314 - '@rollup/rollup-openharmony-arm64@4.53.2': 2289 + '@rollup/rollup-openharmony-arm64@4.53.3': 2315 2290 optional: true 2316 2291 2317 - '@rollup/rollup-win32-arm64-msvc@4.53.2': 2292 + '@rollup/rollup-win32-arm64-msvc@4.53.3': 2318 2293 optional: true 2319 2294 2320 - '@rollup/rollup-win32-ia32-msvc@4.53.2': 2295 + '@rollup/rollup-win32-ia32-msvc@4.53.3': 2321 2296 optional: true 2322 2297 2323 - '@rollup/rollup-win32-x64-gnu@4.53.2': 2298 + '@rollup/rollup-win32-x64-gnu@4.53.3': 2324 2299 optional: true 2325 2300 2326 - '@rollup/rollup-win32-x64-msvc@4.53.2': 2301 + '@rollup/rollup-win32-x64-msvc@4.53.3': 2327 2302 optional: true 2328 2303 2329 2304 '@skyware/firehose@0.5.2': 2330 2305 dependencies: 2331 2306 '@atcute/car': 3.1.3 2332 - '@atcute/cbor': 2.2.7 2307 + '@atcute/cbor': 2.2.8 2333 2308 nanoevents: 9.1.0 2334 2309 2335 2310 '@solidjs/meta@0.29.4(solid-js@1.9.10)': ··· 2403 2378 '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 2404 2379 '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 2405 2380 2406 - '@tailwindcss/vite@4.1.17(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2))': 2381 + '@tailwindcss/vite@4.1.17(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2))': 2407 2382 dependencies: 2408 2383 '@tailwindcss/node': 4.1.17 2409 2384 '@tailwindcss/oxide': 4.1.17 2410 2385 tailwindcss: 4.1.17 2411 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 2386 + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 2412 2387 2413 2388 '@trysound/sax@0.2.0': {} 2414 2389 ··· 2477 2452 optionalDependencies: 2478 2453 solid-js: 1.9.10 2479 2454 2480 - baseline-browser-mapping@2.8.28: {} 2455 + baseline-browser-mapping@2.8.30: {} 2481 2456 2482 2457 boolbase@1.0.0: {} 2483 2458 2484 2459 browserslist@4.28.0: 2485 2460 dependencies: 2486 - baseline-browser-mapping: 2.8.28 2487 - caniuse-lite: 1.0.30001755 2488 - electron-to-chromium: 1.5.254 2461 + baseline-browser-mapping: 2.8.30 2462 + caniuse-lite: 1.0.30001756 2463 + electron-to-chromium: 1.5.259 2489 2464 node-releases: 2.0.27 2490 2465 update-browserslist-db: 1.1.4(browserslist@4.28.0) 2491 2466 ··· 2496 2471 es-errors: 1.3.0 2497 2472 function-bind: 1.1.2 2498 2473 2499 - caniuse-lite@1.0.30001755: {} 2474 + caniuse-lite@1.0.30001756: {} 2500 2475 2501 2476 cheerio-select@2.1.0: 2502 2477 dependencies: ··· 2525 2500 2526 2501 codemirror@6.0.2: 2527 2502 dependencies: 2528 - '@codemirror/autocomplete': 6.19.1 2503 + '@codemirror/autocomplete': 6.20.0 2529 2504 '@codemirror/commands': 6.10.0 2530 2505 '@codemirror/language': 6.11.3 2531 2506 '@codemirror/lint': 6.9.2 ··· 2605 2580 es-errors: 1.3.0 2606 2581 gopd: 1.2.0 2607 2582 2608 - electron-to-chromium@1.5.254: {} 2583 + electron-to-chromium@1.5.259: {} 2609 2584 2610 2585 encoding-sniffer@0.2.1: 2611 2586 dependencies: ··· 3002 2977 resolve-pkg-maps@1.0.0: 3003 2978 optional: true 3004 2979 3005 - rollup@4.53.2: 2980 + rollup@4.53.3: 3006 2981 dependencies: 3007 2982 '@types/estree': 1.0.8 3008 2983 optionalDependencies: 3009 - '@rollup/rollup-android-arm-eabi': 4.53.2 3010 - '@rollup/rollup-android-arm64': 4.53.2 3011 - '@rollup/rollup-darwin-arm64': 4.53.2 3012 - '@rollup/rollup-darwin-x64': 4.53.2 3013 - '@rollup/rollup-freebsd-arm64': 4.53.2 3014 - '@rollup/rollup-freebsd-x64': 4.53.2 3015 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.2 3016 - '@rollup/rollup-linux-arm-musleabihf': 4.53.2 3017 - '@rollup/rollup-linux-arm64-gnu': 4.53.2 3018 - '@rollup/rollup-linux-arm64-musl': 4.53.2 3019 - '@rollup/rollup-linux-loong64-gnu': 4.53.2 3020 - '@rollup/rollup-linux-ppc64-gnu': 4.53.2 3021 - '@rollup/rollup-linux-riscv64-gnu': 4.53.2 3022 - '@rollup/rollup-linux-riscv64-musl': 4.53.2 3023 - '@rollup/rollup-linux-s390x-gnu': 4.53.2 3024 - '@rollup/rollup-linux-x64-gnu': 4.53.2 3025 - '@rollup/rollup-linux-x64-musl': 4.53.2 3026 - '@rollup/rollup-openharmony-arm64': 4.53.2 3027 - '@rollup/rollup-win32-arm64-msvc': 4.53.2 3028 - '@rollup/rollup-win32-ia32-msvc': 4.53.2 3029 - '@rollup/rollup-win32-x64-gnu': 4.53.2 3030 - '@rollup/rollup-win32-x64-msvc': 4.53.2 2984 + '@rollup/rollup-android-arm-eabi': 4.53.3 2985 + '@rollup/rollup-android-arm64': 4.53.3 2986 + '@rollup/rollup-darwin-arm64': 4.53.3 2987 + '@rollup/rollup-darwin-x64': 4.53.3 2988 + '@rollup/rollup-freebsd-arm64': 4.53.3 2989 + '@rollup/rollup-freebsd-x64': 4.53.3 2990 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 2991 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 2992 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 2993 + '@rollup/rollup-linux-arm64-musl': 4.53.3 2994 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 2995 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 2996 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 2997 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 2998 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 2999 + '@rollup/rollup-linux-x64-gnu': 4.53.3 3000 + '@rollup/rollup-linux-x64-musl': 4.53.3 3001 + '@rollup/rollup-openharmony-arm64': 4.53.3 3002 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 3003 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 3004 + '@rollup/rollup-win32-x64-gnu': 4.53.3 3005 + '@rollup/rollup-win32-x64-msvc': 4.53.3 3031 3006 fsevents: 2.3.3 3032 3007 3033 3008 safer-buffer@2.1.2: {} ··· 3111 3086 escalade: 3.2.0 3112 3087 picocolors: 1.1.1 3113 3088 3114 - vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)): 3089 + vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)): 3115 3090 dependencies: 3116 3091 '@babel/core': 7.28.5 3117 3092 '@types/babel__core': 7.20.5 ··· 3119 3094 merge-anything: 5.1.7 3120 3095 solid-js: 1.9.10 3121 3096 solid-refresh: 0.6.3(solid-js@1.9.10) 3122 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 3123 - vitefu: 1.1.1(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 3097 + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 3098 + vitefu: 1.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 3124 3099 transitivePeerDependencies: 3125 3100 - supports-color 3126 3101 3127 - vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2): 3102 + vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2): 3128 3103 dependencies: 3129 3104 esbuild: 0.25.12 3130 3105 fdir: 6.5.0(picomatch@4.0.3) 3131 3106 picomatch: 4.0.3 3132 3107 postcss: 8.5.6 3133 - rollup: 4.53.2 3108 + rollup: 4.53.3 3134 3109 tinyglobby: 0.2.15 3135 3110 optionalDependencies: 3136 3111 '@types/node': 24.10.1 ··· 3139 3114 lightningcss: 1.30.2 3140 3115 tsx: 4.19.2 3141 3116 3142 - vitefu@1.1.1(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)): 3117 + vitefu@1.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)): 3143 3118 optionalDependencies: 3144 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 3119 + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 3145 3120 3146 3121 w3c-keyname@2.2.8: {} 3147 3122
-94
src/utils/types/lexicons.ts
··· 1 - import { 2 - AppBskyActorProfile, 3 - AppBskyActorStatus, 4 - AppBskyFeedGenerator, 5 - AppBskyFeedLike, 6 - AppBskyFeedPost, 7 - AppBskyFeedPostgate, 8 - AppBskyFeedRepost, 9 - AppBskyFeedThreadgate, 10 - AppBskyGraphBlock, 11 - AppBskyGraphFollow, 12 - AppBskyGraphList, 13 - AppBskyGraphListblock, 14 - AppBskyGraphListitem, 15 - AppBskyGraphStarterpack, 16 - AppBskyGraphVerification, 17 - AppBskyLabelerService, 18 - ChatBskyActorDeclaration, 19 - } from "@atcute/bluesky"; 20 - import { 21 - PubLeafletComment, 22 - PubLeafletDocument, 23 - PubLeafletGraphSubscription, 24 - PubLeafletPublication, 25 - } from "@atcute/leaflet"; 26 - import { 27 - ShTangledActorProfile, 28 - ShTangledFeedStar, 29 - ShTangledGraphFollow, 30 - ShTangledKnot, 31 - ShTangledKnotMember, 32 - ShTangledPublicKey, 33 - ShTangledRepo, 34 - ShTangledRepoArtifact, 35 - ShTangledRepoIssue, 36 - ShTangledRepoIssueComment, 37 - ShTangledRepoIssueState, 38 - ShTangledRepoIssueStateClosed, 39 - ShTangledRepoIssueStateOpen, 40 - ShTangledRepoPull, 41 - ShTangledRepoPullComment, 42 - ShTangledRepoPullStatus, 43 - ShTangledRepoPullStatusClosed, 44 - ShTangledRepoPullStatusMerged, 45 - ShTangledRepoPullStatusOpen, 46 - } from "@atcute/tangled"; 47 - 48 - export const lexicons: Record<string, any> = { 49 - // Bluesky 50 - "app.bsky.actor.profile": AppBskyActorProfile.mainSchema, 51 - "app.bsky.actor.status": AppBskyActorStatus.mainSchema, 52 - "app.bsky.feed.generator": AppBskyFeedGenerator.mainSchema, 53 - "app.bsky.feed.like": AppBskyFeedLike.mainSchema, 54 - "app.bsky.feed.post": AppBskyFeedPost.mainSchema, 55 - "app.bsky.feed.postgate": AppBskyFeedPostgate.mainSchema, 56 - "app.bsky.feed.repost": AppBskyFeedRepost.mainSchema, 57 - "app.bsky.feed.threadgate": AppBskyFeedThreadgate.mainSchema, 58 - "app.bsky.graph.block": AppBskyGraphBlock.mainSchema, 59 - "app.bsky.graph.follow": AppBskyGraphFollow.mainSchema, 60 - "app.bsky.graph.list": AppBskyGraphList.mainSchema, 61 - "app.bsky.graph.listblock": AppBskyGraphListblock.mainSchema, 62 - "app.bsky.graph.listitem": AppBskyGraphListitem.mainSchema, 63 - "app.bsky.graph.starterpack": AppBskyGraphStarterpack.mainSchema, 64 - "app.bsky.graph.verification": AppBskyGraphVerification.mainSchema, 65 - "app.bsky.labeler.service": AppBskyLabelerService.mainSchema, 66 - "chat.bsky.actor.declaration": ChatBskyActorDeclaration.mainSchema, 67 - 68 - // Tangled 69 - "sh.tangled.actor.profile": ShTangledActorProfile.mainSchema, 70 - "sh.tangled.feed.star": ShTangledFeedStar.mainSchema, 71 - "sh.tangled.graph.follow": ShTangledGraphFollow.mainSchema, 72 - "sh.tangled.knot.member": ShTangledKnotMember.mainSchema, 73 - "sh.tangled.publicKey": ShTangledPublicKey.mainSchema, 74 - "sh.tangled.repo": ShTangledRepo.mainSchema, 75 - "sh.tangled.repo.artifact": ShTangledRepoArtifact.mainSchema, 76 - "sh.tangled.repo.issue": ShTangledRepoIssue.mainSchema, 77 - "sh.tangled.repo.issue.comment": ShTangledRepoIssueComment.mainSchema, 78 - "sh.tangled.repo.issue.state": ShTangledRepoIssueState.mainSchema, 79 - "sh.tangled.repo.issue.state.closed": ShTangledRepoIssueStateClosed.mainSchema, 80 - "sh.tangled.repo.issue.state.open": ShTangledRepoIssueStateOpen.mainSchema, 81 - "sh.tangled.repo.pull": ShTangledRepoPull.mainSchema, 82 - "sh.tangled.repo.pull.comment": ShTangledRepoPullComment.mainSchema, 83 - "sh.tangled.repo.pull.status": ShTangledRepoPullStatus.mainSchema, 84 - "sh.tangled.repo.pull.status.closed": ShTangledRepoPullStatusClosed.mainSchema, 85 - "sh.tangled.repo.pull.status.merged": ShTangledRepoPullStatusMerged.mainSchema, 86 - "sh.tangled.repo.pull.status.open": ShTangledRepoPullStatusOpen.mainSchema, 87 - "sh.tangled.knot": ShTangledKnot.mainSchema, 88 - 89 - // Leaflet 90 - "pub.leaflet.comment": PubLeafletComment.mainSchema, 91 - "pub.leaflet.document": PubLeafletDocument.mainSchema, 92 - "pub.leaflet.graph.subscription": PubLeafletGraphSubscription.mainSchema, 93 - "pub.leaflet.publication": PubLeafletPublication.mainSchema, 94 - };
+146 -36
src/views/record.tsx
··· 1 1 import { Client, CredentialManager } from "@atcute/client"; 2 2 import { lexiconDoc } from "@atcute/lexicon-doc"; 3 + import { RecordValidator } from "@atcute/lexicon-doc/validations"; 3 4 import { ResolvedSchema } from "@atcute/lexicon-resolver"; 4 - import { ActorIdentifier, is, Nsid, ResourceUri } from "@atcute/lexicons"; 5 - import { AtprotoDid, Did } from "@atcute/lexicons/syntax"; 5 + import { ActorIdentifier, Nsid } from "@atcute/lexicons"; 6 + import { AtprotoDid, Did, isNsid } from "@atcute/lexicons/syntax"; 6 7 import { verifyRecord } from "@atcute/repo"; 7 8 import { A, useLocation, useNavigate, useParams } from "@solidjs/router"; 8 - import { createResource, createSignal, ErrorBoundary, Show, Suspense } from "solid-js"; 9 + import { 10 + createEffect, 11 + createResource, 12 + createSignal, 13 + ErrorBoundary, 14 + Show, 15 + Suspense, 16 + } from "solid-js"; 9 17 import { Backlinks } from "../components/backlinks.jsx"; 10 18 import { Button } from "../components/button.jsx"; 11 19 import { RecordEditor, setPlaceholder } from "../components/create.jsx"; ··· 25 33 import Tooltip from "../components/tooltip.jsx"; 26 34 import { resolveLexiconAuthority, resolveLexiconSchema, resolvePDS } from "../utils/api.js"; 27 35 import { AtUri, uriTemplates } from "../utils/templates.js"; 28 - import { lexicons } from "../utils/types/lexicons.js"; 36 + 37 + const extractRefs = (obj: any): Nsid[] => { 38 + const refs: Set<string> = new Set(); 39 + 40 + const traverse = (value: any) => { 41 + if (!value || typeof value !== "object") return; 42 + 43 + if (value.type === "ref" && value.ref) { 44 + const ref = value.ref; 45 + if (!ref.startsWith("#")) { 46 + const nsid = ref.split("#")[0]; 47 + if (isNsid(nsid)) refs.add(nsid); 48 + } 49 + } 50 + 51 + if (value.type === "union" && Array.isArray(value.refs)) { 52 + for (const ref of value.refs) { 53 + if (!ref.startsWith("#")) { 54 + const nsid = ref.split("#")[0]; 55 + if (isNsid(nsid)) refs.add(nsid); 56 + } 57 + } 58 + } 59 + 60 + if (Array.isArray(value)) value.forEach(traverse); 61 + else Object.values(value).forEach(traverse); 62 + }; 63 + 64 + traverse(obj); 65 + return Array.from(refs) as Nsid[]; 66 + }; 67 + 68 + const resolveAllLexicons = async ( 69 + nsid: Nsid, 70 + depth: number = 0, 71 + resolved: Map<string, any> = new Map(), 72 + failed: Set<string> = new Set(), 73 + inFlight: Map<string, Promise<void>> = new Map(), 74 + ): Promise<{ resolved: Map<string, any>; failed: Set<string> }> => { 75 + if (depth >= 10) { 76 + console.warn(`Maximum recursion depth reached for ${nsid}`); 77 + return { resolved, failed }; 78 + } 79 + 80 + if (resolved.has(nsid) || failed.has(nsid)) return { resolved, failed }; 81 + 82 + if (inFlight.has(nsid)) { 83 + await inFlight.get(nsid); 84 + return { resolved, failed }; 85 + } 86 + 87 + const fetchPromise = (async () => { 88 + try { 89 + const authority = await resolveLexiconAuthority(nsid); 90 + const schema = await resolveLexiconSchema(authority, nsid); 91 + 92 + resolved.set(nsid, schema.rawSchema); 93 + 94 + const refs = extractRefs(schema.rawSchema); 95 + 96 + if (refs.length > 0) { 97 + await Promise.all( 98 + refs.map((ref) => resolveAllLexicons(ref, depth + 1, resolved, failed, inFlight)), 99 + ); 100 + } 101 + } catch (err) { 102 + console.error(`Failed to resolve lexicon ${nsid}:`, err); 103 + failed.add(nsid); 104 + } finally { 105 + inFlight.delete(nsid); 106 + } 107 + })(); 108 + 109 + inFlight.set(nsid, fetchPromise); 110 + await fetchPromise; 111 + 112 + return { resolved, failed }; 113 + }; 29 114 30 115 export const RecordView = () => { 31 116 const location = useLocation(); 32 117 const navigate = useNavigate(); 33 118 const params = useParams(); 34 119 const [openDelete, setOpenDelete] = createSignal(false); 35 - const [notice, setNotice] = createSignal(""); 120 + const [verifyError, setVerifyError] = createSignal(""); 121 + const [validationError, setValidationError] = createSignal(""); 36 122 const [externalLink, setExternalLink] = createSignal< 37 123 { label: string; link: string; icon?: string } | undefined 38 124 >(); ··· 59 145 }); 60 146 if (!res.ok) { 61 147 setValidRecord(false); 62 - setNotice(res.data.error); 148 + setVerifyError(res.data.error); 63 149 throw new Error(res.data.error); 64 150 } 65 151 setPlaceholder(res.data.value); 66 152 setExternalLink(checkUri(res.data.uri, res.data.value)); 67 153 resolveLexicon(params.collection as Nsid); 68 - verify(res.data); 69 154 70 155 return res.data; 71 156 }; 72 157 73 158 const [record, { refetch }] = createResource(fetchRecord); 74 159 75 - const verify = async (record: { 76 - uri: ResourceUri; 77 - value: Record<string, unknown>; 78 - cid?: string | undefined; 79 - }) => { 160 + const validateSchema = async (record: Record<string, unknown>) => { 80 161 try { 81 - if (params.collection && params.collection in lexicons) { 82 - if (is(lexicons[params.collection], record.value)) setValidSchema(true); 83 - else setValidSchema(false); 84 - } else if (params.collection === "com.atproto.lexicon.schema") { 162 + if (params.collection === "com.atproto.lexicon.schema") { 85 163 setLexiconNotFound(false); 86 - try { 87 - lexiconDoc.parse(record.value, { mode: "passthrough" }); 88 - setValidSchema(true); 89 - } catch (e) { 90 - console.error(e); 164 + lexiconDoc.parse(record, { mode: "passthrough" }); 165 + setValidSchema(true); 166 + } else { 167 + const { resolved, failed } = await resolveAllLexicons(params.collection as Nsid); 168 + 169 + if (failed.size > 0) { 170 + console.error(`Failed to resolve ${failed.size} documents:`, Array.from(failed)); 91 171 setValidSchema(false); 172 + setValidationError( 173 + `Unable to resolve lexicon documents: ${Array.from(failed).join(", ")}`, 174 + ); 175 + return; 92 176 } 177 + 178 + const lexiconDocs = Object.fromEntries(resolved); 179 + 180 + const validator = new RecordValidator(lexiconDocs, params.collection as Nsid); 181 + validator.parse({ 182 + key: params.rkey ?? null, 183 + object: record, 184 + }); 185 + 186 + setValidSchema(true); 93 187 } 188 + } catch (err: any) { 189 + console.error("Schema validation error:", err); 190 + setValidSchema(false); 191 + setValidationError(err.message || String(err)); 192 + } 193 + }; 94 194 195 + const verifyRecordIntegrity = async () => { 196 + try { 95 197 const { ok, data } = await rpc.get("com.atproto.sync.getRecord", { 96 198 params: { 97 199 did: did as Did, ··· 111 213 112 214 setValidRecord(true); 113 215 } catch (err: any) { 114 - console.error(err); 115 - setNotice(err.message); 216 + console.error("Record verification error:", err); 217 + setVerifyError(err.message); 116 218 setValidRecord(false); 117 219 } 118 220 }; 119 221 222 + createEffect(() => { 223 + if (location.hash === "#info" && record()) { 224 + if (validSchema() === undefined) validateSchema(record()!.value); 225 + if (validRecord() === undefined) verifyRecordIntegrity(); 226 + } 227 + }); 228 + 120 229 const resolveLexicon = async (nsid: Nsid) => { 121 230 try { 122 231 const authority = await resolveLexiconAuthority(nsid); ··· 158 267 return template(parsedUri, record); 159 268 }; 160 269 161 - const RecordTab = (props: { 162 - tab: "record" | "backlinks" | "info" | "schema"; 163 - label: string; 164 - error?: boolean; 165 - }) => { 270 + const RecordTab = (props: { tab: "record" | "backlinks" | "info" | "schema"; label: string }) => { 166 271 const isActive = () => { 167 272 if (!location.hash && props.tab === "record") return true; 168 273 if (location.hash === `#${props.tab}`) return true; ··· 182 287 > 183 288 {props.label} 184 289 </A> 185 - <Show when={props.error && (validRecord() === false || validSchema() === false)}> 186 - <span class="iconify lucide--x text-red-500 dark:text-red-400"></span> 187 - </Show> 188 290 </div> 189 291 ); 190 292 }; ··· 197 299 <RecordTab tab="record" label="Record" /> 198 300 <RecordTab tab="schema" label="Schema" /> 199 301 <RecordTab tab="backlinks" label="Backlinks" /> 200 - <RecordTab tab="info" label="Info" error /> 302 + <RecordTab tab="info" label="Info" /> 201 303 </div> 202 304 <div class="flex gap-0.5"> 203 305 <Show when={agent() && agent()?.sub === record()?.uri.split("/")[2]}> ··· 332 434 ></span> 333 435 </div> 334 436 <Show when={validRecord() === false}> 335 - <div class="wrap-break-word">{notice()}</div> 437 + <div class="wrap-break-word">{verifyError()}</div> 336 438 </Show> 337 439 </div> 338 - <Show when={validSchema() !== undefined}> 440 + <div> 339 441 <div class="flex items-center gap-1"> 340 442 <span class="iconify lucide--file-check"></span> 341 443 <p class="font-semibold">Schema validation</p> 342 444 <span 343 - class={`iconify ${validSchema() ? "lucide--check text-green-500 dark:text-green-400" : "lucide--x text-red-500 dark:text-red-400"}`} 445 + classList={{ 446 + "iconify lucide--check text-green-500 dark:text-green-400": 447 + validSchema() === true, 448 + "iconify lucide--x text-red-500 dark:text-red-400": validSchema() === false, 449 + "iconify lucide--loader-circle animate-spin": validSchema() === undefined, 450 + }} 344 451 ></span> 345 452 </div> 346 - </Show> 453 + <Show when={validSchema() === false}> 454 + <div class="wrap-break-word">{validationError()}</div> 455 + </Show> 456 + </div> 347 457 <Show when={lexiconUri()}> 348 458 <div> 349 459 <div class="flex items-center gap-1">