A very simple single-file PDS home page to list active users

initial commit

finxol.io d12e9171

verified
+24
.gitignore
···
···
+
# Logs
+
logs
+
*.log
+
npm-debug.log*
+
yarn-debug.log*
+
yarn-error.log*
+
pnpm-debug.log*
+
lerna-debug.log*
+
+
node_modules
+
dist
+
dist-ssr
+
*.local
+
+
# Editor directories and files
+
.vscode/*
+
!.vscode/extensions.json
+
.idea
+
.DS_Store
+
*.suo
+
*.ntvs*
+
*.njsproj
+
*.sln
+
*.sw?
+3
.zed/settings.json
···
···
+
{
+
"language_servers": ["vtsls", "biome", "vscode-html-language-server"]
+
}
+49
index.html
···
···
+
<!doctype html>
+
<html lang="en">
+
<head>
+
<meta charset="utf-8" />
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
<title>PDS Homepage</title>
+
<link rel="preconnect" href="https://fonts.bunny.net" />
+
<link
+
href="https://fonts.bunny.net/css?family=actor:400|coiny:400"
+
rel="stylesheet"
+
/>
+
<script type="importmap">
+
{
+
"imports": {
+
"@atcute/client": "https://unpkg.com/react@18/umd/react.development.js"
+
}
+
}
+
</script>
+
<link rel="stylesheet" href="src/reset.css" />
+
<link rel="stylesheet" href="src/style.css" />
+
</head>
+
<body>
+
<main>
+
<svg class="atproto-logo" aria-hidden="true" viewBox="0 0 28 28">
+
<path
+
d="M14.362 27.78c-1.956 0-3.756-.324-5.4-.972-1.644-.648-3.072-1.566-4.284-2.754a12.247 12.247 0 0 1-2.808-4.158c-.66-1.596-.99-3.33-.99-5.202 0-2.232.342-4.212 1.026-5.94.696-1.728 1.656-3.18 2.88-4.356a12.48 12.48 0 0 1 4.284-2.7c1.632-.612 3.378-.918 5.238-.918 2.28 0 4.278.354 5.994 1.062 1.716.708 3.144 1.668 4.284 2.88a11.706 11.706 0 0 1 2.538 4.158c.552 1.548.804 3.168.756 4.86-.06 2.328-.546 4.116-1.458 5.364-.912 1.236-2.328 1.854-4.248 1.854a5.839 5.839 0 0 1-2.826-.702 3.703 3.703 0 0 1-1.764-2.07l1.044.054c-.492.924-1.164 1.572-2.016 1.944a6.464 6.464 0 0 1-2.61.558c-1.212 0-2.28-.258-3.204-.774a5.682 5.682 0 0 1-2.178-2.214c-.528-.948-.792-2.046-.792-3.294 0-1.284.276-2.394.828-3.33a5.77 5.77 0 0 1 2.232-2.196c.936-.516 1.992-.774 3.168-.774.78 0 1.59.162 2.43.486.852.324 1.512.78 1.98 1.368l-.738.936V8.664h2.412l-.054 6.462c0 .924.18 1.62.54 2.088.36.468.894.702 1.602.702.624 0 1.104-.174 1.44-.522.348-.36.588-.846.72-1.458a10.66 10.66 0 0 0 .252-2.106c.036-1.86-.24-3.426-.828-4.698-.588-1.272-1.386-2.298-2.394-3.078a9.499 9.499 0 0 0-3.294-1.71c-1.2-.36-2.394-.54-3.582-.54-1.68 0-3.174.27-4.482.81-1.308.528-2.412 1.278-3.312 2.25-.888.96-1.56 2.1-2.016 3.42-.444 1.308-.654 2.748-.63 4.32.048 1.56.33 2.964.846 4.212a9.324 9.324 0 0 0 2.16 3.204 9.38 9.38 0 0 0 3.276 2.034c1.26.468 2.64.702 4.14.702.84 0 1.674-.096 2.502-.288.84-.18 1.608-.438 2.304-.774l1.026 2.808c-.924.432-1.896.75-2.916.954a14.649 14.649 0 0 1-3.078.324Zm-.144-10.098c.852 0 1.566-.246 2.142-.738.576-.492.864-1.326.864-2.502 0-1.068-.258-1.872-.774-2.412-.504-.552-1.218-.828-2.142-.828-1.092 0-1.908.288-2.448.864-.54.576-.81 1.368-.81 2.376 0 1.032.276 1.83.828 2.394.564.564 1.344.846 2.34.846Z"
+
></path>
+
</svg>
+
<h1>PDS Homepage</h1>
+
<p>
+
This is an atproto PDS.<br />
+
You can find more information about what that means on the
+
<a
+
href="https://atproto.com/guides/glossary#pds-personal-data-server"
+
>
+
atproto website </a
+
>.
+
</p>
+
</main>
+
+
<section class="users">
+
<h3>Users</h3>
+
+
<p>No users found on this PDS</p>
+
</section>
+
</body>
+
+
<script type="module" src="src/main.ts"></script>
+
</html>
+29
package.json
···
···
+
{
+
"name": "pds-home",
+
"private": true,
+
"version": "0.0.0",
+
"type": "module",
+
"scripts": {
+
"dev": "vite",
+
"build": "tsc && vite build",
+
"preview": "vite preview"
+
},
+
"devDependencies": {
+
"typescript": "~5.9.3",
+
"vite": "npm:rolldown-vite@7.1.14",
+
"vite-plugin-singlefile": "^2.3.0"
+
},
+
"pnpm": {
+
"overrides": {
+
"vite": "npm:rolldown-vite@7.1.14"
+
}
+
},
+
"dependencies": {
+
"@atcute/atproto": "^3.1.4",
+
"@atcute/bluesky": "^3.2.3",
+
"@atcute/client": "^4.0.3",
+
"@atcute/identity": "^1.1.0",
+
"@atcute/identity-resolver": "^1.1.3",
+
"@atcute/lexicons": "^1.1.1"
+
}
+
}
+857
pnpm-lock.yaml
···
···
+
lockfileVersion: '9.0'
+
+
settings:
+
autoInstallPeers: true
+
excludeLinksFromLockfile: false
+
+
overrides:
+
vite: npm:rolldown-vite@7.1.14
+
+
importers:
+
+
.:
+
dependencies:
+
'@atcute/atproto':
+
specifier: ^3.1.4
+
version: 3.1.4
+
'@atcute/bluesky':
+
specifier: ^3.2.3
+
version: 3.2.3
+
'@atcute/client':
+
specifier: ^4.0.3
+
version: 4.0.3
+
'@atcute/identity':
+
specifier: ^1.1.0
+
version: 1.1.0
+
'@atcute/identity-resolver':
+
specifier: ^1.1.3
+
version: 1.1.3(@atcute/identity@1.1.0)
+
'@atcute/lexicons':
+
specifier: ^1.1.1
+
version: 1.1.1
+
devDependencies:
+
typescript:
+
specifier: ~5.9.3
+
version: 5.9.3
+
vite:
+
specifier: npm:rolldown-vite@7.1.14
+
version: rolldown-vite@7.1.14
+
vite-plugin-singlefile:
+
specifier: ^2.3.0
+
version: 2.3.0(rolldown-vite@7.1.14)(rollup@4.52.4)
+
+
packages:
+
+
'@atcute/atproto@3.1.4':
+
resolution: {integrity: sha512-v0/ue7mZYtjYw4vWbtda51bLwW88mqsUQB8F/UZNO18ANAQWmKq1HDceVqjvruaLe2QPqE43XM3WkEyZ2FhOrA==}
+
+
'@atcute/bluesky@3.2.3':
+
resolution: {integrity: sha512-IdPQQ54F1BLhW5z49k81ZUC/GQl/tVygZ+CzLHYvQySHA6GJRcvPzwEf8aV21u0SZOJF+yF4CWEGNgtryyxPmg==}
+
+
'@atcute/client@4.0.3':
+
resolution: {integrity: sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==}
+
+
'@atcute/identity-resolver@1.1.3':
+
resolution: {integrity: sha512-KZgGgg99CWaV7Df3+h3X/WMrDzTPQVfsaoIVbTNLx2B56BvCL2EmaxPSVw/7BFUJMZHlVU4rtoEB4lyvNyMswA==}
+
peerDependencies:
+
'@atcute/identity': ^1.0.0
+
+
'@atcute/identity@1.1.0':
+
resolution: {integrity: sha512-6vRvRqJatDB+JUQsb+UswYmtBGQnSZcqC3a2y6H5DB/v5KcIh+6nFFtc17G0+3W9rxdk7k9M4KkgkdKf/YDNoQ==}
+
+
'@atcute/lexicons@1.1.1':
+
resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==}
+
+
'@atcute/util-fetch@1.0.2':
+
resolution: {integrity: sha512-6kOwQzaoPu7ss0EwvgSOPVg/JIJdozbXva5d/g99bBg8RaSX8se//INOyr/nby/GwrpxCIZU9Wzm+pl7xerI0Q==}
+
+
'@badrap/valita@0.4.6':
+
resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==}
+
engines: {node: '>= 18'}
+
+
'@emnapi/core@1.5.0':
+
resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==}
+
+
'@emnapi/runtime@1.5.0':
+
resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==}
+
+
'@emnapi/wasi-threads@1.1.0':
+
resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
+
+
'@napi-rs/wasm-runtime@1.0.6':
+
resolution: {integrity: sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==}
+
+
'@oxc-project/runtime@0.92.0':
+
resolution: {integrity: sha512-Z7x2dZOmznihvdvCvLKMl+nswtOSVxS2H2ocar+U9xx6iMfTp0VGIrX6a4xB1v80IwOPC7dT1LXIJrY70Xu3Jw==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
+
'@oxc-project/types@0.93.0':
+
resolution: {integrity: sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==}
+
+
'@rolldown/binding-android-arm64@1.0.0-beta.41':
+
resolution: {integrity: sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [android]
+
+
'@rolldown/binding-darwin-arm64@1.0.0-beta.41':
+
resolution: {integrity: sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [darwin]
+
+
'@rolldown/binding-darwin-x64@1.0.0-beta.41':
+
resolution: {integrity: sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [x64]
+
os: [darwin]
+
+
'@rolldown/binding-freebsd-x64@1.0.0-beta.41':
+
resolution: {integrity: sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [x64]
+
os: [freebsd]
+
+
'@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41':
+
resolution: {integrity: sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm]
+
os: [linux]
+
+
'@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41':
+
resolution: {integrity: sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [linux]
+
+
'@rolldown/binding-linux-arm64-musl@1.0.0-beta.41':
+
resolution: {integrity: sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [linux]
+
+
'@rolldown/binding-linux-x64-gnu@1.0.0-beta.41':
+
resolution: {integrity: sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [x64]
+
os: [linux]
+
+
'@rolldown/binding-linux-x64-musl@1.0.0-beta.41':
+
resolution: {integrity: sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [x64]
+
os: [linux]
+
+
'@rolldown/binding-openharmony-arm64@1.0.0-beta.41':
+
resolution: {integrity: sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [openharmony]
+
+
'@rolldown/binding-wasm32-wasi@1.0.0-beta.41':
+
resolution: {integrity: sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==}
+
engines: {node: '>=14.0.0'}
+
cpu: [wasm32]
+
+
'@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41':
+
resolution: {integrity: sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [win32]
+
+
'@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41':
+
resolution: {integrity: sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [ia32]
+
os: [win32]
+
+
'@rolldown/binding-win32-x64-msvc@1.0.0-beta.41':
+
resolution: {integrity: sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [x64]
+
os: [win32]
+
+
'@rolldown/pluginutils@1.0.0-beta.41':
+
resolution: {integrity: sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==}
+
+
'@rollup/rollup-android-arm-eabi@4.52.4':
+
resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==}
+
cpu: [arm]
+
os: [android]
+
+
'@rollup/rollup-android-arm64@4.52.4':
+
resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==}
+
cpu: [arm64]
+
os: [android]
+
+
'@rollup/rollup-darwin-arm64@4.52.4':
+
resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==}
+
cpu: [arm64]
+
os: [darwin]
+
+
'@rollup/rollup-darwin-x64@4.52.4':
+
resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==}
+
cpu: [x64]
+
os: [darwin]
+
+
'@rollup/rollup-freebsd-arm64@4.52.4':
+
resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==}
+
cpu: [arm64]
+
os: [freebsd]
+
+
'@rollup/rollup-freebsd-x64@4.52.4':
+
resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==}
+
cpu: [x64]
+
os: [freebsd]
+
+
'@rollup/rollup-linux-arm-gnueabihf@4.52.4':
+
resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==}
+
cpu: [arm]
+
os: [linux]
+
+
'@rollup/rollup-linux-arm-musleabihf@4.52.4':
+
resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==}
+
cpu: [arm]
+
os: [linux]
+
+
'@rollup/rollup-linux-arm64-gnu@4.52.4':
+
resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==}
+
cpu: [arm64]
+
os: [linux]
+
+
'@rollup/rollup-linux-arm64-musl@4.52.4':
+
resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==}
+
cpu: [arm64]
+
os: [linux]
+
+
'@rollup/rollup-linux-loong64-gnu@4.52.4':
+
resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==}
+
cpu: [loong64]
+
os: [linux]
+
+
'@rollup/rollup-linux-ppc64-gnu@4.52.4':
+
resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==}
+
cpu: [ppc64]
+
os: [linux]
+
+
'@rollup/rollup-linux-riscv64-gnu@4.52.4':
+
resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==}
+
cpu: [riscv64]
+
os: [linux]
+
+
'@rollup/rollup-linux-riscv64-musl@4.52.4':
+
resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==}
+
cpu: [riscv64]
+
os: [linux]
+
+
'@rollup/rollup-linux-s390x-gnu@4.52.4':
+
resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==}
+
cpu: [s390x]
+
os: [linux]
+
+
'@rollup/rollup-linux-x64-gnu@4.52.4':
+
resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==}
+
cpu: [x64]
+
os: [linux]
+
+
'@rollup/rollup-linux-x64-musl@4.52.4':
+
resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==}
+
cpu: [x64]
+
os: [linux]
+
+
'@rollup/rollup-openharmony-arm64@4.52.4':
+
resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==}
+
cpu: [arm64]
+
os: [openharmony]
+
+
'@rollup/rollup-win32-arm64-msvc@4.52.4':
+
resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==}
+
cpu: [arm64]
+
os: [win32]
+
+
'@rollup/rollup-win32-ia32-msvc@4.52.4':
+
resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==}
+
cpu: [ia32]
+
os: [win32]
+
+
'@rollup/rollup-win32-x64-gnu@4.52.4':
+
resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==}
+
cpu: [x64]
+
os: [win32]
+
+
'@rollup/rollup-win32-x64-msvc@4.52.4':
+
resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==}
+
cpu: [x64]
+
os: [win32]
+
+
'@tybys/wasm-util@0.10.1':
+
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+
+
'@types/estree@1.0.8':
+
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+
ansis@4.2.0:
+
resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==}
+
engines: {node: '>=14'}
+
+
braces@3.0.3:
+
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+
engines: {node: '>=8'}
+
+
detect-libc@2.1.1:
+
resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==}
+
engines: {node: '>=8'}
+
+
esm-env@1.2.2:
+
resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==}
+
+
fdir@6.5.0:
+
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+
engines: {node: '>=12.0.0'}
+
peerDependencies:
+
picomatch: ^3 || ^4
+
peerDependenciesMeta:
+
picomatch:
+
optional: true
+
+
fill-range@7.1.1:
+
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+
engines: {node: '>=8'}
+
+
fsevents@2.3.3:
+
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+
os: [darwin]
+
+
is-number@7.0.0:
+
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+
engines: {node: '>=0.12.0'}
+
+
lightningcss-android-arm64@1.30.2:
+
resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
+
engines: {node: '>= 12.0.0'}
+
cpu: [arm64]
+
os: [android]
+
+
lightningcss-darwin-arm64@1.30.2:
+
resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==}
+
engines: {node: '>= 12.0.0'}
+
cpu: [arm64]
+
os: [darwin]
+
+
lightningcss-darwin-x64@1.30.2:
+
resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==}
+
engines: {node: '>= 12.0.0'}
+
cpu: [x64]
+
os: [darwin]
+
+
lightningcss-freebsd-x64@1.30.2:
+
resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==}
+
engines: {node: '>= 12.0.0'}
+
cpu: [x64]
+
os: [freebsd]
+
+
lightningcss-linux-arm-gnueabihf@1.30.2:
+
resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==}
+
engines: {node: '>= 12.0.0'}
+
cpu: [arm]
+
os: [linux]
+
+
lightningcss-linux-arm64-gnu@1.30.2:
+
resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==}
+
engines: {node: '>= 12.0.0'}
+
cpu: [arm64]
+
os: [linux]
+
+
lightningcss-linux-arm64-musl@1.30.2:
+
resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
+
engines: {node: '>= 12.0.0'}
+
cpu: [arm64]
+
os: [linux]
+
+
lightningcss-linux-x64-gnu@1.30.2:
+
resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
+
engines: {node: '>= 12.0.0'}
+
cpu: [x64]
+
os: [linux]
+
+
lightningcss-linux-x64-musl@1.30.2:
+
resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
+
engines: {node: '>= 12.0.0'}
+
cpu: [x64]
+
os: [linux]
+
+
lightningcss-win32-arm64-msvc@1.30.2:
+
resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
+
engines: {node: '>= 12.0.0'}
+
cpu: [arm64]
+
os: [win32]
+
+
lightningcss-win32-x64-msvc@1.30.2:
+
resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==}
+
engines: {node: '>= 12.0.0'}
+
cpu: [x64]
+
os: [win32]
+
+
lightningcss@1.30.2:
+
resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==}
+
engines: {node: '>= 12.0.0'}
+
+
micromatch@4.0.8:
+
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+
engines: {node: '>=8.6'}
+
+
nanoid@3.3.11:
+
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+
hasBin: true
+
+
picocolors@1.1.1:
+
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+
picomatch@2.3.1:
+
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+
engines: {node: '>=8.6'}
+
+
picomatch@4.0.3:
+
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+
engines: {node: '>=12'}
+
+
postcss@8.5.6:
+
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+
engines: {node: ^10 || ^12 || >=14}
+
+
rolldown-vite@7.1.14:
+
resolution: {integrity: sha512-eSiiRJmovt8qDJkGyZuLnbxAOAdie6NCmmd0NkTC0RJI9duiSBTfr8X2mBYJOUFzxQa2USaHmL99J9uMxkjCyw==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
hasBin: true
+
peerDependencies:
+
'@types/node': ^20.19.0 || >=22.12.0
+
esbuild: ^0.25.0
+
jiti: '>=1.21.0'
+
less: ^4.0.0
+
sass: ^1.70.0
+
sass-embedded: ^1.70.0
+
stylus: '>=0.54.8'
+
sugarss: ^5.0.0
+
terser: ^5.16.0
+
tsx: ^4.8.1
+
yaml: ^2.4.2
+
peerDependenciesMeta:
+
'@types/node':
+
optional: true
+
esbuild:
+
optional: true
+
jiti:
+
optional: true
+
less:
+
optional: true
+
sass:
+
optional: true
+
sass-embedded:
+
optional: true
+
stylus:
+
optional: true
+
sugarss:
+
optional: true
+
terser:
+
optional: true
+
tsx:
+
optional: true
+
yaml:
+
optional: true
+
+
rolldown@1.0.0-beta.41:
+
resolution: {integrity: sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
hasBin: true
+
+
rollup@4.52.4:
+
resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==}
+
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+
hasBin: true
+
+
source-map-js@1.2.1:
+
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+
engines: {node: '>=0.10.0'}
+
+
tinyglobby@0.2.15:
+
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+
engines: {node: '>=12.0.0'}
+
+
to-regex-range@5.0.1:
+
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+
engines: {node: '>=8.0'}
+
+
tslib@2.8.1:
+
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+
typescript@5.9.3:
+
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+
engines: {node: '>=14.17'}
+
hasBin: true
+
+
vite-plugin-singlefile@2.3.0:
+
resolution: {integrity: sha512-DAcHzYypM0CasNLSz/WG0VdKOCxGHErfrjOoyIPiNxTPTGmO6rRD/te93n1YL/s+miXq66ipF1brMBikf99c6A==}
+
engines: {node: '>18.0.0'}
+
peerDependencies:
+
rollup: ^4.44.1
+
vite: ^5.4.11 || ^6.0.0 || ^7.0.0
+
+
snapshots:
+
+
'@atcute/atproto@3.1.4':
+
dependencies:
+
'@atcute/lexicons': 1.1.1
+
+
'@atcute/bluesky@3.2.3':
+
dependencies:
+
'@atcute/atproto': 3.1.4
+
'@atcute/lexicons': 1.1.1
+
+
'@atcute/client@4.0.3':
+
dependencies:
+
'@atcute/identity': 1.1.0
+
'@atcute/lexicons': 1.1.1
+
+
'@atcute/identity-resolver@1.1.3(@atcute/identity@1.1.0)':
+
dependencies:
+
'@atcute/identity': 1.1.0
+
'@atcute/lexicons': 1.1.1
+
'@atcute/util-fetch': 1.0.2
+
'@badrap/valita': 0.4.6
+
+
'@atcute/identity@1.1.0':
+
dependencies:
+
'@atcute/lexicons': 1.1.1
+
'@badrap/valita': 0.4.6
+
+
'@atcute/lexicons@1.1.1':
+
dependencies:
+
esm-env: 1.2.2
+
+
'@atcute/util-fetch@1.0.2':
+
dependencies:
+
'@badrap/valita': 0.4.6
+
+
'@badrap/valita@0.4.6': {}
+
+
'@emnapi/core@1.5.0':
+
dependencies:
+
'@emnapi/wasi-threads': 1.1.0
+
tslib: 2.8.1
+
optional: true
+
+
'@emnapi/runtime@1.5.0':
+
dependencies:
+
tslib: 2.8.1
+
optional: true
+
+
'@emnapi/wasi-threads@1.1.0':
+
dependencies:
+
tslib: 2.8.1
+
optional: true
+
+
'@napi-rs/wasm-runtime@1.0.6':
+
dependencies:
+
'@emnapi/core': 1.5.0
+
'@emnapi/runtime': 1.5.0
+
'@tybys/wasm-util': 0.10.1
+
optional: true
+
+
'@oxc-project/runtime@0.92.0': {}
+
+
'@oxc-project/types@0.93.0': {}
+
+
'@rolldown/binding-android-arm64@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-darwin-arm64@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-darwin-x64@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-freebsd-x64@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-linux-arm64-musl@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-linux-x64-gnu@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-linux-x64-musl@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-openharmony-arm64@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-wasm32-wasi@1.0.0-beta.41':
+
dependencies:
+
'@napi-rs/wasm-runtime': 1.0.6
+
optional: true
+
+
'@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/binding-win32-x64-msvc@1.0.0-beta.41':
+
optional: true
+
+
'@rolldown/pluginutils@1.0.0-beta.41': {}
+
+
'@rollup/rollup-android-arm-eabi@4.52.4':
+
optional: true
+
+
'@rollup/rollup-android-arm64@4.52.4':
+
optional: true
+
+
'@rollup/rollup-darwin-arm64@4.52.4':
+
optional: true
+
+
'@rollup/rollup-darwin-x64@4.52.4':
+
optional: true
+
+
'@rollup/rollup-freebsd-arm64@4.52.4':
+
optional: true
+
+
'@rollup/rollup-freebsd-x64@4.52.4':
+
optional: true
+
+
'@rollup/rollup-linux-arm-gnueabihf@4.52.4':
+
optional: true
+
+
'@rollup/rollup-linux-arm-musleabihf@4.52.4':
+
optional: true
+
+
'@rollup/rollup-linux-arm64-gnu@4.52.4':
+
optional: true
+
+
'@rollup/rollup-linux-arm64-musl@4.52.4':
+
optional: true
+
+
'@rollup/rollup-linux-loong64-gnu@4.52.4':
+
optional: true
+
+
'@rollup/rollup-linux-ppc64-gnu@4.52.4':
+
optional: true
+
+
'@rollup/rollup-linux-riscv64-gnu@4.52.4':
+
optional: true
+
+
'@rollup/rollup-linux-riscv64-musl@4.52.4':
+
optional: true
+
+
'@rollup/rollup-linux-s390x-gnu@4.52.4':
+
optional: true
+
+
'@rollup/rollup-linux-x64-gnu@4.52.4':
+
optional: true
+
+
'@rollup/rollup-linux-x64-musl@4.52.4':
+
optional: true
+
+
'@rollup/rollup-openharmony-arm64@4.52.4':
+
optional: true
+
+
'@rollup/rollup-win32-arm64-msvc@4.52.4':
+
optional: true
+
+
'@rollup/rollup-win32-ia32-msvc@4.52.4':
+
optional: true
+
+
'@rollup/rollup-win32-x64-gnu@4.52.4':
+
optional: true
+
+
'@rollup/rollup-win32-x64-msvc@4.52.4':
+
optional: true
+
+
'@tybys/wasm-util@0.10.1':
+
dependencies:
+
tslib: 2.8.1
+
optional: true
+
+
'@types/estree@1.0.8': {}
+
+
ansis@4.2.0: {}
+
+
braces@3.0.3:
+
dependencies:
+
fill-range: 7.1.1
+
+
detect-libc@2.1.1: {}
+
+
esm-env@1.2.2: {}
+
+
fdir@6.5.0(picomatch@4.0.3):
+
optionalDependencies:
+
picomatch: 4.0.3
+
+
fill-range@7.1.1:
+
dependencies:
+
to-regex-range: 5.0.1
+
+
fsevents@2.3.3:
+
optional: true
+
+
is-number@7.0.0: {}
+
+
lightningcss-android-arm64@1.30.2:
+
optional: true
+
+
lightningcss-darwin-arm64@1.30.2:
+
optional: true
+
+
lightningcss-darwin-x64@1.30.2:
+
optional: true
+
+
lightningcss-freebsd-x64@1.30.2:
+
optional: true
+
+
lightningcss-linux-arm-gnueabihf@1.30.2:
+
optional: true
+
+
lightningcss-linux-arm64-gnu@1.30.2:
+
optional: true
+
+
lightningcss-linux-arm64-musl@1.30.2:
+
optional: true
+
+
lightningcss-linux-x64-gnu@1.30.2:
+
optional: true
+
+
lightningcss-linux-x64-musl@1.30.2:
+
optional: true
+
+
lightningcss-win32-arm64-msvc@1.30.2:
+
optional: true
+
+
lightningcss-win32-x64-msvc@1.30.2:
+
optional: true
+
+
lightningcss@1.30.2:
+
dependencies:
+
detect-libc: 2.1.1
+
optionalDependencies:
+
lightningcss-android-arm64: 1.30.2
+
lightningcss-darwin-arm64: 1.30.2
+
lightningcss-darwin-x64: 1.30.2
+
lightningcss-freebsd-x64: 1.30.2
+
lightningcss-linux-arm-gnueabihf: 1.30.2
+
lightningcss-linux-arm64-gnu: 1.30.2
+
lightningcss-linux-arm64-musl: 1.30.2
+
lightningcss-linux-x64-gnu: 1.30.2
+
lightningcss-linux-x64-musl: 1.30.2
+
lightningcss-win32-arm64-msvc: 1.30.2
+
lightningcss-win32-x64-msvc: 1.30.2
+
+
micromatch@4.0.8:
+
dependencies:
+
braces: 3.0.3
+
picomatch: 2.3.1
+
+
nanoid@3.3.11: {}
+
+
picocolors@1.1.1: {}
+
+
picomatch@2.3.1: {}
+
+
picomatch@4.0.3: {}
+
+
postcss@8.5.6:
+
dependencies:
+
nanoid: 3.3.11
+
picocolors: 1.1.1
+
source-map-js: 1.2.1
+
+
rolldown-vite@7.1.14:
+
dependencies:
+
'@oxc-project/runtime': 0.92.0
+
fdir: 6.5.0(picomatch@4.0.3)
+
lightningcss: 1.30.2
+
picomatch: 4.0.3
+
postcss: 8.5.6
+
rolldown: 1.0.0-beta.41
+
tinyglobby: 0.2.15
+
optionalDependencies:
+
fsevents: 2.3.3
+
+
rolldown@1.0.0-beta.41:
+
dependencies:
+
'@oxc-project/types': 0.93.0
+
'@rolldown/pluginutils': 1.0.0-beta.41
+
ansis: 4.2.0
+
optionalDependencies:
+
'@rolldown/binding-android-arm64': 1.0.0-beta.41
+
'@rolldown/binding-darwin-arm64': 1.0.0-beta.41
+
'@rolldown/binding-darwin-x64': 1.0.0-beta.41
+
'@rolldown/binding-freebsd-x64': 1.0.0-beta.41
+
'@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.41
+
'@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.41
+
'@rolldown/binding-linux-arm64-musl': 1.0.0-beta.41
+
'@rolldown/binding-linux-x64-gnu': 1.0.0-beta.41
+
'@rolldown/binding-linux-x64-musl': 1.0.0-beta.41
+
'@rolldown/binding-openharmony-arm64': 1.0.0-beta.41
+
'@rolldown/binding-wasm32-wasi': 1.0.0-beta.41
+
'@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.41
+
'@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.41
+
'@rolldown/binding-win32-x64-msvc': 1.0.0-beta.41
+
+
rollup@4.52.4:
+
dependencies:
+
'@types/estree': 1.0.8
+
optionalDependencies:
+
'@rollup/rollup-android-arm-eabi': 4.52.4
+
'@rollup/rollup-android-arm64': 4.52.4
+
'@rollup/rollup-darwin-arm64': 4.52.4
+
'@rollup/rollup-darwin-x64': 4.52.4
+
'@rollup/rollup-freebsd-arm64': 4.52.4
+
'@rollup/rollup-freebsd-x64': 4.52.4
+
'@rollup/rollup-linux-arm-gnueabihf': 4.52.4
+
'@rollup/rollup-linux-arm-musleabihf': 4.52.4
+
'@rollup/rollup-linux-arm64-gnu': 4.52.4
+
'@rollup/rollup-linux-arm64-musl': 4.52.4
+
'@rollup/rollup-linux-loong64-gnu': 4.52.4
+
'@rollup/rollup-linux-ppc64-gnu': 4.52.4
+
'@rollup/rollup-linux-riscv64-gnu': 4.52.4
+
'@rollup/rollup-linux-riscv64-musl': 4.52.4
+
'@rollup/rollup-linux-s390x-gnu': 4.52.4
+
'@rollup/rollup-linux-x64-gnu': 4.52.4
+
'@rollup/rollup-linux-x64-musl': 4.52.4
+
'@rollup/rollup-openharmony-arm64': 4.52.4
+
'@rollup/rollup-win32-arm64-msvc': 4.52.4
+
'@rollup/rollup-win32-ia32-msvc': 4.52.4
+
'@rollup/rollup-win32-x64-gnu': 4.52.4
+
'@rollup/rollup-win32-x64-msvc': 4.52.4
+
fsevents: 2.3.3
+
+
source-map-js@1.2.1: {}
+
+
tinyglobby@0.2.15:
+
dependencies:
+
fdir: 6.5.0(picomatch@4.0.3)
+
picomatch: 4.0.3
+
+
to-regex-range@5.0.1:
+
dependencies:
+
is-number: 7.0.0
+
+
tslib@2.8.1:
+
optional: true
+
+
typescript@5.9.3: {}
+
+
vite-plugin-singlefile@2.3.0(rolldown-vite@7.1.14)(rollup@4.52.4):
+
dependencies:
+
micromatch: 4.0.8
+
rollup: 4.52.4
+
vite: rolldown-vite@7.1.14
+85
src/atproto.ts
···
···
+
import type { } from "@atcute/atproto"
+
import type { } from "@atcute/bluesky"
+
import { Client, CredentialManager } from "@atcute/client"
+
import { isAtprotoDid } from "@atcute/identity";
+
import { CompositeDidDocumentResolver, DocumentNotFoundError, FailedDocumentResolutionError, HandleResolutionError, ImproperDidError, PlcDidDocumentResolver, UnsupportedDidMethodError, WebDidDocumentResolver } from "@atcute/identity-resolver";
+
import { tryCatch } from "./utils";
+
+
type DID = `did:${string}:${string}`
+
+
const pds = location.protocol === "https:" ? location.origin : "https://pds.finxol.io"
+
+
export async function getUsers() {
+
const rpc = new Client({
+
handler: new CredentialManager({ service: pds }),
+
})
+
+
const r = await rpc.get("com.atproto.sync.listRepos", {
+
params: { limit: 100, cursor: "" }, // I don't have that many users so I'll implement the cursor later if needed
+
})
+
+
if (!r.ok) {
+
console.error("Failed to fetch users list:", r.data)
+
return []
+
}
+
+
return r.data.repos
+
}
+
+
export async function resolveAliases(did: DID) {
+
// DID document resolution
+
const docResolver = new CompositeDidDocumentResolver({
+
methods: {
+
plc: new PlcDidDocumentResolver(),
+
web: new WebDidDocumentResolver(),
+
},
+
});
+
+
if (!isAtprotoDid(did)) {
+
return
+
}
+
+
const doc = await tryCatch(docResolver.resolve(did));
+
+
if (!doc.success) {
+
if (doc.error instanceof DocumentNotFoundError) {
+
// did returned no document
+
console.error("Document not found");
+
}
+
if (doc.error instanceof UnsupportedDidMethodError) {
+
// resolver doesn't support did method (composite resolver)
+
console.error("Unsupported DID method");
+
}
+
if (doc.error instanceof ImproperDidError) {
+
// resolver considers did as invalid (atproto did:web)
+
console.error("Improper DID");
+
}
+
if (doc.error instanceof FailedDocumentResolutionError) {
+
// document resolution had thrown something unexpected (fetch error)
+
console.error("Failed document resolution");
+
}
+
+
if (doc.error instanceof HandleResolutionError) {
+
// the errors above extend this class, so you can do a catch-all.
+
console.error("Handle resolution error");
+
}
+
return
+
}
+
+
console.log(doc.value);
+
+
return doc.value.alsoKnownAs;
+
}
+
+
export async function getAvatar(did: DID) {
+
const rpc = new Client({
+
handler: new CredentialManager({ service: "https://public.api.bsky.app" }),
+
})
+
+
const res = await rpc.get("app.bsky.actor.getProfile", { params: { actor: did } });
+
+
if (res.ok) {
+
return res.data.avatar;
+
}
+
return undefined;
+
}
+39
src/main.ts
···
···
+
import { getAvatar, getUsers, resolveAliases } from "./atproto"
+
+
+
const users = await getUsers()
+
+
let cleared = false
+
+
const list = document.createElement("div")
+
for (const user of users) {
+
if (!user.active) {
+
continue;
+
}
+
+
if (!cleared) {
+
document.querySelector("section.users > p")?.remove()
+
cleared = true
+
}
+
+
const handleElement = document.createElement("div")
+
handleElement.textContent = user.did
+
+
const handle = (await resolveAliases(user.did))?.at(0)?.replace("at://", "") || user.did
+
+
const container = document.createElement("div")
+
container.innerHTML = `
+
<img src="${await getAvatar(user.did)}" alt="${handle}" />
+
<div class="info">
+
<a href="https://pdsls.dev/at://${user.did}" class="handle" target="_blank">
+
${handle}
+
</a>
+
</div>
+
`
+
list.appendChild(container)
+
}
+
+
+
const doc = document.querySelector("section.users")
+
//biome-ignore lint/style/noNonNullAssertion: it's fine
+
doc!.appendChild(list)
+92
src/reset.css
···
···
+
/* CSS Reset by Andy Bell, https://piccalil.li/blog/a-more-modern-css-reset/ */
+
+
/* Box sizing rules */
+
*,
+
*::before,
+
*::after {
+
box-sizing: border-box;
+
}
+
+
/* Prevent font size inflation */
+
html {
+
-moz-text-size-adjust: none;
+
-webkit-text-size-adjust: none;
+
text-size-adjust: none;
+
}
+
+
/* Remove default margin in favour of better control in authored CSS */
+
body,
+
h1,
+
h2,
+
h3,
+
h4,
+
p,
+
figure,
+
blockquote,
+
dl,
+
dd {
+
margin-block-end: 0;
+
}
+
+
/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
+
ul[role="list"],
+
ol[role="list"] {
+
list-style: none;
+
}
+
+
/* Set core body defaults */
+
body {
+
min-height: 100vh;
+
line-height: 1.5;
+
}
+
+
/* Set shorter line heights on headings and interactive elements */
+
h1,
+
h2,
+
h3,
+
h4,
+
button,
+
input,
+
label {
+
line-height: 1.1;
+
}
+
+
/* Balance text wrapping on headings */
+
h1,
+
h2,
+
h3,
+
h4 {
+
text-wrap: balance;
+
}
+
+
/* A elements that don't have a class get default styles */
+
a:not([class]) {
+
text-decoration-skip-ink: auto;
+
color: currentColor;
+
}
+
+
/* Make images easier to work with */
+
img,
+
picture {
+
max-width: 100%;
+
display: block;
+
}
+
+
/* Inherit fonts for inputs and buttons */
+
input,
+
button,
+
textarea,
+
select {
+
font-family: inherit;
+
font-size: inherit;
+
}
+
+
/* Make sure textareas without a rows attribute are not tiny */
+
textarea:not([rows]) {
+
min-height: 10em;
+
}
+
+
/* Anything that has been anchored to should have extra scroll margin */
+
:target {
+
scroll-margin-block: 5ex;
+
}
+88
src/style.css
···
···
+
body {
+
margin: 0;
+
padding: 0;
+
font-family: "Actor", sans-serif;
+
min-height: 100svh;
+
display: flex;
+
flex-direction: column;
+
align-items: center;
+
justify-content: start;
+
}
+
+
main {
+
margin: 0;
+
padding: 1rem;
+
display: flex;
+
flex-direction: column;
+
align-items: center;
+
justify-content: center;
+
+
h1,
+
h2,
+
h3 {
+
font-family: "Coiny", serif;
+
font-weight: bold;
+
}
+
+
& > p {
+
text-align: center;
+
}
+
}
+
+
.atproto-logo {
+
height: 7rem;
+
+
path {
+
fill: oklch(62.3% 0.214 259.815);
+
}
+
}
+
+
section.users {
+
display: flex;
+
flex-direction: column;
+
align-items: center;
+
justify-content: start;
+
gap: 1rem;
+
+
& > div {
+
display: flex;
+
flex-direction: column;
+
align-items: start;
+
justify-content: start;
+
gap: 1rem;
+
+
& > div {
+
display: flex;
+
flex-direction: row;
+
align-items: center;
+
justify-content: start;
+
gap: 1rem;
+
+
width: 100%;
+
background-color: #f5f5f5;
+
border-radius: 0.5rem;
+
padding: 1rem;
+
+
& > img {
+
width: 3rem;
+
aspect-ratio: 1/1;
+
border-radius: 50%;
+
object-fit: cover;
+
}
+
+
& > div {
+
display: flex;
+
flex-direction: column;
+
align-items: center;
+
justify-content: center;
+
+
& > .handle {
+
font-size: 1.2rem;
+
font-weight: bold;
+
text-decoration: none;
+
color: inherit;
+
}
+
}
+
}
+
}
+
}
+21
src/utils.ts
···
···
+
export async function tryCatch<T, E = Error>(
+
promise: Promise<T>
+
): Promise<
+
| {
+
success: true
+
value: T
+
error: null
+
}
+
| {
+
success: false
+
value: null
+
error: E
+
}
+
> {
+
try {
+
const value = await promise
+
return { success: true, value, error: null }
+
} catch (error) {
+
return { success: false, value: null, error: error as E }
+
}
+
}
+26
tsconfig.json
···
···
+
{
+
"compilerOptions": {
+
"target": "ES2022",
+
"useDefineForClassFields": true,
+
"module": "ESNext",
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
+
"types": ["vite/client"],
+
"skipLibCheck": true,
+
+
/* Bundler mode */
+
"moduleResolution": "bundler",
+
"allowImportingTsExtensions": true,
+
"verbatimModuleSyntax": true,
+
"moduleDetection": "force",
+
"noEmit": true,
+
+
/* Linting */
+
"strict": true,
+
"noUnusedLocals": true,
+
"noUnusedParameters": true,
+
"erasableSyntaxOnly": true,
+
"noFallthroughCasesInSwitch": true,
+
"noUncheckedSideEffectImports": true
+
},
+
"include": ["src"]
+
}
+6
vite.config.ts
···
···
+
import { defineConfig } from 'vite'
+
import { viteSingleFile } from 'vite-plugin-singlefile'
+
+
export default defineConfig({
+
plugins: [viteSingleFile()],
+
})