migrate bskyembed to @atproto/lex

This commit is contained in:
Samuel Newman
2026-05-13 15:13:58 +03:00
parent 756d3aac05
commit a8fae7c8fe
16 changed files with 706 additions and 448 deletions
+3
View File
@@ -3,3 +3,6 @@ node_modules
dist dist
dist-ssr dist-ssr
*.local *.local
lexicons
src/lexicons
+1
View File
@@ -53,6 +53,7 @@ export default defineConfig(
ignoreRestSiblings: true, ignoreRestSiblings: true,
}, },
], ],
'import-x/consistent-type-specifier-style': ['warn', 'prefer-inline'],
}, },
}, },
) )
+107
View File
@@ -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"
}
}
}
+9 -2
View File
@@ -10,10 +10,17 @@
"analyze": "ANALYZE=1 vite build", "analyze": "ANALYZE=1 vite build",
"lint": "eslint --cache src", "lint": "eslint --cache src",
"typecheck": "tsc --noEmit", "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": { "dependencies": {
"@atproto/api": "0.20.30", "@atproto/lex": "^0.3.0",
"@atproto/syntax": "^0.7.2",
"preact": "^10.29.7" "preact": "^10.29.7"
}, },
"devDependencies": { "devDependencies": {
+419 -38
View File
@@ -8,9 +8,12 @@ importers:
.: .:
dependencies: dependencies:
'@atproto/api': '@atproto/lex':
specifier: 0.20.30 specifier: ^0.3.0
version: 0.20.30 version: 0.3.0
'@atproto/syntax':
specifier: ^0.7.2
version: 0.7.2
preact: preact:
specifier: ^10.29.7 specifier: ^10.29.7
version: 10.29.7 version: 10.29.7
@@ -69,34 +72,91 @@ importers:
packages: packages:
'@atproto/api@0.20.30': '@atproto-labs/did-resolver@0.3.5':
resolution: {integrity: sha512-t/9pPW+60AFeefiT186z4Z16yz4UmNGtb0EYVyCIHkwYk6nat57OvJA3oEbp4NK9yd/REsVCTBk6gOk8PNWyQQ==} 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'} engines: {node: '>=22'}
'@atproto/common-web@0.5.6': '@atproto/common-web@0.5.6':
resolution: {integrity: sha512-5Y4MIK9dpkJPiKiE6u7iEHitxj+g3aAU2GfGL686JlKE2zDKD4y18BJb+uVek6nXQKb5XOdNVvw+7BHarpn8Fw==} resolution: {integrity: sha512-5Y4MIK9dpkJPiKiE6u7iEHitxj+g3aAU2GfGL686JlKE2zDKD4y18BJb+uVek6nXQKb5XOdNVvw+7BHarpn8Fw==}
engines: {node: '>=22'} 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': '@atproto/lex-data@0.1.5':
resolution: {integrity: sha512-TEM6GHuYpNm4O90LjNgbYq1Gmcr875S+BHrDxkg4PB5w/nlsz4HlbkGQG/WP/xbIV5O8TF5nNHDpCZ5ezTRrFA==} resolution: {integrity: sha512-TEM6GHuYpNm4O90LjNgbYq1Gmcr875S+BHrDxkg4PB5w/nlsz4HlbkGQG/WP/xbIV5O8TF5nNHDpCZ5ezTRrFA==}
engines: {node: '>=22'} 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': '@atproto/lex-json@0.1.4':
resolution: {integrity: sha512-ENR2cWkVrES+UL6TovbCRdX9BJOyHHJUS8jYx3Lxp3j4vEphjn/u+DW7bWloST2O8ID2OuVlt6+28ftNEEjmQQ==} resolution: {integrity: sha512-ENR2cWkVrES+UL6TovbCRdX9BJOyHHJUS8jYx3Lxp3j4vEphjn/u+DW7bWloST2O8ID2OuVlt6+28ftNEEjmQQ==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@atproto/lexicon@0.7.7': '@atproto/lex-resolver@0.2.2':
resolution: {integrity: sha512-92VH2oEsJdrIVNy7WY8rGn99ANNVglyUffoN7GJc0mxKi+fXN5iVlJ2cOyTfYABhr2ldSiptZWXEPEdBaIR9/A==} 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'} engines: {node: '>=22'}
'@atproto/syntax@0.7.2': '@atproto/syntax@0.7.2':
resolution: {integrity: sha512-tZ1Tr0R9pK4bI4Zs69t29cjMlCFQvRNBeNkqJC5pGeNuCt64D0eoF7s/AlqeVmYppClmQ0xJquggGgsMDP6j7w==} resolution: {integrity: sha512-tZ1Tr0R9pK4bI4Zs69t29cjMlCFQvRNBeNkqJC5pGeNuCt64D0eoF7s/AlqeVmYppClmQ0xJquggGgsMDP6j7w==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@atproto/xrpc@0.8.6':
resolution: {integrity: sha512-yVfKrlwZBBm44Ft9jDvHcTCwQ1ElqSlzXHWhT/KcqE+u24EAhWVFosfABfGbUByB/PmN8eLJ06FsWo5pUQcMNQ==}
engines: {node: '>=22'}
'@babel/code-frame@7.29.7': '@babel/code-frame@7.29.7':
resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@@ -714,9 +774,20 @@ packages:
'@emnapi/core': ^1.7.1 '@emnapi/core': ^1.7.1
'@emnapi/runtime': ^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': '@oxc-project/types@0.139.0':
resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} 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': '@preact/preset-vite@2.10.5':
resolution: {integrity: sha512-p0vJpxiVO7KWWazWny3LUZ+saXyZKWv6Ju0bYMWNJRp2YveufRPgSUB1C4MTqGJfz07EehMgfN+AJNwQy+w6Iw==} resolution: {integrity: sha512-p0vJpxiVO7KWWazWny3LUZ+saXyZKWv6Ju0bYMWNJRp2YveufRPgSUB1C4MTqGJfz07EehMgfN+AJNwQy+w6Iw==}
peerDependencies: peerDependencies:
@@ -851,6 +922,12 @@ packages:
rollup: rollup:
optional: true 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': '@tybys/wasm-util@0.10.3':
resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==}
@@ -1213,6 +1290,10 @@ packages:
arg@5.0.2: arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 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: autoprefixer@10.5.3:
resolution: {integrity: sha512-bJRzflk8GgE4JX+iZNEwz9f9p460NCHnU7bd+CZ9vIjIlZuTkt6F3WSl2oNO8StZBFx17nLEsiQ6H2wcZiY7nA==} resolution: {integrity: sha512-bJRzflk8GgE4JX+iZNEwz9f9p460NCHnU7bd+CZ9vIjIlZuTkt6F3WSl2oNO8StZBFx17nLEsiQ6H2wcZiY7nA==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
@@ -1220,9 +1301,6 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.1.0 postcss: ^8.1.0
await-lock@3.0.0:
resolution: {integrity: sha512-eO6fLiSnrJrMdjWMNK8zbVRXPs2TKJg78iKZd9wDpN3na5tcoV6EoeiOlMgk2QaAQ1gIrK1YuMsJHXWqz89tSA==}
babel-plugin-polyfill-corejs2@0.4.17: babel-plugin-polyfill-corejs2@0.4.17:
resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==}
peerDependencies: peerDependencies:
@@ -1299,6 +1377,10 @@ packages:
caniuse-lite@1.0.30001806: caniuse-lite@1.0.30001806:
resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} 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: chalk-template@0.4.0:
resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==}
engines: {node: '>=12'} engines: {node: '>=12'}
@@ -1323,6 +1405,13 @@ packages:
resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 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: color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'} engines: {node: '>=7.0.0'}
@@ -1419,6 +1508,9 @@ packages:
electron-to-chromium@1.5.392: electron-to-chromium@1.5.392:
resolution: {integrity: sha512-1yQq3VQCZRwsnYc67Oc+1fge6Lwtn0hzi6zmEVkB61Zx21kTbwJAW4dFLadl5Rc1tKhG/kSpYXnfiAhu0f0a1g==} resolution: {integrity: sha512-1yQq3VQCZRwsnYc67Oc+1fge6Lwtn0hzi6zmEVkB61Zx21kTbwJAW4dFLadl5Rc1tKhG/kSpYXnfiAhu0f0a1g==}
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
emoji-regex@8.0.0: emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -1568,6 +1660,14 @@ packages:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'} 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: get-stream@6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -1773,6 +1873,9 @@ packages:
lodash.debounce@4.0.8: lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
lru-cache@5.1.1: lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
@@ -1852,6 +1955,10 @@ packages:
nth-check@2.1.1: nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 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: on-headers@1.1.0:
resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@@ -1872,6 +1979,9 @@ packages:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'} engines: {node: '>=10'}
path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
path-exists@4.0.0: path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -1900,6 +2010,16 @@ packages:
resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==}
engines: {node: '>=12'} 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: postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
@@ -1924,10 +2044,16 @@ packages:
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
process-warning@5.0.0:
resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==}
punycode@2.3.1: punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'} engines: {node: '>=6'}
quick-format-unescaped@4.0.4:
resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
range-parser@1.2.0: range-parser@1.2.0:
resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
@@ -1936,6 +2062,13 @@ packages:
resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
hasBin: true 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: regenerate-unicode-properties@10.2.2:
resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==}
engines: {node: '>=4'} engines: {node: '>=4'}
@@ -1984,6 +2117,10 @@ packages:
safe-buffer@5.2.1: safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 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: semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true hasBin: true
@@ -2015,6 +2152,9 @@ packages:
simple-code-frame@1.3.0: simple-code-frame@1.3.0:
resolution: {integrity: sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==} resolution: {integrity: sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==}
sonic-boom@4.2.1:
resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==}
source-map-js@1.2.1: source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@@ -2030,6 +2170,10 @@ packages:
resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
engines: {node: '>= 12'} engines: {node: '>= 12'}
split2@4.2.0:
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
engines: {node: '>= 10.x'}
stable-hash-x@0.2.0: stable-hash-x@0.2.0:
resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
@@ -2046,6 +2190,10 @@ packages:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
engines: {node: '>=12'} engines: {node: '>=12'}
string-width@7.2.0:
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
engines: {node: '>=18'}
strip-ansi@6.0.1: strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -2082,20 +2230,23 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
thread-stream@4.2.0:
resolution: {integrity: sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==}
engines: {node: '>=20'}
tinyglobby@0.2.17: tinyglobby@0.2.17:
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
tlds@1.261.0:
resolution: {integrity: sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==}
hasBin: true
ts-api-utils@2.5.0: ts-api-utils@2.5.0:
resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
engines: {node: '>=18.12'} engines: {node: '>=18.12'}
peerDependencies: peerDependencies:
typescript: '>=4.8.4' typescript: '>=4.8.4'
ts-morph@27.0.2:
resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==}
tslib@2.8.1: tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -2119,6 +2270,9 @@ packages:
engines: {node: '>=16.20.0'} engines: {node: '>=16.20.0'}
hasBin: true hasBin: true
uint8arrays@5.1.1:
resolution: {integrity: sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==}
unicode-canonical-property-names-ecmascript@2.0.1: unicode-canonical-property-names-ecmascript@2.0.1:
resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
engines: {node: '>=4'} engines: {node: '>=4'}
@@ -2153,6 +2307,9 @@ packages:
uri-js@4.4.1: uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
varint@6.0.0:
resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
vary@1.1.2: vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@@ -2226,9 +2383,25 @@ packages:
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
engines: {node: '>=12'} 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: yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 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: yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -2241,17 +2414,28 @@ packages:
snapshots: snapshots:
'@atproto/api@0.20.30': '@atproto-labs/did-resolver@0.3.5':
dependencies: dependencies:
'@atproto/common-web': 0.5.6 '@atproto-labs/fetch': 0.3.4
'@atproto/lexicon': 0.7.7 '@atproto-labs/pipe': 0.2.4
'@atproto/syntax': 0.7.2 '@atproto-labs/simple-store': 0.4.4
'@atproto/xrpc': 0.8.6 '@atproto-labs/simple-store-memory': 0.2.4
await-lock: 3.0.0 '@atproto/did': 0.5.4
multiformats: 13.4.2
tlds: 1.261.0
zod: 3.25.76 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': '@atproto/common-web@0.5.6':
dependencies: dependencies:
'@atproto/lex-data': 0.1.5 '@atproto/lex-data': 0.1.5
@@ -2259,22 +2443,112 @@ snapshots:
'@atproto/syntax': 0.7.2 '@atproto/syntax': 0.7.2
zod: 3.25.76 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': '@atproto/lex-data@0.1.5':
dependencies: dependencies:
multiformats: 13.4.2 multiformats: 13.4.2
tslib: 2.8.1 tslib: 2.8.1
unicode-segmenter: 0.14.5 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': '@atproto/lex-json@0.1.4':
dependencies: dependencies:
'@atproto/lex-data': 0.1.5 '@atproto/lex-data': 0.1.5
tslib: 2.8.1 tslib: 2.8.1
'@atproto/lexicon@0.7.7': '@atproto/lex-resolver@0.2.2':
dependencies: 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 '@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 zod: 3.25.76
'@atproto/syntax@0.7.2': '@atproto/syntax@0.7.2':
@@ -2282,11 +2556,6 @@ snapshots:
iso-datestring-validator: 2.2.2 iso-datestring-validator: 2.2.2
tslib: 2.8.1 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': '@babel/code-frame@7.29.7':
dependencies: dependencies:
'@babel/helper-validator-identifier': 7.29.7 '@babel/helper-validator-identifier': 7.29.7
@@ -3091,8 +3360,16 @@ snapshots:
'@tybys/wasm-util': 0.10.3 '@tybys/wasm-util': 0.10.3
optional: true optional: true
'@noble/curves@1.9.7':
dependencies:
'@noble/hashes': 1.8.0
'@noble/hashes@1.8.0': {}
'@oxc-project/types@0.139.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))': '@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: dependencies:
'@babel/core': 7.29.7 '@babel/core': 7.29.7
@@ -3194,6 +3471,14 @@ snapshots:
estree-walker: 2.0.2 estree-walker: 2.0.2
picomatch: 4.0.5 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': '@tybys/wasm-util@0.10.3':
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
@@ -3485,6 +3770,8 @@ snapshots:
arg@5.0.2: {} arg@5.0.2: {}
atomic-sleep@1.0.0: {}
autoprefixer@10.5.3(postcss@8.5.19): autoprefixer@10.5.3(postcss@8.5.19):
dependencies: dependencies:
browserslist: 4.28.6 browserslist: 4.28.6
@@ -3494,8 +3781,6 @@ snapshots:
postcss: 8.5.19 postcss: 8.5.19
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
await-lock@3.0.0: {}
babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7):
dependencies: dependencies:
'@babel/compat-data': 7.29.7 '@babel/compat-data': 7.29.7
@@ -3575,6 +3860,8 @@ snapshots:
caniuse-lite@1.0.30001806: {} caniuse-lite@1.0.30001806: {}
cborg@4.5.8: {}
chalk-template@0.4.0: chalk-template@0.4.0:
dependencies: dependencies:
chalk: 4.1.2 chalk: 4.1.2
@@ -3596,6 +3883,14 @@ snapshots:
execa: 5.1.1 execa: 5.1.1
is-wsl: 2.2.0 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: color-convert@2.0.1:
dependencies: dependencies:
color-name: 1.1.4 color-name: 1.1.4
@@ -3686,6 +3981,8 @@ snapshots:
electron-to-chromium@1.5.392: {} electron-to-chromium@1.5.392: {}
emoji-regex@10.6.0: {}
emoji-regex@8.0.0: {} emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {} emoji-regex@9.2.2: {}
@@ -3843,6 +4140,10 @@ snapshots:
gensync@1.0.0-beta.2: {} 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-stream@6.0.1: {}
get-tsconfig@4.14.0: get-tsconfig@4.14.0:
@@ -3982,6 +4283,8 @@ snapshots:
lodash.debounce@4.0.8: {} lodash.debounce@4.0.8: {}
lru-cache@10.4.3: {}
lru-cache@5.1.1: lru-cache@5.1.1:
dependencies: dependencies:
yallist: 3.1.1 yallist: 3.1.1
@@ -4043,6 +4346,8 @@ snapshots:
dependencies: dependencies:
boolbase: 1.0.0 boolbase: 1.0.0
on-exit-leak-free@2.1.2: {}
on-headers@1.1.0: {} on-headers@1.1.0: {}
onetime@5.1.2: onetime@5.1.2:
@@ -4066,6 +4371,8 @@ snapshots:
dependencies: dependencies:
p-limit: 3.1.0 p-limit: 3.1.0
path-browserify@1.0.1: {}
path-exists@4.0.0: {} path-exists@4.0.0: {}
path-is-inside@1.0.2: {} path-is-inside@1.0.2: {}
@@ -4082,6 +4389,26 @@ snapshots:
picomatch@4.0.5: {} 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-value-parser@4.2.0: {}
postcss@8.5.19: postcss@8.5.19:
@@ -4096,8 +4423,12 @@ snapshots:
prettier@3.9.5: {} prettier@3.9.5: {}
process-warning@5.0.0: {}
punycode@2.3.1: {} punycode@2.3.1: {}
quick-format-unescaped@4.0.4: {}
range-parser@1.2.0: {} range-parser@1.2.0: {}
rc@1.2.8: rc@1.2.8:
@@ -4107,6 +4438,10 @@ snapshots:
minimist: 1.2.8 minimist: 1.2.8
strip-json-comments: 2.0.1 strip-json-comments: 2.0.1
real-require@0.2.0: {}
real-require@1.0.0: {}
regenerate-unicode-properties@10.2.2: regenerate-unicode-properties@10.2.2:
dependencies: dependencies:
regenerate: 1.4.2 regenerate: 1.4.2
@@ -4173,6 +4508,8 @@ snapshots:
safe-buffer@5.2.1: {} safe-buffer@5.2.1: {}
safe-stable-stringify@2.5.0: {}
semver@6.3.1: {} semver@6.3.1: {}
semver@7.8.5: {} semver@7.8.5: {}
@@ -4215,6 +4552,10 @@ snapshots:
dependencies: dependencies:
kolorist: 1.8.0 kolorist: 1.8.0
sonic-boom@4.2.1:
dependencies:
atomic-sleep: 1.0.0
source-map-js@1.2.1: {} source-map-js@1.2.1: {}
source-map-support@0.5.21: source-map-support@0.5.21:
@@ -4226,6 +4567,8 @@ snapshots:
source-map@0.7.6: {} source-map@0.7.6: {}
split2@4.2.0: {}
stable-hash-x@0.2.0: {} stable-hash-x@0.2.0: {}
stack-trace@1.0.0: {} stack-trace@1.0.0: {}
@@ -4242,6 +4585,12 @@ snapshots:
emoji-regex: 9.2.2 emoji-regex: 9.2.2
strip-ansi: 7.2.0 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: strip-ansi@6.0.1:
dependencies: dependencies:
ansi-regex: 5.0.1 ansi-regex: 5.0.1
@@ -4271,17 +4620,24 @@ snapshots:
commander: 2.20.3 commander: 2.20.3
source-map-support: 0.5.21 source-map-support: 0.5.21
thread-stream@4.2.0:
dependencies:
real-require: 1.0.0
tinyglobby@0.2.17: tinyglobby@0.2.17:
dependencies: dependencies:
fdir: 6.5.0(picomatch@4.0.5) fdir: 6.5.0(picomatch@4.0.5)
picomatch: 4.0.5 picomatch: 4.0.5
tlds@1.261.0: {}
ts-api-utils@2.5.0(typescript@7.0.2): ts-api-utils@2.5.0(typescript@7.0.2):
dependencies: dependencies:
typescript: 7.0.2 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: {} tslib@2.8.1: {}
type-check@0.4.0: type-check@0.4.0:
@@ -4324,6 +4680,10 @@ snapshots:
'@typescript/typescript-win32-arm64': 7.0.2 '@typescript/typescript-win32-arm64': 7.0.2
'@typescript/typescript-win32-x64': 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-canonical-property-names-ecmascript@2.0.1: {}
unicode-match-property-ecmascript@2.0.0: unicode-match-property-ecmascript@2.0.0:
@@ -4379,6 +4739,8 @@ snapshots:
dependencies: dependencies:
punycode: 2.3.1 punycode: 2.3.1
varint@6.0.0: {}
vary@1.1.2: {} vary@1.1.2: {}
vite-bundle-analyzer@1.3.9: {} vite-bundle-analyzer@1.3.9: {}
@@ -4421,8 +4783,27 @@ snapshots:
string-width: 5.1.2 string-width: 5.1.2
strip-ansi: 7.2.0 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: {} 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: {} yocto-queue@0.1.0: {}
zimmerframe@1.1.4: {} zimmerframe@1.1.4: {}
+40 -51
View File
@@ -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 {ComponentChildren, h} from 'preact'
import {useMemo} from 'preact/hooks' 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 starterPackIcon from '../../assets/starterPack.svg'
import {Globe} from '../icons/Globe' import {Globe} from '../icons/Globe'
import {CONTENT_LABELS, labelsToInfo} from '../labels' import {CONTENT_LABELS, labelsToInfo} from '../labels'
import * as bsky from '../types/bsky' import * as app from '../lexicons/app'
import {getRkey} from '../util/rkey' import {getRkey} from '../util/rkey'
import {getVerificationState} from '../util/verification-state' import {getVerificationState} from '../util/verification-state'
import {Link} from './link' import {Link} from './link'
@@ -30,8 +17,8 @@ export function Embed({
labels, labels,
hideRecord, hideRecord,
}: { }: {
content: AppBskyFeedDefs.PostView['embed'] content: app.bsky.feed.defs.PostView['embed']
labels: AppBskyFeedDefs.PostView['labels'] labels: app.bsky.feed.defs.PostView['labels']
hideRecord?: boolean hideRecord?: boolean
}) { }) {
const labelInfo = useMemo(() => labelsToInfo(labels), [labels]) const labelInfo = useMemo(() => labelsToInfo(labels), [labels])
@@ -40,7 +27,7 @@ export function Embed({
try { try {
// Case 1: Image // Case 1: Image
if (AppBskyEmbedImages.isView(content)) { if (app.bsky.embed.images.view.isTypeOf(content)) {
return <ImageEmbed content={content} labelInfo={labelInfo} /> return <ImageEmbed content={content} labelInfo={labelInfo} />
} }
@@ -50,12 +37,12 @@ export function Embed({
} }
// Case 2: External link // Case 2: External link
if (AppBskyEmbedExternal.isView(content)) { if (app.bsky.embed.external.view.isTypeOf(content)) {
return <ExternalEmbed content={content} labelInfo={labelInfo} /> return <ExternalEmbed content={content} labelInfo={labelInfo} />
} }
// Case 3: Record (quote or linked post) // Case 3: Record (quote or linked post)
if (AppBskyEmbedRecord.isView(content)) { if (app.bsky.embed.record.view.isTypeOf(content)) {
if (hideRecord) { if (hideRecord) {
return null return null
} }
@@ -63,7 +50,7 @@ export function Embed({
const record = content.record const record = content.record
// Case 3.1: Post // Case 3.1: Post
if (AppBskyEmbedRecord.isViewRecord(record)) { if (app.bsky.embed.record.viewRecord.isTypeOf(record)) {
const pwiOptOut = !!record.author.labels?.find( const pwiOptOut = !!record.author.labels?.find(
label => label.val === '!no-unauthenticated', label => label.val === '!no-unauthenticated',
) )
@@ -77,8 +64,9 @@ export function Embed({
} }
let text let text
if (AppBskyFeedPost.isRecord(record.value)) { const validation = app.bsky.feed.post.$safeValidate(record.value)
text = record.value.text if (validation.success) {
text = validation.value.text
} }
const isAuthorLabeled = record.author.labels?.some(label => const isAuthorLabeled = record.author.labels?.some(label =>
@@ -129,14 +117,17 @@ export function Embed({
} }
// Case 3.2: List // Case 3.2: List
if (AppBskyGraphDefs.isListView(record)) { if (app.bsky.graph.defs.listView.isTypeOf(record)) {
if (labelInfo) {
return <Info>{labelInfo}</Info>
}
return ( return (
<GenericWithImageEmbed <GenericWithImageEmbed
image={record.avatar} image={record.avatar}
title={record.name} title={record.name}
href={`/profile/${record.creator.did}/lists/${getRkey(record)}`} href={`/profile/${record.creator.did}/lists/${getRkey(record)}`}
subtitle={ subtitle={
record.purpose === AppBskyGraphDefs.MODLIST record.purpose === app.bsky.graph.defs.modlist.value
? `Moderation list by @${record.creator.handle}` ? `Moderation list by @${record.creator.handle}`
: `User list by @${record.creator.handle}` : `User list by @${record.creator.handle}`
} }
@@ -146,7 +137,10 @@ export function Embed({
} }
// Case 3.3: Feed // Case 3.3: Feed
if (AppBskyFeedDefs.isGeneratorView(record)) { if (app.bsky.feed.defs.generatorView.isTypeOf(record)) {
if (labelInfo) {
return <Info>{labelInfo}</Info>
}
return ( return (
<GenericWithImageEmbed <GenericWithImageEmbed
image={record.avatar} image={record.avatar}
@@ -159,28 +153,28 @@ export function Embed({
} }
// Case 3.4: Labeler // Case 3.4: Labeler
if (AppBskyLabelerDefs.isLabelerView(record)) { if (app.bsky.labeler.defs.labelerView.isTypeOf(record)) {
// Embed type does not exist in the app, so show nothing // Embed type does not exist in the app, so show nothing
return null return null
} }
// Case 3.5: Starter pack // Case 3.5: Starter pack
if (AppBskyGraphDefs.isStarterPackViewBasic(record)) { if (app.bsky.graph.defs.starterPackViewBasic.isTypeOf(record)) {
return <StarterPackEmbed content={record} /> return <StarterPackEmbed content={record} />
} }
// Case 3.6: Post not found // Case 3.6: Post not found
if (AppBskyEmbedRecord.isViewNotFound(record)) { if (app.bsky.embed.record.viewNotFound.isTypeOf(record)) {
return <Info>Quoted post not found, it may have been deleted.</Info> return <Info>Quoted post not found, it may have been deleted.</Info>
} }
// Case 3.7: Post blocked // Case 3.7: Post blocked
if (AppBskyEmbedRecord.isViewBlocked(record)) { if (app.bsky.embed.record.viewBlocked.isTypeOf(record)) {
return <Info>The quoted post is blocked.</Info> return <Info>The quoted post is blocked.</Info>
} }
// Case 3.8: Detached quote post // Case 3.8: Detached quote post
if (AppBskyEmbedRecord.isViewDetached(record)) { if (app.bsky.embed.record.viewDetached.isTypeOf(record)) {
// Just don't show anything // Just don't show anything
return null return null
} }
@@ -190,14 +184,14 @@ export function Embed({
} }
// Case 4: Video // Case 4: Video
if (AppBskyEmbedVideo.isView(content)) { if (app.bsky.embed.video.view.isTypeOf(content)) {
return <VideoEmbed content={content} /> return <VideoEmbed content={content} />
} }
// Case 5: Record with media // Case 5: Record with media
if ( if (
AppBskyEmbedRecordWithMedia.isView(content) && app.bsky.embed.recordWithMedia.view.isTypeOf(content) &&
AppBskyEmbedRecord.isViewRecord(content.record.record) app.bsky.embed.record.viewRecord.isTypeOf(content.record.record)
) { ) {
return ( return (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
@@ -242,7 +236,7 @@ function ImageEmbed({
content, content,
labelInfo, labelInfo,
}: { }: {
content: AppBskyEmbedImages.View content: app.bsky.embed.images.View
labelInfo?: string labelInfo?: string
}) { }) {
if (labelInfo) { if (labelInfo) {
@@ -355,7 +349,7 @@ function ExternalEmbed({
content, content,
labelInfo, labelInfo,
}: { }: {
content: AppBskyEmbedExternal.View content: app.bsky.embed.external.View
labelInfo?: string labelInfo?: string
}) { }) {
function toNiceDomain(url: string): string { function toNiceDomain(url: string): string {
@@ -389,7 +383,7 @@ function ExternalEmbed({
<p className="text-sm leading-snug text-textLight dark:text-textDimmed line-clamp-2 mt-0.5"> <p className="text-sm leading-snug text-textLight dark:text-textDimmed line-clamp-2 mt-0.5">
{content.external.description} {content.external.description}
</p> </p>
<div className="flex flex-row items-center gap-1 border-t dark:border-slate-600 mt-1 pt-1.5"> <div className="flex flex-row items-end gap-1 border-t dark:border-slate-600 mt-1 pt-1.5">
<Globe size={12} className="text-textLight dark:text-textDimmed" /> <Globe size={12} className="text-textLight dark:text-textDimmed" />
<p className="text-sm leading-none text-textLight dark:text-textDimmed line-clamp-1"> <p className="text-sm leading-none text-textLight dark:text-textDimmed line-clamp-1">
{toNiceDomain(content.external.uri)} {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 let aspectRatio = 1
if (content.aspectRatio) { if (content.aspectRatio) {
@@ -493,16 +487,13 @@ function VideoEmbed({content}: {content: AppBskyEmbedVideo.View}) {
function StarterPackEmbed({ function StarterPackEmbed({
content, content,
}: { }: {
content: AppBskyGraphDefs.StarterPackViewBasic content: app.bsky.graph.defs.StarterPackViewBasic
}) { }) {
if ( const validation = app.bsky.graph.starterpack.$safeValidate(content.record)
!bsky.dangerousIsType<AppBskyGraphStarterpack.Record>( if (!validation.success) {
content.record,
AppBskyGraphStarterpack.isRecord,
)
) {
return null return null
} }
const record = validation.value
const starterPackHref = getStarterPackHref(content) const starterPackHref = getStarterPackHref(content)
const imageUri = getStarterPackImage(content) const imageUri = getStarterPackImage(content)
@@ -516,17 +507,15 @@ function StarterPackEmbed({
<div className="flex space-x-2 items-center"> <div className="flex space-x-2 items-center">
<img src={starterPackIcon} className="w-10 h-10" /> <img src={starterPackIcon} className="w-10 h-10" />
<div> <div>
<p className="font-semibold leading-[21px]"> <p className="font-semibold leading-[21px]">{record.name}</p>
{content.record.name}
</p>
<p className="text-sm text-textLight dark:text-textDimmed line-clamp-2 leading-[18px]"> <p className="text-sm text-textLight dark:text-textDimmed line-clamp-2 leading-[18px]">
Starter pack by{' '} Starter pack by{' '}
{content.creator.displayName || `@${content.creator.handle}`} {content.creator.displayName || `@${content.creator.handle}`}
</p> </p>
</div> </div>
</div> </div>
{content.record.description && ( {record.description && (
<p className="text-sm mt-1">{content.record.description}</p> <p className="text-sm mt-1">{record.description}</p>
)} )}
{!!content.joinedAllTimeCount && content.joinedAllTimeCount > 50 && ( {!!content.joinedAllTimeCount && content.joinedAllTimeCount > 50 && (
<p className="text-sm font-semibold text-textLight dark:text-textDimmed mt-1"> <p className="text-sm font-semibold text-textLight dark:text-textDimmed mt-1">
@@ -540,14 +529,14 @@ function StarterPackEmbed({
// from #/lib/strings/starter-pack.ts // from #/lib/strings/starter-pack.ts
function getStarterPackImage( function getStarterPackImage(
starterPack: AppBskyGraphDefs.StarterPackViewBasic, starterPack: app.bsky.graph.defs.StarterPackViewBasic,
) { ) {
const rkey = getRkey({uri: starterPack.uri}) const rkey = getRkey({uri: starterPack.uri})
return `https://ogcard.cdn.bsky.app/start/${starterPack.creator.did}/${rkey}` return `https://ogcard.cdn.bsky.app/start/${starterPack.creator.did}/${rkey}`
} }
function getStarterPackHref( function getStarterPackHref(
starterPack: AppBskyGraphDefs.StarterPackViewBasic, starterPack: app.bsky.graph.defs.StarterPackViewBasic,
) { ) {
const rkey = getRkey({uri: starterPack.uri}) const rkey = getRkey({uri: starterPack.uri})
const handleOrDid = starterPack.creator.handle || starterPack.creator.did const handleOrDid = starterPack.creator.handle || starterPack.creator.did
+2 -2
View File
@@ -1,4 +1,4 @@
import {h} from 'preact' import {h, HTMLAttributes} from 'preact'
export function Link({ export function Link({
href, href,
@@ -9,7 +9,7 @@ export function Link({
href: string href: string
className?: string className?: string
disableTracking?: boolean disableTracking?: boolean
} & h.JSX.HTMLAttributes<HTMLAnchorElement>) { } & HTMLAttributes<HTMLAnchorElement>) {
const searchParam = new URLSearchParams(window.location.search) const searchParam = new URLSearchParams(window.location.search)
const ref_url = searchParam.get('ref_url') const ref_url = searchParam.get('ref_url')
+67 -79
View File
@@ -1,9 +1,3 @@
import {
AppBskyFeedDefs,
AppBskyFeedPost,
AppBskyRichtextFacet,
RichText,
} from '@atproto/api'
import {h} from 'preact' import {h} from 'preact'
import logo from '../../assets/logo_full_name.svg' 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 {Repost as RepostIcon} from '../icons/Repost'
import {Robot as RobotIcon} from '../icons/Robot' import {Robot as RobotIcon} from '../icons/Robot'
import {CONTENT_LABELS} from '../labels' import {CONTENT_LABELS} from '../labels'
import * as bsky from '../types/bsky' import * as app from '../lexicons/app'
import {niceDate} from '../util/nice-date' import {niceDate} from '../util/nice-date'
import {prettyNumber} from '../util/pretty-number' import {prettyNumber} from '../util/pretty-number'
import {getRkey} from '../util/rkey' import {getRkey} from '../util/rkey'
@@ -23,24 +17,18 @@ import {Link} from './link'
import {VerificationCheck} from './verification-check' import {VerificationCheck} from './verification-check'
interface Props { interface Props {
thread: AppBskyFeedDefs.ThreadViewPost post: app.bsky.feed.defs.PostView
} }
export function Post({thread}: Props) { export function Post({post}: Props) {
const post = thread.post
const isAuthorLabeled = post.author.labels?.some(label => const isAuthorLabeled = post.author.labels?.some(label =>
CONTENT_LABELS.includes(label.val), CONTENT_LABELS.includes(label.val),
) )
let record: AppBskyFeedPost.Record | null = null let record = null
if ( const validation = app.bsky.feed.post.$safeValidate(post.record)
bsky.dangerousIsType<AppBskyFeedPost.Record>( if (validation.success) {
post.record, record = validation.value
AppBskyFeedPost.isRecord,
)
) {
record = post.record
} }
const verification = getVerificationState({profile: post.author}) 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 // text-only check - posts with no text (e.g. gallery posts) would otherwise
// render an empty <p> that adds an extra flex gap above the embed // render an empty <p> that adds an extra flex gap above the embed
if (!record?.text) return null if (!record?.text) return null
const rt = new RichText({ // const rt = new RichText({
text: record.text, // text: record.text,
facets: record.facets, // facets: record.facets,
}) // })
const richText = [] // const richText = []
let counter = 0 // let counter = 0
for (const segment of rt.segments()) { // for (const segment of rt.segments()) {
if ( // if (
segment.link && // segment.link &&
AppBskyRichtextFacet.validateLink(segment.link).success // app.bsky.richtext.facet.link.$safeValidate(segment.link).success
) { // ) {
richText.push( // richText.push(
<Link // <Link
key={counter} // key={counter}
href={segment.link.uri} // href={segment.link.uri}
className="text-brand hover:underline" // className="text-brand hover:underline"
disableTracking={ // disableTracking={
!segment.link.uri.startsWith('https://bsky.app') && // !segment.link.uri.startsWith('https://bsky.app') &&
!segment.link.uri.startsWith('https://go.bsky.app') // !segment.link.uri.startsWith('https://go.bsky.app')
}> // }>
{segment.text} // {segment.text}
</Link>, // </Link>,
) // )
} else if ( // } else if (
segment.mention && // segment.mention &&
AppBskyRichtextFacet.validateMention(segment.mention).success // app.bsky.richtext.facet.mention.safeValidate(segment.mention).success
) { // ) {
richText.push( // richText.push(
<Link // <Link
key={counter} // key={counter}
href={`/profile/${segment.mention.did}`} // href={`/profile/${segment.mention.did}`}
className="text-brand hover:underline"> // className="text-brand hover:underline">
{segment.text} // {segment.text}
</Link>, // </Link>,
) // )
} else if ( // } else if (
segment.tag && // segment.tag &&
AppBskyRichtextFacet.validateTag(segment.tag).success // app.bsky.richtext.facet.tag.safeValidate(segment.tag).success
) { // ) {
richText.push( // richText.push(
<Link // <Link
key={counter} // key={counter}
href={`/hashtag/${segment.tag.tag}`} // href={`/hashtag/${segment.tag.tag}`}
className="text-brand hover:underline"> // className="text-brand hover:underline">
{segment.text} // {segment.text}
</Link>, // </Link>,
) // )
} else { // } else {
richText.push(segment.text) // richText.push(segment.text)
} // }
counter++ // counter++
} // }
return ( // return (
<p className="text-md min-[400px]:text-lg leading-snug min-[400px]:leading-snug break-word break-words whitespace-pre-wrap"> // <p className="text-md min-[400px]:text-lg leading-snug min-[400px]:leading-snug break-word break-words whitespace-pre-wrap">
{richText} // {richText}
</p> // </p>
) // )
} }
+2 -2
View File
@@ -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 const CONTENT_LABELS = ['porn', 'sexual', 'nudity', 'graphic-media']
export function labelsToInfo( export function labelsToInfo(
labels?: AppBskyFeedDefs.PostView['labels'], labels?: app.bsky.feed.defs.PostView['labels'],
): string | undefined { ): string | undefined {
const label = labels?.find(label => CONTENT_LABELS.includes(label.val)) const label = labels?.find(label => CONTENT_LABELS.includes(label.val))
+37 -45
View File
@@ -1,6 +1,7 @@
import '../index.css' 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 {h, render} from 'preact'
import {useEffect, useMemo, useRef, useState} from 'preact/hooks' import {useEffect, useMemo, useRef, useState} from 'preact/hooks'
@@ -14,7 +15,8 @@ import {
import {Container} from '../components/container' import {Container} from '../components/container'
import {Link} from '../components/link' import {Link} from '../components/link'
import {Post} from '../components/post' 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' import {niceDate} from '../util/nice-date'
const DEFAULT_POST = const DEFAULT_POST =
@@ -30,9 +32,7 @@ if (!root) throw new Error('No root element')
initSystemColorMode({additionalBodyClasses: 'dark:bg-dimmedBgDarken'}) initSystemColorMode({additionalBodyClasses: 'dark:bg-dimmedBgDarken'})
const agent = new AtpAgent({ const client = new Client('https://public.api.bsky.app')
service: 'https://public.api.bsky.app',
})
render(<LandingPage />, root) render(<LandingPage />, root)
@@ -42,14 +42,12 @@ function LandingPage() {
const [error, setError] = useState<string | null>(null) const [error, setError] = useState<string | null>(null)
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const [thread, setThread] = useState<AppBskyFeedDefs.ThreadViewPost | null>( const [post, setPost] = useState<app.bsky.feed.defs.PostView | null>(null)
null,
)
useEffect(() => { useEffect(() => {
void (async () => { void (async () => {
setError(null) setError(null)
setThread(null) setPost(null)
setLoading(true) setLoading(true)
try { try {
let atUri = DEFAULT_URI let atUri = DEFAULT_URI
@@ -74,13 +72,14 @@ function LandingPage() {
let did = didOrHandle let did = didOrHandle
if (!didOrHandle.startsWith('did:')) { if (!didOrHandle.startsWith('did:')) {
const resolution = await agent.resolveHandle({ const resolution = await client.call(
handle: didOrHandle, com.atproto.identity.resolveHandle,
}) {handle: didOrHandle as HandleString},
if (!resolution.data.did) { )
if (!resolution.did) {
throw new Error('No DID found') throw new Error('No DID found')
} }
did = resolution.data.did did = resolution.did
} }
atUri = `at://${did}/app.bsky.feed.post/${rkey}` atUri = `at://${did}/app.bsky.feed.post/${rkey}`
@@ -91,16 +90,16 @@ function LandingPage() {
} }
} }
const {data} = await agent.getPostThread({ const {posts} = await client.call(app.bsky.feed.getPosts, {
uri: atUri, uris: [atUri as AtUriString],
depth: 0,
parentHeight: 0,
}) })
if (!AppBskyFeedDefs.isThreadViewPost(data.thread)) { const post = posts[0]
if (!post) {
throw new Error('Post not found') 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', label => label.val === '!no-unauthenticated',
) )
if (pwiOptOut) { if (pwiOptOut) {
@@ -108,7 +107,7 @@ function LandingPage() {
'The author of this post has requested their posts not be displayed on external sites.', 'The author of this post has requested their posts not be displayed on external sites.',
) )
} }
setThread(data.thread) setPost(post)
} catch (err) { } catch (err) {
console.error(err) console.error(err)
setError(err instanceof Error ? err.message : 'Invalid Bluesky URL') setError(err instanceof Error ? err.message : 'Invalid Bluesky URL')
@@ -166,11 +165,11 @@ function LandingPage() {
</div> </div>
) : ( ) : (
<div className="w-full max-w-[600px] gap-8 flex flex-col"> <div className="w-full max-w-[600px] gap-8 flex flex-col">
{!error && thread && uri && ( {!error && post && uri && (
<Snippet thread={thread} colorMode={colorMode} /> <Snippet post={post} colorMode={colorMode} />
)} )}
<div className={colorMode}> <div className={colorMode}>
{!error && thread && <Post thread={thread} key={thread.post.uri} />} {!error && post && <Post post={post} key={post.uri} />}
</div> </div>
{error && ( {error && (
<div className="w-full border border-red-500 bg-red-500/10 px-4 py-3 rounded-lg"> <div className="w-full border border-red-500 bg-red-500/10 px-4 py-3 rounded-lg">
@@ -203,10 +202,10 @@ function Skeleton() {
} }
function Snippet({ function Snippet({
thread, post,
colorMode, colorMode,
}: { }: {
thread: AppBskyFeedDefs.ThreadViewPost post: app.bsky.feed.defs.PostView
colorMode: ColorModeValues colorMode: ColorModeValues
}) { }) {
const ref = useRef<HTMLInputElement>(null) const ref = useRef<HTMLInputElement>(null)
@@ -223,24 +222,17 @@ function Snippet({
}, [copied]) }, [copied])
const snippet = useMemo(() => { const snippet = useMemo(() => {
const record = thread.post.record const validation = app.bsky.feed.post.$safeValidate(post.record)
if (!validation.success) {
if (
!bsky.dangerousIsType<AppBskyFeedPost.Record>(
record,
AppBskyFeedPost.isRecord,
)
) {
return '' return ''
} }
const record = validation.value
const lang = record.langs && record.langs.length > 0 ? record.langs[0] : '' const lang = record.langs && record.langs.length > 0 ? record.langs[0] : ''
const profileHref = toShareUrl( const profileHref = toShareUrl(['/profile', post.author.did].join('/'))
['/profile', thread.post.author.did].join('/'), const urip = new AtUri(post.uri)
)
const urip = new AtUri(thread.post.uri)
const href = toShareUrl( 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 // 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. // 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 // 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 `<blockquote class="bluesky-embed" data-bluesky-uri="${escapeHtml( return `<blockquote class="bluesky-embed" data-bluesky-uri="${escapeHtml(
thread.post.uri, post.uri,
)}" data-bluesky-cid="${escapeHtml( )}" data-bluesky-cid="${escapeHtml(
thread.post.cid, post.cid,
)}" data-bluesky-embed-color-mode="${escapeHtml( )}" data-bluesky-embed-color-mode="${escapeHtml(
colorMode, colorMode,
)}"><p lang="${escapeHtml(lang)}">${escapeHtml(record.text)}${ )}"><p lang="${escapeHtml(lang)}">${escapeHtml(record.text)}${
@@ -258,13 +250,13 @@ function Snippet({
? `<br><br><a href="${escapeHtml(href)}">[image or embed]</a>` ? `<br><br><a href="${escapeHtml(href)}">[image or embed]</a>`
: '' : ''
}</p>&mdash; ${escapeHtml( }</p>&mdash; ${escapeHtml(
thread.post.author.displayName || thread.post.author.handle, post.author.displayName || post.author.handle,
)} (<a href="${escapeHtml(profileHref)}">@${escapeHtml( )} (<a href="${escapeHtml(profileHref)}">@${escapeHtml(
thread.post.author.handle, post.author.handle,
)}</a>) <a href="${escapeHtml(href)}">${escapeHtml( )}</a>) <a href="${escapeHtml(href)}">${escapeHtml(
niceDate(thread.post.indexedAt), niceDate(post.indexedAt),
)}</a></blockquote><script async src="${EMBED_SCRIPT}" charset="utf-8"></script>` )}</a></blockquote><script async src="${EMBED_SCRIPT}" charset="utf-8"></script>`
}, [thread, colorMode]) }, [post, colorMode])
return ( return (
<div className="flex gap-2 w-full"> <div className="flex gap-2 w-full">
+18 -17
View File
@@ -1,6 +1,6 @@
import '../index.css' import '../index.css'
import {AppBskyFeedDefs, AtpAgent} from '@atproto/api' import {type AtUriString, Client} from '@atproto/lex'
import {h, render} from 'preact' import {h, render} from 'preact'
import logo from '../../assets/logo.svg' import logo from '../../assets/logo.svg'
@@ -8,14 +8,13 @@ import {applyTheme, initSystemColorMode} from '../color-mode'
import {Container} from '../components/container' import {Container} from '../components/container'
import {Link} from '../components/link' import {Link} from '../components/link'
import {Post} from '../components/post' import {Post} from '../components/post'
import * as app from '../lexicons/app'
import {getRkey} from '../util/rkey' import {getRkey} from '../util/rkey'
const root = document.getElementById('app') const root = document.getElementById('app')
if (!root) throw new Error('No root element') if (!root) throw new Error('No root element')
const agent = new AtpAgent({ const client = new Client('https://public.api.bsky.app')
service: 'https://public.api.bsky.app',
})
const uri = `at://${window.location.pathname.slice('/embed/'.length)}` const uri = `at://${window.location.pathname.slice('/embed/'.length)}`
if (!uri) { if (!uri) {
@@ -40,23 +39,25 @@ switch (colorMode) {
break break
} }
agent client
.getPostThread({ .call(app.bsky.feed.getPosts, {
uri, uris: [uri as AtUriString],
depth: 0,
parentHeight: 0,
}) })
.then(({data}) => { .then(({posts}) => {
if (!AppBskyFeedDefs.isThreadViewPost(data.thread)) { const post = posts[0]
throw new Error('Expected a ThreadViewPost')
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', label => label.val === '!no-unauthenticated',
) )
if (pwiOptOut) { if (pwiOptOut) {
render(<PwiOptOut thread={data.thread} />, root) render(<PwiOptOut post={post} />, root)
} else { } else {
render(<Post thread={data.thread} />, root) render(<Post post={post} />, root)
} }
}) })
.catch(err => { .catch(err => {
@@ -64,8 +65,8 @@ agent
render(<ErrorMessage />, root) render(<ErrorMessage />, root)
}) })
function PwiOptOut({thread}: {thread: AppBskyFeedDefs.ThreadViewPost}) { function PwiOptOut({post}: {post: app.bsky.feed.defs.PostView}) {
const href = `/profile/${thread.post.author.did}/post/${getRkey(thread.post)}` const href = `/profile/${post.author.did}/post/${getRkey({uri: post.uri})}`
return ( return (
<Container href={href}> <Container href={href}>
<Link <Link
-49
View File
@@ -1,49 +0,0 @@
import {ValidationResult} from '@atproto/lexicon'
export * as profile from './profile'
/**
* Fast type checking without full schema validation, for use with data we
* trust, or for non-critical path use cases. Why? Our SDK's `is*` identity
* utils do not assert the type of the entire object, only the `$type` string.
*
* For full validation of the object schema, use the `validate` export from
* this file.
*
* Usage:
* ```ts
* import * as bsky from '#/types/bsky'
*
* if (bsky.dangerousIsType<AppBskyFeedPost.Record>(item, AppBskyFeedPost.isRecord)) {
* // `item` has type `$Typed<AppBskyFeedPost.Record>` here
* }
* ```
*/
export function dangerousIsType<R extends {$type?: string}>(
record: unknown,
identity: <V>(v: V) => v is V & {$type: NonNullable<R['$type']>},
): 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<AppBskyFeedPost.Record>` here
* }
* ```
*/
export function validate<R extends {$type?: string}>(
record: unknown,
validator: (v: unknown) => ValidationResult<R>,
): record is R {
return validator(record).success
}
-10
View File
@@ -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
-152
View File
@@ -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<T extends Embed['type']> = Extract<Embed, {type: T}>
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,
}
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
import {AtUri} from '@atproto/api' import {AtUri} from '@atproto/syntax'
export function getRkey({uri}: {uri: string}): string { export function getRkey({uri}: {uri: string}): string {
const at = new AtUri(uri) const at = new AtUri(uri)
+2 -2
View File
@@ -1,4 +1,4 @@
import * as bsky from '../types/bsky' import * as app from '../lexicons/app'
export type VerificationState = { export type VerificationState = {
role: 'default' | 'verifier' role: 'default' | 'verifier'
@@ -8,7 +8,7 @@ export type VerificationState = {
export function getVerificationState({ export function getVerificationState({
profile, profile,
}: { }: {
profile?: bsky.profile.AnyProfileView profile?: app.bsky.actor.defs.ProfileViewBasic
}): VerificationState { }): VerificationState {
if (!profile || !profile.verification) { if (!profile || !profile.verification) {
return { return {