social bookmarking for atproto

[frontend] Move DID document resolver to dedicated function

hexmani.ac d05347b8 05a26cce

verified
Changed files
+691 -40
backend
+4 -1
backend/package.json
··· 9 9 "start": "node dist/src/main.js", 10 10 "lint": "npx eslint .", 11 11 "lint-write": "npx eslint . --fix", 12 + "test": "vitest", 12 13 "fmt": "npx prettier --write .", 13 14 "db:push": "npx drizzle-kit push" 14 15 }, ··· 20 21 "dependencies": { 21 22 "@atcute/atproto": "^3.1.2", 22 23 "@atcute/client": "^4.0.3", 24 + "@atcute/crypto": "^2.2.4", 23 25 "@atcute/identity": "^1.0.3", 24 26 "@atcute/identity-resolver": "^1.1.3", 25 27 "@atcute/lexicon-doc": "^1.0.3", ··· 54 56 "prettier": "^3.6.2", 55 57 "tsx": "^4.20.4", 56 58 "typescript": "^5.9.2", 57 - "typescript-eslint": "^8.40.0" 59 + "typescript-eslint": "^8.40.0", 60 + "vitest": "^3.2.4" 58 61 } 59 62 }
+630
backend/pnpm-lock.yaml
··· 14 14 '@atcute/client': 15 15 specifier: ^4.0.3 16 16 version: 4.0.3 17 + '@atcute/crypto': 18 + specifier: ^2.2.4 19 + version: 2.2.4 17 20 '@atcute/identity': 18 21 specifier: ^1.0.3 19 22 version: 1.0.3 ··· 114 117 typescript-eslint: 115 118 specifier: ^8.40.0 116 119 version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 120 + vitest: 121 + specifier: ^3.2.4 122 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 117 123 118 124 packages: 119 125 ··· 125 131 126 132 '@atcute/client@4.0.3': 127 133 resolution: {integrity: sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==} 134 + 135 + '@atcute/crypto@2.2.4': 136 + resolution: {integrity: sha512-88LbuJr63bbdJywd949YgbEiaaW4UU5iXJcFE1WqY/5ItYuoHWVdmL3XsqehiM0AfzvrYEfd5ox2wm9CK9dyQQ==} 128 137 129 138 '@atcute/identity-resolver@1.1.3': 130 139 resolution: {integrity: sha512-KZgGgg99CWaV7Df3+h3X/WMrDzTPQVfsaoIVbTNLx2B56BvCL2EmaxPSVw/7BFUJMZHlVU4rtoEB4lyvNyMswA==} ··· 143 152 144 153 '@atcute/lexicons@1.1.1': 145 154 resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==} 155 + 156 + '@atcute/multibase@1.1.5': 157 + resolution: {integrity: sha512-vbmEFxgpntMuRqVZOCBgf6bgq69UGrlznQCZirVSit/mlcgyFVkSGbSEfkRnpIcrM8SnaySwuKbVvL+EPLh2dw==} 158 + 159 + '@atcute/uint8array@1.0.4': 160 + resolution: {integrity: sha512-9jASMDghzhhDwjF3+eW+ZIauvytnUWDPfUVGUValRwnf9AZ7Yqqkc76tC89HVzVDAlJdhwQIUG2dQBsiVqumUA==} 146 161 147 162 '@atcute/util-fetch@1.0.1': 148 163 resolution: {integrity: sha512-Clc0E/5ufyGBVfYBUwWNlHONlZCoblSr4Ho50l1LhmRPGB1Wu/AQ9Sz+rsBg7fdaW/auve8ulmwhRhnX2cGRow==} ··· 668 683 '@neon-rs/load@0.0.4': 669 684 resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} 670 685 686 + '@noble/secp256k1@2.3.0': 687 + resolution: {integrity: sha512-0TQed2gcBbIrh7Ccyw+y/uZQvbJwm7Ao4scBUxqpBCcsOlZG0O4KGfjtNAy/li4W8n1xt3dxrwJ0beZ2h2G6Kw==} 688 + 671 689 '@nodelib/fs.scandir@2.1.5': 672 690 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 673 691 engines: {node: '>= 8'} ··· 687 705 resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} 688 706 engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 689 707 708 + '@rollup/rollup-android-arm-eabi@4.50.0': 709 + resolution: {integrity: sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==} 710 + cpu: [arm] 711 + os: [android] 712 + 713 + '@rollup/rollup-android-arm64@4.50.0': 714 + resolution: {integrity: sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==} 715 + cpu: [arm64] 716 + os: [android] 717 + 718 + '@rollup/rollup-darwin-arm64@4.50.0': 719 + resolution: {integrity: sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==} 720 + cpu: [arm64] 721 + os: [darwin] 722 + 723 + '@rollup/rollup-darwin-x64@4.50.0': 724 + resolution: {integrity: sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==} 725 + cpu: [x64] 726 + os: [darwin] 727 + 728 + '@rollup/rollup-freebsd-arm64@4.50.0': 729 + resolution: {integrity: sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==} 730 + cpu: [arm64] 731 + os: [freebsd] 732 + 733 + '@rollup/rollup-freebsd-x64@4.50.0': 734 + resolution: {integrity: sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==} 735 + cpu: [x64] 736 + os: [freebsd] 737 + 738 + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': 739 + resolution: {integrity: sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==} 740 + cpu: [arm] 741 + os: [linux] 742 + 743 + '@rollup/rollup-linux-arm-musleabihf@4.50.0': 744 + resolution: {integrity: sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==} 745 + cpu: [arm] 746 + os: [linux] 747 + 748 + '@rollup/rollup-linux-arm64-gnu@4.50.0': 749 + resolution: {integrity: sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==} 750 + cpu: [arm64] 751 + os: [linux] 752 + 753 + '@rollup/rollup-linux-arm64-musl@4.50.0': 754 + resolution: {integrity: sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==} 755 + cpu: [arm64] 756 + os: [linux] 757 + 758 + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': 759 + resolution: {integrity: sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==} 760 + cpu: [loong64] 761 + os: [linux] 762 + 763 + '@rollup/rollup-linux-ppc64-gnu@4.50.0': 764 + resolution: {integrity: sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==} 765 + cpu: [ppc64] 766 + os: [linux] 767 + 768 + '@rollup/rollup-linux-riscv64-gnu@4.50.0': 769 + resolution: {integrity: sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==} 770 + cpu: [riscv64] 771 + os: [linux] 772 + 773 + '@rollup/rollup-linux-riscv64-musl@4.50.0': 774 + resolution: {integrity: sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==} 775 + cpu: [riscv64] 776 + os: [linux] 777 + 778 + '@rollup/rollup-linux-s390x-gnu@4.50.0': 779 + resolution: {integrity: sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==} 780 + cpu: [s390x] 781 + os: [linux] 782 + 783 + '@rollup/rollup-linux-x64-gnu@4.50.0': 784 + resolution: {integrity: sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==} 785 + cpu: [x64] 786 + os: [linux] 787 + 788 + '@rollup/rollup-linux-x64-musl@4.50.0': 789 + resolution: {integrity: sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==} 790 + cpu: [x64] 791 + os: [linux] 792 + 793 + '@rollup/rollup-openharmony-arm64@4.50.0': 794 + resolution: {integrity: sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==} 795 + cpu: [arm64] 796 + os: [openharmony] 797 + 798 + '@rollup/rollup-win32-arm64-msvc@4.50.0': 799 + resolution: {integrity: sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==} 800 + cpu: [arm64] 801 + os: [win32] 802 + 803 + '@rollup/rollup-win32-ia32-msvc@4.50.0': 804 + resolution: {integrity: sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==} 805 + cpu: [ia32] 806 + os: [win32] 807 + 808 + '@rollup/rollup-win32-x64-msvc@4.50.0': 809 + resolution: {integrity: sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==} 810 + cpu: [x64] 811 + os: [win32] 812 + 690 813 '@rtsao/scc@1.1.0': 691 814 resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} 692 815 ··· 782 905 peerDependencies: 783 906 vue: ^2.7.0 || ^3.0.0 784 907 908 + '@types/chai@5.2.2': 909 + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} 910 + 785 911 '@types/debug@4.1.12': 786 912 resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} 913 + 914 + '@types/deep-eql@4.0.2': 915 + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 787 916 788 917 '@types/estree@1.0.8': 789 918 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} ··· 885 1014 886 1015 '@ungap/structured-clone@1.3.0': 887 1016 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 1017 + 1018 + '@vitest/expect@3.2.4': 1019 + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} 1020 + 1021 + '@vitest/mocker@3.2.4': 1022 + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} 1023 + peerDependencies: 1024 + msw: ^2.4.9 1025 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 1026 + peerDependenciesMeta: 1027 + msw: 1028 + optional: true 1029 + vite: 1030 + optional: true 1031 + 1032 + '@vitest/pretty-format@3.2.4': 1033 + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} 1034 + 1035 + '@vitest/runner@3.2.4': 1036 + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} 1037 + 1038 + '@vitest/snapshot@3.2.4': 1039 + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} 1040 + 1041 + '@vitest/spy@3.2.4': 1042 + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} 1043 + 1044 + '@vitest/utils@3.2.4': 1045 + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} 888 1046 889 1047 '@vue/compiler-core@3.5.19': 890 1048 resolution: {integrity: sha512-/afpyvlkrSNYbPo94Qu8GtIOWS+g5TRdOvs6XZNw6pWQQmj5pBgSZvEPOIZlqWq0YvoUhDDQaQ2TnzuJdOV4hA==} ··· 1000 1158 resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 1001 1159 engines: {node: '>= 0.4'} 1002 1160 1161 + assertion-error@2.0.1: 1162 + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 1163 + engines: {node: '>=12'} 1164 + 1003 1165 async-function@1.0.0: 1004 1166 resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 1005 1167 engines: {node: '>= 0.4'} ··· 1032 1194 1033 1195 bun-types@1.2.17: 1034 1196 resolution: {integrity: sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ==} 1197 + 1198 + cac@6.7.14: 1199 + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1200 + engines: {node: '>=8'} 1035 1201 1036 1202 call-bind-apply-helpers@1.0.2: 1037 1203 resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} ··· 1055 1221 ccount@2.0.1: 1056 1222 resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 1057 1223 1224 + chai@5.3.3: 1225 + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} 1226 + engines: {node: '>=18'} 1227 + 1058 1228 chalk@4.1.2: 1059 1229 resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1060 1230 engines: {node: '>=10'} ··· 1071 1241 1072 1242 character-entities@2.0.2: 1073 1243 resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 1244 + 1245 + check-error@2.1.1: 1246 + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 1247 + engines: {node: '>= 16'} 1074 1248 1075 1249 clean-css@5.3.3: 1076 1250 resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} ··· 1175 1349 1176 1350 decode-named-character-reference@1.2.0: 1177 1351 resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} 1352 + 1353 + deep-eql@5.0.2: 1354 + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 1355 + engines: {node: '>=6'} 1178 1356 1179 1357 deep-is@0.1.4: 1180 1358 resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} ··· 1331 1509 resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 1332 1510 engines: {node: '>= 0.4'} 1333 1511 1512 + es-module-lexer@1.7.0: 1513 + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 1514 + 1334 1515 es-object-atoms@1.1.1: 1335 1516 resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 1336 1517 engines: {node: '>= 0.4'} ··· 1473 1654 estree-walker@2.0.2: 1474 1655 resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1475 1656 1657 + estree-walker@3.0.3: 1658 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1659 + 1476 1660 esutils@2.0.3: 1477 1661 resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1478 1662 engines: {node: '>=0.10.0'} 1479 1663 1480 1664 event-target-polyfill@0.0.4: 1481 1665 resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} 1666 + 1667 + expect-type@1.2.2: 1668 + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} 1669 + engines: {node: '>=12.0.0'} 1482 1670 1483 1671 extend@3.0.2: 1484 1672 resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} ··· 1504 1692 1505 1693 fastq@1.19.1: 1506 1694 resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 1695 + 1696 + fdir@6.5.0: 1697 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 1698 + engines: {node: '>=12.0.0'} 1699 + peerDependencies: 1700 + picomatch: ^3 || ^4 1701 + peerDependenciesMeta: 1702 + picomatch: 1703 + optional: true 1507 1704 1508 1705 fecha@4.2.3: 1509 1706 resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} ··· 1871 2068 js-base64@3.7.8: 1872 2069 resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} 1873 2070 2071 + js-tokens@9.0.1: 2072 + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 2073 + 1874 2074 js-yaml@4.1.0: 1875 2075 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1876 2076 hasBin: true ··· 1937 2137 1938 2138 longest-streak@3.1.0: 1939 2139 resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 2140 + 2141 + loupe@3.2.1: 2142 + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} 1940 2143 1941 2144 lower-case@2.0.2: 1942 2145 resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} ··· 2196 2399 path-parse@1.0.7: 2197 2400 resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2198 2401 2402 + pathe@2.0.3: 2403 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 2404 + 2405 + pathval@2.0.1: 2406 + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} 2407 + engines: {node: '>= 14.16'} 2408 + 2199 2409 picocolors@1.1.1: 2200 2410 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 2201 2411 2202 2412 picomatch@2.3.1: 2203 2413 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2204 2414 engines: {node: '>=8.6'} 2415 + 2416 + picomatch@4.0.3: 2417 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 2418 + engines: {node: '>=12'} 2205 2419 2206 2420 possible-typed-array-names@1.1.0: 2207 2421 resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} ··· 2321 2535 resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 2322 2536 engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2323 2537 2538 + rollup@4.50.0: 2539 + resolution: {integrity: sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==} 2540 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2541 + hasBin: true 2542 + 2324 2543 run-parallel@1.2.0: 2325 2544 resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2326 2545 ··· 2391 2610 resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 2392 2611 engines: {node: '>= 0.4'} 2393 2612 2613 + siginfo@2.0.0: 2614 + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 2615 + 2394 2616 simple-swizzle@0.2.2: 2395 2617 resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 2396 2618 ··· 2410 2632 2411 2633 stack-trace@0.0.10: 2412 2634 resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} 2635 + 2636 + stackback@0.0.2: 2637 + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 2638 + 2639 + std-env@3.9.0: 2640 + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 2413 2641 2414 2642 stop-iteration-iterator@1.1.0: 2415 2643 resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} ··· 2445 2673 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2446 2674 engines: {node: '>=8'} 2447 2675 2676 + strip-literal@3.0.0: 2677 + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} 2678 + 2448 2679 supports-color@7.2.0: 2449 2680 resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2450 2681 engines: {node: '>=8'} ··· 2471 2702 tiny-emitter@2.1.0: 2472 2703 resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} 2473 2704 2705 + tinybench@2.9.0: 2706 + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 2707 + 2708 + tinyexec@0.3.2: 2709 + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 2710 + 2711 + tinyglobby@0.2.15: 2712 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 2713 + engines: {node: '>=12.0.0'} 2714 + 2715 + tinypool@1.1.1: 2716 + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} 2717 + engines: {node: ^18.0.0 || >=20.0.0} 2718 + 2719 + tinyrainbow@2.0.0: 2720 + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 2721 + engines: {node: '>=14.0.0'} 2722 + 2723 + tinyspy@4.0.3: 2724 + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} 2725 + engines: {node: '>=14.0.0'} 2726 + 2474 2727 to-regex-range@5.0.1: 2475 2728 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2476 2729 engines: {node: '>=8.0'} ··· 2598 2851 vfile@6.0.3: 2599 2852 resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 2600 2853 2854 + vite-node@3.2.4: 2855 + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} 2856 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 2857 + hasBin: true 2858 + 2859 + vite@7.1.4: 2860 + resolution: {integrity: sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==} 2861 + engines: {node: ^20.19.0 || >=22.12.0} 2862 + hasBin: true 2863 + peerDependencies: 2864 + '@types/node': ^20.19.0 || >=22.12.0 2865 + jiti: '>=1.21.0' 2866 + less: ^4.0.0 2867 + lightningcss: ^1.21.0 2868 + sass: ^1.70.0 2869 + sass-embedded: ^1.70.0 2870 + stylus: '>=0.54.8' 2871 + sugarss: ^5.0.0 2872 + terser: ^5.16.0 2873 + tsx: ^4.8.1 2874 + yaml: ^2.4.2 2875 + peerDependenciesMeta: 2876 + '@types/node': 2877 + optional: true 2878 + jiti: 2879 + optional: true 2880 + less: 2881 + optional: true 2882 + lightningcss: 2883 + optional: true 2884 + sass: 2885 + optional: true 2886 + sass-embedded: 2887 + optional: true 2888 + stylus: 2889 + optional: true 2890 + sugarss: 2891 + optional: true 2892 + terser: 2893 + optional: true 2894 + tsx: 2895 + optional: true 2896 + yaml: 2897 + optional: true 2898 + 2899 + vitest@3.2.4: 2900 + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} 2901 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 2902 + hasBin: true 2903 + peerDependencies: 2904 + '@edge-runtime/vm': '*' 2905 + '@types/debug': ^4.1.12 2906 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 2907 + '@vitest/browser': 3.2.4 2908 + '@vitest/ui': 3.2.4 2909 + happy-dom: '*' 2910 + jsdom: '*' 2911 + peerDependenciesMeta: 2912 + '@edge-runtime/vm': 2913 + optional: true 2914 + '@types/debug': 2915 + optional: true 2916 + '@types/node': 2917 + optional: true 2918 + '@vitest/browser': 2919 + optional: true 2920 + '@vitest/ui': 2921 + optional: true 2922 + happy-dom: 2923 + optional: true 2924 + jsdom: 2925 + optional: true 2926 + 2601 2927 vue-component-type-helpers@3.0.6: 2602 2928 resolution: {integrity: sha512-6CRM8X7EJqWCJOiKPvSLQG+hJPb/Oy2gyJx3pLjUEhY7PuaCthQu3e0zAGI1lqUBobrrk9IT0K8sG2GsCluxoQ==} 2603 2929 ··· 2651 2977 engines: {node: '>= 8'} 2652 2978 hasBin: true 2653 2979 2980 + why-is-node-running@2.3.0: 2981 + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 2982 + engines: {node: '>=8'} 2983 + hasBin: true 2984 + 2654 2985 winston-transport@4.9.0: 2655 2986 resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} 2656 2987 engines: {node: '>= 12.0.0'} ··· 2709 3040 '@atcute/identity': 1.0.3 2710 3041 '@atcute/lexicons': 1.1.1 2711 3042 3043 + '@atcute/crypto@2.2.4': 3044 + dependencies: 3045 + '@atcute/multibase': 1.1.5 3046 + '@atcute/uint8array': 1.0.4 3047 + '@noble/secp256k1': 2.3.0 3048 + 2712 3049 '@atcute/identity-resolver@1.1.3(@atcute/identity@1.0.3)': 2713 3050 dependencies: 2714 3051 '@atcute/identity': 1.0.3 ··· 2736 3073 '@atcute/lexicons@1.1.1': 2737 3074 dependencies: 2738 3075 esm-env: 1.2.2 3076 + 3077 + '@atcute/multibase@1.1.5': 3078 + dependencies: 3079 + '@atcute/uint8array': 1.0.4 3080 + 3081 + '@atcute/uint8array@1.0.4': {} 2739 3082 2740 3083 '@atcute/util-fetch@1.0.1': 2741 3084 dependencies: ··· 3130 3473 3131 3474 '@neon-rs/load@0.0.4': {} 3132 3475 3476 + '@noble/secp256k1@2.3.0': {} 3477 + 3133 3478 '@nodelib/fs.scandir@2.1.5': 3134 3479 dependencies: 3135 3480 '@nodelib/fs.stat': 2.0.5 ··· 3146 3491 3147 3492 '@pkgr/core@0.2.9': {} 3148 3493 3494 + '@rollup/rollup-android-arm-eabi@4.50.0': 3495 + optional: true 3496 + 3497 + '@rollup/rollup-android-arm64@4.50.0': 3498 + optional: true 3499 + 3500 + '@rollup/rollup-darwin-arm64@4.50.0': 3501 + optional: true 3502 + 3503 + '@rollup/rollup-darwin-x64@4.50.0': 3504 + optional: true 3505 + 3506 + '@rollup/rollup-freebsd-arm64@4.50.0': 3507 + optional: true 3508 + 3509 + '@rollup/rollup-freebsd-x64@4.50.0': 3510 + optional: true 3511 + 3512 + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': 3513 + optional: true 3514 + 3515 + '@rollup/rollup-linux-arm-musleabihf@4.50.0': 3516 + optional: true 3517 + 3518 + '@rollup/rollup-linux-arm64-gnu@4.50.0': 3519 + optional: true 3520 + 3521 + '@rollup/rollup-linux-arm64-musl@4.50.0': 3522 + optional: true 3523 + 3524 + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': 3525 + optional: true 3526 + 3527 + '@rollup/rollup-linux-ppc64-gnu@4.50.0': 3528 + optional: true 3529 + 3530 + '@rollup/rollup-linux-riscv64-gnu@4.50.0': 3531 + optional: true 3532 + 3533 + '@rollup/rollup-linux-riscv64-musl@4.50.0': 3534 + optional: true 3535 + 3536 + '@rollup/rollup-linux-s390x-gnu@4.50.0': 3537 + optional: true 3538 + 3539 + '@rollup/rollup-linux-x64-gnu@4.50.0': 3540 + optional: true 3541 + 3542 + '@rollup/rollup-linux-x64-musl@4.50.0': 3543 + optional: true 3544 + 3545 + '@rollup/rollup-openharmony-arm64@4.50.0': 3546 + optional: true 3547 + 3548 + '@rollup/rollup-win32-arm64-msvc@4.50.0': 3549 + optional: true 3550 + 3551 + '@rollup/rollup-win32-ia32-msvc@4.50.0': 3552 + optional: true 3553 + 3554 + '@rollup/rollup-win32-x64-msvc@4.50.0': 3555 + optional: true 3556 + 3149 3557 '@rtsao/scc@1.1.0': {} 3150 3558 3151 3559 '@scalar/code-highlight@0.1.9': ··· 3365 3773 '@tanstack/virtual-core': 3.13.12 3366 3774 vue: 3.5.19(typescript@5.9.2) 3367 3775 3776 + '@types/chai@5.2.2': 3777 + dependencies: 3778 + '@types/deep-eql': 4.0.2 3779 + 3368 3780 '@types/debug@4.1.12': 3369 3781 dependencies: 3370 3782 '@types/ms': 2.1.0 3783 + 3784 + '@types/deep-eql@4.0.2': {} 3371 3785 3372 3786 '@types/estree@1.0.8': {} 3373 3787 ··· 3500 3914 3501 3915 '@ungap/structured-clone@1.3.0': {} 3502 3916 3917 + '@vitest/expect@3.2.4': 3918 + dependencies: 3919 + '@types/chai': 5.2.2 3920 + '@vitest/spy': 3.2.4 3921 + '@vitest/utils': 3.2.4 3922 + chai: 5.3.3 3923 + tinyrainbow: 2.0.0 3924 + 3925 + '@vitest/mocker@3.2.4(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0))': 3926 + dependencies: 3927 + '@vitest/spy': 3.2.4 3928 + estree-walker: 3.0.3 3929 + magic-string: 0.30.18 3930 + optionalDependencies: 3931 + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 3932 + 3933 + '@vitest/pretty-format@3.2.4': 3934 + dependencies: 3935 + tinyrainbow: 2.0.0 3936 + 3937 + '@vitest/runner@3.2.4': 3938 + dependencies: 3939 + '@vitest/utils': 3.2.4 3940 + pathe: 2.0.3 3941 + strip-literal: 3.0.0 3942 + 3943 + '@vitest/snapshot@3.2.4': 3944 + dependencies: 3945 + '@vitest/pretty-format': 3.2.4 3946 + magic-string: 0.30.18 3947 + pathe: 2.0.3 3948 + 3949 + '@vitest/spy@3.2.4': 3950 + dependencies: 3951 + tinyspy: 4.0.3 3952 + 3953 + '@vitest/utils@3.2.4': 3954 + dependencies: 3955 + '@vitest/pretty-format': 3.2.4 3956 + loupe: 3.2.1 3957 + tinyrainbow: 2.0.0 3958 + 3503 3959 '@vue/compiler-core@3.5.19': 3504 3960 dependencies: 3505 3961 '@babel/parser': 7.28.3 ··· 3680 4136 get-intrinsic: 1.3.0 3681 4137 is-array-buffer: 3.0.5 3682 4138 4139 + assertion-error@2.0.1: {} 4140 + 3683 4141 async-function@1.0.0: {} 3684 4142 3685 4143 async@3.2.6: {} ··· 3711 4169 dependencies: 3712 4170 '@types/node': 24.3.0 3713 4171 optional: true 4172 + 4173 + cac@6.7.14: {} 3714 4174 3715 4175 call-bind-apply-helpers@1.0.2: 3716 4176 dependencies: ··· 3738 4198 3739 4199 ccount@2.0.1: {} 3740 4200 4201 + chai@5.3.3: 4202 + dependencies: 4203 + assertion-error: 2.0.1 4204 + check-error: 2.1.1 4205 + deep-eql: 5.0.2 4206 + loupe: 3.2.1 4207 + pathval: 2.0.1 4208 + 3741 4209 chalk@4.1.2: 3742 4210 dependencies: 3743 4211 ansi-styles: 4.3.0 ··· 3750 4218 character-entities-legacy@3.0.0: {} 3751 4219 3752 4220 character-entities@2.0.2: {} 4221 + 4222 + check-error@2.1.1: {} 3753 4223 3754 4224 clean-css@5.3.3: 3755 4225 dependencies: ··· 3843 4313 decode-named-character-reference@1.2.0: 3844 4314 dependencies: 3845 4315 character-entities: 2.0.2 4316 + 4317 + deep-eql@5.0.2: {} 3846 4318 3847 4319 deep-is@0.1.4: {} 3848 4320 ··· 3964 4436 3965 4437 es-errors@1.3.0: {} 3966 4438 4439 + es-module-lexer@1.7.0: {} 4440 + 3967 4441 es-object-atoms@1.1.1: 3968 4442 dependencies: 3969 4443 es-errors: 1.3.0 ··· 4185 4659 4186 4660 estree-walker@2.0.2: {} 4187 4661 4662 + estree-walker@3.0.3: 4663 + dependencies: 4664 + '@types/estree': 1.0.8 4665 + 4188 4666 esutils@2.0.3: {} 4189 4667 4190 4668 event-target-polyfill@0.0.4: {} 4669 + 4670 + expect-type@1.2.2: {} 4191 4671 4192 4672 extend@3.0.2: {} 4193 4673 ··· 4213 4693 dependencies: 4214 4694 reusify: 1.1.0 4215 4695 4696 + fdir@6.5.0(picomatch@4.0.3): 4697 + optionalDependencies: 4698 + picomatch: 4.0.3 4699 + 4216 4700 fecha@4.2.3: {} 4217 4701 4218 4702 fetch-blob@3.2.0: ··· 4658 5142 4659 5143 js-base64@3.7.8: {} 4660 5144 5145 + js-tokens@9.0.1: {} 5146 + 4661 5147 js-yaml@4.1.0: 4662 5148 dependencies: 4663 5149 argparse: 2.0.1 ··· 4726 5212 triple-beam: 1.4.1 4727 5213 4728 5214 longest-streak@3.1.0: {} 5215 + 5216 + loupe@3.2.1: {} 4729 5217 4730 5218 lower-case@2.0.2: 4731 5219 dependencies: ··· 5184 5672 5185 5673 path-parse@1.0.7: {} 5186 5674 5675 + pathe@2.0.3: {} 5676 + 5677 + pathval@2.0.1: {} 5678 + 5187 5679 picocolors@1.1.1: {} 5188 5680 5189 5681 picomatch@2.3.1: {} 5190 5682 5683 + picomatch@4.0.3: {} 5684 + 5191 5685 possible-typed-array-names@1.1.0: {} 5192 5686 5193 5687 postcss@8.5.6: ··· 5359 5853 5360 5854 reusify@1.1.0: {} 5361 5855 5856 + rollup@4.50.0: 5857 + dependencies: 5858 + '@types/estree': 1.0.8 5859 + optionalDependencies: 5860 + '@rollup/rollup-android-arm-eabi': 4.50.0 5861 + '@rollup/rollup-android-arm64': 4.50.0 5862 + '@rollup/rollup-darwin-arm64': 4.50.0 5863 + '@rollup/rollup-darwin-x64': 4.50.0 5864 + '@rollup/rollup-freebsd-arm64': 4.50.0 5865 + '@rollup/rollup-freebsd-x64': 4.50.0 5866 + '@rollup/rollup-linux-arm-gnueabihf': 4.50.0 5867 + '@rollup/rollup-linux-arm-musleabihf': 4.50.0 5868 + '@rollup/rollup-linux-arm64-gnu': 4.50.0 5869 + '@rollup/rollup-linux-arm64-musl': 4.50.0 5870 + '@rollup/rollup-linux-loongarch64-gnu': 4.50.0 5871 + '@rollup/rollup-linux-ppc64-gnu': 4.50.0 5872 + '@rollup/rollup-linux-riscv64-gnu': 4.50.0 5873 + '@rollup/rollup-linux-riscv64-musl': 4.50.0 5874 + '@rollup/rollup-linux-s390x-gnu': 4.50.0 5875 + '@rollup/rollup-linux-x64-gnu': 4.50.0 5876 + '@rollup/rollup-linux-x64-musl': 4.50.0 5877 + '@rollup/rollup-openharmony-arm64': 4.50.0 5878 + '@rollup/rollup-win32-arm64-msvc': 4.50.0 5879 + '@rollup/rollup-win32-ia32-msvc': 4.50.0 5880 + '@rollup/rollup-win32-x64-msvc': 4.50.0 5881 + fsevents: 2.3.3 5882 + 5362 5883 run-parallel@1.2.0: 5363 5884 dependencies: 5364 5885 queue-microtask: 1.2.3 ··· 5447 5968 side-channel-list: 1.0.0 5448 5969 side-channel-map: 1.0.1 5449 5970 side-channel-weakmap: 1.0.2 5971 + 5972 + siginfo@2.0.0: {} 5450 5973 5451 5974 simple-swizzle@0.2.2: 5452 5975 dependencies: ··· 5465 5988 5466 5989 stack-trace@0.0.10: {} 5467 5990 5991 + stackback@0.0.2: {} 5992 + 5993 + std-env@3.9.0: {} 5994 + 5468 5995 stop-iteration-iterator@1.1.0: 5469 5996 dependencies: 5470 5997 es-errors: 1.3.0 ··· 5512 6039 5513 6040 strip-json-comments@3.1.1: {} 5514 6041 6042 + strip-literal@3.0.0: 6043 + dependencies: 6044 + js-tokens: 9.0.1 6045 + 5515 6046 supports-color@7.2.0: 5516 6047 dependencies: 5517 6048 has-flag: 4.0.0 ··· 5535 6066 5536 6067 tiny-emitter@2.1.0: {} 5537 6068 6069 + tinybench@2.9.0: {} 6070 + 6071 + tinyexec@0.3.2: {} 6072 + 6073 + tinyglobby@0.2.15: 6074 + dependencies: 6075 + fdir: 6.5.0(picomatch@4.0.3) 6076 + picomatch: 4.0.3 6077 + 6078 + tinypool@1.1.1: {} 6079 + 6080 + tinyrainbow@2.0.0: {} 6081 + 6082 + tinyspy@4.0.3: {} 6083 + 5538 6084 to-regex-range@5.0.1: 5539 6085 dependencies: 5540 6086 is-number: 7.0.0 ··· 5695 6241 '@types/unist': 3.0.3 5696 6242 vfile-message: 4.0.3 5697 6243 6244 + vite-node@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0): 6245 + dependencies: 6246 + cac: 6.7.14 6247 + debug: 4.4.1 6248 + es-module-lexer: 1.7.0 6249 + pathe: 2.0.3 6250 + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 6251 + transitivePeerDependencies: 6252 + - '@types/node' 6253 + - jiti 6254 + - less 6255 + - lightningcss 6256 + - sass 6257 + - sass-embedded 6258 + - stylus 6259 + - sugarss 6260 + - supports-color 6261 + - terser 6262 + - tsx 6263 + - yaml 6264 + 6265 + vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0): 6266 + dependencies: 6267 + esbuild: 0.25.9 6268 + fdir: 6.5.0(picomatch@4.0.3) 6269 + picomatch: 4.0.3 6270 + postcss: 8.5.6 6271 + rollup: 4.50.0 6272 + tinyglobby: 0.2.15 6273 + optionalDependencies: 6274 + '@types/node': 24.3.0 6275 + fsevents: 2.3.3 6276 + jiti: 2.5.1 6277 + terser: 5.43.1 6278 + tsx: 4.20.4 6279 + yaml: 2.8.0 6280 + 6281 + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0): 6282 + dependencies: 6283 + '@types/chai': 5.2.2 6284 + '@vitest/expect': 3.2.4 6285 + '@vitest/mocker': 3.2.4(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0)) 6286 + '@vitest/pretty-format': 3.2.4 6287 + '@vitest/runner': 3.2.4 6288 + '@vitest/snapshot': 3.2.4 6289 + '@vitest/spy': 3.2.4 6290 + '@vitest/utils': 3.2.4 6291 + chai: 5.3.3 6292 + debug: 4.4.1 6293 + expect-type: 1.2.2 6294 + magic-string: 0.30.18 6295 + pathe: 2.0.3 6296 + picomatch: 4.0.3 6297 + std-env: 3.9.0 6298 + tinybench: 2.9.0 6299 + tinyexec: 0.3.2 6300 + tinyglobby: 0.2.15 6301 + tinypool: 1.1.1 6302 + tinyrainbow: 2.0.0 6303 + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 6304 + vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 6305 + why-is-node-running: 2.3.0 6306 + optionalDependencies: 6307 + '@types/debug': 4.1.12 6308 + '@types/node': 24.3.0 6309 + transitivePeerDependencies: 6310 + - jiti 6311 + - less 6312 + - lightningcss 6313 + - msw 6314 + - sass 6315 + - sass-embedded 6316 + - stylus 6317 + - sugarss 6318 + - supports-color 6319 + - terser 6320 + - tsx 6321 + - yaml 6322 + 5698 6323 vue-component-type-helpers@3.0.6: {} 5699 6324 5700 6325 vue-demi@0.14.10(vue@3.5.19(typescript@5.9.2)): ··· 5761 6386 which@2.0.2: 5762 6387 dependencies: 5763 6388 isexe: 2.0.0 6389 + 6390 + why-is-node-running@2.3.0: 6391 + dependencies: 6392 + siginfo: 2.0.0 6393 + stackback: 0.0.2 5764 6394 5765 6395 winston-transport@4.9.0: 5766 6396 dependencies:
+51
backend/src/api/did.ts
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import { 8 + CompositeDidDocumentResolver, 9 + DocumentNotFoundError, 10 + FailedDocumentResolutionError, 11 + HandleResolutionError, 12 + ImproperDidError, 13 + PlcDidDocumentResolver, 14 + UnsupportedDidMethodError, 15 + WebDidDocumentResolver, 16 + } from "@atcute/identity-resolver"; 17 + 18 + // Gets a DID document from a given DID. DID method agnostic. 19 + export async function getDidDocument( 20 + did: `did:plc:${string}` | `did:web:${string}`, 21 + ) { 22 + const docResolver = new CompositeDidDocumentResolver({ 23 + methods: { 24 + plc: new PlcDidDocumentResolver(), 25 + web: new WebDidDocumentResolver(), 26 + }, 27 + }); 28 + 29 + let doc; 30 + try { 31 + doc = await docResolver.resolve(did); 32 + } catch (err) { 33 + if (err instanceof DocumentNotFoundError) { 34 + throw new Error("Document not found"); 35 + } 36 + if (err instanceof UnsupportedDidMethodError) { 37 + throw new Error("Unsupported DID method"); 38 + } 39 + if (err instanceof ImproperDidError) { 40 + throw new Error("Invalid DID"); 41 + } 42 + if (err instanceof FailedDocumentResolutionError) { 43 + throw new Error("Failed document resolution"); 44 + } 45 + if (err instanceof HandleResolutionError) { 46 + throw new Error("Unknown resolution error"); 47 + } 48 + } 49 + 50 + return doc; 51 + }
+5 -38
backend/src/network/converters.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - import { 8 - CompositeDidDocumentResolver, 9 - DocumentNotFoundError, 10 - FailedDocumentResolutionError, 11 - HandleResolutionError, 12 - ImproperDidError, 13 - PlcDidDocumentResolver, 14 - UnsupportedDidMethodError, 15 - WebDidDocumentResolver, 16 - } from "@atcute/identity-resolver"; 17 7 import { Client, simpleFetchHandler } from "@atcute/client"; 8 + import { getDidDocument } from "../api/did.js"; 18 9 19 10 /// Converts an ``At.DID`` type to a proper string, for type reasons. 20 11 export function convertDidToString(did: `did:${string}`): string { ··· 31 22 } 32 23 } 33 24 34 - // Get a user's handle from their DID. DID method agnostic. 25 + // Get a user's handle from their DID. 26 + // 27 + // WARNING: Handle validation is not performed and is taken from the document as-is. Fix me! 35 28 export async function getHandleFromDid(did: string): Promise<string> { 36 - const docResolver = new CompositeDidDocumentResolver({ 37 - methods: { 38 - plc: new PlcDidDocumentResolver(), 39 - web: new WebDidDocumentResolver(), 40 - }, 41 - }); 42 - 43 - let doc; 44 - try { 45 - doc = await docResolver.resolve(convertStringToTypedDid(did)); 46 - } catch (err) { 47 - if (err instanceof DocumentNotFoundError) { 48 - throw new Error("Document not found"); 49 - } 50 - if (err instanceof UnsupportedDidMethodError) { 51 - throw new Error("Unsupported did method"); 52 - } 53 - if (err instanceof ImproperDidError) { 54 - throw new Error("Improper did"); 55 - } 56 - if (err instanceof FailedDocumentResolutionError) { 57 - throw new Error("Failed document resolution"); 58 - } 59 - if (err instanceof HandleResolutionError) { 60 - throw new Error("Generic handle resolution error"); 61 - } 62 - } 29 + const doc = await getDidDocument(convertStringToTypedDid(did)); 63 30 64 31 if (!doc?.alsoKnownAs) { 65 32 throw new Error("No handles found");
+1 -1
backend/src/routes/well-known.ts
··· 127 127 }); 128 128 }); 129 129 130 - app.get("/.well-known/did.json", (c) => { 130 + app.get("/.well-known/did.json", async (c) => { 131 131 if (serviceDid === undefined) { 132 132 return c.json( 133 133 {