Bluesky app fork with some witchin' additions 💫

Add cashtag support for stock ticker discussions (#9689)

* Add cashtag support for stock ticker discussions

Display cashtags ($TICKER format) as clickable links with dedicated menu actions and search feed, alongside hashtags. Includes composer highlighting and proper formatting.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix cashtag search query to use # prefix

Cashtags need to be searched as "#$BTC" rather than just "$BTC" to work
with the search API.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update @atproto/api to 0.18.14 with cashtag support

The updated package includes native CASHTAG_REGEX detection for stock
ticker symbols like $AAPL and $BTC.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix todo, remove redundant validation

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
Co-authored-by: Eric Bailey <git@esb.lol>

authored by samuel.fm

Claude Haiku 4.5
Eric Bailey
and committed by
GitHub
26aa7c0d 498a09e7

+228 -140
+1 -1
package.json
··· 226 226 "zod": "^3.20.2" 227 227 }, 228 228 "devDependencies": { 229 - "@atproto/dev-env": "^0.3.196", 229 + "@atproto/dev-env": "^0.3.204", 230 230 "@babel/core": "^7.26.0", 231 231 "@babel/preset-env": "^7.26.0", 232 232 "@babel/runtime": "^7.26.0",
+16 -7
src/components/RichTextTag.tsx
··· 48 48 reset: resetRemove, 49 49 } = useRemoveMutedWordsMutation() 50 50 const navigation = useNavigation<NavigationProp>() 51 - const label = _(msg`Hashtag ${tag}`) 51 + const isCashtag = tag.startsWith('$') 52 + const label = isCashtag ? _(msg`Cashtag ${tag}`) : _(msg`Hashtag ${tag}`) 52 53 const hint = isNative 53 - ? _(msg`Long press to open tag menu for #${tag}`) 54 - : _(msg`Click to open tag menu for ${tag}`) 54 + ? _(msg`Long press to open tag menu for ${isCashtag ? tag : `#${tag}`}`) 55 + : _(msg`Click to open tag menu for ${isCashtag ? tag : `#${tag}`}`) 55 56 56 57 const isMuted = Boolean( 57 58 (preferences?.moderationPrefs.mutedWords?.find( ··· 109 110 <Menu.Outer> 110 111 <Menu.Group> 111 112 <Menu.Item 112 - label={_(msg`See ${tag} posts`)} 113 + label={_(msg`See ${isCashtag ? tag : `#${tag}`} posts`)} 113 114 onPress={() => { 114 115 navigation.push('Hashtag', { 115 116 tag: encodeURIComponent(tag), 116 117 }) 117 118 }}> 118 119 <Menu.ItemText> 119 - <Trans>See #{tag} posts</Trans> 120 + {isCashtag ? ( 121 + <Trans>See {tag} posts</Trans> 122 + ) : ( 123 + <Trans>See #{tag} posts</Trans> 124 + )} 120 125 </Menu.ItemText> 121 126 <Menu.ItemIcon icon={Search} /> 122 127 </Menu.Item> 123 128 {authorHandle && !isInvalidHandle(authorHandle) && ( 124 129 <Menu.Item 125 - label={_(msg`See ${tag} posts by user`)} 130 + label={_(msg`See ${isCashtag ? tag : `#${tag}`} posts by user`)} 126 131 onPress={() => { 127 132 navigation.push('Hashtag', { 128 133 tag: encodeURIComponent(tag), ··· 130 135 }) 131 136 }}> 132 137 <Menu.ItemText> 133 - <Trans>See #{tag} posts by user</Trans> 138 + {isCashtag ? ( 139 + <Trans>See {tag} posts by user</Trans> 140 + ) : ( 141 + <Trans>See #{tag} posts by user</Trans> 142 + )} 134 143 </Menu.ItemText> 135 144 <Menu.ItemIcon icon={Person} /> 136 145 </Menu.Item>
+21 -8
src/screens/Hashtag.tsx
··· 46 46 const {tag, author} = route.params 47 47 const {_} = useLingui() 48 48 49 + const decodedTag = React.useMemo(() => { 50 + return decodeURIComponent(tag) 51 + }, [tag]) 52 + 53 + const isCashtag = decodedTag.startsWith('$') 54 + 49 55 const fullTag = React.useMemo(() => { 50 - return `#${decodeURIComponent(tag)}` 51 - }, [tag]) 56 + // Cashtags already include the $ prefix, hashtags need # added 57 + return isCashtag ? decodedTag : `#${decodedTag}` 58 + }, [decodedTag, isCashtag]) 52 59 53 60 const headerTitle = React.useMemo(() => { 54 - return enforceLen(fullTag.toLowerCase(), 24, true, 'middle') 55 - }, [fullTag]) 61 + // Keep cashtags uppercase, lowercase hashtags 62 + const displayTag = isCashtag ? fullTag.toUpperCase() : fullTag.toLowerCase() 63 + return enforceLen(displayTag, 24, true, 'middle') 64 + }, [fullTag, isCashtag]) 56 65 57 66 const sanitizedAuthor = React.useMemo(() => { 58 67 if (!author) return ··· 172 181 const {hasSession} = useSession() 173 182 const trackPostView = usePostViewTracking('Hashtag') 174 183 184 + const isCashtag = fullTag.startsWith('$') 185 + 175 186 const queryParam = React.useMemo(() => { 176 - if (!author) return fullTag 177 - return `${fullTag} from:${author}` 178 - }, [fullTag, author]) 187 + // Cashtags need # prefix for search: "#$BTC" or "#$BTC from:author" 188 + const searchTag = isCashtag ? `#${fullTag}` : fullTag 189 + if (!author) return searchTag 190 + return `${searchTag} from:${author}` 191 + }, [fullTag, author, isCashtag]) 179 192 180 193 const { 181 194 data, ··· 255 268 isError={isError} 256 269 onRetry={refetch} 257 270 emptyType="results" 258 - emptyMessage={_(msg`We couldn't find any results for that hashtag.`)} 271 + emptyMessage={_(msg`We couldn't find any results for that tag.`)} 259 272 /> 260 273 ) : ( 261 274 <List
+27 -1
src/view/com/composer/text-input/web/TagDecorator.ts
··· 14 14 * the facet-set. 15 15 */ 16 16 17 - import {TAG_REGEX, TRAILING_PUNCTUATION_REGEX} from '@atproto/api' 17 + import { 18 + CASHTAG_REGEX, 19 + TAG_REGEX, 20 + TRAILING_PUNCTUATION_REGEX, 21 + } from '@atproto/api' 18 22 import {Mark} from '@tiptap/core' 19 23 import {type Node as ProsemirrorNode} from '@tiptap/pm/model' 20 24 import {Plugin, PluginKey} from '@tiptap/pm/state' ··· 28 32 const regex = TAG_REGEX 29 33 const textContent = node.textContent 30 34 35 + // Detect hashtags 31 36 let match 32 37 while ((match = regex.exec(textContent))) { 33 38 const [matchedString, __, tag] = match ··· 44 49 * highlight by -1 to include the `#` 45 50 */ 46 51 const start = pos + matchedFrom - 1 52 + const end = pos + matchedTo 53 + 54 + decorations.push( 55 + Decoration.inline(start, end, { 56 + class: 'autolink', 57 + }), 58 + ) 59 + } 60 + 61 + // Detect cashtags 62 + const cashtagRegex = new RegExp(CASHTAG_REGEX.source, 'gu') 63 + while ((match = cashtagRegex.exec(textContent))) { 64 + const [_fullMatch, leading, ticker] = match 65 + 66 + if (!ticker) continue 67 + 68 + // Calculate positions: leading char + $ + ticker 69 + const matchedFrom = match.index + leading.length 70 + const matchedTo = matchedFrom + 1 + ticker.length // +1 for $ 71 + 72 + const start = pos + matchedFrom 47 73 const end = pos + matchedTo 48 74 49 75 decorations.push(
+163 -123
yarn.lock
··· 20 20 "@jridgewell/gen-mapping" "^0.3.0" 21 21 "@jridgewell/trace-mapping" "^0.3.9" 22 22 23 - "@atproto-labs/did-resolver@0.2.4": 24 - version "0.2.4" 25 - resolved "https://registry.yarnpkg.com/@atproto-labs/did-resolver/-/did-resolver-0.2.4.tgz#3df8f94845fae10bb284303d6e73ffaa5a91b158" 26 - integrity sha512-sbXxBnAJWsKv/FEGG6a/WLz7zQYUr1vA2TXvNnPwwJQJCjPwEJMOh1vM22wBr185Phy7D2GD88PcRokn7eUVyw== 23 + "@atproto-labs/did-resolver@0.2.5": 24 + version "0.2.5" 25 + resolved "https://registry.yarnpkg.com/@atproto-labs/did-resolver/-/did-resolver-0.2.5.tgz#74b34e38b10fe1d18a42b35b32909b9a196e9693" 26 + integrity sha512-he7EC6OMSifNs01a4RT9mta/yYitoKDzlK9ty2TFV5Uj/+HpB4vYMRdIDFrRW0Hcsehy90E2t/dw0t7361MEKQ== 27 27 dependencies: 28 28 "@atproto-labs/fetch" "0.2.3" 29 29 "@atproto-labs/pipe" "0.1.1" 30 30 "@atproto-labs/simple-store" "0.3.0" 31 31 "@atproto-labs/simple-store-memory" "0.1.4" 32 - "@atproto/did" "0.2.3" 32 + "@atproto/did" "0.2.4" 33 33 zod "^3.23.8" 34 34 35 35 "@atproto-labs/fetch-node@0.2.0": ··· 82 82 "@atproto/xrpc" "^0.7.6" 83 83 "@atproto/xrpc-server" "^0.10.0" 84 84 85 - "@atproto/api@^0.18.15": 85 + "@atproto/api@^0.18.13", "@atproto/api@^0.18.15": 86 86 version "0.18.15" 87 87 resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.15.tgz#25ce82081216bdefbf5397220de76ac3ba9e3f5d" 88 88 integrity sha512-GeaTP7HMRZa8jD6trMuTACa8t2jkFtRmcwWgrB0FT7l9jVCXrKpYupWeIeauEgWHNwWUUiaq3LmCox+HBy8ZMQ== ··· 96 96 tlds "^1.234.0" 97 97 zod "^3.23.8" 98 98 99 - "@atproto/api@^0.18.5", "@atproto/api@^0.18.7": 100 - version "0.18.7" 101 - resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.7.tgz#3175ec8f1909ddcae488183a2180de234e7acce4" 102 - integrity sha512-vUluqN1XU5AX5tgfSJjjjUzALCMq8DjdI0jlIhRYyn2Chb0ZOCU8k0ZTpUAcuDFE2FoxxW4S3kvtlHwLMtN5dQ== 103 - dependencies: 104 - "@atproto/common-web" "^0.4.7" 105 - "@atproto/lexicon" "^0.6.0" 106 - "@atproto/syntax" "^0.4.2" 107 - "@atproto/xrpc" "^0.7.7" 108 - await-lock "^2.2.2" 109 - multiformats "^9.9.0" 110 - tlds "^1.234.0" 111 - zod "^3.23.8" 112 - 113 - "@atproto/api@^0.18.6": 114 - version "0.18.6" 115 - resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.6.tgz#04c26b97bda01cbe276dea523de6e4a184894c18" 116 - integrity sha512-dkzy2OHSAGgzG9GExvOiwRY73EzVD2AiD3nksng+V6erG0kwLfbmVYjoP9mq9Y16BCXr/7q9lekfogthqU614Q== 99 + "@atproto/api@^0.18.14", "@atproto/api@^0.18.8": 100 + version "0.18.14" 101 + resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.14.tgz#8cda4323f46928a651bb8f5cae4994bc47e78885" 102 + integrity sha512-1pWAPbuG3RA1o8uOAwYWZOddvNjuweYOxwTvys1q/r9NCjoGkZY0uJUy1dr6LKFaDk8bjikd2O1cgsRwFfv6Fw== 117 103 dependencies: 118 - "@atproto/common-web" "^0.4.7" 104 + "@atproto/common-web" "^0.4.12" 119 105 "@atproto/lexicon" "^0.6.0" 120 106 "@atproto/syntax" "^0.4.2" 121 107 "@atproto/xrpc" "^0.7.7" ··· 142 128 multiformats "^9.9.0" 143 129 uint8arrays "3.0.0" 144 130 145 - "@atproto/bsky@^0.0.202": 146 - version "0.0.202" 147 - resolved "https://registry.yarnpkg.com/@atproto/bsky/-/bsky-0.0.202.tgz#7b4376dba273a4c1b810846074974d1b11a58e5c" 148 - integrity sha512-QE0T/Vr/WdPZ1lUAZNtNqkH9D+Ii7+95oUR0Q2EYyr0J9G3hlLTvc/FJog91aSe6fzZludRB/n1sRUfdMRePdg== 131 + "@atproto/bsky@^0.0.210": 132 + version "0.0.210" 133 + resolved "https://registry.yarnpkg.com/@atproto/bsky/-/bsky-0.0.210.tgz#e9217025479e49d371f80b498992f0599eb2b79f" 134 + integrity sha512-FZ/AWxAvg7BaHE1AZErUZpAD1zA/laOSlaWhk7/E0nKHcXH7mgWXWeE5CJsCT8sSpoLm4GIYV/4wC3lFbSu33g== 149 135 dependencies: 150 136 "@atproto-labs/fetch-node" "0.2.0" 151 137 "@atproto-labs/xrpc-utils" "0.0.24" 152 - "@atproto/api" "^0.18.7" 153 - "@atproto/common" "^0.5.3" 138 + "@atproto/api" "^0.18.13" 139 + "@atproto/common" "^0.5.7" 154 140 "@atproto/crypto" "^0.4.5" 155 - "@atproto/did" "^0.2.3" 141 + "@atproto/did" "^0.2.4" 156 142 "@atproto/identity" "^0.4.10" 157 143 "@atproto/lexicon" "^0.6.0" 158 144 "@atproto/repo" "^0.8.12" 159 145 "@atproto/sync" "^0.1.39" 160 146 "@atproto/syntax" "^0.4.2" 161 - "@atproto/xrpc-server" "^0.10.3" 147 + "@atproto/xrpc-server" "^0.10.8" 162 148 "@bufbuild/protobuf" "^1.5.0" 163 149 "@connectrpc/connect" "^1.1.4" 164 150 "@connectrpc/connect-express" "^1.1.4" ··· 208 194 pino-http "^8.2.1" 209 195 typed-emitter "^2.1.0" 210 196 211 - "@atproto/common-web@^0.4.12": 197 + "@atproto/common-web@^0.4.11", "@atproto/common-web@^0.4.12": 212 198 version "0.4.12" 213 199 resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.4.12.tgz#04135bef480d9e12cfef124ee45d8236764e7509" 214 200 integrity sha512-3aCJemqM/fkHQrVPbTCHCdiVstKFI+2LkFLvUhO6XZP0EqUZa/rg/CIZBKTFUWu9I5iYiaEiXL9VwcDRpEevSw== ··· 279 265 multiformats "^9.9.0" 280 266 pino "^8.21.0" 281 267 268 + "@atproto/common@^0.5.7", "@atproto/common@^0.5.8": 269 + version "0.5.8" 270 + resolved "https://registry.yarnpkg.com/@atproto/common/-/common-0.5.8.tgz#90d8a99405140885631a380fe24a97be15107c49" 271 + integrity sha512-6BS6OJ/eiN/w8cu3xG1NA/waq9jBsYXZ6pfV85WUDegbfZaGS/IVtpJtjdE7LemE8cJys3AqGFDVJzeXDBQgbw== 272 + dependencies: 273 + "@atproto/common-web" "^0.4.12" 274 + "@atproto/lex-cbor" "0.0.8" 275 + "@atproto/lex-data" "0.0.8" 276 + iso-datestring-validator "^2.2.2" 277 + multiformats "^9.9.0" 278 + pino "^8.21.0" 279 + 282 280 "@atproto/crypto@0.1.0": 283 281 version "0.1.0" 284 282 resolved "https://registry.yarnpkg.com/@atproto/crypto/-/crypto-0.1.0.tgz#bc73a479f9dbe06fa025301c182d7f7ab01bc568" ··· 308 306 "@noble/hashes" "^1.6.1" 309 307 uint8arrays "3.0.0" 310 308 311 - "@atproto/dev-env@^0.3.196": 312 - version "0.3.196" 313 - resolved "https://registry.yarnpkg.com/@atproto/dev-env/-/dev-env-0.3.196.tgz#e98d3f3e7a7cee874425b01bfc164e22d1111664" 314 - integrity sha512-65LrDGcGIFrZ+JnQlW38ZFO9jYO1Sp9fHc2rRq6bZzfAGT6c7K3EWHhXhNDtQ4oL3DYAT9+p56Pcv68XMaSipA== 309 + "@atproto/dev-env@^0.3.204": 310 + version "0.3.204" 311 + resolved "https://registry.yarnpkg.com/@atproto/dev-env/-/dev-env-0.3.204.tgz#cb7360ee2f6be7301c60d964b6e3f96351808be6" 312 + integrity sha512-MdqkjGVXH2AovnFpHrWgImr7dGtbEKsaVpDxKo2LelJ9Cwc015fc1Mzfa+4h7DHoDwtjiAZIBG7rH8ZWO7hZPQ== 315 313 dependencies: 316 - "@atproto/api" "^0.18.7" 317 - "@atproto/bsky" "^0.0.202" 314 + "@atproto/api" "^0.18.13" 315 + "@atproto/bsky" "^0.0.210" 318 316 "@atproto/bsync" "^0.0.23" 319 - "@atproto/common-web" "^0.4.7" 317 + "@atproto/common-web" "^0.4.11" 320 318 "@atproto/crypto" "^0.4.5" 321 319 "@atproto/identity" "^0.4.10" 322 320 "@atproto/lexicon" "^0.6.0" 323 - "@atproto/ozone" "^0.1.160" 324 - "@atproto/pds" "^0.4.199" 321 + "@atproto/ozone" "^0.1.161" 322 + "@atproto/pds" "^0.4.203" 325 323 "@atproto/sync" "^0.1.39" 326 324 "@atproto/syntax" "^0.4.2" 327 - "@atproto/xrpc-server" "^0.10.3" 325 + "@atproto/xrpc-server" "^0.10.8" 328 326 "@did-plc/lib" "^0.0.1" 329 327 "@did-plc/server" "^0.0.1" 330 328 dotenv "^16.0.3" ··· 334 332 uint8arrays "3.0.0" 335 333 undici "^6.14.1" 336 334 337 - "@atproto/did@0.2.3", "@atproto/did@^0.2.3": 335 + "@atproto/did@0.2.4", "@atproto/did@^0.2.4": 336 + version "0.2.4" 337 + resolved "https://registry.yarnpkg.com/@atproto/did/-/did-0.2.4.tgz#8843b4e53cc1de22e710d4db47170ca2f631dee4" 338 + integrity sha512-nxNiCgXeo7pfjojq9fpfZxCO0X0xUipNVKW+AHNZwQKiUDt6zYL0VXEfm8HBUwQOCmKvj2pRRSM1Cur+tUWk3g== 339 + dependencies: 340 + zod "^3.23.8" 341 + 342 + "@atproto/did@^0.2.3": 338 343 version "0.2.3" 339 344 resolved "https://registry.yarnpkg.com/@atproto/did/-/did-0.2.3.tgz#83cd18ae105324913b30a2259cd9d886677b2d15" 340 345 integrity sha512-VI8JJkSizvM2cHYJa37WlbzeCm5tWpojyc1/Zy8q8OOjyoy6X4S4BEfoP941oJcpxpMTObamibQIXQDo7tnIjg== ··· 374 379 multiformats "^9.9.0" 375 380 tslib "^2.8.1" 376 381 377 - "@atproto/lex-cbor@0.0.3", "@atproto/lex-cbor@^0.0.3": 382 + "@atproto/lex-cbor@0.0.3": 378 383 version "0.0.3" 379 384 resolved "https://registry.yarnpkg.com/@atproto/lex-cbor/-/lex-cbor-0.0.3.tgz#13712fa5216cd336ebbd31fbd34d35bf6ea21492" 380 385 integrity sha512-N8lCV3kK5ZcjSOWxKLWqzlnaSpK4isjXRZ0EqApl/5y9KB64s78hQ/U3KIE5qnPRlBbW5kSH3YACoU27u9nTOA== ··· 383 388 multiformats "^9.9.0" 384 389 tslib "^2.8.1" 385 390 386 - "@atproto/lex-client@0.0.4": 387 - version "0.0.4" 388 - resolved "https://registry.yarnpkg.com/@atproto/lex-client/-/lex-client-0.0.4.tgz#04fca87296f3177ba122e41bed89d36b4d81b01a" 389 - integrity sha512-tGaenywYo6IvzKKMYuZB+sMBQNDkQ53PLz/NM0WeXnaa/e58VhOGzwVLnNSI/QR9qLlwHFfMf8AIFZyAVHBWCw== 391 + "@atproto/lex-cbor@0.0.8", "@atproto/lex-cbor@^0.0.8": 392 + version "0.0.8" 393 + resolved "https://registry.yarnpkg.com/@atproto/lex-cbor/-/lex-cbor-0.0.8.tgz#191e3443bb3157618f4b66637b305c6127ab5c28" 394 + integrity sha512-WFUkNTLUMunPaA+NkD2INwfhrgo5fAMz7zSk2ncoqbK2AS78X2ith8TJSevY0ynPukbFmaJ9BdauzCpWQ4ZIqQ== 395 + dependencies: 396 + "@atproto/lex-data" "0.0.8" 397 + tslib "^2.8.1" 398 + 399 + "@atproto/lex-client@0.0.9": 400 + version "0.0.9" 401 + resolved "https://registry.yarnpkg.com/@atproto/lex-client/-/lex-client-0.0.9.tgz#595cc805583587bcd19d1ce3a7957d15289c0e0b" 402 + integrity sha512-30WtEedG0s/JNkbHzxpObkUg0id4+/p1O7LcUVCQWrNhWRw/hCzhHySSgFKKIVeLKAYIrZmaWt1XlAdNhGO7DQ== 390 403 dependencies: 391 - "@atproto/lex-data" "0.0.3" 392 - "@atproto/lex-json" "0.0.3" 393 - "@atproto/lex-schema" "0.0.4" 404 + "@atproto/lex-data" "0.0.8" 405 + "@atproto/lex-json" "0.0.8" 406 + "@atproto/lex-schema" "0.0.9" 394 407 tslib "^2.8.1" 395 408 396 409 "@atproto/lex-data@0.0.2": ··· 404 417 uint8arrays "3.0.0" 405 418 unicode-segmenter "^0.14.0" 406 419 407 - "@atproto/lex-data@0.0.3", "@atproto/lex-data@^0.0.3": 420 + "@atproto/lex-data@0.0.3": 408 421 version "0.0.3" 409 422 resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.3.tgz#1ce1bd19e17af41b2991a2a02ad439a136dec4e9" 410 423 integrity sha512-ivo1IpY/EX+RIpxPgCf4cPhQo5bfu4nrpa1vJCt8hCm9SfoonJkDFGa0n4SMw4JnXZoUcGcrJ46L+D8bH6GI2g== ··· 415 428 uint8arrays "3.0.0" 416 429 unicode-segmenter "^0.14.0" 417 430 418 - "@atproto/lex-data@0.0.8": 431 + "@atproto/lex-data@0.0.8", "@atproto/lex-data@^0.0.8": 419 432 version "0.0.8" 420 433 resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.8.tgz#46cc261efbfa6cc05bf04439d2d73cd8386b467d" 421 434 integrity sha512-1Y5tz7BkS7380QuLNXaE8GW8Xba+mRWugt8BKM4BUFYjjUZdmirU8lr72iM4XlEBrzRu8Cfvj+MbsbYaZv+IgA== ··· 426 439 uint8arrays "3.0.0" 427 440 unicode-segmenter "^0.14.0" 428 441 429 - "@atproto/lex-document@0.0.5": 430 - version "0.0.5" 431 - resolved "https://registry.yarnpkg.com/@atproto/lex-document/-/lex-document-0.0.5.tgz#8d4851b351149ba673c1de9c1898c3c9ebd8b4b3" 432 - integrity sha512-faGcwsupdtvoFZ8ILEu14MYJ0z/pCiQ+Yu4WEkVtJvy8jIkFxeZ8MxxZgm8KrlSt6jxsyYvMpscQCtYpVmafFQ== 442 + "@atproto/lex-document@0.0.10": 443 + version "0.0.10" 444 + resolved "https://registry.yarnpkg.com/@atproto/lex-document/-/lex-document-0.0.10.tgz#a58cdd79fc49e411d4024037f18a2ad0297887e1" 445 + integrity sha512-GrvO36UyWhStSNN0CtVswMyzYK7eUA0zLjYJRqpghAyzYV9ZVXTUL1Vx79MUSg3tC1jDM1A0hmtsjE1Cyo2rHQ== 433 446 dependencies: 434 - "@atproto/lex-schema" "0.0.4" 447 + "@atproto/lex-schema" "0.0.9" 435 448 core-js "^3" 436 449 tslib "^2.8.1" 437 450 ··· 459 472 "@atproto/lex-data" "0.0.8" 460 473 tslib "^2.8.1" 461 474 462 - "@atproto/lex-resolver@0.0.5": 463 - version "0.0.5" 464 - resolved "https://registry.yarnpkg.com/@atproto/lex-resolver/-/lex-resolver-0.0.5.tgz#9d0645c43423cb99b491ca8e658770395d2cd630" 465 - integrity sha512-gBqHY1HS/g2rxuk8CPzB1cmMxmOWK897/jIboMhYDXnuavg8zh54eljCFXr8GvaJdo5DnMGyBEilHNppJOD4mg== 475 + "@atproto/lex-resolver@0.0.10": 476 + version "0.0.10" 477 + resolved "https://registry.yarnpkg.com/@atproto/lex-resolver/-/lex-resolver-0.0.10.tgz#2139836dd80a5f5d31979d9fb2f10872a4a844b6" 478 + integrity sha512-7cV/vjJGHMUbzv1y2kIOChC/B5ox1F5hKpG3fFZdkM8eZ5o9NuMiIojvTgCYdxyH+XA/X6qjblMrru73fFRtmA== 466 479 dependencies: 467 - "@atproto-labs/did-resolver" "0.2.4" 480 + "@atproto-labs/did-resolver" "0.2.5" 468 481 "@atproto/crypto" "0.4.5" 469 - "@atproto/lex-client" "0.0.4" 470 - "@atproto/lex-data" "0.0.3" 471 - "@atproto/lex-document" "0.0.5" 472 - "@atproto/lex-schema" "0.0.4" 482 + "@atproto/lex-client" "0.0.9" 483 + "@atproto/lex-data" "0.0.8" 484 + "@atproto/lex-document" "0.0.10" 485 + "@atproto/lex-schema" "0.0.9" 473 486 "@atproto/repo" "0.8.12" 474 487 "@atproto/syntax" "0.4.2" 475 488 tslib "^2.8.1" 476 489 477 - "@atproto/lex-schema@0.0.4": 478 - version "0.0.4" 479 - resolved "https://registry.yarnpkg.com/@atproto/lex-schema/-/lex-schema-0.0.4.tgz#382998f5c384b864a1bc0c00bd073c1168503895" 480 - integrity sha512-WlF+w/OH16KR9XYW9J7hNEDgHp37uG2EWm8/iJknDFsWYjbhgl71x1jcqqCM8BcDxAYxyJLOvPuadOC6cG5JjA== 490 + "@atproto/lex-schema@0.0.9": 491 + version "0.0.9" 492 + resolved "https://registry.yarnpkg.com/@atproto/lex-schema/-/lex-schema-0.0.9.tgz#b47173092d4ee9850b1fe013963b18b3a8bcf1ed" 493 + integrity sha512-nsXpG0BdWu5Qn8qgs/+tHKP2gdVoYNiYwIUl+lt6EFb5juuOScmPilhZOa9MPDpLLzVgl35x9whjh842CvpHJQ== 481 494 dependencies: 482 - "@atproto/lex-data" "0.0.3" 495 + "@atproto/lex-data" "0.0.8" 483 496 "@atproto/syntax" "0.4.2" 484 497 tslib "^2.8.1" 485 498 ··· 505 518 multiformats "^9.9.0" 506 519 zod "^3.23.8" 507 520 508 - "@atproto/oauth-provider-api@0.3.4": 509 - version "0.3.4" 510 - resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-api/-/oauth-provider-api-0.3.4.tgz#bce9b1a5a6bd759b0de8f6b80c4aced9b64f0c79" 511 - integrity sha512-K3gBqyf9VlYE6tvfD0EDya9WQ9XWtbuhxkI1XHyCIyAvAemhBGoJ1As0ESo3UpJmd2JhA2DmLj4oOvBqknamBA== 521 + "@atproto/oauth-provider-api@0.3.6": 522 + version "0.3.6" 523 + resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-api/-/oauth-provider-api-0.3.6.tgz#ab8ee8f86c3eac7c6008f786205b7f149678f85a" 524 + integrity sha512-ddUCbBH/1X+3YaegJzOTESAc8+ZUwn0sLgKpxp4Na3J6cPeZfXiheWGKxbu5pTPwJr1msCNOakqSMkoLbP7UEA== 512 525 dependencies: 513 526 "@atproto/jwk" "0.6.0" 514 - "@atproto/oauth-types" "0.5.2" 527 + "@atproto/oauth-types" "0.6.1" 515 528 516 - "@atproto/oauth-provider-frontend@0.2.5": 517 - version "0.2.5" 518 - resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-frontend/-/oauth-provider-frontend-0.2.5.tgz#6a62475bf70cc9d198e8e5f6683fb0c8d39797a0" 519 - integrity sha512-9+23B2Wp2G5UvHPiKQGwoK3sOu3JHa+jVfWjbUkXhho0HGL60hAbyrdm0C6n3UER/mLfn8MTjzW9jQSuJXHosg== 529 + "@atproto/oauth-provider-frontend@0.2.7": 530 + version "0.2.7" 531 + resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-frontend/-/oauth-provider-frontend-0.2.7.tgz#b4157fea9fffd970c357f25ed7588359e820d94a" 532 + integrity sha512-cXS/lonP0WzPEcCiv1BuMUyp1Oq+eZpwX3sbvhsNYwtyM+7PLU1KhD9y2VR01S7UhCxRPmpQiIMLvsdVWNddZA== 520 533 optionalDependencies: 521 - "@atproto/oauth-provider-api" "0.3.4" 534 + "@atproto/oauth-provider-api" "0.3.6" 522 535 523 - "@atproto/oauth-provider-ui@0.3.6": 524 - version "0.3.6" 525 - resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-ui/-/oauth-provider-ui-0.3.6.tgz#1181040d33b19ed7124f5ad12833200bcd7892e6" 526 - integrity sha512-uxnBWEX/Ht2JJbeibMhCu3OatKchhQGV4v5KfXzTylX2VIZrRmG8PVr5YnHmijjJZD+NgeDWlFSdyGdZZ7qU9w== 536 + "@atproto/oauth-provider-ui@0.4.1": 537 + version "0.4.1" 538 + resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-ui/-/oauth-provider-ui-0.4.1.tgz#5f957f1eed89409ba842bffb5b7e9bf25c6bcc44" 539 + integrity sha512-70K0uwCCz68qK5bwce8NG6RsBp1pBp/YMzZUGq09XhYVwx/wHgaf1HUFuwLIGV4sVKgahLsNBrRHY9n7fXFbRA== 527 540 optionalDependencies: 528 - "@atproto/oauth-provider-api" "0.3.4" 541 + "@atproto/oauth-provider-api" "0.3.6" 529 542 530 - "@atproto/oauth-provider@^0.14.1": 531 - version "0.14.1" 532 - resolved "https://registry.yarnpkg.com/@atproto/oauth-provider/-/oauth-provider-0.14.1.tgz#b1fd01408bb988ee29f19e2ab6ab323a31ea7590" 533 - integrity sha512-n0qHOhUfSwp6w3i54tC5IjmeE5raoxEyxchJkqvoj/xWBiysdMJwpLTIvQ90rcXbjIA22Jv58oQ/mtx07w82xA== 543 + "@atproto/oauth-provider@^0.15.4": 544 + version "0.15.4" 545 + resolved "https://registry.yarnpkg.com/@atproto/oauth-provider/-/oauth-provider-0.15.4.tgz#eb89d0458f39f3a6c1445b98cbfd5367027fdd26" 546 + integrity sha512-Ypa6WnG8SiTDfQWXF0MUcZJg/4A9jXObWHi4IAd0FZj9kN/vln8hzq8BSQpyAn3Yy8+XVoaKyN/jhzwxkqQ9Sw== 534 547 dependencies: 535 548 "@atproto-labs/fetch" "0.2.3" 536 549 "@atproto-labs/fetch-node" "0.2.0" 537 550 "@atproto-labs/pipe" "0.1.1" 538 551 "@atproto-labs/simple-store" "0.3.0" 539 552 "@atproto-labs/simple-store-memory" "0.1.4" 540 - "@atproto/common" "^0.5.3" 541 - "@atproto/did" "0.2.3" 553 + "@atproto/common" "^0.5.8" 554 + "@atproto/did" "0.2.4" 542 555 "@atproto/jwk" "0.6.0" 543 556 "@atproto/jwk-jose" "0.1.11" 544 - "@atproto/lex-document" "0.0.5" 545 - "@atproto/lex-resolver" "0.0.5" 546 - "@atproto/oauth-provider-api" "0.3.4" 547 - "@atproto/oauth-provider-frontend" "0.2.5" 548 - "@atproto/oauth-provider-ui" "0.3.6" 557 + "@atproto/lex-document" "0.0.10" 558 + "@atproto/lex-resolver" "0.0.10" 559 + "@atproto/oauth-provider-api" "0.3.6" 560 + "@atproto/oauth-provider-frontend" "0.2.7" 561 + "@atproto/oauth-provider-ui" "0.4.1" 549 562 "@atproto/oauth-scopes" "0.3.0" 550 - "@atproto/oauth-types" "0.5.2" 563 + "@atproto/oauth-types" "0.6.1" 551 564 "@atproto/syntax" "0.4.2" 552 565 "@hapi/accept" "^6.0.3" 553 566 "@hapi/address" "^5.1.1" ··· 569 582 "@atproto/did" "^0.2.3" 570 583 "@atproto/syntax" "^0.4.2" 571 584 572 - "@atproto/oauth-types@0.5.2": 573 - version "0.5.2" 574 - resolved "https://registry.yarnpkg.com/@atproto/oauth-types/-/oauth-types-0.5.2.tgz#443d2b004403f33fbdcbe4f3406f645c2785fe04" 575 - integrity sha512-9DCDvtvCanTwAaU5UakYDO0hzcOITS3RutK5zfLytE5Y9unj0REmTDdN8Xd8YCfUJl7T/9pYpf04Uyq7bFTASg== 585 + "@atproto/oauth-types@0.6.1": 586 + version "0.6.1" 587 + resolved "https://registry.yarnpkg.com/@atproto/oauth-types/-/oauth-types-0.6.1.tgz#c75be82016052fd2f877030a4f4832af7d7d7016" 588 + integrity sha512-3z92GN/6zCq9E2GTTfZM27tWEbvi1qwFSA7KoS5+wqBC4kSsLvnLxmbKH402Z40DfWS4YWqw0DkHsgP0LNFDEA== 576 589 dependencies: 577 - "@atproto/did" "0.2.3" 590 + "@atproto/did" "0.2.4" 578 591 "@atproto/jwk" "0.6.0" 579 592 zod "^3.23.8" 580 593 581 - "@atproto/ozone@^0.1.160": 582 - version "0.1.160" 583 - resolved "https://registry.yarnpkg.com/@atproto/ozone/-/ozone-0.1.160.tgz#1131fa6c0d1b37e3a7b0aaa2f788b36eb2f7a750" 584 - integrity sha512-p0CP5/1Anv1qbxoRBC4IOaSkFe28Y3nKmzfrx0Z6in/o8VF/LZ9dhuW1UgrDQs4PyMzMOar3UFfO2ZUL4Gg58A== 594 + "@atproto/ozone@^0.1.161": 595 + version "0.1.161" 596 + resolved "https://registry.yarnpkg.com/@atproto/ozone/-/ozone-0.1.161.tgz#31f776c168c4eba8e095ebcf8f4cfbd13f6f175c" 597 + integrity sha512-gGbo0sbopWnW2zkpeGBrERLuAeI0lhWmnAKoHK3g1/F/r3V/8k2MRAEMq7bhwOY7uCVoZq4ob4sX+pCNPUM8AQ== 585 598 dependencies: 586 - "@atproto/api" "^0.18.5" 599 + "@atproto/api" "^0.18.8" 587 600 "@atproto/common" "^0.5.3" 588 601 "@atproto/crypto" "^0.4.5" 589 602 "@atproto/identity" "^0.4.10" 590 603 "@atproto/lexicon" "^0.6.0" 591 604 "@atproto/syntax" "^0.4.2" 592 - "@atproto/ws-client" "^0.0.3" 605 + "@atproto/ws-client" "^0.0.4" 593 606 "@atproto/xrpc" "^0.7.7" 594 - "@atproto/xrpc-server" "^0.10.3" 607 + "@atproto/xrpc-server" "^0.10.4" 595 608 "@did-plc/lib" "^0.0.1" 596 609 compression "^1.7.4" 597 610 cors "^2.8.5" ··· 609 622 undici "^6.14.1" 610 623 ws "^8.12.0" 611 624 612 - "@atproto/pds@^0.4.199": 613 - version "0.4.199" 614 - resolved "https://registry.yarnpkg.com/@atproto/pds/-/pds-0.4.199.tgz#8cdf10ad449c57206b4820191ecfb358346908bd" 615 - integrity sha512-EtXVzPusvLVRIhjUutKcb75lPN9oWD24bZGbRrDaehcbI0QXbosGek/vgil0ZFLn0YW3G/BssM0K63KUotscrw== 625 + "@atproto/pds@^0.4.203": 626 + version "0.4.204" 627 + resolved "https://registry.yarnpkg.com/@atproto/pds/-/pds-0.4.204.tgz#d6f6280b7c21bdac2a80470ec187f726a5c94c63" 628 + integrity sha512-bADjh9TWbfyN/FGPRmolvDPatmfoWfv3pstlujEXBi3ja67nJAbhdtqrMesVAltmD8GzrLw1/APrYoYJ0Pi8GA== 616 629 dependencies: 617 630 "@atproto-labs/fetch-node" "0.2.0" 618 631 "@atproto-labs/simple-store" "0.3.0" 619 632 "@atproto-labs/simple-store-memory" "0.1.4" 620 633 "@atproto-labs/simple-store-redis" "0.0.1" 621 634 "@atproto-labs/xrpc-utils" "0.0.24" 622 - "@atproto/api" "^0.18.6" 635 + "@atproto/api" "^0.18.14" 623 636 "@atproto/aws" "^0.2.31" 624 - "@atproto/common" "^0.5.3" 637 + "@atproto/common" "^0.5.8" 625 638 "@atproto/crypto" "^0.4.5" 626 639 "@atproto/identity" "^0.4.10" 627 - "@atproto/lex-cbor" "^0.0.3" 628 - "@atproto/lex-data" "^0.0.3" 640 + "@atproto/lex-cbor" "^0.0.8" 641 + "@atproto/lex-data" "^0.0.8" 629 642 "@atproto/lexicon" "^0.6.0" 630 - "@atproto/oauth-provider" "^0.14.1" 643 + "@atproto/oauth-provider" "^0.15.4" 631 644 "@atproto/oauth-scopes" "^0.3.0" 632 645 "@atproto/repo" "^0.8.12" 633 646 "@atproto/syntax" "^0.4.2" 634 647 "@atproto/xrpc" "^0.7.7" 635 - "@atproto/xrpc-server" "^0.10.3" 648 + "@atproto/xrpc-server" "^0.10.9" 636 649 "@did-plc/lib" "^0.0.4" 637 650 "@hapi/address" "^5.1.1" 638 651 better-sqlite3 "^10.0.0" ··· 725 738 "@atproto/common" "^0.5.0" 726 739 ws "^8.12.0" 727 740 741 + "@atproto/ws-client@^0.0.4": 742 + version "0.0.4" 743 + resolved "https://registry.yarnpkg.com/@atproto/ws-client/-/ws-client-0.0.4.tgz#9e436c0e72abea5da0d5a7e8ec862cec0fdb10cd" 744 + integrity sha512-dox1XIymuC7/ZRhUqKezIGgooZS45C6vHCfu0PnWjfvsLCK2kAlnvX4IBkA/WpcoijDhQ9ejChnFbo/sLmgvAg== 745 + dependencies: 746 + "@atproto/common" "^0.5.3" 747 + ws "^8.12.0" 748 + 728 749 "@atproto/xrpc-server@^0.10.0": 729 750 version "0.10.2" 730 751 resolved "https://registry.yarnpkg.com/@atproto/xrpc-server/-/xrpc-server-0.10.2.tgz#b68f42a7b6df5bb8081525e5c981a709b9b02739" ··· 755 776 "@atproto/lex-data" "0.0.3" 756 777 "@atproto/lexicon" "^0.6.0" 757 778 "@atproto/ws-client" "^0.0.3" 779 + "@atproto/xrpc" "^0.7.7" 780 + express "^4.17.2" 781 + http-errors "^2.0.0" 782 + mime-types "^2.1.35" 783 + rate-limiter-flexible "^2.4.1" 784 + ws "^8.12.0" 785 + zod "^3.23.8" 786 + 787 + "@atproto/xrpc-server@^0.10.4", "@atproto/xrpc-server@^0.10.8", "@atproto/xrpc-server@^0.10.9": 788 + version "0.10.9" 789 + resolved "https://registry.yarnpkg.com/@atproto/xrpc-server/-/xrpc-server-0.10.9.tgz#d1047c49c458a99442ba6516541fd9ff0f23299e" 790 + integrity sha512-6PVlkbvGitKAAqR9Lt8KzLp/2c8RHjpJdJ3OBM5baHUwpej7nKESyXvO5bk/GZHTvIcp0Vg0b45spn3/F9tsWg== 791 + dependencies: 792 + "@atproto/common" "^0.5.8" 793 + "@atproto/crypto" "^0.4.5" 794 + "@atproto/lex-cbor" "0.0.8" 795 + "@atproto/lex-data" "0.0.8" 796 + "@atproto/lexicon" "^0.6.0" 797 + "@atproto/ws-client" "^0.0.4" 758 798 "@atproto/xrpc" "^0.7.7" 759 799 express "^4.17.2" 760 800 http-errors "^2.0.0"