From a8fae7c8fe2cb18a40d690efcdbfe4d10cb85e0a Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 13 May 2026 15:13:58 +0300 Subject: [PATCH] migrate bskyembed to `@atproto/lex` --- bskyembed/.gitignore | 3 + bskyembed/eslint.config.mjs | 1 + bskyembed/lexicons.json | 107 ++++++ bskyembed/package.json | 11 +- bskyembed/pnpm-lock.yaml | 457 +++++++++++++++++++++-- bskyembed/src/components/embed.tsx | 91 ++--- bskyembed/src/components/link.tsx | 4 +- bskyembed/src/components/post.tsx | 142 ++++--- bskyembed/src/labels.ts | 4 +- bskyembed/src/screens/landing.tsx | 82 ++-- bskyembed/src/screens/post.tsx | 35 +- bskyembed/src/types/bsky/index.ts | 49 --- bskyembed/src/types/bsky/profile.ts | 10 - bskyembed/src/util/parse-embed.ts | 152 -------- bskyembed/src/util/rkey.ts | 2 +- bskyembed/src/util/verification-state.ts | 4 +- 16 files changed, 706 insertions(+), 448 deletions(-) create mode 100644 bskyembed/lexicons.json delete mode 100644 bskyembed/src/types/bsky/index.ts delete mode 100644 bskyembed/src/types/bsky/profile.ts delete mode 100644 bskyembed/src/util/parse-embed.ts diff --git a/bskyembed/.gitignore b/bskyembed/.gitignore index d451ff16c1..5d6e8bd07e 100644 --- a/bskyembed/.gitignore +++ b/bskyembed/.gitignore @@ -3,3 +3,6 @@ node_modules dist dist-ssr *.local + +lexicons +src/lexicons diff --git a/bskyembed/eslint.config.mjs b/bskyembed/eslint.config.mjs index deb6f7623e..2e020cd55d 100644 --- a/bskyembed/eslint.config.mjs +++ b/bskyembed/eslint.config.mjs @@ -53,6 +53,7 @@ export default defineConfig( ignoreRestSiblings: true, }, ], + 'import-x/consistent-type-specifier-style': ['warn', 'prefer-inline'], }, }, ) diff --git a/bskyembed/lexicons.json b/bskyembed/lexicons.json new file mode 100644 index 0000000000..5547f29b7f --- /dev/null +++ b/bskyembed/lexicons.json @@ -0,0 +1,107 @@ +{ + "version": 1, + "lexicons": [ + "app.bsky.feed.getPosts", + "app.bsky.feed.post", + "app.bsky.graph.starterpack", + "com.atproto.identity.resolveHandle" + ], + "resolutions": { + "app.bsky.actor.defs": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.actor.defs", + "cid": "bafyreielcp7ccfxuvtdthry5qqdqmvcqo5wx3shkuz32xd5rlypmhw6ufa" + }, + "app.bsky.actor.status": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.actor.status", + "cid": "bafyreifdg4b64wohpwkh5lydc6tckvol2rspnpni6dec6recy2rhvlnz4a" + }, + "app.bsky.embed.defs": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.defs", + "cid": "bafyreia42uud4qil67wknywzbxfyxc3b7woewsii54cakq2ould3ldetei" + }, + "app.bsky.embed.external": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.external", + "cid": "bafyreigwach36azu4xg3jvcmb6fe53umfln3wkuj5srqsvcjaypa6rw534" + }, + "app.bsky.embed.gallery": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.gallery", + "cid": "bafyreia4tixag4sadkirfo63qfma6fz3ifbqanify4e6ce6swkl5lwjnfq" + }, + "app.bsky.embed.images": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.images", + "cid": "bafyreifw77mkqkzlvm5csjwutkrnaivsjvlhg2qxdlwwabqpahlyyjrpwi" + }, + "app.bsky.embed.record": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.record", + "cid": "bafyreia7yq4c6rqkz32fjf6gj5rcvxsirguducn545s3dvls7qutnn2ali" + }, + "app.bsky.embed.recordWithMedia": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.recordWithMedia", + "cid": "bafyreidszvpeqf7copdmowm4ln4eyhahlqxktlvootjjjdmtkwy6s62jya" + }, + "app.bsky.embed.video": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.video", + "cid": "bafyreie3nug4ezpwodl6yrpgv5edkazzn22t7ea4yaeuun4rctyekkngai" + }, + "app.bsky.feed.defs": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.feed.defs", + "cid": "bafyreibg2zvz4n25vtd5yfqlodqra72s4h4lz7vwdexoutv3523wbw6jca" + }, + "app.bsky.feed.getPosts": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.feed.getPosts", + "cid": "bafyreihy4tanaizkynghab46n3qztsspvoaqtbrkzinvxi4igeylg5ghji" + }, + "app.bsky.feed.post": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.feed.post", + "cid": "bafyreia7rgxu7467phwpcgzaw62l5bzmxufkpikrc5zm4q3xhjmuhq4pti" + }, + "app.bsky.feed.postgate": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.feed.postgate", + "cid": "bafyreiai5efexyluyptv5tbl6kqbqlnneczqzexcqnxmitmulyjfaftgva" + }, + "app.bsky.feed.threadgate": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.feed.threadgate", + "cid": "bafyreiht77wd6duduz4yqp62m6dwma5dy7gdihps4g2nd73acfzqlglvdi" + }, + "app.bsky.graph.defs": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.graph.defs", + "cid": "bafyreifcipomli7yggtl46xufgxlnrw7se6xmsdxmzgfcz2tiu76ljatxm" + }, + "app.bsky.graph.starterpack": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.graph.starterpack", + "cid": "bafyreiejgf46gibbkpmjtgt5yyiir3wyxgrtvnfxtcdeyxrdrdnsvwgjc4" + }, + "app.bsky.labeler.defs": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.labeler.defs", + "cid": "bafyreicxx5i36v5dbqk5vvfzhnta5gajrvc544mnepux4wksrkid7mw3q4" + }, + "app.bsky.notification.defs": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.notification.defs", + "cid": "bafyreifzktxnol5rafjoznauk5j7ub2gsxxm7qjskg3vqmcgn6krrsz55u" + }, + "app.bsky.richtext.facet": { + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.richtext.facet", + "cid": "bafyreidg56eo7zynf6ihz4xb627vwoqf5idnevkmwp7sxc4tijg6xngbu4" + }, + "com.atproto.identity.resolveHandle": { + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.identity.resolveHandle", + "cid": "bafyreigckmqtt3jrtzd7tvigjatnz6ajqyafs26h5pwcudwag2anedxnmu" + }, + "com.atproto.label.defs": { + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.label.defs", + "cid": "bafyreidp2wpcbzl2qiob2uwoc7lhntojx3tjcr553mmahw2f5cumtm3wpm" + }, + "com.atproto.moderation.defs": { + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.moderation.defs", + "cid": "bafyreideawy4rlpgces2oebk5q4kpurbonhb5qtl4pes7dvxsc5osaiksy" + }, + "com.atproto.repo.strongRef": { + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.repo.strongRef", + "cid": "bafyreifrkdbnkvfjujntdaeigolnrjj3srrs53tfixjhmacclps72qlov4" + }, + "tools.ozone.report.defs": { + "uri": "at://did:plc:33dt5kftu3jq2h5h4jjlqezt/com.atproto.lexicon.schema/tools.ozone.report.defs", + "cid": "bafyreic3l2rmh2ugirt3jz372wcvy333m7t2ynlyzj2k54oshijs6lxdfu" + } + } +} \ No newline at end of file diff --git a/bskyembed/package.json b/bskyembed/package.json index 07a40a2522..875de69df1 100644 --- a/bskyembed/package.json +++ b/bskyembed/package.json @@ -10,10 +10,17 @@ "analyze": "ANALYZE=1 vite build", "lint": "eslint --cache src", "typecheck": "tsc --noEmit", - "format": "prettier -w src" + "format": "prettier -w src", + "lex": "lex", + "lex:install": "lex install", + "lex:update": "lex install --update", + "lex:ci": "lex install --ci", + "lex:build": "lex build --lexicons ./lexicons --out ./src/lexicons --clear", + "postinstall": "pnpm lex:install && pnpm lex:build" }, "dependencies": { - "@atproto/api": "0.20.30", + "@atproto/lex": "^0.3.0", + "@atproto/syntax": "^0.7.2", "preact": "^10.29.7" }, "devDependencies": { diff --git a/bskyembed/pnpm-lock.yaml b/bskyembed/pnpm-lock.yaml index 3671fbc307..46da9cc8fb 100644 --- a/bskyembed/pnpm-lock.yaml +++ b/bskyembed/pnpm-lock.yaml @@ -8,9 +8,12 @@ importers: .: dependencies: - '@atproto/api': - specifier: 0.20.30 - version: 0.20.30 + '@atproto/lex': + specifier: ^0.3.0 + version: 0.3.0 + '@atproto/syntax': + specifier: ^0.7.2 + version: 0.7.2 preact: specifier: ^10.29.7 version: 10.29.7 @@ -69,34 +72,91 @@ importers: packages: - '@atproto/api@0.20.30': - resolution: {integrity: sha512-t/9pPW+60AFeefiT186z4Z16yz4UmNGtb0EYVyCIHkwYk6nat57OvJA3oEbp4NK9yd/REsVCTBk6gOk8PNWyQQ==} + '@atproto-labs/did-resolver@0.3.5': + resolution: {integrity: sha512-0dMM+hj40VQiD/EJhlC1UMQgPXRwKeqM7NgJte7fVuYMv5b3P0W6+Lu3iDumHULcSjMmMXxJZzoi3i493Y0gCA==} + engines: {node: '>=22'} + + '@atproto-labs/fetch@0.3.4': + resolution: {integrity: sha512-YxXwi8HMk2HHDd5rljPGqxZ8bSeU78sFNz511Y222D0FraEq98p2r1ifkIgI23KQOfy0k0VzafeJAiGDh1CvfQ==} + engines: {node: '>=22'} + + '@atproto-labs/pipe@0.2.4': + resolution: {integrity: sha512-n67jCcrC+ouAeO10cWkpPzzLMlDi/lDCU30Us+LGqhOPhT6c4t5ASdBLQi9W3jUQtRzQBt3G9zipF+xKWNvVbw==} + engines: {node: '>=22'} + + '@atproto-labs/simple-store-memory@0.2.4': + resolution: {integrity: sha512-xAAUlOP9etqP9GGmJPq9gY1bRuJlZFdsC6wtAJSwUwMTwLRdenR7s8Qg5nxhbth5XL1XOtGABoD59NW3p+sl4A==} + engines: {node: '>=22'} + + '@atproto-labs/simple-store@0.4.4': + resolution: {integrity: sha512-3YH03xg99ZUS6Fq/6jcKRiZwUbzDb58xmS7ibg0y4+dukwrHa92cV/md76RpQJkAo9KYBvwLETdvF6fNtwIoGw==} engines: {node: '>=22'} '@atproto/common-web@0.5.6': resolution: {integrity: sha512-5Y4MIK9dpkJPiKiE6u7iEHitxj+g3aAU2GfGL686JlKE2zDKD4y18BJb+uVek6nXQKb5XOdNVvw+7BHarpn8Fw==} engines: {node: '>=22'} + '@atproto/common@0.7.2': + resolution: {integrity: sha512-D43QVEnSgWhzEoelJTWouPrwdjfHPAe5xVEc5RtsA6OTKEPaEJN0LSFd495ZtanMrvvC+KrgW8Tk02C8kvp45A==} + engines: {node: '>=22'} + + '@atproto/crypto@0.5.4': + resolution: {integrity: sha512-UR0BkuYNYuFtw+dA+y/oPPxzX0SWRnGJ+1Cfh/jGP1BvjRUyezK3omjpeLms5fYrXbM9vnfX+ckJFJqkBgLOdw==} + engines: {node: '>=22'} + + '@atproto/did@0.5.4': + resolution: {integrity: sha512-BlnwQ+obL+4ZA71KH/EzZ3TY+cpSxnLiUI85mjBJIQwvDF/oN2sQA18wIj9jpduviIt2b/cMtlJuzHjzBkfXvw==} + engines: {node: '>=22'} + + '@atproto/lex-builder@0.1.8': + resolution: {integrity: sha512-GYWisNom/J1MmFeSgMIFUgEj8yVKnvuJfyX1FwNKCczwfAunEdMy2Iiolq3JZNjWmH8uCtCWj7dg2GwQuEos7Q==} + engines: {node: '>=22'} + + '@atproto/lex-cbor@0.1.4': + resolution: {integrity: sha512-1reaooZfNFunJn2Fz21Up7iFQBPZlifQKlBsRvQoLG67mv43nmH4dZWgnGLD54ShCu8dyZ8Y6Wgh7BCg+2gRSw==} + engines: {node: '>=22'} + + '@atproto/lex-client@0.3.0': + resolution: {integrity: sha512-P+S3hWdIIOgNTun7J42dvxSyCkQog3Q2ShTjvcwP761TqiRex7zDWaRAaT9gvCy6I4pRuNdBCStysjSMlJeSdg==} + engines: {node: '>=22'} + '@atproto/lex-data@0.1.5': resolution: {integrity: sha512-TEM6GHuYpNm4O90LjNgbYq1Gmcr875S+BHrDxkg4PB5w/nlsz4HlbkGQG/WP/xbIV5O8TF5nNHDpCZ5ezTRrFA==} engines: {node: '>=22'} + '@atproto/lex-document@0.1.6': + resolution: {integrity: sha512-Yxc6LJ8tE0cntQ35ewagGbl7HOMX4jRkuEQ3ct+I43LKJBQPSk02rlwTY9A7SR/ULptN4Dn7XVqskEntWmCjWA==} + engines: {node: '>=22'} + + '@atproto/lex-installer@0.1.9': + resolution: {integrity: sha512-9PdApXnwtBRGty0muK/t5CUHv18nBtkut5Q5ibDcBhYKrsVmBAVNCXLqMreC2kbZf3q5L4+IfqtqMejmAZw2Mg==} + engines: {node: '>=22'} + '@atproto/lex-json@0.1.4': resolution: {integrity: sha512-ENR2cWkVrES+UL6TovbCRdX9BJOyHHJUS8jYx3Lxp3j4vEphjn/u+DW7bWloST2O8ID2OuVlt6+28ftNEEjmQQ==} engines: {node: '>=22'} - '@atproto/lexicon@0.7.7': - resolution: {integrity: sha512-92VH2oEsJdrIVNy7WY8rGn99ANNVglyUffoN7GJc0mxKi+fXN5iVlJ2cOyTfYABhr2ldSiptZWXEPEdBaIR9/A==} + '@atproto/lex-resolver@0.2.2': + resolution: {integrity: sha512-/7rm1bq2me4ptNoPWOrWmlmzRSPhxbcm3BaeD0V8+OzJ5VKBrYHxqp8BBZTzqgVSmwF+TqANctUG4c/y0hkigw==} + engines: {node: '>=22'} + + '@atproto/lex-schema@0.2.2': + resolution: {integrity: sha512-UFK0EH8pw31dvL27aoZ5K78z+UMiD3ybIgkCyd7Idm267KM1IpycerTDeABqo4CYP3/IAnzjGpQaUaVc12bELA==} + engines: {node: '>=22'} + + '@atproto/lex@0.3.0': + resolution: {integrity: sha512-Ir5f60NrCScDMZ2JGoxUHOQm+h6XlsDSykk0HzET8/qEeHTLwnI+MJIlBwB64eBoqGQ72qAEoMc8L+bJil+huA==} + engines: {node: '>=22'} + hasBin: true + + '@atproto/repo@0.10.6': + resolution: {integrity: sha512-ayX/ieAni4ZMbpdu6VMOCYIjzT8HctCQtcSBWWR8eoynsGZ6FzK/Lln6bH8i0wAj8vPV2pcecd57d33YsahRcQ==} engines: {node: '>=22'} '@atproto/syntax@0.7.2': resolution: {integrity: sha512-tZ1Tr0R9pK4bI4Zs69t29cjMlCFQvRNBeNkqJC5pGeNuCt64D0eoF7s/AlqeVmYppClmQ0xJquggGgsMDP6j7w==} engines: {node: '>=22'} - '@atproto/xrpc@0.8.6': - resolution: {integrity: sha512-yVfKrlwZBBm44Ft9jDvHcTCwQ1ElqSlzXHWhT/KcqE+u24EAhWVFosfABfGbUByB/PmN8eLJ06FsWo5pUQcMNQ==} - engines: {node: '>=22'} - '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -714,9 +774,20 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@oxc-project/types@0.139.0': resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@preact/preset-vite@2.10.5': resolution: {integrity: sha512-p0vJpxiVO7KWWazWny3LUZ+saXyZKWv6Ju0bYMWNJRp2YveufRPgSUB1C4MTqGJfz07EehMgfN+AJNwQy+w6Iw==} peerDependencies: @@ -851,6 +922,12 @@ packages: rollup: optional: true + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@ts-morph/common@0.28.1': + resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} + '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} @@ -1213,6 +1290,10 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + autoprefixer@10.5.3: resolution: {integrity: sha512-bJRzflk8GgE4JX+iZNEwz9f9p460NCHnU7bd+CZ9vIjIlZuTkt6F3WSl2oNO8StZBFx17nLEsiQ6H2wcZiY7nA==} engines: {node: ^10 || ^12 || >=14} @@ -1220,9 +1301,6 @@ packages: peerDependencies: postcss: ^8.1.0 - await-lock@3.0.0: - resolution: {integrity: sha512-eO6fLiSnrJrMdjWMNK8zbVRXPs2TKJg78iKZd9wDpN3na5tcoV6EoeiOlMgk2QaAQ1gIrK1YuMsJHXWqz89tSA==} - babel-plugin-polyfill-corejs2@0.4.17: resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: @@ -1299,6 +1377,10 @@ packages: caniuse-lite@1.0.30001806: resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} + cborg@4.5.8: + resolution: {integrity: sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==} + hasBin: true + chalk-template@0.4.0: resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} engines: {node: '>=12'} @@ -1323,6 +1405,13 @@ packages: resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1419,6 +1508,9 @@ packages: electron-to-chromium@1.5.392: resolution: {integrity: sha512-1yQq3VQCZRwsnYc67Oc+1fge6Lwtn0hzi6zmEVkB61Zx21kTbwJAW4dFLadl5Rc1tKhG/kSpYXnfiAhu0f0a1g==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1568,6 +1660,14 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -1773,6 +1873,9 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -1852,6 +1955,10 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + on-headers@1.1.0: resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} engines: {node: '>= 0.8'} @@ -1872,6 +1979,9 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1900,6 +2010,16 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} + pino-abstract-transport@3.0.0: + resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} + + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} + + pino@10.3.1: + resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} + hasBin: true + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -1924,10 +2044,16 @@ packages: engines: {node: '>=14'} hasBin: true + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + range-parser@1.2.0: resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} engines: {node: '>= 0.6'} @@ -1936,6 +2062,13 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + real-require@1.0.0: + resolution: {integrity: sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==} + regenerate-unicode-properties@10.2.2: resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} @@ -1984,6 +2117,10 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2015,6 +2152,9 @@ packages: simple-code-frame@1.3.0: resolution: {integrity: sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==} + sonic-boom@4.2.1: + resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2030,6 +2170,10 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + stable-hash-x@0.2.0: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} @@ -2046,6 +2190,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2082,20 +2230,23 @@ packages: engines: {node: '>=10'} hasBin: true + thread-stream@4.2.0: + resolution: {integrity: sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==} + engines: {node: '>=20'} + tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tlds@1.261.0: - resolution: {integrity: sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==} - hasBin: true - ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' + ts-morph@27.0.2: + resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2119,6 +2270,9 @@ packages: engines: {node: '>=16.20.0'} hasBin: true + uint8arrays@5.1.1: + resolution: {integrity: sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -2153,6 +2307,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -2226,9 +2383,25 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2241,17 +2414,28 @@ packages: snapshots: - '@atproto/api@0.20.30': + '@atproto-labs/did-resolver@0.3.5': dependencies: - '@atproto/common-web': 0.5.6 - '@atproto/lexicon': 0.7.7 - '@atproto/syntax': 0.7.2 - '@atproto/xrpc': 0.8.6 - await-lock: 3.0.0 - multiformats: 13.4.2 - tlds: 1.261.0 + '@atproto-labs/fetch': 0.3.4 + '@atproto-labs/pipe': 0.2.4 + '@atproto-labs/simple-store': 0.4.4 + '@atproto-labs/simple-store-memory': 0.2.4 + '@atproto/did': 0.5.4 zod: 3.25.76 + '@atproto-labs/fetch@0.3.4': + dependencies: + '@atproto-labs/pipe': 0.2.4 + + '@atproto-labs/pipe@0.2.4': {} + + '@atproto-labs/simple-store-memory@0.2.4': + dependencies: + '@atproto-labs/simple-store': 0.4.4 + lru-cache: 10.4.3 + + '@atproto-labs/simple-store@0.4.4': {} + '@atproto/common-web@0.5.6': dependencies: '@atproto/lex-data': 0.1.5 @@ -2259,22 +2443,112 @@ snapshots: '@atproto/syntax': 0.7.2 zod: 3.25.76 + '@atproto/common@0.7.2': + dependencies: + '@atproto/common-web': 0.5.6 + '@atproto/lex-cbor': 0.1.4 + '@atproto/lex-data': 0.1.5 + multiformats: 13.4.2 + pino: 10.3.1 + + '@atproto/crypto@0.5.4': + dependencies: + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + uint8arrays: 5.1.1 + + '@atproto/did@0.5.4': + dependencies: + zod: 3.25.76 + + '@atproto/lex-builder@0.1.8': + dependencies: + '@atproto/lex-document': 0.1.6 + '@atproto/lex-schema': 0.2.2 + prettier: 3.9.5 + ts-morph: 27.0.2 + tslib: 2.8.1 + + '@atproto/lex-cbor@0.1.4': + dependencies: + '@atproto/lex-data': 0.1.5 + cborg: 4.5.8 + tslib: 2.8.1 + + '@atproto/lex-client@0.3.0': + dependencies: + '@atproto/lex-data': 0.1.5 + '@atproto/lex-json': 0.1.4 + '@atproto/lex-schema': 0.2.2 + tslib: 2.8.1 + '@atproto/lex-data@0.1.5': dependencies: multiformats: 13.4.2 tslib: 2.8.1 unicode-segmenter: 0.14.5 + '@atproto/lex-document@0.1.6': + dependencies: + '@atproto/lex-schema': 0.2.2 + core-js: 3.49.0 + tslib: 2.8.1 + + '@atproto/lex-installer@0.1.9': + dependencies: + '@atproto/lex-builder': 0.1.8 + '@atproto/lex-cbor': 0.1.4 + '@atproto/lex-data': 0.1.5 + '@atproto/lex-document': 0.1.6 + '@atproto/lex-resolver': 0.2.2 + '@atproto/lex-schema': 0.2.2 + '@atproto/syntax': 0.7.2 + tslib: 2.8.1 + '@atproto/lex-json@0.1.4': dependencies: '@atproto/lex-data': 0.1.5 tslib: 2.8.1 - '@atproto/lexicon@0.7.7': + '@atproto/lex-resolver@0.2.2': dependencies: - '@atproto/common-web': 0.5.6 + '@atproto-labs/did-resolver': 0.3.5 + '@atproto/crypto': 0.5.4 + '@atproto/lex-client': 0.3.0 + '@atproto/lex-data': 0.1.5 + '@atproto/lex-document': 0.1.6 + '@atproto/lex-schema': 0.2.2 + '@atproto/repo': 0.10.6 '@atproto/syntax': 0.7.2 - multiformats: 13.4.2 + tslib: 2.8.1 + + '@atproto/lex-schema@0.2.2': + dependencies: + '@atproto/lex-data': 0.1.5 + '@atproto/syntax': 0.7.2 + '@standard-schema/spec': 1.1.0 + tslib: 2.8.1 + + '@atproto/lex@0.3.0': + dependencies: + '@atproto/lex-builder': 0.1.8 + '@atproto/lex-client': 0.3.0 + '@atproto/lex-data': 0.1.5 + '@atproto/lex-installer': 0.1.9 + '@atproto/lex-json': 0.1.4 + '@atproto/lex-schema': 0.2.2 + tslib: 2.8.1 + yargs: 18.0.0 + + '@atproto/repo@0.10.6': + dependencies: + '@atproto/common': 0.7.2 + '@atproto/common-web': 0.5.6 + '@atproto/crypto': 0.5.4 + '@atproto/lex-cbor': 0.1.4 + '@atproto/lex-data': 0.1.5 + '@atproto/syntax': 0.7.2 + varint: 6.0.0 zod: 3.25.76 '@atproto/syntax@0.7.2': @@ -2282,11 +2556,6 @@ snapshots: iso-datestring-validator: 2.2.2 tslib: 2.8.1 - '@atproto/xrpc@0.8.6': - dependencies: - '@atproto/lexicon': 0.7.7 - zod: 3.25.76 - '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -3091,8 +3360,16 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + '@oxc-project/types@0.139.0': {} + '@pinojs/redact@0.4.0': {} + '@preact/preset-vite@2.10.5(@babel/core@7.29.7)(preact@10.29.7)(vite@8.1.5(jiti@1.21.7)(terser@5.49.0))': dependencies: '@babel/core': 7.29.7 @@ -3194,6 +3471,14 @@ snapshots: estree-walker: 2.0.2 picomatch: 4.0.5 + '@standard-schema/spec@1.1.0': {} + + '@ts-morph/common@0.28.1': + dependencies: + minimatch: 10.2.5 + path-browserify: 1.0.1 + tinyglobby: 0.2.17 + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 @@ -3485,6 +3770,8 @@ snapshots: arg@5.0.2: {} + atomic-sleep@1.0.0: {} + autoprefixer@10.5.3(postcss@8.5.19): dependencies: browserslist: 4.28.6 @@ -3494,8 +3781,6 @@ snapshots: postcss: 8.5.19 postcss-value-parser: 4.2.0 - await-lock@3.0.0: {} - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): dependencies: '@babel/compat-data': 7.29.7 @@ -3575,6 +3860,8 @@ snapshots: caniuse-lite@1.0.30001806: {} + cborg@4.5.8: {} + chalk-template@0.4.0: dependencies: chalk: 4.1.2 @@ -3596,6 +3883,14 @@ snapshots: execa: 5.1.1 is-wsl: 2.2.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + + code-block-writer@13.0.3: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -3686,6 +3981,8 @@ snapshots: electron-to-chromium@1.5.392: {} + emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -3843,6 +4140,10 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + + get-east-asian-width@1.6.0: {} + get-stream@6.0.1: {} get-tsconfig@4.14.0: @@ -3982,6 +4283,8 @@ snapshots: lodash.debounce@4.0.8: {} + lru-cache@10.4.3: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -4043,6 +4346,8 @@ snapshots: dependencies: boolbase: 1.0.0 + on-exit-leak-free@2.1.2: {} + on-headers@1.1.0: {} onetime@5.1.2: @@ -4066,6 +4371,8 @@ snapshots: dependencies: p-limit: 3.1.0 + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-is-inside@1.0.2: {} @@ -4082,6 +4389,26 @@ snapshots: picomatch@4.0.5: {} + pino-abstract-transport@3.0.0: + dependencies: + split2: 4.2.0 + + pino-std-serializers@7.1.0: {} + + pino@10.3.1: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 3.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.1 + thread-stream: 4.2.0 + postcss-value-parser@4.2.0: {} postcss@8.5.19: @@ -4096,8 +4423,12 @@ snapshots: prettier@3.9.5: {} + process-warning@5.0.0: {} + punycode@2.3.1: {} + quick-format-unescaped@4.0.4: {} + range-parser@1.2.0: {} rc@1.2.8: @@ -4107,6 +4438,10 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 + real-require@0.2.0: {} + + real-require@1.0.0: {} + regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 @@ -4173,6 +4508,8 @@ snapshots: safe-buffer@5.2.1: {} + safe-stable-stringify@2.5.0: {} + semver@6.3.1: {} semver@7.8.5: {} @@ -4215,6 +4552,10 @@ snapshots: dependencies: kolorist: 1.8.0 + sonic-boom@4.2.1: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -4226,6 +4567,8 @@ snapshots: source-map@0.7.6: {} + split2@4.2.0: {} + stable-hash-x@0.2.0: {} stack-trace@1.0.0: {} @@ -4242,6 +4585,12 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -4271,17 +4620,24 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + thread-stream@4.2.0: + dependencies: + real-require: 1.0.0 + tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.5) picomatch: 4.0.5 - tlds@1.261.0: {} - ts-api-utils@2.5.0(typescript@7.0.2): dependencies: typescript: 7.0.2 + ts-morph@27.0.2: + dependencies: + '@ts-morph/common': 0.28.1 + code-block-writer: 13.0.3 + tslib@2.8.1: {} type-check@0.4.0: @@ -4324,6 +4680,10 @@ snapshots: '@typescript/typescript-win32-arm64': 7.0.2 '@typescript/typescript-win32-x64': 7.0.2 + uint8arrays@5.1.1: + dependencies: + multiformats: 13.4.2 + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -4379,6 +4739,8 @@ snapshots: dependencies: punycode: 2.3.1 + varint@6.0.0: {} + vary@1.1.2: {} vite-bundle-analyzer@1.3.9: {} @@ -4421,8 +4783,27 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.2.0 + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + y18n@5.0.8: {} + yallist@3.1.1: {} + yargs-parser@22.0.0: {} + + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yocto-queue@0.1.0: {} zimmerframe@1.1.4: {} diff --git a/bskyembed/src/components/embed.tsx b/bskyembed/src/components/embed.tsx index af7a97b8fe..9d4ddcf26f 100644 --- a/bskyembed/src/components/embed.tsx +++ b/bskyembed/src/components/embed.tsx @@ -1,16 +1,3 @@ -import { - AppBskyEmbedExternal, - AppBskyEmbedGallery, - AppBskyEmbedImages, - AppBskyEmbedRecord, - AppBskyEmbedRecordWithMedia, - AppBskyEmbedVideo, - AppBskyFeedDefs, - AppBskyFeedPost, - AppBskyGraphDefs, - AppBskyGraphStarterpack, - AppBskyLabelerDefs, -} from '@atproto/api' import {ComponentChildren, h} from 'preact' import {useMemo} from 'preact/hooks' @@ -19,7 +6,7 @@ import playIcon from '../../assets/play_filled_corner0_rounded.svg' import starterPackIcon from '../../assets/starterPack.svg' import {Globe} from '../icons/Globe' import {CONTENT_LABELS, labelsToInfo} from '../labels' -import * as bsky from '../types/bsky' +import * as app from '../lexicons/app' import {getRkey} from '../util/rkey' import {getVerificationState} from '../util/verification-state' import {Link} from './link' @@ -30,8 +17,8 @@ export function Embed({ labels, hideRecord, }: { - content: AppBskyFeedDefs.PostView['embed'] - labels: AppBskyFeedDefs.PostView['labels'] + content: app.bsky.feed.defs.PostView['embed'] + labels: app.bsky.feed.defs.PostView['labels'] hideRecord?: boolean }) { const labelInfo = useMemo(() => labelsToInfo(labels), [labels]) @@ -40,7 +27,7 @@ export function Embed({ try { // Case 1: Image - if (AppBskyEmbedImages.isView(content)) { + if (app.bsky.embed.images.view.isTypeOf(content)) { return } @@ -50,12 +37,12 @@ export function Embed({ } // Case 2: External link - if (AppBskyEmbedExternal.isView(content)) { + if (app.bsky.embed.external.view.isTypeOf(content)) { return } // Case 3: Record (quote or linked post) - if (AppBskyEmbedRecord.isView(content)) { + if (app.bsky.embed.record.view.isTypeOf(content)) { if (hideRecord) { return null } @@ -63,7 +50,7 @@ export function Embed({ const record = content.record // Case 3.1: Post - if (AppBskyEmbedRecord.isViewRecord(record)) { + if (app.bsky.embed.record.viewRecord.isTypeOf(record)) { const pwiOptOut = !!record.author.labels?.find( label => label.val === '!no-unauthenticated', ) @@ -77,8 +64,9 @@ export function Embed({ } let text - if (AppBskyFeedPost.isRecord(record.value)) { - text = record.value.text + const validation = app.bsky.feed.post.$safeValidate(record.value) + if (validation.success) { + text = validation.value.text } const isAuthorLabeled = record.author.labels?.some(label => @@ -129,14 +117,17 @@ export function Embed({ } // Case 3.2: List - if (AppBskyGraphDefs.isListView(record)) { + if (app.bsky.graph.defs.listView.isTypeOf(record)) { + if (labelInfo) { + return {labelInfo} + } return ( {labelInfo} + } return ( } // Case 3.6: Post not found - if (AppBskyEmbedRecord.isViewNotFound(record)) { + if (app.bsky.embed.record.viewNotFound.isTypeOf(record)) { return Quoted post not found, it may have been deleted. } // Case 3.7: Post blocked - if (AppBskyEmbedRecord.isViewBlocked(record)) { + if (app.bsky.embed.record.viewBlocked.isTypeOf(record)) { return The quoted post is blocked. } // Case 3.8: Detached quote post - if (AppBskyEmbedRecord.isViewDetached(record)) { + if (app.bsky.embed.record.viewDetached.isTypeOf(record)) { // Just don't show anything return null } @@ -190,14 +184,14 @@ export function Embed({ } // Case 4: Video - if (AppBskyEmbedVideo.isView(content)) { + if (app.bsky.embed.video.view.isTypeOf(content)) { return } // Case 5: Record with media if ( - AppBskyEmbedRecordWithMedia.isView(content) && - AppBskyEmbedRecord.isViewRecord(content.record.record) + app.bsky.embed.recordWithMedia.view.isTypeOf(content) && + app.bsky.embed.record.viewRecord.isTypeOf(content.record.record) ) { return (
@@ -242,7 +236,7 @@ function ImageEmbed({ content, labelInfo, }: { - content: AppBskyEmbedImages.View + content: app.bsky.embed.images.View labelInfo?: string }) { if (labelInfo) { @@ -355,7 +349,7 @@ function ExternalEmbed({ content, labelInfo, }: { - content: AppBskyEmbedExternal.View + content: app.bsky.embed.external.View labelInfo?: string }) { function toNiceDomain(url: string): string { @@ -389,7 +383,7 @@ function ExternalEmbed({

{content.external.description}

-
+

{toNiceDomain(content.external.uri)} @@ -443,7 +437,7 @@ function GenericWithImageEmbed({ ) } -function VideoEmbed({content}: {content: AppBskyEmbedVideo.View}) { +function VideoEmbed({content}: {content: app.bsky.embed.video.View}) { let aspectRatio = 1 if (content.aspectRatio) { @@ -493,16 +487,13 @@ function VideoEmbed({content}: {content: AppBskyEmbedVideo.View}) { function StarterPackEmbed({ content, }: { - content: AppBskyGraphDefs.StarterPackViewBasic + content: app.bsky.graph.defs.StarterPackViewBasic }) { - if ( - !bsky.dangerousIsType( - content.record, - AppBskyGraphStarterpack.isRecord, - ) - ) { + const validation = app.bsky.graph.starterpack.$safeValidate(content.record) + if (!validation.success) { return null } + const record = validation.value const starterPackHref = getStarterPackHref(content) const imageUri = getStarterPackImage(content) @@ -516,17 +507,15 @@ function StarterPackEmbed({

-

- {content.record.name} -

+

{record.name}

Starter pack by{' '} {content.creator.displayName || `@${content.creator.handle}`}

- {content.record.description && ( -

{content.record.description}

+ {record.description && ( +

{record.description}

)} {!!content.joinedAllTimeCount && content.joinedAllTimeCount > 50 && (

@@ -540,14 +529,14 @@ function StarterPackEmbed({ // from #/lib/strings/starter-pack.ts function getStarterPackImage( - starterPack: AppBskyGraphDefs.StarterPackViewBasic, + starterPack: app.bsky.graph.defs.StarterPackViewBasic, ) { const rkey = getRkey({uri: starterPack.uri}) return `https://ogcard.cdn.bsky.app/start/${starterPack.creator.did}/${rkey}` } function getStarterPackHref( - starterPack: AppBskyGraphDefs.StarterPackViewBasic, + starterPack: app.bsky.graph.defs.StarterPackViewBasic, ) { const rkey = getRkey({uri: starterPack.uri}) const handleOrDid = starterPack.creator.handle || starterPack.creator.did diff --git a/bskyembed/src/components/link.tsx b/bskyembed/src/components/link.tsx index 8a20fe5c10..93de98363a 100644 --- a/bskyembed/src/components/link.tsx +++ b/bskyembed/src/components/link.tsx @@ -1,4 +1,4 @@ -import {h} from 'preact' +import {h, HTMLAttributes} from 'preact' export function Link({ href, @@ -9,7 +9,7 @@ export function Link({ href: string className?: string disableTracking?: boolean -} & h.JSX.HTMLAttributes) { +} & HTMLAttributes) { const searchParam = new URLSearchParams(window.location.search) const ref_url = searchParam.get('ref_url') diff --git a/bskyembed/src/components/post.tsx b/bskyembed/src/components/post.tsx index 46faebc4a7..7ed7439403 100644 --- a/bskyembed/src/components/post.tsx +++ b/bskyembed/src/components/post.tsx @@ -1,9 +1,3 @@ -import { - AppBskyFeedDefs, - AppBskyFeedPost, - AppBskyRichtextFacet, - RichText, -} from '@atproto/api' import {h} from 'preact' import logo from '../../assets/logo_full_name.svg' @@ -12,7 +6,7 @@ import {Reply as ReplyIcon} from '../icons/Reply' import {Repost as RepostIcon} from '../icons/Repost' import {Robot as RobotIcon} from '../icons/Robot' import {CONTENT_LABELS} from '../labels' -import * as bsky from '../types/bsky' +import * as app from '../lexicons/app' import {niceDate} from '../util/nice-date' import {prettyNumber} from '../util/pretty-number' import {getRkey} from '../util/rkey' @@ -23,24 +17,18 @@ import {Link} from './link' import {VerificationCheck} from './verification-check' interface Props { - thread: AppBskyFeedDefs.ThreadViewPost + post: app.bsky.feed.defs.PostView } -export function Post({thread}: Props) { - const post = thread.post - +export function Post({post}: Props) { const isAuthorLabeled = post.author.labels?.some(label => CONTENT_LABELS.includes(label.val), ) - let record: AppBskyFeedPost.Record | null = null - if ( - bsky.dangerousIsType( - post.record, - AppBskyFeedPost.isRecord, - ) - ) { - record = post.record + let record = null + const validation = app.bsky.feed.post.$safeValidate(post.record) + if (validation.success) { + record = validation.value } const verification = getVerificationState({profile: post.author}) @@ -153,70 +141,70 @@ export function Post({thread}: Props) { ) } -function PostContent({record}: {record: AppBskyFeedPost.Record | null}) { +function PostContent({record}: {record: app.bsky.feed.post.Main | null}) { // text-only check - posts with no text (e.g. gallery posts) would otherwise // render an empty

that adds an extra flex gap above the embed if (!record?.text) return null - const rt = new RichText({ - text: record.text, - facets: record.facets, - }) + // const rt = new RichText({ + // text: record.text, + // facets: record.facets, + // }) - const richText = [] + // const richText = [] - let counter = 0 - for (const segment of rt.segments()) { - if ( - segment.link && - AppBskyRichtextFacet.validateLink(segment.link).success - ) { - richText.push( - - {segment.text} - , - ) - } else if ( - segment.mention && - AppBskyRichtextFacet.validateMention(segment.mention).success - ) { - richText.push( - - {segment.text} - , - ) - } else if ( - segment.tag && - AppBskyRichtextFacet.validateTag(segment.tag).success - ) { - richText.push( - - {segment.text} - , - ) - } else { - richText.push(segment.text) - } + // let counter = 0 + // for (const segment of rt.segments()) { + // if ( + // segment.link && + // app.bsky.richtext.facet.link.$safeValidate(segment.link).success + // ) { + // richText.push( + // + // {segment.text} + // , + // ) + // } else if ( + // segment.mention && + // app.bsky.richtext.facet.mention.safeValidate(segment.mention).success + // ) { + // richText.push( + // + // {segment.text} + // , + // ) + // } else if ( + // segment.tag && + // app.bsky.richtext.facet.tag.safeValidate(segment.tag).success + // ) { + // richText.push( + // + // {segment.text} + // , + // ) + // } else { + // richText.push(segment.text) + // } - counter++ - } + // counter++ + // } - return ( -

- {richText} -

- ) + // return ( + //

+ // {richText} + //

+ // ) } diff --git a/bskyembed/src/labels.ts b/bskyembed/src/labels.ts index 2ed8dd287c..3e392eacb3 100644 --- a/bskyembed/src/labels.ts +++ b/bskyembed/src/labels.ts @@ -1,9 +1,9 @@ -import {AppBskyFeedDefs} from '@atproto/api' +import * as app from './lexicons/app' export const CONTENT_LABELS = ['porn', 'sexual', 'nudity', 'graphic-media'] export function labelsToInfo( - labels?: AppBskyFeedDefs.PostView['labels'], + labels?: app.bsky.feed.defs.PostView['labels'], ): string | undefined { const label = labels?.find(label => CONTENT_LABELS.includes(label.val)) diff --git a/bskyembed/src/screens/landing.tsx b/bskyembed/src/screens/landing.tsx index 9c7cd68a40..70c2f21383 100644 --- a/bskyembed/src/screens/landing.tsx +++ b/bskyembed/src/screens/landing.tsx @@ -1,6 +1,7 @@ import '../index.css' -import {AppBskyFeedDefs, AppBskyFeedPost, AtpAgent, AtUri} from '@atproto/api' +import {AtUriString, Client, type HandleString} from '@atproto/lex' +import {AtUri} from '@atproto/syntax' import {h, render} from 'preact' import {useEffect, useMemo, useRef, useState} from 'preact/hooks' @@ -14,7 +15,8 @@ import { import {Container} from '../components/container' import {Link} from '../components/link' import {Post} from '../components/post' -import * as bsky from '../types/bsky' +import * as app from '../lexicons/app' +import * as com from '../lexicons/com' import {niceDate} from '../util/nice-date' const DEFAULT_POST = @@ -30,9 +32,7 @@ if (!root) throw new Error('No root element') initSystemColorMode({additionalBodyClasses: 'dark:bg-dimmedBgDarken'}) -const agent = new AtpAgent({ - service: 'https://public.api.bsky.app', -}) +const client = new Client('https://public.api.bsky.app') render(, root) @@ -42,14 +42,12 @@ function LandingPage() { const [error, setError] = useState(null) const [loading, setLoading] = useState(false) - const [thread, setThread] = useState( - null, - ) + const [post, setPost] = useState(null) useEffect(() => { void (async () => { setError(null) - setThread(null) + setPost(null) setLoading(true) try { let atUri = DEFAULT_URI @@ -74,13 +72,14 @@ function LandingPage() { let did = didOrHandle if (!didOrHandle.startsWith('did:')) { - const resolution = await agent.resolveHandle({ - handle: didOrHandle, - }) - if (!resolution.data.did) { + const resolution = await client.call( + com.atproto.identity.resolveHandle, + {handle: didOrHandle as HandleString}, + ) + if (!resolution.did) { throw new Error('No DID found') } - did = resolution.data.did + did = resolution.did } atUri = `at://${did}/app.bsky.feed.post/${rkey}` @@ -91,16 +90,16 @@ function LandingPage() { } } - const {data} = await agent.getPostThread({ - uri: atUri, - depth: 0, - parentHeight: 0, + const {posts} = await client.call(app.bsky.feed.getPosts, { + uris: [atUri as AtUriString], }) - if (!AppBskyFeedDefs.isThreadViewPost(data.thread)) { + const post = posts[0] + + if (!post) { throw new Error('Post not found') } - const pwiOptOut = !!data.thread.post.author.labels?.find( + const pwiOptOut = !!post.author.labels?.find( label => label.val === '!no-unauthenticated', ) if (pwiOptOut) { @@ -108,7 +107,7 @@ function LandingPage() { 'The author of this post has requested their posts not be displayed on external sites.', ) } - setThread(data.thread) + setPost(post) } catch (err) { console.error(err) setError(err instanceof Error ? err.message : 'Invalid Bluesky URL') @@ -166,11 +165,11 @@ function LandingPage() {
) : (
- {!error && thread && uri && ( - + {!error && post && uri && ( + )}
- {!error && thread && } + {!error && post && }
{error && (
@@ -203,10 +202,10 @@ function Skeleton() { } function Snippet({ - thread, + post, colorMode, }: { - thread: AppBskyFeedDefs.ThreadViewPost + post: app.bsky.feed.defs.PostView colorMode: ColorModeValues }) { const ref = useRef(null) @@ -223,24 +222,17 @@ function Snippet({ }, [copied]) const snippet = useMemo(() => { - const record = thread.post.record - - if ( - !bsky.dangerousIsType( - record, - AppBskyFeedPost.isRecord, - ) - ) { + const validation = app.bsky.feed.post.$safeValidate(post.record) + if (!validation.success) { return '' } + const record = validation.value const lang = record.langs && record.langs.length > 0 ? record.langs[0] : '' - const profileHref = toShareUrl( - ['/profile', thread.post.author.did].join('/'), - ) - const urip = new AtUri(thread.post.uri) + const profileHref = toShareUrl(['/profile', post.author.did].join('/')) + const urip = new AtUri(post.uri) const href = toShareUrl( - ['/profile', thread.post.author.did, 'post', urip.rkey].join('/'), + ['/profile', post.author.did, 'post', urip.rkey].join('/'), ) // x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x @@ -248,9 +240,9 @@ function Snippet({ // Also, keep this code synced with the app code in Embed.tsx. // x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x return `

${escapeHtml(record.text)}${ @@ -258,13 +250,13 @@ function Snippet({ ? `

[image or embed]` : '' }

— ${escapeHtml( - thread.post.author.displayName || thread.post.author.handle, + post.author.displayName || post.author.handle, )} (@${escapeHtml( - thread.post.author.handle, + post.author.handle, )}) ${escapeHtml( - niceDate(thread.post.indexedAt), + niceDate(post.indexedAt), )}
` - }, [thread, colorMode]) + }, [post, colorMode]) return (
diff --git a/bskyembed/src/screens/post.tsx b/bskyembed/src/screens/post.tsx index 83914f66f3..fcf2b2bfda 100644 --- a/bskyembed/src/screens/post.tsx +++ b/bskyembed/src/screens/post.tsx @@ -1,6 +1,6 @@ import '../index.css' -import {AppBskyFeedDefs, AtpAgent} from '@atproto/api' +import {type AtUriString, Client} from '@atproto/lex' import {h, render} from 'preact' import logo from '../../assets/logo.svg' @@ -8,14 +8,13 @@ import {applyTheme, initSystemColorMode} from '../color-mode' import {Container} from '../components/container' import {Link} from '../components/link' import {Post} from '../components/post' +import * as app from '../lexicons/app' import {getRkey} from '../util/rkey' const root = document.getElementById('app') if (!root) throw new Error('No root element') -const agent = new AtpAgent({ - service: 'https://public.api.bsky.app', -}) +const client = new Client('https://public.api.bsky.app') const uri = `at://${window.location.pathname.slice('/embed/'.length)}` if (!uri) { @@ -40,23 +39,25 @@ switch (colorMode) { break } -agent - .getPostThread({ - uri, - depth: 0, - parentHeight: 0, +client + .call(app.bsky.feed.getPosts, { + uris: [uri as AtUriString], }) - .then(({data}) => { - if (!AppBskyFeedDefs.isThreadViewPost(data.thread)) { - throw new Error('Expected a ThreadViewPost') + .then(({posts}) => { + const post = posts[0] + + if (!post) { + throw new Error('Post not found') } - const pwiOptOut = !!data.thread.post.author.labels?.find( + + const pwiOptOut = !!post.author.labels?.find( label => label.val === '!no-unauthenticated', ) + if (pwiOptOut) { - render(, root) + render(, root) } else { - render(, root) + render(, root) } }) .catch(err => { @@ -64,8 +65,8 @@ agent render(, root) }) -function PwiOptOut({thread}: {thread: AppBskyFeedDefs.ThreadViewPost}) { - const href = `/profile/${thread.post.author.did}/post/${getRkey(thread.post)}` +function PwiOptOut({post}: {post: app.bsky.feed.defs.PostView}) { + const href = `/profile/${post.author.did}/post/${getRkey({uri: post.uri})}` return ( (item, AppBskyFeedPost.isRecord)) { - * // `item` has type `$Typed` here - * } - * ``` - */ -export function dangerousIsType( - record: unknown, - identity: (v: V) => v is V & {$type: NonNullable}, -): record is R { - return identity(record) -} - -/** - * Fully validates the object schema, which has a performance cost. - * - * For faster checks with data we trust, like that from our app view, use the - * `dangerousIsType` export from this same file. - * - * Usage: - * ```ts - * import * as bsky from '#/types/bsky' - * - * if (bsky.validate(item, AppBskyFeedPost.validateRecord)) { - * // `item` has type `$Typed` here - * } - * ``` - */ -export function validate( - record: unknown, - validator: (v: unknown) => ValidationResult, -): record is R { - return validator(record).success -} diff --git a/bskyembed/src/types/bsky/profile.ts b/bskyembed/src/types/bsky/profile.ts deleted file mode 100644 index 12c8146ae1..0000000000 --- a/bskyembed/src/types/bsky/profile.ts +++ /dev/null @@ -1,10 +0,0 @@ -import {type AppBskyActorDefs, type ChatBskyActorDefs} from '@atproto/api' - -/** - * Matches any profile view exported by our SDK - */ -export type AnyProfileView = - | AppBskyActorDefs.ProfileViewBasic - | AppBskyActorDefs.ProfileView - | AppBskyActorDefs.ProfileViewDetailed - | ChatBskyActorDefs.ProfileViewBasic diff --git a/bskyembed/src/util/parse-embed.ts b/bskyembed/src/util/parse-embed.ts deleted file mode 100644 index 97c3dc33e7..0000000000 --- a/bskyembed/src/util/parse-embed.ts +++ /dev/null @@ -1,152 +0,0 @@ -/** - * This file is a copy of what exists in the social-app - */ - -import { - AppBskyEmbedExternal, - AppBskyEmbedImages, - AppBskyEmbedRecord, - AppBskyEmbedRecordWithMedia, - AppBskyEmbedVideo, - AppBskyFeedDefs, - AppBskyGraphDefs, - AppBskyLabelerDefs, -} from '@atproto/api' - -export type Embed = - | { - type: 'post' - view: AppBskyEmbedRecord.ViewRecord - } - | { - type: 'post_not_found' - view: AppBskyEmbedRecord.ViewNotFound - } - | { - type: 'post_blocked' - view: AppBskyEmbedRecord.ViewBlocked - } - | { - type: 'post_detached' - view: AppBskyEmbedRecord.ViewDetached - } - | { - type: 'feed' - view: AppBskyFeedDefs.GeneratorView - } - | { - type: 'list' - view: AppBskyGraphDefs.ListView - } - | { - type: 'labeler' - view: AppBskyLabelerDefs.LabelerView - } - | { - type: 'starter_pack' - view: AppBskyGraphDefs.StarterPackViewBasic - } - | { - type: 'images' - view: AppBskyEmbedImages.View - } - | { - type: 'link' - view: AppBskyEmbedExternal.View - } - | { - type: 'video' - view: AppBskyEmbedVideo.View - } - | { - type: 'post_with_media' - view: Embed - media: Embed - } - | { - type: 'unknown' - view: null - } - -export type EmbedType = Extract - -export function parseEmbedRecordView({record}: AppBskyEmbedRecord.View): Embed { - if (AppBskyEmbedRecord.isViewRecord(record)) { - return { - type: 'post', - view: record, - } - } else if (AppBskyEmbedRecord.isViewNotFound(record)) { - return { - type: 'post_not_found', - view: record, - } - } else if (AppBskyEmbedRecord.isViewBlocked(record)) { - return { - type: 'post_blocked', - view: record, - } - } else if (AppBskyEmbedRecord.isViewDetached(record)) { - return { - type: 'post_detached', - view: record, - } - } else if (AppBskyFeedDefs.isGeneratorView(record)) { - return { - type: 'feed', - view: record, - } - } else if (AppBskyGraphDefs.isListView(record)) { - return { - type: 'list', - view: record, - } - } else if (AppBskyLabelerDefs.isLabelerView(record)) { - return { - type: 'labeler', - view: record, - } - } else if (AppBskyGraphDefs.isStarterPackViewBasic(record)) { - return { - type: 'starter_pack', - view: record, - } - } else { - return { - type: 'unknown', - view: null, - } - } -} - -export function parseEmbed(embed: AppBskyFeedDefs.PostView['embed']): Embed { - if (AppBskyEmbedImages.isView(embed)) { - return { - type: 'images', - view: embed, - } - } else if (AppBskyEmbedExternal.isView(embed)) { - return { - type: 'link', - view: embed, - } - } else if (AppBskyEmbedVideo.isView(embed)) { - return { - type: 'video', - view: embed, - } - } else if (AppBskyEmbedRecord.isView(embed)) { - return parseEmbedRecordView(embed) - } else if (AppBskyEmbedRecordWithMedia.isView(embed)) { - return { - type: 'post_with_media', - view: parseEmbedRecordView(embed.record), - media: parseEmbed(embed.media), - } - } else { - return { - type: 'unknown', - view: null, - } - } -} diff --git a/bskyembed/src/util/rkey.ts b/bskyembed/src/util/rkey.ts index 71d57f8c6a..8f54a478b7 100644 --- a/bskyembed/src/util/rkey.ts +++ b/bskyembed/src/util/rkey.ts @@ -1,4 +1,4 @@ -import {AtUri} from '@atproto/api' +import {AtUri} from '@atproto/syntax' export function getRkey({uri}: {uri: string}): string { const at = new AtUri(uri) diff --git a/bskyembed/src/util/verification-state.ts b/bskyembed/src/util/verification-state.ts index 29355e511c..d17e3e7db6 100644 --- a/bskyembed/src/util/verification-state.ts +++ b/bskyembed/src/util/verification-state.ts @@ -1,4 +1,4 @@ -import * as bsky from '../types/bsky' +import * as app from '../lexicons/app' export type VerificationState = { role: 'default' | 'verifier' @@ -8,7 +8,7 @@ export type VerificationState = { export function getVerificationState({ profile, }: { - profile?: bsky.profile.AnyProfileView + profile?: app.bsky.actor.defs.ProfileViewBasic }): VerificationState { if (!profile || !profile.verification) { return {