this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Integrate atproto auth

modamo-gh 0e76b6fa b67cebe9

+1531 -8
app.db

This is a binary file and will not be displayed.

app.db-shm

This is a binary file and will not be displayed.

app.db-wal

This is a binary file and will not be displayed.

+14
app/.well-known/jwks.json/route.ts
··· 1 + import { JoseKey } from "@atproto/oauth-client-node"; 2 + import { NextResponse } from "next/server"; 3 + 4 + const PRIVATE_KEY = process.env.PRIVATE_KEY; 5 + 6 + export async function GET() { 7 + if (!PRIVATE_KEY) { 8 + return NextResponse.json({ keys: [] }); 9 + } 10 + 11 + const key = await JoseKey.fromJWK(JSON.parse(PRIVATE_KEY)); 12 + 13 + return NextResponse.json({ keys: [key.publicJwk] }); 14 + }
+11
app/lib/atproto/profile.ts
··· 1 + import { Agent } from "@atproto/api"; 2 + import { OAuthSession } from "@atproto/oauth-client-node"; 3 + 4 + export const getHandle = async (session: OAuthSession) => { 5 + const agent = new Agent(session); 6 + const profile = await agent.app.bsky.actor.getProfile({ 7 + actor: session.did 8 + }); 9 + 10 + return profile.data.handle; 11 + };
+127
app/lib/auth/client/route.ts
··· 1 + import { 2 + buildAtprotoLoopbackClientMetadata, 3 + JoseKey, 4 + Keyset, 5 + NodeOAuthClient, 6 + NodeSavedSession, 7 + NodeSavedState 8 + } from "@atproto/oauth-client-node"; 9 + import { getDB } from "../../db/index"; 10 + 11 + declare global { 12 + var _oauthClient: NodeOAuthClient | undefined; 13 + } 14 + 15 + const PRIVATE_KEY = process.env.PRIVATE_KEY; 16 + const PUBLIC_URL = process.env.PUBLIC_URL; 17 + 18 + export const SCOPE = "atproto transition:generic"; 19 + ; 20 + 21 + const getClientMetadata = () => { 22 + if (PUBLIC_URL) { 23 + return { 24 + client_id: `${PUBLIC_URL}/oauth-client-metadata.json`, 25 + client_name: "bmoreToday", 26 + client_uri: PUBLIC_URL, 27 + dpop_bound_access_tokens: true, 28 + grant_types: ["authorization_code", "refresh_token"], 29 + jwks_uri: `${PUBLIC_URL}/.well-known/jwks.json`, 30 + redirect_uris: [`${PUBLIC_URL}/oauth/callback`], 31 + response_types: ["code"], 32 + scope: SCOPE, 33 + token_endpoint_auth_method: "private_key_jwt" as const, 34 + token_endpoint_auth_signing_alg: "ES256" as const 35 + }; 36 + } 37 + 38 + return buildAtprotoLoopbackClientMetadata({ 39 + redirect_uris: ["http://127.0.0.1:3000/oauth/callback"], 40 + scope: SCOPE 41 + }); 42 + }; 43 + 44 + const getKeyset = async () => { 45 + if (PUBLIC_URL && PRIVATE_KEY) { 46 + return new Keyset([await JoseKey.fromJWK(JSON.parse(PRIVATE_KEY))]); 47 + } 48 + 49 + return undefined; 50 + }; 51 + 52 + export const getOAuthClient = async () => { 53 + if (globalThis._oauthClient) { 54 + return globalThis._oauthClient; 55 + } 56 + 57 + globalThis._oauthClient = new NodeOAuthClient({ 58 + clientMetadata: getClientMetadata(), 59 + keyset: await getKeyset(), 60 + sessionStore: { 61 + del: async (key: string) => { 62 + const db = getDB(); 63 + 64 + await db 65 + ?.deleteFrom("auth_session") 66 + .where("key", "=", key) 67 + .execute(); 68 + }, 69 + get: async (key: string) => { 70 + const db = getDB(); 71 + const row = await db 72 + ?.selectFrom("auth_session") 73 + .select("value") 74 + .where("key", "=", key) 75 + .executeTakeFirst(); 76 + 77 + return row ? JSON.parse(row.value) : undefined; 78 + }, 79 + set: async (key: string, value: NodeSavedSession) => { 80 + const db = getDB(); 81 + const valueJSON = JSON.stringify(value); 82 + 83 + await db 84 + ?.insertInto("auth_session") 85 + .values({ key, value: valueJSON }) 86 + .onConflict((oc) => 87 + oc.column("key").doUpdateSet({ value: valueJSON }) 88 + ) 89 + .execute(); 90 + } 91 + }, 92 + stateStore: { 93 + del: async (key: string) => { 94 + const db = getDB(); 95 + 96 + await db 97 + ?.deleteFrom("auth_state") 98 + .where("key", "=", key) 99 + .execute(); 100 + }, 101 + get: async (key: string) => { 102 + const db = getDB(); 103 + const row = await db 104 + ?.selectFrom("auth_state") 105 + .select("value") 106 + .where("key", "=", key) 107 + .executeTakeFirst(); 108 + 109 + return row ? JSON.parse(row.value) : undefined; 110 + }, 111 + set: async (key: string, value: NodeSavedState) => { 112 + const db = getDB(); 113 + const valueJSON = JSON.stringify(value); 114 + 115 + await db 116 + ?.insertInto("auth_state") 117 + .values({ key, value: valueJSON }) 118 + .onConflict((oc) => 119 + oc.column("key").doUpdateSet({ value: valueJSON }) 120 + ) 121 + .execute(); 122 + } 123 + } 124 + }); 125 + 126 + return globalThis._oauthClient; 127 + };
+47
app/lib/db/index.ts
··· 1 + import Database from "better-sqlite3"; 2 + import { Kysely, SqliteDialect } from "kysely"; 3 + 4 + const DATABASE_PATH = process.env.DATABASE_PATH || "app.db"; 5 + 6 + let _db: Kysely<DatabaseSchema> | null = null; 7 + 8 + export const getDB = () => { 9 + if (!_db) { 10 + const sqlite = new Database(DATABASE_PATH); 11 + 12 + sqlite.pragma("journal_mode = WAL"); 13 + 14 + sqlite.exec(` 15 + CREATE TABLE IF NOT EXISTS auth_state ( 16 + key TEXT PRIMARY KEY, 17 + value TEXT NOT NULL 18 + ); 19 + 20 + CREATE TABLE IF NOT EXISTS auth_session ( 21 + key TEXT PRIMARY KEY, 22 + value TEXT NOT NULL 23 + ); 24 + `); 25 + 26 + _db = new Kysely<DatabaseSchema>({ 27 + dialect: new SqliteDialect({ database: sqlite }) 28 + }); 29 + } 30 + 31 + return _db; 32 + }; 33 + 34 + interface AuthSessionTable { 35 + key: string; 36 + value: string; 37 + } 38 + 39 + interface AuthStateTable { 40 + key: string; 41 + value: string; 42 + } 43 + 44 + export interface DatabaseSchema { 45 + auth_session: AuthSessionTable; 46 + auth_state: AuthStateTable; 47 + }
+2 -2
app/login/components/HandleInput.tsx
··· 64 64 setHandle(suggestion.handle); 65 65 }} 66 66 > 67 - <Image 67 + {suggestion.avatar ? <Image 68 68 alt={""} 69 69 className="aspect-square rounded-full" 70 70 height={40} 71 71 src={suggestion.avatar} 72 72 width={40} 73 - /> 73 + /> : <div className="bg-[#FF6A00] h-10 rounded-full w-10" />} 74 74 <div className="flex flex-col justify-center"> 75 75 <p className="text-sm"> 76 76 {suggestion.displayName}
+8
app/oauth-client-metadata.json/route.ts
··· 1 + import { getOAuthClient } from "../lib/auth/client/route"; 2 + import { NextResponse } from "next/server"; 3 + 4 + export const GET = async () => { 5 + const client = await getOAuthClient(); 6 + 7 + return NextResponse.json(client.clientMetadata); 8 + };
+33
app/oauth/callback/route.ts
··· 1 + import { getHandle } from "../../lib/atproto/profile"; 2 + import { getOAuthClient } from "../../lib/auth/client/route"; 3 + import { NextRequest, NextResponse } from "next/server"; 4 + 5 + const PUBLIC_URL = process.env.PUBLIC_URL || "http://127.0.0.1:3000"; 6 + 7 + export async function GET(request: NextRequest) { 8 + try { 9 + const params = request.nextUrl.searchParams; 10 + const client = await getOAuthClient(); 11 + const { session } = await client.callback(params); 12 + const handle = await getHandle(session); 13 + const response = NextResponse.redirect( 14 + new URL(`/`, PUBLIC_URL) 15 + ); 16 + 17 + response.cookies.set("did", session.did, { 18 + httpOnly: true, 19 + maxAge: 60 * 60 * 24 * 7, 20 + path: "/", 21 + sameSite: "lax", 22 + secure: process.env.NODE_ENV === "production" 23 + }); 24 + 25 + return response; 26 + } catch (error) { 27 + console.error("OAuth callback error:", error); 28 + 29 + return NextResponse.redirect( 30 + new URL("/?error=login_failed", PUBLIC_URL) 31 + ); 32 + } 33 + }
+29
app/oauth/login/route.ts
··· 1 + import { getOAuthClient, SCOPE } from "../../lib/auth/client/route" 2 + import { NextRequest, NextResponse } from "next/server"; 3 + 4 + export const POST = async (request: NextRequest) => { 5 + try { 6 + const { handle } = await request.json(); 7 + 8 + if (!handle || typeof handle !== "string") { 9 + return NextResponse.json( 10 + { error: "Handle is required" }, 11 + { status: 400 } 12 + ); 13 + } 14 + 15 + const client = await getOAuthClient(); 16 + const authURL = await client?.authorize(handle, { scope: SCOPE }); 17 + 18 + return NextResponse.json({ redirectURL: authURL?.toString() }); 19 + } catch (error) { 20 + console.error("OAuth login error:", error); 21 + 22 + return NextResponse.json( 23 + { 24 + error: error instanceof Error ? error.message : "Login failed" 25 + }, 26 + { status: 500 } 27 + ); 28 + } 29 + };
+9
app/scripts/gen-key.ts
··· 1 + import { JoseKey } from "@atproto/oauth-client-node"; 2 + 3 + async function main() { 4 + const kid = Date.now().toString(); 5 + const key = await JoseKey.generate(["ES256"], kid); 6 + console.log(JSON.stringify(key.privateJwk)); 7 + } 8 + 9 + main();
+1244 -5
package-lock.json
··· 9 9 "version": "0.1.0", 10 10 "dependencies": { 11 11 "@atproto/api": "^0.19.0", 12 + "@atproto/oauth-client-node": "^0.3.17", 13 + "better-sqlite3": "^12.6.2", 14 + "kysely": "^0.28.11", 12 15 "luxon": "^3.7.2", 13 16 "next": "16.1.6", 14 17 "react": "19.2.3", 15 18 "react-dom": "19.2.3", 16 - "react-icons": "^5.5.0" 19 + "react-icons": "^5.5.0", 20 + "tsx": "^4.21.0" 17 21 }, 18 22 "devDependencies": { 19 23 "@tailwindcss/postcss": "^4", 24 + "@types/better-sqlite3": "^7.6.13", 20 25 "@types/luxon": "^3.7.1", 21 26 "@types/node": "^20", 22 27 "@types/react": "^19", ··· 40 45 "url": "https://github.com/sponsors/sindresorhus" 41 46 } 42 47 }, 48 + "node_modules/@atproto-labs/did-resolver": { 49 + "version": "0.2.6", 50 + "resolved": "https://registry.npmjs.org/@atproto-labs/did-resolver/-/did-resolver-0.2.6.tgz", 51 + "integrity": "sha512-2K1bC04nI2fmgNcvof+yA28IhGlpWn2JKYlPa7To9JTKI45FINCGkQSGiL2nyXlyzDJJ34fZ1aq6/IRFIOIiqg==", 52 + "license": "MIT", 53 + "dependencies": { 54 + "@atproto-labs/fetch": "0.2.3", 55 + "@atproto-labs/pipe": "0.1.1", 56 + "@atproto-labs/simple-store": "0.3.0", 57 + "@atproto-labs/simple-store-memory": "0.1.4", 58 + "@atproto/did": "0.3.0", 59 + "zod": "^3.23.8" 60 + } 61 + }, 62 + "node_modules/@atproto-labs/did-resolver/node_modules/zod": { 63 + "version": "3.25.76", 64 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 65 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 66 + "license": "MIT", 67 + "funding": { 68 + "url": "https://github.com/sponsors/colinhacks" 69 + } 70 + }, 71 + "node_modules/@atproto-labs/fetch": { 72 + "version": "0.2.3", 73 + "resolved": "https://registry.npmjs.org/@atproto-labs/fetch/-/fetch-0.2.3.tgz", 74 + "integrity": "sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw==", 75 + "license": "MIT", 76 + "dependencies": { 77 + "@atproto-labs/pipe": "0.1.1" 78 + } 79 + }, 80 + "node_modules/@atproto-labs/fetch-node": { 81 + "version": "0.2.0", 82 + "resolved": "https://registry.npmjs.org/@atproto-labs/fetch-node/-/fetch-node-0.2.0.tgz", 83 + "integrity": "sha512-Krq09nH/aeoiU2s9xdHA0FjTEFWG9B5FFenipv1iRixCcPc7V3DhTNDawxG9gI8Ny0k4dBVS9WTRN/IDzBx86Q==", 84 + "license": "MIT", 85 + "dependencies": { 86 + "@atproto-labs/fetch": "0.2.3", 87 + "@atproto-labs/pipe": "0.1.1", 88 + "ipaddr.js": "^2.1.0", 89 + "undici": "^6.14.1" 90 + }, 91 + "engines": { 92 + "node": ">=18.7.0" 93 + } 94 + }, 95 + "node_modules/@atproto-labs/handle-resolver": { 96 + "version": "0.3.6", 97 + "resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver/-/handle-resolver-0.3.6.tgz", 98 + "integrity": "sha512-qnSTXvOBNj1EHhp2qTWSX8MS5q3AwYU5LKlt5fBvSbCjgmTr2j0URHCv+ydrwO55KvsojIkTMgeMOh4YuY4fCA==", 99 + "license": "MIT", 100 + "dependencies": { 101 + "@atproto-labs/simple-store": "0.3.0", 102 + "@atproto-labs/simple-store-memory": "0.1.4", 103 + "@atproto/did": "0.3.0", 104 + "zod": "^3.23.8" 105 + } 106 + }, 107 + "node_modules/@atproto-labs/handle-resolver-node": { 108 + "version": "0.1.25", 109 + "resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver-node/-/handle-resolver-node-0.1.25.tgz", 110 + "integrity": "sha512-NY9WYM2VLd3IuMGRkkmvGBg8xqVEaK/fitv1vD8SMXqFTekdpjOLCCyv7EFtqVHouzmDcL83VOvWRfHVa8V9Yw==", 111 + "license": "MIT", 112 + "dependencies": { 113 + "@atproto-labs/fetch-node": "0.2.0", 114 + "@atproto-labs/handle-resolver": "0.3.6", 115 + "@atproto/did": "0.3.0" 116 + }, 117 + "engines": { 118 + "node": ">=18.7.0" 119 + } 120 + }, 121 + "node_modules/@atproto-labs/handle-resolver/node_modules/zod": { 122 + "version": "3.25.76", 123 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 124 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 125 + "license": "MIT", 126 + "funding": { 127 + "url": "https://github.com/sponsors/colinhacks" 128 + } 129 + }, 130 + "node_modules/@atproto-labs/identity-resolver": { 131 + "version": "0.3.6", 132 + "resolved": "https://registry.npmjs.org/@atproto-labs/identity-resolver/-/identity-resolver-0.3.6.tgz", 133 + "integrity": "sha512-qoWqBDRobln0NR8L8dQjSp79E0chGkBhibEgxQa2f9WD+JbJdjQ0YvwwO5yeQn05pJoJmAwmI2wyJ45zjU7aWg==", 134 + "license": "MIT", 135 + "dependencies": { 136 + "@atproto-labs/did-resolver": "0.2.6", 137 + "@atproto-labs/handle-resolver": "0.3.6" 138 + } 139 + }, 140 + "node_modules/@atproto-labs/pipe": { 141 + "version": "0.1.1", 142 + "resolved": "https://registry.npmjs.org/@atproto-labs/pipe/-/pipe-0.1.1.tgz", 143 + "integrity": "sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg==", 144 + "license": "MIT" 145 + }, 146 + "node_modules/@atproto-labs/simple-store": { 147 + "version": "0.3.0", 148 + "resolved": "https://registry.npmjs.org/@atproto-labs/simple-store/-/simple-store-0.3.0.tgz", 149 + "integrity": "sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ==", 150 + "license": "MIT" 151 + }, 152 + "node_modules/@atproto-labs/simple-store-memory": { 153 + "version": "0.1.4", 154 + "resolved": "https://registry.npmjs.org/@atproto-labs/simple-store-memory/-/simple-store-memory-0.1.4.tgz", 155 + "integrity": "sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw==", 156 + "license": "MIT", 157 + "dependencies": { 158 + "@atproto-labs/simple-store": "0.3.0", 159 + "lru-cache": "^10.2.0" 160 + } 161 + }, 162 + "node_modules/@atproto-labs/simple-store-memory/node_modules/lru-cache": { 163 + "version": "10.4.3", 164 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 165 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 166 + "license": "ISC" 167 + }, 43 168 "node_modules/@atproto/api": { 44 169 "version": "0.19.0", 45 170 "resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.19.0.tgz", ··· 86 211 "url": "https://github.com/sponsors/colinhacks" 87 212 } 88 213 }, 214 + "node_modules/@atproto/did": { 215 + "version": "0.3.0", 216 + "resolved": "https://registry.npmjs.org/@atproto/did/-/did-0.3.0.tgz", 217 + "integrity": "sha512-raUPzUGegtW/6OxwCmM8bhZvuIMzxG5t9oWsth6Tp91Kb5fTnHV2h/KKNF1C82doeA4BdXCErTyg7ISwLbQkzA==", 218 + "license": "MIT", 219 + "dependencies": { 220 + "zod": "^3.23.8" 221 + } 222 + }, 223 + "node_modules/@atproto/did/node_modules/zod": { 224 + "version": "3.25.76", 225 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 226 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 227 + "license": "MIT", 228 + "funding": { 229 + "url": "https://github.com/sponsors/colinhacks" 230 + } 231 + }, 232 + "node_modules/@atproto/jwk": { 233 + "version": "0.6.0", 234 + "resolved": "https://registry.npmjs.org/@atproto/jwk/-/jwk-0.6.0.tgz", 235 + "integrity": "sha512-bDoJPvt7TrQVi/rBfBrSSpGykhtIriKxeYCYQTiPRKFfyRhbgpElF0wPXADjIswnbzZdOwbY63az4E/CFVT3Tw==", 236 + "license": "MIT", 237 + "dependencies": { 238 + "multiformats": "^9.9.0", 239 + "zod": "^3.23.8" 240 + } 241 + }, 242 + "node_modules/@atproto/jwk-jose": { 243 + "version": "0.1.11", 244 + "resolved": "https://registry.npmjs.org/@atproto/jwk-jose/-/jwk-jose-0.1.11.tgz", 245 + "integrity": "sha512-i4Fnr2sTBYmMmHXl7NJh8GrCH+tDQEVWrcDMDnV5DjJfkgT17wIqvojIw9SNbSL4Uf0OtfEv6AgG0A+mgh8b5Q==", 246 + "license": "MIT", 247 + "dependencies": { 248 + "@atproto/jwk": "0.6.0", 249 + "jose": "^5.2.0" 250 + } 251 + }, 252 + "node_modules/@atproto/jwk-webcrypto": { 253 + "version": "0.2.0", 254 + "resolved": "https://registry.npmjs.org/@atproto/jwk-webcrypto/-/jwk-webcrypto-0.2.0.tgz", 255 + "integrity": "sha512-UmgRrrEAkWvxwhlwe30UmDOdTEFidlIzBC7C3cCbeJMcBN1x8B3KH+crXrsTqfWQBG58mXgt8wgSK3Kxs2LhFg==", 256 + "license": "MIT", 257 + "dependencies": { 258 + "@atproto/jwk": "0.6.0", 259 + "@atproto/jwk-jose": "0.1.11", 260 + "zod": "^3.23.8" 261 + } 262 + }, 263 + "node_modules/@atproto/jwk-webcrypto/node_modules/zod": { 264 + "version": "3.25.76", 265 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 266 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 267 + "license": "MIT", 268 + "funding": { 269 + "url": "https://github.com/sponsors/colinhacks" 270 + } 271 + }, 272 + "node_modules/@atproto/jwk/node_modules/zod": { 273 + "version": "3.25.76", 274 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 275 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 276 + "license": "MIT", 277 + "funding": { 278 + "url": "https://github.com/sponsors/colinhacks" 279 + } 280 + }, 89 281 "node_modules/@atproto/lex-data": { 90 282 "version": "0.0.12", 91 283 "resolved": "https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.12.tgz", ··· 122 314 } 123 315 }, 124 316 "node_modules/@atproto/lexicon/node_modules/zod": { 317 + "version": "3.25.76", 318 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 319 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 320 + "license": "MIT", 321 + "funding": { 322 + "url": "https://github.com/sponsors/colinhacks" 323 + } 324 + }, 325 + "node_modules/@atproto/oauth-client": { 326 + "version": "0.6.0", 327 + "resolved": "https://registry.npmjs.org/@atproto/oauth-client/-/oauth-client-0.6.0.tgz", 328 + "integrity": "sha512-F7ZTKzFptXgyihMkd7QTdRSkrh4XqrS+qTw+V81k5Q6Bh3MB1L3ypvfSJ6v7SSUJa6XxoZYJTCahHC1e+ndE6Q==", 329 + "license": "MIT", 330 + "dependencies": { 331 + "@atproto-labs/did-resolver": "^0.2.6", 332 + "@atproto-labs/fetch": "^0.2.3", 333 + "@atproto-labs/handle-resolver": "^0.3.6", 334 + "@atproto-labs/identity-resolver": "^0.3.6", 335 + "@atproto-labs/simple-store": "^0.3.0", 336 + "@atproto-labs/simple-store-memory": "^0.1.4", 337 + "@atproto/did": "^0.3.0", 338 + "@atproto/jwk": "^0.6.0", 339 + "@atproto/oauth-types": "^0.6.3", 340 + "@atproto/xrpc": "^0.7.7", 341 + "core-js": "^3", 342 + "multiformats": "^9.9.0", 343 + "zod": "^3.23.8" 344 + } 345 + }, 346 + "node_modules/@atproto/oauth-client-node": { 347 + "version": "0.3.17", 348 + "resolved": "https://registry.npmjs.org/@atproto/oauth-client-node/-/oauth-client-node-0.3.17.tgz", 349 + "integrity": "sha512-67LNuKAlC35Exe7CB5S0QCAnEqr6fKV9Nvp64jAHFof1N+Vc9Ltt1K9oekE5Ctf7dvpGByrHRF0noUw9l9sWLA==", 350 + "license": "MIT", 351 + "dependencies": { 352 + "@atproto-labs/did-resolver": "^0.2.6", 353 + "@atproto-labs/handle-resolver-node": "^0.1.25", 354 + "@atproto-labs/simple-store": "^0.3.0", 355 + "@atproto/did": "^0.3.0", 356 + "@atproto/jwk": "^0.6.0", 357 + "@atproto/jwk-jose": "^0.1.11", 358 + "@atproto/jwk-webcrypto": "^0.2.0", 359 + "@atproto/oauth-client": "^0.6.0", 360 + "@atproto/oauth-types": "^0.6.3" 361 + }, 362 + "engines": { 363 + "node": ">=18.7.0" 364 + } 365 + }, 366 + "node_modules/@atproto/oauth-client/node_modules/zod": { 367 + "version": "3.25.76", 368 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 369 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 370 + "license": "MIT", 371 + "funding": { 372 + "url": "https://github.com/sponsors/colinhacks" 373 + } 374 + }, 375 + "node_modules/@atproto/oauth-types": { 376 + "version": "0.6.3", 377 + "resolved": "https://registry.npmjs.org/@atproto/oauth-types/-/oauth-types-0.6.3.tgz", 378 + "integrity": "sha512-jdKuoPknJuh/WjI+mYk7agSbx9mNVMbS6Dr3k1z2YMY2oRiCQjxYBuo4MLKATbxj05nMQaZRWlHRUazoAu5Cng==", 379 + "license": "MIT", 380 + "dependencies": { 381 + "@atproto/did": "^0.3.0", 382 + "@atproto/jwk": "^0.6.0", 383 + "zod": "^3.23.8" 384 + } 385 + }, 386 + "node_modules/@atproto/oauth-types/node_modules/zod": { 125 387 "version": "3.25.76", 126 388 "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 127 389 "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", ··· 431 693 "tslib": "^2.4.0" 432 694 } 433 695 }, 696 + "node_modules/@esbuild/aix-ppc64": { 697 + "version": "0.27.3", 698 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", 699 + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", 700 + "cpu": [ 701 + "ppc64" 702 + ], 703 + "license": "MIT", 704 + "optional": true, 705 + "os": [ 706 + "aix" 707 + ], 708 + "engines": { 709 + "node": ">=18" 710 + } 711 + }, 712 + "node_modules/@esbuild/android-arm": { 713 + "version": "0.27.3", 714 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", 715 + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", 716 + "cpu": [ 717 + "arm" 718 + ], 719 + "license": "MIT", 720 + "optional": true, 721 + "os": [ 722 + "android" 723 + ], 724 + "engines": { 725 + "node": ">=18" 726 + } 727 + }, 728 + "node_modules/@esbuild/android-arm64": { 729 + "version": "0.27.3", 730 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", 731 + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", 732 + "cpu": [ 733 + "arm64" 734 + ], 735 + "license": "MIT", 736 + "optional": true, 737 + "os": [ 738 + "android" 739 + ], 740 + "engines": { 741 + "node": ">=18" 742 + } 743 + }, 744 + "node_modules/@esbuild/android-x64": { 745 + "version": "0.27.3", 746 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", 747 + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", 748 + "cpu": [ 749 + "x64" 750 + ], 751 + "license": "MIT", 752 + "optional": true, 753 + "os": [ 754 + "android" 755 + ], 756 + "engines": { 757 + "node": ">=18" 758 + } 759 + }, 760 + "node_modules/@esbuild/darwin-arm64": { 761 + "version": "0.27.3", 762 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", 763 + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", 764 + "cpu": [ 765 + "arm64" 766 + ], 767 + "license": "MIT", 768 + "optional": true, 769 + "os": [ 770 + "darwin" 771 + ], 772 + "engines": { 773 + "node": ">=18" 774 + } 775 + }, 776 + "node_modules/@esbuild/darwin-x64": { 777 + "version": "0.27.3", 778 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", 779 + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", 780 + "cpu": [ 781 + "x64" 782 + ], 783 + "license": "MIT", 784 + "optional": true, 785 + "os": [ 786 + "darwin" 787 + ], 788 + "engines": { 789 + "node": ">=18" 790 + } 791 + }, 792 + "node_modules/@esbuild/freebsd-arm64": { 793 + "version": "0.27.3", 794 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", 795 + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", 796 + "cpu": [ 797 + "arm64" 798 + ], 799 + "license": "MIT", 800 + "optional": true, 801 + "os": [ 802 + "freebsd" 803 + ], 804 + "engines": { 805 + "node": ">=18" 806 + } 807 + }, 808 + "node_modules/@esbuild/freebsd-x64": { 809 + "version": "0.27.3", 810 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", 811 + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", 812 + "cpu": [ 813 + "x64" 814 + ], 815 + "license": "MIT", 816 + "optional": true, 817 + "os": [ 818 + "freebsd" 819 + ], 820 + "engines": { 821 + "node": ">=18" 822 + } 823 + }, 824 + "node_modules/@esbuild/linux-arm": { 825 + "version": "0.27.3", 826 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", 827 + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", 828 + "cpu": [ 829 + "arm" 830 + ], 831 + "license": "MIT", 832 + "optional": true, 833 + "os": [ 834 + "linux" 835 + ], 836 + "engines": { 837 + "node": ">=18" 838 + } 839 + }, 840 + "node_modules/@esbuild/linux-arm64": { 841 + "version": "0.27.3", 842 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", 843 + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", 844 + "cpu": [ 845 + "arm64" 846 + ], 847 + "license": "MIT", 848 + "optional": true, 849 + "os": [ 850 + "linux" 851 + ], 852 + "engines": { 853 + "node": ">=18" 854 + } 855 + }, 856 + "node_modules/@esbuild/linux-ia32": { 857 + "version": "0.27.3", 858 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", 859 + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", 860 + "cpu": [ 861 + "ia32" 862 + ], 863 + "license": "MIT", 864 + "optional": true, 865 + "os": [ 866 + "linux" 867 + ], 868 + "engines": { 869 + "node": ">=18" 870 + } 871 + }, 872 + "node_modules/@esbuild/linux-loong64": { 873 + "version": "0.27.3", 874 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", 875 + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", 876 + "cpu": [ 877 + "loong64" 878 + ], 879 + "license": "MIT", 880 + "optional": true, 881 + "os": [ 882 + "linux" 883 + ], 884 + "engines": { 885 + "node": ">=18" 886 + } 887 + }, 888 + "node_modules/@esbuild/linux-mips64el": { 889 + "version": "0.27.3", 890 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", 891 + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", 892 + "cpu": [ 893 + "mips64el" 894 + ], 895 + "license": "MIT", 896 + "optional": true, 897 + "os": [ 898 + "linux" 899 + ], 900 + "engines": { 901 + "node": ">=18" 902 + } 903 + }, 904 + "node_modules/@esbuild/linux-ppc64": { 905 + "version": "0.27.3", 906 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", 907 + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", 908 + "cpu": [ 909 + "ppc64" 910 + ], 911 + "license": "MIT", 912 + "optional": true, 913 + "os": [ 914 + "linux" 915 + ], 916 + "engines": { 917 + "node": ">=18" 918 + } 919 + }, 920 + "node_modules/@esbuild/linux-riscv64": { 921 + "version": "0.27.3", 922 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", 923 + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", 924 + "cpu": [ 925 + "riscv64" 926 + ], 927 + "license": "MIT", 928 + "optional": true, 929 + "os": [ 930 + "linux" 931 + ], 932 + "engines": { 933 + "node": ">=18" 934 + } 935 + }, 936 + "node_modules/@esbuild/linux-s390x": { 937 + "version": "0.27.3", 938 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", 939 + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", 940 + "cpu": [ 941 + "s390x" 942 + ], 943 + "license": "MIT", 944 + "optional": true, 945 + "os": [ 946 + "linux" 947 + ], 948 + "engines": { 949 + "node": ">=18" 950 + } 951 + }, 952 + "node_modules/@esbuild/linux-x64": { 953 + "version": "0.27.3", 954 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", 955 + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", 956 + "cpu": [ 957 + "x64" 958 + ], 959 + "license": "MIT", 960 + "optional": true, 961 + "os": [ 962 + "linux" 963 + ], 964 + "engines": { 965 + "node": ">=18" 966 + } 967 + }, 968 + "node_modules/@esbuild/netbsd-arm64": { 969 + "version": "0.27.3", 970 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", 971 + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", 972 + "cpu": [ 973 + "arm64" 974 + ], 975 + "license": "MIT", 976 + "optional": true, 977 + "os": [ 978 + "netbsd" 979 + ], 980 + "engines": { 981 + "node": ">=18" 982 + } 983 + }, 984 + "node_modules/@esbuild/netbsd-x64": { 985 + "version": "0.27.3", 986 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", 987 + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", 988 + "cpu": [ 989 + "x64" 990 + ], 991 + "license": "MIT", 992 + "optional": true, 993 + "os": [ 994 + "netbsd" 995 + ], 996 + "engines": { 997 + "node": ">=18" 998 + } 999 + }, 1000 + "node_modules/@esbuild/openbsd-arm64": { 1001 + "version": "0.27.3", 1002 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", 1003 + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", 1004 + "cpu": [ 1005 + "arm64" 1006 + ], 1007 + "license": "MIT", 1008 + "optional": true, 1009 + "os": [ 1010 + "openbsd" 1011 + ], 1012 + "engines": { 1013 + "node": ">=18" 1014 + } 1015 + }, 1016 + "node_modules/@esbuild/openbsd-x64": { 1017 + "version": "0.27.3", 1018 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", 1019 + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", 1020 + "cpu": [ 1021 + "x64" 1022 + ], 1023 + "license": "MIT", 1024 + "optional": true, 1025 + "os": [ 1026 + "openbsd" 1027 + ], 1028 + "engines": { 1029 + "node": ">=18" 1030 + } 1031 + }, 1032 + "node_modules/@esbuild/openharmony-arm64": { 1033 + "version": "0.27.3", 1034 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", 1035 + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", 1036 + "cpu": [ 1037 + "arm64" 1038 + ], 1039 + "license": "MIT", 1040 + "optional": true, 1041 + "os": [ 1042 + "openharmony" 1043 + ], 1044 + "engines": { 1045 + "node": ">=18" 1046 + } 1047 + }, 1048 + "node_modules/@esbuild/sunos-x64": { 1049 + "version": "0.27.3", 1050 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", 1051 + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", 1052 + "cpu": [ 1053 + "x64" 1054 + ], 1055 + "license": "MIT", 1056 + "optional": true, 1057 + "os": [ 1058 + "sunos" 1059 + ], 1060 + "engines": { 1061 + "node": ">=18" 1062 + } 1063 + }, 1064 + "node_modules/@esbuild/win32-arm64": { 1065 + "version": "0.27.3", 1066 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", 1067 + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", 1068 + "cpu": [ 1069 + "arm64" 1070 + ], 1071 + "license": "MIT", 1072 + "optional": true, 1073 + "os": [ 1074 + "win32" 1075 + ], 1076 + "engines": { 1077 + "node": ">=18" 1078 + } 1079 + }, 1080 + "node_modules/@esbuild/win32-ia32": { 1081 + "version": "0.27.3", 1082 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", 1083 + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", 1084 + "cpu": [ 1085 + "ia32" 1086 + ], 1087 + "license": "MIT", 1088 + "optional": true, 1089 + "os": [ 1090 + "win32" 1091 + ], 1092 + "engines": { 1093 + "node": ">=18" 1094 + } 1095 + }, 1096 + "node_modules/@esbuild/win32-x64": { 1097 + "version": "0.27.3", 1098 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", 1099 + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", 1100 + "cpu": [ 1101 + "x64" 1102 + ], 1103 + "license": "MIT", 1104 + "optional": true, 1105 + "os": [ 1106 + "win32" 1107 + ], 1108 + "engines": { 1109 + "node": ">=18" 1110 + } 1111 + }, 434 1112 "node_modules/@eslint-community/eslint-utils": { 435 1113 "version": "4.9.1", 436 1114 "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", ··· 1646 2324 "tslib": "^2.4.0" 1647 2325 } 1648 2326 }, 2327 + "node_modules/@types/better-sqlite3": { 2328 + "version": "7.6.13", 2329 + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", 2330 + "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", 2331 + "dev": true, 2332 + "license": "MIT", 2333 + "dependencies": { 2334 + "@types/node": "*" 2335 + } 2336 + }, 1649 2337 "node_modules/@types/estree": { 1650 2338 "version": "1.0.8", 1651 2339 "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", ··· 2567 3255 "dev": true, 2568 3256 "license": "MIT" 2569 3257 }, 3258 + "node_modules/base64-js": { 3259 + "version": "1.5.1", 3260 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 3261 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 3262 + "funding": [ 3263 + { 3264 + "type": "github", 3265 + "url": "https://github.com/sponsors/feross" 3266 + }, 3267 + { 3268 + "type": "patreon", 3269 + "url": "https://www.patreon.com/feross" 3270 + }, 3271 + { 3272 + "type": "consulting", 3273 + "url": "https://feross.org/support" 3274 + } 3275 + ], 3276 + "license": "MIT" 3277 + }, 2570 3278 "node_modules/baseline-browser-mapping": { 2571 3279 "version": "2.10.0", 2572 3280 "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", ··· 2579 3287 "node": ">=6.0.0" 2580 3288 } 2581 3289 }, 3290 + "node_modules/better-sqlite3": { 3291 + "version": "12.6.2", 3292 + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.6.2.tgz", 3293 + "integrity": "sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==", 3294 + "hasInstallScript": true, 3295 + "license": "MIT", 3296 + "dependencies": { 3297 + "bindings": "^1.5.0", 3298 + "prebuild-install": "^7.1.1" 3299 + }, 3300 + "engines": { 3301 + "node": "20.x || 22.x || 23.x || 24.x || 25.x" 3302 + } 3303 + }, 3304 + "node_modules/bindings": { 3305 + "version": "1.5.0", 3306 + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 3307 + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 3308 + "license": "MIT", 3309 + "dependencies": { 3310 + "file-uri-to-path": "1.0.0" 3311 + } 3312 + }, 3313 + "node_modules/bl": { 3314 + "version": "4.1.0", 3315 + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 3316 + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 3317 + "license": "MIT", 3318 + "dependencies": { 3319 + "buffer": "^5.5.0", 3320 + "inherits": "^2.0.4", 3321 + "readable-stream": "^3.4.0" 3322 + } 3323 + }, 2582 3324 "node_modules/brace-expansion": { 2583 3325 "version": "1.1.12", 2584 3326 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", ··· 2637 3379 "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 2638 3380 } 2639 3381 }, 3382 + "node_modules/buffer": { 3383 + "version": "5.7.1", 3384 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 3385 + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 3386 + "funding": [ 3387 + { 3388 + "type": "github", 3389 + "url": "https://github.com/sponsors/feross" 3390 + }, 3391 + { 3392 + "type": "patreon", 3393 + "url": "https://www.patreon.com/feross" 3394 + }, 3395 + { 3396 + "type": "consulting", 3397 + "url": "https://feross.org/support" 3398 + } 3399 + ], 3400 + "license": "MIT", 3401 + "dependencies": { 3402 + "base64-js": "^1.3.1", 3403 + "ieee754": "^1.1.13" 3404 + } 3405 + }, 2640 3406 "node_modules/call-bind": { 2641 3407 "version": "1.0.8", 2642 3408 "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", ··· 2734 3500 "url": "https://github.com/chalk/chalk?sponsor=1" 2735 3501 } 2736 3502 }, 3503 + "node_modules/chownr": { 3504 + "version": "1.1.4", 3505 + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 3506 + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 3507 + "license": "ISC" 3508 + }, 2737 3509 "node_modules/client-only": { 2738 3510 "version": "0.0.1", 2739 3511 "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", ··· 2774 3546 "dev": true, 2775 3547 "license": "MIT" 2776 3548 }, 3549 + "node_modules/core-js": { 3550 + "version": "3.48.0", 3551 + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", 3552 + "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", 3553 + "hasInstallScript": true, 3554 + "license": "MIT", 3555 + "funding": { 3556 + "type": "opencollective", 3557 + "url": "https://opencollective.com/core-js" 3558 + } 3559 + }, 2777 3560 "node_modules/cross-spawn": { 2778 3561 "version": "7.0.6", 2779 3562 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", ··· 2875 3658 } 2876 3659 } 2877 3660 }, 3661 + "node_modules/decompress-response": { 3662 + "version": "6.0.0", 3663 + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 3664 + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 3665 + "license": "MIT", 3666 + "dependencies": { 3667 + "mimic-response": "^3.1.0" 3668 + }, 3669 + "engines": { 3670 + "node": ">=10" 3671 + }, 3672 + "funding": { 3673 + "url": "https://github.com/sponsors/sindresorhus" 3674 + } 3675 + }, 3676 + "node_modules/deep-extend": { 3677 + "version": "0.6.0", 3678 + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 3679 + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 3680 + "license": "MIT", 3681 + "engines": { 3682 + "node": ">=4.0.0" 3683 + } 3684 + }, 2878 3685 "node_modules/deep-is": { 2879 3686 "version": "0.1.4", 2880 3687 "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", ··· 2922 3729 "version": "2.1.2", 2923 3730 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", 2924 3731 "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", 2925 - "devOptional": true, 2926 3732 "license": "Apache-2.0", 2927 3733 "engines": { 2928 3734 "node": ">=8" ··· 2969 3775 "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 2970 3776 "dev": true, 2971 3777 "license": "MIT" 3778 + }, 3779 + "node_modules/end-of-stream": { 3780 + "version": "1.4.5", 3781 + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", 3782 + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", 3783 + "license": "MIT", 3784 + "dependencies": { 3785 + "once": "^1.4.0" 3786 + } 2972 3787 }, 2973 3788 "node_modules/enhanced-resolve": { 2974 3789 "version": "5.19.0", ··· 3161 3976 "url": "https://github.com/sponsors/ljharb" 3162 3977 } 3163 3978 }, 3979 + "node_modules/esbuild": { 3980 + "version": "0.27.3", 3981 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", 3982 + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", 3983 + "hasInstallScript": true, 3984 + "license": "MIT", 3985 + "bin": { 3986 + "esbuild": "bin/esbuild" 3987 + }, 3988 + "engines": { 3989 + "node": ">=18" 3990 + }, 3991 + "optionalDependencies": { 3992 + "@esbuild/aix-ppc64": "0.27.3", 3993 + "@esbuild/android-arm": "0.27.3", 3994 + "@esbuild/android-arm64": "0.27.3", 3995 + "@esbuild/android-x64": "0.27.3", 3996 + "@esbuild/darwin-arm64": "0.27.3", 3997 + "@esbuild/darwin-x64": "0.27.3", 3998 + "@esbuild/freebsd-arm64": "0.27.3", 3999 + "@esbuild/freebsd-x64": "0.27.3", 4000 + "@esbuild/linux-arm": "0.27.3", 4001 + "@esbuild/linux-arm64": "0.27.3", 4002 + "@esbuild/linux-ia32": "0.27.3", 4003 + "@esbuild/linux-loong64": "0.27.3", 4004 + "@esbuild/linux-mips64el": "0.27.3", 4005 + "@esbuild/linux-ppc64": "0.27.3", 4006 + "@esbuild/linux-riscv64": "0.27.3", 4007 + "@esbuild/linux-s390x": "0.27.3", 4008 + "@esbuild/linux-x64": "0.27.3", 4009 + "@esbuild/netbsd-arm64": "0.27.3", 4010 + "@esbuild/netbsd-x64": "0.27.3", 4011 + "@esbuild/openbsd-arm64": "0.27.3", 4012 + "@esbuild/openbsd-x64": "0.27.3", 4013 + "@esbuild/openharmony-arm64": "0.27.3", 4014 + "@esbuild/sunos-x64": "0.27.3", 4015 + "@esbuild/win32-arm64": "0.27.3", 4016 + "@esbuild/win32-ia32": "0.27.3", 4017 + "@esbuild/win32-x64": "0.27.3" 4018 + } 4019 + }, 3164 4020 "node_modules/escalade": { 3165 4021 "version": "3.2.0", 3166 4022 "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", ··· 3614 4470 "node": ">=0.10.0" 3615 4471 } 3616 4472 }, 4473 + "node_modules/expand-template": { 4474 + "version": "2.0.3", 4475 + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 4476 + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 4477 + "license": "(MIT OR WTFPL)", 4478 + "engines": { 4479 + "node": ">=6" 4480 + } 4481 + }, 3617 4482 "node_modules/fast-deep-equal": { 3618 4483 "version": "3.1.3", 3619 4484 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", ··· 3688 4553 "node": ">=16.0.0" 3689 4554 } 3690 4555 }, 4556 + "node_modules/file-uri-to-path": { 4557 + "version": "1.0.0", 4558 + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 4559 + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", 4560 + "license": "MIT" 4561 + }, 3691 4562 "node_modules/fill-range": { 3692 4563 "version": "7.1.1", 3693 4564 "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", ··· 3755 4626 "url": "https://github.com/sponsors/ljharb" 3756 4627 } 3757 4628 }, 4629 + "node_modules/fs-constants": { 4630 + "version": "1.0.0", 4631 + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 4632 + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 4633 + "license": "MIT" 4634 + }, 4635 + "node_modules/fsevents": { 4636 + "version": "2.3.3", 4637 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 4638 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 4639 + "hasInstallScript": true, 4640 + "license": "MIT", 4641 + "optional": true, 4642 + "os": [ 4643 + "darwin" 4644 + ], 4645 + "engines": { 4646 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 4647 + } 4648 + }, 3758 4649 "node_modules/function-bind": { 3759 4650 "version": "1.1.2", 3760 4651 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", ··· 3877 4768 "version": "4.13.6", 3878 4769 "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", 3879 4770 "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", 3880 - "dev": true, 3881 4771 "license": "MIT", 3882 4772 "dependencies": { 3883 4773 "resolve-pkg-maps": "^1.0.0" ··· 3886 4776 "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 3887 4777 } 3888 4778 }, 4779 + "node_modules/github-from-package": { 4780 + "version": "0.0.0", 4781 + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 4782 + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", 4783 + "license": "MIT" 4784 + }, 3889 4785 "node_modules/glob-parent": { 3890 4786 "version": "6.0.2", 3891 4787 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", ··· 4060 4956 "hermes-estree": "0.25.1" 4061 4957 } 4062 4958 }, 4959 + "node_modules/ieee754": { 4960 + "version": "1.2.1", 4961 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 4962 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 4963 + "funding": [ 4964 + { 4965 + "type": "github", 4966 + "url": "https://github.com/sponsors/feross" 4967 + }, 4968 + { 4969 + "type": "patreon", 4970 + "url": "https://www.patreon.com/feross" 4971 + }, 4972 + { 4973 + "type": "consulting", 4974 + "url": "https://feross.org/support" 4975 + } 4976 + ], 4977 + "license": "BSD-3-Clause" 4978 + }, 4063 4979 "node_modules/ignore": { 4064 4980 "version": "5.3.2", 4065 4981 "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", ··· 4097 5013 "node": ">=0.8.19" 4098 5014 } 4099 5015 }, 5016 + "node_modules/inherits": { 5017 + "version": "2.0.4", 5018 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 5019 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 5020 + "license": "ISC" 5021 + }, 5022 + "node_modules/ini": { 5023 + "version": "1.3.8", 5024 + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 5025 + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 5026 + "license": "ISC" 5027 + }, 4100 5028 "node_modules/internal-slot": { 4101 5029 "version": "1.1.0", 4102 5030 "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", ··· 4112 5040 "node": ">= 0.4" 4113 5041 } 4114 5042 }, 5043 + "node_modules/ipaddr.js": { 5044 + "version": "2.3.0", 5045 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", 5046 + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", 5047 + "license": "MIT", 5048 + "engines": { 5049 + "node": ">= 10" 5050 + } 5051 + }, 4115 5052 "node_modules/is-array-buffer": { 4116 5053 "version": "3.0.5", 4117 5054 "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", ··· 4575 5512 "jiti": "lib/jiti-cli.mjs" 4576 5513 } 4577 5514 }, 5515 + "node_modules/jose": { 5516 + "version": "5.10.0", 5517 + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", 5518 + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", 5519 + "license": "MIT", 5520 + "funding": { 5521 + "url": "https://github.com/sponsors/panva" 5522 + } 5523 + }, 4578 5524 "node_modules/js-tokens": { 4579 5525 "version": "4.0.0", 4580 5526 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", ··· 4668 5614 "json-buffer": "3.0.1" 4669 5615 } 4670 5616 }, 5617 + "node_modules/kysely": { 5618 + "version": "0.28.11", 5619 + "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.28.11.tgz", 5620 + "integrity": "sha512-zpGIFg0HuoC893rIjYX1BETkVWdDnzTzF5e0kWXJFg5lE0k1/LfNWBejrcnOFu8Q2Rfq/hTDTU7XLUM8QOrpzg==", 5621 + "license": "MIT", 5622 + "engines": { 5623 + "node": ">=20.0.0" 5624 + } 5625 + }, 4671 5626 "node_modules/language-subtag-registry": { 4672 5627 "version": "0.3.23", 4673 5628 "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", ··· 5062 6017 "node": ">=8.6" 5063 6018 } 5064 6019 }, 6020 + "node_modules/mimic-response": { 6021 + "version": "3.1.0", 6022 + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 6023 + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 6024 + "license": "MIT", 6025 + "engines": { 6026 + "node": ">=10" 6027 + }, 6028 + "funding": { 6029 + "url": "https://github.com/sponsors/sindresorhus" 6030 + } 6031 + }, 5065 6032 "node_modules/minimatch": { 5066 6033 "version": "3.1.3", 5067 6034 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", ··· 5079 6046 "version": "1.2.8", 5080 6047 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 5081 6048 "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 5082 - "dev": true, 5083 6049 "license": "MIT", 5084 6050 "funding": { 5085 6051 "url": "https://github.com/sponsors/ljharb" 5086 6052 } 5087 6053 }, 6054 + "node_modules/mkdirp-classic": { 6055 + "version": "0.5.3", 6056 + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 6057 + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 6058 + "license": "MIT" 6059 + }, 5088 6060 "node_modules/ms": { 5089 6061 "version": "2.1.3", 5090 6062 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", ··· 5115 6087 "engines": { 5116 6088 "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 5117 6089 } 6090 + }, 6091 + "node_modules/napi-build-utils": { 6092 + "version": "2.0.0", 6093 + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", 6094 + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", 6095 + "license": "MIT" 5118 6096 }, 5119 6097 "node_modules/napi-postinstall": { 5120 6098 "version": "0.3.4", ··· 5220 6198 "node": "^10 || ^12 || >=14" 5221 6199 } 5222 6200 }, 6201 + "node_modules/node-abi": { 6202 + "version": "3.87.0", 6203 + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", 6204 + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", 6205 + "license": "MIT", 6206 + "dependencies": { 6207 + "semver": "^7.3.5" 6208 + }, 6209 + "engines": { 6210 + "node": ">=10" 6211 + } 6212 + }, 6213 + "node_modules/node-abi/node_modules/semver": { 6214 + "version": "7.7.4", 6215 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", 6216 + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", 6217 + "license": "ISC", 6218 + "bin": { 6219 + "semver": "bin/semver.js" 6220 + }, 6221 + "engines": { 6222 + "node": ">=10" 6223 + } 6224 + }, 5223 6225 "node_modules/node-exports-info": { 5224 6226 "version": "1.6.0", 5225 6227 "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", ··· 5369 6371 "url": "https://github.com/sponsors/ljharb" 5370 6372 } 5371 6373 }, 6374 + "node_modules/once": { 6375 + "version": "1.4.0", 6376 + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 6377 + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 6378 + "license": "ISC", 6379 + "dependencies": { 6380 + "wrappy": "1" 6381 + } 6382 + }, 5372 6383 "node_modules/optionator": { 5373 6384 "version": "0.9.4", 5374 6385 "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", ··· 5535 6546 "node": "^10 || ^12 || >=14" 5536 6547 } 5537 6548 }, 6549 + "node_modules/prebuild-install": { 6550 + "version": "7.1.3", 6551 + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", 6552 + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", 6553 + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", 6554 + "license": "MIT", 6555 + "dependencies": { 6556 + "detect-libc": "^2.0.0", 6557 + "expand-template": "^2.0.3", 6558 + "github-from-package": "0.0.0", 6559 + "minimist": "^1.2.3", 6560 + "mkdirp-classic": "^0.5.3", 6561 + "napi-build-utils": "^2.0.0", 6562 + "node-abi": "^3.3.0", 6563 + "pump": "^3.0.0", 6564 + "rc": "^1.2.7", 6565 + "simple-get": "^4.0.0", 6566 + "tar-fs": "^2.0.0", 6567 + "tunnel-agent": "^0.6.0" 6568 + }, 6569 + "bin": { 6570 + "prebuild-install": "bin.js" 6571 + }, 6572 + "engines": { 6573 + "node": ">=10" 6574 + } 6575 + }, 5538 6576 "node_modules/prelude-ls": { 5539 6577 "version": "1.2.1", 5540 6578 "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", ··· 5557 6595 "react-is": "^16.13.1" 5558 6596 } 5559 6597 }, 6598 + "node_modules/pump": { 6599 + "version": "3.0.3", 6600 + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", 6601 + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", 6602 + "license": "MIT", 6603 + "dependencies": { 6604 + "end-of-stream": "^1.1.0", 6605 + "once": "^1.3.1" 6606 + } 6607 + }, 5560 6608 "node_modules/punycode": { 5561 6609 "version": "2.3.1", 5562 6610 "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", ··· 5588 6636 ], 5589 6637 "license": "MIT" 5590 6638 }, 6639 + "node_modules/rc": { 6640 + "version": "1.2.8", 6641 + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 6642 + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 6643 + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", 6644 + "dependencies": { 6645 + "deep-extend": "^0.6.0", 6646 + "ini": "~1.3.0", 6647 + "minimist": "^1.2.0", 6648 + "strip-json-comments": "~2.0.1" 6649 + }, 6650 + "bin": { 6651 + "rc": "cli.js" 6652 + } 6653 + }, 6654 + "node_modules/rc/node_modules/strip-json-comments": { 6655 + "version": "2.0.1", 6656 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 6657 + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 6658 + "license": "MIT", 6659 + "engines": { 6660 + "node": ">=0.10.0" 6661 + } 6662 + }, 5591 6663 "node_modules/react": { 5592 6664 "version": "19.2.3", 5593 6665 "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", ··· 5625 6697 "dev": true, 5626 6698 "license": "MIT" 5627 6699 }, 6700 + "node_modules/readable-stream": { 6701 + "version": "3.6.2", 6702 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 6703 + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 6704 + "license": "MIT", 6705 + "dependencies": { 6706 + "inherits": "^2.0.3", 6707 + "string_decoder": "^1.1.1", 6708 + "util-deprecate": "^1.0.1" 6709 + }, 6710 + "engines": { 6711 + "node": ">= 6" 6712 + } 6713 + }, 5628 6714 "node_modules/reflect.getprototypeof": { 5629 6715 "version": "1.0.10", 5630 6716 "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", ··· 5704 6790 "version": "1.0.0", 5705 6791 "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", 5706 6792 "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", 5707 - "dev": true, 5708 6793 "license": "MIT", 5709 6794 "funding": { 5710 6795 "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" ··· 5764 6849 "funding": { 5765 6850 "url": "https://github.com/sponsors/ljharb" 5766 6851 } 6852 + }, 6853 + "node_modules/safe-buffer": { 6854 + "version": "5.2.1", 6855 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 6856 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 6857 + "funding": [ 6858 + { 6859 + "type": "github", 6860 + "url": "https://github.com/sponsors/feross" 6861 + }, 6862 + { 6863 + "type": "patreon", 6864 + "url": "https://www.patreon.com/feross" 6865 + }, 6866 + { 6867 + "type": "consulting", 6868 + "url": "https://feross.org/support" 6869 + } 6870 + ], 6871 + "license": "MIT" 5767 6872 }, 5768 6873 "node_modules/safe-push-apply": { 5769 6874 "version": "1.0.0", ··· 6022 7127 "url": "https://github.com/sponsors/ljharb" 6023 7128 } 6024 7129 }, 7130 + "node_modules/simple-concat": { 7131 + "version": "1.0.1", 7132 + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 7133 + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 7134 + "funding": [ 7135 + { 7136 + "type": "github", 7137 + "url": "https://github.com/sponsors/feross" 7138 + }, 7139 + { 7140 + "type": "patreon", 7141 + "url": "https://www.patreon.com/feross" 7142 + }, 7143 + { 7144 + "type": "consulting", 7145 + "url": "https://feross.org/support" 7146 + } 7147 + ], 7148 + "license": "MIT" 7149 + }, 7150 + "node_modules/simple-get": { 7151 + "version": "4.0.1", 7152 + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 7153 + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 7154 + "funding": [ 7155 + { 7156 + "type": "github", 7157 + "url": "https://github.com/sponsors/feross" 7158 + }, 7159 + { 7160 + "type": "patreon", 7161 + "url": "https://www.patreon.com/feross" 7162 + }, 7163 + { 7164 + "type": "consulting", 7165 + "url": "https://feross.org/support" 7166 + } 7167 + ], 7168 + "license": "MIT", 7169 + "dependencies": { 7170 + "decompress-response": "^6.0.0", 7171 + "once": "^1.3.1", 7172 + "simple-concat": "^1.0.0" 7173 + } 7174 + }, 6025 7175 "node_modules/source-map-js": { 6026 7176 "version": "1.2.1", 6027 7177 "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", ··· 6050 7200 }, 6051 7201 "engines": { 6052 7202 "node": ">= 0.4" 7203 + } 7204 + }, 7205 + "node_modules/string_decoder": { 7206 + "version": "1.3.0", 7207 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 7208 + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 7209 + "license": "MIT", 7210 + "dependencies": { 7211 + "safe-buffer": "~5.2.0" 6053 7212 } 6054 7213 }, 6055 7214 "node_modules/string.prototype.includes": { ··· 6258 7417 "url": "https://opencollective.com/webpack" 6259 7418 } 6260 7419 }, 7420 + "node_modules/tar-fs": { 7421 + "version": "2.1.4", 7422 + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", 7423 + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", 7424 + "license": "MIT", 7425 + "dependencies": { 7426 + "chownr": "^1.1.1", 7427 + "mkdirp-classic": "^0.5.2", 7428 + "pump": "^3.0.0", 7429 + "tar-stream": "^2.1.4" 7430 + } 7431 + }, 7432 + "node_modules/tar-stream": { 7433 + "version": "2.2.0", 7434 + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 7435 + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 7436 + "license": "MIT", 7437 + "dependencies": { 7438 + "bl": "^4.0.3", 7439 + "end-of-stream": "^1.4.1", 7440 + "fs-constants": "^1.0.0", 7441 + "inherits": "^2.0.3", 7442 + "readable-stream": "^3.1.1" 7443 + }, 7444 + "engines": { 7445 + "node": ">=6" 7446 + } 7447 + }, 6261 7448 "node_modules/tinyglobby": { 6262 7449 "version": "0.2.15", 6263 7450 "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", ··· 6373 7560 "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 6374 7561 "license": "0BSD" 6375 7562 }, 7563 + "node_modules/tsx": { 7564 + "version": "4.21.0", 7565 + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", 7566 + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", 7567 + "license": "MIT", 7568 + "dependencies": { 7569 + "esbuild": "~0.27.0", 7570 + "get-tsconfig": "^4.7.5" 7571 + }, 7572 + "bin": { 7573 + "tsx": "dist/cli.mjs" 7574 + }, 7575 + "engines": { 7576 + "node": ">=18.0.0" 7577 + }, 7578 + "optionalDependencies": { 7579 + "fsevents": "~2.3.3" 7580 + } 7581 + }, 7582 + "node_modules/tunnel-agent": { 7583 + "version": "0.6.0", 7584 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 7585 + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 7586 + "license": "Apache-2.0", 7587 + "dependencies": { 7588 + "safe-buffer": "^5.0.1" 7589 + }, 7590 + "engines": { 7591 + "node": "*" 7592 + } 7593 + }, 6376 7594 "node_modules/type-check": { 6377 7595 "version": "0.4.0", 6378 7596 "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", ··· 6530 7748 "url": "https://github.com/sponsors/ljharb" 6531 7749 } 6532 7750 }, 7751 + "node_modules/undici": { 7752 + "version": "6.23.0", 7753 + "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", 7754 + "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", 7755 + "license": "MIT", 7756 + "engines": { 7757 + "node": ">=18.17" 7758 + } 7759 + }, 6533 7760 "node_modules/undici-types": { 6534 7761 "version": "6.21.0", 6535 7762 "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", ··· 6618 7845 "dependencies": { 6619 7846 "punycode": "^2.1.0" 6620 7847 } 7848 + }, 7849 + "node_modules/util-deprecate": { 7850 + "version": "1.0.2", 7851 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 7852 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 7853 + "license": "MIT" 6621 7854 }, 6622 7855 "node_modules/which": { 6623 7856 "version": "2.0.2", ··· 6733 7966 "engines": { 6734 7967 "node": ">=0.10.0" 6735 7968 } 7969 + }, 7970 + "node_modules/wrappy": { 7971 + "version": "1.0.2", 7972 + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 7973 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 7974 + "license": "ISC" 6736 7975 }, 6737 7976 "node_modules/yallist": { 6738 7977 "version": "3.1.1",
+7 -1
package.json
··· 5 5 "scripts": { 6 6 "dev": "next dev", 7 7 "build": "next build", 8 + "gen-key": "tsx app/scripts/gen-key.ts", 8 9 "start": "next start", 9 10 "lint": "eslint" 10 11 }, 11 12 "dependencies": { 12 13 "@atproto/api": "^0.19.0", 14 + "@atproto/oauth-client-node": "^0.3.17", 15 + "better-sqlite3": "^12.6.2", 16 + "kysely": "^0.28.11", 13 17 "luxon": "^3.7.2", 14 18 "next": "16.1.6", 15 19 "react": "19.2.3", 16 20 "react-dom": "19.2.3", 17 - "react-icons": "^5.5.0" 21 + "react-icons": "^5.5.0", 22 + "tsx": "^4.21.0" 18 23 }, 19 24 "devDependencies": { 20 25 "@tailwindcss/postcss": "^4", 26 + "@types/better-sqlite3": "^7.6.13", 21 27 "@types/luxon": "^3.7.1", 22 28 "@types/node": "^20", 23 29 "@types/react": "^19",