personal web client for Bluesky
typescript solidjs bluesky atcute

Compare changes

Choose any two refs to compare.

Changed files
+2990 -3210
patches
public
src
api
components
bookmarks
composer
embeds
explore
feeds
lists
main
moderation
notifications
profiles
search
settings
threads
timeline
globals
lib
views
-13
.editorconfig
··· 1 - [*] 2 - charset = utf-8 3 - end_of_line = lf 4 - insert_final_newline = true 5 - indent_style = tab 6 - trim_trailing_whitespace = true 7 - 8 - [*.{yml,yaml}] 9 - indent_style = space 10 - 11 - [*.md] 12 - indent_style = space 13 - trim_trailing_whitespace = false
-2
.gitignore
··· 1 - /.wrangler/ 2 - 3 1 node_modules/ 4 2 dist/ 5 3
+2
.npmrc
··· 1 1 auto-install-peers=false 2 2 public-hoist-pattern[]=workbox-window 3 + 4 + @jsr:registry=https://npm.jsr.io
+10
mise.lock
··· 1 + [tools.node] 2 + version = "22.14.0" 3 + backend = "core:node" 4 + 5 + [tools.pnpm] 6 + version = "10.7.0" 7 + backend = "aqua:pnpm/pnpm" 8 + 9 + [tools.pnpm.checksums] 10 + pnpm-linux-x64 = "sha256:d1e8009b1ac8c54050efd969d4b6a96eae4fdc3e1ed138741eaf5699a85a16cf"
+6 -2
mise.toml
··· 1 1 [tools] 2 - node = "24.1.0" 3 - pnpm = "10.11.0" 2 + node = "lts" 3 + pnpm = "latest" 4 + 5 + [settings] 6 + experimental = true 7 + lockfile = true
+28 -34
package.json
··· 3 3 "private": true, 4 4 "scripts": { 5 5 "dev": "vite", 6 - "build": "tsc -b && vite build", 6 + "build": "vite build", 7 7 "preview": "vite preview", 8 - "fmt": "PRETTIER_EXPERIMENTAL_CLI=1 prettier --cache --write ." 8 + "fmt": "prettier --cache --write ." 9 9 }, 10 10 "dependencies": { 11 - "@atcute/atproto": "^3.1.0", 12 - "@atcute/bluemoji": "^3.1.0", 13 - "@atcute/bluesky": "^3.1.3", 11 + "@atcute/bluemoji": "^1.0.4", 12 + "@atcute/bluesky": "^1.0.15", 14 13 "@atcute/bluesky-richtext-parser": "^1.0.7", 15 - "@atcute/bluesky-richtext-segmenter": "^2.0.3", 14 + "@atcute/bluesky-richtext-segmenter": "^1.0.5", 16 15 "@atcute/bluesky-search-parser": "^0.1.0", 17 - "@atcute/cbor": "^2.2.4", 18 - "@atcute/cid": "^2.2.3", 19 - "@atcute/client": "^4.0.3", 20 - "@atcute/identity": "^1.1.0", 21 - "@atcute/lexicons": "^1.1.0", 22 - "@atcute/oauth-browser-client": "2.0.0-next.0", 16 + "@atcute/cbor": "^2.2.0", 17 + "@atcute/cid": "^2.2.0", 18 + "@atcute/client": "^2.0.9", 19 + "@atcute/oauth-browser-client": "^1.0.16", 23 20 "@atcute/tid": "^1.0.2", 24 - "@atlaskit/pragmatic-drag-and-drop": "1.6.0", 25 - "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.0.3", 26 - "@floating-ui/dom": "^1.7.1", 21 + "@atlaskit/pragmatic-drag-and-drop": "^1.5.2", 22 + "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3", 23 + "@floating-ui/dom": "^1.6.13", 27 24 "@floating-ui/utils": "^0.2.9", 28 - "@kelinci/basa-lexicons": "^1.0.0", 29 - "@mary/array-fns": "jsr:^0.1.4", 30 - "@mary/async-iterator-fns": "jsr:^0.1.1", 31 - "@mary/batch-fetch": "jsr:^0.1.0", 32 - "@mary/date-fns": "jsr:^0.1.3", 33 - "@mary/events": "jsr:^0.2.0", 34 - "@mary/exif-rm": "jsr:^0.2.2", 25 + "@mary/array-fns": "npm:@jsr/mary__array-fns@^0.1.4", 26 + "@mary/async-iterator-fns": "npm:@jsr/mary__async-iterator-fns@^0.1.1", 27 + "@mary/date-fns": "npm:@jsr/mary__date-fns@^0.1.3", 28 + "@mary/events": "npm:@jsr/mary__events@^0.2.0", 29 + "@mary/exif-rm": "npm:@jsr/mary__exif-rm@^0.2.2", 35 30 "@mary/solid-freeze": "npm:@externdefs/solid-freeze@^0.1.1", 36 31 "@mary/solid-query": "npm:@externdefs/solid-query@^0.1.5", 37 32 "comlink": "^4.4.2", 38 - "hls.js": "^1.6.5", 39 - "idb": "^8.0.3", 33 + "hls.js": "^1.6.0", 34 + "idb": "^8.0.2", 40 35 "nanoid": "^5.1.5", 41 36 "solid-floating-ui": "~0.2.1", 42 - "solid-js": "^1.9.7", 43 - "webm-muxer": "^5.1.3" 37 + "solid-js": "^1.9.5", 38 + "webm-muxer": "^5.1.1" 44 39 }, 45 40 "devDependencies": { 46 41 "@trivago/prettier-plugin-sort-imports": "^5.2.2", 47 42 "@types/dom-close-watcher": "^1.0.0", 48 - "@types/dom-webcodecs": "^0.1.15", 49 - "@types/node": "^24.3.0", 43 + "@types/dom-webcodecs": "^0.1.14", 50 44 "autoprefixer": "^10.4.21", 51 45 "babel-plugin-transform-typescript-const-enums": "^0.1.0", 52 - "prettier": "^3.6.0", 53 - "prettier-plugin-tailwindcss": "^0.6.13", 46 + "prettier": "^3.5.3", 47 + "prettier-plugin-tailwindcss": "^0.6.11", 54 48 "tailwindcss": "^3.4.17", 55 - "terser": "^5.43.1", 56 - "typescript": "~5.8.3", 57 - "vite": "^6.3.5", 49 + "terser": "^5.39.0", 50 + "typescript": "5.7.2", 51 + "vite": "6.0.5", 58 52 "vite-plugin-pwa": "0.21.0", 59 53 "vite-plugin-solid": "^2.11.6", 60 - "wrangler": "^4.20.5" 54 + "wrangler": "^4.6.0" 61 55 }, 62 56 "pnpm": { 63 57 "patchedDependencies": {
+17 -17
patches/solid-js.patch
··· 1 1 diff --git a/dist/solid.js b/dist/solid.js 2 - index a36e31312a461cdf9999e22aa893ef29162750c8..6de1f7f7d608e07baa9edbc6f0ee394f7f9b4411 100644 2 + index 2571609363d5758d32e2aa88489acca146a6d308..4a1e0bf4e523fb075340e0c2ccef0a4a9ab12f7f 100644 3 3 --- a/dist/solid.js 4 4 +++ b/dist/solid.js 5 - @@ -1468,7 +1468,6 @@ function Show(props) { 6 - const child = props.children; 7 - const fn = typeof child === "function" && child.length > 0; 8 - return fn ? untrack(() => child(keyed ? c : () => { 9 - - if (!untrack(condition)) throw narrowedError("Show"); 10 - return conditionValue(); 11 - })) : child; 12 - } 13 - @@ -1500,7 +1499,6 @@ function Switch(props) { 14 - const child = mp.children; 15 - const fn = typeof child === "function" && child.length > 0; 16 - return fn ? untrack(() => child(mp.keyed ? conditionValue() : () => { 17 - - if (untrack(switchFunc)()?.[0] !== index) throw narrowedError("Match"); 18 - return conditionValue(); 19 - })) : child; 20 - }, undefined, undefined); 5 + @@ -1581,7 +1581,6 @@ function Show(props) { 6 + keyed 7 + ? c 8 + : () => { 9 + - if (!untrack(condition)) throw narrowedError("Show"); 10 + return props.when; 11 + } 12 + ) 13 + @@ -1628,7 +1627,6 @@ function Switch(props) { 14 + keyed 15 + ? when 16 + : () => { 17 + - if (untrack(evalConditions)[0] !== index) throw narrowedError("Match"); 18 + return cond.when; 19 + } 20 + )
+1271 -1361
pnpm-lock.yaml
··· 17 17 hash: 0b06407b66b7af88765fb6e01e112677a8c09ce518cb4f547cee8a0044471acd 18 18 path: patches/@tanstack__query-core@5.17.19.patch 19 19 solid-js: 20 - hash: 9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7 20 + hash: 9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c 21 21 path: patches/solid-js.patch 22 22 vite-plugin-pwa: 23 23 hash: 003379ded749ad87080f87b428b17f04c4c88b6b64544df4d928aab76fbf6325 ··· 30 30 31 31 .: 32 32 dependencies: 33 - '@atcute/atproto': 34 - specifier: ^3.1.0 35 - version: 3.1.0 36 33 '@atcute/bluemoji': 37 - specifier: ^3.1.0 38 - version: 3.1.0 34 + specifier: ^1.0.4 35 + version: 1.0.4(@atcute/bluesky@1.0.15(@atcute/client@2.0.9))(@atcute/client@2.0.9) 39 36 '@atcute/bluesky': 40 - specifier: ^3.1.3 41 - version: 3.1.3 37 + specifier: ^1.0.15 38 + version: 1.0.15(@atcute/client@2.0.9) 42 39 '@atcute/bluesky-richtext-parser': 43 40 specifier: ^1.0.7 44 41 version: 1.0.7 45 42 '@atcute/bluesky-richtext-segmenter': 46 - specifier: ^2.0.3 47 - version: 2.0.3 43 + specifier: ^1.0.5 44 + version: 1.0.5(@atcute/bluesky@1.0.15(@atcute/client@2.0.9))(@atcute/client@2.0.9) 48 45 '@atcute/bluesky-search-parser': 49 46 specifier: ^0.1.0 50 47 version: 0.1.0 51 48 '@atcute/cbor': 52 - specifier: ^2.2.4 53 - version: 2.2.4 49 + specifier: ^2.2.0 50 + version: 2.2.0 54 51 '@atcute/cid': 55 - specifier: ^2.2.3 56 - version: 2.2.3 52 + specifier: ^2.2.0 53 + version: 2.2.0 57 54 '@atcute/client': 58 - specifier: ^4.0.3 59 - version: 4.0.3 60 - '@atcute/identity': 61 - specifier: ^1.1.0 62 - version: 1.1.0 63 - '@atcute/lexicons': 64 - specifier: ^1.1.0 65 - version: 1.1.0 55 + specifier: ^2.0.9 56 + version: 2.0.9 66 57 '@atcute/oauth-browser-client': 67 - specifier: 2.0.0-next.0 68 - version: 2.0.0-next.0 58 + specifier: ^1.0.16 59 + version: 1.0.16 69 60 '@atcute/tid': 70 61 specifier: ^1.0.2 71 62 version: 1.0.2 72 63 '@atlaskit/pragmatic-drag-and-drop': 73 - specifier: 1.6.0 74 - version: 1.6.0 64 + specifier: ^1.5.2 65 + version: 1.5.2 75 66 '@atlaskit/pragmatic-drag-and-drop-hitbox': 76 - specifier: 1.0.3 67 + specifier: ^1.0.3 77 68 version: 1.0.3 78 69 '@floating-ui/dom': 79 - specifier: ^1.7.1 80 - version: 1.7.1 70 + specifier: ^1.6.13 71 + version: 1.6.13 81 72 '@floating-ui/utils': 82 73 specifier: ^0.2.9 83 74 version: 0.2.9(patch_hash=1cf283fbaa686f96f7b3029bbc0955bff698af6f4a75ba6c276ad1a7a7c40aea) 84 - '@kelinci/basa-lexicons': 85 - specifier: ^1.0.0 86 - version: 1.0.0 87 75 '@mary/array-fns': 88 - specifier: jsr:^0.1.4 76 + specifier: npm:@jsr/mary__array-fns@^0.1.4 89 77 version: '@jsr/mary__array-fns@0.1.4' 90 78 '@mary/async-iterator-fns': 91 - specifier: jsr:^0.1.1 79 + specifier: npm:@jsr/mary__async-iterator-fns@^0.1.1 92 80 version: '@jsr/mary__async-iterator-fns@0.1.1' 93 - '@mary/batch-fetch': 94 - specifier: jsr:^0.1.0 95 - version: '@jsr/mary__batch-fetch@0.1.0' 96 81 '@mary/date-fns': 97 - specifier: jsr:^0.1.3 82 + specifier: npm:@jsr/mary__date-fns@^0.1.3 98 83 version: '@jsr/mary__date-fns@0.1.3' 99 84 '@mary/events': 100 - specifier: jsr:^0.2.0 85 + specifier: npm:@jsr/mary__events@^0.2.0 101 86 version: '@jsr/mary__events@0.2.0' 102 87 '@mary/exif-rm': 103 - specifier: jsr:^0.2.2 88 + specifier: npm:@jsr/mary__exif-rm@^0.2.2 104 89 version: '@jsr/mary__exif-rm@0.2.2' 105 90 '@mary/solid-freeze': 106 91 specifier: npm:@externdefs/solid-freeze@^0.1.1 107 - version: '@externdefs/solid-freeze@0.1.1(solid-js@1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7))' 92 + version: '@externdefs/solid-freeze@0.1.1(solid-js@1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c))' 108 93 '@mary/solid-query': 109 94 specifier: npm:@externdefs/solid-query@^0.1.5 110 - version: '@externdefs/solid-query@0.1.5(solid-js@1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7))' 95 + version: '@externdefs/solid-query@0.1.5(solid-js@1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c))' 111 96 comlink: 112 97 specifier: ^4.4.2 113 98 version: 4.4.2 114 99 hls.js: 115 - specifier: ^1.6.5 116 - version: 1.6.5 100 + specifier: ^1.6.0 101 + version: 1.6.0 117 102 idb: 118 - specifier: ^8.0.3 119 - version: 8.0.3 103 + specifier: ^8.0.2 104 + version: 8.0.2 120 105 nanoid: 121 106 specifier: ^5.1.5 122 107 version: 5.1.5 123 108 solid-floating-ui: 124 109 specifier: ~0.2.1 125 - version: 0.2.1(@floating-ui/dom@1.7.1)(solid-js@1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7)) 110 + version: 0.2.1(@floating-ui/dom@1.6.13)(solid-js@1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c)) 126 111 solid-js: 127 - specifier: ^1.9.7 128 - version: 1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7) 112 + specifier: ^1.9.5 113 + version: 1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c) 129 114 webm-muxer: 130 - specifier: ^5.1.3 131 - version: 5.1.3 115 + specifier: ^5.1.1 116 + version: 5.1.1 132 117 devDependencies: 133 118 '@trivago/prettier-plugin-sort-imports': 134 119 specifier: ^5.2.2 135 - version: 5.2.2(prettier@3.6.0) 120 + version: 5.2.2(prettier@3.5.3) 136 121 '@types/dom-close-watcher': 137 122 specifier: ^1.0.0 138 123 version: 1.0.0 139 124 '@types/dom-webcodecs': 140 - specifier: ^0.1.15 141 - version: 0.1.15 142 - '@types/node': 143 - specifier: ^24.3.0 144 - version: 24.3.0 125 + specifier: ^0.1.14 126 + version: 0.1.14 145 127 autoprefixer: 146 128 specifier: ^10.4.21 147 - version: 10.4.21(postcss@8.5.6) 129 + version: 10.4.21(postcss@8.5.3) 148 130 babel-plugin-transform-typescript-const-enums: 149 131 specifier: ^0.1.0 150 - version: 0.1.0(@babel/core@7.27.4) 132 + version: 0.1.0(@babel/core@7.26.10) 151 133 prettier: 152 - specifier: ^3.6.0 153 - version: 3.6.0 134 + specifier: ^3.5.3 135 + version: 3.5.3 154 136 prettier-plugin-tailwindcss: 155 - specifier: ^0.6.13 156 - version: 0.6.13(@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.6.0))(prettier@3.6.0) 137 + specifier: ^0.6.11 138 + version: 0.6.11(@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.5.3))(prettier@3.5.3) 157 139 tailwindcss: 158 140 specifier: ^3.4.17 159 141 version: 3.4.17 160 142 terser: 161 - specifier: ^5.43.1 162 - version: 5.43.1 143 + specifier: ^5.39.0 144 + version: 5.39.0 163 145 typescript: 164 - specifier: ~5.8.3 165 - version: 5.8.3 146 + specifier: 5.7.2 147 + version: 5.7.2 166 148 vite: 167 - specifier: ^6.3.5 168 - version: 6.3.5(@types/node@24.3.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0) 149 + specifier: 6.0.5 150 + version: 6.0.5(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.0) 169 151 vite-plugin-pwa: 170 152 specifier: 0.21.0 171 - version: 0.21.0(patch_hash=003379ded749ad87080f87b428b17f04c4c88b6b64544df4d928aab76fbf6325)(@types/babel__core@7.20.5)(vite@6.3.5(@types/node@24.3.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0)) 153 + version: 0.21.0(patch_hash=003379ded749ad87080f87b428b17f04c4c88b6b64544df4d928aab76fbf6325)(@types/babel__core@7.20.5)(vite@6.0.5(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.0)) 172 154 vite-plugin-solid: 173 155 specifier: ^2.11.6 174 - version: 2.11.6(solid-js@1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7))(vite@6.3.5(@types/node@24.3.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0)) 156 + version: 2.11.6(solid-js@1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c))(vite@6.0.5(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.0)) 175 157 wrangler: 176 - specifier: ^4.20.5 177 - version: 4.20.5 158 + specifier: ^4.6.0 159 + version: 4.6.0 178 160 179 161 packages: 180 162 ··· 192 174 peerDependencies: 193 175 ajv: '>=8' 194 176 195 - '@atcute/atproto@3.1.0': 196 - resolution: {integrity: sha512-aJbDsY7FcIh8APWKAimBtshPwqoRE056tc0UV6vw4TW4e3nYaHedoJmKhlh/k8KQWxyw64MQThNGMaC89HNoTg==} 197 - 198 - '@atcute/bluemoji@3.1.0': 199 - resolution: {integrity: sha512-8EfcEDrXlStvu57WVcGSeDWfbEDKTjfI43rk+oohe2sdYU113ObTe8Pv1vW0DRfOYcQqR4+eF2SbpvXE6//24g==} 177 + '@atcute/bluemoji@1.0.4': 178 + resolution: {integrity: sha512-Rzujybon6EFuycWPID5bzjYIVdPPWWjVfPqELhByJTLe2vq3SlEubUCmz3VfhDu/Bb8wlBP2tIT5w4oq3vJLrg==} 179 + peerDependencies: 180 + '@atcute/bluesky': ^1.0.0 181 + '@atcute/client': ^1.0.0 || ^2.0.0 200 182 201 183 '@atcute/bluesky-richtext-parser@1.0.7': 202 184 resolution: {integrity: sha512-nOvU699OXiGMbyswao7JJnY0C9WkwE7PVC/m5WWt0UN9fsXSOor9IZWw+v9SATp+94BTJoG38XyUomUaJnoQRA==} 203 185 204 - '@atcute/bluesky-richtext-segmenter@2.0.3': 205 - resolution: {integrity: sha512-8Jy2EHdqx0mKI0k8l4h2cnaBN1pGgSzSazO0Gp85ttIQmgynZsQX6l4OWgaQx0aNZFmqZRXJ7N0rj/b2dlO1eQ==} 186 + '@atcute/bluesky-richtext-segmenter@1.0.5': 187 + resolution: {integrity: sha512-D0FfmJVwppky9naL1OGKcQjtgO0lDLhkG4iCQHpShuHhEZ9FUdf3eUb/eQpVRNJGaJ4ShjEOHA6FlAizcjMkGQ==} 188 + peerDependencies: 189 + '@atcute/bluesky': ^1.0.0 190 + '@atcute/client': ^1.0.0 || ^2.0.0 206 191 207 192 '@atcute/bluesky-search-parser@0.1.0': 208 193 resolution: {integrity: sha512-bTClwD9VGwaECOyWe1mf8V6t+7/77e3tiUHTE6CSrHXOJ/yM8N2xbn+dIi2ki2JLHvgvBN9wsWpFLykgfWhBaw==} 209 194 210 - '@atcute/bluesky@3.1.3': 211 - resolution: {integrity: sha512-avb9HLUqmCfIU/ZF6WeSjxLwUbzqST2JTF6efW7n1+3kw+oKRe6hhgsZoTka+3VrBZEpqveGt5O5TYdhzW0+lQ==} 212 - 213 - '@atcute/cbor@2.2.4': 214 - resolution: {integrity: sha512-8Y/OTM8zs5VInOCjfx4f9Idiiz7ygM/FkfWv/HW3/ZUsXczn1xk7GzTBbm4P5crn4C5luwDGpO7FwClMOERrow==} 215 - 216 - '@atcute/cid@2.2.3': 217 - resolution: {integrity: sha512-WEzNSL1EuCVtCQDFYEBIm4dEP6PcMEwi8IYUVIWvT77eO5EjY58F63z5T4qMABxSBM0+L4kqMxypdL1Fzf6LZw==} 218 - 219 - '@atcute/client@4.0.3': 220 - resolution: {integrity: sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==} 221 - 222 - '@atcute/identity-resolver@1.1.3': 223 - resolution: {integrity: sha512-KZgGgg99CWaV7Df3+h3X/WMrDzTPQVfsaoIVbTNLx2B56BvCL2EmaxPSVw/7BFUJMZHlVU4rtoEB4lyvNyMswA==} 195 + '@atcute/bluesky@1.0.15': 196 + resolution: {integrity: sha512-+EFiybmKQ97aBAgtaD+cKRJER5AMn3cZMkEwEg/pDdWyzxYJ9m1UgemmLdTgI8VrxPufKqdXS2nl7uO7TY6BPA==} 224 197 peerDependencies: 225 - '@atcute/identity': ^1.0.0 198 + '@atcute/client': ^1.0.0 || ^2.0.0 226 199 227 - '@atcute/identity@1.1.0': 228 - resolution: {integrity: sha512-6vRvRqJatDB+JUQsb+UswYmtBGQnSZcqC3a2y6H5DB/v5KcIh+6nFFtc17G0+3W9rxdk7k9M4KkgkdKf/YDNoQ==} 200 + '@atcute/cbor@2.2.0': 201 + resolution: {integrity: sha512-W3ttcDJHiB5N6MbfEpJbTINZSjg0KB8gpBds8UWOGmybqUnuz43HZkFSpF/Vom0KilYg6QWU/ZM4X8SXZE+kow==} 229 202 230 - '@atcute/lexicons@1.1.0': 231 - resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==} 203 + '@atcute/cid@2.2.0': 204 + resolution: {integrity: sha512-ty+WjGcTfi1JJtcRNz6bsJMqT69lEIl4Ts7vl4U8SBHbxjbb6Tk/pcnQZVClKRYduRoZ1XhS9n5qOSIbIMctDA==} 232 205 233 - '@atcute/lexicons@1.1.1': 234 - resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==} 206 + '@atcute/client@2.0.9': 207 + resolution: {integrity: sha512-QNDm9gMP6x9LY77ArwY+urQOBtQW74/onEAz42c40JxRm6Rl9K9cU4ROvNKJ+5cpVmEm1sthEWVRmDr5CSZENA==} 235 208 236 - '@atcute/multibase@1.1.4': 237 - resolution: {integrity: sha512-NUf5AeeSOmuZHGU+4GAaMtISJoG+ZHtW/vUVA4lK/YDt/7LODAW0Fd0NNIIUPVUoW0xJS6zSEIWvwLLuxmEHhA==} 209 + '@atcute/multibase@1.1.2': 210 + resolution: {integrity: sha512-KFX+c7a/u2jSNcRw0rLaUHG/XEKf1A1c8XF5soHnsb1JMCShihf/anfZ1kJ4no/IlIp9HEHV3PQRQO2sWL6ASQ==} 238 211 239 - '@atcute/oauth-browser-client@2.0.0-next.0': 240 - resolution: {integrity: sha512-BaVU0Mu5ACerdWdMok6kvwwAuPJunbQQk0C51zpxNLpT0P/SYnun+3xX7bcrbtDG1lXn+r+Qld88P+zonY1wPA==} 212 + '@atcute/oauth-browser-client@1.0.16': 213 + resolution: {integrity: sha512-BKkA4TPyaLIO+hVxcxZoDfLFUgsd3A47UyzWAbe3BpSoN8Kywy/CqWuAVlqdiUhO1iG+vVqGQhjKy4UxutaU4g==} 241 214 242 215 '@atcute/tid@1.0.2': 243 216 resolution: {integrity: sha512-ahmjroNyeDPJhtuf3+HTJropaH04HmJ8fhntDu73Gpz/RkAF7+nkz6kcP2QTgfvMCgMPAJUdskAAP82GPDTY9w==} 244 217 245 - '@atcute/uint8array@1.0.3': 246 - resolution: {integrity: sha512-M/K+ihiVW8Pl2PFLzaC4E3l4JaZ1IH05Q0AbPWUC4cVHnd/gZ/1kAF5ngdtGvJeDMirHZ2VAy7OmAsPwR/2nlA==} 247 - 248 - '@atcute/util-fetch@1.0.1': 249 - resolution: {integrity: sha512-Clc0E/5ufyGBVfYBUwWNlHONlZCoblSr4Ho50l1LhmRPGB1Wu/AQ9Sz+rsBg7fdaW/auve8ulmwhRhnX2cGRow==} 218 + '@atcute/uint8array@1.0.1': 219 + resolution: {integrity: sha512-AAnlFKyfDRgb9GNZJbhQ6OuMhbmNPirQyapb8KnmcEhxQZ3+tt+4NcwqekEegY4MpNqSTYeeTdyxq0wGZv1JHg==} 250 220 251 221 '@atlaskit/pragmatic-drag-and-drop-hitbox@1.0.3': 252 222 resolution: {integrity: sha512-/Sbu/HqN2VGLYBhnsG7SbRNg98XKkbF6L7XDdBi+izRybfaK1FeMfodPpm/xnBHPJzwYMdkE0qtLyv6afhgMUA==} 253 223 254 - '@atlaskit/pragmatic-drag-and-drop@1.6.0': 255 - resolution: {integrity: sha512-J5ZnU6h0wjda1M1BKimzt4oRKeyVsTQzlRUqlbIUjfNioWFdSnIkPogWIn9tV2B68jphL1QNuZdEkKxcJygU2w==} 224 + '@atlaskit/pragmatic-drag-and-drop@1.5.2': 225 + resolution: {integrity: sha512-fDuTwlDD11r3ev5tLJ6JnzQUiG9v77c8zGcNdO7RRNtZZbOHam8CFhmyFGY4E/mLjvgYng0UkcyCrSBc4FXYZw==} 256 226 257 - '@babel/code-frame@7.27.1': 258 - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 227 + '@babel/code-frame@7.26.2': 228 + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 259 229 engines: {node: '>=6.9.0'} 260 230 261 - '@babel/compat-data@7.27.5': 262 - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} 231 + '@babel/compat-data@7.26.8': 232 + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} 263 233 engines: {node: '>=6.9.0'} 264 234 265 - '@babel/core@7.27.4': 266 - resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} 235 + '@babel/core@7.26.10': 236 + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} 267 237 engines: {node: '>=6.9.0'} 268 238 269 - '@babel/generator@7.27.5': 270 - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} 239 + '@babel/generator@7.27.0': 240 + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} 271 241 engines: {node: '>=6.9.0'} 272 242 273 - '@babel/helper-annotate-as-pure@7.27.3': 274 - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} 243 + '@babel/helper-annotate-as-pure@7.25.9': 244 + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} 275 245 engines: {node: '>=6.9.0'} 276 246 277 - '@babel/helper-compilation-targets@7.27.2': 278 - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 247 + '@babel/helper-compilation-targets@7.27.0': 248 + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} 279 249 engines: {node: '>=6.9.0'} 280 250 281 - '@babel/helper-create-class-features-plugin@7.27.1': 282 - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} 251 + '@babel/helper-create-class-features-plugin@7.27.0': 252 + resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} 283 253 engines: {node: '>=6.9.0'} 284 254 peerDependencies: 285 255 '@babel/core': ^7.0.0 286 256 287 - '@babel/helper-create-regexp-features-plugin@7.27.1': 288 - resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} 257 + '@babel/helper-create-regexp-features-plugin@7.27.0': 258 + resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} 289 259 engines: {node: '>=6.9.0'} 290 260 peerDependencies: 291 261 '@babel/core': ^7.0.0 ··· 295 265 peerDependencies: 296 266 '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 297 267 298 - '@babel/helper-member-expression-to-functions@7.27.1': 299 - resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} 268 + '@babel/helper-member-expression-to-functions@7.25.9': 269 + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} 300 270 engines: {node: '>=6.9.0'} 301 271 302 272 '@babel/helper-module-imports@7.18.6': 303 273 resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} 304 274 engines: {node: '>=6.9.0'} 305 275 306 - '@babel/helper-module-imports@7.27.1': 307 - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 276 + '@babel/helper-module-imports@7.25.9': 277 + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 308 278 engines: {node: '>=6.9.0'} 309 279 310 - '@babel/helper-module-transforms@7.27.3': 311 - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} 280 + '@babel/helper-module-transforms@7.26.0': 281 + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 312 282 engines: {node: '>=6.9.0'} 313 283 peerDependencies: 314 284 '@babel/core': ^7.0.0 315 285 316 - '@babel/helper-optimise-call-expression@7.27.1': 317 - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} 286 + '@babel/helper-optimise-call-expression@7.25.9': 287 + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} 318 288 engines: {node: '>=6.9.0'} 319 289 320 - '@babel/helper-plugin-utils@7.27.1': 321 - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} 290 + '@babel/helper-plugin-utils@7.26.5': 291 + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} 322 292 engines: {node: '>=6.9.0'} 323 293 324 - '@babel/helper-remap-async-to-generator@7.27.1': 325 - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} 294 + '@babel/helper-remap-async-to-generator@7.25.9': 295 + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} 326 296 engines: {node: '>=6.9.0'} 327 297 peerDependencies: 328 298 '@babel/core': ^7.0.0 329 299 330 - '@babel/helper-replace-supers@7.27.1': 331 - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} 300 + '@babel/helper-replace-supers@7.26.5': 301 + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} 332 302 engines: {node: '>=6.9.0'} 333 303 peerDependencies: 334 304 '@babel/core': ^7.0.0 335 305 336 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': 337 - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} 306 + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': 307 + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} 338 308 engines: {node: '>=6.9.0'} 339 309 340 - '@babel/helper-string-parser@7.27.1': 341 - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 310 + '@babel/helper-string-parser@7.25.9': 311 + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 342 312 engines: {node: '>=6.9.0'} 343 313 344 - '@babel/helper-validator-identifier@7.27.1': 345 - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 314 + '@babel/helper-validator-identifier@7.25.9': 315 + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 346 316 engines: {node: '>=6.9.0'} 347 317 348 - '@babel/helper-validator-option@7.27.1': 349 - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 318 + '@babel/helper-validator-option@7.25.9': 319 + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 350 320 engines: {node: '>=6.9.0'} 351 321 352 - '@babel/helper-wrap-function@7.27.1': 353 - resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} 322 + '@babel/helper-wrap-function@7.25.9': 323 + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} 354 324 engines: {node: '>=6.9.0'} 355 325 356 - '@babel/helpers@7.27.6': 357 - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} 326 + '@babel/helpers@7.27.0': 327 + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} 358 328 engines: {node: '>=6.9.0'} 359 329 360 - '@babel/parser@7.27.5': 361 - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} 330 + '@babel/parser@7.27.0': 331 + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} 362 332 engines: {node: '>=6.0.0'} 363 333 hasBin: true 364 334 365 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': 366 - resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} 335 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': 336 + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} 367 337 engines: {node: '>=6.9.0'} 368 338 peerDependencies: 369 339 '@babel/core': ^7.0.0 370 340 371 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': 372 - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} 341 + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': 342 + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} 373 343 engines: {node: '>=6.9.0'} 374 344 peerDependencies: 375 345 '@babel/core': ^7.0.0 376 346 377 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': 378 - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} 347 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': 348 + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} 379 349 engines: {node: '>=6.9.0'} 380 350 peerDependencies: 381 351 '@babel/core': ^7.0.0 382 352 383 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': 384 - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} 353 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': 354 + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} 385 355 engines: {node: '>=6.9.0'} 386 356 peerDependencies: 387 357 '@babel/core': ^7.13.0 388 358 389 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': 390 - resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} 359 + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': 360 + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} 391 361 engines: {node: '>=6.9.0'} 392 362 peerDependencies: 393 363 '@babel/core': ^7.0.0 ··· 398 368 peerDependencies: 399 369 '@babel/core': ^7.0.0-0 400 370 401 - '@babel/plugin-syntax-import-assertions@7.27.1': 402 - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} 371 + '@babel/plugin-syntax-import-assertions@7.26.0': 372 + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} 403 373 engines: {node: '>=6.9.0'} 404 374 peerDependencies: 405 375 '@babel/core': ^7.0.0-0 406 376 407 - '@babel/plugin-syntax-import-attributes@7.27.1': 408 - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} 377 + '@babel/plugin-syntax-import-attributes@7.26.0': 378 + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} 409 379 engines: {node: '>=6.9.0'} 410 380 peerDependencies: 411 381 '@babel/core': ^7.0.0-0 412 382 413 - '@babel/plugin-syntax-jsx@7.27.1': 414 - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} 383 + '@babel/plugin-syntax-jsx@7.25.9': 384 + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 415 385 engines: {node: '>=6.9.0'} 416 386 peerDependencies: 417 387 '@babel/core': ^7.0.0-0 ··· 422 392 peerDependencies: 423 393 '@babel/core': ^7.0.0 424 394 425 - '@babel/plugin-transform-arrow-functions@7.27.1': 426 - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} 395 + '@babel/plugin-transform-arrow-functions@7.25.9': 396 + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} 427 397 engines: {node: '>=6.9.0'} 428 398 peerDependencies: 429 399 '@babel/core': ^7.0.0-0 430 400 431 - '@babel/plugin-transform-async-generator-functions@7.27.1': 432 - resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} 401 + '@babel/plugin-transform-async-generator-functions@7.26.8': 402 + resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} 433 403 engines: {node: '>=6.9.0'} 434 404 peerDependencies: 435 405 '@babel/core': ^7.0.0-0 436 406 437 - '@babel/plugin-transform-async-to-generator@7.27.1': 438 - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} 407 + '@babel/plugin-transform-async-to-generator@7.25.9': 408 + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} 439 409 engines: {node: '>=6.9.0'} 440 410 peerDependencies: 441 411 '@babel/core': ^7.0.0-0 442 412 443 - '@babel/plugin-transform-block-scoped-functions@7.27.1': 444 - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} 413 + '@babel/plugin-transform-block-scoped-functions@7.26.5': 414 + resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} 445 415 engines: {node: '>=6.9.0'} 446 416 peerDependencies: 447 417 '@babel/core': ^7.0.0-0 448 418 449 - '@babel/plugin-transform-block-scoping@7.27.5': 450 - resolution: {integrity: sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==} 419 + '@babel/plugin-transform-block-scoping@7.27.0': 420 + resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} 451 421 engines: {node: '>=6.9.0'} 452 422 peerDependencies: 453 423 '@babel/core': ^7.0.0-0 454 424 455 - '@babel/plugin-transform-class-properties@7.27.1': 456 - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} 425 + '@babel/plugin-transform-class-properties@7.25.9': 426 + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} 457 427 engines: {node: '>=6.9.0'} 458 428 peerDependencies: 459 429 '@babel/core': ^7.0.0-0 460 430 461 - '@babel/plugin-transform-class-static-block@7.27.1': 462 - resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} 431 + '@babel/plugin-transform-class-static-block@7.26.0': 432 + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} 463 433 engines: {node: '>=6.9.0'} 464 434 peerDependencies: 465 435 '@babel/core': ^7.12.0 466 436 467 - '@babel/plugin-transform-classes@7.27.1': 468 - resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} 437 + '@babel/plugin-transform-classes@7.25.9': 438 + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} 469 439 engines: {node: '>=6.9.0'} 470 440 peerDependencies: 471 441 '@babel/core': ^7.0.0-0 472 442 473 - '@babel/plugin-transform-computed-properties@7.27.1': 474 - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} 443 + '@babel/plugin-transform-computed-properties@7.25.9': 444 + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} 475 445 engines: {node: '>=6.9.0'} 476 446 peerDependencies: 477 447 '@babel/core': ^7.0.0-0 478 448 479 - '@babel/plugin-transform-destructuring@7.27.3': 480 - resolution: {integrity: sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==} 449 + '@babel/plugin-transform-destructuring@7.25.9': 450 + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} 481 451 engines: {node: '>=6.9.0'} 482 452 peerDependencies: 483 453 '@babel/core': ^7.0.0-0 484 454 485 - '@babel/plugin-transform-dotall-regex@7.27.1': 486 - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} 455 + '@babel/plugin-transform-dotall-regex@7.25.9': 456 + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} 487 457 engines: {node: '>=6.9.0'} 488 458 peerDependencies: 489 459 '@babel/core': ^7.0.0-0 490 460 491 - '@babel/plugin-transform-duplicate-keys@7.27.1': 492 - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} 461 + '@babel/plugin-transform-duplicate-keys@7.25.9': 462 + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} 493 463 engines: {node: '>=6.9.0'} 494 464 peerDependencies: 495 465 '@babel/core': ^7.0.0-0 496 466 497 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': 498 - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} 467 + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': 468 + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} 499 469 engines: {node: '>=6.9.0'} 500 470 peerDependencies: 501 471 '@babel/core': ^7.0.0 502 472 503 - '@babel/plugin-transform-dynamic-import@7.27.1': 504 - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} 473 + '@babel/plugin-transform-dynamic-import@7.25.9': 474 + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} 505 475 engines: {node: '>=6.9.0'} 506 476 peerDependencies: 507 477 '@babel/core': ^7.0.0-0 508 478 509 - '@babel/plugin-transform-exponentiation-operator@7.27.1': 510 - resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} 479 + '@babel/plugin-transform-exponentiation-operator@7.26.3': 480 + resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} 511 481 engines: {node: '>=6.9.0'} 512 482 peerDependencies: 513 483 '@babel/core': ^7.0.0-0 514 484 515 - '@babel/plugin-transform-export-namespace-from@7.27.1': 516 - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} 485 + '@babel/plugin-transform-export-namespace-from@7.25.9': 486 + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} 517 487 engines: {node: '>=6.9.0'} 518 488 peerDependencies: 519 489 '@babel/core': ^7.0.0-0 520 490 521 - '@babel/plugin-transform-for-of@7.27.1': 522 - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} 491 + '@babel/plugin-transform-for-of@7.26.9': 492 + resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} 523 493 engines: {node: '>=6.9.0'} 524 494 peerDependencies: 525 495 '@babel/core': ^7.0.0-0 526 496 527 - '@babel/plugin-transform-function-name@7.27.1': 528 - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} 497 + '@babel/plugin-transform-function-name@7.25.9': 498 + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} 529 499 engines: {node: '>=6.9.0'} 530 500 peerDependencies: 531 501 '@babel/core': ^7.0.0-0 532 502 533 - '@babel/plugin-transform-json-strings@7.27.1': 534 - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} 503 + '@babel/plugin-transform-json-strings@7.25.9': 504 + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} 535 505 engines: {node: '>=6.9.0'} 536 506 peerDependencies: 537 507 '@babel/core': ^7.0.0-0 538 508 539 - '@babel/plugin-transform-literals@7.27.1': 540 - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} 509 + '@babel/plugin-transform-literals@7.25.9': 510 + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} 541 511 engines: {node: '>=6.9.0'} 542 512 peerDependencies: 543 513 '@babel/core': ^7.0.0-0 544 514 545 - '@babel/plugin-transform-logical-assignment-operators@7.27.1': 546 - resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} 515 + '@babel/plugin-transform-logical-assignment-operators@7.25.9': 516 + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} 547 517 engines: {node: '>=6.9.0'} 548 518 peerDependencies: 549 519 '@babel/core': ^7.0.0-0 550 520 551 - '@babel/plugin-transform-member-expression-literals@7.27.1': 552 - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} 521 + '@babel/plugin-transform-member-expression-literals@7.25.9': 522 + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} 553 523 engines: {node: '>=6.9.0'} 554 524 peerDependencies: 555 525 '@babel/core': ^7.0.0-0 556 526 557 - '@babel/plugin-transform-modules-amd@7.27.1': 558 - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} 527 + '@babel/plugin-transform-modules-amd@7.25.9': 528 + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} 559 529 engines: {node: '>=6.9.0'} 560 530 peerDependencies: 561 531 '@babel/core': ^7.0.0-0 562 532 563 - '@babel/plugin-transform-modules-commonjs@7.27.1': 564 - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} 533 + '@babel/plugin-transform-modules-commonjs@7.26.3': 534 + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} 565 535 engines: {node: '>=6.9.0'} 566 536 peerDependencies: 567 537 '@babel/core': ^7.0.0-0 568 538 569 - '@babel/plugin-transform-modules-systemjs@7.27.1': 570 - resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} 539 + '@babel/plugin-transform-modules-systemjs@7.25.9': 540 + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} 571 541 engines: {node: '>=6.9.0'} 572 542 peerDependencies: 573 543 '@babel/core': ^7.0.0-0 574 544 575 - '@babel/plugin-transform-modules-umd@7.27.1': 576 - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} 545 + '@babel/plugin-transform-modules-umd@7.25.9': 546 + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} 577 547 engines: {node: '>=6.9.0'} 578 548 peerDependencies: 579 549 '@babel/core': ^7.0.0-0 580 550 581 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': 582 - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} 551 + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': 552 + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} 583 553 engines: {node: '>=6.9.0'} 584 554 peerDependencies: 585 555 '@babel/core': ^7.0.0 586 556 587 - '@babel/plugin-transform-new-target@7.27.1': 588 - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} 557 + '@babel/plugin-transform-new-target@7.25.9': 558 + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} 589 559 engines: {node: '>=6.9.0'} 590 560 peerDependencies: 591 561 '@babel/core': ^7.0.0-0 592 562 593 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': 594 - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} 563 + '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': 564 + resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} 595 565 engines: {node: '>=6.9.0'} 596 566 peerDependencies: 597 567 '@babel/core': ^7.0.0-0 598 568 599 - '@babel/plugin-transform-numeric-separator@7.27.1': 600 - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} 569 + '@babel/plugin-transform-numeric-separator@7.25.9': 570 + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} 601 571 engines: {node: '>=6.9.0'} 602 572 peerDependencies: 603 573 '@babel/core': ^7.0.0-0 604 574 605 - '@babel/plugin-transform-object-rest-spread@7.27.3': 606 - resolution: {integrity: sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==} 575 + '@babel/plugin-transform-object-rest-spread@7.25.9': 576 + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} 607 577 engines: {node: '>=6.9.0'} 608 578 peerDependencies: 609 579 '@babel/core': ^7.0.0-0 610 580 611 - '@babel/plugin-transform-object-super@7.27.1': 612 - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} 581 + '@babel/plugin-transform-object-super@7.25.9': 582 + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} 613 583 engines: {node: '>=6.9.0'} 614 584 peerDependencies: 615 585 '@babel/core': ^7.0.0-0 616 586 617 - '@babel/plugin-transform-optional-catch-binding@7.27.1': 618 - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} 587 + '@babel/plugin-transform-optional-catch-binding@7.25.9': 588 + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} 619 589 engines: {node: '>=6.9.0'} 620 590 peerDependencies: 621 591 '@babel/core': ^7.0.0-0 622 592 623 - '@babel/plugin-transform-optional-chaining@7.27.1': 624 - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} 593 + '@babel/plugin-transform-optional-chaining@7.25.9': 594 + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} 625 595 engines: {node: '>=6.9.0'} 626 596 peerDependencies: 627 597 '@babel/core': ^7.0.0-0 628 598 629 - '@babel/plugin-transform-parameters@7.27.1': 630 - resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} 599 + '@babel/plugin-transform-parameters@7.25.9': 600 + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} 631 601 engines: {node: '>=6.9.0'} 632 602 peerDependencies: 633 603 '@babel/core': ^7.0.0-0 634 604 635 - '@babel/plugin-transform-private-methods@7.27.1': 636 - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} 605 + '@babel/plugin-transform-private-methods@7.25.9': 606 + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} 637 607 engines: {node: '>=6.9.0'} 638 608 peerDependencies: 639 609 '@babel/core': ^7.0.0-0 640 610 641 - '@babel/plugin-transform-private-property-in-object@7.27.1': 642 - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} 611 + '@babel/plugin-transform-private-property-in-object@7.25.9': 612 + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} 643 613 engines: {node: '>=6.9.0'} 644 614 peerDependencies: 645 615 '@babel/core': ^7.0.0-0 646 616 647 - '@babel/plugin-transform-property-literals@7.27.1': 648 - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} 617 + '@babel/plugin-transform-property-literals@7.25.9': 618 + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} 649 619 engines: {node: '>=6.9.0'} 650 620 peerDependencies: 651 621 '@babel/core': ^7.0.0-0 652 622 653 - '@babel/plugin-transform-regenerator@7.27.5': 654 - resolution: {integrity: sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==} 623 + '@babel/plugin-transform-regenerator@7.27.0': 624 + resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} 655 625 engines: {node: '>=6.9.0'} 656 626 peerDependencies: 657 627 '@babel/core': ^7.0.0-0 658 628 659 - '@babel/plugin-transform-regexp-modifiers@7.27.1': 660 - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} 629 + '@babel/plugin-transform-regexp-modifiers@7.26.0': 630 + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} 661 631 engines: {node: '>=6.9.0'} 662 632 peerDependencies: 663 633 '@babel/core': ^7.0.0 664 634 665 - '@babel/plugin-transform-reserved-words@7.27.1': 666 - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} 635 + '@babel/plugin-transform-reserved-words@7.25.9': 636 + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} 667 637 engines: {node: '>=6.9.0'} 668 638 peerDependencies: 669 639 '@babel/core': ^7.0.0-0 670 640 671 - '@babel/plugin-transform-shorthand-properties@7.27.1': 672 - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} 641 + '@babel/plugin-transform-shorthand-properties@7.25.9': 642 + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} 673 643 engines: {node: '>=6.9.0'} 674 644 peerDependencies: 675 645 '@babel/core': ^7.0.0-0 676 646 677 - '@babel/plugin-transform-spread@7.27.1': 678 - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} 647 + '@babel/plugin-transform-spread@7.25.9': 648 + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} 679 649 engines: {node: '>=6.9.0'} 680 650 peerDependencies: 681 651 '@babel/core': ^7.0.0-0 682 652 683 - '@babel/plugin-transform-sticky-regex@7.27.1': 684 - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} 653 + '@babel/plugin-transform-sticky-regex@7.25.9': 654 + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} 685 655 engines: {node: '>=6.9.0'} 686 656 peerDependencies: 687 657 '@babel/core': ^7.0.0-0 688 658 689 - '@babel/plugin-transform-template-literals@7.27.1': 690 - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} 659 + '@babel/plugin-transform-template-literals@7.26.8': 660 + resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} 691 661 engines: {node: '>=6.9.0'} 692 662 peerDependencies: 693 663 '@babel/core': ^7.0.0-0 694 664 695 - '@babel/plugin-transform-typeof-symbol@7.27.1': 696 - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} 665 + '@babel/plugin-transform-typeof-symbol@7.27.0': 666 + resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} 697 667 engines: {node: '>=6.9.0'} 698 668 peerDependencies: 699 669 '@babel/core': ^7.0.0-0 700 670 701 - '@babel/plugin-transform-unicode-escapes@7.27.1': 702 - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} 671 + '@babel/plugin-transform-unicode-escapes@7.25.9': 672 + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} 703 673 engines: {node: '>=6.9.0'} 704 674 peerDependencies: 705 675 '@babel/core': ^7.0.0-0 706 676 707 - '@babel/plugin-transform-unicode-property-regex@7.27.1': 708 - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} 677 + '@babel/plugin-transform-unicode-property-regex@7.25.9': 678 + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} 709 679 engines: {node: '>=6.9.0'} 710 680 peerDependencies: 711 681 '@babel/core': ^7.0.0-0 712 682 713 - '@babel/plugin-transform-unicode-regex@7.27.1': 714 - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} 683 + '@babel/plugin-transform-unicode-regex@7.25.9': 684 + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} 715 685 engines: {node: '>=6.9.0'} 716 686 peerDependencies: 717 687 '@babel/core': ^7.0.0-0 718 688 719 - '@babel/plugin-transform-unicode-sets-regex@7.27.1': 720 - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} 689 + '@babel/plugin-transform-unicode-sets-regex@7.25.9': 690 + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} 721 691 engines: {node: '>=6.9.0'} 722 692 peerDependencies: 723 693 '@babel/core': ^7.0.0 724 694 725 - '@babel/preset-env@7.27.2': 726 - resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==} 695 + '@babel/preset-env@7.26.9': 696 + resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} 727 697 engines: {node: '>=6.9.0'} 728 698 peerDependencies: 729 699 '@babel/core': ^7.0.0-0 ··· 733 703 peerDependencies: 734 704 '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 735 705 736 - '@babel/runtime@7.27.6': 737 - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} 706 + '@babel/runtime@7.27.0': 707 + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} 738 708 engines: {node: '>=6.9.0'} 739 709 740 - '@babel/template@7.27.2': 741 - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 710 + '@babel/template@7.27.0': 711 + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} 742 712 engines: {node: '>=6.9.0'} 743 713 744 - '@babel/traverse@7.27.4': 745 - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} 714 + '@babel/traverse@7.27.0': 715 + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} 746 716 engines: {node: '>=6.9.0'} 747 717 748 - '@babel/types@7.27.6': 749 - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} 718 + '@babel/types@7.27.0': 719 + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} 750 720 engines: {node: '>=6.9.0'} 751 721 752 - '@badrap/valita@0.4.5': 753 - resolution: {integrity: sha512-4QwGbuhh/JesHRQj79mO/l37PvJj4l/tlAu7+S1n4h47qwaNpZ0WDvIwUGLYUsdi9uQ5UPpiG9wb1Wm3XUFBUQ==} 754 - engines: {node: '>= 18'} 755 - 756 722 '@cloudflare/kv-asset-handler@0.4.0': 757 723 resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} 758 724 engines: {node: '>=18.0.0'} 759 725 760 - '@cloudflare/unenv-preset@2.3.3': 761 - resolution: {integrity: sha512-/M3MEcj3V2WHIRSW1eAQBPRJ6JnGQHc6JKMAPLkDb7pLs3m6X9ES/+K3ceGqxI6TKeF32AWAi7ls0AYzVxCP0A==} 726 + '@cloudflare/unenv-preset@2.3.1': 727 + resolution: {integrity: sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==} 762 728 peerDependencies: 763 - unenv: 2.0.0-rc.17 764 - workerd: ^1.20250508.0 729 + unenv: 2.0.0-rc.15 730 + workerd: ^1.20250320.0 765 731 peerDependenciesMeta: 766 732 workerd: 767 733 optional: true 768 734 769 - '@cloudflare/workerd-darwin-64@1.20250617.0': 770 - resolution: {integrity: sha512-toG8JUKVLIks4oOJLe9FeuixE84pDpMZ32ip7mCpE7JaFc5BqGFvevk0YC/db3T71AQlialjRwioH3jS/dzItA==} 735 + '@cloudflare/workerd-darwin-64@1.20250321.0': 736 + resolution: {integrity: sha512-y273GfLaNCxkL8hTfo0c8FZKkOPdq+CPZAKJXPWB+YpS1JCOULu6lNTptpD7ZtF14dTYPkn5Weug31TTlviJmw==} 771 737 engines: {node: '>=16'} 772 738 cpu: [x64] 773 739 os: [darwin] 774 740 775 - '@cloudflare/workerd-darwin-arm64@1.20250617.0': 776 - resolution: {integrity: sha512-JTX0exbC9/ZtMmQQA8tDZEZFMXZrxOpTUj2hHnsUkErWYkr5SSZH04RBhPg6dU4VL8bXuB5/eJAh7+P9cZAp7g==} 741 + '@cloudflare/workerd-darwin-arm64@1.20250321.0': 742 + resolution: {integrity: sha512-qvf7/gkkQq7fAsoMlntJSimN/WfwQqxi2oL0aWZMGodTvs/yRHO2I4oE0eOihVdK1BXyBHJXNxEvNDBjF0+Yuw==} 777 743 engines: {node: '>=16'} 778 744 cpu: [arm64] 779 745 os: [darwin] 780 746 781 - '@cloudflare/workerd-linux-64@1.20250617.0': 782 - resolution: {integrity: sha512-8jkSoVRJ+1bOx3tuWlZCGaGCV2ew7/jFMl6V3CPXOoEtERUHsZBQLVkQIGKcmC/LKSj7f/mpyBUeu2EPTo2HEg==} 747 + '@cloudflare/workerd-linux-64@1.20250321.0': 748 + resolution: {integrity: sha512-AEp3xjWFrNPO/h0StCOgOb0bWCcNThnkESpy91Wf4mfUF2p7tOCdp37Nk/1QIRqSxnfv4Hgxyi7gcWud9cJuMw==} 783 749 engines: {node: '>=16'} 784 750 cpu: [x64] 785 751 os: [linux] 786 752 787 - '@cloudflare/workerd-linux-arm64@1.20250617.0': 788 - resolution: {integrity: sha512-YAzcOyu897z5dQKFzme1oujGWMGEJCR7/Wrrm1nSP6dqutxFPTubRADM8BHn2CV3ij//vaPnAeLmZE3jVwOwig==} 753 + '@cloudflare/workerd-linux-arm64@1.20250321.0': 754 + resolution: {integrity: sha512-wRWyMIoPIS1UBXCisW0FYTgGsfZD4AVS0hXA5nuLc0c21CvzZpmmTjqEWMcwPFenwy/MNL61NautVOC4qJqQ3Q==} 789 755 engines: {node: '>=16'} 790 756 cpu: [arm64] 791 757 os: [linux] 792 758 793 - '@cloudflare/workerd-windows-64@1.20250617.0': 794 - resolution: {integrity: sha512-XWM/6sagDrO0CYDKhXhPjM23qusvIN1ju9ZEml6gOQs8tNOFnq6Cn6X9FAmnyapRFCGUSEC3HZYJAm7zwVKaMA==} 759 + '@cloudflare/workerd-windows-64@1.20250321.0': 760 + resolution: {integrity: sha512-8vYP3QYO0zo2faUDfWl88jjfUvz7Si9GS3mUYaTh/TR9LcAUtsO7muLxPamqEyoxNFtbQgy08R4rTid94KRi3w==} 795 761 engines: {node: '>=16'} 796 762 cpu: [x64] 797 763 os: [win32] ··· 800 766 resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 801 767 engines: {node: '>=12'} 802 768 803 - '@emnapi/runtime@1.4.3': 804 - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} 769 + '@emnapi/runtime@1.4.0': 770 + resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} 805 771 806 - '@esbuild/aix-ppc64@0.25.4': 807 - resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} 772 + '@esbuild/aix-ppc64@0.24.0': 773 + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} 808 774 engines: {node: '>=18'} 809 775 cpu: [ppc64] 810 776 os: [aix] 811 777 812 - '@esbuild/aix-ppc64@0.25.5': 813 - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} 778 + '@esbuild/aix-ppc64@0.24.2': 779 + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 814 780 engines: {node: '>=18'} 815 781 cpu: [ppc64] 816 782 os: [aix] 817 783 818 - '@esbuild/android-arm64@0.25.4': 819 - resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} 784 + '@esbuild/android-arm64@0.24.0': 785 + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} 820 786 engines: {node: '>=18'} 821 787 cpu: [arm64] 822 788 os: [android] 823 789 824 - '@esbuild/android-arm64@0.25.5': 825 - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} 790 + '@esbuild/android-arm64@0.24.2': 791 + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 826 792 engines: {node: '>=18'} 827 793 cpu: [arm64] 828 794 os: [android] 829 795 830 - '@esbuild/android-arm@0.25.4': 831 - resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} 796 + '@esbuild/android-arm@0.24.0': 797 + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} 832 798 engines: {node: '>=18'} 833 799 cpu: [arm] 834 800 os: [android] 835 801 836 - '@esbuild/android-arm@0.25.5': 837 - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} 802 + '@esbuild/android-arm@0.24.2': 803 + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 838 804 engines: {node: '>=18'} 839 805 cpu: [arm] 840 806 os: [android] 841 807 842 - '@esbuild/android-x64@0.25.4': 843 - resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} 808 + '@esbuild/android-x64@0.24.0': 809 + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} 844 810 engines: {node: '>=18'} 845 811 cpu: [x64] 846 812 os: [android] 847 813 848 - '@esbuild/android-x64@0.25.5': 849 - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} 814 + '@esbuild/android-x64@0.24.2': 815 + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 850 816 engines: {node: '>=18'} 851 817 cpu: [x64] 852 818 os: [android] 853 819 854 - '@esbuild/darwin-arm64@0.25.4': 855 - resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} 820 + '@esbuild/darwin-arm64@0.24.0': 821 + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} 856 822 engines: {node: '>=18'} 857 823 cpu: [arm64] 858 824 os: [darwin] 859 825 860 - '@esbuild/darwin-arm64@0.25.5': 861 - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} 826 + '@esbuild/darwin-arm64@0.24.2': 827 + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 862 828 engines: {node: '>=18'} 863 829 cpu: [arm64] 864 830 os: [darwin] 865 831 866 - '@esbuild/darwin-x64@0.25.4': 867 - resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} 832 + '@esbuild/darwin-x64@0.24.0': 833 + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} 868 834 engines: {node: '>=18'} 869 835 cpu: [x64] 870 836 os: [darwin] 871 837 872 - '@esbuild/darwin-x64@0.25.5': 873 - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} 838 + '@esbuild/darwin-x64@0.24.2': 839 + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 874 840 engines: {node: '>=18'} 875 841 cpu: [x64] 876 842 os: [darwin] 877 843 878 - '@esbuild/freebsd-arm64@0.25.4': 879 - resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} 844 + '@esbuild/freebsd-arm64@0.24.0': 845 + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} 880 846 engines: {node: '>=18'} 881 847 cpu: [arm64] 882 848 os: [freebsd] 883 849 884 - '@esbuild/freebsd-arm64@0.25.5': 885 - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} 850 + '@esbuild/freebsd-arm64@0.24.2': 851 + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 886 852 engines: {node: '>=18'} 887 853 cpu: [arm64] 888 854 os: [freebsd] 889 855 890 - '@esbuild/freebsd-x64@0.25.4': 891 - resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} 856 + '@esbuild/freebsd-x64@0.24.0': 857 + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} 892 858 engines: {node: '>=18'} 893 859 cpu: [x64] 894 860 os: [freebsd] 895 861 896 - '@esbuild/freebsd-x64@0.25.5': 897 - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} 862 + '@esbuild/freebsd-x64@0.24.2': 863 + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 898 864 engines: {node: '>=18'} 899 865 cpu: [x64] 900 866 os: [freebsd] 901 867 902 - '@esbuild/linux-arm64@0.25.4': 903 - resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} 868 + '@esbuild/linux-arm64@0.24.0': 869 + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} 904 870 engines: {node: '>=18'} 905 871 cpu: [arm64] 906 872 os: [linux] 907 873 908 - '@esbuild/linux-arm64@0.25.5': 909 - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} 874 + '@esbuild/linux-arm64@0.24.2': 875 + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 910 876 engines: {node: '>=18'} 911 877 cpu: [arm64] 912 878 os: [linux] 913 879 914 - '@esbuild/linux-arm@0.25.4': 915 - resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} 880 + '@esbuild/linux-arm@0.24.0': 881 + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} 916 882 engines: {node: '>=18'} 917 883 cpu: [arm] 918 884 os: [linux] 919 885 920 - '@esbuild/linux-arm@0.25.5': 921 - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} 886 + '@esbuild/linux-arm@0.24.2': 887 + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 922 888 engines: {node: '>=18'} 923 889 cpu: [arm] 924 890 os: [linux] 925 891 926 - '@esbuild/linux-ia32@0.25.4': 927 - resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} 892 + '@esbuild/linux-ia32@0.24.0': 893 + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} 928 894 engines: {node: '>=18'} 929 895 cpu: [ia32] 930 896 os: [linux] 931 897 932 - '@esbuild/linux-ia32@0.25.5': 933 - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} 898 + '@esbuild/linux-ia32@0.24.2': 899 + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 934 900 engines: {node: '>=18'} 935 901 cpu: [ia32] 936 902 os: [linux] 937 903 938 - '@esbuild/linux-loong64@0.25.4': 939 - resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} 904 + '@esbuild/linux-loong64@0.24.0': 905 + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} 940 906 engines: {node: '>=18'} 941 907 cpu: [loong64] 942 908 os: [linux] 943 909 944 - '@esbuild/linux-loong64@0.25.5': 945 - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} 910 + '@esbuild/linux-loong64@0.24.2': 911 + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 946 912 engines: {node: '>=18'} 947 913 cpu: [loong64] 948 914 os: [linux] 949 915 950 - '@esbuild/linux-mips64el@0.25.4': 951 - resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} 916 + '@esbuild/linux-mips64el@0.24.0': 917 + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} 952 918 engines: {node: '>=18'} 953 919 cpu: [mips64el] 954 920 os: [linux] 955 921 956 - '@esbuild/linux-mips64el@0.25.5': 957 - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} 922 + '@esbuild/linux-mips64el@0.24.2': 923 + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 958 924 engines: {node: '>=18'} 959 925 cpu: [mips64el] 960 926 os: [linux] 961 927 962 - '@esbuild/linux-ppc64@0.25.4': 963 - resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} 928 + '@esbuild/linux-ppc64@0.24.0': 929 + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} 964 930 engines: {node: '>=18'} 965 931 cpu: [ppc64] 966 932 os: [linux] 967 933 968 - '@esbuild/linux-ppc64@0.25.5': 969 - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} 934 + '@esbuild/linux-ppc64@0.24.2': 935 + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 970 936 engines: {node: '>=18'} 971 937 cpu: [ppc64] 972 938 os: [linux] 973 939 974 - '@esbuild/linux-riscv64@0.25.4': 975 - resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} 940 + '@esbuild/linux-riscv64@0.24.0': 941 + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} 976 942 engines: {node: '>=18'} 977 943 cpu: [riscv64] 978 944 os: [linux] 979 945 980 - '@esbuild/linux-riscv64@0.25.5': 981 - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} 946 + '@esbuild/linux-riscv64@0.24.2': 947 + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 982 948 engines: {node: '>=18'} 983 949 cpu: [riscv64] 984 950 os: [linux] 985 951 986 - '@esbuild/linux-s390x@0.25.4': 987 - resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} 952 + '@esbuild/linux-s390x@0.24.0': 953 + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} 988 954 engines: {node: '>=18'} 989 955 cpu: [s390x] 990 956 os: [linux] 991 957 992 - '@esbuild/linux-s390x@0.25.5': 993 - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} 958 + '@esbuild/linux-s390x@0.24.2': 959 + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 994 960 engines: {node: '>=18'} 995 961 cpu: [s390x] 996 962 os: [linux] 997 963 998 - '@esbuild/linux-x64@0.25.4': 999 - resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} 964 + '@esbuild/linux-x64@0.24.0': 965 + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} 1000 966 engines: {node: '>=18'} 1001 967 cpu: [x64] 1002 968 os: [linux] 1003 969 1004 - '@esbuild/linux-x64@0.25.5': 1005 - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} 970 + '@esbuild/linux-x64@0.24.2': 971 + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 1006 972 engines: {node: '>=18'} 1007 973 cpu: [x64] 1008 974 os: [linux] 1009 975 1010 - '@esbuild/netbsd-arm64@0.25.4': 1011 - resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} 976 + '@esbuild/netbsd-arm64@0.24.2': 977 + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 1012 978 engines: {node: '>=18'} 1013 979 cpu: [arm64] 1014 980 os: [netbsd] 1015 981 1016 - '@esbuild/netbsd-arm64@0.25.5': 1017 - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} 1018 - engines: {node: '>=18'} 1019 - cpu: [arm64] 1020 - os: [netbsd] 1021 - 1022 - '@esbuild/netbsd-x64@0.25.4': 1023 - resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} 982 + '@esbuild/netbsd-x64@0.24.0': 983 + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} 1024 984 engines: {node: '>=18'} 1025 985 cpu: [x64] 1026 986 os: [netbsd] 1027 987 1028 - '@esbuild/netbsd-x64@0.25.5': 1029 - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} 988 + '@esbuild/netbsd-x64@0.24.2': 989 + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 1030 990 engines: {node: '>=18'} 1031 991 cpu: [x64] 1032 992 os: [netbsd] 1033 993 1034 - '@esbuild/openbsd-arm64@0.25.4': 1035 - resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} 994 + '@esbuild/openbsd-arm64@0.24.0': 995 + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} 1036 996 engines: {node: '>=18'} 1037 997 cpu: [arm64] 1038 998 os: [openbsd] 1039 999 1040 - '@esbuild/openbsd-arm64@0.25.5': 1041 - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} 1000 + '@esbuild/openbsd-arm64@0.24.2': 1001 + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 1042 1002 engines: {node: '>=18'} 1043 1003 cpu: [arm64] 1044 1004 os: [openbsd] 1045 1005 1046 - '@esbuild/openbsd-x64@0.25.4': 1047 - resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} 1006 + '@esbuild/openbsd-x64@0.24.0': 1007 + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} 1048 1008 engines: {node: '>=18'} 1049 1009 cpu: [x64] 1050 1010 os: [openbsd] 1051 1011 1052 - '@esbuild/openbsd-x64@0.25.5': 1053 - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} 1012 + '@esbuild/openbsd-x64@0.24.2': 1013 + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 1054 1014 engines: {node: '>=18'} 1055 1015 cpu: [x64] 1056 1016 os: [openbsd] 1057 1017 1058 - '@esbuild/sunos-x64@0.25.4': 1059 - resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} 1018 + '@esbuild/sunos-x64@0.24.0': 1019 + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} 1060 1020 engines: {node: '>=18'} 1061 1021 cpu: [x64] 1062 1022 os: [sunos] 1063 1023 1064 - '@esbuild/sunos-x64@0.25.5': 1065 - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} 1024 + '@esbuild/sunos-x64@0.24.2': 1025 + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 1066 1026 engines: {node: '>=18'} 1067 1027 cpu: [x64] 1068 1028 os: [sunos] 1069 1029 1070 - '@esbuild/win32-arm64@0.25.4': 1071 - resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} 1030 + '@esbuild/win32-arm64@0.24.0': 1031 + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} 1072 1032 engines: {node: '>=18'} 1073 1033 cpu: [arm64] 1074 1034 os: [win32] 1075 1035 1076 - '@esbuild/win32-arm64@0.25.5': 1077 - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} 1036 + '@esbuild/win32-arm64@0.24.2': 1037 + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 1078 1038 engines: {node: '>=18'} 1079 1039 cpu: [arm64] 1080 1040 os: [win32] 1081 1041 1082 - '@esbuild/win32-ia32@0.25.4': 1083 - resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} 1042 + '@esbuild/win32-ia32@0.24.0': 1043 + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} 1084 1044 engines: {node: '>=18'} 1085 1045 cpu: [ia32] 1086 1046 os: [win32] 1087 1047 1088 - '@esbuild/win32-ia32@0.25.5': 1089 - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} 1048 + '@esbuild/win32-ia32@0.24.2': 1049 + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 1090 1050 engines: {node: '>=18'} 1091 1051 cpu: [ia32] 1092 1052 os: [win32] 1093 1053 1094 - '@esbuild/win32-x64@0.25.4': 1095 - resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} 1054 + '@esbuild/win32-x64@0.24.0': 1055 + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} 1096 1056 engines: {node: '>=18'} 1097 1057 cpu: [x64] 1098 1058 os: [win32] 1099 1059 1100 - '@esbuild/win32-x64@0.25.5': 1101 - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} 1060 + '@esbuild/win32-x64@0.24.2': 1061 + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 1102 1062 engines: {node: '>=18'} 1103 1063 cpu: [x64] 1104 1064 os: [win32] ··· 1117 1077 resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} 1118 1078 engines: {node: '>=14'} 1119 1079 1120 - '@floating-ui/core@1.7.1': 1121 - resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} 1080 + '@floating-ui/core@1.6.9': 1081 + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} 1122 1082 1123 - '@floating-ui/dom@1.7.1': 1124 - resolution: {integrity: sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==} 1083 + '@floating-ui/dom@1.6.13': 1084 + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} 1125 1085 1126 1086 '@floating-ui/utils@0.2.9': 1127 1087 resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} ··· 1265 1225 '@jsr/mary__async-iterator-fns@0.1.1': 1266 1226 resolution: {integrity: sha512-ef/TDpu6yGTAb4fbGEjSFPO7u49WrxJeXa9T6fvmjlpEfR84qxrjTR6MEUQ1hMySD0+O9yQKvBl/KL5x7K9+iA==, tarball: https://npm.jsr.io/~/11/@jsr/mary__async-iterator-fns/0.1.1.tgz} 1267 1227 1268 - '@jsr/mary__batch-fetch@0.1.0': 1269 - resolution: {integrity: sha512-A5SmTfDUMjr+AaJA+wFg4eKKVQm6/51CYTg5ssO+vcnaCJoP1Y0RURG6VkMno9QUholf3AAldfzRgQOXDZbFgg==, tarball: https://npm.jsr.io/~/11/@jsr/mary__batch-fetch/0.1.0.tgz} 1270 - 1271 1228 '@jsr/mary__date-fns@0.1.3': 1272 1229 resolution: {integrity: sha512-kjS04BESEHO9ZTqjOxk4ip8DsAdVDmt/jC5V4zVIYq3VD/04+WJK9kjdQda23eVZMuF9ZZY0zMswU7UXG+PSrg==, tarball: https://npm.jsr.io/~/11/@jsr/mary__date-fns/0.1.3.tgz} 1273 1230 ··· 1276 1233 1277 1234 '@jsr/mary__exif-rm@0.2.2': 1278 1235 resolution: {integrity: sha512-+ZpLaC+1CyqWhH608Sqd6/yTG0pOlokn2tCXha7s1SMQ+GLKo4Nn/PskTeeP9Pt+6gNYSu6ednoSlRvXb2ZGxg==, tarball: https://npm.jsr.io/~/11/@jsr/mary__exif-rm/0.2.2.tgz} 1279 - 1280 - '@kelinci/basa-lexicons@1.0.0': 1281 - resolution: {integrity: sha512-QND0ktwpGySoHhqRUrLZ3YybyHnOkV6mGCLn75yJWl9PpKIMh/gmAyvXIo1ZuzSHu4v6xcSyi3A78QoH4MhTGw==} 1282 1236 1283 1237 '@nodelib/fs.scandir@2.1.5': 1284 1238 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} ··· 1351 1305 peerDependencies: 1352 1306 rollup: ^1.20.0||^2.0.0 1353 1307 1354 - '@rollup/pluginutils@5.2.0': 1355 - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} 1308 + '@rollup/pluginutils@5.1.4': 1309 + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 1356 1310 engines: {node: '>=14.0.0'} 1357 1311 peerDependencies: 1358 1312 rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 ··· 1360 1314 rollup: 1361 1315 optional: true 1362 1316 1363 - '@rollup/rollup-android-arm-eabi@4.44.0': 1364 - resolution: {integrity: sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==} 1317 + '@rollup/rollup-android-arm-eabi@4.37.0': 1318 + resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==} 1365 1319 cpu: [arm] 1366 1320 os: [android] 1367 1321 1368 - '@rollup/rollup-android-arm64@4.44.0': 1369 - resolution: {integrity: sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==} 1322 + '@rollup/rollup-android-arm64@4.37.0': 1323 + resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==} 1370 1324 cpu: [arm64] 1371 1325 os: [android] 1372 1326 1373 - '@rollup/rollup-darwin-arm64@4.44.0': 1374 - resolution: {integrity: sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==} 1327 + '@rollup/rollup-darwin-arm64@4.37.0': 1328 + resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==} 1375 1329 cpu: [arm64] 1376 1330 os: [darwin] 1377 1331 1378 - '@rollup/rollup-darwin-x64@4.44.0': 1379 - resolution: {integrity: sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==} 1332 + '@rollup/rollup-darwin-x64@4.37.0': 1333 + resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==} 1380 1334 cpu: [x64] 1381 1335 os: [darwin] 1382 1336 1383 - '@rollup/rollup-freebsd-arm64@4.44.0': 1384 - resolution: {integrity: sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==} 1337 + '@rollup/rollup-freebsd-arm64@4.37.0': 1338 + resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==} 1385 1339 cpu: [arm64] 1386 1340 os: [freebsd] 1387 1341 1388 - '@rollup/rollup-freebsd-x64@4.44.0': 1389 - resolution: {integrity: sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==} 1342 + '@rollup/rollup-freebsd-x64@4.37.0': 1343 + resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==} 1390 1344 cpu: [x64] 1391 1345 os: [freebsd] 1392 1346 1393 - '@rollup/rollup-linux-arm-gnueabihf@4.44.0': 1394 - resolution: {integrity: sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==} 1347 + '@rollup/rollup-linux-arm-gnueabihf@4.37.0': 1348 + resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==} 1395 1349 cpu: [arm] 1396 1350 os: [linux] 1397 1351 1398 - '@rollup/rollup-linux-arm-musleabihf@4.44.0': 1399 - resolution: {integrity: sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==} 1352 + '@rollup/rollup-linux-arm-musleabihf@4.37.0': 1353 + resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==} 1400 1354 cpu: [arm] 1401 1355 os: [linux] 1402 1356 1403 - '@rollup/rollup-linux-arm64-gnu@4.44.0': 1404 - resolution: {integrity: sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==} 1357 + '@rollup/rollup-linux-arm64-gnu@4.37.0': 1358 + resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==} 1405 1359 cpu: [arm64] 1406 1360 os: [linux] 1407 1361 1408 - '@rollup/rollup-linux-arm64-musl@4.44.0': 1409 - resolution: {integrity: sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==} 1362 + '@rollup/rollup-linux-arm64-musl@4.37.0': 1363 + resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==} 1410 1364 cpu: [arm64] 1411 1365 os: [linux] 1412 1366 1413 - '@rollup/rollup-linux-loongarch64-gnu@4.44.0': 1414 - resolution: {integrity: sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==} 1367 + '@rollup/rollup-linux-loongarch64-gnu@4.37.0': 1368 + resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==} 1415 1369 cpu: [loong64] 1416 1370 os: [linux] 1417 1371 1418 - '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': 1419 - resolution: {integrity: sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==} 1372 + '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': 1373 + resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==} 1420 1374 cpu: [ppc64] 1421 1375 os: [linux] 1422 1376 1423 - '@rollup/rollup-linux-riscv64-gnu@4.44.0': 1424 - resolution: {integrity: sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==} 1377 + '@rollup/rollup-linux-riscv64-gnu@4.37.0': 1378 + resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==} 1425 1379 cpu: [riscv64] 1426 1380 os: [linux] 1427 1381 1428 - '@rollup/rollup-linux-riscv64-musl@4.44.0': 1429 - resolution: {integrity: sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==} 1382 + '@rollup/rollup-linux-riscv64-musl@4.37.0': 1383 + resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==} 1430 1384 cpu: [riscv64] 1431 1385 os: [linux] 1432 1386 1433 - '@rollup/rollup-linux-s390x-gnu@4.44.0': 1434 - resolution: {integrity: sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==} 1387 + '@rollup/rollup-linux-s390x-gnu@4.37.0': 1388 + resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==} 1435 1389 cpu: [s390x] 1436 1390 os: [linux] 1437 1391 1438 - '@rollup/rollup-linux-x64-gnu@4.44.0': 1439 - resolution: {integrity: sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==} 1392 + '@rollup/rollup-linux-x64-gnu@4.37.0': 1393 + resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==} 1440 1394 cpu: [x64] 1441 1395 os: [linux] 1442 1396 1443 - '@rollup/rollup-linux-x64-musl@4.44.0': 1444 - resolution: {integrity: sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==} 1397 + '@rollup/rollup-linux-x64-musl@4.37.0': 1398 + resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==} 1445 1399 cpu: [x64] 1446 1400 os: [linux] 1447 1401 1448 - '@rollup/rollup-win32-arm64-msvc@4.44.0': 1449 - resolution: {integrity: sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==} 1402 + '@rollup/rollup-win32-arm64-msvc@4.37.0': 1403 + resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==} 1450 1404 cpu: [arm64] 1451 1405 os: [win32] 1452 1406 1453 - '@rollup/rollup-win32-ia32-msvc@4.44.0': 1454 - resolution: {integrity: sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==} 1407 + '@rollup/rollup-win32-ia32-msvc@4.37.0': 1408 + resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==} 1455 1409 cpu: [ia32] 1456 1410 os: [win32] 1457 1411 1458 - '@rollup/rollup-win32-x64-msvc@4.44.0': 1459 - resolution: {integrity: sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==} 1412 + '@rollup/rollup-win32-x64-msvc@4.37.0': 1413 + resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==} 1460 1414 cpu: [x64] 1461 1415 os: [win32] 1462 1416 ··· 1485 1439 '@types/babel__core@7.20.5': 1486 1440 resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 1487 1441 1488 - '@types/babel__generator@7.27.0': 1489 - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 1442 + '@types/babel__generator@7.6.8': 1443 + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 1490 1444 1491 1445 '@types/babel__template@7.4.4': 1492 1446 resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} ··· 1497 1451 '@types/dom-close-watcher@1.0.0': 1498 1452 resolution: {integrity: sha512-7pL0By56sVVGMSJ3HdSY+u08Id0ljStCaf1VnGFxwfpuNdA0HMz0sl2J24eSi9M6ptl9ySkVK35jF75Fn8trUg==} 1499 1453 1500 - '@types/dom-webcodecs@0.1.15': 1501 - resolution: {integrity: sha512-omOlCPvTWyPm4ZE5bZUhlSvnHM2ZWM2U+1cPiYFL/e8aV5O9MouELp+L4dMKNTON0nTeHqEg+KWDfFQMY5Wkaw==} 1454 + '@types/dom-webcodecs@0.1.14': 1455 + resolution: {integrity: sha512-ba9aF0qARLLQpLihONIRbj8VvAdUxO+5jIxlscVcDAQTcJmq5qVr781+ino5qbQUJUmO21cLP2eLeXYWzao5Vg==} 1502 1456 1503 1457 '@types/estree@0.0.39': 1504 1458 resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} 1505 1459 1506 - '@types/estree@1.0.8': 1507 - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 1460 + '@types/estree@1.0.6': 1461 + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 1508 1462 1509 - '@types/node@24.3.0': 1510 - resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} 1463 + '@types/estree@1.0.7': 1464 + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 1511 1465 1512 1466 '@types/resolve@1.20.2': 1513 1467 resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} ··· 1527 1481 engines: {node: '>=0.4.0'} 1528 1482 hasBin: true 1529 1483 1530 - acorn@8.15.0: 1531 - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 1484 + acorn@8.14.1: 1485 + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 1532 1486 engines: {node: '>=0.4.0'} 1533 1487 hasBin: true 1534 1488 ··· 1578 1532 peerDependencies: 1579 1533 postcss: ^8.1.0 1580 1534 1581 - babel-plugin-jsx-dom-expressions@0.39.8: 1582 - resolution: {integrity: sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ==} 1535 + babel-plugin-jsx-dom-expressions@0.39.7: 1536 + resolution: {integrity: sha512-8GzVmFla7jaTNWW8W+lTMl9YGva4/06CtwJjySnkYtt8G1v9weCzc2SuF1DfrudcCNb2Doetc1FRg33swBYZCA==} 1583 1537 peerDependencies: 1584 1538 '@babel/core': ^7.20.12 1585 1539 ··· 1603 1557 peerDependencies: 1604 1558 '@babel/core': ^7.24.4 1605 1559 1606 - babel-preset-solid@1.9.6: 1607 - resolution: {integrity: sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==} 1560 + babel-preset-solid@1.9.5: 1561 + resolution: {integrity: sha512-85I3osODJ1LvZbv8wFozROV1vXq32BubqHXAGu73A//TRs3NLI1OFP83AQBUTSQHwgZQmARjHlJciym3we+V+w==} 1608 1562 peerDependencies: 1609 1563 '@babel/core': ^7.0.0 1610 1564 ··· 1621 1575 blake3-wasm@2.1.5: 1622 1576 resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 1623 1577 1624 - brace-expansion@1.1.12: 1625 - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 1578 + brace-expansion@1.1.11: 1579 + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1626 1580 1627 - brace-expansion@2.0.2: 1628 - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 1581 + brace-expansion@2.0.1: 1582 + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1629 1583 1630 1584 braces@3.0.3: 1631 1585 resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 1632 1586 engines: {node: '>=8'} 1633 1587 1634 - browserslist@4.25.0: 1635 - resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} 1588 + browserslist@4.24.4: 1589 + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 1636 1590 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1637 1591 hasBin: true 1638 1592 ··· 1643 1597 resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 1644 1598 engines: {node: '>= 6'} 1645 1599 1646 - caniuse-lite@1.0.30001724: 1647 - resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} 1600 + caniuse-lite@1.0.30001707: 1601 + resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} 1648 1602 1649 1603 chalk@4.1.2: 1650 1604 resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} ··· 1688 1642 convert-source-map@2.0.0: 1689 1643 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1690 1644 1691 - cookie@0.7.2: 1692 - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 1645 + cookie@0.5.0: 1646 + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 1693 1647 engines: {node: '>= 0.6'} 1694 1648 1695 - core-js-compat@3.43.0: 1696 - resolution: {integrity: sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==} 1649 + core-js-compat@3.41.0: 1650 + resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} 1697 1651 1698 1652 cross-spawn@7.0.6: 1699 1653 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} ··· 1714 1668 data-uri-to-buffer@2.0.2: 1715 1669 resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} 1716 1670 1717 - debug@4.4.1: 1718 - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 1671 + debug@4.4.0: 1672 + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 1719 1673 engines: {node: '>=6.0'} 1720 1674 peerDependencies: 1721 1675 supports-color: '*' ··· 1730 1684 defu@6.1.4: 1731 1685 resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 1732 1686 1733 - detect-libc@2.0.4: 1734 - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} 1687 + detect-libc@2.0.3: 1688 + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} 1735 1689 engines: {node: '>=8'} 1736 1690 1737 1691 didyoumean@1.2.2: ··· 1748 1702 engines: {node: '>=0.10.0'} 1749 1703 hasBin: true 1750 1704 1751 - electron-to-chromium@1.5.171: 1752 - resolution: {integrity: sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==} 1705 + electron-to-chromium@1.5.128: 1706 + resolution: {integrity: sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==} 1753 1707 1754 1708 emoji-regex@8.0.0: 1755 1709 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} ··· 1757 1711 emoji-regex@9.2.2: 1758 1712 resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1759 1713 1760 - entities@6.0.1: 1761 - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 1714 + entities@4.5.0: 1715 + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1762 1716 engines: {node: '>=0.12'} 1763 1717 1764 - esbuild@0.25.4: 1765 - resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} 1718 + esbuild@0.24.0: 1719 + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} 1766 1720 engines: {node: '>=18'} 1767 1721 hasBin: true 1768 1722 1769 - esbuild@0.25.5: 1770 - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} 1723 + esbuild@0.24.2: 1724 + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 1771 1725 engines: {node: '>=18'} 1772 1726 hasBin: true 1773 1727 ··· 1775 1729 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 1776 1730 engines: {node: '>=6'} 1777 1731 1778 - esm-env@1.2.2: 1779 - resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 1780 - 1781 1732 estree-walker@1.0.1: 1782 1733 resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} 1783 1734 ··· 1792 1743 resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} 1793 1744 engines: {node: '>=6'} 1794 1745 1795 - exsolve@1.0.7: 1796 - resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} 1746 + exsolve@1.0.4: 1747 + resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} 1797 1748 1798 1749 fast-deep-equal@3.1.3: 1799 1750 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} ··· 1811 1762 fastq@1.19.1: 1812 1763 resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 1813 1764 1814 - fdir@6.4.6: 1815 - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} 1765 + fdir@6.4.3: 1766 + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} 1816 1767 peerDependencies: 1817 1768 picomatch: ^3 || ^4 1818 1769 peerDependenciesMeta: ··· 1885 1836 resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1886 1837 engines: {node: '>=8'} 1887 1838 1888 - hls.js@1.6.5: 1889 - resolution: {integrity: sha512-KMn5n7JBK+olC342740hDPHnGWfE8FiHtGMOdJPfUjRdARTWj9OB+8c13fnsf9sk1VtpuU2fKSgUjHvg4rNbzQ==} 1839 + hls.js@1.6.0: 1840 + resolution: {integrity: sha512-AlW8ymcDKZuKtzXCUmEy4nOcHRkebnShH6t6hC2+QJQP0WXlTUSSO9Kp22uSEYdCgpwkXEJsfOhqxrgO2tDctQ==} 1890 1841 1891 1842 html-entities@2.3.3: 1892 1843 resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} ··· 1894 1845 idb@7.1.1: 1895 1846 resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} 1896 1847 1897 - idb@8.0.3: 1898 - resolution: {integrity: sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==} 1848 + idb@8.0.2: 1849 + resolution: {integrity: sha512-CX70rYhx7GDDQzwwQMDwF6kDRQi5vVs6khHUumDrMecBylKkwvZ8HWvKV08AGb7VbpoGCWUQ4aHzNDgoUiOIUg==} 1899 1850 1900 1851 inflight@1.0.6: 1901 1852 resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} ··· 2041 1992 engines: {node: '>=10.0.0'} 2042 1993 hasBin: true 2043 1994 2044 - miniflare@4.20250617.3: 2045 - resolution: {integrity: sha512-j+LZycT11UdlVeNdaqD0XdNnYnqAL+wXmboz+tNPFgTq6zhD489Ujj3BfSDyEHDCA9UFBLbkc5ByGWBh+pYZ5Q==} 1995 + miniflare@4.20250321.1: 1996 + resolution: {integrity: sha512-pQuVtF6vQ1zMvPCo3Z19mzSFjgnlEnybzNzAJZipsqIk6kMXpYBZq+d8cWmeQFkBYlgeZKeKJ4EBKT6KapfTNg==} 2046 1997 engines: {node: '>=18.0.0'} 2047 1998 hasBin: true 2048 1999 ··· 2109 2060 package-json-from-dist@1.0.1: 2110 2061 resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 2111 2062 2112 - parse5@7.3.0: 2113 - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} 2063 + parse5@7.2.1: 2064 + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} 2114 2065 2115 2066 path-is-absolute@1.0.1: 2116 2067 resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} ··· 2189 2140 postcss-value-parser@4.2.0: 2190 2141 resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 2191 2142 2192 - postcss@8.5.6: 2193 - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 2143 + postcss@8.5.3: 2144 + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 2194 2145 engines: {node: ^10 || ^12 || >=14} 2195 2146 2196 - prettier-plugin-tailwindcss@0.6.13: 2197 - resolution: {integrity: sha512-uQ0asli1+ic8xrrSmIOaElDu0FacR4x69GynTh2oZjFY10JUt6EEumTQl5tB4fMeD6I1naKd+4rXQQ7esT2i1g==} 2147 + prettier-plugin-tailwindcss@0.6.11: 2148 + resolution: {integrity: sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==} 2198 2149 engines: {node: '>=14.21.3'} 2199 2150 peerDependencies: 2200 2151 '@ianvs/prettier-plugin-sort-imports': '*' ··· 2248 2199 prettier-plugin-svelte: 2249 2200 optional: true 2250 2201 2251 - prettier@3.6.0: 2252 - resolution: {integrity: sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw==} 2202 + prettier@3.5.3: 2203 + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 2253 2204 engines: {node: '>=14'} 2254 2205 hasBin: true 2255 2206 ··· 2291 2242 regenerate@1.4.2: 2292 2243 resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} 2293 2244 2245 + regenerator-runtime@0.14.1: 2246 + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 2247 + 2248 + regenerator-transform@0.15.2: 2249 + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} 2250 + 2294 2251 regexpu-core@6.2.0: 2295 2252 resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} 2296 2253 engines: {node: '>=4'} ··· 2320 2277 engines: {node: '>=10.0.0'} 2321 2278 hasBin: true 2322 2279 2323 - rollup@4.44.0: 2324 - resolution: {integrity: sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==} 2280 + rollup@4.37.0: 2281 + resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==} 2325 2282 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2326 2283 hasBin: true 2327 2284 ··· 2332 2289 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2333 2290 hasBin: true 2334 2291 2335 - semver@7.7.2: 2336 - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 2292 + semver@7.7.1: 2293 + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 2337 2294 engines: {node: '>=10'} 2338 2295 hasBin: true 2339 2296 2340 2297 serialize-javascript@6.0.2: 2341 2298 resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 2342 2299 2343 - seroval-plugins@1.3.2: 2344 - resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} 2300 + seroval-plugins@1.2.1: 2301 + resolution: {integrity: sha512-H5vs53+39+x4Udwp4J5rNZfgFuA+Lt+uU+09w1gYBVWomtAl98B+E9w7yC05Xc81/HgLvJdlyqJbU0fJCKCmdw==} 2345 2302 engines: {node: '>=10'} 2346 2303 peerDependencies: 2347 2304 seroval: ^1.0 2348 2305 2349 - seroval@1.3.2: 2350 - resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 2306 + seroval@1.2.1: 2307 + resolution: {integrity: sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw==} 2351 2308 engines: {node: '>=10'} 2352 2309 2353 2310 sharp@0.33.5: ··· 2379 2336 '@floating-ui/dom': ^1.0 2380 2337 solid-js: ^1.3 2381 2338 2382 - solid-js@1.9.7: 2383 - resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} 2339 + solid-js@1.9.5: 2340 + resolution: {integrity: sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw==} 2384 2341 2385 2342 solid-refresh@0.6.3: 2386 2343 resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} ··· 2463 2420 resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} 2464 2421 engines: {node: '>=10'} 2465 2422 2466 - terser@5.43.1: 2467 - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} 2423 + terser@5.39.0: 2424 + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} 2468 2425 engines: {node: '>=10'} 2469 2426 hasBin: true 2470 2427 ··· 2475 2432 thenify@3.3.1: 2476 2433 resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2477 2434 2478 - tinyglobby@0.2.14: 2479 - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 2435 + tinyglobby@0.2.12: 2436 + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} 2480 2437 engines: {node: '>=12.0.0'} 2481 2438 2482 2439 to-regex-range@5.0.1: ··· 2496 2453 resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} 2497 2454 engines: {node: '>=10'} 2498 2455 2499 - typescript@5.8.3: 2500 - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 2456 + typescript@5.7.2: 2457 + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 2501 2458 engines: {node: '>=14.17'} 2502 2459 hasBin: true 2503 2460 2504 - ufo@1.6.1: 2505 - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 2506 - 2507 - undici-types@7.10.0: 2508 - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} 2461 + ufo@1.5.4: 2462 + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} 2509 2463 2510 2464 undici@5.29.0: 2511 2465 resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} 2512 2466 engines: {node: '>=14.0'} 2513 2467 2514 - unenv@2.0.0-rc.17: 2515 - resolution: {integrity: sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==} 2468 + unenv@2.0.0-rc.15: 2469 + resolution: {integrity: sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==} 2516 2470 2517 2471 unicode-canonical-property-names-ecmascript@2.0.1: 2518 2472 resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} ··· 2551 2505 util-deprecate@1.0.2: 2552 2506 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2553 2507 2554 - validate-html-nesting@1.2.3: 2555 - resolution: {integrity: sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==} 2508 + validate-html-nesting@1.2.2: 2509 + resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} 2556 2510 2557 2511 vite-plugin-pwa@0.21.0: 2558 2512 resolution: {integrity: sha512-gnDE5sN2hdxA4vTl0pe6PCTPXqChk175jH8dZVVTBjFhWarZZoXaAdoTIKCIa8Zbx94sC0CnCOyERBWpxvry+g==} ··· 2574 2528 '@testing-library/jest-dom': 2575 2529 optional: true 2576 2530 2577 - vite@6.3.5: 2578 - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 2531 + vite@6.0.5: 2532 + resolution: {integrity: sha512-akD5IAH/ID5imgue2DYhzsEwCi0/4VKY31uhMLEYJwPP4TiUp8pL5PIK+Wo7H8qT8JY9i+pVfPydcFPYD1EL7g==} 2579 2533 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 2580 2534 hasBin: true 2581 2535 peerDependencies: ··· 2614 2568 yaml: 2615 2569 optional: true 2616 2570 2617 - vitefu@1.0.7: 2618 - resolution: {integrity: sha512-eRWXLBbJjW3X5z5P5IHcSm2yYbYRPb2kQuc+oqsbAl99WB5kVsPbiiox+cymo8twTzifA6itvhr2CmjnaZZp0Q==} 2571 + vitefu@1.0.6: 2572 + resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} 2619 2573 peerDependencies: 2620 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 2574 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 2621 2575 peerDependenciesMeta: 2622 2576 vite: 2623 2577 optional: true ··· 2625 2579 webidl-conversions@4.0.2: 2626 2580 resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 2627 2581 2628 - webm-muxer@5.1.3: 2629 - resolution: {integrity: sha512-zHLsTCXJ1m+sSVt2xefsmGuGz/mHcGtKzjL7Tekx2HaodpjT4xYyZnm+DrECv5D7EPt8p+XV74MUy41Ley1mdg==} 2582 + webm-muxer@5.1.1: 2583 + resolution: {integrity: sha512-oqGiFrwVr0LoVEIgSIISV+CURkPje1K2WiTzH+FUT4A70PcZHSPkwihBxwr+jumr76sQmhMHo9mvP82AuNiCiA==} 2630 2584 2631 2585 whatwg-url@7.1.0: 2632 2586 resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} ··· 2685 2639 workbox-window@7.3.0: 2686 2640 resolution: {integrity: sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==} 2687 2641 2688 - workerd@1.20250617.0: 2689 - resolution: {integrity: sha512-Uv6p0PYUHp/W/aWfUPLkZVAoAjapisM27JJlwcX9wCPTfCfnuegGOxFMvvlYpmNaX4YCwEdLCwuNn3xkpSkuZw==} 2642 + workerd@1.20250321.0: 2643 + resolution: {integrity: sha512-vyuz9pdJ+7o1lC79vQ2UVRLXPARa2Lq94PbTfqEcYQeSxeR9X+YqhNq2yysv8Zs5vpokmexLCtMniPp9u+2LVQ==} 2690 2644 engines: {node: '>=16'} 2691 2645 hasBin: true 2692 2646 2693 - wrangler@4.20.5: 2694 - resolution: {integrity: sha512-tmiyt2vBHszhdzJEDbCpFLU2RiV7/QzvGMV07Zaz4ptqiU2h/lTojyNJAugPpSFNiOuY+k0g3ENNTDQqoUkMFA==} 2647 + wrangler@4.6.0: 2648 + resolution: {integrity: sha512-2a2ZD0adlvxQ1H+nRKkuuD0dkgaYTOPlC7gBolItk5TfqOSliEV4m6DtZtKtJp33ioM+Uy6TlEWPpA2TrDveEQ==} 2695 2649 engines: {node: '>=18.0.0'} 2696 2650 hasBin: true 2697 2651 peerDependencies: 2698 - '@cloudflare/workers-types': ^4.20250617.0 2652 + '@cloudflare/workers-types': ^4.20250321.0 2699 2653 peerDependenciesMeta: 2700 2654 '@cloudflare/workers-types': 2701 2655 optional: true ··· 2726 2680 yallist@3.1.1: 2727 2681 resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 2728 2682 2729 - yaml@2.8.0: 2730 - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} 2731 - engines: {node: '>= 14.6'} 2683 + yaml@2.7.0: 2684 + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} 2685 + engines: {node: '>= 14'} 2732 2686 hasBin: true 2733 2687 2734 - youch@3.3.4: 2735 - resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} 2688 + youch@3.2.3: 2689 + resolution: {integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==} 2736 2690 2737 2691 zod@3.22.3: 2738 2692 resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} ··· 2753 2707 jsonpointer: 5.0.1 2754 2708 leven: 3.1.0 2755 2709 2756 - '@atcute/atproto@3.1.0': 2710 + '@atcute/bluemoji@1.0.4(@atcute/bluesky@1.0.15(@atcute/client@2.0.9))(@atcute/client@2.0.9)': 2757 2711 dependencies: 2758 - '@atcute/lexicons': 1.1.0 2759 - 2760 - '@atcute/bluemoji@3.1.0': 2761 - dependencies: 2762 - '@atcute/atproto': 3.1.0 2763 - '@atcute/bluesky': 3.1.3 2764 - '@atcute/lexicons': 1.1.0 2712 + '@atcute/bluesky': 1.0.15(@atcute/client@2.0.9) 2713 + '@atcute/client': 2.0.9 2765 2714 2766 2715 '@atcute/bluesky-richtext-parser@1.0.7': {} 2767 2716 2768 - '@atcute/bluesky-richtext-segmenter@2.0.3': 2717 + '@atcute/bluesky-richtext-segmenter@1.0.5(@atcute/bluesky@1.0.15(@atcute/client@2.0.9))(@atcute/client@2.0.9)': 2769 2718 dependencies: 2770 - '@atcute/bluesky': 3.1.3 2771 - '@atcute/lexicons': 1.1.0 2719 + '@atcute/bluesky': 1.0.15(@atcute/client@2.0.9) 2720 + '@atcute/client': 2.0.9 2772 2721 2773 2722 '@atcute/bluesky-search-parser@0.1.0': {} 2774 2723 2775 - '@atcute/bluesky@3.1.3': 2776 - dependencies: 2777 - '@atcute/atproto': 3.1.0 2778 - '@atcute/lexicons': 1.1.0 2779 - 2780 - '@atcute/cbor@2.2.4': 2781 - dependencies: 2782 - '@atcute/cid': 2.2.3 2783 - '@atcute/multibase': 1.1.4 2784 - '@atcute/uint8array': 1.0.3 2785 - 2786 - '@atcute/cid@2.2.3': 2787 - dependencies: 2788 - '@atcute/multibase': 1.1.4 2789 - '@atcute/uint8array': 1.0.3 2790 - 2791 - '@atcute/client@4.0.3': 2792 - dependencies: 2793 - '@atcute/identity': 1.1.0 2794 - '@atcute/lexicons': 1.1.0 2795 - 2796 - '@atcute/identity-resolver@1.1.3(@atcute/identity@1.1.0)': 2724 + '@atcute/bluesky@1.0.15(@atcute/client@2.0.9)': 2797 2725 dependencies: 2798 - '@atcute/identity': 1.1.0 2799 - '@atcute/lexicons': 1.1.1 2800 - '@atcute/util-fetch': 1.0.1 2801 - '@badrap/valita': 0.4.5 2726 + '@atcute/client': 2.0.9 2802 2727 2803 - '@atcute/identity@1.1.0': 2728 + '@atcute/cbor@2.2.0': 2804 2729 dependencies: 2805 - '@atcute/lexicons': 1.1.1 2806 - '@badrap/valita': 0.4.5 2730 + '@atcute/cid': 2.2.0 2731 + '@atcute/multibase': 1.1.2 2732 + '@atcute/uint8array': 1.0.1 2807 2733 2808 - '@atcute/lexicons@1.1.0': 2734 + '@atcute/cid@2.2.0': 2809 2735 dependencies: 2810 - esm-env: 1.2.2 2736 + '@atcute/multibase': 1.1.2 2737 + '@atcute/uint8array': 1.0.1 2811 2738 2812 - '@atcute/lexicons@1.1.1': 2813 - dependencies: 2814 - esm-env: 1.2.2 2739 + '@atcute/client@2.0.9': {} 2815 2740 2816 - '@atcute/multibase@1.1.4': 2741 + '@atcute/multibase@1.1.2': 2817 2742 dependencies: 2818 - '@atcute/uint8array': 1.0.3 2743 + '@atcute/uint8array': 1.0.1 2819 2744 2820 - '@atcute/oauth-browser-client@2.0.0-next.0': 2745 + '@atcute/oauth-browser-client@1.0.16': 2821 2746 dependencies: 2822 - '@atcute/client': 4.0.3 2823 - '@atcute/identity': 1.1.0 2824 - '@atcute/identity-resolver': 1.1.3(@atcute/identity@1.1.0) 2825 - '@atcute/lexicons': 1.1.1 2826 - '@atcute/multibase': 1.1.4 2827 - '@atcute/uint8array': 1.0.3 2828 - nanoid: 5.1.5 2747 + '@atcute/client': 2.0.9 2748 + '@atcute/multibase': 1.1.2 2749 + '@atcute/uint8array': 1.0.1 2829 2750 2830 2751 '@atcute/tid@1.0.2': {} 2831 2752 2832 - '@atcute/uint8array@1.0.3': {} 2833 - 2834 - '@atcute/util-fetch@1.0.1': 2835 - dependencies: 2836 - '@badrap/valita': 0.4.5 2753 + '@atcute/uint8array@1.0.1': {} 2837 2754 2838 2755 '@atlaskit/pragmatic-drag-and-drop-hitbox@1.0.3': 2839 2756 dependencies: 2840 - '@atlaskit/pragmatic-drag-and-drop': 1.6.0 2841 - '@babel/runtime': 7.27.6 2757 + '@atlaskit/pragmatic-drag-and-drop': 1.5.2 2758 + '@babel/runtime': 7.27.0 2842 2759 2843 - '@atlaskit/pragmatic-drag-and-drop@1.6.0': 2760 + '@atlaskit/pragmatic-drag-and-drop@1.5.2': 2844 2761 dependencies: 2845 - '@babel/runtime': 7.27.6 2762 + '@babel/runtime': 7.27.0 2846 2763 bind-event-listener: 3.0.0 2847 2764 raf-schd: 4.0.3 2848 2765 2849 - '@babel/code-frame@7.27.1': 2766 + '@babel/code-frame@7.26.2': 2850 2767 dependencies: 2851 - '@babel/helper-validator-identifier': 7.27.1 2768 + '@babel/helper-validator-identifier': 7.25.9 2852 2769 js-tokens: 4.0.0 2853 2770 picocolors: 1.1.1 2854 2771 2855 - '@babel/compat-data@7.27.5': {} 2772 + '@babel/compat-data@7.26.8': {} 2856 2773 2857 - '@babel/core@7.27.4': 2774 + '@babel/core@7.26.10': 2858 2775 dependencies: 2859 2776 '@ampproject/remapping': 2.3.0 2860 - '@babel/code-frame': 7.27.1 2861 - '@babel/generator': 7.27.5 2862 - '@babel/helper-compilation-targets': 7.27.2 2863 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) 2864 - '@babel/helpers': 7.27.6 2865 - '@babel/parser': 7.27.5 2866 - '@babel/template': 7.27.2 2867 - '@babel/traverse': 7.27.4 2868 - '@babel/types': 7.27.6 2777 + '@babel/code-frame': 7.26.2 2778 + '@babel/generator': 7.27.0 2779 + '@babel/helper-compilation-targets': 7.27.0 2780 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) 2781 + '@babel/helpers': 7.27.0 2782 + '@babel/parser': 7.27.0 2783 + '@babel/template': 7.27.0 2784 + '@babel/traverse': 7.27.0 2785 + '@babel/types': 7.27.0 2869 2786 convert-source-map: 2.0.0 2870 - debug: 4.4.1 2787 + debug: 4.4.0 2871 2788 gensync: 1.0.0-beta.2 2872 2789 json5: 2.2.3 2873 2790 semver: 6.3.1 2874 2791 transitivePeerDependencies: 2875 2792 - supports-color 2876 2793 2877 - '@babel/generator@7.27.5': 2794 + '@babel/generator@7.27.0': 2878 2795 dependencies: 2879 - '@babel/parser': 7.27.5 2880 - '@babel/types': 7.27.6 2796 + '@babel/parser': 7.27.0 2797 + '@babel/types': 7.27.0 2881 2798 '@jridgewell/gen-mapping': 0.3.8 2882 2799 '@jridgewell/trace-mapping': 0.3.25 2883 2800 jsesc: 3.1.0 2884 2801 2885 - '@babel/helper-annotate-as-pure@7.27.3': 2802 + '@babel/helper-annotate-as-pure@7.25.9': 2886 2803 dependencies: 2887 - '@babel/types': 7.27.6 2804 + '@babel/types': 7.27.0 2888 2805 2889 - '@babel/helper-compilation-targets@7.27.2': 2806 + '@babel/helper-compilation-targets@7.27.0': 2890 2807 dependencies: 2891 - '@babel/compat-data': 7.27.5 2892 - '@babel/helper-validator-option': 7.27.1 2893 - browserslist: 4.25.0 2808 + '@babel/compat-data': 7.26.8 2809 + '@babel/helper-validator-option': 7.25.9 2810 + browserslist: 4.24.4 2894 2811 lru-cache: 5.1.1 2895 2812 semver: 6.3.1 2896 2813 2897 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': 2814 + '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)': 2898 2815 dependencies: 2899 - '@babel/core': 7.27.4 2900 - '@babel/helper-annotate-as-pure': 7.27.3 2901 - '@babel/helper-member-expression-to-functions': 7.27.1 2902 - '@babel/helper-optimise-call-expression': 7.27.1 2903 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) 2904 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 2905 - '@babel/traverse': 7.27.4 2816 + '@babel/core': 7.26.10 2817 + '@babel/helper-annotate-as-pure': 7.25.9 2818 + '@babel/helper-member-expression-to-functions': 7.25.9 2819 + '@babel/helper-optimise-call-expression': 7.25.9 2820 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) 2821 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 2822 + '@babel/traverse': 7.27.0 2906 2823 semver: 6.3.1 2907 2824 transitivePeerDependencies: 2908 2825 - supports-color 2909 2826 2910 - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.4)': 2827 + '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.26.10)': 2911 2828 dependencies: 2912 - '@babel/core': 7.27.4 2913 - '@babel/helper-annotate-as-pure': 7.27.3 2829 + '@babel/core': 7.26.10 2830 + '@babel/helper-annotate-as-pure': 7.25.9 2914 2831 regexpu-core: 6.2.0 2915 2832 semver: 6.3.1 2916 2833 2917 - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.4)': 2834 + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.10)': 2918 2835 dependencies: 2919 - '@babel/core': 7.27.4 2920 - '@babel/helper-compilation-targets': 7.27.2 2921 - '@babel/helper-plugin-utils': 7.27.1 2922 - debug: 4.4.1 2836 + '@babel/core': 7.26.10 2837 + '@babel/helper-compilation-targets': 7.27.0 2838 + '@babel/helper-plugin-utils': 7.26.5 2839 + debug: 4.4.0 2923 2840 lodash.debounce: 4.0.8 2924 2841 resolve: 1.22.10 2925 2842 transitivePeerDependencies: 2926 2843 - supports-color 2927 2844 2928 - '@babel/helper-member-expression-to-functions@7.27.1': 2845 + '@babel/helper-member-expression-to-functions@7.25.9': 2929 2846 dependencies: 2930 - '@babel/traverse': 7.27.4 2931 - '@babel/types': 7.27.6 2847 + '@babel/traverse': 7.27.0 2848 + '@babel/types': 7.27.0 2932 2849 transitivePeerDependencies: 2933 2850 - supports-color 2934 2851 2935 2852 '@babel/helper-module-imports@7.18.6': 2936 2853 dependencies: 2937 - '@babel/types': 7.27.6 2854 + '@babel/types': 7.27.0 2938 2855 2939 - '@babel/helper-module-imports@7.27.1': 2856 + '@babel/helper-module-imports@7.25.9': 2940 2857 dependencies: 2941 - '@babel/traverse': 7.27.4 2942 - '@babel/types': 7.27.6 2858 + '@babel/traverse': 7.27.0 2859 + '@babel/types': 7.27.0 2943 2860 transitivePeerDependencies: 2944 2861 - supports-color 2945 2862 2946 - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': 2863 + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': 2947 2864 dependencies: 2948 - '@babel/core': 7.27.4 2949 - '@babel/helper-module-imports': 7.27.1 2950 - '@babel/helper-validator-identifier': 7.27.1 2951 - '@babel/traverse': 7.27.4 2865 + '@babel/core': 7.26.10 2866 + '@babel/helper-module-imports': 7.25.9 2867 + '@babel/helper-validator-identifier': 7.25.9 2868 + '@babel/traverse': 7.27.0 2952 2869 transitivePeerDependencies: 2953 2870 - supports-color 2954 2871 2955 - '@babel/helper-optimise-call-expression@7.27.1': 2872 + '@babel/helper-optimise-call-expression@7.25.9': 2956 2873 dependencies: 2957 - '@babel/types': 7.27.6 2874 + '@babel/types': 7.27.0 2958 2875 2959 - '@babel/helper-plugin-utils@7.27.1': {} 2876 + '@babel/helper-plugin-utils@7.26.5': {} 2960 2877 2961 - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.4)': 2878 + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)': 2962 2879 dependencies: 2963 - '@babel/core': 7.27.4 2964 - '@babel/helper-annotate-as-pure': 7.27.3 2965 - '@babel/helper-wrap-function': 7.27.1 2966 - '@babel/traverse': 7.27.4 2880 + '@babel/core': 7.26.10 2881 + '@babel/helper-annotate-as-pure': 7.25.9 2882 + '@babel/helper-wrap-function': 7.25.9 2883 + '@babel/traverse': 7.27.0 2967 2884 transitivePeerDependencies: 2968 2885 - supports-color 2969 2886 2970 - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': 2887 + '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': 2971 2888 dependencies: 2972 - '@babel/core': 7.27.4 2973 - '@babel/helper-member-expression-to-functions': 7.27.1 2974 - '@babel/helper-optimise-call-expression': 7.27.1 2975 - '@babel/traverse': 7.27.4 2889 + '@babel/core': 7.26.10 2890 + '@babel/helper-member-expression-to-functions': 7.25.9 2891 + '@babel/helper-optimise-call-expression': 7.25.9 2892 + '@babel/traverse': 7.27.0 2976 2893 transitivePeerDependencies: 2977 2894 - supports-color 2978 2895 2979 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': 2896 + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': 2980 2897 dependencies: 2981 - '@babel/traverse': 7.27.4 2982 - '@babel/types': 7.27.6 2898 + '@babel/traverse': 7.27.0 2899 + '@babel/types': 7.27.0 2983 2900 transitivePeerDependencies: 2984 2901 - supports-color 2985 2902 2986 - '@babel/helper-string-parser@7.27.1': {} 2903 + '@babel/helper-string-parser@7.25.9': {} 2987 2904 2988 - '@babel/helper-validator-identifier@7.27.1': {} 2905 + '@babel/helper-validator-identifier@7.25.9': {} 2989 2906 2990 - '@babel/helper-validator-option@7.27.1': {} 2907 + '@babel/helper-validator-option@7.25.9': {} 2991 2908 2992 - '@babel/helper-wrap-function@7.27.1': 2909 + '@babel/helper-wrap-function@7.25.9': 2993 2910 dependencies: 2994 - '@babel/template': 7.27.2 2995 - '@babel/traverse': 7.27.4 2996 - '@babel/types': 7.27.6 2911 + '@babel/template': 7.27.0 2912 + '@babel/traverse': 7.27.0 2913 + '@babel/types': 7.27.0 2997 2914 transitivePeerDependencies: 2998 2915 - supports-color 2999 2916 3000 - '@babel/helpers@7.27.6': 2917 + '@babel/helpers@7.27.0': 3001 2918 dependencies: 3002 - '@babel/template': 7.27.2 3003 - '@babel/types': 7.27.6 2919 + '@babel/template': 7.27.0 2920 + '@babel/types': 7.27.0 3004 2921 3005 - '@babel/parser@7.27.5': 2922 + '@babel/parser@7.27.0': 3006 2923 dependencies: 3007 - '@babel/types': 7.27.6 2924 + '@babel/types': 7.27.0 3008 2925 3009 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': 2926 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)': 3010 2927 dependencies: 3011 - '@babel/core': 7.27.4 3012 - '@babel/helper-plugin-utils': 7.27.1 3013 - '@babel/traverse': 7.27.4 2928 + '@babel/core': 7.26.10 2929 + '@babel/helper-plugin-utils': 7.26.5 2930 + '@babel/traverse': 7.27.0 3014 2931 transitivePeerDependencies: 3015 2932 - supports-color 3016 2933 3017 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.4)': 2934 + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.10)': 3018 2935 dependencies: 3019 - '@babel/core': 7.27.4 3020 - '@babel/helper-plugin-utils': 7.27.1 2936 + '@babel/core': 7.26.10 2937 + '@babel/helper-plugin-utils': 7.26.5 3021 2938 3022 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.4)': 2939 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.10)': 3023 2940 dependencies: 3024 - '@babel/core': 7.27.4 3025 - '@babel/helper-plugin-utils': 7.27.1 2941 + '@babel/core': 7.26.10 2942 + '@babel/helper-plugin-utils': 7.26.5 3026 2943 3027 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.4)': 2944 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.10)': 3028 2945 dependencies: 3029 - '@babel/core': 7.27.4 3030 - '@babel/helper-plugin-utils': 7.27.1 3031 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 3032 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) 2946 + '@babel/core': 7.26.10 2947 + '@babel/helper-plugin-utils': 7.26.5 2948 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 2949 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) 3033 2950 transitivePeerDependencies: 3034 2951 - supports-color 3035 2952 3036 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.4)': 2953 + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.10)': 3037 2954 dependencies: 3038 - '@babel/core': 7.27.4 3039 - '@babel/helper-plugin-utils': 7.27.1 3040 - '@babel/traverse': 7.27.4 2955 + '@babel/core': 7.26.10 2956 + '@babel/helper-plugin-utils': 7.26.5 2957 + '@babel/traverse': 7.27.0 3041 2958 transitivePeerDependencies: 3042 2959 - supports-color 3043 2960 3044 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4)': 2961 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': 3045 2962 dependencies: 3046 - '@babel/core': 7.27.4 2963 + '@babel/core': 7.26.10 3047 2964 3048 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': 2965 + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)': 3049 2966 dependencies: 3050 - '@babel/core': 7.27.4 3051 - '@babel/helper-plugin-utils': 7.27.1 2967 + '@babel/core': 7.26.10 2968 + '@babel/helper-plugin-utils': 7.26.5 3052 2969 3053 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': 2970 + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': 3054 2971 dependencies: 3055 - '@babel/core': 7.27.4 3056 - '@babel/helper-plugin-utils': 7.27.1 2972 + '@babel/core': 7.26.10 2973 + '@babel/helper-plugin-utils': 7.26.5 3057 2974 3058 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': 2975 + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': 3059 2976 dependencies: 3060 - '@babel/core': 7.27.4 3061 - '@babel/helper-plugin-utils': 7.27.1 2977 + '@babel/core': 7.26.10 2978 + '@babel/helper-plugin-utils': 7.26.5 3062 2979 3063 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': 2980 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': 3064 2981 dependencies: 3065 - '@babel/core': 7.27.4 3066 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) 3067 - '@babel/helper-plugin-utils': 7.27.1 2982 + '@babel/core': 7.26.10 2983 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) 2984 + '@babel/helper-plugin-utils': 7.26.5 3068 2985 3069 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.4)': 2986 + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.10)': 3070 2987 dependencies: 3071 - '@babel/core': 7.27.4 3072 - '@babel/helper-plugin-utils': 7.27.1 2988 + '@babel/core': 7.26.10 2989 + '@babel/helper-plugin-utils': 7.26.5 3073 2990 3074 - '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.4)': 2991 + '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': 3075 2992 dependencies: 3076 - '@babel/core': 7.27.4 3077 - '@babel/helper-plugin-utils': 7.27.1 3078 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) 3079 - '@babel/traverse': 7.27.4 2993 + '@babel/core': 7.26.10 2994 + '@babel/helper-plugin-utils': 7.26.5 2995 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) 2996 + '@babel/traverse': 7.27.0 3080 2997 transitivePeerDependencies: 3081 2998 - supports-color 3082 2999 3083 - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': 3000 + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': 3084 3001 dependencies: 3085 - '@babel/core': 7.27.4 3086 - '@babel/helper-module-imports': 7.27.1 3087 - '@babel/helper-plugin-utils': 7.27.1 3088 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) 3002 + '@babel/core': 7.26.10 3003 + '@babel/helper-module-imports': 7.25.9 3004 + '@babel/helper-plugin-utils': 7.26.5 3005 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) 3089 3006 transitivePeerDependencies: 3090 3007 - supports-color 3091 3008 3092 - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.4)': 3009 + '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.10)': 3093 3010 dependencies: 3094 - '@babel/core': 7.27.4 3095 - '@babel/helper-plugin-utils': 7.27.1 3011 + '@babel/core': 7.26.10 3012 + '@babel/helper-plugin-utils': 7.26.5 3096 3013 3097 - '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.4)': 3014 + '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.26.10)': 3098 3015 dependencies: 3099 - '@babel/core': 7.27.4 3100 - '@babel/helper-plugin-utils': 7.27.1 3016 + '@babel/core': 7.26.10 3017 + '@babel/helper-plugin-utils': 7.26.5 3101 3018 3102 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.4)': 3019 + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.10)': 3103 3020 dependencies: 3104 - '@babel/core': 7.27.4 3105 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) 3106 - '@babel/helper-plugin-utils': 7.27.1 3021 + '@babel/core': 7.26.10 3022 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) 3023 + '@babel/helper-plugin-utils': 7.26.5 3107 3024 transitivePeerDependencies: 3108 3025 - supports-color 3109 3026 3110 - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.4)': 3027 + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.10)': 3111 3028 dependencies: 3112 - '@babel/core': 7.27.4 3113 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) 3114 - '@babel/helper-plugin-utils': 7.27.1 3029 + '@babel/core': 7.26.10 3030 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) 3031 + '@babel/helper-plugin-utils': 7.26.5 3115 3032 transitivePeerDependencies: 3116 3033 - supports-color 3117 3034 3118 - '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.4)': 3035 + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.10)': 3119 3036 dependencies: 3120 - '@babel/core': 7.27.4 3121 - '@babel/helper-annotate-as-pure': 7.27.3 3122 - '@babel/helper-compilation-targets': 7.27.2 3123 - '@babel/helper-plugin-utils': 7.27.1 3124 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) 3125 - '@babel/traverse': 7.27.4 3037 + '@babel/core': 7.26.10 3038 + '@babel/helper-annotate-as-pure': 7.25.9 3039 + '@babel/helper-compilation-targets': 7.27.0 3040 + '@babel/helper-plugin-utils': 7.26.5 3041 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) 3042 + '@babel/traverse': 7.27.0 3126 3043 globals: 11.12.0 3127 3044 transitivePeerDependencies: 3128 3045 - supports-color 3129 3046 3130 - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.4)': 3047 + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.10)': 3131 3048 dependencies: 3132 - '@babel/core': 7.27.4 3133 - '@babel/helper-plugin-utils': 7.27.1 3134 - '@babel/template': 7.27.2 3049 + '@babel/core': 7.26.10 3050 + '@babel/helper-plugin-utils': 7.26.5 3051 + '@babel/template': 7.27.0 3135 3052 3136 - '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.27.4)': 3053 + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.10)': 3137 3054 dependencies: 3138 - '@babel/core': 7.27.4 3139 - '@babel/helper-plugin-utils': 7.27.1 3055 + '@babel/core': 7.26.10 3056 + '@babel/helper-plugin-utils': 7.26.5 3140 3057 3141 - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.4)': 3058 + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.10)': 3142 3059 dependencies: 3143 - '@babel/core': 7.27.4 3144 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) 3145 - '@babel/helper-plugin-utils': 7.27.1 3060 + '@babel/core': 7.26.10 3061 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) 3062 + '@babel/helper-plugin-utils': 7.26.5 3146 3063 3147 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.4)': 3064 + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.10)': 3148 3065 dependencies: 3149 - '@babel/core': 7.27.4 3150 - '@babel/helper-plugin-utils': 7.27.1 3066 + '@babel/core': 7.26.10 3067 + '@babel/helper-plugin-utils': 7.26.5 3151 3068 3152 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': 3069 + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': 3153 3070 dependencies: 3154 - '@babel/core': 7.27.4 3155 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) 3156 - '@babel/helper-plugin-utils': 7.27.1 3071 + '@babel/core': 7.26.10 3072 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) 3073 + '@babel/helper-plugin-utils': 7.26.5 3157 3074 3158 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.4)': 3075 + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.10)': 3159 3076 dependencies: 3160 - '@babel/core': 7.27.4 3161 - '@babel/helper-plugin-utils': 7.27.1 3077 + '@babel/core': 7.26.10 3078 + '@babel/helper-plugin-utils': 7.26.5 3162 3079 3163 - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.4)': 3080 + '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.10)': 3164 3081 dependencies: 3165 - '@babel/core': 7.27.4 3166 - '@babel/helper-plugin-utils': 7.27.1 3082 + '@babel/core': 7.26.10 3083 + '@babel/helper-plugin-utils': 7.26.5 3167 3084 3168 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.4)': 3085 + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.10)': 3169 3086 dependencies: 3170 - '@babel/core': 7.27.4 3171 - '@babel/helper-plugin-utils': 7.27.1 3087 + '@babel/core': 7.26.10 3088 + '@babel/helper-plugin-utils': 7.26.5 3172 3089 3173 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.4)': 3090 + '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.10)': 3174 3091 dependencies: 3175 - '@babel/core': 7.27.4 3176 - '@babel/helper-plugin-utils': 7.27.1 3177 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 3092 + '@babel/core': 7.26.10 3093 + '@babel/helper-plugin-utils': 7.26.5 3094 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 3178 3095 transitivePeerDependencies: 3179 3096 - supports-color 3180 3097 3181 - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.4)': 3098 + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.10)': 3182 3099 dependencies: 3183 - '@babel/core': 7.27.4 3184 - '@babel/helper-compilation-targets': 7.27.2 3185 - '@babel/helper-plugin-utils': 7.27.1 3186 - '@babel/traverse': 7.27.4 3100 + '@babel/core': 7.26.10 3101 + '@babel/helper-compilation-targets': 7.27.0 3102 + '@babel/helper-plugin-utils': 7.26.5 3103 + '@babel/traverse': 7.27.0 3187 3104 transitivePeerDependencies: 3188 3105 - supports-color 3189 3106 3190 - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.4)': 3107 + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.10)': 3191 3108 dependencies: 3192 - '@babel/core': 7.27.4 3193 - '@babel/helper-plugin-utils': 7.27.1 3109 + '@babel/core': 7.26.10 3110 + '@babel/helper-plugin-utils': 7.26.5 3194 3111 3195 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.4)': 3112 + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.10)': 3196 3113 dependencies: 3197 - '@babel/core': 7.27.4 3198 - '@babel/helper-plugin-utils': 7.27.1 3114 + '@babel/core': 7.26.10 3115 + '@babel/helper-plugin-utils': 7.26.5 3199 3116 3200 - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.4)': 3117 + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.10)': 3201 3118 dependencies: 3202 - '@babel/core': 7.27.4 3203 - '@babel/helper-plugin-utils': 7.27.1 3119 + '@babel/core': 7.26.10 3120 + '@babel/helper-plugin-utils': 7.26.5 3204 3121 3205 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.4)': 3122 + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.10)': 3206 3123 dependencies: 3207 - '@babel/core': 7.27.4 3208 - '@babel/helper-plugin-utils': 7.27.1 3124 + '@babel/core': 7.26.10 3125 + '@babel/helper-plugin-utils': 7.26.5 3209 3126 3210 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.4)': 3127 + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.10)': 3211 3128 dependencies: 3212 - '@babel/core': 7.27.4 3213 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) 3214 - '@babel/helper-plugin-utils': 7.27.1 3129 + '@babel/core': 7.26.10 3130 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) 3131 + '@babel/helper-plugin-utils': 7.26.5 3215 3132 transitivePeerDependencies: 3216 3133 - supports-color 3217 3134 3218 - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': 3135 + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)': 3219 3136 dependencies: 3220 - '@babel/core': 7.27.4 3221 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) 3222 - '@babel/helper-plugin-utils': 7.27.1 3137 + '@babel/core': 7.26.10 3138 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) 3139 + '@babel/helper-plugin-utils': 7.26.5 3223 3140 transitivePeerDependencies: 3224 3141 - supports-color 3225 3142 3226 - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.4)': 3143 + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.10)': 3227 3144 dependencies: 3228 - '@babel/core': 7.27.4 3229 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) 3230 - '@babel/helper-plugin-utils': 7.27.1 3231 - '@babel/helper-validator-identifier': 7.27.1 3232 - '@babel/traverse': 7.27.4 3145 + '@babel/core': 7.26.10 3146 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) 3147 + '@babel/helper-plugin-utils': 7.26.5 3148 + '@babel/helper-validator-identifier': 7.25.9 3149 + '@babel/traverse': 7.27.0 3233 3150 transitivePeerDependencies: 3234 3151 - supports-color 3235 3152 3236 - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.4)': 3153 + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.10)': 3237 3154 dependencies: 3238 - '@babel/core': 7.27.4 3239 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) 3240 - '@babel/helper-plugin-utils': 7.27.1 3155 + '@babel/core': 7.26.10 3156 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) 3157 + '@babel/helper-plugin-utils': 7.26.5 3241 3158 transitivePeerDependencies: 3242 3159 - supports-color 3243 3160 3244 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': 3161 + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': 3245 3162 dependencies: 3246 - '@babel/core': 7.27.4 3247 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) 3248 - '@babel/helper-plugin-utils': 7.27.1 3163 + '@babel/core': 7.26.10 3164 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) 3165 + '@babel/helper-plugin-utils': 7.26.5 3249 3166 3250 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.4)': 3167 + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.10)': 3251 3168 dependencies: 3252 - '@babel/core': 7.27.4 3253 - '@babel/helper-plugin-utils': 7.27.1 3169 + '@babel/core': 7.26.10 3170 + '@babel/helper-plugin-utils': 7.26.5 3254 3171 3255 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.4)': 3172 + '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.10)': 3256 3173 dependencies: 3257 - '@babel/core': 7.27.4 3258 - '@babel/helper-plugin-utils': 7.27.1 3174 + '@babel/core': 7.26.10 3175 + '@babel/helper-plugin-utils': 7.26.5 3259 3176 3260 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.4)': 3177 + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.10)': 3261 3178 dependencies: 3262 - '@babel/core': 7.27.4 3263 - '@babel/helper-plugin-utils': 7.27.1 3179 + '@babel/core': 7.26.10 3180 + '@babel/helper-plugin-utils': 7.26.5 3264 3181 3265 - '@babel/plugin-transform-object-rest-spread@7.27.3(@babel/core@7.27.4)': 3182 + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.10)': 3266 3183 dependencies: 3267 - '@babel/core': 7.27.4 3268 - '@babel/helper-compilation-targets': 7.27.2 3269 - '@babel/helper-plugin-utils': 7.27.1 3270 - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) 3271 - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) 3184 + '@babel/core': 7.26.10 3185 + '@babel/helper-compilation-targets': 7.27.0 3186 + '@babel/helper-plugin-utils': 7.26.5 3187 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) 3272 3188 3273 - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.4)': 3189 + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.10)': 3274 3190 dependencies: 3275 - '@babel/core': 7.27.4 3276 - '@babel/helper-plugin-utils': 7.27.1 3277 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) 3191 + '@babel/core': 7.26.10 3192 + '@babel/helper-plugin-utils': 7.26.5 3193 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) 3278 3194 transitivePeerDependencies: 3279 3195 - supports-color 3280 3196 3281 - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.4)': 3197 + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.10)': 3282 3198 dependencies: 3283 - '@babel/core': 7.27.4 3284 - '@babel/helper-plugin-utils': 7.27.1 3199 + '@babel/core': 7.26.10 3200 + '@babel/helper-plugin-utils': 7.26.5 3285 3201 3286 - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.4)': 3202 + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.10)': 3287 3203 dependencies: 3288 - '@babel/core': 7.27.4 3289 - '@babel/helper-plugin-utils': 7.27.1 3290 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 3204 + '@babel/core': 7.26.10 3205 + '@babel/helper-plugin-utils': 7.26.5 3206 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 3291 3207 transitivePeerDependencies: 3292 3208 - supports-color 3293 3209 3294 - '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': 3210 + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.10)': 3295 3211 dependencies: 3296 - '@babel/core': 7.27.4 3297 - '@babel/helper-plugin-utils': 7.27.1 3212 + '@babel/core': 7.26.10 3213 + '@babel/helper-plugin-utils': 7.26.5 3298 3214 3299 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.4)': 3215 + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.10)': 3300 3216 dependencies: 3301 - '@babel/core': 7.27.4 3302 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) 3303 - '@babel/helper-plugin-utils': 7.27.1 3217 + '@babel/core': 7.26.10 3218 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) 3219 + '@babel/helper-plugin-utils': 7.26.5 3304 3220 transitivePeerDependencies: 3305 3221 - supports-color 3306 3222 3307 - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.4)': 3223 + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.10)': 3308 3224 dependencies: 3309 - '@babel/core': 7.27.4 3310 - '@babel/helper-annotate-as-pure': 7.27.3 3311 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) 3312 - '@babel/helper-plugin-utils': 7.27.1 3225 + '@babel/core': 7.26.10 3226 + '@babel/helper-annotate-as-pure': 7.25.9 3227 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) 3228 + '@babel/helper-plugin-utils': 7.26.5 3313 3229 transitivePeerDependencies: 3314 3230 - supports-color 3315 3231 3316 - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.4)': 3232 + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.10)': 3317 3233 dependencies: 3318 - '@babel/core': 7.27.4 3319 - '@babel/helper-plugin-utils': 7.27.1 3234 + '@babel/core': 7.26.10 3235 + '@babel/helper-plugin-utils': 7.26.5 3320 3236 3321 - '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.27.4)': 3237 + '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.26.10)': 3322 3238 dependencies: 3323 - '@babel/core': 7.27.4 3324 - '@babel/helper-plugin-utils': 7.27.1 3239 + '@babel/core': 7.26.10 3240 + '@babel/helper-plugin-utils': 7.26.5 3241 + regenerator-transform: 0.15.2 3325 3242 3326 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.4)': 3243 + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.10)': 3327 3244 dependencies: 3328 - '@babel/core': 7.27.4 3329 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) 3330 - '@babel/helper-plugin-utils': 7.27.1 3245 + '@babel/core': 7.26.10 3246 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) 3247 + '@babel/helper-plugin-utils': 7.26.5 3331 3248 3332 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.4)': 3249 + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.10)': 3333 3250 dependencies: 3334 - '@babel/core': 7.27.4 3335 - '@babel/helper-plugin-utils': 7.27.1 3251 + '@babel/core': 7.26.10 3252 + '@babel/helper-plugin-utils': 7.26.5 3336 3253 3337 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.4)': 3254 + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.10)': 3338 3255 dependencies: 3339 - '@babel/core': 7.27.4 3340 - '@babel/helper-plugin-utils': 7.27.1 3256 + '@babel/core': 7.26.10 3257 + '@babel/helper-plugin-utils': 7.26.5 3341 3258 3342 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.4)': 3259 + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.10)': 3343 3260 dependencies: 3344 - '@babel/core': 7.27.4 3345 - '@babel/helper-plugin-utils': 7.27.1 3346 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 3261 + '@babel/core': 7.26.10 3262 + '@babel/helper-plugin-utils': 7.26.5 3263 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 3347 3264 transitivePeerDependencies: 3348 3265 - supports-color 3349 3266 3350 - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.4)': 3267 + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.10)': 3351 3268 dependencies: 3352 - '@babel/core': 7.27.4 3353 - '@babel/helper-plugin-utils': 7.27.1 3269 + '@babel/core': 7.26.10 3270 + '@babel/helper-plugin-utils': 7.26.5 3354 3271 3355 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.4)': 3272 + '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.10)': 3356 3273 dependencies: 3357 - '@babel/core': 7.27.4 3358 - '@babel/helper-plugin-utils': 7.27.1 3274 + '@babel/core': 7.26.10 3275 + '@babel/helper-plugin-utils': 7.26.5 3359 3276 3360 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.4)': 3277 + '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.26.10)': 3361 3278 dependencies: 3362 - '@babel/core': 7.27.4 3363 - '@babel/helper-plugin-utils': 7.27.1 3279 + '@babel/core': 7.26.10 3280 + '@babel/helper-plugin-utils': 7.26.5 3364 3281 3365 - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.4)': 3282 + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.10)': 3366 3283 dependencies: 3367 - '@babel/core': 7.27.4 3368 - '@babel/helper-plugin-utils': 7.27.1 3284 + '@babel/core': 7.26.10 3285 + '@babel/helper-plugin-utils': 7.26.5 3369 3286 3370 - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.4)': 3287 + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.10)': 3371 3288 dependencies: 3372 - '@babel/core': 7.27.4 3373 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) 3374 - '@babel/helper-plugin-utils': 7.27.1 3289 + '@babel/core': 7.26.10 3290 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) 3291 + '@babel/helper-plugin-utils': 7.26.5 3375 3292 3376 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.4)': 3293 + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.10)': 3377 3294 dependencies: 3378 - '@babel/core': 7.27.4 3379 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) 3380 - '@babel/helper-plugin-utils': 7.27.1 3295 + '@babel/core': 7.26.10 3296 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) 3297 + '@babel/helper-plugin-utils': 7.26.5 3381 3298 3382 - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.4)': 3299 + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.10)': 3383 3300 dependencies: 3384 - '@babel/core': 7.27.4 3385 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) 3386 - '@babel/helper-plugin-utils': 7.27.1 3301 + '@babel/core': 7.26.10 3302 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) 3303 + '@babel/helper-plugin-utils': 7.26.5 3387 3304 3388 - '@babel/preset-env@7.27.2(@babel/core@7.27.4)': 3305 + '@babel/preset-env@7.26.9(@babel/core@7.26.10)': 3389 3306 dependencies: 3390 - '@babel/compat-data': 7.27.5 3391 - '@babel/core': 7.27.4 3392 - '@babel/helper-compilation-targets': 7.27.2 3393 - '@babel/helper-plugin-utils': 7.27.1 3394 - '@babel/helper-validator-option': 7.27.1 3395 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.4) 3396 - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.4) 3397 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.4) 3398 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.4) 3399 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.4) 3400 - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4) 3401 - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.4) 3402 - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) 3403 - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.4) 3404 - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) 3405 - '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) 3406 - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) 3407 - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) 3408 - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) 3409 - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) 3410 - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.4) 3411 - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) 3412 - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) 3413 - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) 3414 - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.4) 3415 - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.4) 3416 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) 3417 - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.4) 3418 - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.4) 3419 - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.4) 3420 - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) 3421 - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) 3422 - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.4) 3423 - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) 3424 - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.4) 3425 - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) 3426 - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.4) 3427 - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) 3428 - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.4) 3429 - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.4) 3430 - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) 3431 - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.4) 3432 - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) 3433 - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.4) 3434 - '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) 3435 - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) 3436 - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.4) 3437 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) 3438 - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) 3439 - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) 3440 - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) 3441 - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) 3442 - '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.4) 3443 - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.4) 3444 - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.4) 3445 - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) 3446 - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) 3447 - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) 3448 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) 3449 - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.4) 3450 - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.4) 3451 - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.4) 3452 - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) 3453 - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.4) 3454 - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.4) 3455 - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) 3456 - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) 3457 - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) 3458 - core-js-compat: 3.43.0 3307 + '@babel/compat-data': 7.26.8 3308 + '@babel/core': 7.26.10 3309 + '@babel/helper-compilation-targets': 7.27.0 3310 + '@babel/helper-plugin-utils': 7.26.5 3311 + '@babel/helper-validator-option': 7.25.9 3312 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.10) 3313 + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.10) 3314 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.10) 3315 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.10) 3316 + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.10) 3317 + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) 3318 + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10) 3319 + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) 3320 + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) 3321 + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) 3322 + '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) 3323 + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) 3324 + '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.10) 3325 + '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10) 3326 + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) 3327 + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.10) 3328 + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10) 3329 + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10) 3330 + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10) 3331 + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.10) 3332 + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.10) 3333 + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) 3334 + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.10) 3335 + '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.10) 3336 + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10) 3337 + '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10) 3338 + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10) 3339 + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.10) 3340 + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10) 3341 + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10) 3342 + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.10) 3343 + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.10) 3344 + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) 3345 + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.10) 3346 + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.10) 3347 + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) 3348 + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.10) 3349 + '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10) 3350 + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10) 3351 + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10) 3352 + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.10) 3353 + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10) 3354 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) 3355 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) 3356 + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) 3357 + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10) 3358 + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.10) 3359 + '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10) 3360 + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.10) 3361 + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.10) 3362 + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10) 3363 + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10) 3364 + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10) 3365 + '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.10) 3366 + '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.26.10) 3367 + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.10) 3368 + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.10) 3369 + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10) 3370 + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.10) 3371 + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) 3372 + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10) 3373 + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) 3374 + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10) 3375 + core-js-compat: 3.41.0 3459 3376 semver: 6.3.1 3460 3377 transitivePeerDependencies: 3461 3378 - supports-color 3462 3379 3463 - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.4)': 3380 + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': 3464 3381 dependencies: 3465 - '@babel/core': 7.27.4 3466 - '@babel/helper-plugin-utils': 7.27.1 3467 - '@babel/types': 7.27.6 3382 + '@babel/core': 7.26.10 3383 + '@babel/helper-plugin-utils': 7.26.5 3384 + '@babel/types': 7.27.0 3468 3385 esutils: 2.0.3 3469 3386 3470 - '@babel/runtime@7.27.6': {} 3387 + '@babel/runtime@7.27.0': 3388 + dependencies: 3389 + regenerator-runtime: 0.14.1 3471 3390 3472 - '@babel/template@7.27.2': 3391 + '@babel/template@7.27.0': 3473 3392 dependencies: 3474 - '@babel/code-frame': 7.27.1 3475 - '@babel/parser': 7.27.5 3476 - '@babel/types': 7.27.6 3393 + '@babel/code-frame': 7.26.2 3394 + '@babel/parser': 7.27.0 3395 + '@babel/types': 7.27.0 3477 3396 3478 - '@babel/traverse@7.27.4': 3397 + '@babel/traverse@7.27.0': 3479 3398 dependencies: 3480 - '@babel/code-frame': 7.27.1 3481 - '@babel/generator': 7.27.5 3482 - '@babel/parser': 7.27.5 3483 - '@babel/template': 7.27.2 3484 - '@babel/types': 7.27.6 3485 - debug: 4.4.1 3399 + '@babel/code-frame': 7.26.2 3400 + '@babel/generator': 7.27.0 3401 + '@babel/parser': 7.27.0 3402 + '@babel/template': 7.27.0 3403 + '@babel/types': 7.27.0 3404 + debug: 4.4.0 3486 3405 globals: 11.12.0 3487 3406 transitivePeerDependencies: 3488 3407 - supports-color 3489 3408 3490 - '@babel/types@7.27.6': 3409 + '@babel/types@7.27.0': 3491 3410 dependencies: 3492 - '@babel/helper-string-parser': 7.27.1 3493 - '@babel/helper-validator-identifier': 7.27.1 3494 - 3495 - '@badrap/valita@0.4.5': {} 3411 + '@babel/helper-string-parser': 7.25.9 3412 + '@babel/helper-validator-identifier': 7.25.9 3496 3413 3497 3414 '@cloudflare/kv-asset-handler@0.4.0': 3498 3415 dependencies: 3499 3416 mime: 3.0.0 3500 3417 3501 - '@cloudflare/unenv-preset@2.3.3(unenv@2.0.0-rc.17)(workerd@1.20250617.0)': 3418 + '@cloudflare/unenv-preset@2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250321.0)': 3502 3419 dependencies: 3503 - unenv: 2.0.0-rc.17 3420 + unenv: 2.0.0-rc.15 3504 3421 optionalDependencies: 3505 - workerd: 1.20250617.0 3422 + workerd: 1.20250321.0 3506 3423 3507 - '@cloudflare/workerd-darwin-64@1.20250617.0': 3424 + '@cloudflare/workerd-darwin-64@1.20250321.0': 3508 3425 optional: true 3509 3426 3510 - '@cloudflare/workerd-darwin-arm64@1.20250617.0': 3427 + '@cloudflare/workerd-darwin-arm64@1.20250321.0': 3511 3428 optional: true 3512 3429 3513 - '@cloudflare/workerd-linux-64@1.20250617.0': 3430 + '@cloudflare/workerd-linux-64@1.20250321.0': 3514 3431 optional: true 3515 3432 3516 - '@cloudflare/workerd-linux-arm64@1.20250617.0': 3433 + '@cloudflare/workerd-linux-arm64@1.20250321.0': 3517 3434 optional: true 3518 3435 3519 - '@cloudflare/workerd-windows-64@1.20250617.0': 3436 + '@cloudflare/workerd-windows-64@1.20250321.0': 3520 3437 optional: true 3521 3438 3522 3439 '@cspotcode/source-map-support@0.8.1': 3523 3440 dependencies: 3524 3441 '@jridgewell/trace-mapping': 0.3.9 3525 3442 3526 - '@emnapi/runtime@1.4.3': 3443 + '@emnapi/runtime@1.4.0': 3527 3444 dependencies: 3528 3445 tslib: 2.8.1 3529 3446 optional: true 3530 3447 3531 - '@esbuild/aix-ppc64@0.25.4': 3532 - optional: true 3533 - 3534 - '@esbuild/aix-ppc64@0.25.5': 3448 + '@esbuild/aix-ppc64@0.24.0': 3535 3449 optional: true 3536 3450 3537 - '@esbuild/android-arm64@0.25.4': 3451 + '@esbuild/aix-ppc64@0.24.2': 3538 3452 optional: true 3539 3453 3540 - '@esbuild/android-arm64@0.25.5': 3454 + '@esbuild/android-arm64@0.24.0': 3541 3455 optional: true 3542 3456 3543 - '@esbuild/android-arm@0.25.4': 3457 + '@esbuild/android-arm64@0.24.2': 3544 3458 optional: true 3545 3459 3546 - '@esbuild/android-arm@0.25.5': 3460 + '@esbuild/android-arm@0.24.0': 3547 3461 optional: true 3548 3462 3549 - '@esbuild/android-x64@0.25.4': 3463 + '@esbuild/android-arm@0.24.2': 3550 3464 optional: true 3551 3465 3552 - '@esbuild/android-x64@0.25.5': 3466 + '@esbuild/android-x64@0.24.0': 3553 3467 optional: true 3554 3468 3555 - '@esbuild/darwin-arm64@0.25.4': 3469 + '@esbuild/android-x64@0.24.2': 3556 3470 optional: true 3557 3471 3558 - '@esbuild/darwin-arm64@0.25.5': 3472 + '@esbuild/darwin-arm64@0.24.0': 3559 3473 optional: true 3560 3474 3561 - '@esbuild/darwin-x64@0.25.4': 3475 + '@esbuild/darwin-arm64@0.24.2': 3562 3476 optional: true 3563 3477 3564 - '@esbuild/darwin-x64@0.25.5': 3478 + '@esbuild/darwin-x64@0.24.0': 3565 3479 optional: true 3566 3480 3567 - '@esbuild/freebsd-arm64@0.25.4': 3481 + '@esbuild/darwin-x64@0.24.2': 3568 3482 optional: true 3569 3483 3570 - '@esbuild/freebsd-arm64@0.25.5': 3484 + '@esbuild/freebsd-arm64@0.24.0': 3571 3485 optional: true 3572 3486 3573 - '@esbuild/freebsd-x64@0.25.4': 3487 + '@esbuild/freebsd-arm64@0.24.2': 3574 3488 optional: true 3575 3489 3576 - '@esbuild/freebsd-x64@0.25.5': 3490 + '@esbuild/freebsd-x64@0.24.0': 3577 3491 optional: true 3578 3492 3579 - '@esbuild/linux-arm64@0.25.4': 3493 + '@esbuild/freebsd-x64@0.24.2': 3580 3494 optional: true 3581 3495 3582 - '@esbuild/linux-arm64@0.25.5': 3496 + '@esbuild/linux-arm64@0.24.0': 3583 3497 optional: true 3584 3498 3585 - '@esbuild/linux-arm@0.25.4': 3499 + '@esbuild/linux-arm64@0.24.2': 3586 3500 optional: true 3587 3501 3588 - '@esbuild/linux-arm@0.25.5': 3502 + '@esbuild/linux-arm@0.24.0': 3589 3503 optional: true 3590 3504 3591 - '@esbuild/linux-ia32@0.25.4': 3505 + '@esbuild/linux-arm@0.24.2': 3592 3506 optional: true 3593 3507 3594 - '@esbuild/linux-ia32@0.25.5': 3508 + '@esbuild/linux-ia32@0.24.0': 3595 3509 optional: true 3596 3510 3597 - '@esbuild/linux-loong64@0.25.4': 3511 + '@esbuild/linux-ia32@0.24.2': 3598 3512 optional: true 3599 3513 3600 - '@esbuild/linux-loong64@0.25.5': 3514 + '@esbuild/linux-loong64@0.24.0': 3601 3515 optional: true 3602 3516 3603 - '@esbuild/linux-mips64el@0.25.4': 3517 + '@esbuild/linux-loong64@0.24.2': 3604 3518 optional: true 3605 3519 3606 - '@esbuild/linux-mips64el@0.25.5': 3520 + '@esbuild/linux-mips64el@0.24.0': 3607 3521 optional: true 3608 3522 3609 - '@esbuild/linux-ppc64@0.25.4': 3523 + '@esbuild/linux-mips64el@0.24.2': 3610 3524 optional: true 3611 3525 3612 - '@esbuild/linux-ppc64@0.25.5': 3526 + '@esbuild/linux-ppc64@0.24.0': 3613 3527 optional: true 3614 3528 3615 - '@esbuild/linux-riscv64@0.25.4': 3529 + '@esbuild/linux-ppc64@0.24.2': 3616 3530 optional: true 3617 3531 3618 - '@esbuild/linux-riscv64@0.25.5': 3532 + '@esbuild/linux-riscv64@0.24.0': 3619 3533 optional: true 3620 3534 3621 - '@esbuild/linux-s390x@0.25.4': 3535 + '@esbuild/linux-riscv64@0.24.2': 3622 3536 optional: true 3623 3537 3624 - '@esbuild/linux-s390x@0.25.5': 3538 + '@esbuild/linux-s390x@0.24.0': 3625 3539 optional: true 3626 3540 3627 - '@esbuild/linux-x64@0.25.4': 3541 + '@esbuild/linux-s390x@0.24.2': 3628 3542 optional: true 3629 3543 3630 - '@esbuild/linux-x64@0.25.5': 3544 + '@esbuild/linux-x64@0.24.0': 3631 3545 optional: true 3632 3546 3633 - '@esbuild/netbsd-arm64@0.25.4': 3547 + '@esbuild/linux-x64@0.24.2': 3634 3548 optional: true 3635 3549 3636 - '@esbuild/netbsd-arm64@0.25.5': 3550 + '@esbuild/netbsd-arm64@0.24.2': 3637 3551 optional: true 3638 3552 3639 - '@esbuild/netbsd-x64@0.25.4': 3553 + '@esbuild/netbsd-x64@0.24.0': 3640 3554 optional: true 3641 3555 3642 - '@esbuild/netbsd-x64@0.25.5': 3556 + '@esbuild/netbsd-x64@0.24.2': 3643 3557 optional: true 3644 3558 3645 - '@esbuild/openbsd-arm64@0.25.4': 3559 + '@esbuild/openbsd-arm64@0.24.0': 3646 3560 optional: true 3647 3561 3648 - '@esbuild/openbsd-arm64@0.25.5': 3562 + '@esbuild/openbsd-arm64@0.24.2': 3649 3563 optional: true 3650 3564 3651 - '@esbuild/openbsd-x64@0.25.4': 3565 + '@esbuild/openbsd-x64@0.24.0': 3652 3566 optional: true 3653 3567 3654 - '@esbuild/openbsd-x64@0.25.5': 3568 + '@esbuild/openbsd-x64@0.24.2': 3655 3569 optional: true 3656 3570 3657 - '@esbuild/sunos-x64@0.25.4': 3571 + '@esbuild/sunos-x64@0.24.0': 3658 3572 optional: true 3659 3573 3660 - '@esbuild/sunos-x64@0.25.5': 3574 + '@esbuild/sunos-x64@0.24.2': 3661 3575 optional: true 3662 3576 3663 - '@esbuild/win32-arm64@0.25.4': 3577 + '@esbuild/win32-arm64@0.24.0': 3664 3578 optional: true 3665 3579 3666 - '@esbuild/win32-arm64@0.25.5': 3580 + '@esbuild/win32-arm64@0.24.2': 3667 3581 optional: true 3668 3582 3669 - '@esbuild/win32-ia32@0.25.4': 3583 + '@esbuild/win32-ia32@0.24.0': 3670 3584 optional: true 3671 3585 3672 - '@esbuild/win32-ia32@0.25.5': 3586 + '@esbuild/win32-ia32@0.24.2': 3673 3587 optional: true 3674 3588 3675 - '@esbuild/win32-x64@0.25.4': 3589 + '@esbuild/win32-x64@0.24.0': 3676 3590 optional: true 3677 3591 3678 - '@esbuild/win32-x64@0.25.5': 3592 + '@esbuild/win32-x64@0.24.2': 3679 3593 optional: true 3680 3594 3681 - '@externdefs/solid-freeze@0.1.1(solid-js@1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7))': 3595 + '@externdefs/solid-freeze@0.1.1(solid-js@1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c))': 3682 3596 dependencies: 3683 - solid-js: 1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7) 3597 + solid-js: 1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c) 3684 3598 3685 - '@externdefs/solid-query@0.1.5(solid-js@1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7))': 3599 + '@externdefs/solid-query@0.1.5(solid-js@1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c))': 3686 3600 dependencies: 3687 3601 '@tanstack/query-core': 5.17.19(patch_hash=0b06407b66b7af88765fb6e01e112677a8c09ce518cb4f547cee8a0044471acd) 3688 - solid-js: 1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7) 3602 + solid-js: 1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c) 3689 3603 3690 3604 '@fastify/busboy@2.1.1': {} 3691 3605 3692 - '@floating-ui/core@1.7.1': 3606 + '@floating-ui/core@1.6.9': 3693 3607 dependencies: 3694 3608 '@floating-ui/utils': 0.2.9(patch_hash=1cf283fbaa686f96f7b3029bbc0955bff698af6f4a75ba6c276ad1a7a7c40aea) 3695 3609 3696 - '@floating-ui/dom@1.7.1': 3610 + '@floating-ui/dom@1.6.13': 3697 3611 dependencies: 3698 - '@floating-ui/core': 1.7.1 3612 + '@floating-ui/core': 1.6.9 3699 3613 '@floating-ui/utils': 0.2.9(patch_hash=1cf283fbaa686f96f7b3029bbc0955bff698af6f4a75ba6c276ad1a7a7c40aea) 3700 3614 3701 3615 '@floating-ui/utils@0.2.9(patch_hash=1cf283fbaa686f96f7b3029bbc0955bff698af6f4a75ba6c276ad1a7a7c40aea)': {} ··· 3766 3680 3767 3681 '@img/sharp-wasm32@0.33.5': 3768 3682 dependencies: 3769 - '@emnapi/runtime': 1.4.3 3683 + '@emnapi/runtime': 1.4.0 3770 3684 optional: true 3771 3685 3772 3686 '@img/sharp-win32-ia32@0.33.5': ··· 3815 3729 3816 3730 '@jsr/mary__async-iterator-fns@0.1.1': {} 3817 3731 3818 - '@jsr/mary__batch-fetch@0.1.0': {} 3819 - 3820 3732 '@jsr/mary__date-fns@0.1.3': {} 3821 3733 3822 3734 '@jsr/mary__events@0.2.0': {} 3823 3735 3824 3736 '@jsr/mary__exif-rm@0.2.2': {} 3825 - 3826 - '@kelinci/basa-lexicons@1.0.0': 3827 - dependencies: 3828 - '@atcute/lexicons': 1.1.0 3829 3737 3830 3738 '@nodelib/fs.scandir@2.1.5': 3831 3739 dependencies: ··· 3852 3760 '@pkgjs/parseargs@0.11.0': 3853 3761 optional: true 3854 3762 3855 - '@rollup/plugin-babel@5.3.1(@babel/core@7.27.4)(@types/babel__core@7.20.5)(rollup@2.79.2)': 3763 + '@rollup/plugin-babel@5.3.1(@babel/core@7.26.10)(@types/babel__core@7.20.5)(rollup@2.79.2)': 3856 3764 dependencies: 3857 - '@babel/core': 7.27.4 3858 - '@babel/helper-module-imports': 7.27.1 3765 + '@babel/core': 7.26.10 3766 + '@babel/helper-module-imports': 7.25.9 3859 3767 '@rollup/pluginutils': 3.1.0(rollup@2.79.2) 3860 3768 rollup: 2.79.2 3861 3769 optionalDependencies: ··· 3865 3773 3866 3774 '@rollup/plugin-node-resolve@15.3.1(rollup@2.79.2)': 3867 3775 dependencies: 3868 - '@rollup/pluginutils': 5.2.0(rollup@2.79.2) 3776 + '@rollup/pluginutils': 5.1.4(rollup@2.79.2) 3869 3777 '@types/resolve': 1.20.2 3870 3778 deepmerge: 4.3.1 3871 3779 is-module: 1.0.0 ··· 3883 3791 dependencies: 3884 3792 serialize-javascript: 6.0.2 3885 3793 smob: 1.5.0 3886 - terser: 5.43.1 3794 + terser: 5.39.0 3887 3795 optionalDependencies: 3888 3796 rollup: 2.79.2 3889 3797 ··· 3894 3802 picomatch: 2.3.1 3895 3803 rollup: 2.79.2 3896 3804 3897 - '@rollup/pluginutils@5.2.0(rollup@2.79.2)': 3805 + '@rollup/pluginutils@5.1.4(rollup@2.79.2)': 3898 3806 dependencies: 3899 - '@types/estree': 1.0.8 3807 + '@types/estree': 1.0.7 3900 3808 estree-walker: 2.0.2 3901 3809 picomatch: 4.0.2 3902 3810 optionalDependencies: 3903 3811 rollup: 2.79.2 3904 3812 3905 - '@rollup/rollup-android-arm-eabi@4.44.0': 3813 + '@rollup/rollup-android-arm-eabi@4.37.0': 3906 3814 optional: true 3907 3815 3908 - '@rollup/rollup-android-arm64@4.44.0': 3816 + '@rollup/rollup-android-arm64@4.37.0': 3909 3817 optional: true 3910 3818 3911 - '@rollup/rollup-darwin-arm64@4.44.0': 3819 + '@rollup/rollup-darwin-arm64@4.37.0': 3912 3820 optional: true 3913 3821 3914 - '@rollup/rollup-darwin-x64@4.44.0': 3822 + '@rollup/rollup-darwin-x64@4.37.0': 3915 3823 optional: true 3916 3824 3917 - '@rollup/rollup-freebsd-arm64@4.44.0': 3825 + '@rollup/rollup-freebsd-arm64@4.37.0': 3918 3826 optional: true 3919 3827 3920 - '@rollup/rollup-freebsd-x64@4.44.0': 3828 + '@rollup/rollup-freebsd-x64@4.37.0': 3921 3829 optional: true 3922 3830 3923 - '@rollup/rollup-linux-arm-gnueabihf@4.44.0': 3831 + '@rollup/rollup-linux-arm-gnueabihf@4.37.0': 3924 3832 optional: true 3925 3833 3926 - '@rollup/rollup-linux-arm-musleabihf@4.44.0': 3834 + '@rollup/rollup-linux-arm-musleabihf@4.37.0': 3927 3835 optional: true 3928 3836 3929 - '@rollup/rollup-linux-arm64-gnu@4.44.0': 3837 + '@rollup/rollup-linux-arm64-gnu@4.37.0': 3930 3838 optional: true 3931 3839 3932 - '@rollup/rollup-linux-arm64-musl@4.44.0': 3840 + '@rollup/rollup-linux-arm64-musl@4.37.0': 3933 3841 optional: true 3934 3842 3935 - '@rollup/rollup-linux-loongarch64-gnu@4.44.0': 3843 + '@rollup/rollup-linux-loongarch64-gnu@4.37.0': 3936 3844 optional: true 3937 3845 3938 - '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': 3846 + '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': 3939 3847 optional: true 3940 3848 3941 - '@rollup/rollup-linux-riscv64-gnu@4.44.0': 3849 + '@rollup/rollup-linux-riscv64-gnu@4.37.0': 3942 3850 optional: true 3943 3851 3944 - '@rollup/rollup-linux-riscv64-musl@4.44.0': 3852 + '@rollup/rollup-linux-riscv64-musl@4.37.0': 3945 3853 optional: true 3946 3854 3947 - '@rollup/rollup-linux-s390x-gnu@4.44.0': 3855 + '@rollup/rollup-linux-s390x-gnu@4.37.0': 3948 3856 optional: true 3949 3857 3950 - '@rollup/rollup-linux-x64-gnu@4.44.0': 3858 + '@rollup/rollup-linux-x64-gnu@4.37.0': 3951 3859 optional: true 3952 3860 3953 - '@rollup/rollup-linux-x64-musl@4.44.0': 3861 + '@rollup/rollup-linux-x64-musl@4.37.0': 3954 3862 optional: true 3955 3863 3956 - '@rollup/rollup-win32-arm64-msvc@4.44.0': 3864 + '@rollup/rollup-win32-arm64-msvc@4.37.0': 3957 3865 optional: true 3958 3866 3959 - '@rollup/rollup-win32-ia32-msvc@4.44.0': 3867 + '@rollup/rollup-win32-ia32-msvc@4.37.0': 3960 3868 optional: true 3961 3869 3962 - '@rollup/rollup-win32-x64-msvc@4.44.0': 3870 + '@rollup/rollup-win32-x64-msvc@4.37.0': 3963 3871 optional: true 3964 3872 3965 3873 '@surma/rollup-plugin-off-main-thread@2.2.3': ··· 3971 3879 3972 3880 '@tanstack/query-core@5.17.19(patch_hash=0b06407b66b7af88765fb6e01e112677a8c09ce518cb4f547cee8a0044471acd)': {} 3973 3881 3974 - '@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.6.0)': 3882 + '@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.5.3)': 3975 3883 dependencies: 3976 - '@babel/generator': 7.27.5 3977 - '@babel/parser': 7.27.5 3978 - '@babel/traverse': 7.27.4 3979 - '@babel/types': 7.27.6 3884 + '@babel/generator': 7.27.0 3885 + '@babel/parser': 7.27.0 3886 + '@babel/traverse': 7.27.0 3887 + '@babel/types': 7.27.0 3980 3888 javascript-natural-sort: 0.7.1 3981 3889 lodash: 4.17.21 3982 - prettier: 3.6.0 3890 + prettier: 3.5.3 3983 3891 transitivePeerDependencies: 3984 3892 - supports-color 3985 3893 3986 3894 '@types/babel__core@7.20.5': 3987 3895 dependencies: 3988 - '@babel/parser': 7.27.5 3989 - '@babel/types': 7.27.6 3990 - '@types/babel__generator': 7.27.0 3896 + '@babel/parser': 7.27.0 3897 + '@babel/types': 7.27.0 3898 + '@types/babel__generator': 7.6.8 3991 3899 '@types/babel__template': 7.4.4 3992 3900 '@types/babel__traverse': 7.20.7 3993 3901 3994 - '@types/babel__generator@7.27.0': 3902 + '@types/babel__generator@7.6.8': 3995 3903 dependencies: 3996 - '@babel/types': 7.27.6 3904 + '@babel/types': 7.27.0 3997 3905 3998 3906 '@types/babel__template@7.4.4': 3999 3907 dependencies: 4000 - '@babel/parser': 7.27.5 4001 - '@babel/types': 7.27.6 3908 + '@babel/parser': 7.27.0 3909 + '@babel/types': 7.27.0 4002 3910 4003 3911 '@types/babel__traverse@7.20.7': 4004 3912 dependencies: 4005 - '@babel/types': 7.27.6 3913 + '@babel/types': 7.27.0 4006 3914 4007 3915 '@types/dom-close-watcher@1.0.0': {} 4008 3916 4009 - '@types/dom-webcodecs@0.1.15': {} 3917 + '@types/dom-webcodecs@0.1.14': {} 4010 3918 4011 3919 '@types/estree@0.0.39': {} 4012 3920 4013 - '@types/estree@1.0.8': {} 3921 + '@types/estree@1.0.6': {} 4014 3922 4015 - '@types/node@24.3.0': 4016 - dependencies: 4017 - undici-types: 7.10.0 3923 + '@types/estree@1.0.7': {} 4018 3924 4019 3925 '@types/resolve@1.20.2': {} 4020 3926 ··· 4026 3932 4027 3933 acorn@8.14.0: {} 4028 3934 4029 - acorn@8.15.0: {} 3935 + acorn@8.14.1: {} 4030 3936 4031 3937 ajv@8.17.1: 4032 3938 dependencies: ··· 4062 3968 4063 3969 at-least-node@1.0.0: {} 4064 3970 4065 - autoprefixer@10.4.21(postcss@8.5.6): 3971 + autoprefixer@10.4.21(postcss@8.5.3): 4066 3972 dependencies: 4067 - browserslist: 4.25.0 4068 - caniuse-lite: 1.0.30001724 3973 + browserslist: 4.24.4 3974 + caniuse-lite: 1.0.30001707 4069 3975 fraction.js: 4.3.7 4070 3976 normalize-range: 0.1.2 4071 3977 picocolors: 1.1.1 4072 - postcss: 8.5.6 3978 + postcss: 8.5.3 4073 3979 postcss-value-parser: 4.2.0 4074 3980 4075 - babel-plugin-jsx-dom-expressions@0.39.8(@babel/core@7.27.4): 3981 + babel-plugin-jsx-dom-expressions@0.39.7(@babel/core@7.26.10): 4076 3982 dependencies: 4077 - '@babel/core': 7.27.4 3983 + '@babel/core': 7.26.10 4078 3984 '@babel/helper-module-imports': 7.18.6 4079 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) 4080 - '@babel/types': 7.27.6 3985 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) 3986 + '@babel/types': 7.27.0 4081 3987 html-entities: 2.3.3 4082 - parse5: 7.3.0 4083 - validate-html-nesting: 1.2.3 3988 + parse5: 7.2.1 3989 + validate-html-nesting: 1.2.2 4084 3990 4085 - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): 3991 + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10): 4086 3992 dependencies: 4087 - '@babel/compat-data': 7.27.5 4088 - '@babel/core': 7.27.4 4089 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) 3993 + '@babel/compat-data': 7.26.8 3994 + '@babel/core': 7.26.10 3995 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) 4090 3996 semver: 6.3.1 4091 3997 transitivePeerDependencies: 4092 3998 - supports-color 4093 3999 4094 - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.4): 4000 + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): 4095 4001 dependencies: 4096 - '@babel/core': 7.27.4 4097 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) 4098 - core-js-compat: 3.43.0 4002 + '@babel/core': 7.26.10 4003 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) 4004 + core-js-compat: 3.41.0 4099 4005 transitivePeerDependencies: 4100 4006 - supports-color 4101 4007 4102 - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.4): 4008 + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.10): 4103 4009 dependencies: 4104 - '@babel/core': 7.27.4 4105 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) 4010 + '@babel/core': 7.26.10 4011 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) 4106 4012 transitivePeerDependencies: 4107 4013 - supports-color 4108 4014 4109 - babel-plugin-transform-typescript-const-enums@0.1.0(@babel/core@7.27.4): 4015 + babel-plugin-transform-typescript-const-enums@0.1.0(@babel/core@7.26.10): 4110 4016 dependencies: 4111 - '@babel/core': 7.27.4 4112 - '@babel/helper-plugin-utils': 7.27.1 4113 - '@babel/types': 7.27.6 4017 + '@babel/core': 7.26.10 4018 + '@babel/helper-plugin-utils': 7.26.5 4019 + '@babel/types': 7.27.0 4114 4020 4115 - babel-preset-solid@1.9.6(@babel/core@7.27.4): 4021 + babel-preset-solid@1.9.5(@babel/core@7.26.10): 4116 4022 dependencies: 4117 - '@babel/core': 7.27.4 4118 - babel-plugin-jsx-dom-expressions: 0.39.8(@babel/core@7.27.4) 4023 + '@babel/core': 7.26.10 4024 + babel-plugin-jsx-dom-expressions: 0.39.7(@babel/core@7.26.10) 4119 4025 4120 4026 balanced-match@1.0.2: {} 4121 4027 ··· 4125 4031 4126 4032 blake3-wasm@2.1.5: {} 4127 4033 4128 - brace-expansion@1.1.12: 4034 + brace-expansion@1.1.11: 4129 4035 dependencies: 4130 4036 balanced-match: 1.0.2 4131 4037 concat-map: 0.0.1 4132 4038 4133 - brace-expansion@2.0.2: 4039 + brace-expansion@2.0.1: 4134 4040 dependencies: 4135 4041 balanced-match: 1.0.2 4136 4042 ··· 4138 4044 dependencies: 4139 4045 fill-range: 7.1.1 4140 4046 4141 - browserslist@4.25.0: 4047 + browserslist@4.24.4: 4142 4048 dependencies: 4143 - caniuse-lite: 1.0.30001724 4144 - electron-to-chromium: 1.5.171 4049 + caniuse-lite: 1.0.30001707 4050 + electron-to-chromium: 1.5.128 4145 4051 node-releases: 2.0.19 4146 - update-browserslist-db: 1.1.3(browserslist@4.25.0) 4052 + update-browserslist-db: 1.1.3(browserslist@4.24.4) 4147 4053 4148 4054 buffer-from@1.1.2: {} 4149 4055 4150 4056 camelcase-css@2.0.1: {} 4151 4057 4152 - caniuse-lite@1.0.30001724: {} 4058 + caniuse-lite@1.0.30001707: {} 4153 4059 4154 4060 chalk@4.1.2: 4155 4061 dependencies: ··· 4178 4084 dependencies: 4179 4085 color-name: 1.1.4 4180 4086 simple-swizzle: 0.2.2 4087 + optional: true 4181 4088 4182 4089 color@4.2.3: 4183 4090 dependencies: 4184 4091 color-convert: 2.0.1 4185 4092 color-string: 1.9.1 4093 + optional: true 4186 4094 4187 4095 comlink@4.4.2: {} 4188 4096 ··· 4196 4104 4197 4105 convert-source-map@2.0.0: {} 4198 4106 4199 - cookie@0.7.2: {} 4107 + cookie@0.5.0: {} 4200 4108 4201 - core-js-compat@3.43.0: 4109 + core-js-compat@3.41.0: 4202 4110 dependencies: 4203 - browserslist: 4.25.0 4111 + browserslist: 4.24.4 4204 4112 4205 4113 cross-spawn@7.0.6: 4206 4114 dependencies: ··· 4216 4124 4217 4125 data-uri-to-buffer@2.0.2: {} 4218 4126 4219 - debug@4.4.1: 4127 + debug@4.4.0: 4220 4128 dependencies: 4221 4129 ms: 2.1.3 4222 4130 ··· 4224 4132 4225 4133 defu@6.1.4: {} 4226 4134 4227 - detect-libc@2.0.4: {} 4135 + detect-libc@2.0.3: 4136 + optional: true 4228 4137 4229 4138 didyoumean@1.2.2: {} 4230 4139 ··· 4236 4145 dependencies: 4237 4146 jake: 10.9.2 4238 4147 4239 - electron-to-chromium@1.5.171: {} 4148 + electron-to-chromium@1.5.128: {} 4240 4149 4241 4150 emoji-regex@8.0.0: {} 4242 4151 4243 4152 emoji-regex@9.2.2: {} 4244 4153 4245 - entities@6.0.1: {} 4154 + entities@4.5.0: {} 4246 4155 4247 - esbuild@0.25.4: 4156 + esbuild@0.24.0: 4248 4157 optionalDependencies: 4249 - '@esbuild/aix-ppc64': 0.25.4 4250 - '@esbuild/android-arm': 0.25.4 4251 - '@esbuild/android-arm64': 0.25.4 4252 - '@esbuild/android-x64': 0.25.4 4253 - '@esbuild/darwin-arm64': 0.25.4 4254 - '@esbuild/darwin-x64': 0.25.4 4255 - '@esbuild/freebsd-arm64': 0.25.4 4256 - '@esbuild/freebsd-x64': 0.25.4 4257 - '@esbuild/linux-arm': 0.25.4 4258 - '@esbuild/linux-arm64': 0.25.4 4259 - '@esbuild/linux-ia32': 0.25.4 4260 - '@esbuild/linux-loong64': 0.25.4 4261 - '@esbuild/linux-mips64el': 0.25.4 4262 - '@esbuild/linux-ppc64': 0.25.4 4263 - '@esbuild/linux-riscv64': 0.25.4 4264 - '@esbuild/linux-s390x': 0.25.4 4265 - '@esbuild/linux-x64': 0.25.4 4266 - '@esbuild/netbsd-arm64': 0.25.4 4267 - '@esbuild/netbsd-x64': 0.25.4 4268 - '@esbuild/openbsd-arm64': 0.25.4 4269 - '@esbuild/openbsd-x64': 0.25.4 4270 - '@esbuild/sunos-x64': 0.25.4 4271 - '@esbuild/win32-arm64': 0.25.4 4272 - '@esbuild/win32-ia32': 0.25.4 4273 - '@esbuild/win32-x64': 0.25.4 4158 + '@esbuild/aix-ppc64': 0.24.0 4159 + '@esbuild/android-arm': 0.24.0 4160 + '@esbuild/android-arm64': 0.24.0 4161 + '@esbuild/android-x64': 0.24.0 4162 + '@esbuild/darwin-arm64': 0.24.0 4163 + '@esbuild/darwin-x64': 0.24.0 4164 + '@esbuild/freebsd-arm64': 0.24.0 4165 + '@esbuild/freebsd-x64': 0.24.0 4166 + '@esbuild/linux-arm': 0.24.0 4167 + '@esbuild/linux-arm64': 0.24.0 4168 + '@esbuild/linux-ia32': 0.24.0 4169 + '@esbuild/linux-loong64': 0.24.0 4170 + '@esbuild/linux-mips64el': 0.24.0 4171 + '@esbuild/linux-ppc64': 0.24.0 4172 + '@esbuild/linux-riscv64': 0.24.0 4173 + '@esbuild/linux-s390x': 0.24.0 4174 + '@esbuild/linux-x64': 0.24.0 4175 + '@esbuild/netbsd-x64': 0.24.0 4176 + '@esbuild/openbsd-arm64': 0.24.0 4177 + '@esbuild/openbsd-x64': 0.24.0 4178 + '@esbuild/sunos-x64': 0.24.0 4179 + '@esbuild/win32-arm64': 0.24.0 4180 + '@esbuild/win32-ia32': 0.24.0 4181 + '@esbuild/win32-x64': 0.24.0 4274 4182 4275 - esbuild@0.25.5: 4183 + esbuild@0.24.2: 4276 4184 optionalDependencies: 4277 - '@esbuild/aix-ppc64': 0.25.5 4278 - '@esbuild/android-arm': 0.25.5 4279 - '@esbuild/android-arm64': 0.25.5 4280 - '@esbuild/android-x64': 0.25.5 4281 - '@esbuild/darwin-arm64': 0.25.5 4282 - '@esbuild/darwin-x64': 0.25.5 4283 - '@esbuild/freebsd-arm64': 0.25.5 4284 - '@esbuild/freebsd-x64': 0.25.5 4285 - '@esbuild/linux-arm': 0.25.5 4286 - '@esbuild/linux-arm64': 0.25.5 4287 - '@esbuild/linux-ia32': 0.25.5 4288 - '@esbuild/linux-loong64': 0.25.5 4289 - '@esbuild/linux-mips64el': 0.25.5 4290 - '@esbuild/linux-ppc64': 0.25.5 4291 - '@esbuild/linux-riscv64': 0.25.5 4292 - '@esbuild/linux-s390x': 0.25.5 4293 - '@esbuild/linux-x64': 0.25.5 4294 - '@esbuild/netbsd-arm64': 0.25.5 4295 - '@esbuild/netbsd-x64': 0.25.5 4296 - '@esbuild/openbsd-arm64': 0.25.5 4297 - '@esbuild/openbsd-x64': 0.25.5 4298 - '@esbuild/sunos-x64': 0.25.5 4299 - '@esbuild/win32-arm64': 0.25.5 4300 - '@esbuild/win32-ia32': 0.25.5 4301 - '@esbuild/win32-x64': 0.25.5 4185 + '@esbuild/aix-ppc64': 0.24.2 4186 + '@esbuild/android-arm': 0.24.2 4187 + '@esbuild/android-arm64': 0.24.2 4188 + '@esbuild/android-x64': 0.24.2 4189 + '@esbuild/darwin-arm64': 0.24.2 4190 + '@esbuild/darwin-x64': 0.24.2 4191 + '@esbuild/freebsd-arm64': 0.24.2 4192 + '@esbuild/freebsd-x64': 0.24.2 4193 + '@esbuild/linux-arm': 0.24.2 4194 + '@esbuild/linux-arm64': 0.24.2 4195 + '@esbuild/linux-ia32': 0.24.2 4196 + '@esbuild/linux-loong64': 0.24.2 4197 + '@esbuild/linux-mips64el': 0.24.2 4198 + '@esbuild/linux-ppc64': 0.24.2 4199 + '@esbuild/linux-riscv64': 0.24.2 4200 + '@esbuild/linux-s390x': 0.24.2 4201 + '@esbuild/linux-x64': 0.24.2 4202 + '@esbuild/netbsd-arm64': 0.24.2 4203 + '@esbuild/netbsd-x64': 0.24.2 4204 + '@esbuild/openbsd-arm64': 0.24.2 4205 + '@esbuild/openbsd-x64': 0.24.2 4206 + '@esbuild/sunos-x64': 0.24.2 4207 + '@esbuild/win32-arm64': 0.24.2 4208 + '@esbuild/win32-ia32': 0.24.2 4209 + '@esbuild/win32-x64': 0.24.2 4302 4210 4303 4211 escalade@3.2.0: {} 4304 4212 4305 - esm-env@1.2.2: {} 4306 - 4307 4213 estree-walker@1.0.1: {} 4308 4214 4309 4215 estree-walker@2.0.2: {} ··· 4312 4218 4313 4219 exit-hook@2.2.1: {} 4314 4220 4315 - exsolve@1.0.7: {} 4221 + exsolve@1.0.4: {} 4316 4222 4317 4223 fast-deep-equal@3.1.3: {} 4318 4224 ··· 4332 4238 dependencies: 4333 4239 reusify: 1.1.0 4334 4240 4335 - fdir@6.4.6(picomatch@4.0.2): 4241 + fdir@6.4.3(picomatch@4.0.2): 4336 4242 optionalDependencies: 4337 4243 picomatch: 4.0.2 4338 4244 ··· 4406 4312 4407 4313 has-flag@4.0.0: {} 4408 4314 4409 - hls.js@1.6.5: {} 4315 + hls.js@1.6.0: {} 4410 4316 4411 4317 html-entities@2.3.3: {} 4412 4318 4413 4319 idb@7.1.1: {} 4414 4320 4415 - idb@8.0.3: {} 4321 + idb@8.0.2: {} 4416 4322 4417 4323 inflight@1.0.6: 4418 4324 dependencies: ··· 4421 4327 4422 4328 inherits@2.0.4: {} 4423 4329 4424 - is-arrayish@0.3.2: {} 4330 + is-arrayish@0.3.2: 4331 + optional: true 4425 4332 4426 4333 is-binary-path@2.1.0: 4427 4334 dependencies: ··· 4521 4428 4522 4429 mime@3.0.0: {} 4523 4430 4524 - miniflare@4.20250617.3: 4431 + miniflare@4.20250321.1: 4525 4432 dependencies: 4526 4433 '@cspotcode/source-map-support': 0.8.1 4527 4434 acorn: 8.14.0 4528 4435 acorn-walk: 8.3.2 4529 4436 exit-hook: 2.2.1 4530 4437 glob-to-regexp: 0.4.1 4531 - sharp: 0.33.5 4532 4438 stoppable: 1.1.0 4533 4439 undici: 5.29.0 4534 - workerd: 1.20250617.0 4440 + workerd: 1.20250321.0 4535 4441 ws: 8.18.0 4536 - youch: 3.3.4 4442 + youch: 3.2.3 4537 4443 zod: 3.22.3 4538 4444 transitivePeerDependencies: 4539 4445 - bufferutil ··· 4541 4447 4542 4448 minimatch@3.1.2: 4543 4449 dependencies: 4544 - brace-expansion: 1.1.12 4450 + brace-expansion: 1.1.11 4545 4451 4546 4452 minimatch@5.1.6: 4547 4453 dependencies: 4548 - brace-expansion: 2.0.2 4454 + brace-expansion: 2.0.1 4549 4455 4550 4456 minimatch@9.0.5: 4551 4457 dependencies: 4552 - brace-expansion: 2.0.2 4458 + brace-expansion: 2.0.1 4553 4459 4554 4460 minipass@7.1.2: {} 4555 4461 ··· 4585 4491 4586 4492 package-json-from-dist@1.0.1: {} 4587 4493 4588 - parse5@7.3.0: 4494 + parse5@7.2.1: 4589 4495 dependencies: 4590 - entities: 6.0.1 4496 + entities: 4.5.0 4591 4497 4592 4498 path-is-absolute@1.0.1: {} 4593 4499 ··· 4614 4520 4615 4521 pirates@4.0.7: {} 4616 4522 4617 - postcss-import@15.1.0(postcss@8.5.6): 4523 + postcss-import@15.1.0(postcss@8.5.3): 4618 4524 dependencies: 4619 - postcss: 8.5.6 4525 + postcss: 8.5.3 4620 4526 postcss-value-parser: 4.2.0 4621 4527 read-cache: 1.0.0 4622 4528 resolve: 1.22.10 4623 4529 4624 - postcss-js@4.0.1(postcss@8.5.6): 4530 + postcss-js@4.0.1(postcss@8.5.3): 4625 4531 dependencies: 4626 4532 camelcase-css: 2.0.1 4627 - postcss: 8.5.6 4533 + postcss: 8.5.3 4628 4534 4629 - postcss-load-config@4.0.2(postcss@8.5.6): 4535 + postcss-load-config@4.0.2(postcss@8.5.3): 4630 4536 dependencies: 4631 4537 lilconfig: 3.1.3 4632 - yaml: 2.8.0 4538 + yaml: 2.7.0 4633 4539 optionalDependencies: 4634 - postcss: 8.5.6 4540 + postcss: 8.5.3 4635 4541 4636 - postcss-nested@6.2.0(postcss@8.5.6): 4542 + postcss-nested@6.2.0(postcss@8.5.3): 4637 4543 dependencies: 4638 - postcss: 8.5.6 4544 + postcss: 8.5.3 4639 4545 postcss-selector-parser: 6.1.2 4640 4546 4641 4547 postcss-selector-parser@6.1.2: ··· 4645 4551 4646 4552 postcss-value-parser@4.2.0: {} 4647 4553 4648 - postcss@8.5.6: 4554 + postcss@8.5.3: 4649 4555 dependencies: 4650 4556 nanoid: 3.3.11 4651 4557 picocolors: 1.1.1 4652 4558 source-map-js: 1.2.1 4653 4559 4654 - prettier-plugin-tailwindcss@0.6.13(@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.6.0))(prettier@3.6.0): 4560 + prettier-plugin-tailwindcss@0.6.11(@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.5.3))(prettier@3.5.3): 4655 4561 dependencies: 4656 - prettier: 3.6.0 4562 + prettier: 3.5.3 4657 4563 optionalDependencies: 4658 - '@trivago/prettier-plugin-sort-imports': 5.2.2(prettier@3.6.0) 4564 + '@trivago/prettier-plugin-sort-imports': 5.2.2(prettier@3.5.3) 4659 4565 4660 - prettier@3.6.0: {} 4566 + prettier@3.5.3: {} 4661 4567 4662 4568 pretty-bytes@5.6.0: {} 4663 4569 ··· 4689 4595 4690 4596 regenerate@1.4.2: {} 4691 4597 4598 + regenerator-runtime@0.14.1: {} 4599 + 4600 + regenerator-transform@0.15.2: 4601 + dependencies: 4602 + '@babel/runtime': 7.27.0 4603 + 4692 4604 regexpu-core@6.2.0: 4693 4605 dependencies: 4694 4606 regenerate: 1.4.2 ··· 4718 4630 optionalDependencies: 4719 4631 fsevents: 2.3.3 4720 4632 4721 - rollup@4.44.0: 4633 + rollup@4.37.0: 4722 4634 dependencies: 4723 - '@types/estree': 1.0.8 4635 + '@types/estree': 1.0.6 4724 4636 optionalDependencies: 4725 - '@rollup/rollup-android-arm-eabi': 4.44.0 4726 - '@rollup/rollup-android-arm64': 4.44.0 4727 - '@rollup/rollup-darwin-arm64': 4.44.0 4728 - '@rollup/rollup-darwin-x64': 4.44.0 4729 - '@rollup/rollup-freebsd-arm64': 4.44.0 4730 - '@rollup/rollup-freebsd-x64': 4.44.0 4731 - '@rollup/rollup-linux-arm-gnueabihf': 4.44.0 4732 - '@rollup/rollup-linux-arm-musleabihf': 4.44.0 4733 - '@rollup/rollup-linux-arm64-gnu': 4.44.0 4734 - '@rollup/rollup-linux-arm64-musl': 4.44.0 4735 - '@rollup/rollup-linux-loongarch64-gnu': 4.44.0 4736 - '@rollup/rollup-linux-powerpc64le-gnu': 4.44.0 4737 - '@rollup/rollup-linux-riscv64-gnu': 4.44.0 4738 - '@rollup/rollup-linux-riscv64-musl': 4.44.0 4739 - '@rollup/rollup-linux-s390x-gnu': 4.44.0 4740 - '@rollup/rollup-linux-x64-gnu': 4.44.0 4741 - '@rollup/rollup-linux-x64-musl': 4.44.0 4742 - '@rollup/rollup-win32-arm64-msvc': 4.44.0 4743 - '@rollup/rollup-win32-ia32-msvc': 4.44.0 4744 - '@rollup/rollup-win32-x64-msvc': 4.44.0 4637 + '@rollup/rollup-android-arm-eabi': 4.37.0 4638 + '@rollup/rollup-android-arm64': 4.37.0 4639 + '@rollup/rollup-darwin-arm64': 4.37.0 4640 + '@rollup/rollup-darwin-x64': 4.37.0 4641 + '@rollup/rollup-freebsd-arm64': 4.37.0 4642 + '@rollup/rollup-freebsd-x64': 4.37.0 4643 + '@rollup/rollup-linux-arm-gnueabihf': 4.37.0 4644 + '@rollup/rollup-linux-arm-musleabihf': 4.37.0 4645 + '@rollup/rollup-linux-arm64-gnu': 4.37.0 4646 + '@rollup/rollup-linux-arm64-musl': 4.37.0 4647 + '@rollup/rollup-linux-loongarch64-gnu': 4.37.0 4648 + '@rollup/rollup-linux-powerpc64le-gnu': 4.37.0 4649 + '@rollup/rollup-linux-riscv64-gnu': 4.37.0 4650 + '@rollup/rollup-linux-riscv64-musl': 4.37.0 4651 + '@rollup/rollup-linux-s390x-gnu': 4.37.0 4652 + '@rollup/rollup-linux-x64-gnu': 4.37.0 4653 + '@rollup/rollup-linux-x64-musl': 4.37.0 4654 + '@rollup/rollup-win32-arm64-msvc': 4.37.0 4655 + '@rollup/rollup-win32-ia32-msvc': 4.37.0 4656 + '@rollup/rollup-win32-x64-msvc': 4.37.0 4745 4657 fsevents: 2.3.3 4746 4658 4747 4659 run-parallel@1.2.0: ··· 4750 4662 4751 4663 semver@6.3.1: {} 4752 4664 4753 - semver@7.7.2: {} 4665 + semver@7.7.1: 4666 + optional: true 4754 4667 4755 4668 serialize-javascript@6.0.2: 4756 4669 dependencies: 4757 4670 randombytes: 2.1.0 4758 4671 4759 - seroval-plugins@1.3.2(seroval@1.3.2): 4672 + seroval-plugins@1.2.1(seroval@1.2.1): 4760 4673 dependencies: 4761 - seroval: 1.3.2 4674 + seroval: 1.2.1 4762 4675 4763 - seroval@1.3.2: {} 4676 + seroval@1.2.1: {} 4764 4677 4765 4678 sharp@0.33.5: 4766 4679 dependencies: 4767 4680 color: 4.2.3 4768 - detect-libc: 2.0.4 4769 - semver: 7.7.2 4681 + detect-libc: 2.0.3 4682 + semver: 7.7.1 4770 4683 optionalDependencies: 4771 4684 '@img/sharp-darwin-arm64': 0.33.5 4772 4685 '@img/sharp-darwin-x64': 0.33.5 ··· 4787 4700 '@img/sharp-wasm32': 0.33.5 4788 4701 '@img/sharp-win32-ia32': 0.33.5 4789 4702 '@img/sharp-win32-x64': 0.33.5 4703 + optional: true 4790 4704 4791 4705 shebang-command@2.0.0: 4792 4706 dependencies: ··· 4799 4713 simple-swizzle@0.2.2: 4800 4714 dependencies: 4801 4715 is-arrayish: 0.3.2 4716 + optional: true 4802 4717 4803 4718 smob@1.5.0: {} 4804 4719 4805 - solid-floating-ui@0.2.1(@floating-ui/dom@1.7.1)(solid-js@1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7)): 4720 + solid-floating-ui@0.2.1(@floating-ui/dom@1.6.13)(solid-js@1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c)): 4806 4721 dependencies: 4807 - '@floating-ui/dom': 1.7.1 4808 - solid-js: 1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7) 4722 + '@floating-ui/dom': 1.6.13 4723 + solid-js: 1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c) 4809 4724 4810 - solid-js@1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7): 4725 + solid-js@1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c): 4811 4726 dependencies: 4812 4727 csstype: 3.1.3 4813 - seroval: 1.3.2 4814 - seroval-plugins: 1.3.2(seroval@1.3.2) 4728 + seroval: 1.2.1 4729 + seroval-plugins: 1.2.1(seroval@1.2.1) 4815 4730 4816 - solid-refresh@0.6.3(solid-js@1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7)): 4731 + solid-refresh@0.6.3(solid-js@1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c)): 4817 4732 dependencies: 4818 - '@babel/generator': 7.27.5 4819 - '@babel/helper-module-imports': 7.27.1 4820 - '@babel/types': 7.27.6 4821 - solid-js: 1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7) 4733 + '@babel/generator': 7.27.0 4734 + '@babel/helper-module-imports': 7.25.9 4735 + '@babel/types': 7.27.0 4736 + solid-js: 1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c) 4822 4737 transitivePeerDependencies: 4823 4738 - supports-color 4824 4739 ··· 4904 4819 normalize-path: 3.0.0 4905 4820 object-hash: 3.0.0 4906 4821 picocolors: 1.1.1 4907 - postcss: 8.5.6 4908 - postcss-import: 15.1.0(postcss@8.5.6) 4909 - postcss-js: 4.0.1(postcss@8.5.6) 4910 - postcss-load-config: 4.0.2(postcss@8.5.6) 4911 - postcss-nested: 6.2.0(postcss@8.5.6) 4822 + postcss: 8.5.3 4823 + postcss-import: 15.1.0(postcss@8.5.3) 4824 + postcss-js: 4.0.1(postcss@8.5.3) 4825 + postcss-load-config: 4.0.2(postcss@8.5.3) 4826 + postcss-nested: 6.2.0(postcss@8.5.3) 4912 4827 postcss-selector-parser: 6.1.2 4913 4828 resolve: 1.22.10 4914 4829 sucrase: 3.35.0 ··· 4924 4839 type-fest: 0.16.0 4925 4840 unique-string: 2.0.0 4926 4841 4927 - terser@5.43.1: 4842 + terser@5.39.0: 4928 4843 dependencies: 4929 4844 '@jridgewell/source-map': 0.3.6 4930 - acorn: 8.15.0 4845 + acorn: 8.14.1 4931 4846 commander: 2.20.3 4932 4847 source-map-support: 0.5.21 4933 4848 ··· 4939 4854 dependencies: 4940 4855 any-promise: 1.3.0 4941 4856 4942 - tinyglobby@0.2.14: 4857 + tinyglobby@0.2.12: 4943 4858 dependencies: 4944 - fdir: 6.4.6(picomatch@4.0.2) 4859 + fdir: 6.4.3(picomatch@4.0.2) 4945 4860 picomatch: 4.0.2 4946 4861 4947 4862 to-regex-range@5.0.1: ··· 4959 4874 4960 4875 type-fest@0.16.0: {} 4961 4876 4962 - typescript@5.8.3: {} 4877 + typescript@5.7.2: {} 4963 4878 4964 - ufo@1.6.1: {} 4965 - 4966 - undici-types@7.10.0: {} 4879 + ufo@1.5.4: {} 4967 4880 4968 4881 undici@5.29.0: 4969 4882 dependencies: 4970 4883 '@fastify/busboy': 2.1.1 4971 4884 4972 - unenv@2.0.0-rc.17: 4885 + unenv@2.0.0-rc.15: 4973 4886 dependencies: 4974 4887 defu: 6.1.4 4975 - exsolve: 1.0.7 4888 + exsolve: 1.0.4 4976 4889 ohash: 2.0.11 4977 4890 pathe: 2.0.3 4978 - ufo: 1.6.1 4891 + ufo: 1.5.4 4979 4892 4980 4893 unicode-canonical-property-names-ecmascript@2.0.1: {} 4981 4894 ··· 4996 4909 4997 4910 upath@1.2.0: {} 4998 4911 4999 - update-browserslist-db@1.1.3(browserslist@4.25.0): 4912 + update-browserslist-db@1.1.3(browserslist@4.24.4): 5000 4913 dependencies: 5001 - browserslist: 4.25.0 4914 + browserslist: 4.24.4 5002 4915 escalade: 3.2.0 5003 4916 picocolors: 1.1.1 5004 4917 5005 4918 util-deprecate@1.0.2: {} 5006 4919 5007 - validate-html-nesting@1.2.3: {} 4920 + validate-html-nesting@1.2.2: {} 5008 4921 5009 - vite-plugin-pwa@0.21.0(patch_hash=003379ded749ad87080f87b428b17f04c4c88b6b64544df4d928aab76fbf6325)(@types/babel__core@7.20.5)(vite@6.3.5(@types/node@24.3.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0)): 4922 + vite-plugin-pwa@0.21.0(patch_hash=003379ded749ad87080f87b428b17f04c4c88b6b64544df4d928aab76fbf6325)(@types/babel__core@7.20.5)(vite@6.0.5(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.0)): 5010 4923 dependencies: 5011 - debug: 4.4.1 4924 + debug: 4.4.0 5012 4925 pretty-bytes: 6.1.1 5013 - tinyglobby: 0.2.14 5014 - vite: 6.3.5(@types/node@24.3.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0) 4926 + tinyglobby: 0.2.12 4927 + vite: 6.0.5(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.0) 5015 4928 workbox-build: 7.3.0(@types/babel__core@7.20.5) 5016 4929 workbox-window: 7.3.0 5017 4930 transitivePeerDependencies: 5018 4931 - '@types/babel__core' 5019 4932 - supports-color 5020 4933 5021 - vite-plugin-solid@2.11.6(solid-js@1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7))(vite@6.3.5(@types/node@24.3.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0)): 4934 + vite-plugin-solid@2.11.6(solid-js@1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c))(vite@6.0.5(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.0)): 5022 4935 dependencies: 5023 - '@babel/core': 7.27.4 4936 + '@babel/core': 7.26.10 5024 4937 '@types/babel__core': 7.20.5 5025 - babel-preset-solid: 1.9.6(@babel/core@7.27.4) 4938 + babel-preset-solid: 1.9.5(@babel/core@7.26.10) 5026 4939 merge-anything: 5.1.7 5027 - solid-js: 1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7) 5028 - solid-refresh: 0.6.3(solid-js@1.9.7(patch_hash=9cf3f9930aa2f8d4e60502a75153adf9468eb53b42f69e86cac05dfaea3f82e7)) 5029 - vite: 6.3.5(@types/node@24.3.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0) 5030 - vitefu: 1.0.7(vite@6.3.5(@types/node@24.3.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0)) 4940 + solid-js: 1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c) 4941 + solid-refresh: 0.6.3(solid-js@1.9.5(patch_hash=9a1f52b880286fb75dd8b75f1dbd1f4c0ed3fc3e607aeacc391a7e5ea64bbf9c)) 4942 + vite: 6.0.5(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.0) 4943 + vitefu: 1.0.6(vite@6.0.5(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.0)) 5031 4944 transitivePeerDependencies: 5032 4945 - supports-color 5033 4946 5034 - vite@6.3.5(@types/node@24.3.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0): 4947 + vite@6.0.5(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.0): 5035 4948 dependencies: 5036 - esbuild: 0.25.5 5037 - fdir: 6.4.6(picomatch@4.0.2) 5038 - picomatch: 4.0.2 5039 - postcss: 8.5.6 5040 - rollup: 4.44.0 5041 - tinyglobby: 0.2.14 4949 + esbuild: 0.24.0 4950 + postcss: 8.5.3 4951 + rollup: 4.37.0 5042 4952 optionalDependencies: 5043 - '@types/node': 24.3.0 5044 4953 fsevents: 2.3.3 5045 4954 jiti: 1.21.7 5046 - terser: 5.43.1 5047 - yaml: 2.8.0 4955 + terser: 5.39.0 4956 + yaml: 2.7.0 5048 4957 5049 - vitefu@1.0.7(vite@6.3.5(@types/node@24.3.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0)): 4958 + vitefu@1.0.6(vite@6.0.5(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.0)): 5050 4959 optionalDependencies: 5051 - vite: 6.3.5(@types/node@24.3.0)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0) 4960 + vite: 6.0.5(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.0) 5052 4961 5053 4962 webidl-conversions@4.0.2: {} 5054 4963 5055 - webm-muxer@5.1.3: 4964 + webm-muxer@5.1.1: 5056 4965 dependencies: 5057 - '@types/dom-webcodecs': 0.1.15 4966 + '@types/dom-webcodecs': 0.1.14 5058 4967 '@types/wicg-file-system-access': 2020.9.8 5059 4968 5060 4969 whatwg-url@7.1.0: ··· 5079 4988 workbox-build@7.3.0(@types/babel__core@7.20.5): 5080 4989 dependencies: 5081 4990 '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) 5082 - '@babel/core': 7.27.4 5083 - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) 5084 - '@babel/runtime': 7.27.6 5085 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.27.4)(@types/babel__core@7.20.5)(rollup@2.79.2) 4991 + '@babel/core': 7.26.10 4992 + '@babel/preset-env': 7.26.9(@babel/core@7.26.10) 4993 + '@babel/runtime': 7.27.0 4994 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.26.10)(@types/babel__core@7.20.5)(rollup@2.79.2) 5086 4995 '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) 5087 4996 '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) 5088 4997 '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) ··· 5180 5089 '@types/trusted-types': 2.0.7 5181 5090 workbox-core: 7.3.0 5182 5091 5183 - workerd@1.20250617.0: 5092 + workerd@1.20250321.0: 5184 5093 optionalDependencies: 5185 - '@cloudflare/workerd-darwin-64': 1.20250617.0 5186 - '@cloudflare/workerd-darwin-arm64': 1.20250617.0 5187 - '@cloudflare/workerd-linux-64': 1.20250617.0 5188 - '@cloudflare/workerd-linux-arm64': 1.20250617.0 5189 - '@cloudflare/workerd-windows-64': 1.20250617.0 5094 + '@cloudflare/workerd-darwin-64': 1.20250321.0 5095 + '@cloudflare/workerd-darwin-arm64': 1.20250321.0 5096 + '@cloudflare/workerd-linux-64': 1.20250321.0 5097 + '@cloudflare/workerd-linux-arm64': 1.20250321.0 5098 + '@cloudflare/workerd-windows-64': 1.20250321.0 5190 5099 5191 - wrangler@4.20.5: 5100 + wrangler@4.6.0: 5192 5101 dependencies: 5193 5102 '@cloudflare/kv-asset-handler': 0.4.0 5194 - '@cloudflare/unenv-preset': 2.3.3(unenv@2.0.0-rc.17)(workerd@1.20250617.0) 5103 + '@cloudflare/unenv-preset': 2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250321.0) 5195 5104 blake3-wasm: 2.1.5 5196 - esbuild: 0.25.4 5197 - miniflare: 4.20250617.3 5105 + esbuild: 0.24.2 5106 + miniflare: 4.20250321.1 5198 5107 path-to-regexp: 6.3.0 5199 - unenv: 2.0.0-rc.17 5200 - workerd: 1.20250617.0 5108 + unenv: 2.0.0-rc.15 5109 + workerd: 1.20250321.0 5201 5110 optionalDependencies: 5202 5111 fsevents: 2.3.3 5112 + sharp: 0.33.5 5203 5113 transitivePeerDependencies: 5204 5114 - bufferutil 5205 5115 - utf-8-validate ··· 5222 5132 5223 5133 yallist@3.1.1: {} 5224 5134 5225 - yaml@2.8.0: {} 5135 + yaml@2.7.0: {} 5226 5136 5227 - youch@3.3.4: 5137 + youch@3.2.3: 5228 5138 dependencies: 5229 - cookie: 0.7.2 5139 + cookie: 0.5.0 5230 5140 mustache: 4.2.0 5231 5141 stacktracey: 2.1.8 5232 5142
+12
public/oauth/client-metadata.json
··· 1 + { 2 + "client_id": "https://aglais.pages.dev/oauth/client-metadata.json", 3 + "client_uri": "https://aglais.pages.dev", 4 + "client_name": "Aglais", 5 + "application_type": "web", 6 + "scope": "atproto transition:generic transition:chat.bsky", 7 + "grant_types": ["authorization_code", "refresh_token"], 8 + "redirect_uris": ["https://aglais.pages.dev/oauth/callback"], 9 + "response_types": ["code"], 10 + "token_endpoint_auth_method": "none", 11 + "dpop_bound_access_tokens": true 12 + }
-12
public/oauth-client-metadata.json
··· 1 - { 2 - "client_id": "https://aglais.pages.dev/oauth-client-metadata.json", 3 - "client_uri": "https://aglais.pages.dev", 4 - "client_name": "Aglais", 5 - "application_type": "web", 6 - "scope": "atproto transition:generic transition:chat.bsky", 7 - "grant_types": ["authorization_code", "refresh_token"], 8 - "redirect_uris": ["https://aglais.pages.dev/oauth/callback"], 9 - "response_types": ["code"], 10 - "token_endpoint_auth_method": "none", 11 - "dpop_bound_access_tokens": true 12 - }
+1 -1
src/api/cache/post-shadow.ts
··· 1 1 import { type Accessor, batch, createRenderEffect, createSignal, onCleanup } from 'solid-js'; 2 2 3 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 3 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 4 4 import { EventEmitter } from '@mary/events'; 5 5 import type { QueryClient } from '@mary/solid-query'; 6 6
+4 -5
src/api/cache/profile-shadow.ts
··· 1 1 import { type Accessor, batch, createRenderEffect, createSignal, onCleanup } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 4 - import type { Did } from '@atcute/lexicons'; 3 + import type { AppBskyActorDefs, At } from '@atcute/client/lexicons'; 5 4 import { EventEmitter } from '@mary/events'; 6 5 import type { QueryClient } from '@mary/solid-query'; 7 6 ··· 34 33 | AppBskyActorDefs.ProfileViewBasic 35 34 | AppBskyActorDefs.ProfileViewDetailed; 36 35 37 - const emitter = new EventEmitter<{ [uri: Did]: [] }>(); 36 + const emitter = new EventEmitter<{ [uri: At.DID]: [] }>(); 38 37 const shadows = new WeakMap<AllProfileView, ProfileShadow>(); 39 38 40 39 export const useProfileShadow = (profile: AccessorMaybe<AllProfileView>): Accessor<ProfileShadowView> => { ··· 67 66 }; 68 67 }; 69 68 70 - export const updateProfileShadow = (queryClient: QueryClient, did: Did, value: Partial<ProfileShadow>) => { 69 + export const updateProfileShadow = (queryClient: QueryClient, did: At.DID, value: Partial<ProfileShadow>) => { 71 70 for (const profile of findProfilesInCache(queryClient, did)) { 72 71 shadows.set(profile, { ...shadows.get(profile), ...value }); 73 72 } ··· 75 74 batch(() => emitter.emit(did)); 76 75 }; 77 76 78 - export function findProfilesInCache(queryClient: QueryClient, did: Did): Generator<AllProfileView> { 77 + export function findProfilesInCache(queryClient: QueryClient, did: At.DID): Generator<AllProfileView> { 79 78 return iterateQueryCache<AllProfileView>(queryClient, [ 80 79 findAllProfilesInBookmarkFeed(did), 81 80 findAllProfilesInNotificationFeed(did),
+14 -7
src/api/models/post-thread.tsx
··· 1 - import type { AppBskyFeedDefs, AppBskyFeedGetPostThread, AppBskyFeedPost } from '@atcute/bluesky'; 2 - import type { $type, Did } from '@atcute/lexicons'; 1 + import type { 2 + AppBskyFeedDefs, 3 + AppBskyFeedGetPostThread, 4 + AppBskyFeedPost, 5 + At, 6 + Brand, 7 + } from '@atcute/client/lexicons'; 3 8 4 9 import type { ThreadViewPreferences } from '~/lib/preferences/account'; 5 10 ··· 64 69 export interface PostDescendantItem extends BaseDescendant { 65 70 type: 'post'; 66 71 post: AppBskyFeedDefs.PostView; 72 + context: AppBskyFeedDefs.ThreadContext | undefined; 67 73 prev: boolean; 68 74 next: boolean; 69 75 } ··· 82 88 83 89 export const fillModerationCache = ( 84 90 cache: ThreadModerationCache, 85 - thread: AppBskyFeedGetPostThread.$output['thread'], 91 + thread: AppBskyFeedGetPostThread.Output['thread'], 86 92 options: ModerationOptions, 87 93 ) => { 88 94 if (thread.$type === 'app.bsky.feed.defs#threadViewPost') { ··· 111 117 moderationOptions, 112 118 selfDid, 113 119 }: { 114 - thread: $type.enforce<AppBskyFeedDefs.ThreadViewPost>; 120 + thread: Brand.Union<AppBskyFeedDefs.ThreadViewPost>; 115 121 preferences: ThreadViewPreferences; 116 122 moderationOptions: ModerationOptions; 117 - selfDid?: Did; 123 + selfDid?: At.DID; 118 124 }): ThreadData => { 119 125 const { followsFirst, sort, treeView } = preferences; 120 126 ··· 161 167 162 168 if (last && last.type === 'post') { 163 169 const post = last.post; 164 - const reply = (post.record as AppBskyFeedPost.Main).reply; 170 + const reply = (post.record as AppBskyFeedPost.Record).reply; 165 171 166 172 if (reply) { 167 173 const uri = reply.parent.uri; ··· 200 206 201 207 // Filter the replies to only what we want 202 208 const items = replies.filter( 203 - (x): x is $type.enforce<AppBskyFeedDefs.ThreadViewPost | AppBskyFeedDefs.BlockedPost> => { 209 + (x): x is Brand.Union<AppBskyFeedDefs.ThreadViewPost | AppBskyFeedDefs.BlockedPost> => { 204 210 return ( 205 211 x.$type === 'app.bsky.feed.defs#threadViewPost' || 206 212 (x.$type === 'app.bsky.feed.defs#blockedPost' && !x.author.viewer?.blockedBy) ··· 324 330 id: post.uri, 325 331 type: 'post', 326 332 post: post, 333 + context: reply.threadContext, 327 334 prev: depth !== 0, 328 335 next: children.length !== 0, 329 336 lines: nlines,
+1 -1
src/api/models/timeline.ts
··· 1 - import type { AppBskyActorDefs, AppBskyFeedDefs } from '@atcute/bluesky'; 1 + import type { AppBskyActorDefs, AppBskyFeedDefs } from '@atcute/client/lexicons'; 2 2 3 3 type Post = AppBskyFeedDefs.PostView; 4 4 type TimelineItem = AppBskyFeedDefs.FeedViewPost;
+2 -3
src/api/moderation/entities/generic.ts
··· 1 - import type { ComAtprotoLabelDefs } from '@atcute/atproto'; 2 - import type { Did } from '@atcute/lexicons'; 1 + import type { At, ComAtprotoLabelDefs } from '@atcute/client/lexicons'; 3 2 4 3 import { type ModerationCause, type ModerationOptions, decideLabelModeration } from '..'; 5 4 import { TargetContent } from '../constants'; 6 5 7 6 export const moderateGeneric = ( 8 7 item: { labels?: ComAtprotoLabelDefs.Label[] }, 9 - userDid: Did, 8 + userDid: At.DID, 10 9 opts: ModerationOptions, 11 10 ) => { 12 11 const accu: ModerationCause[] = [];
+2 -2
src/api/moderation/entities/post.ts
··· 1 - import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/bluesky'; 1 + import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/client/lexicons'; 2 2 3 3 import { unwrapPostEmbedText } from '~/api/utils/post'; 4 4 ··· 14 14 15 15 export const moderatePost = (post: AppBskyFeedDefs.PostView, opts: ModerationOptions) => { 16 16 const author = post.author; 17 - const record = post.record as AppBskyFeedPost.Main; 17 + const record = post.record as AppBskyFeedPost.Record; 18 18 const text = record.text + unwrapPostEmbedText(record.embed); 19 19 20 20 const accu: ModerationCause[] = moderateProfile(author, opts);
+1 -1
src/api/moderation/entities/profile.ts
··· 1 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 1 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 2 2 3 3 import { 4 4 type ModerationCause,
+2 -2
src/api/moderation/entities/quote.ts
··· 1 - import type { AppBskyEmbedRecord, AppBskyFeedPost } from '@atcute/bluesky'; 1 + import type { AppBskyEmbedRecord, AppBskyFeedPost } from '@atcute/client/lexicons'; 2 2 3 3 import { unwrapPostEmbedText } from '~/api/utils/post'; 4 4 ··· 14 14 15 15 export const moderateQuote = (quote: AppBskyEmbedRecord.ViewRecord, opts: ModerationOptions) => { 16 16 const author = quote.author; 17 - const record = quote.value as AppBskyFeedPost.Main; 17 + const record = quote.value as AppBskyFeedPost.Record; 18 18 const text = record.text + unwrapPostEmbedText(record.embed); 19 19 20 20 const accu: ModerationCause[] = moderateProfile(author, opts);
+6 -7
src/api/moderation/index.ts
··· 1 - import type { ComAtprotoLabelDefs } from '@atcute/atproto'; 2 - import type { Did } from '@atcute/lexicons'; 1 + import type { At, ComAtprotoLabelDefs } from '@atcute/client/lexicons'; 3 2 4 3 import { 5 4 BlurContent, ··· 281 280 282 281 export interface ModerationLabeler { 283 282 /** DID of the labeler */ 284 - did: Did; 283 + did: At.DID; 285 284 /** Profile details of the labeler */ 286 285 profile: { 287 286 avatar?: string; ··· 310 309 /** Preferences for global-defined labels */ 311 310 labels: LabelPreferenceMapping; 312 311 /** Preferences for labels from subscribed labelers */ 313 - labelers: Record<Did, ModerationLabelerPreferences>; 312 + labelers: Record<At.DID, ModerationLabelerPreferences>; 314 313 /** Keyword filters */ 315 314 keywords: KeywordFilter[]; 316 315 317 316 /** List of users to hide reposts from */ 318 - hideReposts: Did[]; 317 + hideReposts: At.DID[]; 319 318 } 320 319 321 320 export interface ModerationOptions { 322 321 _filtersCache?: [raw: string, match: RegExp][]; 323 322 324 323 preferences: ModerationPreferences; 325 - labelerDefinitions: Record<Did, ModerationLabeler>; 324 + labelerDefinitions: Record<At.DID, ModerationLabeler>; 326 325 } 327 326 328 327 export const decideLabelModeration = ( 329 328 accu: ModerationCause[], 330 329 target: LabelTarget, 331 330 labels: Label[] | undefined, 332 - userDid: Did, 331 + userDid: At.DID, 333 332 opts: ModerationOptions, 334 333 ) => { 335 334 if (labels /* && labels.length > 0 */) {
+1 -1
src/api/moderation/labeler.ts
··· 1 - import type { AppBskyLabelerDefs } from '@atcute/bluesky'; 1 + import type { AppBskyLabelerDefs } from '@atcute/client/lexicons'; 2 2 import { mapDefined } from '@mary/array-fns'; 3 3 4 4 import type { LabelDefinitionMapping, ModerationLabeler } from '.';
+10 -10
src/api/mutations/post.ts
··· 1 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 1 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 2 2 import { useQueryClient } from '@mary/solid-query'; 3 3 4 4 import { useAgent } from '~/lib/states/agent'; 5 5 import { useSession } from '~/lib/states/session'; 6 6 7 7 import { type PostShadowView, updatePostShadow } from '../cache/post-shadow'; 8 - import { assertCanonicalResourceUri } from '../types/at-uri'; 8 + import { parseAtUri } from '../types/at-uri'; 9 9 import { getCurrentDate } from '../utils/misc'; 10 10 import { createRecord, deleteRecord } from '../utils/records'; 11 11 import { createToggleMutationQueue } from '../utils/toggle-mutation'; ··· 15 15 shadow: () => PostShadowView, 16 16 ) => { 17 17 const queryClient = useQueryClient(); 18 - const { client } = useAgent(); 18 + const { rpc } = useAgent(); 19 19 const { currentAccount } = useSession(); 20 20 21 21 const postUri = post().uri; ··· 30 30 return prevLikeUri; 31 31 } 32 32 33 - const result = await createRecord(client, { 33 + const result = await createRecord(rpc, { 34 34 repo: currentAccount!.did, 35 35 collection: 'app.bsky.feed.like', 36 36 record: { ··· 45 45 46 46 return result.uri; 47 47 } else if (prevLikeUri) { 48 - const uri = assertCanonicalResourceUri(prevLikeUri); 48 + const uri = parseAtUri(prevLikeUri); 49 49 50 - await deleteRecord(client, { 50 + await deleteRecord(rpc, { 51 51 repo: currentAccount!.did, 52 52 collection: 'app.bsky.feed.like', 53 53 rkey: uri.rkey, ··· 74 74 shadow: () => PostShadowView, 75 75 ) => { 76 76 const queryClient = useQueryClient(); 77 - const { client } = useAgent(); 77 + const { rpc } = useAgent(); 78 78 const { currentAccount } = useSession(); 79 79 80 80 const postUri = post().uri; ··· 89 89 return prevRepostUri; 90 90 } 91 91 92 - const result = await createRecord(client, { 92 + const result = await createRecord(rpc, { 93 93 repo: currentAccount!.did, 94 94 collection: 'app.bsky.feed.repost', 95 95 record: { ··· 104 104 105 105 return result.uri; 106 106 } else if (prevRepostUri) { 107 - const uri = assertCanonicalResourceUri(prevRepostUri); 107 + const uri = parseAtUri(prevRepostUri); 108 108 109 - await deleteRecord(client, { 109 + await deleteRecord(rpc, { 110 110 repo: currentAccount!.did, 111 111 collection: 'app.bsky.feed.repost', 112 112 rkey: uri.rkey,
+6 -6
src/api/mutations/profile.ts
··· 1 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 1 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 2 2 import { useQueryClient } from '@mary/solid-query'; 3 3 4 4 import { useAgent } from '~/lib/states/agent'; 5 5 import { useSession } from '~/lib/states/session'; 6 6 7 7 import { type ProfileShadowView, updateProfileShadow } from '../cache/profile-shadow'; 8 - import { assertCanonicalResourceUri } from '../types/at-uri'; 8 + import { parseAtUri } from '../types/at-uri'; 9 9 import { getCurrentDate } from '../utils/misc'; 10 10 import { createRecord, deleteRecord } from '../utils/records'; 11 11 import { createToggleMutationQueue } from '../utils/toggle-mutation'; ··· 15 15 shadow: () => ProfileShadowView, 16 16 ) => { 17 17 const queryClient = useQueryClient(); 18 - const { client } = useAgent(); 18 + const { rpc } = useAgent(); 19 19 const { currentAccount } = useSession(); 20 20 21 21 const did = profile().did; ··· 30 30 return prevFollowUri; 31 31 } 32 32 33 - const result = await createRecord(client, { 33 + const result = await createRecord(rpc, { 34 34 repo: currentAccount!.did, 35 35 collection: 'app.bsky.graph.follow', 36 36 record: { ··· 42 42 43 43 return result.uri; 44 44 } else if (prevFollowUri) { 45 - const uri = assertCanonicalResourceUri(prevFollowUri); 45 + const uri = parseAtUri(prevFollowUri); 46 46 47 - await deleteRecord(client, { 47 + await deleteRecord(rpc, { 48 48 repo: currentAccount!.did, 49 49 collection: 'app.bsky.graph.follow', 50 50 rkey: uri.rkey,
+4 -9
src/api/queries/blob.ts
··· 1 - import { type Client, ok } from '@atcute/client'; 2 - import type { Blob as AtpBlob } from '@atcute/lexicons'; 1 + import type { XRPC } from '@atcute/client'; 2 + import type { At } from '@atcute/client/lexicons'; 3 3 4 - export const uploadBlob = async (client: Client, blob: Blob): Promise<AtpBlob<any>> => { 5 - const data = await ok( 6 - client.post('com.atproto.repo.uploadBlob', { 7 - input: blob, 8 - }), 9 - ); 10 - 4 + export const uploadBlob = async (rpc: XRPC, blob: Blob): Promise<At.Blob<any>> => { 5 + const { data } = await rpc.call('com.atproto.repo.uploadBlob', { data: blob }); 11 6 return data.blob; 12 7 };
+8 -11
src/api/queries/bookmark-feed.ts
··· 1 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 2 1 import { tokenize } from '@atcute/bluesky-search-parser'; 3 - import { ok } from '@atcute/client'; 2 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 4 3 import { mapDefined } from '@mary/array-fns'; 5 4 import { filter, map, take, toArray } from '@mary/async-iterator-fns'; 6 5 import { createInfiniteQuery, createQuery } from '@mary/solid-query'; ··· 42 41 43 42 export const createBookmarkFeedQuery = (tagId: () => string, search: () => string) => { 44 43 const bookmarks = inject(BookmarksService); 45 - const { client } = useAgent(); 44 + const { rpc } = useAgent(); 46 45 47 46 const listing = createInfiniteQuery(() => { 48 47 const $tagId = tagId(); ··· 96 95 let map: Map<string, AppBskyFeedDefs.PostView>; 97 96 98 97 try { 99 - const data = await ok( 100 - client.get('app.bsky.feed.getPosts', { 101 - signal: ctx.signal, 102 - params: { 103 - uris: raws.map((item) => item.view.uri), 104 - }, 105 - }), 106 - ); 98 + const { data } = await rpc.get('app.bsky.feed.getPosts', { 99 + signal: ctx.signal, 100 + params: { 101 + uris: raws.map((item) => item.view.uri), 102 + }, 103 + }); 107 104 108 105 map = new Map(data.posts.map((view) => [view.uri, view])); 109 106 } catch {}
+2 -3
src/api/queries/composer.ts
··· 1 - import type { GenericUri } from '@atcute/lexicons'; 2 1 import { createQuery } from '@mary/solid-query'; 3 2 4 3 const LINK_PROXY_ENDPOINT = 'https://cardyb.bsky.app/v1/extract'; ··· 13 12 } 14 13 15 14 export interface LinkMeta { 16 - uri: GenericUri; 15 + uri: string; 17 16 title: string; 18 17 description: string; 19 18 thumb: Blob | undefined; ··· 57 56 } 58 57 59 58 const meta: LinkMeta = { 60 - uri: $uri as GenericUri, 59 + uri: $uri, 61 60 title: data.title, 62 61 description: data.description, 63 62 thumb: thumb,
+13 -17
src/api/queries/feed.ts
··· 1 1 import { modifyMutable, reconcile } from 'solid-js/store'; 2 2 3 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 4 - import { ok } from '@atcute/client'; 5 - import { type Did } from '@atcute/lexicons'; 6 - import { isDid } from '@atcute/lexicons/syntax'; 3 + import type { AppBskyFeedDefs, At } from '@atcute/client/lexicons'; 7 4 import { createQuery } from '@mary/solid-query'; 8 5 9 6 import type { SavedGeneratorFeed } from '~/lib/preferences/account'; ··· 11 8 import { useSession } from '~/lib/states/session'; 12 9 import { omit } from '~/lib/utils/misc'; 13 10 14 - import { assertCanonicalResourceUri, makeAtUri } from '../types/at-uri'; 11 + import { makeAtUri, parseAtUri } from '../types/at-uri'; 12 + import { isDid } from '../types/identity'; 15 13 16 14 import { resolveHandle } from './handle'; 17 15 18 16 export const createFeedMetaQuery = (feedUri: () => string) => { 19 - const { client } = useAgent(); 17 + const { rpc } = useAgent(); 20 18 const { currentAccount } = useSession(); 21 19 22 20 return createQuery((queryClient) => { ··· 25 23 return { 26 24 queryKey: ['feed-meta', $feedUri], 27 25 async queryFn(ctx): Promise<AppBskyFeedDefs.GeneratorView> { 28 - const uri = assertCanonicalResourceUri($feedUri); 26 + const uri = parseAtUri($feedUri); 29 27 30 - let did: Did; 28 + let did: At.DID; 31 29 if (isDid(uri.repo)) { 32 30 did = uri.repo; 33 31 } else { 34 - did = await resolveHandle(client, uri.repo, ctx.signal); 32 + did = await resolveHandle(rpc, uri.repo, ctx.signal); 35 33 } 36 34 37 - const data = await ok( 38 - client.get('app.bsky.feed.getFeedGenerator', { 39 - signal: ctx.signal, 40 - params: { 41 - feed: makeAtUri(did, uri.collection, uri.rkey), 42 - }, 43 - }), 44 - ); 35 + const { data } = await rpc.get('app.bsky.feed.getFeedGenerator', { 36 + signal: ctx.signal, 37 + params: { 38 + feed: makeAtUri(did, uri.collection, uri.rkey), 39 + }, 40 + }); 45 41 46 42 if (currentAccount) { 47 43 const found = currentAccount.preferences.feeds.find((item): item is SavedGeneratorFeed => {
+11 -14
src/api/queries/handle.ts
··· 1 - import { type Client, ok } from '@atcute/client'; 2 - import type { Handle } from '@atcute/lexicons'; 1 + import { XRPC } from '@atcute/client'; 3 2 import { createQuery } from '@mary/solid-query'; 4 3 5 4 import { useAgent } from '~/lib/states/agent'; 6 5 7 - export const useResolveHandleQuery = (handle: () => Handle) => { 8 - const { client } = useAgent(); 6 + export const useResolveHandleQuery = (handle: () => string) => { 7 + const { rpc } = useAgent(); 9 8 10 9 return createQuery(() => { 11 10 const $handle = handle(); ··· 13 12 return { 14 13 queryKey: ['resolve-handle', $handle], 15 14 async queryFn(ctx) { 16 - return resolveHandle(client, $handle, ctx.signal); 15 + return resolveHandle(rpc, $handle, ctx.signal); 17 16 }, 18 17 }; 19 18 }); 20 19 }; 21 20 22 - export const resolveHandle = async (client: Client, handle: Handle, signal?: AbortSignal) => { 23 - const data = await ok( 24 - client.get('com.atproto.identity.resolveHandle', { 25 - signal: signal, 26 - params: { 27 - handle: handle, 28 - }, 29 - }), 30 - ); 21 + export const resolveHandle = async (rpc: XRPC, handle: string, signal?: AbortSignal) => { 22 + const { data } = await rpc.get('com.atproto.identity.resolveHandle', { 23 + signal: signal, 24 + params: { 25 + handle: handle, 26 + }, 27 + }); 31 28 32 29 return data.did; 33 30 };
+14 -17
src/api/queries/labeler.ts
··· 1 - import type { AppBskyLabelerDefs } from '@atcute/bluesky'; 2 - import { ClientResponseError, ok } from '@atcute/client'; 3 - import type { Did } from '@atcute/lexicons'; 1 + import { XRPCError } from '@atcute/client'; 2 + import type { AppBskyLabelerDefs, At } from '@atcute/client/lexicons'; 4 3 import { createQuery } from '@mary/solid-query'; 5 4 6 5 import { useAgent } from '~/lib/states/agent'; 7 6 8 7 import { interpretLabelerDefinition } from '../moderation/labeler'; 9 8 10 - export const createLabelerMetaQuery = (did: () => Did) => { 11 - const { client } = useAgent(); 9 + export const createLabelerMetaQuery = (did: () => At.DID) => { 10 + const { rpc } = useAgent(); 12 11 13 12 const query = createQuery(() => { 14 13 const $did = did(); ··· 16 15 return { 17 16 queryKey: ['labeler-definition', $did], 18 17 async queryFn(ctx) { 19 - const data = await ok( 20 - client.get('app.bsky.labeler.getServices', { 21 - signal: ctx.signal, 22 - params: { 23 - dids: [$did], 24 - detailed: true, 25 - }, 26 - }), 27 - ); 18 + const { data } = await rpc.get('app.bsky.labeler.getServices', { 19 + signal: ctx.signal, 20 + params: { 21 + dids: [$did], 22 + detailed: true, 23 + }, 24 + }); 28 25 29 26 const service = data.views[0] as AppBskyLabelerDefs.LabelerViewDetailed; 30 27 31 28 if (!service) { 32 - throw new ClientResponseError({ 33 - status: 400, 34 - data: { error: `NotFound`, message: `Labeler not found: ${$did}` }, 29 + throw new XRPCError(400, { 30 + kind: 'NotFound', 31 + description: `Labeler not found: ${$did}`, 35 32 }); 36 33 } 37 34
+10 -14
src/api/queries/list-members.ts
··· 1 - import { ok } from '@atcute/client'; 2 - import type { ResourceUri } from '@atcute/lexicons'; 3 1 import { type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 4 2 5 3 import { useAgent } from '~/lib/states/agent'; 6 4 7 - export const createListMembersQuery = (listUri: () => ResourceUri) => { 8 - const { client } = useAgent(); 5 + export const createListMembersQuery = (listUri: () => string) => { 6 + const { rpc } = useAgent(); 9 7 10 8 return createInfiniteQuery(() => { 11 9 const $listUri = listUri(); ··· 13 11 return { 14 12 queryKey: ['list-members', $listUri], 15 13 async queryFn(ctx: QC<never, string | undefined>) { 16 - const data = await ok( 17 - client.get('app.bsky.graph.getList', { 18 - signal: ctx.signal, 19 - params: { 20 - list: $listUri, 21 - limit: 50, 22 - cursor: ctx.pageParam, 23 - }, 24 - }), 25 - ); 14 + const { data } = await rpc.get('app.bsky.graph.getList', { 15 + signal: ctx.signal, 16 + params: { 17 + list: $listUri, 18 + limit: 50, 19 + cursor: ctx.pageParam, 20 + }, 21 + }); 26 22 27 23 return { 28 24 cursor: data.cursor,
+14 -18
src/api/queries/list.ts
··· 1 1 import { modifyMutable, reconcile } from 'solid-js/store'; 2 2 3 - import type { AppBskyGraphDefs } from '@atcute/bluesky'; 4 - import { ok } from '@atcute/client'; 5 - import { type Did } from '@atcute/lexicons'; 6 - import { isDid } from '@atcute/lexicons/syntax'; 3 + import type { AppBskyGraphDefs, At } from '@atcute/client/lexicons'; 7 4 import { createQuery } from '@mary/solid-query'; 8 5 9 6 import type { SavedListFeed } from '~/lib/preferences/account'; ··· 11 8 import { useSession } from '~/lib/states/session'; 12 9 import { omit } from '~/lib/utils/misc'; 13 10 14 - import { assertCanonicalResourceUri, makeAtUri } from '../types/at-uri'; 11 + import { makeAtUri, parseAtUri } from '../types/at-uri'; 12 + import { isDid } from '../types/identity'; 15 13 16 14 import { resolveHandle } from './handle'; 17 15 18 16 export const createListMetaQuery = (listUri: () => string) => { 19 - const { client } = useAgent(); 17 + const { rpc } = useAgent(); 20 18 const { currentAccount } = useSession(); 21 19 22 20 return createQuery((queryClient) => { ··· 25 23 return { 26 24 queryKey: ['list-meta', $listUri], 27 25 async queryFn(ctx) { 28 - const uri = assertCanonicalResourceUri($listUri); 26 + const uri = parseAtUri($listUri); 29 27 30 - let did: Did; 28 + let did: At.DID; 31 29 if (isDid(uri.repo)) { 32 30 did = uri.repo; 33 31 } else { 34 - did = await resolveHandle(client, uri.repo, ctx.signal); 32 + did = await resolveHandle(rpc, uri.repo, ctx.signal); 35 33 } 36 34 37 - const data = await ok( 38 - client.get('app.bsky.graph.getList', { 39 - signal: ctx.signal, 40 - params: { 41 - list: makeAtUri(did, uri.collection, uri.rkey), 42 - limit: 1, 43 - }, 44 - }), 45 - ); 35 + const { data } = await rpc.get('app.bsky.graph.getList', { 36 + signal: ctx.signal, 37 + params: { 38 + list: makeAtUri(did, uri.collection, uri.rkey), 39 + limit: 1, 40 + }, 41 + }); 46 42 47 43 if (currentAccount) { 48 44 const found = currentAccount.preferences.feeds.find((item): item is SavedListFeed => {
+24 -31
src/api/queries/my-lists.ts
··· 1 - import type { AppBskyGraphDefs } from '@atcute/bluesky'; 2 - import { ok } from '@atcute/client'; 1 + import type { AppBskyGraphDefs } from '@atcute/client/lexicons'; 3 2 import { createQuery } from '@mary/solid-query'; 4 3 5 4 import { useAgent } from '~/lib/states/agent'; ··· 8 7 export type MyListsFilter = 'all' | 'curation' | 'moderation' | 'all-including-subscribed'; 9 8 10 9 export const createMyListsQuery = (filter: MyListsFilter) => { 11 - const { client } = useAgent(); 10 + const { rpc } = useAgent(); 12 11 const { currentAccount } = useSession(); 13 12 14 13 return createQuery(() => ({ ··· 16 15 async queryFn({ signal }) { 17 16 const promises = [ 18 17 accumulate(async (cursor) => { 19 - const data = await ok( 20 - client.get('app.bsky.graph.getLists', { 21 - signal, 22 - params: { 23 - actor: currentAccount!.did, 24 - cursor, 25 - limit: 100, 26 - }, 27 - }), 28 - ); 18 + const { data } = await rpc.get('app.bsky.graph.getLists', { 19 + signal, 20 + params: { 21 + actor: currentAccount!.did, 22 + cursor, 23 + limit: 100, 24 + }, 25 + }); 29 26 30 27 return { 31 28 cursor: data.cursor, ··· 37 34 if (filter === 'all-including-subscribed' || filter === 'moderation') { 38 35 promises.push( 39 36 accumulate(async (cursor) => { 40 - const data = await ok( 41 - client.get('app.bsky.graph.getListMutes', { 42 - signal, 43 - params: { 44 - cursor, 45 - limit: 100, 46 - }, 47 - }), 48 - ); 37 + const { data } = await rpc.get('app.bsky.graph.getListMutes', { 38 + signal, 39 + params: { 40 + cursor, 41 + limit: 100, 42 + }, 43 + }); 49 44 50 45 return { 51 46 cursor: data.cursor, ··· 56 51 57 52 promises.push( 58 53 accumulate(async (cursor) => { 59 - const data = await ok( 60 - client.get('app.bsky.graph.getListBlocks', { 61 - signal, 62 - params: { 63 - cursor, 64 - limit: 100, 65 - }, 66 - }), 67 - ); 54 + const { data } = await rpc.get('app.bsky.graph.getListBlocks', { 55 + signal, 56 + params: { 57 + cursor, 58 + limit: 100, 59 + }, 60 + }); 68 61 69 62 return { 70 63 cursor: data.cursor,
+4 -7
src/api/queries/notification-count.tsx
··· 1 - import { ok } from '@atcute/client'; 2 1 import { createQuery } from '@mary/solid-query'; 3 2 4 3 import { useAgent } from '~/lib/states/agent'; ··· 6 5 7 6 export const createNotificationCountQuery = (options?: { readonly disabled?: boolean }) => { 8 7 const { currentAccount } = useSession(); 9 - const { client } = useAgent(); 8 + const { rpc } = useAgent(); 10 9 11 10 const query = createQuery(() => ({ 12 11 queryKey: ['notification', 'count'], 13 12 enabled: currentAccount !== undefined && !options?.disabled, 14 13 async queryFn() { 15 - const data = await ok( 16 - client.get('app.bsky.notification.getUnreadCount', { 17 - params: {}, 18 - }), 19 - ); 14 + const { data } = await rpc.get('app.bsky.notification.getUnreadCount', { 15 + params: {}, 16 + }); 20 17 21 18 return data; 22 19 },
+22 -33
src/api/queries/notification-feed.tsx
··· 1 1 import { createSignal } from 'solid-js'; 2 2 3 - import type { AppBskyFeedDefs, AppBskyNotificationListNotifications } from '@atcute/bluesky'; 4 - import { ok } from '@atcute/client'; 3 + import type { AppBskyFeedDefs, AppBskyNotificationListNotifications } from '@atcute/client/lexicons'; 5 4 import { chunked, mapDefined } from '@mary/array-fns'; 6 5 import { type QueryFunctionContext as QC, createInfiniteQuery, useQueryClient } from '@mary/solid-query'; 7 6 8 7 import { useAgent } from '~/lib/states/agent'; 9 8 10 - import { assertCanonicalResourceUri } from '../types/at-uri'; 9 + import { parseAtUri } from '../types/at-uri'; 11 10 import { dequal } from '../utils/dequal'; 12 11 import { resetInfiniteData } from '../utils/query'; 13 12 ··· 85 84 export type NotificationsFilter = 'all' | 'mentions'; 86 85 87 86 export const createNotificationFeedQuery = (filter: () => NotificationsFilter) => { 88 - const { client } = useAgent(); 87 + const { rpc } = useAgent(); 89 88 const queryClient = useQueryClient(); 90 89 91 90 const [firstFetchedAt, setFirstFetchedAt] = createSignal(0); ··· 105 104 reasons = ['mention', 'reply', 'quote']; 106 105 } 107 106 108 - const data = await ok( 109 - client.get('app.bsky.notification.listNotifications', { 110 - signal: signal, 111 - params: { 112 - limit: 40, 113 - reasons: reasons, 114 - cursor: pageParam?.cursor, 115 - }, 116 - }), 117 - ); 107 + const { data } = await rpc.get('app.bsky.notification.listNotifications', { 108 + signal: signal, 109 + params: { 110 + limit: 40, 111 + reasons: reasons, 112 + cursor: pageParam?.cursor, 113 + }, 114 + }); 118 115 119 116 const notifs = data.notifications; 120 117 const firstSeenAt = pageParam?.seenAt; ··· 132 129 const subjectUri = item.reasonSubject; 133 130 134 131 // skip if they're not related to posts. 135 - if ( 136 - !subjectUri || 137 - assertCanonicalResourceUri(subjectUri).collection !== 'app.bsky.feed.post' 138 - ) { 132 + if (!subjectUri || parseAtUri(subjectUri).collection !== 'app.bsky.feed.post') { 139 133 return; 140 134 } 141 135 ··· 148 142 149 143 const chunkedPosts = await Promise.all( 150 144 chunked(Array.from(postUris), 25).map(async (uris) => { 151 - const data = await ok( 152 - client.get('app.bsky.feed.getPosts', { 153 - params: { 154 - uris: uris, 155 - }, 156 - }), 157 - ); 145 + const { data } = await rpc.get('app.bsky.feed.getPosts', { 146 + params: { 147 + uris: uris, 148 + }, 149 + }); 158 150 159 151 return data.posts; 160 152 }), ··· 246 238 const indexedAt = new Date(notifs[0]?.indexedAt ?? 0).getTime(); 247 239 const seenAt = Math.max(now, indexedAt); 248 240 249 - const promise = ok( 250 - client.post('app.bsky.notification.updateSeen', { 251 - as: null, 252 - input: { 253 - seenAt: new Date(seenAt).toISOString(), 254 - }, 255 - }), 256 - ); 241 + const promise = rpc.call('app.bsky.notification.updateSeen', { 242 + data: { 243 + seenAt: new Date(seenAt).toISOString(), 244 + }, 245 + }); 257 246 258 247 queryClient.cancelQueries({ 259 248 exact: true,
+12 -16
src/api/queries/post-quotes.ts
··· 1 - import type { AppBskyFeedGetQuotes } from '@atcute/bluesky'; 2 - import { ok } from '@atcute/client'; 3 - import type { ResourceUri } from '@atcute/lexicons'; 1 + import type { AppBskyFeedGetQuotes } from '@atcute/client/lexicons'; 4 2 import { type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 5 3 6 4 import { useAgent } from '~/lib/states/agent'; 7 5 8 - export const createPostQuotesQuery = (uri: () => ResourceUri) => { 9 - const { client } = useAgent(); 6 + export const createPostQuotesQuery = (uri: () => string) => { 7 + const { rpc } = useAgent(); 10 8 11 9 return createInfiniteQuery(() => { 12 10 const $uri = uri(); ··· 14 12 return { 15 13 queryKey: ['post-quotes', $uri], 16 14 structuralSharing: false, 17 - async queryFn(ctx: QC<never, string | undefined>): Promise<AppBskyFeedGetQuotes.$output> { 18 - const data = await ok( 19 - client.get('app.bsky.feed.getQuotes', { 20 - signal: ctx.signal, 21 - params: { 22 - uri: $uri, 23 - limit: 50, 24 - cursor: ctx.pageParam, 25 - }, 26 - }), 27 - ); 15 + async queryFn(ctx: QC<never, string | undefined>): Promise<AppBskyFeedGetQuotes.Output> { 16 + const { data } = await rpc.get('app.bsky.feed.getQuotes', { 17 + signal: ctx.signal, 18 + params: { 19 + uri: $uri, 20 + limit: 50, 21 + cursor: ctx.pageParam, 22 + }, 23 + }); 28 24 29 25 return data; 30 26 },
+17 -23
src/api/queries/post-thread.ts
··· 1 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 2 - import { ClientResponseError, ok } from '@atcute/client'; 3 - import type { $type, ResourceUri } from '@atcute/lexicons'; 1 + import { XRPCError } from '@atcute/client'; 2 + import type { AppBskyFeedDefs, Brand } from '@atcute/client/lexicons'; 4 3 import { createQuery } from '@mary/solid-query'; 5 4 6 5 import { useAgent } from '~/lib/states/agent'; ··· 10 9 const MAX_HEIGHT = 10; 11 10 const MAX_DEPTH = 4; 12 11 13 - type ThreadReturn = $type.enforce<AppBskyFeedDefs.ThreadViewPost | AppBskyFeedDefs.BlockedPost>; 12 + type ThreadReturn = Brand.Union<AppBskyFeedDefs.ThreadViewPost | AppBskyFeedDefs.BlockedPost>; 14 13 15 - export const usePostThreadQuery = (uri: () => ResourceUri) => { 16 - const { client } = useAgent(); 14 + export const usePostThreadQuery = (uri: () => string) => { 15 + const { rpc } = useAgent(); 17 16 18 17 return createQuery((queryClient) => { 19 18 const $uri = uri(); ··· 22 21 queryKey: ['post-thread', $uri], 23 22 structuralSharing: false, 24 23 async queryFn(ctx): Promise<ThreadReturn> { 25 - const data = await ok( 26 - client.get('app.bsky.feed.getPostThread', { 27 - signal: ctx.signal, 28 - params: { 29 - uri: $uri, 30 - depth: MAX_DEPTH, 31 - parentHeight: MAX_HEIGHT, 32 - }, 33 - }), 34 - ); 24 + const { data } = await rpc.get('app.bsky.feed.getPostThread', { 25 + signal: ctx.signal, 26 + params: { 27 + uri: $uri, 28 + depth: MAX_DEPTH, 29 + parentHeight: MAX_HEIGHT, 30 + }, 31 + }); 35 32 36 33 const thread = data.thread; 37 34 38 35 if (thread.$type === 'app.bsky.feed.defs#notFoundPost') { 39 - throw new ClientResponseError({ 40 - status: 400, 41 - data: { 42 - error: `NotFound`, 43 - message: `Post not found: ${$uri}`, 44 - }, 36 + throw new XRPCError(400, { 37 + kind: 'NotFound', 38 + description: `Post not found: ${$uri}`, 45 39 }); 46 40 } 47 41 ··· 57 51 // Break if either: 58 52 // - This isn't a quote embed transformed into a post view 59 53 // - We've went through 10 post views 60 - if (!('$transform' in post) || ++step >= 10) { 54 + if (!('$transform' in found) || ++step >= 10) { 61 55 break; 62 56 } 63 57 }
+13 -16
src/api/queries/post.ts
··· 1 - import { ok } from '@atcute/client'; 2 - import { type Did } from '@atcute/lexicons'; 3 - import { isDid } from '@atcute/lexicons/syntax'; 1 + import type { At } from '@atcute/client/lexicons'; 4 2 import { createQuery } from '@mary/solid-query'; 5 3 6 4 import { useAgent } from '~/lib/states/agent'; 7 5 8 6 import { findPostsInCache } from '../cache/post-shadow'; 9 - import { assertCanonicalResourceUri, makeAtUri } from '../types/at-uri'; 7 + import { makeAtUri, parseAtUri } from '../types/at-uri'; 8 + import { isDid } from '../types/identity'; 10 9 11 10 import { resolveHandle } from './handle'; 12 11 13 12 export const createPostQuery = (postUri: () => string) => { 14 - const { client } = useAgent(); 13 + const { rpc } = useAgent(); 15 14 16 15 return createQuery((queryClient) => { 17 16 const $postUri = postUri(); ··· 19 18 return { 20 19 queryKey: ['post', $postUri], 21 20 async queryFn(ctx) { 22 - const uri = assertCanonicalResourceUri($postUri); 21 + const uri = parseAtUri($postUri); 23 22 24 - let did: Did; 23 + let did: At.DID; 25 24 if (isDid(uri.repo)) { 26 25 did = uri.repo; 27 26 } else { 28 - did = await resolveHandle(client, uri.repo, ctx.signal); 27 + did = await resolveHandle(rpc, uri.repo, ctx.signal); 29 28 } 30 29 31 - const data = await ok( 32 - client.get('app.bsky.feed.getPosts', { 33 - signal: ctx.signal, 34 - params: { 35 - uris: [makeAtUri(did, uri.collection, uri.rkey)], 36 - }, 37 - }), 38 - ); 30 + const { data } = await rpc.get('app.bsky.feed.getPosts', { 31 + signal: ctx.signal, 32 + params: { 33 + uris: [makeAtUri(did, uri.collection, uri.rkey)], 34 + }, 35 + }); 39 36 40 37 const post = data.posts[0]; 41 38
+8 -11
src/api/queries/profile-autocomplete.ts
··· 1 - import { ok } from '@atcute/client'; 2 1 import { createQuery, keepPreviousData } from '@mary/solid-query'; 3 2 4 3 import { useAgent } from '~/lib/states/agent'; ··· 11 10 query: () => string, 12 11 opts?: ProfileAutocompleteQueryOptions, 13 12 ) => { 14 - const { client } = useAgent(); 13 + const { rpc } = useAgent(); 15 14 16 15 return createQuery(() => { 17 16 const $query = query(); ··· 27 26 enabled: isEnabled, 28 27 placeholderData: isEnabled ? keepPreviousData : undefined, 29 28 async queryFn({ signal }) { 30 - const data = await ok( 31 - client.get('app.bsky.actor.searchActorsTypeahead', { 32 - signal, 33 - params: { 34 - q: trimmed, 35 - limit: 10, 36 - }, 37 - }), 38 - ); 29 + const { data } = await rpc.get('app.bsky.actor.searchActorsTypeahead', { 30 + signal, 31 + params: { 32 + q: trimmed, 33 + limit: 10, 34 + }, 35 + }); 39 36 40 37 return data; 41 38 },
+10 -14
src/api/queries/profile-feeds.ts
··· 1 - import { ok } from '@atcute/client'; 2 - import type { ActorIdentifier } from '@atcute/lexicons'; 3 1 import { type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 4 2 5 3 import { useAgent } from '~/lib/states/agent'; 6 4 7 - export const createProfileFeedsQuery = (didOrHandle: () => ActorIdentifier) => { 8 - const { client } = useAgent(); 5 + export const createProfileFeedsQuery = (didOrHandle: () => string) => { 6 + const { rpc } = useAgent(); 9 7 10 8 return createInfiniteQuery(() => { 11 9 const $didOrHandle = didOrHandle(); ··· 13 11 return { 14 12 queryKey: ['profile-feeds', $didOrHandle], 15 13 async queryFn(ctx: QC<never, string | undefined>) { 16 - const data = await ok( 17 - client.get('app.bsky.feed.getActorFeeds', { 18 - signal: ctx.signal, 19 - params: { 20 - actor: $didOrHandle, 21 - limit: 100, 22 - cursor: ctx.pageParam, 23 - }, 24 - }), 25 - ); 14 + const { data } = await rpc.get('app.bsky.feed.getActorFeeds', { 15 + signal: ctx.signal, 16 + params: { 17 + actor: $didOrHandle, 18 + limit: 100, 19 + cursor: ctx.pageParam, 20 + }, 21 + }); 26 22 27 23 data.feeds.sort((a, b) => (b.likeCount ?? 0) - (a.likeCount ?? 0)); 28 24 return data;
+11 -15
src/api/queries/profile-followers.ts
··· 1 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 2 - import { ok } from '@atcute/client'; 3 - import type { ActorIdentifier } from '@atcute/lexicons'; 1 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 2 import { type InfiniteData, type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 5 3 6 4 import { useAgent } from '~/lib/states/agent'; 7 5 8 6 import { type ProfilesListWithSubjectPage, toProfilesListWithSubjectPage } from '../types/profile-response'; 9 7 10 - export const createProfileFollowersQuery = (didOrHandle: () => ActorIdentifier) => { 11 - const { client } = useAgent(); 8 + export const createProfileFollowersQuery = (didOrHandle: () => string) => { 9 + const { rpc } = useAgent(); 12 10 13 11 return createInfiniteQuery((queryClient) => { 14 12 const $didOrHandle = didOrHandle(); ··· 16 14 return { 17 15 queryKey: ['profile-followers', $didOrHandle], 18 16 async queryFn(ctx: QC<never, string | undefined>): Promise<ProfilesListWithSubjectPage> { 19 - const data = await ok( 20 - client.get('app.bsky.graph.getFollowers', { 21 - signal: ctx.signal, 22 - params: { 23 - actor: $didOrHandle, 24 - limit: 50, 25 - cursor: ctx.pageParam, 26 - }, 27 - }), 28 - ); 17 + const { data } = await rpc.get('app.bsky.graph.getFollowers', { 18 + signal: ctx.signal, 19 + params: { 20 + actor: $didOrHandle, 21 + limit: 50, 22 + cursor: ctx.pageParam, 23 + }, 24 + }); 29 25 30 26 return toProfilesListWithSubjectPage(data, 'followers'); 31 27 },
+11 -15
src/api/queries/profile-following.ts
··· 1 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 2 - import { ok } from '@atcute/client'; 3 - import type { ActorIdentifier } from '@atcute/lexicons'; 1 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 2 import { type InfiniteData, type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 5 3 6 4 import { useAgent } from '~/lib/states/agent'; 7 5 8 6 import { type ProfilesListWithSubjectPage, toProfilesListWithSubjectPage } from '../types/profile-response'; 9 7 10 - export const createProfileFollowingQuery = (didOrHandle: () => ActorIdentifier) => { 11 - const { client } = useAgent(); 8 + export const createProfileFollowingQuery = (didOrHandle: () => string) => { 9 + const { rpc } = useAgent(); 12 10 13 11 return createInfiniteQuery((queryClient) => { 14 12 const $didOrHandle = didOrHandle(); ··· 16 14 return { 17 15 queryKey: ['profile-following', $didOrHandle], 18 16 async queryFn(ctx: QC<never, string | undefined>): Promise<ProfilesListWithSubjectPage> { 19 - const data = await ok( 20 - client.get('app.bsky.graph.getFollows', { 21 - signal: ctx.signal, 22 - params: { 23 - actor: $didOrHandle, 24 - limit: 50, 25 - cursor: ctx.pageParam, 26 - }, 27 - }), 28 - ); 17 + const { data } = await rpc.get('app.bsky.graph.getFollows', { 18 + signal: ctx.signal, 19 + params: { 20 + actor: $didOrHandle, 21 + limit: 50, 22 + cursor: ctx.pageParam, 23 + }, 24 + }); 29 25 30 26 return toProfilesListWithSubjectPage(data, 'follows'); 31 27 },
+11 -15
src/api/queries/profile-known-followers.ts
··· 1 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 2 - import { ok } from '@atcute/client'; 3 - import type { ActorIdentifier } from '@atcute/lexicons'; 1 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 2 import { type InfiniteData, type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 5 3 6 4 import { useAgent } from '~/lib/states/agent'; 7 5 8 6 import { type ProfilesListWithSubjectPage, toProfilesListWithSubjectPage } from '../types/profile-response'; 9 7 10 - export const createProfileKnownFollowersQuery = (didOrHandle: () => ActorIdentifier) => { 11 - const { client } = useAgent(); 8 + export const createProfileKnownFollowersQuery = (didOrHandle: () => string) => { 9 + const { rpc } = useAgent(); 12 10 13 11 return createInfiniteQuery((queryClient) => { 14 12 const $didOrHandle = didOrHandle(); ··· 16 14 return { 17 15 queryKey: ['profile-known-followers', $didOrHandle], 18 16 async queryFn(ctx: QC<never, string | undefined>): Promise<ProfilesListWithSubjectPage> { 19 - const data = await ok( 20 - client.get('app.bsky.graph.getKnownFollowers', { 21 - signal: ctx.signal, 22 - params: { 23 - actor: $didOrHandle, 24 - limit: 50, 25 - cursor: ctx.pageParam, 26 - }, 27 - }), 28 - ); 17 + const { data } = await rpc.get('app.bsky.graph.getKnownFollowers', { 18 + signal: ctx.signal, 19 + params: { 20 + actor: $didOrHandle, 21 + limit: 50, 22 + cursor: ctx.pageParam, 23 + }, 24 + }); 29 25 30 26 return toProfilesListWithSubjectPage(data, 'followers'); 31 27 },
+10 -14
src/api/queries/profile-lists.ts
··· 1 - import { ok } from '@atcute/client'; 2 - import type { ActorIdentifier } from '@atcute/lexicons'; 3 1 import { type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 4 2 5 3 import { useAgent } from '~/lib/states/agent'; 6 4 7 - export const createProfileListsQuery = (didOrHandle: () => ActorIdentifier) => { 8 - const { client } = useAgent(); 5 + export const createProfileListsQuery = (didOrHandle: () => string) => { 6 + const { rpc } = useAgent(); 9 7 10 8 const collator = new Intl.Collator('en-US'); 11 9 ··· 15 13 return { 16 14 queryKey: ['profile-lists', $didOrHandle], 17 15 async queryFn(ctx: QC<never, string | undefined>) { 18 - const data = await ok( 19 - client.get('app.bsky.graph.getLists', { 20 - signal: ctx.signal, 21 - params: { 22 - actor: $didOrHandle, 23 - limit: 100, 24 - cursor: ctx.pageParam, 25 - }, 26 - }), 27 - ); 16 + const { data } = await rpc.get('app.bsky.graph.getLists', { 17 + signal: ctx.signal, 18 + params: { 19 + actor: $didOrHandle, 20 + limit: 100, 21 + cursor: ctx.pageParam, 22 + }, 23 + }); 28 24 29 25 data.lists.sort((a, b) => collator.compare(a.name, b.name)); 30 26 return data;
+19 -50
src/api/queries/profile.ts
··· 1 1 import { modifyMutable, reconcile } from 'solid-js/store'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 4 - import { ok } from '@atcute/client'; 5 - import type { ActorIdentifier, Did } from '@atcute/lexicons'; 6 - import { isDid } from '@atcute/lexicons/syntax'; 7 - import { createBatchedFetch } from '@mary/batch-fetch'; 3 + import type { AppBskyActorDefs, At } from '@atcute/client/lexicons'; 8 4 import { createQuery } from '@mary/solid-query'; 9 5 10 6 import { useAgent } from '~/lib/states/agent'; 11 7 import { useSession } from '~/lib/states/session'; 12 - import { define, inject } from '~/lib/states/singleton'; 13 8 9 + import { findProfilesInCache } from '../cache/profile-shadow'; 14 10 import { dequal } from '../utils/dequal'; 15 11 16 12 export interface ProfileQueryOptions { 17 - batched?: boolean; 18 13 staleTime?: number; 19 14 gcTime?: number; 20 15 } 21 16 22 - const BatchedProfileService = define('batched-profile', () => { 23 - const { client } = useAgent(); 24 - 25 - const fetch = createBatchedFetch<Did, AppBskyActorDefs.ProfileViewDetailed>({ 26 - limit: 25, 27 - idFromResource: (profile) => profile.did, 28 - async fetch(queries, signal) { 29 - const data = await ok( 30 - client.get('app.bsky.actor.getProfiles', { 31 - signal, 32 - params: { 33 - actors: queries, 34 - }, 35 - }), 36 - ); 37 - 38 - return data.profiles; 39 - }, 40 - }); 41 - 42 - return { fetch }; 43 - }); 44 - 45 - export const createProfileQuery = (didOrHandle: () => ActorIdentifier, opts: ProfileQueryOptions = {}) => { 46 - const { client } = useAgent(); 17 + export const createProfileQuery = (didOrHandle: () => string, opts: ProfileQueryOptions = {}) => { 18 + const { rpc } = useAgent(); 47 19 const { currentAccount } = useSession(); 48 - 49 - const batched = inject(BatchedProfileService); 50 20 51 21 return createQuery((queryClient) => { 52 22 const $didOrHandle = didOrHandle(); ··· 55 25 queryKey: ['profile', $didOrHandle], 56 26 staleTime: opts.staleTime, 57 27 gcTime: opts.gcTime, 58 - async queryFn({ signal }): Promise<AppBskyActorDefs.ProfileViewDetailed> { 59 - let data: AppBskyActorDefs.ProfileViewDetailed; 60 - 61 - if (opts.batched && isDid($didOrHandle)) { 62 - data = await batched.fetch($didOrHandle, signal); 63 - } else { 64 - data = await ok( 65 - client.get('app.bsky.actor.getProfile', { 66 - signal, 67 - params: { 68 - actor: $didOrHandle!, 69 - }, 70 - }), 71 - ); 72 - } 28 + async queryFn(ctx): Promise<AppBskyActorDefs.ProfileViewDetailed> { 29 + const { data } = await rpc.get('app.bsky.actor.getProfile', { 30 + signal: ctx.signal, 31 + params: { 32 + actor: $didOrHandle!, 33 + }, 34 + }); 73 35 74 36 if (currentAccount !== undefined && currentAccount.did === data.did) { 75 37 // Unset `knownFollowers` as we don't need that on our own profile. ··· 89 51 return data; 90 52 }, 91 53 placeholderData(): AppBskyActorDefs.ProfileViewDetailed | undefined { 92 - return queryClient.getQueryData(['profile-precache', $didOrHandle]); 54 + const precache = queryClient.getQueryData(['profile-precache', $didOrHandle]); 55 + if (precache) { 56 + return precache as any; 57 + } 58 + 59 + for (const profile of findProfilesInCache(queryClient, $didOrHandle as At.DID)) { 60 + return profile as any; 61 + } 93 62 }, 94 63 initialData(): AppBskyActorDefs.ProfileViewDetailed | undefined { 95 64 if (currentAccount !== undefined && currentAccount.did === $didOrHandle) {
+11 -14
src/api/queries/search-feeds.ts
··· 1 - import type { AppBskyUnspeccedGetPopularFeedGenerators } from '@atcute/bluesky'; 2 - import { ok } from '@atcute/client'; 1 + import type { AppBskyUnspeccedGetPopularFeedGenerators } from '@atcute/client/lexicons'; 3 2 import { type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 4 3 5 4 import { useAgent } from '~/lib/states/agent'; 6 5 7 6 export const createSearchFeedsQuery = (query: () => string) => { 8 - const { client } = useAgent(); 7 + const { rpc } = useAgent(); 9 8 10 9 return createInfiniteQuery(() => { 11 10 const q = query(); ··· 14 13 queryKey: ['search-feeds', q], 15 14 async queryFn( 16 15 ctx: QC<never, string | undefined>, 17 - ): Promise<AppBskyUnspeccedGetPopularFeedGenerators.$output> { 18 - const data = await ok( 19 - client.get('app.bsky.unspecced.getPopularFeedGenerators', { 20 - signal: ctx.signal, 21 - params: { 22 - query: q, 23 - limit: 50, 24 - cursor: ctx.pageParam, 25 - }, 26 - }), 27 - ); 16 + ): Promise<AppBskyUnspeccedGetPopularFeedGenerators.Output> { 17 + const { data } = await rpc.get('app.bsky.unspecced.getPopularFeedGenerators', { 18 + signal: ctx.signal, 19 + params: { 20 + query: q, 21 + limit: 50, 22 + cursor: ctx.pageParam, 23 + }, 24 + }); 28 25 29 26 return data; 30 27 },
+9 -12
src/api/queries/search-profiles.ts
··· 1 - import { ok } from '@atcute/client'; 2 1 import { type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 3 2 4 3 import { useAgent } from '~/lib/states/agent'; ··· 6 5 import { type ProfilesListPage, toProfilesListPage } from '../types/profile-response'; 7 6 8 7 export const createSearchProfilesQuery = (query: () => string) => { 9 - const { client } = useAgent(); 8 + const { rpc } = useAgent(); 10 9 11 10 return createInfiniteQuery(() => { 12 11 const q = query(); ··· 14 13 return { 15 14 queryKey: ['search-profiles', q], 16 15 async queryFn(ctx: QC<never, string | undefined>): Promise<ProfilesListPage> { 17 - const data = await ok( 18 - client.get('app.bsky.actor.searchActors', { 19 - signal: ctx.signal, 20 - params: { 21 - q: q, 22 - limit: 50, 23 - cursor: ctx.pageParam, 24 - }, 25 - }), 26 - ); 16 + const { data } = await rpc.get('app.bsky.actor.searchActors', { 17 + signal: ctx.signal, 18 + params: { 19 + q: q, 20 + limit: 50, 21 + cursor: ctx.pageParam, 22 + }, 23 + }); 27 24 28 25 return toProfilesListPage(data, 'actors'); 29 26 },
+10 -14
src/api/queries/subject-likers.ts
··· 1 - import { ok } from '@atcute/client'; 2 - import type { ResourceUri } from '@atcute/lexicons'; 3 1 import type { QueryFunctionContext as QC } from '@mary/solid-query'; 4 2 import { createInfiniteQuery } from '@mary/solid-query'; 5 3 ··· 7 5 8 6 import type { ProfilesListPage } from '../types/profile-response'; 9 7 10 - export const createSubjectLikersQuery = (uri: () => ResourceUri) => { 11 - const { client } = useAgent(); 8 + export const createSubjectLikersQuery = (uri: () => string) => { 9 + const { rpc } = useAgent(); 12 10 13 11 return createInfiniteQuery(() => { 14 12 const $uri = uri(); ··· 17 15 queryKey: ['subject-likers', $uri], 18 16 structuralSharing: false, 19 17 async queryFn(ctx: QC<never, string | undefined>): Promise<ProfilesListPage> { 20 - const data = await ok( 21 - client.get('app.bsky.feed.getLikes', { 22 - signal: ctx.signal, 23 - params: { 24 - uri: $uri, 25 - limit: 50, 26 - cursor: ctx.pageParam, 27 - }, 28 - }), 29 - ); 18 + const { data } = await rpc.get('app.bsky.feed.getLikes', { 19 + signal: ctx.signal, 20 + params: { 21 + uri: $uri, 22 + limit: 50, 23 + cursor: ctx.pageParam, 24 + }, 25 + }); 30 26 31 27 return { 32 28 cursor: data.cursor,
+10 -14
src/api/queries/subject-reposters.ts
··· 1 - import { ok } from '@atcute/client'; 2 - import type { ResourceUri } from '@atcute/lexicons'; 3 1 import type { QueryFunctionContext as QC } from '@mary/solid-query'; 4 2 import { createInfiniteQuery } from '@mary/solid-query'; 5 3 ··· 7 5 8 6 import { type ProfilesListPage, toProfilesListPage } from '../types/profile-response'; 9 7 10 - export const createSubjectRepostersQuery = (uri: () => ResourceUri) => { 11 - const { client } = useAgent(); 8 + export const createSubjectRepostersQuery = (uri: () => string) => { 9 + const { rpc } = useAgent(); 12 10 13 11 return createInfiniteQuery(() => { 14 12 const $uri = uri(); ··· 17 15 queryKey: ['subject-reposters', $uri], 18 16 structuralSharing: false, 19 17 async queryFn(ctx: QC<never, string | undefined>): Promise<ProfilesListPage> { 20 - const data = await ok( 21 - client.get('app.bsky.feed.getRepostedBy', { 22 - signal: ctx.signal, 23 - params: { 24 - uri: $uri, 25 - limit: 50, 26 - cursor: ctx.pageParam, 27 - }, 28 - }), 29 - ); 18 + const { data } = await rpc.get('app.bsky.feed.getRepostedBy', { 19 + signal: ctx.signal, 20 + params: { 21 + uri: $uri, 22 + limit: 50, 23 + cursor: ctx.pageParam, 24 + }, 25 + }); 30 26 31 27 return toProfilesListPage(data, 'repostedBy'); 32 28 },
+82 -98
src/api/queries/timeline.ts
··· 1 1 import { createEffect, createMemo, createRenderEffect, onCleanup, untrack } from 'solid-js'; 2 2 3 - import { 4 - type AppBskyFeedDefs, 5 - type AppBskyFeedGetTimeline, 6 - type AppBskyFeedPost, 7 - unwrapRawRecordEmbed, 8 - unwrapRecordEmbed, 9 - } from '@atcute/bluesky'; 10 - import { type Client, ok } from '@atcute/client'; 11 - import { type Did, type ResourceUri } from '@atcute/lexicons'; 3 + import type { XRPC } from '@atcute/client'; 4 + import type { AppBskyFeedDefs, AppBskyFeedGetTimeline, AppBskyFeedPost, At } from '@atcute/client/lexicons'; 12 5 import { type FalsyValue, definite } from '@mary/array-fns'; 13 6 import { type InfiniteData, createInfiniteQuery, createQuery, useQueryClient } from '@mary/solid-query'; 14 7 ··· 38 31 getModerationUI, 39 32 } from '../moderation'; 40 33 import { ContextContentList, PreferenceHide, TargetContent } from '../moderation/constants'; 41 - import { assertCanonicalResourceUri } from '../types/at-uri'; 34 + import { parseAtUri } from '../types/at-uri'; 35 + import { unwrapRecordEmbed } from '../utils/bluesky/embed'; 36 + import { unwrapRecordEmbedView } from '../utils/bluesky/embed-view'; 42 37 import { EQUALS_DEQUAL } from '../utils/dequal'; 43 38 import { unwrapPostEmbedText } from '../utils/post'; 44 39 import { resetInfiniteData, wrapQuery } from '../utils/query'; 45 40 46 - type PostRecord = AppBskyFeedPost.Main; 41 + type PostRecord = AppBskyFeedPost.Record; 47 42 48 43 export interface FollowingTimelineParams { 49 44 type: 'following'; ··· 54 49 55 50 export interface FeedTimelineParams { 56 51 type: 'feed'; 57 - uri: ResourceUri; 52 + uri: string; 58 53 showReplies: boolean; 59 54 showReposts: boolean; 60 55 showQuotes: boolean; ··· 62 57 63 58 export interface ListTimelineParams { 64 59 type: 'list'; 65 - uri: ResourceUri; 60 + uri: string; 66 61 showReplies: boolean; 67 62 showQuotes: boolean; 68 63 } 69 64 70 65 export interface ProfileTimelineParams { 71 66 type: 'profile'; 72 - actor: Did; 67 + actor: At.DID; 73 68 tab: 'posts' | 'replies' | 'likes' | 'media'; 74 69 } 75 70 ··· 131 126 export const useTimelineQuery = (_params: () => TimelineParams) => { 132 127 const getParams = createMemo(() => _params(), EQUALS_DEQUAL); 133 128 134 - const { client } = useAgent(); 129 + const { rpc } = useAgent(); 135 130 const { currentAccount } = useSession(); 136 131 const queryClient = useQueryClient(); 137 132 ··· 200 195 postFilter = createLabelPostFilter(moderation); 201 196 } 202 197 203 - const timeline = await fetchPage(client, params, limit, cursor, ctx.signal); 198 + const timeline = await fetchPage(rpc, params, limit, cursor, ctx.signal); 204 199 205 200 const feed = timeline.feed; 206 201 const newCursor = timeline.cursor; ··· 243 238 // const offset = params.type !== 'profile' ? timelineData!.pages[0].pinAmount : 0; 244 239 const offset = timelineData!.pages[0].pinAmount; 245 240 246 - const timeline = await fetchPage(client, params, offset + 1, undefined, ctx.signal); 241 + const timeline = await fetchPage(rpc, params, offset + 1, undefined, ctx.signal); 247 242 const feed = timeline.feed; 248 243 249 244 return { hash: getTimelineHash(feed) }; ··· 313 308 314 309 //// Raw fetch 315 310 const fetchPage = async ( 316 - client: Client, 311 + rpc: XRPC, 317 312 params: TimelineParams, 318 313 limit: number, 319 314 cursor: string | undefined, 320 315 signal: AbortSignal, 321 - ): Promise<AppBskyFeedGetTimeline.$output> => { 316 + ): Promise<AppBskyFeedGetTimeline.Output> => { 322 317 const type = params.type; 323 318 324 319 if (type === 'following') { 325 - const data = await ok( 326 - client.get('app.bsky.feed.getTimeline', { 327 - signal: signal, 328 - params: { 329 - algorithm: 'reverse-chronological', 330 - cursor: cursor, 331 - limit: limit, 332 - }, 333 - }), 334 - ); 320 + const response = await rpc.get('app.bsky.feed.getTimeline', { 321 + signal: signal, 322 + params: { 323 + algorithm: 'reverse-chronological', 324 + cursor: cursor, 325 + limit: limit, 326 + }, 327 + }); 335 328 336 - return data; 329 + return response.data; 337 330 } else if (type === 'feed') { 338 - const data = await ok( 339 - client.get('app.bsky.feed.getFeed', { 340 - signal: signal, 341 - headers: { 342 - 'accent-language': navigator.languages.join(','), 343 - }, 344 - params: { 345 - feed: params.uri, 346 - cursor: cursor, 347 - limit: limit, 348 - }, 349 - }), 350 - ); 331 + const response = await rpc.get('app.bsky.feed.getFeed', { 332 + signal: signal, 333 + headers: { 334 + 'accent-language': navigator.languages.join(','), 335 + }, 336 + params: { 337 + feed: params.uri, 338 + cursor: cursor, 339 + limit: limit, 340 + }, 341 + }); 342 + 343 + const data = response.data; 351 344 352 345 return { 353 346 // Discover feed, wooo. ··· 355 348 feed: data.feed, 356 349 }; 357 350 } else if (type === 'list') { 358 - const data = await ok( 359 - client.get('app.bsky.feed.getListFeed', { 351 + const response = await rpc.get('app.bsky.feed.getListFeed', { 352 + signal: signal, 353 + params: { 354 + list: params.uri, 355 + cursor: cursor, 356 + limit: limit, 357 + }, 358 + }); 359 + 360 + return response.data; 361 + } else if (type === 'profile') { 362 + if (params.tab === 'likes') { 363 + const response = await rpc.get('app.bsky.feed.getActorLikes', { 360 364 signal: signal, 361 365 params: { 362 - list: params.uri, 366 + actor: params.actor, 363 367 cursor: cursor, 364 368 limit: limit, 365 369 }, 366 - }), 367 - ); 370 + }); 368 371 369 - return data; 370 - } else if (type === 'profile') { 371 - if (params.tab === 'likes') { 372 - const data = await ok( 373 - client.get('app.bsky.feed.getActorLikes', { 374 - signal: signal, 375 - params: { 376 - actor: params.actor, 377 - cursor: cursor, 378 - limit: limit, 379 - }, 380 - }), 381 - ); 382 - 383 - return data; 372 + return response.data; 384 373 } else { 385 - const data = await ok( 386 - client.get('app.bsky.feed.getAuthorFeed', { 387 - signal: signal, 388 - params: { 389 - actor: params.actor, 390 - cursor: cursor, 391 - limit: limit, 392 - includePins: params.tab !== 'media', 393 - filter: 394 - params.tab === 'media' 395 - ? 'posts_with_media' 396 - : params.tab === 'replies' 397 - ? 'posts_with_replies' 398 - : 'posts_and_author_threads', 399 - }, 400 - }), 401 - ); 402 - 403 - return data; 404 - } 405 - } else if (type === 'search') { 406 - const data = await ok( 407 - client.get('app.bsky.feed.searchPosts', { 374 + const response = await rpc.get('app.bsky.feed.getAuthorFeed', { 408 375 signal: signal, 409 376 params: { 410 - sort: params.sort, 411 - q: params.query, 377 + actor: params.actor, 412 378 cursor: cursor, 413 379 limit: limit, 380 + includePins: params.tab !== 'media', 381 + filter: 382 + params.tab === 'media' 383 + ? 'posts_with_media' 384 + : params.tab === 'replies' 385 + ? 'posts_with_replies' 386 + : 'posts_and_author_threads', 414 387 }, 415 - }), 416 - ); 388 + }); 389 + 390 + return response.data; 391 + } 392 + } else if (type === 'search') { 393 + const response = await rpc.get('app.bsky.feed.searchPosts', { 394 + signal: signal, 395 + params: { 396 + sort: params.sort, 397 + q: params.query, 398 + cursor: cursor, 399 + limit: limit, 400 + }, 401 + }); 402 + 403 + const data = response.data; 417 404 418 405 return { cursor: data.cursor, feed: data.posts.map((view) => ({ post: view })) }; 419 406 } else { ··· 537 524 const createHideQuotesFilter = (): PostFilter => { 538 525 return (item) => { 539 526 const post = item.post.record as PostRecord; 540 - const record = unwrapRawRecordEmbed(post.embed); 527 + const record = unwrapRecordEmbed(post.embed); 541 528 542 - return ( 543 - record === undefined || 544 - assertCanonicalResourceUri(record.record.uri).collection === 'app.bsky.feed.post' 545 - ); 529 + return record === undefined || parseAtUri(record.record.uri).collection === 'app.bsky.feed.post'; 546 530 }; 547 531 }; 548 532 549 533 const createHideQuotesFromMutedFilter = (): PostFilter => { 550 534 return (item) => { 551 535 const post = item.post; 552 - const record = unwrapRecordEmbed(post.embed); 536 + const record = unwrapRecordEmbedView(post.embed); 553 537 554 538 return ( 555 539 record === undefined || ··· 591 575 }; 592 576 }; 593 577 594 - const createHomeSliceFilter = (uid: Did, followsOnly: boolean): SliceFilter | undefined => { 578 + const createHomeSliceFilter = (uid: At.DID, followsOnly: boolean): SliceFilter | undefined => { 595 579 return (slice) => { 596 580 const items = slice.items; 597 581 const first = items[0]; ··· 623 607 }; 624 608 }; 625 609 626 - const createProfileSliceFilter = (did: Did): SliceFilter | undefined => { 610 + const createProfileSliceFilter = (did: At.DID): SliceFilter | undefined => { 627 611 return (slice) => { 628 612 const items = slice.items; 629 613 const first = items[0];
+2 -3
src/api/queries-cache/bookmark-feed.ts
··· 1 - import type { AppBskyActorDefs, AppBskyFeedDefs } from '@atcute/bluesky'; 2 - import type { Did } from '@atcute/lexicons'; 1 + import type { AppBskyActorDefs, AppBskyFeedDefs, At } from '@atcute/client/lexicons'; 3 2 import type { InfiniteData } from '@mary/solid-query'; 4 3 5 4 import type { CacheMatcher } from '../cache/utils'; ··· 36 35 }; 37 36 }; 38 37 39 - export const findAllProfiles = (did: Did): CacheMatcher<AppBskyActorDefs.ProfileViewBasic> => { 38 + export const findAllProfiles = (did: At.DID): CacheMatcher<AppBskyActorDefs.ProfileViewBasic> => { 40 39 return { 41 40 filter: { 42 41 queryKey: ['bookmarks-feed'],
+1 -1
src/api/queries-cache/feed-precache.ts
··· 1 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 1 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 2 2 import type { QueryClient } from '@mary/solid-query'; 3 3 4 4 export const precacheFeed = (queryClient: QueryClient, feed: AppBskyFeedDefs.GeneratorView) => {
+1 -1
src/api/queries-cache/list-precache.ts
··· 1 - import type { AppBskyGraphDefs } from '@atcute/bluesky'; 1 + import type { AppBskyGraphDefs } from '@atcute/client/lexicons'; 2 2 import type { QueryClient } from '@mary/solid-query'; 3 3 4 4 export const precacheList = (
+2 -3
src/api/queries-cache/notification-feed.ts
··· 1 - import type { AppBskyActorDefs, AppBskyFeedDefs } from '@atcute/bluesky'; 2 - import type { Did } from '@atcute/lexicons'; 1 + import type { AppBskyActorDefs, AppBskyFeedDefs, At } from '@atcute/client/lexicons'; 3 2 import type { InfiniteData } from '@mary/solid-query'; 4 3 5 4 import type { CacheMatcher } from '../cache/utils'; ··· 39 38 }; 40 39 41 40 export const findAllProfiles = ( 42 - did: Did, 41 + did: At.DID, 43 42 ): CacheMatcher<AppBskyActorDefs.ProfileViewBasic | AppBskyActorDefs.ProfileView> => { 44 43 return { 45 44 filter: {
+2 -2
src/api/queries-cache/post-quotes.ts
··· 1 - import type { AppBskyFeedDefs, AppBskyFeedGetQuotes } from '@atcute/bluesky'; 1 + import type { AppBskyFeedDefs, AppBskyFeedGetQuotes } from '@atcute/client/lexicons'; 2 2 import type { InfiniteData } from '@mary/solid-query'; 3 3 4 4 import type { CacheMatcher } from '../cache/utils'; ··· 9 9 filter: { 10 10 queryKey: ['post-quotes'], 11 11 }, 12 - *iterate(data: InfiniteData<AppBskyFeedGetQuotes.$output>) { 12 + *iterate(data: InfiniteData<AppBskyFeedGetQuotes.Output>) { 13 13 for (const page of data.pages) { 14 14 for (const post of page.posts) { 15 15 if (post.uri === uri) {
+12 -8
src/api/queries-cache/post-thread.ts
··· 1 - import type { AppBskyActorDefs, AppBskyFeedDefs, AppBskyFeedGetPostThread } from '@atcute/bluesky'; 2 - import type { Did } from '@atcute/lexicons'; 1 + import type { 2 + AppBskyActorDefs, 3 + AppBskyFeedDefs, 4 + AppBskyFeedGetPostThread, 5 + At, 6 + } from '@atcute/client/lexicons'; 3 7 4 8 import type { CacheMatcher } from '../cache/utils'; 5 9 import { embedViewRecordToPostView, getEmbeddedPost } from '../utils/post'; 6 10 7 - type Thread = AppBskyFeedGetPostThread.$output['thread']; 8 - 9 - function* traverseThread(node: Thread): Generator<AppBskyFeedDefs.ThreadViewPost> { 11 + function* traverseThread( 12 + node: AppBskyFeedGetPostThread.Output['thread'], 13 + ): Generator<AppBskyFeedDefs.ThreadViewPost> { 10 14 if (node.$type === 'app.bsky.feed.defs#threadViewPost') { 11 15 const parent = node.parent; 12 16 const replies = node.replies; ··· 31 35 filter: { 32 36 queryKey: ['post-thread'], 33 37 }, 34 - *iterate(data: Thread) { 38 + *iterate(data: AppBskyFeedGetPostThread.Output['thread']) { 35 39 for (const thread of traverseThread(data)) { 36 40 const post = thread.post; 37 41 ··· 50 54 }; 51 55 }; 52 56 53 - export const findAllProfiles = (did: Did): CacheMatcher<AppBskyActorDefs.ProfileViewBasic> => { 57 + export const findAllProfiles = (did: At.DID): CacheMatcher<AppBskyActorDefs.ProfileViewBasic> => { 54 58 return { 55 59 filter: { 56 60 queryKey: ['post-thread'], 57 61 }, 58 - *iterate(data: Thread) { 62 + *iterate(data: AppBskyFeedGetPostThread.Output['thread']) { 59 63 for (const thread of traverseThread(data)) { 60 64 const post = thread.post; 61 65
+3 -4
src/api/queries-cache/profile-autocomplete.ts
··· 1 - import type { AppBskyActorDefs, AppBskyActorSearchActorsTypeahead } from '@atcute/bluesky'; 2 - import type { Did } from '@atcute/lexicons'; 1 + import type { AppBskyActorDefs, AppBskyActorSearchActorsTypeahead, At } from '@atcute/client/lexicons'; 3 2 4 3 import type { CacheMatcher } from '../cache/utils'; 5 4 6 - export const findAllProfiles = (did: Did): CacheMatcher<AppBskyActorDefs.ProfileViewBasic> => { 5 + export const findAllProfiles = (did: At.DID): CacheMatcher<AppBskyActorDefs.ProfileViewBasic> => { 7 6 return { 8 7 filter: { 9 8 queryKey: ['profile-autocomplete'], 10 9 }, 11 - *iterate(data: AppBskyActorSearchActorsTypeahead.$output) { 10 + *iterate(data: AppBskyActorSearchActorsTypeahead.Output) { 12 11 for (const profile of data.actors) { 13 12 if (profile.did === did) { 14 13 yield profile;
+2 -3
src/api/queries-cache/profile-list.ts
··· 1 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 2 - import type { Did } from '@atcute/lexicons'; 1 + import type { AppBskyActorDefs, At } from '@atcute/client/lexicons'; 3 2 import type { InfiniteData } from '@mary/solid-query'; 4 3 5 4 import type { CacheMatcher } from '../cache/utils'; 6 5 import type { ProfilesListPage, ProfilesListWithSubjectPage } from '../types/profile-response'; 7 6 8 - export const findAllProfiles = (did: Did): CacheMatcher<AppBskyActorDefs.ProfileView> => { 7 + export const findAllProfiles = (did: At.DID): CacheMatcher<AppBskyActorDefs.ProfileView> => { 9 8 return { 10 9 filter: [ 11 10 { queryKey: ['profile-followers'] },
+1 -1
src/api/queries-cache/profile-precache.ts
··· 1 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 1 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 2 2 import type { QueryClient } from '@mary/solid-query'; 3 3 4 4 export const precacheProfile = (
+2 -3
src/api/queries-cache/profile.ts
··· 1 - import { AppBskyActorDefs } from '@atcute/bluesky'; 2 - import type { Did } from '@atcute/lexicons'; 1 + import type { AppBskyActorDefs, At } from '@atcute/client/lexicons'; 3 2 4 3 import type { CacheMatcher } from '../cache/utils'; 5 4 6 - export const findAllProfiles = (did: Did): CacheMatcher<AppBskyActorDefs.ProfileViewDetailed> => { 5 + export const findAllProfiles = (did: At.DID): CacheMatcher<AppBskyActorDefs.ProfileViewDetailed> => { 7 6 return { 8 7 filter: { 9 8 queryKey: ['profile', did],
+2 -3
src/api/queries-cache/timeline.ts
··· 1 - import type { AppBskyActorDefs, AppBskyFeedDefs } from '@atcute/bluesky'; 2 - import type { Did } from '@atcute/lexicons'; 1 + import type { AppBskyActorDefs, AppBskyFeedDefs, At } from '@atcute/client/lexicons'; 3 2 import type { InfiniteData } from '@mary/solid-query'; 4 3 5 4 import type { CacheMatcher } from '../cache/utils'; ··· 64 63 }; 65 64 }; 66 65 67 - export const findAllProfiles = (did: Did): CacheMatcher<AppBskyActorDefs.ProfileViewBasic> => { 66 + export const findAllProfiles = (did: At.DID): CacheMatcher<AppBskyActorDefs.ProfileViewBasic> => { 68 67 return { 69 68 filter: { 70 69 queryKey: ['timeline'],
+21 -21
src/api/types/at-uri.ts
··· 1 - import { 2 - type ActorIdentifier, 3 - type Nsid, 4 - type ParsedCanonicalResourceUri, 5 - type RecordKey, 6 - type ResourceUri, 7 - parseCanonicalResourceUri, 8 - } from '@atcute/lexicons'; 9 - import type { Records } from '@atcute/lexicons/ambient'; 1 + import type { At, Records } from '@atcute/client/lexicons'; 10 2 11 3 import { assert } from '~/lib/utils/invariant'; 12 4 13 - // #__NO_SIDE_EFFECTS__ 14 - export const assertCanonicalResourceUri = (input: string): ParsedCanonicalResourceUri => { 15 - const result = parseCanonicalResourceUri(input); 16 - if (!result.ok) { 17 - assert(false, result.error); 18 - } 5 + export const ATURI_RE = 6 + /^at:\/\/(did:[a-z]+:[a-zA-Z0-9._:%\-]*[a-zA-Z0-9._\-]|(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])\/([a-zA-Z0-9-.]+)\/((?!\.{1,2}$)[a-zA-Z0-9_~.:-]{1,512})(?:#(\/[a-zA-Z0-9._~:@!$&%')(*+,;=\-[\]/\\]*))?$/; 19 7 20 - return result.value; 8 + export interface ParsedAtUri { 9 + repo: string; 10 + collection: string; 11 + rkey: string; 12 + fragment: string | undefined; 13 + } 14 + 15 + export const parseAtUri = (str: string): ParsedAtUri => { 16 + const match = ATURI_RE.exec(str); 17 + assert(match !== null, `failed to parse at-uri for ${str}`); 18 + 19 + return { 20 + repo: match[1] as At.DID, 21 + collection: match[2], 22 + rkey: match[3], 23 + fragment: match[4], 24 + }; 21 25 }; 22 26 23 - export const makeAtUri = ( 24 - repo: ActorIdentifier, 25 - collection: keyof Records | (Nsid & {}), 26 - rkey: RecordKey, 27 - ): ResourceUri => { 27 + export const makeAtUri = (repo: string, collection: keyof Records | (string & {}), rkey: string) => { 28 28 return `at://${repo}/${collection}/${rkey}`; 29 29 };
+34
src/api/types/identity.ts
··· 1 + export type Handle = `${string}.${string}`; 2 + 3 + export const HANDLE_RE = 4 + /^(?=.{4,253}$)(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+([a-zA-Z][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$/; 5 + 6 + export const isHandle = (input: string): input is Handle => { 7 + return input.length >= 3 && input.length <= 253 && HANDLE_RE.test(input); 8 + }; 9 + 10 + export type Did<TMethod extends string = string> = `did:${TMethod}:${string}`; 11 + export type AtprotoDid = Did<'plc' | 'web'>; 12 + 13 + export const DID_RE = /^(?=.{7,2048}$)did:([a-z]+):([a-zA-Z0-9._:%\-]*[a-zA-Z0-9._\-])$/; 14 + 15 + export const isDid = (input: string): input is Did => { 16 + return input.length >= 7 && input.length <= 2048 && DID_RE.test(input); 17 + }; 18 + 19 + export const ATPROTO_WEB_DID_RE = 20 + /^did:web:([a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*(?:\.[a-zA-Z]{2,})|localhost(?:%3[aA]\d+)?)$/; 21 + 22 + export const isAtprotoWebDid = (input: string): input is Did<'web'> => { 23 + return input.length >= 12 && ATPROTO_WEB_DID_RE.test(input); 24 + }; 25 + 26 + export const PLC_DID_RE = /^did:plc:([a-z2-7]{24})$/; 27 + 28 + export const isPlcDid = (input: string): input is Did<'plc'> => { 29 + return input.length === 32 && PLC_DID_RE.test(input); 30 + }; 31 + 32 + export const isAtprotoDid = (input: string): input is AtprotoDid => { 33 + return isPlcDid(input) || isAtprotoWebDid(input); 34 + };
+1 -1
src/api/types/profile-response.ts
··· 1 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 1 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 2 2 3 3 export interface ProfilesListPage { 4 4 cursor: string | undefined;
+11
src/api/types/rkey.ts
··· 1 + export const RECORD_KEY_RE = /(?!\.{1,2}$)[a-zA-Z0-9_~.:-]{1,512}/; 2 + 3 + export const isRecordKey = (input: string) => { 4 + return input.length >= 1 && input.length <= 512 && RECORD_KEY_RE.test(input); 5 + }; 6 + 7 + export const TID_RE = /^[234567abcdefghij][234567abcdefghijklmnopqrstuvwxyz]{12}$/; 8 + 9 + export const isTid = (input: string) => { 10 + return input.length === 13 && TID_RE.test(input); 11 + };
+56
src/api/utils/bluesky/embed-view.ts
··· 1 + import type { AppBskyEmbedRecordWithMedia, AppBskyFeedDefs } from '@atcute/client/lexicons'; 2 + 3 + import { parseAtUri } from '~/api/types/at-uri'; 4 + 5 + export interface EmbedsView { 6 + media?: AppBskyEmbedRecordWithMedia.View['media']; 7 + record?: AppBskyEmbedRecordWithMedia.View['record']['record']; 8 + } 9 + 10 + export type MediaEmbedView = NonNullable<EmbedsView['media']>; 11 + export type RecordEmbedView = NonNullable<EmbedsView['record']>; 12 + 13 + export const unwrapMediaEmbedView = (embed: AppBskyFeedDefs.PostView['embed']): EmbedsView['media'] => { 14 + switch (embed?.$type) { 15 + case 'app.bsky.embed.recordWithMedia#view': 16 + return embed.media; 17 + case 'app.bsky.embed.record#view': 18 + return; 19 + } 20 + 21 + return embed; 22 + }; 23 + 24 + export const unwrapRecordEmbedView = (embed: AppBskyFeedDefs.PostView['embed']): EmbedsView['record'] => { 25 + switch (embed?.$type) { 26 + case 'app.bsky.embed.recordWithMedia#view': 27 + return embed.record.record; 28 + 29 + case 'app.bsky.embed.record#view': 30 + return embed.record; 31 + } 32 + }; 33 + 34 + export const unwrapEmbedView = (embed: AppBskyFeedDefs.PostView['embed']): EmbedsView => { 35 + return { 36 + media: unwrapMediaEmbedView(embed), 37 + record: unwrapRecordEmbedView(embed), 38 + }; 39 + }; 40 + 41 + export const getQuoteEmbedView = (embed: RecordEmbedView | undefined) => { 42 + switch (embed?.$type) { 43 + case 'app.bsky.embed.record#viewRecord': { 44 + return embed; 45 + } 46 + 47 + case 'app.bsky.embed.record#viewNotFound': 48 + case 'app.bsky.embed.record#viewDetached': 49 + case 'app.bsky.embed.record#viewBlocked': { 50 + const uri = parseAtUri(embed.uri); 51 + if (uri.collection === 'app.bsky.feed.post') { 52 + return embed; 53 + } 54 + } 55 + } 56 + };
+37
src/api/utils/bluesky/embed.ts
··· 1 + import type { AppBskyEmbedRecordWithMedia, AppBskyFeedPost } from '@atcute/client/lexicons'; 2 + 3 + export interface Embeds { 4 + media?: AppBskyEmbedRecordWithMedia.Main['media']; 5 + record?: AppBskyEmbedRecordWithMedia.Main['record']; 6 + } 7 + 8 + export type MediaEmbed = NonNullable<Embeds['media']>; 9 + export type RecordEmbed = NonNullable<Embeds['record']>; 10 + 11 + export const unwrapMediaEmbed = (embed: AppBskyFeedPost.Record['embed']): Embeds['media'] => { 12 + switch (embed?.$type) { 13 + case 'app.bsky.embed.recordWithMedia': 14 + return embed.media; 15 + case 'app.bsky.embed.record': 16 + return; 17 + } 18 + 19 + return embed; 20 + }; 21 + 22 + export const unwrapRecordEmbed = (embed: AppBskyFeedPost.Record['embed']): Embeds['record'] => { 23 + switch (embed?.$type) { 24 + case 'app.bsky.embed.recordWithMedia': 25 + return embed.record; 26 + 27 + case 'app.bsky.embed.record': 28 + return embed; 29 + } 30 + }; 31 + 32 + export const unwrapEmbed = (embed: AppBskyFeedPost.Record['embed']): Embeds => { 33 + return { 34 + media: unwrapMediaEmbed(embed), 35 + record: unwrapRecordEmbed(embed), 36 + }; 37 + };
+11 -12
src/api/utils/did.ts
··· 1 - import { type Client, ok } from '@atcute/client'; 2 - import type { Did, Handle } from '@atcute/lexicons'; 3 - import { isDid } from '@atcute/lexicons/syntax'; 1 + import type { XRPC } from '@atcute/client'; 2 + import type { At } from '@atcute/client/lexicons'; 4 3 5 - const getDid = async (client: Client, actor: Handle, signal?: AbortSignal) => { 6 - let did: Did; 4 + import { isDid } from '../types/identity'; 5 + 6 + const getDid = async (rpc: XRPC, actor: string, signal?: AbortSignal) => { 7 + let did: At.DID; 7 8 if (isDid(actor)) { 8 9 did = actor; 9 10 } else { 10 - const data = await ok( 11 - client.get('com.atproto.identity.resolveHandle', { 12 - signal: signal, 13 - params: { handle: actor }, 14 - }), 15 - ); 11 + const response = await rpc.get('com.atproto.identity.resolveHandle', { 12 + signal: signal, 13 + params: { handle: actor }, 14 + }); 16 15 17 - did = data.did; 16 + did = response.data.did; 18 17 } 19 18 20 19 return did;
+5 -5
src/api/utils/error.ts
··· 1 - import { ClientResponseError } from '@atcute/client'; 1 + import { XRPCError } from '@atcute/client'; 2 2 import { TokenRefreshError } from '@atcute/oauth-browser-client'; 3 3 4 - export const formatXRPCError = (err: ClientResponseError): string => { 5 - const name = err.error; 4 + export const formatXRPCError = (err: XRPCError): string => { 5 + const name = err.kind; 6 6 return (name ? name + ': ' : '') + err.description; 7 7 }; 8 8 ··· 11 11 return `Account session is no longer valid`; 12 12 } 13 13 14 - if (err instanceof ClientResponseError) { 15 - const kind = err.error; 14 + if (err instanceof XRPCError) { 15 + const kind = err.kind; 16 16 17 17 if (kind === 'invalid_token') { 18 18 return `Account session is no longer valid`;
+4 -6
src/api/utils/post.ts
··· 4 4 AppBskyEmbedRecord, 5 5 AppBskyFeedDefs, 6 6 AppBskyFeedPost, 7 - } from '@atcute/bluesky'; 8 - import type { $type } from '@atcute/lexicons'; 7 + Brand, 8 + } from '@atcute/client/lexicons'; 9 9 10 - type RecordEmbed = AppBskyFeedPost.Main['embed']; 10 + type RecordEmbed = AppBskyFeedPost.Record['embed']; 11 11 type ViewEmbed = AppBskyFeedDefs.PostView['embed']; 12 12 13 13 export const unwrapPostEmbedText = (embed: RecordEmbed | ViewEmbed): string => { ··· 35 35 type RecordMedia = AppBskyEmbedExternal.Main | AppBskyEmbedImages.Main; 36 36 type ViewMedia = AppBskyEmbedExternal.View | AppBskyEmbedImages.View; 37 37 38 - const getMediaEmbed = ( 39 - embed: RecordEmbed | ViewEmbed, 40 - ): $type.enforce<RecordMedia | ViewMedia> | undefined => { 38 + const getMediaEmbed = (embed: RecordEmbed | ViewEmbed): Brand.Union<RecordMedia | ViewMedia> | undefined => { 41 39 if (embed) { 42 40 const type = embed.$type; 43 41
+44 -62
src/api/utils/records.ts
··· 1 - import type { ComAtprotoRepoGetRecord, ComAtprotoRepoListRecords } from '@atcute/atproto'; 2 - import { type Client, ok } from '@atcute/client'; 3 - import type { Cid, Did, InferInput, ResourceUri } from '@atcute/lexicons'; 4 - import type { Records } from '@atcute/lexicons/ambient'; 1 + import type { XRPC } from '@atcute/client'; 2 + import type { 3 + At, 4 + ComAtprotoRepoGetRecord, 5 + ComAtprotoRepoListRecords, 6 + Records, 7 + } from '@atcute/client/lexicons'; 5 8 6 9 type RecordType = keyof Records; 7 10 8 11 export interface CreateRecordOptions<K extends RecordType> { 9 - repo: Did; 12 + repo: At.DID; 10 13 collection: K; 11 14 rkey?: string; 12 - record: InferInput<Records[K]>; 15 + record: Records[K]; 13 16 swapCommit?: string; 14 17 validate?: boolean; 15 18 } 16 19 17 - export const createRecord = async <K extends RecordType>(client: Client, options: CreateRecordOptions<K>) => { 18 - const data = await ok( 19 - client.post('com.atproto.repo.createRecord', { 20 - input: options as any, 21 - }), 22 - ); 20 + export const createRecord = async <K extends RecordType>(rpc: XRPC, options: CreateRecordOptions<K>) => { 21 + const { data } = await rpc.call('com.atproto.repo.createRecord', { data: options }); 23 22 24 23 return data; 25 24 }; 26 25 27 26 export interface PutRecordOptions<K extends RecordType> { 28 - repo: Did; 27 + repo: At.DID; 29 28 collection: K; 30 29 rkey: string; 31 - record: InferInput<Records[K]>; 30 + record: Records[K]; 32 31 swapCommit?: string; 33 - swapRecord?: Cid | null; 32 + swapRecord?: At.CID | null; 34 33 validate?: boolean; 35 34 } 36 35 37 - export const putRecord = async <K extends RecordType>(client: Client, options: PutRecordOptions<K>) => { 38 - const data = await ok( 39 - client.post('com.atproto.repo.putRecord', { 40 - input: options as any, 41 - }), 42 - ); 36 + export const putRecord = async <K extends RecordType>(rpc: XRPC, options: PutRecordOptions<K>) => { 37 + const { data } = await rpc.call('com.atproto.repo.putRecord', { data: options }); 43 38 44 39 return data; 45 40 }; 46 41 47 42 export interface DeleteRecordOptions<K extends RecordType> { 48 - repo: Did; 43 + repo: At.DID; 49 44 collection: K; 50 45 rkey: string; 51 46 swapCommit?: string; 52 47 swapRecord?: string; 53 48 } 54 49 55 - export const deleteRecord = async <K extends RecordType>(client: Client, options: DeleteRecordOptions<K>) => { 56 - await ok( 57 - client.post('com.atproto.repo.deleteRecord', { 58 - input: options, 59 - }), 60 - ); 50 + export const deleteRecord = async <K extends RecordType>(rpc: XRPC, options: DeleteRecordOptions<K>) => { 51 + await rpc.call('com.atproto.repo.deleteRecord', { 52 + data: options, 53 + }); 61 54 }; 62 55 63 56 export interface GetRecordOptions<K extends RecordType> { 64 - signal?: AbortSignal; 65 - repo: Did; 57 + repo: At.DID; 66 58 collection: K; 67 59 rkey: string; 68 60 cid?: string; 69 61 } 70 62 71 - export type GetRecordOutput<T> = ComAtprotoRepoGetRecord.$output & { 63 + export interface GetRecordOutput<T> extends ComAtprotoRepoGetRecord.Output { 72 64 value: T; 73 - }; 65 + } 74 66 75 67 export const getRecord = async <K extends RecordType>( 76 - client: Client, 68 + rpc: XRPC, 77 69 options: GetRecordOptions<K>, 78 - ): Promise<GetRecordOutput<InferInput<Records[K]>>> => { 79 - const data = await ok( 80 - client.get('com.atproto.repo.getRecord', { 81 - signal: options.signal, 82 - params: { 83 - repo: options.repo, 84 - collection: options.collection, 85 - rkey: options.rkey, 86 - cid: options.cid, 87 - }, 88 - }), 89 - ); 70 + ): Promise<GetRecordOutput<Records[K]>> => { 71 + const { data } = await rpc.get('com.atproto.repo.getRecord', { 72 + params: options, 73 + }); 90 74 91 75 return data as any; 92 76 }; 93 77 94 78 export interface ListRecordsOptions<K extends RecordType> { 95 79 signal?: AbortSignal; 96 - repo: Did; 80 + repo: At.DID; 97 81 collection: K; 98 82 cursor?: string; 99 83 limit?: number; 100 84 } 101 85 102 - export type ListRecordsOutput<T> = ComAtprotoRepoListRecords.$output & { 86 + export interface ListRecordsOutput<T> extends ComAtprotoRepoListRecords.Output { 103 87 cursor?: string; 104 - records: { cid: Cid; uri: ResourceUri; value: T }[]; 105 - }; 88 + records: { cid: At.CID; uri: At.Uri; value: T }[]; 89 + } 106 90 107 91 export const listRecords = async <K extends RecordType>( 108 - client: Client, 92 + rpc: XRPC, 109 93 options: ListRecordsOptions<K>, 110 - ): Promise<ListRecordsOutput<InferInput<Records[K]>>> => { 111 - const data = await ok( 112 - client.get('com.atproto.repo.listRecords', { 113 - signal: options.signal, 114 - params: { 115 - repo: options.repo, 116 - collection: options.collection, 117 - limit: options.limit, 118 - cursor: options.cursor, 119 - }, 120 - }), 121 - ); 94 + ): Promise<ListRecordsOutput<Records[K]>> => { 95 + const { data } = await rpc.get('com.atproto.repo.listRecords', { 96 + signal: options.signal, 97 + params: { 98 + repo: options.repo, 99 + collection: options.collection, 100 + limit: options.limit, 101 + cursor: options.cursor, 102 + }, 103 + }); 122 104 123 105 return data as any; 124 106 };
+1 -1
src/api/utils/richtext-stringify.ts
··· 1 - import type { AppBskyRichtextFacet } from '@atcute/bluesky'; 2 1 import { segmentize } from '@atcute/bluesky-richtext-segmenter'; 2 + import type { AppBskyRichtextFacet } from '@atcute/client/lexicons'; 3 3 4 4 import { isLinkValid } from './strings'; 5 5
+17
src/atcute-env.d.ts
··· 1 + import type { AppBskyRichtextFacet } from '@atcute/client/lexicons'; 2 + 3 + declare module '@atcute/client/lexicons' { 4 + namespace AppBskyRichtextFacet { 5 + type FacetFeature = Brand.Union<Link | Mention | Tag | BlueMojiRichtextFacet.Main>; 6 + 7 + interface Main { 8 + features: FacetFeature[]; 9 + } 10 + } 11 + } 12 + 13 + declare module '@atcute/bluesky-richtext-segmenter' { 14 + export interface RichtextSegment { 15 + features: AppBskyRichtextFacet.FacetFeature[] | undefined; 16 + } 17 + }
+69
src/basa-env.d.ts
··· 1 + /* eslint-disable */ 2 + // This file is automatically generated, do not edit! 3 + import '@atcute/client/lexicons'; 4 + 5 + declare module '@atcute/client/lexicons' { 6 + /** Describes the translation proxy instance */ 7 + namespace XBasaDescribeServer { 8 + interface Params {} 9 + type Input = undefined; 10 + interface Output { 11 + engines: Engines; 12 + } 13 + interface Engine { 14 + [Brand.Type]?: 'x.basa.describeServer#engine'; 15 + /** Supported language codes */ 16 + languages: string[]; 17 + } 18 + interface Engines { 19 + [Brand.Type]?: 'x.basa.describeServer#engines'; 20 + deepl?: Engine; 21 + google?: Engine; 22 + } 23 + } 24 + 25 + /** Translates a given text into another language */ 26 + namespace XBasaTranslate { 27 + interface Params { 28 + /** Text needing translation */ 29 + text: string; 30 + /** Target language */ 31 + to: string; 32 + /** 33 + * Which translation service to use 34 + * @default "google" 35 + */ 36 + engine?: 'google' | 'deepl'; 37 + /** 38 + * Source language 39 + * @default "auto" 40 + */ 41 + from?: string; 42 + } 43 + type Input = undefined; 44 + interface Output { 45 + /** Translated text */ 46 + result: string; 47 + /** Deteced language from source text */ 48 + sourceLanguage?: string; 49 + /** Transliteration of source text */ 50 + sourceTransliteration?: string; 51 + /** Transliteration of translated text */ 52 + targetTransliteration?: string; 53 + } 54 + } 55 + 56 + interface Records {} 57 + 58 + interface Queries { 59 + 'x.basa.describeServer': { 60 + output: XBasaDescribeServer.Output; 61 + }; 62 + 'x.basa.translate': { 63 + params: XBasaTranslate.Params; 64 + output: XBasaTranslate.Output; 65 + }; 66 + } 67 + 68 + interface Procedures {} 69 + }
+1 -1
src/components/avatar.tsx
··· 1 1 import { Match, Switch } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 3 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 4 5 5 import { type ModerationCause, getModerationUI } from '~/api/moderation'; 6 6 import { ContextProfileMedia, type ModerationContext } from '~/api/moderation/constants';
+1 -1
src/components/bookmarks/add-post-to-folder-dialog.tsx
··· 1 1 import { For, createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 3 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 4 4 import { intersection } from '@mary/array-fns'; 5 5 import { useQueryClient } from '@mary/solid-query'; 6 6
+4 -5
src/components/bookmarks/bookmark-feed-item.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyFeedPost } from '@atcute/bluesky'; 3 + import type { AppBskyFeedPost } from '@atcute/client/lexicons'; 4 4 5 5 import { usePostShadow } from '~/api/cache/post-shadow'; 6 6 import { getModerationUI } from '~/api/moderation'; 7 7 import { ContextContentList } from '~/api/moderation/constants'; 8 8 import { moderatePost } from '~/api/moderation/entities/post'; 9 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 9 + import { parseAtUri } from '~/api/types/at-uri'; 10 10 11 11 import { history } from '~/globals/navigation'; 12 12 ··· 35 35 const { post, stale } = item; 36 36 37 37 const author = post.author; 38 - const record = post.record as AppBskyFeedPost.Main; 38 + const record = post.record as AppBskyFeedPost.Record; 39 39 const embed = post.embed; 40 40 41 41 const shadow = usePostShadow(post); 42 42 43 - const uri = assertCanonicalResourceUri(post.uri); 44 - 43 + const uri = parseAtUri(post.uri); 45 44 const authorHref = `/${author.did}`; 46 45 const href = `/${author.did}/${uri.rkey}`; 47 46
+1 -1
src/components/composer/composer-dialog.tsx
··· 13 13 } from 'solid-js'; 14 14 import { createMutable, unwrap } from 'solid-js/store'; 15 15 16 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 16 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 17 17 import { type CreateQueryResult, useQueryClient } from '@mary/solid-query'; 18 18 19 19 import { GLOBAL_LABELS, getLocalizedLabel } from '~/api/moderation';
+9 -12
src/components/composer/composer-input.tsx
··· 12 12 createSignal, 13 13 } from 'solid-js'; 14 14 15 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 16 - import { ok } from '@atcute/client'; 15 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 17 16 18 17 import { safeUrlParse } from '~/api/utils/strings'; 19 18 ··· 63 62 const onChange = props.onChange; 64 63 const onSubmit = props.onSubmit; 65 64 66 - const { client } = useAgent(); 65 + const { rpc } = useAgent(); 67 66 68 67 const [inputCursor, setInputCursor] = createSignal<number>(); 69 68 const [menuSelection, setMenuSelection] = createSignal<number>(); ··· 136 135 const MATCH_LIMIT = 5; 137 136 138 137 if (type === Suggestion.MENTION) { 139 - const data = await ok( 140 - client.get('app.bsky.actor.searchActorsTypeahead', { 141 - params: { 142 - q: match.query, 143 - limit: MATCH_LIMIT, 144 - }, 145 - }), 146 - ); 138 + const response = await rpc.get('app.bsky.actor.searchActorsTypeahead', { 139 + params: { 140 + q: match.query, 141 + limit: MATCH_LIMIT, 142 + }, 143 + }); 147 144 148 - return data.actors.map((item) => ({ type: Suggestion.MENTION, data: item })); 145 + return response.data.actors.map((item) => ({ type: Suggestion.MENTION, data: item })); 149 146 } 150 147 151 148 assert(false, `expected match`);
+4 -3
src/components/composer/composer-reply-context.tsx
··· 1 1 import { Match, Switch, createMemo } from 'solid-js'; 2 2 3 - import { type AppBskyFeedPost, unwrapMediaEmbed } from '@atcute/bluesky'; 3 + import type { AppBskyFeedPost } from '@atcute/client/lexicons'; 4 4 5 5 import { getModerationUI } from '~/api/moderation'; 6 6 import { ContextContentMedia } from '~/api/moderation/constants'; 7 7 import { moderatePost } from '~/api/moderation/entities/post'; 8 8 import { createPostQuery } from '~/api/queries/post'; 9 + import { unwrapMediaEmbedView } from '~/api/utils/bluesky/embed-view'; 9 10 import { formatQueryError } from '~/api/utils/error'; 10 11 11 12 import { inject } from '~/lib/states/singleton'; ··· 33 34 <Match when={query.data} keyed> 34 35 {(post) => { 35 36 const author = post.author; 36 - const record = post.record as AppBskyFeedPost.Main; 37 + const record = post.record as AppBskyFeedPost.Record; 37 38 38 39 const moderation = createMemo(() => moderatePost(post, moderationOptions())); 39 40 const shouldBlurImage = () => getModerationUI(moderation(), ContextContentMedia).b.length !== 0; 40 41 41 - const media = unwrapMediaEmbed(post.embed); 42 + const media = unwrapMediaEmbedView(post.embed); 42 43 43 44 return ( 44 45 <div class="relative flex gap-3 px-4 pt-3">
+2 -3
src/components/composer/dialogs/composed-interaction-dialog.tsx
··· 1 1 import { For, Match, Switch, batch, createEffect, createMemo, createSignal, untrack } from 'solid-js'; 2 2 3 - import type { AppBskyFeedThreadgate } from '@atcute/bluesky'; 4 - import type { $type } from '@atcute/lexicons'; 3 + import type { AppBskyFeedThreadgate, Brand } from '@atcute/client/lexicons'; 5 4 6 5 import { createMyListsQuery } from '~/api/queries/my-lists'; 7 6 import { dequal } from '~/api/utils/dequal'; ··· 240 239 <Boxed.List> 241 240 <For each={lists.data}> 242 241 {(list) => { 243 - const rule: $type.enforce<AppBskyFeedThreadgate.ListRule> = { 242 + const rule: Brand.Union<AppBskyFeedThreadgate.ListRule> = { 244 243 $type: 'app.bsky.feed.threadgate#listRule', 245 244 list: list.uri, 246 245 };
+1 -1
src/components/composer/embeds/quote-embed.tsx
··· 1 1 import { Match, Switch } from 'solid-js'; 2 2 3 - import type { AppBskyEmbedRecord } from '@atcute/bluesky'; 3 + import type { AppBskyEmbedRecord } from '@atcute/client/lexicons'; 4 4 5 5 import { createPostQuery } from '~/api/queries/post'; 6 6
+2 -3
src/components/composer/gifs/gif-search-dialog.tsx
··· 1 1 import { For, Match, Switch, createSignal } from 'solid-js'; 2 2 3 - import type { GenericUri } from '@atcute/lexicons'; 4 3 import { chunked } from '@mary/array-fns'; 5 4 6 5 import { type Gif, createGifSearchQuery } from '~/api/queries/composer-gif'; ··· 111 110 export default GifSearchDialog; 112 111 113 112 export interface GifMedia { 114 - embedUrl: GenericUri; 113 + embedUrl: string; 115 114 alt: string; 116 115 ratio: { width: number; height: number }; 117 116 ··· 129 128 const [, id, file] = /\/([^/]+?AAAAC)\/([^/]+?)\.gif\/?$/.exec(url)!; 130 129 131 130 return { 132 - embedUrl: (url + `?hh=${dimensions[1]}&ww=${dimensions[0]}`) as GenericUri, 131 + embedUrl: url + `?hh=${dimensions[1]}&ww=${dimensions[0]}`, 133 132 alt: gif.content_description, 134 133 ratio: { width: dimensions[0], height: dimensions[1] }, 135 134
+83 -100
src/components/composer/lib/api.ts
··· 1 1 import { nanoid } from 'nanoid/non-secure'; 2 2 3 - import type { 4 - ComAtprotoLabelDefs, 5 - ComAtprotoRepoApplyWrites, 6 - ComAtprotoRepoStrongRef, 7 - } from '@atcute/atproto'; 8 - import type { BlueMojiRichtextFacet } from '@atcute/bluemoji'; 3 + import { XRPC, XRPCError, simpleFetchHandler } from '@atcute/client'; 9 4 import type { 10 5 AppBskyEmbedImages, 11 6 AppBskyEmbedRecord, ··· 17 12 AppBskyGraphDefs, 18 13 AppBskyRichtextFacet, 19 14 AppBskyVideoDefs, 20 - } from '@atcute/bluesky'; 21 - import { Client, ClientResponseError, ok, simpleFetchHandler } from '@atcute/client'; 22 - import { type $type, type Blob as AtpBlob, type Did, type GenericUri, type Handle } from '@atcute/lexicons'; 23 - import { isDid } from '@atcute/lexicons/syntax'; 15 + At, 16 + BlueMojiRichtextFacet, 17 + Brand, 18 + ComAtprotoLabelDefs, 19 + ComAtprotoRepoApplyWrites, 20 + ComAtprotoRepoStrongRef, 21 + } from '@atcute/client/lexicons'; 24 22 import * as TID from '@atcute/tid'; 25 23 import type { QueryClient } from '@mary/solid-query'; 26 24 ··· 28 26 import { uploadBlob } from '~/api/queries/blob'; 29 27 import type { LinkMeta } from '~/api/queries/composer'; 30 28 import { resolveHandle } from '~/api/queries/handle'; 31 - import { assertCanonicalResourceUri, makeAtUri } from '~/api/types/at-uri'; 29 + import { makeAtUri, parseAtUri } from '~/api/types/at-uri'; 30 + import { isDid } from '~/api/types/identity'; 32 31 import { getRecord } from '~/api/utils/records'; 33 32 import { trimRichText } from '~/api/utils/richtext'; 34 33 import { getUtf8Length } from '~/api/utils/unicode'; ··· 58 57 let cidPromise: Promise<typeof import('./cid')>; 59 58 60 59 export const publish = async ({ agent, queryClient, state, onLog: log }: PublishOptions) => { 61 - const client = agent.client; 60 + const rpc = agent.rpc; 62 61 const did = agent.did!; 63 62 64 63 const now = new Date(); 65 - const writes: ComAtprotoRepoApplyWrites.$input['writes'] = []; 64 + const writes: ComAtprotoRepoApplyWrites.Input['writes'] = []; 66 65 67 66 let reply: AppBskyFeedPost.ReplyRef | undefined; 68 67 let rkey: string | undefined; ··· 75 74 queryKey: ['post', replyUri], 76 75 staleTime: 30_000, 77 76 async queryFn(ctx) { 78 - const uri = assertCanonicalResourceUri(replyUri); 77 + const uri = parseAtUri(replyUri); 79 78 80 - let did: Did; 79 + let did: At.DID; 81 80 if (isDid(uri.repo)) { 82 81 did = uri.repo; 83 82 } else { 84 - did = await resolveHandle(client, uri.repo, ctx.signal); 83 + did = await resolveHandle(rpc, uri.repo, ctx.signal); 85 84 } 86 85 87 - const data = await ok( 88 - client.get('app.bsky.feed.getPosts', { 89 - signal: ctx.signal, 90 - params: { 91 - uris: [makeAtUri(did, uri.collection, uri.rkey)], 92 - }, 93 - }), 94 - ); 86 + const { data } = await rpc.get('app.bsky.feed.getPosts', { 87 + signal: ctx.signal, 88 + params: { 89 + uris: [makeAtUri(did, uri.collection, uri.rkey)], 90 + }, 91 + }); 95 92 96 93 const post = data.posts[0]; 97 94 ··· 103 100 }, 104 101 }); 105 102 106 - const root = (post.record as AppBskyFeedPost.Main).reply?.root; 103 + const root = (post.record as AppBskyFeedPost.Record).reply?.root; 107 104 const ref: ComAtprotoRepoStrongRef.Main = { 108 105 uri: post.uri, 109 106 cid: post.cid, ··· 116 113 } 117 114 118 115 if (state.redraftUri) { 119 - const uri = assertCanonicalResourceUri(state.redraftUri); 116 + const uri = parseAtUri(state.redraftUri); 120 117 121 118 writes.push({ 122 119 $type: 'com.atproto.repo.applyWrites#delete', ··· 142 139 143 140 // Get the self-labels 144 141 const labels = getEmbedLabels(post.embed); 145 - let selfLabels: $type.enforce<ComAtprotoLabelDefs.SelfLabels> | undefined; 142 + let selfLabels: Brand.Union<ComAtprotoLabelDefs.SelfLabels> | undefined; 146 143 147 144 if (labels?.length) { 148 145 selfLabels = { ··· 152 149 } 153 150 154 151 // Now form the record 155 - const record: AppBskyFeedPost.Main = { 152 + const record: AppBskyFeedPost.Record = { 156 153 $type: 'app.bsky.feed.post', 157 154 createdAt: now.toISOString(), 158 155 text: rt.text, ··· 172 169 173 170 // If this is the first post, and we have a threadgate set, create one now. 174 171 if (idx === 0 && !reply && state.threadgate.allow) { 175 - const threadgateRecord: AppBskyFeedThreadgate.Main = { 172 + const threadgateRecord: AppBskyFeedThreadgate.Record = { 176 173 $type: 'app.bsky.feed.threadgate', 177 174 createdAt: now.toISOString(), 178 175 post: uri, ··· 189 186 190 187 // If we have a postgate set, create one for this post. 191 188 if (state.postgate.embeddingRules?.length) { 192 - const postgateRecord: AppBskyFeedPostgate.Main = { 189 + const postgateRecord: AppBskyFeedPostgate.Record = { 193 190 $type: 'app.bsky.feed.postgate', 194 191 createdAt: now.toISOString(), 195 192 post: uri, ··· 229 226 230 227 log?.(`Posting`); 231 228 232 - await ok( 233 - client.post('com.atproto.repo.applyWrites', { 234 - input: { 235 - repo: did, 236 - writes: writes, 237 - }, 238 - }), 239 - ); 229 + await rpc.call('com.atproto.repo.applyWrites', { 230 + data: { 231 + repo: did, 232 + writes: writes, 233 + }, 234 + }); 240 235 241 236 if (state.redraftUri) { 242 237 updatePostShadow(queryClient, state.redraftUri, { deleted: true }); ··· 244 239 245 240 return writes; 246 241 247 - async function resolveEmbed(root: PostEmbed): Promise<AppBskyFeedPost.Main['embed']> { 242 + async function resolveEmbed(root: PostEmbed): Promise<AppBskyFeedPost.Record['embed']> { 248 243 let pMedia: Promise<AppBskyEmbedRecordWithMedia.Main['media']> | undefined; 249 - let pRecord: Promise<$type.enforce<AppBskyEmbedRecord.Main>> | undefined; 244 + let pRecord: Promise<Brand.Union<AppBskyEmbedRecord.Main>> | undefined; 250 245 251 246 if (root.media) { 252 247 pMedia = resolveMediaEmbed(root.media); ··· 303 298 304 299 switch (source.type) { 305 300 case 'local': { 306 - const uploaded = await uploadBlob(client, source.blob); 301 + const uploaded = await uploadBlob(rpc, source.blob); 307 302 308 303 return { 309 304 image: uploaded, ··· 344 339 345 340 const blob = source.blob; 346 341 347 - const videoClient = new Client({ 348 - handler: simpleFetchHandler({ service: 'https://video.bsky.app' }), 349 - }); 342 + const videoRpc = new XRPC({ handler: simpleFetchHandler({ service: 'https://video.bsky.app' }) }); 350 343 351 344 // Get upload limit status 352 345 { ··· 367 360 // GET https://porcini.us-east.host.bsky.network/xrpc/chat.bsky.convo.getLog 368 361 // atproto-proxy: did:web:api.bsky.chat#bsky_chat 369 362 // 370 - const tokenData = await ok( 371 - client.get('com.atproto.server.getServiceAuth', { 372 - params: { 373 - aud: 'did:web:video.bsky.app', 374 - lxm: 'app.bsky.video.getUploadLimits', 375 - }, 376 - }), 377 - ); 363 + const { data: tokenData } = await rpc.get('com.atproto.server.getServiceAuth', { 364 + params: { 365 + aud: 'did:web:video.bsky.app', 366 + lxm: 'app.bsky.video.getUploadLimits', 367 + }, 368 + }); 378 369 379 - const data = await ok( 380 - videoClient.get('app.bsky.video.getUploadLimits', { 381 - headers: { 382 - authorization: `Bearer ${tokenData.token}`, 383 - }, 384 - }), 385 - ); 370 + const { data } = await videoRpc.get('app.bsky.video.getUploadLimits', { 371 + headers: { 372 + authorization: `Bearer ${tokenData.token}`, 373 + }, 374 + }); 386 375 387 376 if (!data.canUpload) { 388 377 let message = data.message || `You've reached the limit on video uploads`; ··· 419 408 420 409 // Create an access token *to the PDS*, allowing the video service to 421 410 // upload the final blobs to our repository on our behalf. 422 - const tokenData = await ok( 423 - client.get('com.atproto.server.getServiceAuth', { 424 - params: { 425 - // `did:web:porcini.us-east.host.bsky.network` 426 - aud: `did:web:${new URL(session.info.aud).host}`, 427 - lxm: 'com.atproto.repo.uploadBlob', 428 - exp: Date.now() / 1000 + 60 * 30, // 30 minutes 429 - }, 430 - }), 431 - ); 411 + const { data: tokenData } = await rpc.get('com.atproto.server.getServiceAuth', { 412 + params: { 413 + // `did:web:porcini.us-east.host.bsky.network` 414 + aud: `did:web:${new URL(session.info.aud).host}`, 415 + lxm: 'com.atproto.repo.uploadBlob', 416 + exp: Date.now() / 1000 + 60 * 30, // 30 minutes 417 + }, 418 + }); 432 419 433 420 jobId = await new Promise((resolve, reject) => { 434 421 const xhr = new XMLHttpRequest(); ··· 478 465 } 479 466 480 467 // Check the upload status 481 - let result: AtpBlob<any>; 468 + let result: At.Blob<any>; 482 469 { 483 470 let pollFailures = 0; 484 471 ··· 488 475 let status: AppBskyVideoDefs.JobStatus; 489 476 490 477 try { 491 - const data = await ok( 492 - videoClient.get('app.bsky.video.getJobStatus', { 493 - params: { 494 - jobId: jobId, 495 - }, 496 - }), 497 - ); 478 + const { data } = await videoRpc.get('app.bsky.video.getJobStatus', { 479 + params: { 480 + jobId: jobId, 481 + }, 482 + }); 498 483 499 484 status = data.jobStatus; 500 485 pollFailures = 0; ··· 510 495 const state = status.state; 511 496 512 497 if (state === 'JOB_STATE_COMPLETED') { 513 - if (!status.blob || !('$type' in status.blob)) { 498 + if (!status.blob) { 514 499 throw new PublishError(`Unexpected error when processing video`); 515 500 } 516 501 ··· 548 533 const gif = embed.gif; 549 534 const alt = embed.alt; 550 535 551 - let thumbBlob: AtpBlob<any> | undefined; 536 + let thumbBlob: At.Blob<any> | undefined; 552 537 553 538 { 554 539 log?.(`Retrieving GIF thumbnail`); ··· 561 546 562 547 log?.(`Uploading GIF thumbnail`); 563 548 const compressed = await compressPostImage(gifBlob); 564 - const blob = await uploadBlob(client, compressed.blob); 549 + const blob = await uploadBlob(rpc, compressed.blob); 565 550 566 551 thumbBlob = blob; 567 552 } ··· 593 578 594 579 // compress... upload... 595 580 const thumb = meta.thumb; 596 - let thumbBlob: AtpBlob<any> | undefined; 581 + let thumbBlob: At.Blob<any> | undefined; 597 582 598 583 if (thumb !== undefined) { 599 584 log?.(`Uploading link thumbnail`); 600 585 601 586 const compressed = await compressPostImage(thumb); 602 - const blob = await uploadBlob(client, compressed.blob); 587 + const blob = await uploadBlob(rpc, compressed.blob); 603 588 604 589 thumbBlob = blob; 605 590 } ··· 617 602 618 603 async function resolveRecordEmbed( 619 604 record: PostRecordEmbed, 620 - ): Promise<$type.enforce<AppBskyEmbedRecord.Main>> { 605 + ): Promise<Brand.Union<AppBskyEmbedRecord.Main>> { 621 606 const type = record.type; 622 607 623 608 if (type === 'feed') { ··· 684 669 if (type === 'link' || type === 'autolink') { 685 670 facets.push({ 686 671 index: index, 687 - features: [{ $type: 'app.bsky.richtext.facet#link', uri: token.url as GenericUri }], 672 + features: [{ $type: 'app.bsky.richtext.facet#link', uri: token.url }], 688 673 }); 689 674 } else if (type === 'mention') { 690 - const handle = token.handle as Handle; 675 + const handle = token.handle; 691 676 692 677 if (handle === 'handle.invalid') { 693 678 throw new InvalidHandleError(handle); 694 679 } 695 680 696 681 try { 697 - const data = await ok( 698 - client.get('com.atproto.identity.resolveHandle', { 699 - params: { 700 - handle: handle, 701 - }, 702 - }), 703 - ); 682 + const response = await rpc.get('com.atproto.identity.resolveHandle', { 683 + params: { 684 + handle: handle, 685 + }, 686 + }); 704 687 705 - const did = data.did; 688 + const did = response.data.did; 706 689 707 690 if (!hasSilent) { 708 691 facets.push({ ··· 716 699 }); 717 700 } 718 701 } catch (err) { 719 - if (err instanceof ClientResponseError && err.error === 'InvalidRequest') { 702 + if (err instanceof XRPCError && err.kind === 'InvalidRequest') { 720 703 throw new InvalidHandleError(handle); 721 704 } 722 705 ··· 728 711 features: [{ $type: 'app.bsky.richtext.facet#tag', tag: token.name }], 729 712 }); 730 713 } else if (type === 'emote') { 731 - const { value } = await getRecord(client, { 714 + const { value } = await getRecord(rpc, { 732 715 repo: did, 733 716 collection: 'blue.moji.collection.item', 734 717 rkey: token.name, ··· 736 719 737 720 const raws = value.formats; 738 721 739 - const cids: $type.enforce<BlueMojiRichtextFacet.Formats_v0> = { 722 + const cids: Brand.Union<BlueMojiRichtextFacet.Formats_v0> = { 740 723 $type: 'blue.moji.richtext.facet#formats_v0', 741 724 }; 742 725 ··· 749 732 cids.lottie = true; 750 733 } 751 734 752 - if (raws.gif_128 && '$type' in raws.gif_128) { 735 + if (raws.gif_128) { 753 736 cids.gif_128 = raws.gif_128.ref.$link; 754 737 } 755 738 756 - if (raws.png_128 && '$type' in raws.png_128) { 739 + if (raws.png_128) { 757 740 cids.png_128 = raws.png_128.ref.$link; 758 741 } 759 742 760 - if (raws.webp_128 && '$type' in raws.webp_128) { 743 + if (raws.webp_128) { 761 744 cids.webp_128 = raws.webp_128.ref.$link; 762 745 } 763 746 } 764 747 765 - const facet: $type.enforce<BlueMojiRichtextFacet.Main> = { 748 + const facet: Brand.Union<BlueMojiRichtextFacet.Main> = { 766 749 $type: 'blue.moji.richtext.facet', 767 750 did: did, 768 751 name: value.name,
+9 -4
src/components/composer/lib/state.tsx
··· 1 1 import { unwrap } from 'solid-js/store'; 2 2 3 - import type { AppBskyEmbedDefs, AppBskyEmbedExternal, AppBskyFeedDefs } from '@atcute/bluesky'; 4 - import type { $type, Blob as AtpBlob } from '@atcute/lexicons'; 3 + import type { 4 + AppBskyEmbedDefs, 5 + AppBskyEmbedExternal, 6 + AppBskyFeedDefs, 7 + At, 8 + Brand, 9 + } from '@atcute/client/lexicons'; 5 10 6 11 import { primarySystemLanguage } from '~/globals/locales'; 7 12 ··· 33 38 34 39 export interface RemoteMediaSource { 35 40 type: 'remote'; 36 - blob: AtpBlob; 41 + blob: At.Blob; 37 42 aspectRatio?: AppBskyEmbedDefs.AspectRatio; 38 43 } 39 44 ··· 84 89 85 90 export interface RemoteLinkSource { 86 91 type: 'remote'; 87 - state: $type.enforce<AppBskyEmbedExternal.Main>; 92 + state: Brand.Union<AppBskyEmbedExternal.Main>; 88 93 } 89 94 90 95 export type LinkSource = UriLinkSource | RemoteLinkSource;
+7 -6
src/components/embeds/embed.tsx
··· 1 - import { type AppBskyFeedDefs, type MediaEmbed, type RecordEmbed, unwrapEmbed } from '@atcute/bluesky'; 1 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 2 2 3 3 import { type ModerationCause, getModerationUI } from '~/api/moderation'; 4 4 import { ContextContentMedia } from '~/api/moderation/constants'; 5 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 5 + import { parseAtUri } from '~/api/types/at-uri'; 6 + import { type MediaEmbedView, type RecordEmbedView, unwrapEmbedView } from '~/api/utils/bluesky/embed-view'; 6 7 7 8 import ContentHider from '../moderation/content-hider'; 8 9 ··· 25 26 } 26 27 27 28 const Embed = (props: EmbedProps) => { 28 - const { media, record } = unwrapEmbed(props.embed); 29 + const { media, record } = unwrapEmbedView(props.embed); 29 30 30 31 const gutterTop = props.gutterTop; 31 32 const large = props.large; ··· 42 43 43 44 interface MediaEmbedProps { 44 45 /** Expected to be static */ 45 - embed: MediaEmbed; 46 + embed: MediaEmbedView; 46 47 moderation?: ModerationCause[]; 47 48 } 48 49 ··· 75 76 76 77 interface RecordEmbedProps { 77 78 /** Expected to be static */ 78 - embed: RecordEmbed; 79 + embed: RecordEmbedView; 79 80 /** Expected to be static */ 80 81 large?: boolean; 81 82 } ··· 99 100 } 100 101 101 102 if (type === 'app.bsky.embed.record#viewNotFound' || type === 'app.bsky.embed.record#viewBlocked') { 102 - const uri = assertCanonicalResourceUri(embed.uri); 103 + const uri = parseAtUri(embed.uri); 103 104 104 105 if (type === 'app.bsky.embed.record#viewBlocked' && uri.collection === 'app.bsky.feed.post') { 105 106 return <QuoteBlockedEmbed embed={embed} uri={uri} />;
+1 -1
src/components/embeds/external-embed.tsx
··· 1 1 import { type JSX, createSignal } from 'solid-js'; 2 2 3 - import type { AppBskyEmbedExternal } from '@atcute/bluesky'; 3 + import type { AppBskyEmbedExternal } from '@atcute/client/lexicons'; 4 4 5 5 import { safeUrlParse } from '~/api/utils/strings'; 6 6
+3 -3
src/components/embeds/feed-embed.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 3 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 4 4 import { useQueryClient } from '@mary/solid-query'; 5 5 6 6 import { moderateGeneric } from '~/api/moderation/entities/generic'; 7 7 import { precacheFeed } from '~/api/queries-cache/feed-precache'; 8 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 8 + import { parseAtUri } from '~/api/types/at-uri'; 9 9 10 10 import { inject } from '~/lib/states/singleton'; 11 11 import ModerationService from '~/lib/states/singletons/moderation'; ··· 26 26 27 27 const moderation = createMemo(() => moderateGeneric(feed, feed.creator.did, moderationOptions())); 28 28 29 - const href = `/${feed.creator.did}/feeds/${assertCanonicalResourceUri(feed.uri).rkey}`; 29 + const href = `/${feed.creator.did}/feeds/${parseAtUri(feed.uri).rkey}`; 30 30 31 31 return ( 32 32 <a
+1 -1
src/components/embeds/image-grid-embed.tsx
··· 1 - import type { AppBskyEmbedImages } from '@atcute/bluesky'; 1 + import type { AppBskyEmbedImages } from '@atcute/client/lexicons'; 2 2 3 3 export interface ImageGridEmbedProps { 4 4 /** Expected to be static */
+1 -1
src/components/embeds/image-standalone-embed.tsx
··· 1 - import type { AppBskyEmbedImages } from '@atcute/bluesky'; 1 + import type { AppBskyEmbedImages } from '@atcute/client/lexicons'; 2 2 3 3 import { openModal } from '~/globals/modals'; 4 4
+1 -1
src/components/embeds/lib/image-utils.ts
··· 1 - import type { AppBskyEmbedImages } from '@atcute/bluesky'; 1 + import type { AppBskyEmbedImages } from '@atcute/client/lexicons'; 2 2 3 3 const clamp = (value: number, min: number, max: number): number => { 4 4 return Math.max(min, Math.min(max, value));
+1 -1
src/components/embeds/lib/snippet.tsx
··· 1 - import type { AppBskyEmbedExternal } from '@atcute/bluesky'; 1 + import type { AppBskyEmbedExternal } from '@atcute/client/lexicons'; 2 2 3 3 import { safeUrlParse } from '~/api/utils/strings'; 4 4
+1 -1
src/components/embeds/list-embed.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyGraphDefs } from '@atcute/bluesky'; 3 + import type { AppBskyGraphDefs } from '@atcute/client/lexicons'; 4 4 5 5 import { moderateGeneric } from '~/api/moderation/entities/generic'; 6 6
+4 -1
src/components/embeds/players/gif-player.tsx
··· 1 + import { nanoid } from 'nanoid/non-secure'; 1 2 import { createEffect, createSignal, onCleanup } from 'solid-js'; 2 3 3 4 import { globalEvents } from '~/globals/events'; ··· 13 14 } 14 15 15 16 const GifPlayer = ({ snippet }: GifPlayerProps) => { 17 + const playerId = nanoid(); 18 + 16 19 const [playing, setPlaying] = createSignal(false); 17 20 const [stalling, setStalling] = createSignal(false); 18 21 ··· 64 67 } 65 68 }} 66 69 onPlay={() => { 67 - globalEvents.emit('mediaplay'); 70 + globalEvents.emit('mediaplay', playerId); 68 71 setPlaying(true); 69 72 }} 70 73 onPause={() => {
+4 -1
src/components/embeds/players/video-player.tsx
··· 1 1 import type * as h from 'hls.js'; 2 2 import Hls from 'hls.js/dist/hls.light.js'; 3 + import { nanoid } from 'nanoid/non-secure'; 3 4 import { createEffect, createSignal, onCleanup } from 'solid-js'; 4 5 5 - import type { AppBskyEmbedVideo } from '@atcute/bluesky'; 6 + import type { AppBskyEmbedVideo } from '@atcute/client/lexicons'; 6 7 7 8 import { globalEvents } from '~/globals/events'; 8 9 ··· 20 21 const { currentAccount } = useSession(); 21 22 22 23 const [playing, setPlaying] = createSignal(false); 24 + const playerId = nanoid(); 23 25 24 26 const hls = new Hls({ 25 27 capLevelToPlayerSize: true, ··· 88 90 playsinline 89 91 autoplay 90 92 onPlay={() => { 93 + globalEvents.emit('mediaplay', playerId); 91 94 setPlaying(true); 92 95 }} 93 96 onPause={() => {
+4 -3
src/components/embeds/quote-blocked-embed.tsx
··· 1 - import type { AppBskyEmbedRecord } from '@atcute/bluesky'; 2 - import type { ParsedCanonicalResourceUri } from '@atcute/lexicons'; 1 + import type { AppBskyEmbedRecord } from '@atcute/client/lexicons'; 2 + 3 + import type { ParsedAtUri } from '~/api/types/at-uri'; 3 4 4 5 import BlockOutlinedIcon from '../icons-central/block-outline'; 5 6 6 7 export interface QuoteBlockedEmbedProps { 7 8 embed: AppBskyEmbedRecord.ViewBlocked; 8 - uri: ParsedCanonicalResourceUri; 9 + uri: ParsedAtUri; 9 10 } 10 11 11 12 const QuoteBlockedEmbed = ({ embed, uri }: QuoteBlockedEmbedProps) => {
+6 -5
src/components/embeds/quote-embed.tsx
··· 1 1 import { type JSX, createMemo } from 'solid-js'; 2 2 3 - import { AppBskyEmbedRecord, AppBskyFeedPost, unwrapMediaEmbed } from '@atcute/bluesky'; 3 + import type { AppBskyEmbedRecord, AppBskyFeedPost } from '@atcute/client/lexicons'; 4 4 5 5 import { getModerationUI } from '~/api/moderation'; 6 6 import { ContextContentMedia } from '~/api/moderation/constants'; 7 7 import { moderateQuote } from '~/api/moderation/entities/quote'; 8 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 8 + import { parseAtUri } from '~/api/types/at-uri'; 9 + import { unwrapMediaEmbedView } from '~/api/utils/bluesky/embed-view'; 9 10 10 11 import { inject } from '~/lib/states/singleton'; 11 12 import ModerationService from '~/lib/states/singletons/moderation'; ··· 28 29 const QuoteEmbed = ({ quote, interactive, large }: QuoteEmbedProps) => { 29 30 const moderationOptions = inject(ModerationService); 30 31 31 - const record = quote.value as AppBskyFeedPost.Main; 32 + const record = quote.value as AppBskyFeedPost.Record; 32 33 const author = quote.author; 33 34 34 - const uri = assertCanonicalResourceUri(quote.uri); 35 + const uri = parseAtUri(quote.uri); 35 36 const href = `/${author.did}/${uri.rkey}`; 36 37 37 38 const text = record.text.trim(); 38 - const media = unwrapMediaEmbed(quote.embeds?.[0]); 39 + const media = unwrapMediaEmbedView(quote.embeds?.[0]); 39 40 40 41 const moderation = createMemo(() => moderateQuote(quote, moderationOptions())); 41 42
+1 -1
src/components/embeds/video-embed.tsx
··· 1 1 import { Show, Suspense, createSignal, lazy } from 'solid-js'; 2 2 3 - import { AppBskyEmbedDefs, AppBskyEmbedVideo } from '@atcute/bluesky'; 3 + import type { AppBskyEmbedDefs, AppBskyEmbedVideo } from '@atcute/client/lexicons'; 4 4 5 5 import { replaceVideoCdnUrl } from '~/lib/bsky/video'; 6 6
+3 -5
src/components/error-view.tsx
··· 1 1 import { Match, Switch } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 4 - import { ClientResponseError } from '@atcute/client'; 3 + import { XRPCError } from '@atcute/client'; 4 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 5 5 import { TokenRefreshError } from '@atcute/oauth-browser-client'; 6 6 import { useQueryClient } from '@mary/solid-query'; 7 7 ··· 65 65 export default ErrorView; 66 66 67 67 const isInvalidTokenError = (err: unknown): boolean => { 68 - return ( 69 - err instanceof TokenRefreshError || (err instanceof ClientResponseError && err.error === 'invalid_token') 70 - ); 68 + return err instanceof TokenRefreshError || (err instanceof XRPCError && err.kind === 'invalid_token'); 71 69 };
+3 -3
src/components/explore/my-feeds-section.tsx
··· 1 1 import { For, createMemo } from 'solid-js'; 2 2 3 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 3 + import { parseAtUri } from '~/api/types/at-uri'; 4 4 5 5 import type { SavedFeed } from '~/lib/preferences/account'; 6 6 import { useSession } from '~/lib/states/session'; ··· 55 55 let href: string; 56 56 switch (type) { 57 57 case 'generator': { 58 - const uri = assertCanonicalResourceUri(feed.info.uri); 58 + const uri = parseAtUri(feed.info.uri); 59 59 href = `/${uri.repo}/feeds/${uri.rkey}`; 60 60 break; 61 61 } 62 62 case 'list': { 63 - const uri = assertCanonicalResourceUri(feed.info.uri); 63 + const uri = parseAtUri(feed.info.uri); 64 64 href = `/${uri.repo}/lists/${uri.rkey}`; 65 65 break; 66 66 }
+7 -3
src/components/feeds/feed-info-prompt.tsx
··· 1 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 1 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 2 2 3 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 3 + import { parseAtUri } from '~/api/types/at-uri'; 4 4 5 5 import { useModalContext } from '~/globals/modals'; 6 6 7 7 import { formatLong } from '~/lib/intl/number'; 8 8 9 9 import Avatar from '~/components/avatar'; 10 + import Button from '~/components/button'; 11 + import Divider from '~/components/divider'; 10 12 import * as Prompt from '~/components/prompt'; 13 + 14 + import HeartOutlinedIcon from '../icons-central/heart-outline'; 11 15 12 16 export interface FeedInfoPromptProps { 13 17 /** Expected to be static */ ··· 20 24 const feed = props.feed; 21 25 22 26 const authorUrl = `/${feed.creator.did}`; 23 - const feedUrl = `${authorUrl}/feeds/${assertCanonicalResourceUri(feed.uri).rkey}`; 27 + const feedUrl = `${authorUrl}/feeds/${parseAtUri(feed.uri).rkey}`; 24 28 25 29 return ( 26 30 <Prompt.Container maxWidth="md">
+3 -3
src/components/feeds/feed-item.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 3 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 4 4 import { useQueryClient } from '@mary/solid-query'; 5 5 6 6 import { moderateGeneric } from '~/api/moderation/entities/generic'; 7 7 import { precacheFeed } from '~/api/queries-cache/feed-precache'; 8 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 8 + import { parseAtUri } from '~/api/types/at-uri'; 9 9 10 10 import { history } from '~/globals/navigation'; 11 11 ··· 27 27 const moderationOptions = inject(ModerationService); 28 28 29 29 const creator = item.creator; 30 - const href = `/${creator.did}/feeds/${assertCanonicalResourceUri(item.uri).rkey}`; 30 + const href = `/${creator.did}/feeds/${parseAtUri(item.uri).rkey}`; 31 31 32 32 const moderation = createMemo(() => moderateGeneric(item, creator.did, moderationOptions())); 33 33
+3 -4
src/components/feeds/feed-overflow-menu.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 3 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 4 4 5 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 5 + import { parseAtUri } from '~/api/types/at-uri'; 6 6 7 7 import { useModalContext } from '~/globals/modals'; 8 8 ··· 83 83 icon={OpenInNewOutlinedIcon} 84 84 label="Open in Bluesky app" 85 85 onClick={() => { 86 - const { repo, rkey } = assertCanonicalResourceUri(feed.uri); 87 - const uri = `https://bsky.app/profile/${repo}/feed/${rkey}`; 86 + const uri = `https://bsky.app/profile/${feed.creator.did}/feed/${parseAtUri(feed.uri).rkey}`; 88 87 89 88 close(); 90 89 window.open(uri, '_blank');
+7 -18
src/components/list.tsx
··· 3 3 import { getQueryErrorInfo } from '~/api/utils/query'; 4 4 5 5 import { ifIntersect } from '~/lib/element-refs'; 6 - import { useIsFocused } from '~/lib/navigation/router'; 7 6 8 7 import CircularProgress from './circular-progress'; 8 + import EndOfListView from './end-of-list-view'; 9 9 import ErrorView from './error-view'; 10 10 11 11 export interface ListProps<T> { ··· 93 93 <div 94 94 ref={(node) => { 95 95 if (onEndReached) { 96 - const isFocused = useIsFocused(); 97 - 98 - ifIntersect( 99 - node, 100 - () => !props.isFetchingNextPage && !props.isRefreshing && props.hasNextPage && isFocused(), 101 - onEndReached, 102 - { rootMargin: '200% 0%' }, 103 - ); 96 + ifIntersect(node, () => !props.isFetchingNextPage && props.hasNextPage, onEndReached, { 97 + rootMargin: `150% 0%`, 98 + }); 104 99 } 105 100 }} 106 - class="h-[50svh] shrink-0" 101 + class="grid h-13 shrink-0 place-items-center" 107 102 > 108 - <div class="grid place-items-center py-8"> 109 - <CircularProgress /> 110 - </div> 103 + <CircularProgress /> 111 104 </div> 112 105 </Match> 113 106 114 107 <Match when={props.data}> 115 - <div class="h-[50svh] shrink-0"> 116 - <div class="grid place-items-center py-8"> 117 - <div class="h-1 w-1 rounded-full bg-contrast-muted"></div> 118 - </div> 119 - </div> 108 + <EndOfListView /> 120 109 </Match> 121 110 </Switch> 122 111 </div>
+3 -3
src/components/lists/lib/utils.ts
··· 1 - import type { AppBskyGraphDefs } from '@atcute/bluesky'; 1 + import type { AppBskyGraphDefs } from '@atcute/client/lexicons'; 2 2 3 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 3 + import { parseAtUri } from '~/api/types/at-uri'; 4 4 5 5 export const getListPurposeLabel = (purpose: AppBskyGraphDefs.ListPurpose) => { 6 6 switch (purpose) { ··· 15 15 16 16 export const getListUrl = (list: AppBskyGraphDefs.ListView) => { 17 17 const did = list.creator.did; 18 - const { rkey } = assertCanonicalResourceUri(list.uri); 18 + const { rkey } = parseAtUri(list.uri); 19 19 20 20 switch (list.purpose) { 21 21 case 'app.bsky.graph.defs#curatelist':
+1 -1
src/components/lists/list-item.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyGraphDefs } from '@atcute/bluesky'; 3 + import type { AppBskyGraphDefs } from '@atcute/client/lexicons'; 4 4 import { useQueryClient } from '@mary/solid-query'; 5 5 6 6 import { moderateGeneric } from '~/api/moderation/entities/generic';
+12 -7
src/components/main/sign-in-dialog.tsx
··· 1 1 import { Match, Switch, createSignal, onMount } from 'solid-js'; 2 2 3 - import type { ActorIdentifier, Did } from '@atcute/lexicons'; 3 + import type { At } from '@atcute/client/lexicons'; 4 4 import { 5 - type AuthorizeTargetOptions, 5 + type AuthorizationServerMetadata, 6 + type IdentityMetadata, 6 7 OAuthResponseError, 7 8 ResolverError, 8 9 createAuthorizationUrl, 10 + resolveFromIdentity, 11 + resolveFromService, 9 12 } from '@atcute/oauth-browser-client'; 10 13 import { createMutation } from '@mary/solid-query'; 11 14 ··· 24 27 } 25 28 26 29 export interface SignInDialogProps { 27 - relogin?: { did: Did; handle?: string }; 30 + relogin?: { did: At.DID; handle?: string }; 28 31 } 29 32 30 33 const SignInDialog = (props: SignInDialogProps) => { ··· 39 42 async mutationFn({ identifier, pds }: { identifier?: string; pds?: string }) { 40 43 setPending(`Resolving your identity`); 41 44 42 - let target: AuthorizeTargetOptions; 45 + let metadata: AuthorizationServerMetadata; 46 + let identity: IdentityMetadata | undefined; 43 47 44 48 if (identifier) { 45 - target = { type: 'account', identifier: identifier as ActorIdentifier }; 49 + ({ metadata, identity } = await resolveFromIdentity(identifier)); 46 50 } else if (pds) { 47 - target = { type: 'pds', serviceUrl: pds }; 51 + ({ metadata } = await resolveFromService(pds)); 48 52 } else { 49 53 assert(false); 50 54 } ··· 52 56 setPending(`Contacting your data server`); 53 57 54 58 const authUrl = await createAuthorizationUrl({ 55 - target: target, 59 + metadata: metadata, 60 + identity: identity, 56 61 scope: import.meta.env.VITE_OAUTH_SCOPE, 57 62 }); 58 63
+31 -35
src/components/moderation/block-account-prompt.tsx
··· 1 1 import { Match, Switch } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 4 - import { type Did } from '@atcute/lexicons'; 3 + import type { AppBskyActorDefs, At } from '@atcute/client/lexicons'; 5 4 import { QueryClient, createMutation } from '@mary/solid-query'; 6 5 7 - import { type ProfileShadowView, updateProfileShadow, useProfileShadow } from '~/api/cache/profile-shadow'; 6 + import { updateProfileShadow, useProfileShadow } from '~/api/cache/profile-shadow'; 8 7 import { createListMetaQuery } from '~/api/queries/list'; 9 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 8 + import { parseAtUri } from '~/api/types/at-uri'; 10 9 import { getCurrentDate } from '~/api/utils/misc'; 11 10 import { createRecord, deleteRecord } from '~/api/utils/records'; 12 11 ··· 23 22 import * as Prompt from '../prompt'; 24 23 25 24 export interface BlockAccountPrompt { 25 + /** Expected to be static */ 26 26 profile: AppBskyActorDefs.ProfileViewDetailed; 27 27 } 28 28 29 29 const BlockAccountPrompt = (props: BlockAccountPrompt) => { 30 - const profile = () => props.profile; 31 - const shadow = useProfileShadow(profile); 30 + const profile = props.profile; 31 + const shadow = useProfileShadow(props.profile); 32 32 33 33 return ( 34 34 <Switch> 35 - <Match when={profile().viewer?.blockingByList}> 36 - <BlockedByList profile={profile()} shadow={shadow()} /> 35 + <Match when={/* @once */ profile.viewer?.blockingByList}> 36 + <BlockedByList {...props} /> 37 37 </Match> 38 38 39 39 <Match when={shadow().blockUri}> 40 - <UnblockPrompt profile={profile()} shadow={shadow()} /> 40 + <UnblockPrompt {...props} /> 41 41 </Match> 42 42 43 43 <Match when> 44 - <BlockPrompt profile={profile()} shadow={shadow()} /> 44 + <BlockPrompt {...props} /> 45 45 </Match> 46 46 </Switch> 47 47 ); ··· 49 49 50 50 export default BlockAccountPrompt; 51 51 52 - interface BlockAccountPromptInnerProps extends BlockAccountPrompt { 53 - shadow: ProfileShadowView; 54 - } 55 - 56 - const BlockPrompt = (props: BlockAccountPromptInnerProps) => { 52 + const BlockPrompt = ({ profile }: BlockAccountPrompt) => { 57 53 const { close } = useModalContext(); 58 54 59 55 const { currentAccount } = useSession(); 60 - const { client } = useAgent(); 56 + const { rpc } = useAgent(); 61 57 62 58 const mutation = createMutation((queryClient) => ({ 63 59 async mutationFn() { 64 - return await createRecord(client, { 60 + return await createRecord(rpc, { 65 61 repo: currentAccount!.did, 66 62 collection: 'app.bsky.graph.block', 67 63 record: { 68 64 $type: 'app.bsky.graph.block', 69 65 createdAt: getCurrentDate(), 70 - subject: props.profile.did, 66 + subject: profile.did, 71 67 }, 72 68 }); 73 69 }, 74 70 onSuccess(ret) { 75 71 close(); 76 - updateProfileShadow(queryClient, props.profile.did, { blockUri: ret.uri }); 72 + updateProfileShadow(queryClient, profile.did, { blockUri: ret.uri }); 77 73 78 74 setTimeout(() => { 79 - resetThreadQueries(queryClient, props.profile.did); 75 + resetThreadQueries(queryClient, profile.did); 80 76 }, 1_500); 81 77 }, 82 78 onError() { ··· 86 82 87 83 return ( 88 84 <Prompt.Container maxWidth="md" disabled={mutation.isPending}> 89 - <Prompt.Title>{/* @once */ `Block @${props.profile.handle.toLowerCase()}?`}</Prompt.Title> 85 + <Prompt.Title>{/* @once */ `Block @${profile.handle.toLowerCase()}?`}</Prompt.Title> 90 86 91 87 <Prompt.Description>Here's what happens if you do:</Prompt.Description> 92 88 ··· 126 122 ); 127 123 }; 128 124 129 - const UnblockPrompt = (props: BlockAccountPromptInnerProps) => { 125 + const UnblockPrompt = ({ profile }: BlockAccountPrompt) => { 130 126 const { close } = useModalContext(); 131 127 132 - const { client } = useAgent(); 128 + const { rpc } = useAgent(); 129 + const { repo, rkey } = parseAtUri(profile.viewer!.blocking!); 133 130 134 131 const mutation = createMutation((queryClient) => ({ 135 132 async mutationFn() { 136 - const uri = assertCanonicalResourceUri(props.shadow.blockUri!); 137 - 138 - return await deleteRecord(client, { 139 - repo: uri.repo, 133 + return await deleteRecord(rpc, { 134 + repo: repo as At.DID, 140 135 collection: 'app.bsky.graph.block', 141 - rkey: uri.rkey, 136 + rkey: rkey, 142 137 }); 143 138 }, 144 139 onSuccess() { 145 140 close(); 146 - updateProfileShadow(queryClient, props.profile.did, { blockUri: undefined }); 141 + updateProfileShadow(queryClient, profile.did, { blockUri: undefined }); 147 142 148 143 setTimeout(() => { 149 - resetThreadQueries(queryClient, props.profile.did); 144 + resetThreadQueries(queryClient, profile.did); 150 145 }, 1_500); 151 146 }, 152 147 onError() { ··· 156 151 157 152 return ( 158 153 <Prompt.Container maxWidth="md" disabled={mutation.isPending}> 159 - <Prompt.Title>{/* @once */ `Unblock @${props.profile.handle.toLowerCase()}?`}</Prompt.Title> 154 + <Prompt.Title>{/* @once */ `Unblock @${profile.handle.toLowerCase()}?`}</Prompt.Title> 160 155 161 156 <Prompt.Description>Here's what happens if you do:</Prompt.Description> 162 157 ··· 196 191 ); 197 192 }; 198 193 199 - const BlockedByList = (props: BlockAccountPromptInnerProps) => { 194 + const BlockedByList = ({ profile }: BlockAccountPrompt) => { 200 195 const { close } = useModalContext(); 201 196 202 - const query = createListMetaQuery(() => props.profile.viewer!.blockingByList!.uri); 197 + const listBasic = profile.viewer!.blockingByList!; 198 + const query = createListMetaQuery(() => listBasic.uri); 203 199 204 200 return ( 205 201 <Prompt.Container> 206 - <Prompt.Title>{/* @once */ `Can't unblock @${props.profile.handle.toLowerCase()}`}</Prompt.Title> 202 + <Prompt.Title>{/* @once */ `Can't unblock @${profile.handle.toLowerCase()}`}</Prompt.Title> 207 203 <Prompt.Description> 208 204 You've currently opted to block all accounts that are in this moderation list: 209 205 </Prompt.Description> ··· 229 225 ); 230 226 }; 231 227 232 - const resetThreadQueries = (queryClient: QueryClient, did: Did) => { 228 + const resetThreadQueries = (queryClient: QueryClient, did: At.DID) => { 233 229 const substring = `at://${did}/`; 234 230 235 231 queryClient.resetQueries({
+1 -1
src/components/moderation/labels-on-me.tsx
··· 1 1 import { Show } from 'solid-js'; 2 2 3 - import type { ComAtprotoLabelDefs } from '@atcute/atproto'; 3 + import type { ComAtprotoLabelDefs } from '@atcute/client/lexicons'; 4 4 5 5 import { useSession } from '~/lib/states/session'; 6 6
+13 -20
src/components/moderation/mute-account-prompt.tsx
··· 1 1 import { Match, Switch, onMount } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 4 - import { ok } from '@atcute/client'; 3 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 5 4 import { createMutation } from '@mary/solid-query'; 6 5 7 6 import { updateProfileShadow, useProfileShadow } from '~/api/cache/profile-shadow'; ··· 50 49 const MutePrompt = ({ profile }: MuteAccountPromptProps) => { 51 50 const { close } = useModalContext(); 52 51 53 - const { client } = useAgent(); 52 + const { rpc } = useAgent(); 54 53 55 54 const mutation = createMutation((queryClient) => ({ 56 55 async mutationFn() { 57 - await ok( 58 - client.post('app.bsky.graph.muteActor', { 59 - as: null, 60 - input: { 61 - actor: profile.did, 62 - }, 63 - }), 64 - ); 56 + await rpc.call('app.bsky.graph.muteActor', { 57 + data: { 58 + actor: profile.did, 59 + }, 60 + }); 65 61 }, 66 62 onSuccess() { 67 63 close(); ··· 119 115 const UnmutePrompt = ({ profile }: MuteAccountPromptProps) => { 120 116 const { close } = useModalContext(); 121 117 122 - const { client } = useAgent(); 118 + const { rpc } = useAgent(); 123 119 124 120 const mutation = createMutation((queryClient) => ({ 125 121 async mutationFn() { 126 - await ok( 127 - client.post('app.bsky.graph.unmuteActor', { 128 - as: null, 129 - input: { 130 - actor: profile.did, 131 - }, 132 - }), 133 - ); 122 + await rpc.call('app.bsky.graph.unmuteActor', { 123 + data: { 124 + actor: profile.did, 125 + }, 126 + }); 134 127 }, 135 128 onSuccess() { 136 129 close();
+13 -15
src/components/notifications/notification-item.tsx
··· 1 1 import { type Component, type ComponentProps, type JSX, createMemo } from 'solid-js'; 2 2 3 - import { 4 - type AppBskyEmbedImages, 5 - type AppBskyFeedDefs, 6 - type AppBskyFeedPost, 7 - type AppBskyNotificationListNotifications, 8 - type MediaEmbed, 9 - unwrapMediaEmbed, 10 - } from '@atcute/bluesky'; 3 + import type { 4 + AppBskyEmbedImages, 5 + AppBskyFeedDefs, 6 + AppBskyFeedPost, 7 + AppBskyNotificationListNotifications, 8 + } from '@atcute/client/lexicons'; 11 9 import { useQueryClient } from '@mary/solid-query'; 12 10 13 11 import { getModerationUI } from '~/api/moderation'; ··· 21 19 NotificationSlice, 22 20 RepostNotificationSlice, 23 21 } from '~/api/queries/notification-feed'; 24 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 22 + import { parseAtUri } from '~/api/types/at-uri'; 23 + import { type MediaEmbedView, unwrapMediaEmbedView } from '~/api/utils/bluesky/embed-view'; 25 24 26 25 import { history } from '~/globals/navigation'; 27 26 ··· 96 95 } 97 96 } else { 98 97 const post = item.view; 99 - const { repo, rkey } = assertCanonicalResourceUri(post.uri); 100 - 101 - href = `/${repo}/${rkey}`; 98 + const uri = parseAtUri(post.uri); 99 + href = `/${uri.repo}/${uri.rkey}`; 102 100 } 103 101 104 102 if (isElementAltClicked(ev)) { ··· 236 234 237 235 if (type === 'like' || type === 'repost') { 238 236 const post = data.view; 239 - const record = post.record as AppBskyFeedPost.Main; 237 + const record = post.record as AppBskyFeedPost.Record; 240 238 241 - const media = unwrapMediaEmbed(post.embed); 239 + const media = unwrapMediaEmbedView(post.embed); 242 240 const gif = maybeUnwrapGifEmbed(media); 243 241 244 242 return ( ··· 302 300 ); 303 301 }; 304 302 305 - const maybeUnwrapGifEmbed = (embed: MediaEmbed | undefined): BlueskyGifSnippet | undefined => { 303 + const maybeUnwrapGifEmbed = (embed: MediaEmbedView | undefined): BlueskyGifSnippet | undefined => { 306 304 if (embed?.$type === 'app.bsky.embed.external#view') { 307 305 const snippet = detectSnippet(embed.external); 308 306 if (snippet.type !== SnippetType.BLUESKY_GIF) {
+5 -10
src/components/paged-list.tsx
··· 6 6 import { useIsFocused } from '~/lib/navigation/router'; 7 7 8 8 import CircularProgress from './circular-progress'; 9 + import EndOfListView from './end-of-list-view'; 9 10 import ErrorView from './error-view'; 10 11 11 12 export interface PagedListProps<T> { ··· 99 100 node, 100 101 () => !props.isFetchingNextPage && !props.isRefreshing && props.hasNextPage && isFocused(), 101 102 onEndReached, 102 - { rootMargin: '200% 0%' }, 103 + { rootMargin: '150% 0%' }, 103 104 ); 104 105 } 105 106 }} 106 - class="h-[50svh] shrink-0" 107 + class="grid h-13 shrink-0 place-items-center" 107 108 > 108 - <div class="grid place-items-center py-8"> 109 - <CircularProgress /> 110 - </div> 109 + <CircularProgress /> 111 110 </div> 112 111 </Match> 113 112 114 113 <Match when={hasFallback && isEmpty()}>{props.fallback}</Match> 115 114 116 115 <Match when={props.data}> 117 - <div class="h-[50svh] shrink-0"> 118 - <div class="grid place-items-center py-8"> 119 - <div class="h-1 w-1 rounded-full bg-contrast-muted"></div> 120 - </div> 121 - </div> 116 + <EndOfListView /> 122 117 </Match> 123 118 </Switch> 124 119 </div>
+10 -11
src/components/profiles/edit-profile-dialog.tsx
··· 1 1 import { Show, createMemo, createSignal } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 4 - import { ClientResponseError } from '@atcute/client'; 5 - import type { Blob as AtpBlob } from '@atcute/lexicons'; 3 + import { XRPCError } from '@atcute/client'; 4 + import type { AppBskyActorDefs, At } from '@atcute/client/lexicons'; 6 5 import { createMutation } from '@mary/solid-query'; 7 6 8 7 import { uploadBlob } from '~/api/queries/blob'; ··· 35 34 const EditProfileDialog = ({ profile }: EditProfileDialogProps) => { 36 35 const { close } = useModalContext(); 37 36 38 - const { client } = useAgent(); 37 + const { rpc } = useAgent(); 39 38 const { currentAccount } = useSession(); 40 39 41 40 const snapshot = { ··· 75 74 const $avatar = avatar(); 76 75 const $banner = banner(); 77 76 78 - let avatarPromise: Promise<AtpBlob<any>> | undefined; 79 - let bannerPromise: Promise<AtpBlob<any>> | undefined; 77 + let avatarPromise: Promise<At.Blob<any>> | undefined; 78 + let bannerPromise: Promise<At.Blob<any>> | undefined; 80 79 81 80 if ($avatar instanceof Blob) { 82 - avatarPromise = compressProfileImage($avatar, 1000, 1000).then((res) => uploadBlob(client, res.blob)); 81 + avatarPromise = compressProfileImage($avatar, 1000, 1000).then((res) => uploadBlob(rpc, res.blob)); 83 82 } 84 83 if ($banner instanceof Blob) { 85 - bannerPromise = compressProfileImage($banner, 3000, 1000).then((res) => uploadBlob(client, res.blob)); 84 + bannerPromise = compressProfileImage($banner, 3000, 1000).then((res) => uploadBlob(rpc, res.blob)); 86 85 } 87 86 88 87 let retriesRemaining = 3; 89 88 while (true) { 90 - const existing = await getRecord(client, { 89 + const existing = await getRecord(rpc, { 91 90 repo, 92 91 collection: 'app.bsky.actor.profile', 93 92 rkey: 'self', ··· 115 114 } 116 115 117 116 try { 118 - await putRecord(client, { 117 + await putRecord(rpc, { 119 118 repo, 120 119 collection: 'app.bsky.actor.profile', 121 120 rkey: 'self', ··· 123 122 swapRecord: existing?.cid ?? null, 124 123 }); 125 124 } catch (err) { 126 - if (err instanceof ClientResponseError && err.error === 'InvalidSwapError') { 125 + if (err instanceof XRPCError && err.kind === 'InvalidSwapError') { 127 126 if (retriesRemaining--) { 128 127 continue; 129 128 }
+1 -1
src/components/profiles/handle-overflow-menu.tsx
··· 1 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 1 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 2 2 3 3 import { useModalContext } from '~/globals/modals'; 4 4
+1 -1
src/components/profiles/profile-follow-button.tsx
··· 1 1 import { type JSX, createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 3 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 4 5 5 import { useProfileShadow } from '~/api/cache/profile-shadow'; 6 6 import { createProfileFollowMutation } from '~/api/mutations/profile';
+1 -1
src/components/profiles/profile-item-pressable.tsx
··· 1 1 import { type JSX, createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 3 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 4 5 5 import { moderateProfile } from '~/api/moderation/entities/profile'; 6 6
+1 -1
src/components/profiles/profile-item.tsx
··· 1 1 import { type JSX, createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 3 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 4 import { useQueryClient } from '@mary/solid-query'; 5 5 6 6 import { moderateProfile } from '~/api/moderation/entities/profile';
+1 -1
src/components/profiles/profile-overflow-menu.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 3 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 4 5 5 import { useProfileShadow } from '~/api/cache/profile-shadow'; 6 6
+4 -4
src/components/profiles/profile-view-header.tsx
··· 1 1 import { type Component, type ComponentProps, type JSX, Match, Show, Switch, createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 3 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 4 5 5 import { useProfileShadow } from '~/api/cache/profile-shadow'; 6 6 import { getModerationUI } from '~/api/moderation'; 7 7 import { ContextProfileMedia, ContextProfileView } from '~/api/moderation/constants'; 8 8 import { moderateProfile } from '~/api/moderation/entities/profile'; 9 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 9 + import { parseAtUri } from '~/api/types/at-uri'; 10 10 11 11 import { openModal } from '~/globals/modals'; 12 12 ··· 259 259 <Match when={viewer()?.mutedByList}> 260 260 {(list) => { 261 261 const href = () => { 262 - const { repo, rkey } = assertCanonicalResourceUri(list().uri); 263 - return `/${repo}/lists/${rkey}`; 262 + const uri = parseAtUri(list().uri); 263 + return `/${uri.repo}/lists/${uri.rkey}`; 264 264 }; 265 265 266 266 return (
+6 -1
src/components/prompt.tsx
··· 74 74 } 75 75 76 76 const PromptTitle = (props: PromptTitleProps) => { 77 - return <h1 class="mb-1 break-words text-lg font-bold">{props.children}</h1>; 77 + const isDesktop = useMediaQuery('(width >= 688px) and (height >= 500px)'); 78 + return ( 79 + <h1 class={`mb-1 break-words font-bold` + (!isDesktop() ? ` text-base` : ` text-xl`)}> 80 + {props.children} 81 + </h1> 82 + ); 78 83 }; 79 84 80 85 export { PromptTitle as Title };
+4 -6
src/components/rich-text.tsx
··· 1 1 import type { JSX } from 'solid-js'; 2 2 3 - import type { BlueMojiRichtextFacet } from '@atcute/bluemoji'; 4 - import type { AppBskyRichtextFacet } from '@atcute/bluesky'; 5 3 import { segmentize } from '@atcute/bluesky-richtext-segmenter'; 4 + import type { AppBskyRichtextFacet } from '@atcute/client/lexicons'; 6 5 7 6 import { isLinkValid } from '~/api/utils/strings'; 8 7 ··· 65 64 66 65 break; 67 66 } else if (type === 'blue.moji.richtext.facet') { 68 - const feat = feature as BlueMojiRichtextFacet.Main; 69 - const formats = feat.formats; 67 + const formats = feature.formats; 70 68 if (formats.$type !== 'blue.moji.richtext.facet#formats_v0' || !formats.png_128) { 71 69 continue; 72 70 } 73 71 74 72 node = ( 75 73 <img 76 - src={/* @once */ getCdnUrl(feat.did, formats.png_128)} 77 - title={/* @once */ feat.name} 74 + src={/* @once */ getCdnUrl(feature.did, formats.png_128)} 75 + title={/* @once */ feature.name} 78 76 class={`mx-px inline-block align-top text-[0]` + (!large ? ` h-5 w-5` : ` h-6 w-6`)} 79 77 /> 80 78 );
+8 -11
src/components/search/suggestions/from-actor-autocompletion-view.tsx
··· 1 1 import { For, Show, createMemo } from 'solid-js'; 2 2 3 - import { ok } from '@atcute/client'; 4 3 import { createQuery, keepPreviousData } from '@mary/solid-query'; 5 4 6 5 import { createProfileQuery } from '~/api/queries/profile'; ··· 18 17 }) => { 19 18 const { currentAccount } = useSession(); 20 19 21 - const { client } = useAgent(); 20 + const { rpc } = useAgent(); 22 21 const isFocused = useIsFocused(); 23 22 24 23 const match = createMemo(() => { ··· 33 32 enabled: $match !== '' && isFocused(), 34 33 placeholderData: keepPreviousData, 35 34 async queryFn({ signal }) { 36 - const data = await ok( 37 - client.get('app.bsky.actor.searchActorsTypeahead', { 38 - signal, 39 - params: { 40 - q: $match, 41 - limit: 10, 42 - }, 43 - }), 44 - ); 35 + const { data } = await rpc.get('app.bsky.actor.searchActorsTypeahead', { 36 + signal, 37 + params: { 38 + q: $match, 39 + limit: 10, 40 + }, 41 + }); 45 42 46 43 return data; 47 44 },
+7 -10
src/components/settings/app-passwords/add-app-password-prompt.tsx
··· 1 1 import { Match, Switch, createSignal } from 'solid-js'; 2 2 3 - import { ok } from '@atcute/client'; 4 3 import { createMutation } from '@mary/solid-query'; 5 4 6 5 import { autofocusNode, modelChecked, modelText } from '~/lib/input-refs'; ··· 14 13 export interface AddAppPasswordPromptProps {} 15 14 16 15 const AddAppPasswordPrompt = ({}: AddAppPasswordPromptProps) => { 17 - const { client } = useAgent(); 16 + const { rpc } = useAgent(); 18 17 19 18 const [name, setName] = createSignal(''); 20 19 const [privileged, setPrivileged] = createSignal(false); ··· 23 22 const mutation = createMutation((queryClient) => { 24 23 return { 25 24 async mutationFn() { 26 - const data = await ok( 27 - client.post('com.atproto.server.createAppPassword', { 28 - input: { 29 - name: name().replace(/^\s+|\s+$|(?<=\s)\s+/g, ''), 30 - privileged: privileged(), 31 - }, 32 - }), 33 - ); 25 + const { data } = await rpc.call('com.atproto.server.createAppPassword', { 26 + data: { 27 + name: name().replace(/^\s+|\s+$|(?<=\s)\s+/g, ''), 28 + privileged: privileged(), 29 + }, 30 + }); 34 31 35 32 return data; 36 33 },
+5 -5
src/components/settings/bluemoji/add-emote-prompt.tsx
··· 42 42 const AddEmotePrompt = ({ blob, onAdd }: AddEmotePromptProps) => { 43 43 const { close } = useModalContext(); 44 44 45 - const { client } = useAgent(); 45 + const { rpc } = useAgent(); 46 46 const { currentAccount } = useSession(); 47 47 48 48 const blobUrl = URL.createObjectURL(blob); ··· 71 71 72 72 const { png_128, webp_128 } = await getCompressedEmotes(blob, cover() ? 'cover' : 'contain'); 73 73 74 - const orig_prom = uploadBlob(client, blob); 75 - const png_prom = png_128 !== blob ? uploadBlob(client, png_128) : orig_prom; 76 - const webp_prom = webp_128 !== blob ? uploadBlob(client, webp_128) : orig_prom; 74 + const orig_prom = uploadBlob(rpc, blob); 75 + const png_prom = png_128 !== blob ? uploadBlob(rpc, png_128) : orig_prom; 76 + const webp_prom = webp_128 !== blob ? uploadBlob(rpc, webp_128) : orig_prom; 77 77 78 78 const [orig_blob, png_blob, webp_blob] = await Promise.all([orig_prom, png_prom, webp_prom]); 79 79 80 - await createRecord(client, { 80 + await createRecord(rpc, { 81 81 repo: currentAccount!.did, 82 82 collection: 'blue.moji.collection.item', 83 83 rkey: $name,
+3 -3
src/components/settings/content-translation/add-basa-instance-prompt.tsx
··· 1 1 import { createMemo, createSignal } from 'solid-js'; 2 2 3 - import { Client, ok, simpleFetchHandler } from '@atcute/client'; 3 + import { XRPC, simpleFetchHandler } from '@atcute/client'; 4 4 import { createMutation } from '@mary/solid-query'; 5 5 6 6 import { formatQueryError } from '~/api/utils/error'; ··· 47 47 48 48 const mutation = createMutation(() => ({ 49 49 async mutationFn({ url }: { url: URL }) { 50 - const client = new Client({ handler: simpleFetchHandler({ service: url }) }); 51 - await ok(client.get('x.basa.describeServer')); 50 + const rpc = new XRPC({ handler: simpleFetchHandler({ service: url }) }); 51 + await rpc.get('x.basa.describeServer', {}); 52 52 }, 53 53 onSuccess(_data, { url }) { 54 54 const href = url.toString();
+7 -7
src/components/threads/highlighted-post.tsx
··· 1 1 import { Show, createMemo } from 'solid-js'; 2 2 3 - import { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/bluesky'; 3 + import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/client/lexicons'; 4 4 5 5 import { usePostShadow } from '~/api/cache/post-shadow'; 6 6 import { getModerationUI } from '~/api/moderation'; 7 7 import { ContextContentView } from '~/api/moderation/constants'; 8 8 import { moderatePost } from '~/api/moderation/entities/post'; 9 9 import { createPostLikeMutation, createPostRepostMutation } from '~/api/mutations/post'; 10 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 10 + import { parseAtUri } from '~/api/types/at-uri'; 11 11 12 12 import { primarySystemLanguage } from '~/globals/locales'; 13 13 import { openModal } from '~/globals/modals'; ··· 58 58 const moderationOptions = inject(ModerationService); 59 59 60 60 const author = () => post().author; 61 - const record = () => post().record as AppBskyFeedPost.Main; 61 + const record = () => post().record as AppBskyFeedPost.Record; 62 62 const embed = () => post().embed; 63 63 64 64 const shadow = usePostShadow(post); 65 65 66 - const { rkey } = assertCanonicalResourceUri(post().uri); 66 + const uri = parseAtUri(post().uri); 67 67 const authorDid = author().did; 68 68 69 69 const isOurPost = currentAccount && authorDid === currentAccount.did; 70 70 71 71 const authorHref = `/${authorDid}`; 72 - const href = `/${authorDid}/${rkey}`; 72 + const href = `/${authorDid}/${uri.rkey}`; 73 73 74 74 const moderation = createMemo(() => moderatePost(post(), moderationOptions())); 75 75 const ui = createMemo(() => getModerationUI(moderation(), ContextContentView)); ··· 151 151 } 152 152 153 153 if (props.translate) { 154 - return <PostTranslation text={(post().record as AppBskyFeedPost.Main).text} />; 154 + return <PostTranslation text={(post().record as AppBskyFeedPost.Record).text} />; 155 155 } 156 156 157 157 if (needTranslation(post(), currentAccount.preferences.translation)) { ··· 274 274 return false; 275 275 } 276 276 277 - const record = post.record as AppBskyFeedPost.Main; 277 + const record = post.record as AppBskyFeedPost.Record; 278 278 const langs = record.langs; 279 279 280 280 if (!langs || langs.length < 1 || !record.text) {
+2 -2
src/components/threads/overflow-thread-item.tsx
··· 1 1 import type { OverflowAncestorItem, OverflowDescendantItem } from '~/api/models/post-thread'; 2 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 2 + import { parseAtUri } from '~/api/types/at-uri'; 3 3 4 4 import MoreHorizOutlinedIcon from '../icons-central/more-horiz-outline'; 5 5 ··· 20 20 return ( 21 21 <a 22 22 href={(() => { 23 - const uri = assertCanonicalResourceUri(props.item.uri); 23 + const uri = parseAtUri(props.item.uri); 24 24 return `/${uri.repo}/${uri.rkey}`; 25 25 })()} 26 26 class={
+6 -4
src/components/threads/post-thread-item.tsx
··· 1 1 import { type JSX, Show, createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyFeedPost } from '@atcute/bluesky'; 3 + import type { AppBskyFeedPost } from '@atcute/client/lexicons'; 4 4 import { useQueryClient } from '@mary/solid-query'; 5 5 6 6 import { usePostShadow } from '~/api/cache/post-shadow'; ··· 9 9 import { ContextContentList } from '~/api/moderation/constants'; 10 10 import { moderatePost } from '~/api/moderation/entities/post'; 11 11 import { precacheProfile } from '~/api/queries-cache/profile-precache'; 12 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 12 + import { parseAtUri } from '~/api/types/at-uri'; 13 13 14 14 import { history } from '~/globals/navigation'; 15 15 ··· 49 49 const post = () => item().post; 50 50 51 51 const author = () => post().author; 52 - const record = post().record as AppBskyFeedPost.Main; 52 + const record = post().record as AppBskyFeedPost.Record; 53 53 const embed = post().embed; 54 54 55 55 const shadow = usePostShadow(post); 56 56 57 + const uri = parseAtUri(post().uri); 57 58 const authorHref = `/${author().did}`; 58 - const href = `/${author().did}/${assertCanonicalResourceUri(post().uri).rkey}`; 59 + const href = `/${author().did}/${uri.rkey}`; 59 60 60 61 const isOurPost = currentAccount && currentAccount.did === author().did; 61 62 ··· 112 113 <div class="min-w-0 grow py-3"> 113 114 <PostMeta 114 115 post={/* @once */ post()} 116 + context={(item() as PostDescendantItem).context} 115 117 href={href} 116 118 authorHref={authorHref} 117 119 gutterBottom
+12 -12
src/components/threads/post-translation.tsx
··· 1 1 import { Match, Switch, createMemo, createSignal } from 'solid-js'; 2 2 3 - import { Client, ok, simpleFetchHandler } from '@atcute/client'; 3 + import { XRPC, simpleFetchHandler } from '@atcute/client'; 4 4 import { sampleOne } from '@mary/array-fns'; 5 5 import { createQuery } from '@mary/solid-query'; 6 6 ··· 66 66 targetLang = found; 67 67 } 68 68 69 - const client = new Client({ handler: simpleFetchHandler({ service: $instanceUrl! }) }); 70 - const data = await ok( 71 - client.get('x.basa.translate', { 72 - params: { 73 - engine: 'google', 74 - text: $text, 75 - from: $source, 76 - to: targetLang, 77 - }, 78 - }), 79 - ); 69 + console.log(targetLang); 70 + 71 + const rpc = new XRPC({ handler: simpleFetchHandler({ service: $instanceUrl! }) }); 72 + const { data } = await rpc.get('x.basa.translate', { 73 + params: { 74 + engine: 'google', 75 + text: $text, 76 + from: $source, 77 + to: targetLang, 78 + }, 79 + }); 80 80 81 81 return data; 82 82 },
+13 -54
src/components/timeline/delete-post-prompt.tsx
··· 1 - import { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/bluesky'; 2 - import { ClientResponseError, ok } from '@atcute/client'; 1 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 3 2 import { useQueryClient } from '@mary/solid-query'; 4 3 5 4 import { updatePostShadow } from '~/api/cache/post-shadow'; 6 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 5 + import { parseAtUri } from '~/api/types/at-uri'; 6 + import { deleteRecord } from '~/api/utils/records'; 7 7 8 8 import { useAgent } from '~/lib/states/agent'; 9 9 import { useSession } from '~/lib/states/session'; ··· 19 19 20 20 const DeletePostPrompt = ({ post, onPostDelete }: DeletePostPromptProps) => { 21 21 const { currentAccount } = useSession(); 22 - const { client } = useAgent(); 22 + const { rpc } = useAgent(); 23 23 24 24 const queryClient = useQueryClient(); 25 25 26 - const onDelete = async () => { 27 - const { rkey } = assertCanonicalResourceUri(post.uri); 28 - 29 - const write = await client.post('com.atproto.repo.applyWrites', { 30 - input: { 31 - repo: currentAccount!.did, 32 - writes: [ 33 - { 34 - $type: 'com.atproto.repo.applyWrites#delete', 35 - collection: 'app.bsky.feed.post', 36 - rkey: rkey, 37 - }, 38 - ], 39 - }, 26 + const onDelete = () => { 27 + const uri = parseAtUri(post.uri); 28 + const promise = deleteRecord(rpc, { 29 + repo: currentAccount!.did, 30 + collection: 'app.bsky.feed.post', 31 + rkey: uri.rkey, 40 32 }); 41 33 42 - if (write.ok) { 43 - updatePostShadow(queryClient, post.uri, { deleted: true }); 44 - onPostDelete?.(); 45 - return; 46 - } 34 + updatePostShadow(queryClient, post.uri, { deleted: true }); 47 35 48 - if (write.data.error !== 'InternalServerError') { 49 - throw new ClientResponseError(write); 36 + if (onPostDelete) { 37 + promise.then(onPostDelete); 50 38 } 51 - 52 - await ok( 53 - client.post('com.atproto.repo.putRecord', { 54 - input: { 55 - repo: currentAccount!.did, 56 - collection: 'app.bsky.feed.post', 57 - rkey: rkey, 58 - validate: false, 59 - record: { 60 - $type: 'app.bsky.feed.post', 61 - text: '', 62 - createdAt: '1970-01-01T00:00:00.000Z', 63 - } satisfies AppBskyFeedPost.Main, 64 - }, 65 - }), 66 - ); 67 - 68 - await ok( 69 - client.post('com.atproto.repo.deleteRecord', { 70 - input: { 71 - repo: currentAccount!.did, 72 - collection: 'app.bsky.feed.post', 73 - rkey: rkey, 74 - }, 75 - }), 76 - ); 77 - 78 - updatePostShadow(queryClient, post.uri, { deleted: true }); 79 - onPostDelete?.(); 80 39 }; 81 40 82 41 return (
+6 -6
src/components/timeline/pin-post-prompt.tsx
··· 1 1 import { Match, Show, Switch, batch } from 'solid-js'; 2 2 3 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 4 - import { ClientResponseError } from '@atcute/client'; 3 + import { XRPCError } from '@atcute/client'; 4 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 5 5 import { createMutation } from '@mary/solid-query'; 6 6 7 7 import { updatePostShadow, usePostShadow } from '~/api/cache/post-shadow'; ··· 23 23 24 24 const PinPostPrompt = ({ post }: PinPostPromptProps) => { 25 25 const { currentAccount } = useSession(); 26 - const { client } = useAgent(); 26 + const { rpc } = useAgent(); 27 27 28 28 const { close } = useModalContext(); 29 29 ··· 40 40 updatePostShadow(queryClient, post.uri, { pinned: next }); 41 41 42 42 while (true) { 43 - const existing = await getRecord(client, { 43 + const existing = await getRecord(rpc, { 44 44 repo, 45 45 collection: 'app.bsky.actor.profile', 46 46 rkey: 'self', ··· 63 63 record.pinnedPost = next ? { uri: post.uri, cid: post.cid } : undefined; 64 64 65 65 try { 66 - await putRecord(client, { 66 + await putRecord(rpc, { 67 67 repo, 68 68 collection: 'app.bsky.actor.profile', 69 69 rkey: 'self', ··· 71 71 swapRecord: existing?.cid ?? null, 72 72 }); 73 73 } catch (err) { 74 - if (err instanceof ClientResponseError && err.error === 'InvalidSwapError') { 74 + if (err instanceof XRPCError && err.kind === 'InvalidSwapError') { 75 75 if (retriesRemaining--) { 76 76 continue; 77 77 }
+1 -1
src/components/timeline/post-actions.tsx
··· 1 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 1 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 2 2 3 3 import { type PostShadowView } from '~/api/cache/post-shadow'; 4 4 import { createPostLikeMutation, createPostRepostMutation } from '~/api/mutations/post';
+6 -8
src/components/timeline/post-feed-item.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyFeedPost } from '@atcute/bluesky'; 4 - import { type Did } from '@atcute/lexicons'; 3 + import type { AppBskyFeedPost, At } from '@atcute/client/lexicons'; 5 4 import { useQueryClient } from '@mary/solid-query'; 6 5 7 6 import { usePostShadow } from '~/api/cache/post-shadow'; ··· 10 9 import { ContextContentList } from '~/api/moderation/constants'; 11 10 import { moderatePost } from '~/api/moderation/entities/post'; 12 11 import { precacheProfile } from '~/api/queries-cache/profile-precache'; 13 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 12 + import { parseAtUri } from '~/api/types/at-uri'; 14 13 15 14 import { history } from '~/globals/navigation'; 16 15 ··· 37 36 /** Expected to be static */ 38 37 item: UiTimelineItem; 39 38 highlighted?: boolean; 40 - timelineDid?: Did; 39 + timelineDid?: At.DID; 41 40 } 42 41 43 42 const PostFeedItem = ({ item, highlighted, timelineDid }: PostFeedItemProps) => { ··· 51 50 const author = post.author; 52 51 const authorDid = author.did; 53 52 54 - const record = post.record as AppBskyFeedPost.Main; 53 + const record = post.record as AppBskyFeedPost.Record; 55 54 const embed = post.embed; 56 55 57 56 const shadow = usePostShadow(post); 58 57 59 - const { rkey } = assertCanonicalResourceUri(post.uri); 60 - 58 + const uri = parseAtUri(post.uri); 61 59 const authorHref = `/${authorDid}`; 62 - const href = `/${authorDid}/${rkey}`; 60 + const href = `/${authorDid}/${uri.rkey}`; 63 61 64 62 const isOurPost = currentAccount && authorDid === currentAccount.did; 65 63
+24 -4
src/components/timeline/post-meta.tsx
··· 1 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 1 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 2 2 import { useQueryClient } from '@mary/solid-query'; 3 3 4 4 import { precacheProfile } from '~/api/queries-cache/profile-precache'; 5 5 6 6 import { openModal } from '~/globals/modals'; 7 7 8 + import Avatar from '../avatar'; 9 + import HeartSolidIcon from '../icons-central/heart-solid'; 8 10 import MoreHorizOutlinedIcon from '../icons-central/more-horiz-outline'; 9 11 import TimeAgo from '../time-ago'; 10 12 ··· 13 15 export interface PostMetaProps { 14 16 /** Expected to be static */ 15 17 post: AppBskyFeedDefs.PostView; 18 + context?: AppBskyFeedDefs.ThreadContext; 19 + /** Expected to be static */ 16 20 authorHref: string; 21 + /** Expected to be static */ 17 22 href: string; 18 - compact?: boolean; 23 + /** Expected to be static */ 19 24 gutterBottom?: boolean; 20 25 onPostDelete?: () => void; 21 26 onPostRedraft?: () => void; 22 27 } 23 28 24 - const PostMeta = ({ post, authorHref, href, gutterBottom, onPostDelete, onPostRedraft }: PostMetaProps) => { 29 + const PostMeta = (props: PostMetaProps) => { 25 30 const queryClient = useQueryClient(); 26 31 32 + const post = props.post; 33 + const href = props.href; 34 + const authorHref = props.authorHref; 35 + const gutterBottom = props.gutterBottom; 36 + 37 + const onPostDelete = props.onPostDelete; 38 + const onPostRedraft = props.onPostRedraft; 39 + 27 40 const author = post.author; 28 41 const indexedAt = post.indexedAt; 29 42 ··· 53 66 </TimeAgo> 54 67 </div> 55 68 56 - <div class="shrink-0"> 69 + <div class="flex shrink-0 items-center gap-4"> 70 + {props.context?.rootAuthorLike && ( 71 + <div class="relative"> 72 + <Avatar type="user" size={null} class="h-[18px] w-[18px]" /> 73 + <HeartSolidIcon class="absolute -bottom-1 -left-1.5 h-[14px] w-[14px] stroke-background stroke-[3] text-p-red-600" /> 74 + </div> 75 + )} 76 + 57 77 <button 58 78 onClick={(ev) => { 59 79 const anchor = ev.currentTarget;
+1 -1
src/components/timeline/post-overflow-menu.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 3 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 4 4 import { useQueryClient } from '@mary/solid-query'; 5 5 6 6 import { usePostShadow } from '~/api/cache/post-shadow';
+4 -21
src/components/timeline/post-reply-context.tsx
··· 1 - import type { AppBskyFeedPost } from '@atcute/bluesky'; 1 + import type { AppBskyFeedPost } from '@atcute/client/lexicons'; 2 2 3 3 import type { UiTimelineItem } from '~/api/models/timeline'; 4 4 import { createProfileQuery } from '~/api/queries/profile'; 5 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 5 + import { parseAtUri } from '~/api/types/at-uri'; 6 6 7 7 import { useSession } from '~/lib/states/session'; 8 8 ··· 41 41 ); 42 42 } 43 43 44 - const raw = (post.record as AppBskyFeedPost.Main).reply?.parent; 44 + const raw = (post.record as AppBskyFeedPost.Record).reply?.parent; 45 45 if (raw) { 46 - const { repo: did } = assertCanonicalResourceUri(raw.uri); 47 - 46 + const did = parseAtUri(raw.uri).repo; 48 47 if (did === currentAccount?.did) { 49 48 return <div class="mb-0.5 flex text-de text-contrast-muted">Replying to you</div>; 50 49 } 51 50 52 - if (did === post.author.did) { 53 - return ( 54 - <div class="mb-0.5 flex text-de text-contrast-muted"> 55 - <span class="shrink-0 whitespace-pre">Replying to </span> 56 - <a 57 - dir="auto" 58 - href={`/${did}`} 59 - class="overflow-hidden text-ellipsis whitespace-nowrap font-semibold hover:underline" 60 - > 61 - {/* @once */ post.author.handle.toLowerCase()} 62 - </a> 63 - </div> 64 - ); 65 - } 66 - 67 51 const profile = createProfileQuery(() => did, { 68 - batched: true, 69 52 staleTime: Infinity, 70 53 gcTime: 60_000 * 5, 71 54 });
+4 -4
src/components/timeline/post-share-menu.tsx
··· 1 - import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/bluesky'; 1 + import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/client/lexicons'; 2 2 3 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 3 + import { parseAtUri } from '~/api/types/at-uri'; 4 4 import { serializeRichText } from '~/api/utils/richtext-stringify'; 5 5 6 6 import { useModalContext } from '~/globals/modals'; ··· 21 21 const post = props.post; 22 22 23 23 const did = post.author.did; 24 - const { rkey } = assertCanonicalResourceUri(post.uri); 24 + const { rkey } = parseAtUri(post.uri); 25 25 26 26 return ( 27 27 <Menu.Container anchor={props.anchor} placement="bottom-end"> ··· 38 38 icon={ClipboardOutlinedIcon} 39 39 label="Copy post text" 40 40 onClick={() => { 41 - const record = post.record as AppBskyFeedPost.Main; 41 + const record = post.record as AppBskyFeedPost.Record; 42 42 const serialized = serializeRichText(record.text, record.facets); 43 43 44 44 navigator.clipboard.writeText(serialized).then(close);
+24 -37
src/components/timeline/revise-post-prompt.tsx
··· 1 - import { 2 - type AppBskyFeedDefs, 3 - type AppBskyFeedPost, 4 - type AppBskyFeedThreadgate, 5 - type RawMediaEmbed, 6 - type RawRecordEmbed, 7 - unwrapRawEmbed, 8 - } from '@atcute/bluesky'; 1 + import type { AppBskyFeedDefs, AppBskyFeedPost, AppBskyFeedThreadgate } from '@atcute/client/lexicons'; 9 2 10 - import { assertCanonicalResourceUri } from '~/api/types/at-uri'; 3 + import { parseAtUri } from '~/api/types/at-uri'; 4 + import { type MediaEmbed, type RecordEmbed, unwrapEmbed } from '~/api/utils/bluesky/embed'; 11 5 import { serializeRichText } from '~/api/utils/richtext-stringify'; 12 6 13 7 import { openModal, useModalContext } from '~/globals/modals'; ··· 21 15 import { 22 16 type ComposerState, 23 17 type PostEmbed, 24 - type PostImage, 25 18 type PostLinkEmbed, 26 19 type PostMediaEmbed, 27 20 type PostRecordEmbed, ··· 39 32 const { close } = useModalContext(); 40 33 41 34 (async () => { 42 - const record = post.record as AppBskyFeedPost.Main; 43 - const threadgate = post.threadgate?.record as AppBskyFeedThreadgate.Main | undefined; 35 + const record = post.record as AppBskyFeedPost.Record; 36 + const threadgate = post.threadgate?.record as AppBskyFeedThreadgate.Record | undefined; 44 37 const embeddingDisabled = post.viewer?.embeddingDisabled; 45 38 46 - const embeds = unwrapRawEmbed(record.embed); 39 + const embeds = unwrapEmbed(record.embed); 47 40 const draftEmbeds: PostEmbed = { 48 41 link: embeds.media ? toLinkEmbed(post, embeds.media) : undefined, 49 42 media: embeds.media ? toMediaEmbed(post, embeds.media) : undefined, ··· 83 76 84 77 export default RevisePostPrompt; 85 78 86 - const toMediaEmbed = (post: AppBskyFeedDefs.PostView, embed: RawMediaEmbed): PostMediaEmbed | undefined => { 79 + const toMediaEmbed = (post: AppBskyFeedDefs.PostView, embed: MediaEmbed): PostMediaEmbed | undefined => { 87 80 const authorDid = post.author.did; 88 81 89 82 switch (embed.$type) { 90 83 case 'app.bsky.embed.images': { 91 84 return { 92 85 type: 'image', 93 - images: embed.images.map((item): PostImage => { 94 - assert('$type' in item.image); 95 - 96 - return { 97 - source: { 98 - type: 'remote', 99 - blob: item.image, 100 - aspectRatio: item.aspectRatio, 101 - }, 102 - alt: item.alt, 103 - }; 104 - }), 86 + images: embed.images.map((item) => ({ 87 + source: { 88 + type: 'remote', 89 + blob: item.image, 90 + aspectRatio: item.aspectRatio, 91 + }, 92 + alt: item.alt, 93 + })), 105 94 labels: post.labels?.filter((label) => label.src === authorDid).map((label) => label.val) ?? [], 106 95 }; 107 96 } 108 97 case 'app.bsky.embed.video': { 109 - assert('$type' in embed.video); 110 - 111 98 return { 112 99 type: 'video', 113 100 source: { ··· 122 109 } 123 110 }; 124 111 125 - const toLinkEmbed = (post: AppBskyFeedDefs.PostView, embed: RawMediaEmbed): PostLinkEmbed | undefined => { 112 + const toLinkEmbed = (post: AppBskyFeedDefs.PostView, embed: MediaEmbed): PostLinkEmbed | undefined => { 126 113 const authorDid = post.author.did; 127 114 128 115 switch (embed.$type) { ··· 142 129 } 143 130 }; 144 131 145 - const toRecordEmbed = (embed: RawRecordEmbed): PostRecordEmbed | undefined => { 132 + const toRecordEmbed = (embed: RecordEmbed): PostRecordEmbed | undefined => { 146 133 const ref = embed.record; 147 134 148 - const refUri = ref.uri; 149 - const uri = assertCanonicalResourceUri(refUri); 135 + const uri = ref.uri; 136 + const { collection } = parseAtUri(uri); 150 137 151 - switch (uri.collection) { 138 + switch (collection) { 152 139 case 'app.bsky.feed.post': { 153 - return { type: 'quote', uri: refUri, origin: false }; 140 + return { type: 'quote', uri, origin: false }; 154 141 } 155 142 case 'app.bsky.graph.list': { 156 - return { type: 'list', uri: refUri }; 143 + return { type: 'list', uri }; 157 144 } 158 145 case 'app.bsky.feed.generator': { 159 - return { type: 'feed', uri: refUri }; 146 + return { type: 'feed', uri }; 160 147 } 161 148 } 162 149 163 - assert(false, `unknown "${uri.collection}" record type`); 150 + assert(false, `unknown "${collection}" record type`); 164 151 };
+2 -2
src/components/timeline/timeline-list.tsx
··· 1 - import type { Did } from '@atcute/lexicons'; 1 + import type { At } from '@atcute/client/lexicons'; 2 2 3 3 import { type TimelineParams, useTimelineQuery } from '~/api/queries/timeline'; 4 4 ··· 9 9 10 10 export interface TimelineListProps { 11 11 params: TimelineParams; 12 - timelineDid?: Did; 12 + timelineDid?: At.DID; 13 13 } 14 14 15 15 const TimelineList = (props: TimelineListProps) => {
+1 -1
src/globals/events.ts
··· 4 4 // User has published a post 5 5 postpublished: []; 6 6 // Media is being played 7 - mediaplay: []; 7 + mediaplay: [id: string]; 8 8 // User initiated scroll to top 9 9 softreset: []; 10 10 }>();
+1 -1
src/lib/aglais-bookmarks/db.ts
··· 1 1 import type { DBSchema } from 'idb'; 2 2 3 - import type { AppBskyFeedDefs } from '@atcute/bluesky'; 3 + import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 4 4 5 5 export interface BookmarkDBSchema extends DBSchema { 6 6 tags: {
+6 -5
src/lib/aglais-bookmarks/search.ts
··· 1 - import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/bluesky'; 2 1 import type { Token } from '@atcute/bluesky-search-parser'; 3 - import { isDid, isHandle } from '@atcute/lexicons/syntax'; 2 + import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/client/lexicons'; 4 3 import { mapDefined } from '@mary/array-fns'; 4 + 5 + import { DID_RE, HANDLE_RE } from '~/api/types/identity'; 5 6 6 7 import { parseEndDate, parseStartDate, splitFilters } from '../bsky/search'; 7 8 import { escapeRegex } from '../utils/regex'; ··· 43 44 44 45 { 45 46 const raw = filters.get('from'); 46 - if (isHandle(raw)) { 47 + if (raw && HANDLE_RE.test(raw)) { 47 48 from = raw; 48 49 } 49 50 } 50 51 51 52 { 52 53 const raw = filters.get('did'); 53 - if (isDid(raw)) { 54 + if (raw && DID_RE.test(raw)) { 54 55 from = raw; 55 56 } 56 57 } ··· 83 84 }); 84 85 85 86 const re = new RegExp('\\b' + values.join('|') + '\\b', 'i'); 86 - predicates.push((post) => re.test((post.record as AppBskyFeedPost.Main).text)); 87 + predicates.push((post) => re.test((post.record as AppBskyFeedPost.Record).text)); 87 88 } 88 89 89 90 return (post: AppBskyFeedDefs.PostView) => predicates.every((fn) => fn(post));
+3 -23
src/lib/atproto/labeler.ts
··· 1 1 import { type FetchHandler, type FetchHandlerObject, buildFetchHandler } from '@atcute/client'; 2 - import type { Did } from '@atcute/lexicons'; 2 + import type { At } from '@atcute/client/lexicons'; 3 + import { mergeHeaders } from '@atcute/client/utils/http'; 3 4 4 5 export interface Labeler { 5 - did: Did; 6 + did: At.DID; 6 7 redact: boolean; 7 8 } 8 9 ··· 23 24 }); 24 25 }; 25 26 }; 26 - 27 - const mergeHeaders = ( 28 - init: HeadersInit | undefined, 29 - defaults: Record<string, string | null>, 30 - ): HeadersInit | undefined => { 31 - let headers: Headers | undefined; 32 - 33 - for (const name in defaults) { 34 - const value = defaults[name]; 35 - 36 - if (value !== null) { 37 - headers ??= new Headers(init); 38 - 39 - if (!headers.has(name)) { 40 - headers.set(name, value); 41 - } 42 - } 43 - } 44 - 45 - return headers ?? init; 46 - };
+1 -1
src/lib/bsky/image.ts
··· 1 - import type { AppBskyEmbedDefs } from '@atcute/bluesky'; 1 + import type { AppBskyEmbedDefs } from '@atcute/client/lexicons'; 2 2 import { remove as removeExif } from '@mary/exif-rm'; 3 3 4 4 const MAX_SIZE = 1_000_000; // 1 MB
+2 -7
src/lib/navigation/router.tsx
··· 360 360 }; 361 361 362 362 const matchRoute = (path: string): MatchedRoute | null => { 363 - path = decodeURIComponent(path); 364 - 365 363 for (let idx = 0, len = _routes!.length; idx < len; idx++) { 366 364 const route = _routes![idx]; 367 365 ··· 369 367 const pattern = (route._regex ||= buildPathRegex(route.path)); 370 368 371 369 const match = pattern.exec(path); 372 - if (!match) { 370 + 371 + if (!match || (validate && !validate(match.groups!))) { 373 372 continue; 374 373 } 375 374 376 375 const params = match.groups!; 377 - 378 - if (validate && !validate(params)) { 379 - continue; 380 - } 381 376 382 377 let id: string | undefined; 383 378 if (route.single) {
+3 -6
src/lib/preferences/account.ts
··· 1 - import type { AppBskyFeedDefs, AppBskyGraphDefs } from '@atcute/bluesky'; 2 - import type { Did, ResourceUri } from '@atcute/lexicons'; 1 + import type { AppBskyFeedDefs, AppBskyGraphDefs, At } from '@atcute/client/lexicons'; 3 2 4 3 import type { ModerationLabeler, ModerationPreferences } from '~/api/moderation'; 5 4 ··· 29 28 30 29 export interface ModerationLabelerPreferences { 31 30 updated: number; 32 - definitions: Record<Did, ModerationLabeler>; 31 + definitions: Record<At.DID, ModerationLabeler>; 33 32 } 34 33 35 34 export type SavedFeed = SavedGeneratorFeed | SavedListFeed | SavedSearchFeed; ··· 54 53 } 55 54 56 55 export interface PersistedThreadgate { 57 - allow?: Array< 58 - { type: 'following' } | { type: 'follower' } | { type: 'mention' } | { type: 'list'; uri: ResourceUri } 59 - >; 56 + allow?: Array<{ type: 'following' } | { type: 'mention' } | { type: 'list'; uri: At.Uri }>; 60 57 } 61 58 62 59 export interface PersistedPostgate {
+3 -4
src/lib/preferences/sessions.ts
··· 1 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 2 - import type { Did } from '@atcute/lexicons'; 1 + import type { AppBskyActorDefs, At } from '@atcute/client/lexicons'; 3 2 4 3 export interface SessionPreferenceSchema { 5 4 $version: 1; 6 - active: Did | undefined; 5 + active: At.DID | undefined; 7 6 accounts: AccountData[]; 8 7 } 9 8 10 9 export interface AccountData { 11 10 /** Account DID */ 12 - readonly did: Did; 11 + readonly did: At.DID; 13 12 profile: AppBskyActorDefs.ProfileViewDetailed; 14 13 }
+3 -7
src/lib/preferences/snippets/composer.ts
··· 1 - import type { AppBskyFeedPostgate, AppBskyFeedThreadgate } from '@atcute/bluesky'; 1 + import type { AppBskyFeedPostgate, AppBskyFeedThreadgate } from '@atcute/client/lexicons'; 2 2 3 3 import type { PersistedPostgate, PersistedThreadgate } from '../account'; 4 4 5 - export type ThreadgateState = Pick<AppBskyFeedThreadgate.Main, 'allow' | 'hiddenReplies'>; 6 - export type PostgateState = Pick<AppBskyFeedPostgate.Main, 'detachedEmbeddingUris' | 'embeddingRules'>; 5 + export type ThreadgateState = Pick<AppBskyFeedThreadgate.Record, 'allow' | 'hiddenReplies'>; 6 + export type PostgateState = Pick<AppBskyFeedPostgate.Record, 'detachedEmbeddingUris' | 'embeddingRules'>; 7 7 8 8 export const toPersistedThreadgate = (gate: ThreadgateState): PersistedThreadgate => { 9 9 return { ··· 11 11 switch (rule.$type) { 12 12 case 'app.bsky.feed.threadgate#followingRule': 13 13 return { type: 'following' }; 14 - case 'app.bsky.feed.threadgate#followerRule': 15 - return { type: 'follower' }; 16 14 case 'app.bsky.feed.threadgate#mentionRule': 17 15 return { type: 'mention' }; 18 16 case 'app.bsky.feed.threadgate#listRule': ··· 28 26 switch (rule.type) { 29 27 case 'following': 30 28 return { $type: 'app.bsky.feed.threadgate#followingRule' }; 31 - case 'follower': 32 - return { $type: 'app.bsky.feed.threadgate#followerRule' }; 33 29 case 'mention': 34 30 return { $type: 'app.bsky.feed.threadgate#mentionRule' }; 35 31 case 'list':
+2 -2
src/lib/redirector.ts
··· 1 - import { isDid, isHandle, isRecordKey, isTid } from '@atcute/lexicons/syntax'; 2 - 1 + import { isDid, isHandle } from '~/api/types/identity'; 2 + import { isRecordKey, isTid } from '~/api/types/rkey'; 3 3 import { safeUrlParse } from '~/api/utils/strings'; 4 4 5 5 import {
+6 -6
src/lib/states/agent.tsx
··· 1 1 import { type JSX, type ParentProps, createContext, createMemo, useContext } from 'solid-js'; 2 2 3 - import { Client, simpleFetchHandler } from '@atcute/client'; 4 - import type { Did } from '@atcute/lexicons'; 3 + import { XRPC, simpleFetchHandler } from '@atcute/client'; 4 + import type { At } from '@atcute/client/lexicons'; 5 5 import type { OAuthUserAgent } from '@atcute/oauth-browser-client'; 6 6 import { QueryClient, QueryClientProvider } from '@mary/solid-query'; 7 7 ··· 14 14 import { useSession } from './session'; 15 15 16 16 export interface AgentContext { 17 - did: Did | null; 18 - client: Client; 17 + did: At.DID | null; 18 + rpc: XRPC; 19 19 handler: OAuthUserAgent | null; 20 20 persister: ReturnType<typeof createQueryPersister>; 21 21 } ··· 32 32 return { 33 33 did: currentAccount.did, 34 34 handler: currentAccount.agent ?? null, 35 - client: currentAccount.client, 35 + rpc: currentAccount.rpc, 36 36 persister: createQueryPersister({ name: `queryCache-${currentAccount.did}` }), 37 37 }; 38 38 } ··· 40 40 return { 41 41 did: null, 42 42 handler: null, 43 - client: new Client({ handler: simpleFetchHandler({ service: DEFAULT_APPVIEW_URL }) }), 43 + rpc: new XRPC({ handler: simpleFetchHandler({ service: DEFAULT_APPVIEW_URL }) }), 44 44 persister: createQueryPersister({ name: `queryCache-public` }), 45 45 }; 46 46 });
+17 -17
src/lib/states/session.tsx
··· 10 10 useContext, 11 11 } from 'solid-js'; 12 12 13 - import { Client, ClientResponseError, type FetchHandler, type FetchHandlerObject } from '@atcute/client'; 14 - import type { Did, GenericUri } from '@atcute/lexicons'; 13 + import { type FetchHandler, type FetchHandlerObject, XRPC, XRPCError } from '@atcute/client'; 14 + import type { At } from '@atcute/client/lexicons'; 15 15 import { OAuthUserAgent, deleteStoredSession, getSession } from '@atcute/oauth-browser-client'; 16 16 import { mapDefined } from '@mary/array-fns'; 17 17 ··· 27 27 import { assert } from '../utils/invariant'; 28 28 29 29 export interface CurrentAccountState { 30 - readonly did: Did; 30 + readonly did: At.DID; 31 31 readonly data: AccountData; 32 32 readonly preferences: PerAccountPreferenceSchema; 33 33 34 - readonly client: Client; 34 + readonly rpc: XRPC; 35 35 readonly agent: OAuthUserAgent | undefined; 36 36 readonly _cleanup: () => void; 37 37 } ··· 40 40 readonly currentAccount: CurrentAccountState | undefined; 41 41 42 42 getAccounts(): AccountData[]; 43 - resumeSession(did: Did): Promise<void>; 44 - removeAccount(did: Did): Promise<void>; 43 + resumeSession(did: At.DID): Promise<void>; 44 + removeAccount(did: At.DID): Promise<void>; 45 45 46 46 logout(): Promise<void>; 47 47 } ··· 60 60 }; 61 61 62 62 const createAccountState = ( 63 - did: Did, 63 + did: At.DID, 64 64 session: OAuthUserAgent | undefined, 65 - client: Client, 65 + rpc: XRPC, 66 66 ): CurrentAccountState => { 67 67 return createRoot((cleanup): CurrentAccountState => { 68 68 const preferences = createAccountPreferences(did); ··· 75 75 76 76 const labelers = createMemo((): Labeler[] => { 77 77 return Object.entries(preferences.moderation.labelers).map(([did, info]): Labeler => { 78 - return { did: did as Did, redact: info.redact }; 78 + return { did: did as At.DID, redact: info.redact }; 79 79 }); 80 80 }); 81 81 82 82 // A bit of a hack, but works right now. 83 - client.handler = attachLabelerHeaders(client.handler, labelers); 83 + rpc.handle = attachLabelerHeaders(rpc.handle, labelers); 84 84 85 85 createEffect(() => { 86 86 const signal = abortable(); ··· 129 129 return $data; 130 130 }, 131 131 132 - client: client, 132 + rpc: rpc, 133 133 agent: session, 134 134 _cleanup: cleanup, 135 135 }; ··· 144 144 getAccounts(): AccountData[] { 145 145 return sessions.accounts; 146 146 }, 147 - async resumeSession(did: Did): Promise<void> { 147 + async resumeSession(did: At.DID): Promise<void> { 148 148 const account = sessions.accounts.find((acc) => acc.did === did); 149 149 if (!account) { 150 150 return; ··· 181 181 // Dirty hack to account for the fact that we aren't dumping the user 182 182 // directly to the login modal. 183 183 handler = () => { 184 - throw new ClientResponseError({ status: 400, data: { error: 'invalid_token' } }); 184 + throw new XRPCError(400, { kind: 'invalid_token' }); 185 185 }; 186 186 } 187 187 188 - const rpc = new Client({ handler }); 188 + const rpc = new XRPC({ handler }); 189 189 190 190 signal.throwIfAborted(); 191 191 ··· 197 197 }); 198 198 }, 199 199 200 - async removeAccount(did: Did): Promise<void> { 200 + async removeAccount(did: At.DID): Promise<void> { 201 201 const $state = untrack(state); 202 202 const isLoggedIn = $state !== undefined && $state.did === did; 203 203 ··· 246 246 return session; 247 247 }; 248 248 249 - const createAccountPreferences = (did: Did) => { 249 + const createAccountPreferences = (did: At.DID) => { 250 250 const key = `account-${did}`; 251 251 return createReactiveLocalStorage<PerAccountPreferenceSchema>(key, (version, prev) => { 252 252 if (version === 0) { ··· 282 282 }, 283 283 displayName: 'Popular With Friends', 284 284 description: '', 285 - avatar: '' as GenericUri, 285 + avatar: '', 286 286 indexedAt: '0000-00-00T00:00:00.000Z', 287 287 }, 288 288 },
+11 -30
src/lib/states/singleton.tsx
··· 1 - import { type ParentProps, createContext, createRoot, getOwner, useContext } from 'solid-js'; 1 + import { type ParentProps, createContext, getOwner, runWithOwner, useContext } from 'solid-js'; 2 2 3 3 import { assert } from '../utils/invariant'; 4 4 5 - interface Singleton<T> { 6 - n: string; 7 - c: () => T; 8 - } 9 - 10 - interface SingletonContext { 11 - inject<T>(singleton: Singleton<T>): T; 5 + export interface SingletonContext { 6 + inject<T>(construct: () => T): T; 12 7 } 13 8 14 9 const Context = createContext<SingletonContext>(); 15 10 16 11 export const SingletonProvider = (props: ParentProps) => { 17 12 const owner = getOwner(); 18 - const registry = new Map< 19 - string, 20 - { 21 - c: any; 22 - v: any; 23 - d: () => void; 24 - } 25 - >(); 13 + const instances = new Map<() => any, any>(); 26 14 27 15 const context: SingletonContext = { 28 - inject({ n: name, c: construct }) { 29 - let registered = registry.get(name); 30 - if (registered === undefined || registered.c !== construct) { 31 - registered?.d(); 32 - registered = createRoot((dispose) => ({ c: construct, d: dispose, v: construct() }), owner); 33 - 34 - registry.set(name, registered); 16 + inject(construct) { 17 + let instance = instances.get(construct); 18 + if (instance === undefined) { 19 + instances.set(construct, (instance = runWithOwner(owner, construct))); 35 20 } 36 21 37 - return registered.v; 22 + return instance; 38 23 }, 39 24 }; 40 25 41 26 return <Context.Provider value={context}>{props.children}</Context.Provider>; 42 27 }; 43 28 44 - export const define = <T,>(name: string, construct: () => T): Singleton<T> => { 45 - return { n: name, c: construct }; 46 - }; 47 - 48 - export const inject = <T,>(singleton: Singleton<T>): T => { 29 + export const inject = <T,>(construct: () => T): T => { 49 30 const context = useContext(Context); 50 31 assert(context !== undefined, `Expected inject to be called under <SingletonProvider>`); 51 32 52 - return context.inject(singleton); 33 + return context.inject(construct); 53 34 };
+2 -3
src/lib/states/singletons/bookmarks.ts
··· 5 5 import { assert } from '~/lib/utils/invariant'; 6 6 7 7 import { useSession } from '../session'; 8 - import { define } from '../singleton'; 9 8 10 - const BookmarksService = define('bookmarks', () => { 9 + const BookmarksService = () => { 11 10 const { currentAccount } = useSession(); 12 11 13 12 let promise: Promise<IDBPDatabase<BookmarkDBSchema>> | undefined; ··· 52 51 })()); 53 52 }, 54 53 }; 55 - }); 54 + }; 56 55 57 56 export default BookmarksService;
+24 -24
src/lib/states/singletons/moderation.ts
··· 1 1 import { createMemo } from 'solid-js'; 2 2 import { unwrap } from 'solid-js/store'; 3 3 4 - import { ok } from '@atcute/client'; 5 - import type { Did } from '@atcute/lexicons'; 4 + import type { AppBskyLabelerDefs, At } from '@atcute/client/lexicons'; 6 5 import { mapDefined } from '@mary/array-fns'; 7 - import { createBatchedFetch } from '@mary/batch-fetch'; 8 - import { type QueryFunctionContext as QC, createQueries } from '@mary/solid-query'; 6 + import { createQueries } from '@mary/solid-query'; 9 7 10 8 import { BLUESKY_MODERATION_DID } from '~/api/defaults'; 11 9 import type { ModerationLabeler, ModerationOptions, ModerationPreferences } from '~/api/moderation'; 12 10 import { interpretLabelerDefinition } from '~/api/moderation/labeler'; 13 11 12 + import { createBatchedFetch } from '~/lib/utils/batch-fetch'; 13 + 14 14 import { useAgent } from '../agent'; 15 15 import { useSession } from '../session'; 16 - import { define } from '../singleton'; 17 16 18 - const ModerationService = define('moderation', () => { 19 - const { client, persister } = useAgent(); 17 + type Labeler = AppBskyLabelerDefs.LabelerViewDetailed; 18 + 19 + const ModerationService = () => { 20 + const { rpc, persister } = useAgent(); 20 21 const { currentAccount } = useSession(); 21 22 22 23 const modPreferences = createMemo((): ModerationPreferences => { ··· 38 39 return currentAccount.preferences.moderation; 39 40 }); 40 41 41 - const fetchLabeler = createBatchedFetch<Did, ModerationLabeler>({ 42 + const fetchLabeler = createBatchedFetch<At.DID, At.DID, ModerationLabeler>({ 42 43 limit: 20, 43 44 timeout: 1, 44 - idFromResource: (labeler) => labeler.did, 45 - async fetch(dids, signal) { 46 - const data = await ok( 47 - client.get('app.bsky.labeler.getServices', { 48 - signal, 49 - params: { 50 - dids: dids, 51 - detailed: true, 52 - }, 53 - }), 54 - ); 45 + idFromQuery: (query) => query, 46 + idFromData: (data) => data.did, 47 + async fetch(dids) { 48 + const { data } = await rpc.get('app.bsky.labeler.getServices', { 49 + params: { 50 + dids: dids, 51 + detailed: true, 52 + }, 53 + }); 55 54 56 - const views = data.views.filter((view) => view.$type === 'app.bsky.labeler.defs#labelerViewDetailed'); 55 + const views = data.views as Labeler[]; 56 + 57 57 return views.map((view) => interpretLabelerDefinition(view)); 58 58 }, 59 59 }); ··· 61 61 const labelerDefs = createQueries(() => { 62 62 return { 63 63 queries: Object.keys(modPreferences().labelers).map((_did) => { 64 - const did = _did as Did; 64 + const did = _did as At.DID; 65 65 66 66 return { 67 67 queryKey: ['labeler-definition', did], 68 - queryFn: ({ signal }: QC) => fetchLabeler(did, signal), 68 + queryFn: () => fetchLabeler(did), 69 69 staleTime: 21600000, // 6 hours 70 70 gcTime: 86400000, // 24 hours 71 71 refetchOnWindowFocus: true, ··· 76 76 const defs = mapDefined(results, (result) => result.data); 77 77 const fields = Object.fromEntries(defs.map((def) => [def.did, def])); 78 78 79 - return fields as Record<Did, ModerationLabeler>; 79 + return fields as Record<At.DID, ModerationLabeler>; 80 80 }, 81 81 }; 82 82 }); ··· 90 90 }); 91 91 92 92 return modOptions; 93 - }); 93 + }; 94 94 95 95 export default ModerationService;
+106
src/lib/utils/batch-fetch.ts
··· 1 + // we would sometimes rely on fetching multiple individual posts, and it would 2 + // be preferrable if it can be batched. 3 + 4 + type Promisable<T> = T | Promise<T>; 5 + 6 + export type QueryId = string | number; 7 + 8 + export interface BatchedFetchOptions<Query, Id extends QueryId, Data> { 9 + limit: number; 10 + timeout: number; 11 + fetch: (queries: Query[]) => Promisable<Data[]>; 12 + key?: (query: Query) => string | number; 13 + idFromQuery: (query: Query) => Id; 14 + idFromData: (data: Data) => Id; 15 + } 16 + 17 + interface BatchedFetchMap<Query, Id, Data> { 18 + key: string | number | undefined; 19 + timeout: any; 20 + queries: Query[]; 21 + pending: Map<Id, PromiseWithResolvers<Data>>; 22 + } 23 + 24 + export class ResourceMissingError extends Error { 25 + name = 'ResourceMissingError'; 26 + } 27 + 28 + /*#__NO_SIDE_EFFECTS__*/ 29 + export const createBatchedFetch = <Query, Id extends QueryId, Data>( 30 + options: BatchedFetchOptions<Query, Id, Data>, 31 + ) => { 32 + const { limit, timeout, fetch, key: _key, idFromData, idFromQuery } = options; 33 + 34 + let curr: BatchedFetchMap<Query, Id, Data> | undefined; 35 + 36 + return (query: Query): Promise<Data> => { 37 + const id = idFromQuery(query); 38 + const key = _key?.(query); 39 + 40 + let map = curr; 41 + 42 + if (!map || map.queries.length >= limit || map.key !== key) { 43 + map = curr = { 44 + key, 45 + timeout: undefined, 46 + queries: [], 47 + pending: new Map(), 48 + }; 49 + } 50 + 51 + let deferred = map.pending.get(id); 52 + 53 + if (!deferred) { 54 + deferred = Promise.withResolvers<Data>(); 55 + 56 + map.queries.push(query); 57 + map.pending.set(id, deferred); 58 + } 59 + 60 + clearTimeout(map.timeout); 61 + 62 + map.timeout = setTimeout(() => { 63 + if (curr === map) { 64 + curr = undefined; 65 + } 66 + 67 + perform(map!, fetch, idFromData); 68 + }, timeout); 69 + 70 + return deferred.promise; 71 + }; 72 + }; 73 + 74 + const perform = async <Query, Id extends QueryId, Data>( 75 + map: BatchedFetchMap<Query, Id, Data>, 76 + fetch: (queries: Query[]) => Promisable<Data[]>, 77 + idFromData: (data: Data) => Id, 78 + ) => { 79 + const queries = map.queries; 80 + const pending = map.pending; 81 + 82 + let errored = false; 83 + 84 + try { 85 + const dataset = await fetch(queries); 86 + 87 + for (const data of dataset) { 88 + const id = idFromData(data); 89 + const deferred = pending.get(id); 90 + 91 + deferred?.resolve(data); 92 + } 93 + } catch (error) { 94 + errored = true; 95 + 96 + for (const deferred of pending.values()) { 97 + deferred.reject(error); 98 + } 99 + } finally { 100 + if (!errored) { 101 + for (const deferred of pending.values()) { 102 + deferred.reject(new ResourceMissingError()); 103 + } 104 + } 105 + } 106 + };
+6 -12
src/lib/utils/invariant.ts
··· 1 - export const assert: { 2 - (condition: any, message?: string): asserts condition; 3 - } = (condition, message): asserts condition => { 1 + export function assert(condition: any, message?: string): asserts condition { 4 2 if (import.meta.env.DEV && !condition) { 5 3 throw new Error(`Assertion failed` + (message ? `: ${message}` : ``)); 6 4 } 7 - }; 5 + } 8 6 9 - export const assertStrong: { 10 - (condition: any, message?: string): asserts condition; 11 - } = (condition, message): asserts condition => { 7 + export function assertStrong(condition: any, message?: string): asserts condition { 12 8 if (!condition) { 13 9 if (import.meta.env.DEV) { 14 10 throw new Error(`Assertion failed` + (message ? `: ${message}` : ``)); ··· 16 12 17 13 throw new Error(`Assertion failed`); 18 14 } 19 - }; 15 + } 20 16 21 - export const assertUnreachable: { 22 - (_: never, message?: string): never; 23 - } = (_, message) => { 17 + export function assertUnreachable(_: never, message?: string): never { 24 18 assertStrong(false, message); 25 - }; 19 + }
+11 -42
src/main.tsx
··· 2 2 import { type JSX, createSignal, onMount } from 'solid-js'; 3 3 import { render } from 'solid-js/web'; 4 4 5 - import { Client, ok, simpleFetchHandler } from '@atcute/client'; 6 - import type { DidDocument } from '@atcute/identity'; 7 - import type { Did } from '@atcute/lexicons'; 5 + import type { At } from '@atcute/client/lexicons'; 8 6 import { configureOAuth } from '@atcute/oauth-browser-client'; 9 7 10 8 import * as navigation from '~/globals/navigation'; ··· 34 32 }); 35 33 36 34 // Configure OAuth 37 - { 38 - const resolver = new Client({ 39 - handler: simpleFetchHandler({ service: 'https://identitas.kelinci.deno.net' }), 40 - }); 35 + configureOAuth({ 36 + metadata: { 37 + client_id: import.meta.env.VITE_OAUTH_CLIENT_ID, 38 + redirect_uri: import.meta.env.VITE_OAUTH_REDIRECT_URL, 39 + }, 40 + }); 41 41 42 - configureOAuth({ 43 - metadata: { 44 - client_id: import.meta.env.VITE_OAUTH_CLIENT_ID, 45 - redirect_uri: import.meta.env.VITE_OAUTH_REDIRECT_URL, 46 - }, 47 - 48 - didDocumentResolver: { 49 - async resolve(did) { 50 - const data = await ok( 51 - resolver.get('com.atproto.identity.resolveDid', { 52 - params: { 53 - did: did, 54 - }, 55 - }), 56 - ); 57 - 58 - return data.didDoc as unknown as DidDocument; 59 - }, 60 - }, 61 - handleResolver: { 62 - async resolve(handle) { 63 - const data = await ok( 64 - resolver.get('com.atproto.identity.resolveHandle', { 65 - params: { 66 - handle: handle, 67 - }, 68 - }), 69 - ); 70 - 71 - return data.did as Did<'plc' | 'web'>; 72 - }, 73 - }, 74 - }); 75 - } 42 + localStorage.removeItem('oauth-dpopNonces'); 43 + localStorage.removeItem('oauth-sessions'); 44 + localStorage.removeItem('oauth-states'); 76 45 77 46 const InnerApp = () => { 78 47 const [ready, setReady] = createSignal(false); 79 48 const session = useSession(); 80 49 81 50 onMount(() => { 82 - const resumeAccount = async (did: Did | undefined) => { 51 + const resumeAccount = async (did: At.DID | undefined) => { 83 52 try { 84 53 if (did) { 85 54 await session.resumeSession(did);
+2 -2
src/shell.tsx
··· 8 8 lazy, 9 9 } from 'solid-js'; 10 10 11 - import type { AppBskyNotificationGetUnreadCount } from '@atcute/bluesky'; 11 + import type { AppBskyNotificationGetUnreadCount } from '@atcute/client/lexicons'; 12 12 import type { DefinedCreateQueryResult } from '@mary/solid-query'; 13 13 14 14 import { createNotificationCountQuery } from '~/api/queries/notification-count'; ··· 99 99 unread, 100 100 }: { 101 101 route: Accessor<MatchedRouteState>; 102 - unread: DefinedCreateQueryResult<AppBskyNotificationGetUnreadCount.$output>; 102 + unread: DefinedCreateQueryResult<AppBskyNotificationGetUnreadCount.Output>; 103 103 }) => { 104 104 const active = () => route().def.meta?.name; 105 105
+1 -1
src/views/_error/index.tsx
··· 5 5 reset: () => void; 6 6 } 7 7 8 - const ErrorPage = ({ error, reset: _retry }: ErrorPageProps) => { 8 + const ErrorPage = ({ error, reset: retry }: ErrorPageProps) => { 9 9 useTitle(() => `Something went wrong :( โ€” ${import.meta.env.VITE_APP_NAME}`); 10 10 11 11 console.error(error);
+3 -4
src/views/bluemoji-emotes.tsx
··· 1 1 import { type JSX, createEffect, createSignal } from 'solid-js'; 2 2 3 - import type { Blob as AtpBlob } from '@atcute/lexicons'; 4 3 import { remove as removeExif } from '@mary/exif-rm'; 5 4 import { createInfiniteQuery } from '@mary/solid-query'; 6 5 ··· 46 45 openModal(() => <AddEmotePrompt blob={blob} onAdd={() => {}} />); 47 46 }; 48 47 49 - const { client } = useAgent(); 48 + const { rpc } = useAgent(); 50 49 const { currentAccount } = useSession(); 51 50 52 51 const query = createInfiniteQuery(() => ({ 53 52 queryKey: ['bluemoji', 'emotes'], 54 53 async queryFn(ctx) { 55 - return listRecords(client, { 54 + return listRecords(rpc, { 56 55 repo: currentAccount!.did, 57 56 collection: 'blue.moji.collection.item', 58 57 limit: 100, ··· 114 113 return ( 115 114 <div class="flex items-center gap-4 px-4 py-4"> 116 115 <img 117 - src={/* @once */ getCdnUrl(currentAccount!.did, (blob! as AtpBlob).ref.$link)} 116 + src={/* @once */ getCdnUrl(currentAccount!.did, blob!.ref.$link)} 118 117 class="h-8 w-8 object-cover" 119 118 /> 120 119
+7 -9
src/views/oauth-callback.tsx
··· 1 1 import { Match, Switch, createResource } from 'solid-js'; 2 2 3 - import { Client, ok } from '@atcute/client'; 3 + import { XRPC } from '@atcute/client'; 4 4 import { 5 5 AuthorizationError, 6 6 OAuthResponseError, ··· 27 27 const did = session.info.sub; 28 28 29 29 const agent = new OAuthUserAgent(session); 30 - const client = new Client({ handler: agent }); 30 + const rpc = new XRPC({ handler: agent }); 31 31 32 - const profile = await ok( 33 - client.get('app.bsky.actor.getProfile', { 34 - params: { 35 - actor: did, 36 - }, 37 - }), 38 - ); 32 + const { data: profile } = await rpc.get('app.bsky.actor.getProfile', { 33 + params: { 34 + actor: did, 35 + }, 36 + }); 39 37 40 38 { 41 39 // Update UI preferences
+1 -6
src/views/post-likes.tsx
··· 1 - import type { Did, RecordKey } from '@atcute/lexicons'; 2 - 3 1 import { createSubjectLikersQuery } from '~/api/queries/subject-likers'; 4 2 import { makeAtUri } from '~/api/types/at-uri'; 5 3 ··· 12 10 import VirtualItem from '~/components/virtual-item'; 13 11 14 12 const PostLikesPage = () => { 15 - const { did, rkey } = useParams<{ 16 - did: Did; 17 - rkey: RecordKey; 18 - }>(); 13 + const { did, rkey } = useParams(); 19 14 20 15 const uri = makeAtUri(did, 'app.bsky.feed.post', rkey); 21 16 const likers = createSubjectLikersQuery(() => uri);
+1 -6
src/views/post-quotes.tsx
··· 1 - import type { Did, RecordKey } from '@atcute/lexicons'; 2 - 3 1 import { createPostQuotesQuery } from '~/api/queries/post-quotes'; 4 2 import { makeAtUri } from '~/api/types/at-uri'; 5 3 ··· 11 9 import VirtualItem from '~/components/virtual-item'; 12 10 13 11 const PostQuotesPage = () => { 14 - const { did, rkey } = useParams<{ 15 - did: Did; 16 - rkey: RecordKey; 17 - }>(); 12 + const { did, rkey } = useParams(); 18 13 19 14 const uri = makeAtUri(did, 'app.bsky.feed.post', rkey); 20 15 const quotes = createPostQuotesQuery(() => uri);
+1 -6
src/views/post-reposts.tsx
··· 1 - import type { Did, RecordKey } from '@atcute/lexicons'; 2 - 3 1 import { createSubjectRepostersQuery } from '~/api/queries/subject-reposters'; 4 2 import { makeAtUri } from '~/api/types/at-uri'; 5 3 ··· 12 10 import VirtualItem from '~/components/virtual-item'; 13 11 14 12 const PostLikesPage = () => { 15 - const { did, rkey } = useParams<{ 16 - did: Did; 17 - rkey: RecordKey; 18 - }>(); 13 + const { did, rkey } = useParams(); 19 14 20 15 const uri = makeAtUri(did, 'app.bsky.feed.post', rkey); 21 16 const reposters = createSubjectRepostersQuery(() => uri);
+12 -16
src/views/post-thread.tsx
··· 1 1 import { For, Match, Switch, createEffect, createMemo, createSignal } from 'solid-js'; 2 2 3 - import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/bluesky'; 4 - import { ClientResponseError } from '@atcute/client'; 5 - import type { $type, ActorIdentifier, Did, RecordKey } from '@atcute/lexicons'; 6 - import { isDid } from '@atcute/lexicons/syntax'; 3 + import { XRPCError } from '@atcute/client'; 4 + import type { AppBskyFeedDefs, AppBskyFeedPost, At, Brand } from '@atcute/client/lexicons'; 7 5 import { useQueryClient } from '@mary/solid-query'; 8 6 9 7 import { ··· 14 12 import { usePostThreadQuery } from '~/api/queries/post-thread'; 15 13 import { createProfileQuery } from '~/api/queries/profile'; 16 14 import { makeAtUri } from '~/api/types/at-uri'; 15 + import { isDid } from '~/api/types/identity'; 17 16 18 17 import { history } from '~/globals/navigation'; 19 18 ··· 39 38 import VirtualItem from '~/components/virtual-item'; 40 39 41 40 const PostThreadPage = () => { 42 - const { didOrHandle, rkey } = useParams<{ 43 - didOrHandle: ActorIdentifier; 44 - rkey: RecordKey; 45 - }>(); 41 + const { didOrHandle, rkey } = useParams(); 46 42 47 43 const queryClient = useQueryClient(); 48 44 ··· 54 50 if (data && data.$type === 'app.bsky.feed.defs#threadViewPost') { 55 51 const post = data.post; 56 52 const author = post.author; 57 - const record = post.record as AppBskyFeedPost.Main; 53 + const record = post.record as AppBskyFeedPost.Record; 58 54 59 55 const authorTitle = `@${truncateMiddle(author.handle, 29).toLowerCase()}`; 60 56 const postContent = record.text?.trim(); ··· 79 75 80 76 <Switch> 81 77 <Match when={query.error} keyed> 82 - {(err) => { 83 - if (err instanceof ClientResponseError) { 84 - if (err.error === 'NotFound') { 78 + {(error) => { 79 + if (error instanceof XRPCError) { 80 + if (error.kind === 'NotFound') { 85 81 return ( 86 82 <div class="px-4 py-3"> 87 83 <div class="rounded-md border border-outline p-3"> ··· 92 88 } 93 89 } 94 90 95 - return <ErrorView error={err} onRetry={() => query.refetch()} />; 91 + return <ErrorView error={error} onRetry={() => query.refetch()} />; 96 92 }} 97 93 </Match> 98 94 ··· 106 102 const data = accessor(); 107 103 const type = data.$type; 108 104 109 - let did: Did | undefined; 105 + let did: At.DID | undefined; 110 106 111 107 if (type === 'app.bsky.feed.defs#threadViewPost') { 112 108 did = data.post.author.did; ··· 221 217 export default PostThreadPage; 222 218 223 219 const ThreadView = (props: { 224 - data: $type.enforce<AppBskyFeedDefs.ThreadViewPost>; 220 + data: Brand.Union<AppBskyFeedDefs.ThreadViewPost>; 225 221 isPlaceholderData: boolean; 226 222 onReplyPublish?: () => void; 227 223 onMainPostDelete?: () => void; ··· 261 257 } 262 258 } 263 259 264 - return (post.record as AppBskyFeedPost.Main).reply !== undefined; 260 + return (post.record as AppBskyFeedPost.Record).reply !== undefined; 265 261 }; 266 262 267 263 return (
+1 -6
src/views/profile-curation-list.tsx
··· 1 1 import { Match, Switch } from 'solid-js'; 2 2 3 - import type { Did, RecordKey } from '@atcute/lexicons'; 4 - 5 3 import { createListMetaQuery } from '~/api/queries/list'; 6 4 import { makeAtUri } from '~/api/types/at-uri'; 7 5 ··· 13 11 import TimelineList from '~/components/timeline/timeline-list'; 14 12 15 13 const CurationListPage = () => { 16 - const { did, rkey } = useParams<{ 17 - did: Did; 18 - rkey: RecordKey; 19 - }>(); 14 + const { did, rkey } = useParams(); 20 15 21 16 const uri = makeAtUri(did, 'app.bsky.graph.list', rkey); 22 17 const meta = createListMetaQuery(() => uri);
+2 -6
src/views/profile-feed.tsx
··· 1 1 import { Match, Show, Switch } from 'solid-js'; 2 2 3 - import type { ActorIdentifier, RecordKey } from '@atcute/lexicons'; 4 - import { isDid } from '@atcute/lexicons/syntax'; 5 3 import { useQueryClient } from '@mary/solid-query'; 6 4 7 5 import { createFeedMetaQuery } from '~/api/queries/feed'; 8 6 import { makeAtUri } from '~/api/types/at-uri'; 7 + import { isDid } from '~/api/types/identity'; 9 8 10 9 import { openModal } from '~/globals/modals'; 11 10 import { history } from '~/globals/navigation'; ··· 24 23 import TimelineList from '~/components/timeline/timeline-list'; 25 24 26 25 const FeedPage = () => { 27 - const { didOrHandle, rkey } = useParams<{ 28 - didOrHandle: ActorIdentifier; 29 - rkey: RecordKey; 30 - }>(); 26 + const { didOrHandle, rkey } = useParams(); 31 27 32 28 const queryClient = useQueryClient(); 33 29
+1 -3
src/views/profile-feeds.tsx
··· 1 - import type { Did } from '@atcute/lexicons'; 2 - 3 1 import { createProfileQuery } from '~/api/queries/profile'; 4 2 import { createProfileFeedsQuery } from '~/api/queries/profile-feeds'; 5 3 ··· 11 9 import VirtualItem from '~/components/virtual-item'; 12 10 13 11 const ProfileFeedsPage = () => { 14 - const { did } = useParams<{ did: Did }>(); 12 + const { did } = useParams(); 15 13 16 14 const feeds = createProfileFeedsQuery(() => did); 17 15 const profile = createProfileQuery(() => did);
+1 -3
src/views/profile-followers.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { Did } from '@atcute/lexicons'; 4 - 5 3 import { createProfileFollowersQuery } from '~/api/queries/profile-followers'; 6 4 7 5 import { useParams, useTitle } from '~/lib/navigation/router'; ··· 13 11 import VirtualItem from '~/components/virtual-item'; 14 12 15 13 const ProfileFollowersPage = () => { 16 - const { did } = useParams<{ did: Did }>(); 14 + const { did } = useParams(); 17 15 18 16 const followers = createProfileFollowersQuery(() => did); 19 17 const subject = createMemo(() => followers.data?.pages[0].subject);
+1 -3
src/views/profile-following.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { Did } from '@atcute/lexicons'; 4 - 5 3 import { createProfileFollowingQuery } from '~/api/queries/profile-following'; 6 4 7 5 import { useParams, useTitle } from '~/lib/navigation/router'; ··· 13 11 import VirtualItem from '~/components/virtual-item'; 14 12 15 13 const ProfileFollowingPage = () => { 16 - const { did } = useParams<{ did: Did }>(); 14 + const { did } = useParams(); 17 15 18 16 const following = createProfileFollowingQuery(() => did); 19 17 const subject = createMemo(() => following.data?.pages[0].subject);
+1 -3
src/views/profile-known-followers.tsx
··· 1 1 import { createMemo } from 'solid-js'; 2 2 3 - import type { Did } from '@atcute/lexicons'; 4 - 5 3 import { createProfileKnownFollowersQuery } from '~/api/queries/profile-known-followers'; 6 4 7 5 import { useParams, useTitle } from '~/lib/navigation/router'; ··· 13 11 import VirtualItem from '~/components/virtual-item'; 14 12 15 13 const ProfileKnownFollowersPage = () => { 16 - const { did } = useParams<{ did: Did }>(); 14 + const { did } = useParams(); 17 15 18 16 const followers = createProfileKnownFollowersQuery(() => did); 19 17 const subject = createMemo(() => followers.data?.pages[0].subject);
+6 -6
src/views/profile-labels.tsx
··· 1 1 import { Match, Show, Switch, createMemo } from 'solid-js'; 2 2 3 - import type { Did } from '@atcute/lexicons'; 3 + import type { At } from '@atcute/client/lexicons'; 4 4 import { mapDefined } from '@mary/array-fns'; 5 5 6 6 import { ··· 46 46 import LabelerOverflowMenu from '~/components/settings/moderation/labeling/labeler-overflow-menu'; 47 47 48 48 const ProfileLabelsPage = () => { 49 - const { did } = useParams<{ did: Did }>(); 49 + const { did } = useParams(); 50 50 const { currentAccount } = useSession(); 51 51 52 - const query = createLabelerMetaQuery(() => did); 52 + const query = createLabelerMetaQuery(() => did as At.DID); 53 53 54 54 const config = createMemo(() => { 55 55 if (!currentAccount) { ··· 57 57 } 58 58 59 59 const preferences = currentAccount.preferences; 60 - return preferences.moderation.labelers[did]; 60 + return preferences.moderation.labelers[did as At.DID]; 61 61 }); 62 62 63 63 useTitle(() => { ··· 98 98 const preferences = currentAccount!.preferences; 99 99 const labelers = preferences.moderation.labelers; 100 100 101 - labelers[did] = { 101 + labelers[did as At.DID] = { 102 102 labels: {}, 103 103 privileged: false, 104 104 redact: false, ··· 140 140 const preferences = currentAccount!.preferences; 141 141 const labelers = preferences.moderation.labelers; 142 142 143 - delete labelers[did]; 143 + delete labelers[did as At.DID]; 144 144 }} 145 145 /> 146 146 ));
+2 -6
src/views/profile-list.tsx
··· 1 1 import { Match, Switch } from 'solid-js'; 2 2 3 - import type { ActorIdentifier, RecordKey } from '@atcute/lexicons'; 4 - import { isDid } from '@atcute/lexicons/syntax'; 5 3 import { useQueryClient } from '@mary/solid-query'; 6 4 7 5 import { createListMetaQuery } from '~/api/queries/list'; 8 6 import { makeAtUri } from '~/api/types/at-uri'; 7 + import { isDid } from '~/api/types/identity'; 9 8 10 9 import { history } from '~/globals/navigation'; 11 10 ··· 16 15 import * as Page from '~/components/page'; 17 16 18 17 const ListStubPage = () => { 19 - const { didOrHandle, rkey } = useParams<{ 20 - didOrHandle: ActorIdentifier; 21 - rkey: RecordKey; 22 - }>(); 18 + const { didOrHandle, rkey } = useParams(); 23 19 24 20 const queryClient = useQueryClient(); 25 21
+1 -3
src/views/profile-lists.tsx
··· 1 - import type { Did } from '@atcute/lexicons'; 2 - 3 1 import { createProfileQuery } from '~/api/queries/profile'; 4 2 import { createProfileListsQuery } from '~/api/queries/profile-lists'; 5 3 ··· 10 8 import PagedList from '~/components/paged-list'; 11 9 12 10 const ProfileListsPage = () => { 13 - const { did } = useParams<{ did: Did }>(); 11 + const { did } = useParams(); 14 12 15 13 const lists = createProfileListsQuery(() => did); 16 14 const profile = createProfileQuery(() => did);
+3 -7
src/views/profile-moderation-list.tsx
··· 1 1 import { Match, Show, Switch, createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyGraphDefs } from '@atcute/bluesky'; 4 - import type { Did, RecordKey, ResourceUri } from '@atcute/lexicons'; 3 + import type { AppBskyGraphDefs } from '@atcute/client/lexicons'; 5 4 import { useQueryClient } from '@mary/solid-query'; 6 5 7 6 import { ContextContentMedia } from '~/api/moderation/constants'; ··· 30 29 import VirtualItem from '~/components/virtual-item'; 31 30 32 31 const ProfileModerationListPage = () => { 33 - const { did, rkey } = useParams<{ 34 - did: Did; 35 - rkey: RecordKey; 36 - }>(); 32 + const { did, rkey } = useParams(); 37 33 38 34 const uri = makeAtUri(did, 'app.bsky.graph.list', rkey); 39 35 const query = createListMetaQuery(() => uri); ··· 164 160 ); 165 161 }; 166 162 167 - const MembersList = ({ uri }: { uri: ResourceUri }) => { 163 + const MembersList = ({ uri }: { uri: string }) => { 168 164 const members = createListMembersQuery(() => uri); 169 165 170 166 return (
+2 -6
src/views/profile-search.tsx
··· 1 1 import { createSignal } from 'solid-js'; 2 2 3 - import type { ActorIdentifier } from '@atcute/lexicons'; 4 - import { isDid } from '@atcute/lexicons/syntax'; 5 - 6 3 import { createProfileQuery } from '~/api/queries/profile'; 4 + import { isDid } from '~/api/types/identity'; 7 5 8 6 import { history } from '~/globals/navigation'; 9 7 ··· 16 14 import SearchSuggestionsView from '~/components/search/search-suggestions-view'; 17 15 18 16 const ProfileSearchPage = () => { 19 - const { didOrHandle } = useParams<{ 20 - didOrHandle: ActorIdentifier; 21 - }>(); 17 + const { didOrHandle } = useParams(); 22 18 23 19 const [query, setQuery] = createSignal(''); 24 20 const profile = createProfileQuery(() => didOrHandle);
+10 -13
src/views/profile.tsx
··· 1 1 import { Match, Show, Switch, createMemo } from 'solid-js'; 2 2 3 - import type { AppBskyActorDefs } from '@atcute/bluesky'; 4 - import { ClientResponseError } from '@atcute/client'; 5 - import type { ActorIdentifier } from '@atcute/lexicons'; 6 - import { isDid } from '@atcute/lexicons/syntax'; 3 + import { XRPCError } from '@atcute/client'; 4 + import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 7 5 import { useQueryClient } from '@mary/solid-query'; 8 6 9 7 import { useProfileShadow } from '~/api/cache/profile-shadow'; 10 8 import { createProfileQuery } from '~/api/queries/profile'; 9 + import { isDid } from '~/api/types/identity'; 11 10 12 11 import { openModal } from '~/globals/modals'; 13 12 import { history } from '~/globals/navigation'; ··· 32 31 import VirtualItem from '~/components/virtual-item'; 33 32 34 33 const ProfilePage = () => { 35 - const { didOrHandle } = useParams<{ 36 - didOrHandle: ActorIdentifier; 37 - }>(); 34 + const { didOrHandle } = useParams(); 38 35 39 36 const queryClient = useQueryClient(); 40 37 const profile = createProfileQuery(() => didOrHandle); ··· 118 115 <Match when={profile.error} keyed> 119 116 {(err) => { 120 117 if ( 121 - err instanceof ClientResponseError && 122 - (err.error === 'InvalidRequest' || 123 - err.error === 'AccountTakedown' || 124 - err.error === 'AccountDeactivated') 118 + err instanceof XRPCError && 119 + (err.kind === 'InvalidRequest' || 120 + err.kind === 'AccountTakedown' || 121 + err.kind === 'AccountDeactivated') 125 122 ) { 126 123 const text = 127 - err.error === 'AccountTakedown' 124 + err.kind === 'AccountTakedown' 128 125 ? `This account is taken down` 129 - : err.error === 'AccountDeactivated' 126 + : err.kind === 'AccountDeactivated' 130 127 ? `This account has deactivated` 131 128 : `This account doesn't exist`; 132 129
+6 -7
src/views/settings-account.tsx
··· 1 - import { ok } from '@atcute/client'; 2 1 import { createQuery } from '@mary/solid-query'; 3 2 4 3 import { useTitle } from '~/lib/navigation/router'; ··· 8 7 import * as Page from '~/components/page'; 9 8 10 9 const AccountSettingsPage = () => { 11 - const { client, persister } = useAgent(); 10 + const { did, rpc, persister } = useAgent(); 12 11 13 12 const repo = createQuery(() => ({ 14 13 queryKey: ['describe-repo'], 15 14 persister: persister as any, 16 15 async queryFn() { 17 - const [session, server] = await Promise.all([ 18 - ok(client.get('com.atproto.server.getSession')), 19 - ok(client.get('com.atproto.server.describeServer')), 16 + const [repoResponse, serverResponse] = await Promise.all([ 17 + rpc.get('com.atproto.repo.describeRepo', { params: { repo: did! } }), 18 + rpc.handle('/xrpc/com.atproto.server.describeServer', {}), 20 19 ]); 21 20 22 21 return { 23 - handle: session.handle, 24 - pds: server.did.replace(/^did:web:/, ''), 22 + handle: repoResponse.data.handle, 23 + pds: new URL(serverResponse.url).host, 25 24 }; 26 25 }, 27 26 }));
+7 -11
src/views/settings-app-passwords.tsx
··· 1 1 import { For, Match, Show, Switch } from 'solid-js'; 2 2 3 - import type { ComAtprotoServerListAppPasswords } from '@atcute/atproto'; 4 - import { ok } from '@atcute/client'; 3 + import type { ComAtprotoServerListAppPasswords } from '@atcute/client/lexicons'; 5 4 import { createMutation, createQuery } from '@mary/solid-query'; 6 5 7 6 import { openModal } from '~/globals/modals'; ··· 23 22 import AddAppPasswordPrompt from '~/components/settings/app-passwords/add-app-password-prompt'; 24 23 25 24 const AppPasswordsSettingsPage = () => { 26 - const { client } = useAgent(); 25 + const { rpc } = useAgent(); 27 26 28 27 const passwords = createQuery(() => { 29 28 return { 30 29 queryKey: ['app-passwords'], 31 30 async queryFn() { 32 - const data = await ok(client.get('com.atproto.server.listAppPasswords')); 31 + const { data } = await rpc.get('com.atproto.server.listAppPasswords', {}); 33 32 34 33 return data.passwords; 35 34 }, ··· 106 105 } 107 106 108 107 const PasswordEntry = ({ item }: PasswordEntryProps) => { 109 - const { client } = useAgent(); 108 + const { rpc } = useAgent(); 110 109 111 110 const isPrivileged = item.privileged; 112 111 113 112 const mutation = createMutation((queryClient) => { 114 113 return { 115 114 async mutationFn() { 116 - await ok( 117 - client.post('com.atproto.server.revokeAppPassword', { 118 - as: null, 119 - input: { name: item.name }, 120 - }), 121 - ); 115 + await rpc.call('com.atproto.server.revokeAppPassword', { 116 + data: { name: item.name }, 117 + }); 122 118 }, 123 119 async onSuccess() { 124 120 await queryClient.invalidateQueries({ queryKey: ['app-passwords'] });
-40
tsconfig.app.json
··· 1 - { 2 - "compilerOptions": { 3 - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 - 5 - "target": "ESNext", 6 - "lib": ["ESNext", "DOM", "DOM.Iterable"], 7 - "types": [ 8 - "dom-close-watcher", 9 - "dom-webcodecs", 10 - "@atcute/atproto", 11 - "@atcute/bluemoji", 12 - "@atcute/bluesky", 13 - "@kelinci/basa-lexicons" 14 - ], 15 - "skipLibCheck": true, 16 - 17 - "module": "ESNext", 18 - "moduleResolution": "bundler", 19 - "moduleDetection": "force", 20 - "allowImportingTsExtensions": true, 21 - "noEmit": true, 22 - "jsx": "preserve", 23 - "jsxImportSource": "solid-js", 24 - 25 - "incremental": true, 26 - "strict": true, 27 - "verbatimModuleSyntax": true, 28 - "noUnusedLocals": true, 29 - "noUnusedParameters": true, 30 - "noFallthroughCasesInSwitch": true, 31 - "noUncheckedSideEffectImports": true, 32 - 33 - "useDefineForClassFields": false, 34 - 35 - "paths": { 36 - "~/*": ["./src/*"] 37 - } 38 - }, 39 - "include": ["src"] 40 - }
+28 -2
tsconfig.json
··· 1 1 { 2 - "files": [], 3 - "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }], 2 + "compilerOptions": { 3 + "target": "ESNext", 4 + "lib": ["DOM", "DOM.Iterable", "ESNext"], 5 + "types": ["dom-close-watcher", "dom-webcodecs"], 6 + "skipLibCheck": true, 7 + 8 + "module": "ESNext", 9 + "moduleResolution": "Bundler", 10 + "allowImportingTsExtensions": true, 11 + "resolveJsonModule": true, 12 + "noEmit": true, 13 + "jsx": "preserve", 14 + "jsxImportSource": "solid-js", 15 + 16 + "incremental": true, 17 + "strict": true, 18 + "verbatimModuleSyntax": true, 19 + "noUnusedLocals": true, 20 + "noUnusedParameters": true, 21 + "noFallthroughCasesInSwitch": true, 22 + 23 + "useDefineForClassFields": false, 24 + 25 + "paths": { 26 + "~/*": ["./src/*"], 27 + }, 28 + }, 29 + "include": ["src"], 4 30 }
-27
tsconfig.node.json
··· 1 - { 2 - "compilerOptions": { 3 - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 - 5 - "target": "ESNext", 6 - "lib": ["ESNext"], 7 - "types": ["node"], 8 - "skipLibCheck": true, 9 - 10 - "module": "ESNext", 11 - "moduleResolution": "bundler", 12 - "moduleDetection": "force", 13 - "allowImportingTsExtensions": true, 14 - "noEmit": true, 15 - 16 - "incremental": true, 17 - "strict": true, 18 - "verbatimModuleSyntax": true, 19 - "noUnusedLocals": true, 20 - "noUnusedParameters": true, 21 - "noFallthroughCasesInSwitch": true, 22 - "noUncheckedSideEffectImports": true, 23 - 24 - "useDefineForClassFields": false 25 - }, 26 - "include": ["vite.config.ts"] 27 - }
+144
vite.config.js
··· 1 + import * as path from 'node:path'; 2 + 3 + import { defineConfig } from 'vite'; 4 + import { VitePWA } from 'vite-plugin-pwa'; 5 + import solid from 'vite-plugin-solid'; 6 + 7 + import metadata from './public/oauth/client-metadata.json'; 8 + 9 + const SERVER_HOST = '127.0.0.1'; 10 + const SERVER_PORT = 52222; 11 + 12 + export default defineConfig({ 13 + build: { 14 + target: 'esnext', 15 + modulePreload: false, 16 + sourcemap: true, 17 + assetsInlineLimit: 0, 18 + minify: 'terser', 19 + rollupOptions: { 20 + output: { 21 + chunkFileNames: 'assets/[hash].js', 22 + manualChunks: { 23 + common: [ 24 + 'solid-js', 25 + 'solid-js/store', 26 + 'solid-js/web', 27 + 28 + '@atcute/client', 29 + '@atcute/oauth-browser-client', 30 + '@mary/events', 31 + '@mary/solid-query', 32 + 33 + 'src/service-worker.tsx', 34 + 35 + 'src/globals/events.ts', 36 + 'src/globals/locales.ts', 37 + 'src/globals/modals.tsx', 38 + 'src/globals/navigation.ts', 39 + 'src/globals/preferences.ts', 40 + 41 + 'src/lib/states/agent.tsx', 42 + 'src/lib/states/session.tsx', 43 + 'src/lib/states/theme.tsx', 44 + ], 45 + shell: ['src/shell.tsx'], 46 + }, 47 + }, 48 + }, 49 + terserOptions: { 50 + compress: { 51 + passes: 3, 52 + }, 53 + }, 54 + }, 55 + resolve: { 56 + alias: { 57 + '~': path.join(__dirname, './src'), 58 + }, 59 + }, 60 + server: { 61 + host: SERVER_HOST, 62 + port: SERVER_PORT, 63 + }, 64 + optimizeDeps: { 65 + esbuildOptions: { 66 + target: 'esnext', 67 + }, 68 + }, 69 + plugins: [ 70 + solid({ 71 + babel: { 72 + plugins: [['babel-plugin-transform-typescript-const-enums']], 73 + }, 74 + }), 75 + VitePWA({ 76 + registerType: 'prompt', 77 + injectRegister: null, 78 + workbox: { 79 + globPatterns: ['**/*.{js,css,html,svg,jpg,png}'], 80 + cleanupOutdatedCaches: true, 81 + }, 82 + manifest: { 83 + id: '/', 84 + start_url: '/', 85 + scope: '/', 86 + name: 'Aglais', 87 + short_name: 'Aglais', 88 + description: 'Alternative web client for Bluesky', 89 + display: 'standalone', 90 + background_color: '#000000', 91 + icons: [ 92 + { 93 + src: 'favicon.png', 94 + type: 'image/png', 95 + sizes: '150x150', 96 + }, 97 + ], 98 + }, 99 + }), 100 + 101 + // Transform the icon components to remove the `() => _tmpl$()` wrapper 102 + { 103 + transform(code, id) { 104 + if (!id.includes('/icons-central/')) { 105 + return; 106 + } 107 + 108 + const transformed = code.replace( 109 + /(?<=createIcon\()\(\)\s*=>*.([\w$]+)\(\)(?=\))/g, 110 + (match, id) => id, 111 + ); 112 + 113 + return { code: transformed, map: null }; 114 + }, 115 + }, 116 + 117 + // Injects OAuth-related variables 118 + { 119 + config(_conf, { command }) { 120 + if (command === 'build') { 121 + process.env.VITE_OAUTH_CLIENT_ID = metadata.client_id; 122 + process.env.VITE_OAUTH_REDIRECT_URL = metadata.redirect_uris[0]; 123 + } else { 124 + const redirectUri = (() => { 125 + const url = new URL(metadata.redirect_uris[0]); 126 + return `http://${SERVER_HOST}:${SERVER_PORT}${url.pathname}`; 127 + })(); 128 + 129 + const clientId = 130 + `http://localhost` + 131 + `?redirect_uri=${encodeURIComponent(redirectUri)}` + 132 + `&scope=${encodeURIComponent(metadata.scope)}`; 133 + 134 + process.env.VITE_DEV_SERVER_PORT = '' + SERVER_PORT; 135 + process.env.VITE_OAUTH_CLIENT_ID = clientId; 136 + process.env.VITE_OAUTH_REDIRECT_URL = redirectUri; 137 + } 138 + 139 + process.env.VITE_CLIENT_URI = metadata.client_uri; 140 + process.env.VITE_OAUTH_SCOPE = metadata.scope; 141 + }, 142 + }, 143 + ], 144 + });
-146
vite.config.ts
··· 1 - import * as path from 'node:path'; 2 - 3 - import { defineConfig } from 'vite'; 4 - import { VitePWA } from 'vite-plugin-pwa'; 5 - import solid from 'vite-plugin-solid'; 6 - 7 - import metadata from './public/oauth-client-metadata.json'; 8 - 9 - const SERVER_HOST = '127.0.0.1'; 10 - const SERVER_PORT = 52222; 11 - 12 - export default defineConfig({ 13 - build: { 14 - target: 'esnext', 15 - modulePreload: false, 16 - sourcemap: true, 17 - assetsInlineLimit: 0, 18 - minify: 'terser', 19 - rollupOptions: { 20 - output: { 21 - chunkFileNames: 'assets/[hash].js', 22 - manualChunks: { 23 - common: [ 24 - 'solid-js', 25 - 'solid-js/store', 26 - 'solid-js/web', 27 - 28 - '@atcute/client', 29 - '@atcute/oauth-browser-client', 30 - '@mary/events', 31 - '@mary/solid-query', 32 - 33 - 'src/service-worker.tsx', 34 - 35 - 'src/globals/events.ts', 36 - 'src/globals/locales.ts', 37 - 'src/globals/modals.tsx', 38 - 'src/globals/navigation.ts', 39 - 'src/globals/preferences.ts', 40 - 41 - 'src/lib/states/agent.tsx', 42 - 'src/lib/states/session.tsx', 43 - 'src/lib/states/theme.tsx', 44 - ], 45 - shell: ['src/shell.tsx'], 46 - }, 47 - }, 48 - }, 49 - terserOptions: { 50 - compress: { 51 - passes: 3, 52 - }, 53 - }, 54 - }, 55 - resolve: { 56 - alias: { 57 - '~': path.join(__dirname, './src'), 58 - }, 59 - }, 60 - server: { 61 - host: SERVER_HOST, 62 - port: SERVER_PORT, 63 - }, 64 - optimizeDeps: { 65 - esbuildOptions: { 66 - target: 'esnext', 67 - }, 68 - }, 69 - plugins: [ 70 - solid({ 71 - babel: { 72 - plugins: [['babel-plugin-transform-typescript-const-enums']], 73 - }, 74 - }), 75 - VitePWA({ 76 - registerType: 'prompt', 77 - injectRegister: null, 78 - workbox: { 79 - globPatterns: ['**/*.{js,css,html,svg,jpg,png}'], 80 - cleanupOutdatedCaches: true, 81 - }, 82 - manifest: { 83 - id: '/', 84 - start_url: '/', 85 - scope: '/', 86 - name: 'Aglais', 87 - short_name: 'Aglais', 88 - description: 'Alternative web client for Bluesky', 89 - display: 'standalone', 90 - background_color: '#000000', 91 - icons: [ 92 - { 93 - src: 'favicon.png', 94 - type: 'image/png', 95 - sizes: '150x150', 96 - }, 97 - ], 98 - }, 99 - }), 100 - 101 - // Transform the icon components to remove the `() => _tmpl$()` wrapper 102 - { 103 - name: 'aglais-icon-transform', 104 - transform(code, id) { 105 - if (!id.includes('/icons-central/')) { 106 - return; 107 - } 108 - 109 - const transformed = code.replace( 110 - /(?<=createIcon\()\(\)\s*=>*.([\w$]+)\(\)(?=\))/g, 111 - (_match, id) => id, 112 - ); 113 - 114 - return { code: transformed, map: null }; 115 - }, 116 - }, 117 - 118 - // Injects OAuth-related variables 119 - { 120 - name: 'aglais-oauth-inject', 121 - config(_conf, { command }) { 122 - if (command === 'build') { 123 - process.env.VITE_OAUTH_CLIENT_ID = metadata.client_id; 124 - process.env.VITE_OAUTH_REDIRECT_URL = metadata.redirect_uris[0]; 125 - } else { 126 - const redirectUri = (() => { 127 - const url = new URL(metadata.redirect_uris[0]); 128 - return `http://${SERVER_HOST}:${SERVER_PORT}${url.pathname}`; 129 - })(); 130 - 131 - const clientId = 132 - `http://localhost` + 133 - `?redirect_uri=${encodeURIComponent(redirectUri)}` + 134 - `&scope=${encodeURIComponent(metadata.scope)}`; 135 - 136 - process.env.VITE_DEV_SERVER_PORT = '' + SERVER_PORT; 137 - process.env.VITE_OAUTH_CLIENT_ID = clientId; 138 - process.env.VITE_OAUTH_REDIRECT_URL = redirectUri; 139 - } 140 - 141 - process.env.VITE_CLIENT_URI = metadata.client_uri; 142 - process.env.VITE_OAUTH_SCOPE = metadata.scope; 143 - }, 144 - }, 145 - ], 146 - });
-9
wrangler.jsonc
··· 1 - { 2 - "$schema": "https://unpkg.com/wrangler@latest/config-schema.json", 3 - "name": "aglais", 4 - "compatibility_date": "2025-08-25", 5 - "assets": { 6 - "directory": "dist", 7 - "not_found_handling": "single-page-application", 8 - }, 9 - }