this repo has no description
2
fork

Configure Feed

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

Add database persistence

Hilke Ros 5db26480 70ca3eb4

+701 -25
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.

+48 -21
lib/auth/client.ts
··· 6 6 NodeSavedSession, 7 7 NodeSavedState, 8 8 } from "@atproto/oauth-client-node"; 9 + import { getDb } from "../db"; 9 10 10 11 export const SCOPE = "atproto"; 11 12 ··· 28 29 redirect_uris: ["http://127.0.0.1:3000/oauth/callback"], 29 30 }), 30 31 31 - stateStore: { 32 - async get(key: string) { 33 - return globalAuth.stateStore.get(key); 34 - }, 35 - async set(key: string, value: NodeSavedState) { 36 - globalAuth.stateStore.set(key, value); 37 - }, 38 - async del(key: string) { 39 - globalAuth.stateStore.delete(key); 40 - }, 32 + stateStore: { 33 + async get(key: string) { 34 + const db = getDb(); 35 + const row = await db 36 + .selectFrom("auth_state") 37 + .select("value") 38 + .where("key", "=", key) 39 + .executeTakeFirst(); 40 + return row ? JSON.parse(row.value) : undefined; 41 + }, 42 + async set(key: string, value: NodeSavedState) { 43 + const db = getDb(); 44 + const valueJson = JSON.stringify(value); 45 + await db 46 + .insertInto("auth_state") 47 + .values({ key, value: valueJson }) 48 + .onConflict((oc) => oc.column("key").doUpdateSet({ value: valueJson })) 49 + .execute(); 50 + }, 51 + async del(key: string) { 52 + const db = getDb(); 53 + await db.deleteFrom("auth_state").where("key", "=", key).execute(); 41 54 }, 55 + }, 42 56 43 - sessionStore: { 44 - async get(key: string) { 45 - return globalAuth.sessionStore.get(key); 46 - }, 47 - async set(key: string, value: NodeSavedSession) { 48 - globalAuth.sessionStore.set(key, value); 49 - }, 50 - async del(key: string) { 51 - globalAuth.sessionStore.delete(key); 52 - }, 57 + sessionStore: { 58 + async get(key: string) { 59 + const db = getDb(); 60 + const row = await db 61 + .selectFrom("auth_session") 62 + .select("value") 63 + .where("key", "=", key) 64 + .executeTakeFirst(); 65 + return row ? JSON.parse(row.value) : undefined; 53 66 }, 54 - }); 67 + async set(key: string, value: NodeSavedSession) { 68 + const db = getDb(); 69 + const valueJson = JSON.stringify(value); 70 + await db 71 + .insertInto("auth_session") 72 + .values({ key, value: valueJson }) 73 + .onConflict((oc) => oc.column("key").doUpdateSet({ value: valueJson })) 74 + .execute(); 75 + }, 76 + async del(key: string) { 77 + const db = getDb(); 78 + await db.deleteFrom("auth_session").where("key", "=", key).execute(); 79 + }, 80 + } 81 + }); 55 82 56 83 return client; 57 84 }
+33
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 = (): Kysely<DatabaseSchema> => { 9 + if (!_db) { 10 + const sqlite = new Database(DATABASE_PATH); 11 + sqlite.pragma("journal_mode = WAL"); 12 + 13 + _db = new Kysely<DatabaseSchema>({ 14 + dialect: new SqliteDialect({ database: sqlite }), 15 + }); 16 + } 17 + return _db; 18 + }; 19 + 20 + export interface DatabaseSchema { 21 + auth_state: AuthStateTable; 22 + auth_session: AuthSessionTable; 23 + } 24 + 25 + interface AuthStateTable { 26 + key: string; 27 + value: string; 28 + } 29 + 30 + interface AuthSessionTable { 31 + key: string; 32 + value: string; 33 + }
+34
lib/db/migrations.ts
··· 1 + import { Kysely, Migration, Migrator } from "kysely"; 2 + import { getDb } from "."; 3 + 4 + const migrations: Record<string, Migration> = { 5 + "001": { 6 + async up(db: Kysely<unknown>) { 7 + await db.schema 8 + .createTable("auth_state") 9 + .addColumn("key", "text", (col) => col.primaryKey()) 10 + .addColumn("value", "text", (col) => col.notNull()) 11 + .execute(); 12 + 13 + await db.schema 14 + .createTable("auth_session") 15 + .addColumn("key", "text", (col) => col.primaryKey()) 16 + .addColumn("value", "text", (col) => col.notNull()) 17 + .execute(); 18 + }, 19 + async down(db: Kysely<unknown>) { 20 + await db.schema.dropTable("auth_session").execute(); 21 + await db.schema.dropTable("auth_state").execute(); 22 + }, 23 + }, 24 + }; 25 + 26 + export function getMigrator() { 27 + const db = getDb(); 28 + return new Migrator({ 29 + db, 30 + provider: { 31 + getMigrations: async () => migrations, 32 + }, 33 + }); 34 + }
+1 -1
next.config.ts
··· 1 1 import type { NextConfig } from "next"; 2 2 3 3 const nextConfig: NextConfig = { 4 - /* config options here */ 4 + serverExternalPackages: ["better-sqlite3"], 5 5 }; 6 6 7 7 export default nextConfig;
+8 -3
package.json
··· 3 3 "version": "0.1.0", 4 4 "private": true, 5 5 "scripts": { 6 - "dev": "next dev", 6 + "dev": "pnpm migrate && next dev", 7 7 "build": "next build", 8 - "start": "next start", 9 - "lint": "eslint" 8 + "start": "pnpm migrate && next start", 9 + "lint": "eslint", 10 + "migrate": "tsx scripts/migrate.ts" 10 11 }, 11 12 "dependencies": { 12 13 "@atproto/oauth-client-node": "^0.3.17", 14 + "better-sqlite3": "^12.6.2", 15 + "kysely": "^0.28.11", 13 16 "next": "16.1.6", 14 17 "react": "19.2.3", 15 18 "react-dom": "19.2.3" 16 19 }, 17 20 "devDependencies": { 18 21 "@tailwindcss/postcss": "^4", 22 + "@types/better-sqlite3": "^7.6.13", 19 23 "@types/node": "^20", 20 24 "@types/react": "^19", 21 25 "@types/react-dom": "^19", 22 26 "eslint": "^9", 23 27 "eslint-config-next": "16.1.6", 24 28 "tailwindcss": "^4", 29 + "tsx": "^4.21.0", 25 30 "typescript": "^5" 26 31 } 27 32 }
+565
pnpm-lock.yaml
··· 11 11 '@atproto/oauth-client-node': 12 12 specifier: ^0.3.17 13 13 version: 0.3.17 14 + better-sqlite3: 15 + specifier: ^12.6.2 16 + version: 12.6.2 17 + kysely: 18 + specifier: ^0.28.11 19 + version: 0.28.11 14 20 next: 15 21 specifier: 16.1.6 16 22 version: 16.1.6(@babel/core@7.29.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) ··· 24 30 '@tailwindcss/postcss': 25 31 specifier: ^4 26 32 version: 4.2.1 33 + '@types/better-sqlite3': 34 + specifier: ^7.6.13 35 + version: 7.6.13 27 36 '@types/node': 28 37 specifier: ^20 29 38 version: 20.19.35 ··· 42 51 tailwindcss: 43 52 specifier: ^4 44 53 version: 4.2.1 54 + tsx: 55 + specifier: ^4.21.0 56 + version: 4.21.0 45 57 typescript: 46 58 specifier: ^5 47 59 version: 5.9.3 ··· 197 209 '@emnapi/wasi-threads@1.1.0': 198 210 resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} 199 211 212 + '@esbuild/aix-ppc64@0.27.3': 213 + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} 214 + engines: {node: '>=18'} 215 + cpu: [ppc64] 216 + os: [aix] 217 + 218 + '@esbuild/android-arm64@0.27.3': 219 + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} 220 + engines: {node: '>=18'} 221 + cpu: [arm64] 222 + os: [android] 223 + 224 + '@esbuild/android-arm@0.27.3': 225 + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} 226 + engines: {node: '>=18'} 227 + cpu: [arm] 228 + os: [android] 229 + 230 + '@esbuild/android-x64@0.27.3': 231 + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} 232 + engines: {node: '>=18'} 233 + cpu: [x64] 234 + os: [android] 235 + 236 + '@esbuild/darwin-arm64@0.27.3': 237 + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} 238 + engines: {node: '>=18'} 239 + cpu: [arm64] 240 + os: [darwin] 241 + 242 + '@esbuild/darwin-x64@0.27.3': 243 + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} 244 + engines: {node: '>=18'} 245 + cpu: [x64] 246 + os: [darwin] 247 + 248 + '@esbuild/freebsd-arm64@0.27.3': 249 + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} 250 + engines: {node: '>=18'} 251 + cpu: [arm64] 252 + os: [freebsd] 253 + 254 + '@esbuild/freebsd-x64@0.27.3': 255 + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} 256 + engines: {node: '>=18'} 257 + cpu: [x64] 258 + os: [freebsd] 259 + 260 + '@esbuild/linux-arm64@0.27.3': 261 + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} 262 + engines: {node: '>=18'} 263 + cpu: [arm64] 264 + os: [linux] 265 + 266 + '@esbuild/linux-arm@0.27.3': 267 + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} 268 + engines: {node: '>=18'} 269 + cpu: [arm] 270 + os: [linux] 271 + 272 + '@esbuild/linux-ia32@0.27.3': 273 + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} 274 + engines: {node: '>=18'} 275 + cpu: [ia32] 276 + os: [linux] 277 + 278 + '@esbuild/linux-loong64@0.27.3': 279 + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} 280 + engines: {node: '>=18'} 281 + cpu: [loong64] 282 + os: [linux] 283 + 284 + '@esbuild/linux-mips64el@0.27.3': 285 + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} 286 + engines: {node: '>=18'} 287 + cpu: [mips64el] 288 + os: [linux] 289 + 290 + '@esbuild/linux-ppc64@0.27.3': 291 + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} 292 + engines: {node: '>=18'} 293 + cpu: [ppc64] 294 + os: [linux] 295 + 296 + '@esbuild/linux-riscv64@0.27.3': 297 + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} 298 + engines: {node: '>=18'} 299 + cpu: [riscv64] 300 + os: [linux] 301 + 302 + '@esbuild/linux-s390x@0.27.3': 303 + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} 304 + engines: {node: '>=18'} 305 + cpu: [s390x] 306 + os: [linux] 307 + 308 + '@esbuild/linux-x64@0.27.3': 309 + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} 310 + engines: {node: '>=18'} 311 + cpu: [x64] 312 + os: [linux] 313 + 314 + '@esbuild/netbsd-arm64@0.27.3': 315 + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} 316 + engines: {node: '>=18'} 317 + cpu: [arm64] 318 + os: [netbsd] 319 + 320 + '@esbuild/netbsd-x64@0.27.3': 321 + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} 322 + engines: {node: '>=18'} 323 + cpu: [x64] 324 + os: [netbsd] 325 + 326 + '@esbuild/openbsd-arm64@0.27.3': 327 + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} 328 + engines: {node: '>=18'} 329 + cpu: [arm64] 330 + os: [openbsd] 331 + 332 + '@esbuild/openbsd-x64@0.27.3': 333 + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} 334 + engines: {node: '>=18'} 335 + cpu: [x64] 336 + os: [openbsd] 337 + 338 + '@esbuild/openharmony-arm64@0.27.3': 339 + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} 340 + engines: {node: '>=18'} 341 + cpu: [arm64] 342 + os: [openharmony] 343 + 344 + '@esbuild/sunos-x64@0.27.3': 345 + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} 346 + engines: {node: '>=18'} 347 + cpu: [x64] 348 + os: [sunos] 349 + 350 + '@esbuild/win32-arm64@0.27.3': 351 + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} 352 + engines: {node: '>=18'} 353 + cpu: [arm64] 354 + os: [win32] 355 + 356 + '@esbuild/win32-ia32@0.27.3': 357 + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} 358 + engines: {node: '>=18'} 359 + cpu: [ia32] 360 + os: [win32] 361 + 362 + '@esbuild/win32-x64@0.27.3': 363 + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} 364 + engines: {node: '>=18'} 365 + cpu: [x64] 366 + os: [win32] 367 + 200 368 '@eslint-community/eslint-utils@4.9.1': 201 369 resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} 202 370 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ··· 598 766 '@tybys/wasm-util@0.10.1': 599 767 resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} 600 768 769 + '@types/better-sqlite3@7.6.13': 770 + resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} 771 + 601 772 '@types/estree@1.0.8': 602 773 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 603 774 ··· 862 1033 resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} 863 1034 engines: {node: 18 || 20 || >=22} 864 1035 1036 + base64-js@1.5.1: 1037 + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 1038 + 865 1039 baseline-browser-mapping@2.10.0: 866 1040 resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} 867 1041 engines: {node: '>=6.0.0'} 868 1042 hasBin: true 869 1043 1044 + better-sqlite3@12.6.2: 1045 + resolution: {integrity: sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==} 1046 + engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} 1047 + 1048 + bindings@1.5.0: 1049 + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 1050 + 1051 + bl@4.1.0: 1052 + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 1053 + 870 1054 brace-expansion@1.1.12: 871 1055 resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 872 1056 ··· 883 1067 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 884 1068 hasBin: true 885 1069 1070 + buffer@5.7.1: 1071 + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 1072 + 886 1073 call-bind-apply-helpers@1.0.2: 887 1074 resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 888 1075 engines: {node: '>= 0.4'} ··· 905 1092 chalk@4.1.2: 906 1093 resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 907 1094 engines: {node: '>=10'} 1095 + 1096 + chownr@1.1.4: 1097 + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 908 1098 909 1099 client-only@0.0.1: 910 1100 resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} ··· 964 1154 supports-color: 965 1155 optional: true 966 1156 1157 + decompress-response@6.0.0: 1158 + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 1159 + engines: {node: '>=10'} 1160 + 1161 + deep-extend@0.6.0: 1162 + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 1163 + engines: {node: '>=4.0.0'} 1164 + 967 1165 deep-is@0.1.4: 968 1166 resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 969 1167 ··· 992 1190 993 1191 emoji-regex@9.2.2: 994 1192 resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1193 + 1194 + end-of-stream@1.4.5: 1195 + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} 995 1196 996 1197 enhanced-resolve@5.20.0: 997 1198 resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} ··· 1028 1229 es-to-primitive@1.3.0: 1029 1230 resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 1030 1231 engines: {node: '>= 0.4'} 1232 + 1233 + esbuild@0.27.3: 1234 + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} 1235 + engines: {node: '>=18'} 1236 + hasBin: true 1031 1237 1032 1238 escalade@3.2.0: 1033 1239 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} ··· 1157 1363 resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1158 1364 engines: {node: '>=0.10.0'} 1159 1365 1366 + expand-template@2.0.3: 1367 + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} 1368 + engines: {node: '>=6'} 1369 + 1160 1370 fast-deep-equal@3.1.3: 1161 1371 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1162 1372 ··· 1185 1395 file-entry-cache@8.0.0: 1186 1396 resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 1187 1397 engines: {node: '>=16.0.0'} 1398 + 1399 + file-uri-to-path@1.0.0: 1400 + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} 1188 1401 1189 1402 fill-range@7.1.1: 1190 1403 resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} ··· 1205 1418 resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} 1206 1419 engines: {node: '>= 0.4'} 1207 1420 1421 + fs-constants@1.0.0: 1422 + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 1423 + 1424 + fsevents@2.3.3: 1425 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1426 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1427 + os: [darwin] 1428 + 1208 1429 function-bind@1.1.2: 1209 1430 resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1210 1431 ··· 1238 1459 get-tsconfig@4.13.6: 1239 1460 resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} 1240 1461 1462 + github-from-package@0.0.0: 1463 + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} 1464 + 1241 1465 glob-parent@5.1.2: 1242 1466 resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1243 1467 engines: {node: '>= 6'} ··· 1298 1522 hermes-parser@0.25.1: 1299 1523 resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} 1300 1524 1525 + ieee754@1.2.1: 1526 + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1527 + 1301 1528 ignore@5.3.2: 1302 1529 resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1303 1530 engines: {node: '>= 4'} ··· 1314 1541 resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1315 1542 engines: {node: '>=0.8.19'} 1316 1543 1544 + inherits@2.0.4: 1545 + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1546 + 1547 + ini@1.3.8: 1548 + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1549 + 1317 1550 internal-slot@1.1.0: 1318 1551 resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 1319 1552 engines: {node: '>= 0.4'} ··· 1482 1715 keyv@4.5.4: 1483 1716 resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1484 1717 1718 + kysely@0.28.11: 1719 + resolution: {integrity: sha512-zpGIFg0HuoC893rIjYX1BETkVWdDnzTzF5e0kWXJFg5lE0k1/LfNWBejrcnOFu8Q2Rfq/hTDTU7XLUM8QOrpzg==} 1720 + engines: {node: '>=20.0.0'} 1721 + 1485 1722 language-subtag-registry@0.3.23: 1486 1723 resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} 1487 1724 ··· 1599 1836 resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1600 1837 engines: {node: '>=8.6'} 1601 1838 1839 + mimic-response@3.1.0: 1840 + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1841 + engines: {node: '>=10'} 1842 + 1602 1843 minimatch@10.2.4: 1603 1844 resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} 1604 1845 engines: {node: 18 || 20 || >=22} ··· 1608 1849 1609 1850 minimist@1.2.8: 1610 1851 resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1852 + 1853 + mkdirp-classic@0.5.3: 1854 + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 1611 1855 1612 1856 ms@2.1.3: 1613 1857 resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} ··· 1619 1863 resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1620 1864 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1621 1865 hasBin: true 1866 + 1867 + napi-build-utils@2.0.0: 1868 + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} 1622 1869 1623 1870 napi-postinstall@0.3.4: 1624 1871 resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} ··· 1649 1896 sass: 1650 1897 optional: true 1651 1898 1899 + node-abi@3.87.0: 1900 + resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} 1901 + engines: {node: '>=10'} 1902 + 1652 1903 node-exports-info@1.6.0: 1653 1904 resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} 1654 1905 engines: {node: '>= 0.4'} ··· 1687 1938 object.values@1.2.1: 1688 1939 resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} 1689 1940 engines: {node: '>= 0.4'} 1941 + 1942 + once@1.4.0: 1943 + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1690 1944 1691 1945 optionator@0.9.4: 1692 1946 resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} ··· 1742 1996 resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} 1743 1997 engines: {node: ^10 || ^12 || >=14} 1744 1998 1999 + prebuild-install@7.1.3: 2000 + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} 2001 + engines: {node: '>=10'} 2002 + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. 2003 + hasBin: true 2004 + 1745 2005 prelude-ls@1.2.1: 1746 2006 resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1747 2007 engines: {node: '>= 0.8.0'} ··· 1749 2009 prop-types@15.8.1: 1750 2010 resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 1751 2011 2012 + pump@3.0.4: 2013 + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} 2014 + 1752 2015 punycode@2.3.1: 1753 2016 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1754 2017 engines: {node: '>=6'} ··· 1756 2019 queue-microtask@1.2.3: 1757 2020 resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1758 2021 2022 + rc@1.2.8: 2023 + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 2024 + hasBin: true 2025 + 1759 2026 react-dom@19.2.3: 1760 2027 resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} 1761 2028 peerDependencies: ··· 1767 2034 react@19.2.3: 1768 2035 resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} 1769 2036 engines: {node: '>=0.10.0'} 2037 + 2038 + readable-stream@3.6.2: 2039 + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 2040 + engines: {node: '>= 6'} 1770 2041 1771 2042 reflect.getprototypeof@1.0.10: 1772 2043 resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} ··· 1803 2074 safe-array-concat@1.1.3: 1804 2075 resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} 1805 2076 engines: {node: '>=0.4'} 2077 + 2078 + safe-buffer@5.2.1: 2079 + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1806 2080 1807 2081 safe-push-apply@1.0.0: 1808 2082 resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} ··· 1864 2138 resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1865 2139 engines: {node: '>= 0.4'} 1866 2140 2141 + simple-concat@1.0.1: 2142 + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} 2143 + 2144 + simple-get@4.0.1: 2145 + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} 2146 + 1867 2147 source-map-js@1.2.1: 1868 2148 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1869 2149 engines: {node: '>=0.10.0'} ··· 1897 2177 string.prototype.trimstart@1.0.8: 1898 2178 resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 1899 2179 engines: {node: '>= 0.4'} 2180 + 2181 + string_decoder@1.3.0: 2182 + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1900 2183 1901 2184 strip-bom@3.0.0: 1902 2185 resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1903 2186 engines: {node: '>=4'} 1904 2187 2188 + strip-json-comments@2.0.1: 2189 + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 2190 + engines: {node: '>=0.10.0'} 2191 + 1905 2192 strip-json-comments@3.1.1: 1906 2193 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1907 2194 engines: {node: '>=8'} ··· 1934 2221 resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} 1935 2222 engines: {node: '>=6'} 1936 2223 2224 + tar-fs@2.1.4: 2225 + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} 2226 + 2227 + tar-stream@2.2.0: 2228 + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 2229 + engines: {node: '>=6'} 2230 + 1937 2231 tinyglobby@0.2.15: 1938 2232 resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1939 2233 engines: {node: '>=12.0.0'} ··· 1954 2248 tslib@2.8.1: 1955 2249 resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1956 2250 2251 + tsx@4.21.0: 2252 + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} 2253 + engines: {node: '>=18.0.0'} 2254 + hasBin: true 2255 + 2256 + tunnel-agent@0.6.0: 2257 + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} 2258 + 1957 2259 type-check@0.4.0: 1958 2260 resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1959 2261 engines: {node: '>= 0.8.0'} ··· 2015 2317 uri-js@4.4.1: 2016 2318 resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2017 2319 2320 + util-deprecate@1.0.2: 2321 + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2322 + 2018 2323 which-boxed-primitive@1.1.1: 2019 2324 resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} 2020 2325 engines: {node: '>= 0.4'} ··· 2039 2344 word-wrap@1.2.5: 2040 2345 resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 2041 2346 engines: {node: '>=0.10.0'} 2347 + 2348 + wrappy@1.0.2: 2349 + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2042 2350 2043 2351 yallist@3.1.1: 2044 2352 resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} ··· 2316 2624 tslib: 2.8.1 2317 2625 optional: true 2318 2626 2627 + '@esbuild/aix-ppc64@0.27.3': 2628 + optional: true 2629 + 2630 + '@esbuild/android-arm64@0.27.3': 2631 + optional: true 2632 + 2633 + '@esbuild/android-arm@0.27.3': 2634 + optional: true 2635 + 2636 + '@esbuild/android-x64@0.27.3': 2637 + optional: true 2638 + 2639 + '@esbuild/darwin-arm64@0.27.3': 2640 + optional: true 2641 + 2642 + '@esbuild/darwin-x64@0.27.3': 2643 + optional: true 2644 + 2645 + '@esbuild/freebsd-arm64@0.27.3': 2646 + optional: true 2647 + 2648 + '@esbuild/freebsd-x64@0.27.3': 2649 + optional: true 2650 + 2651 + '@esbuild/linux-arm64@0.27.3': 2652 + optional: true 2653 + 2654 + '@esbuild/linux-arm@0.27.3': 2655 + optional: true 2656 + 2657 + '@esbuild/linux-ia32@0.27.3': 2658 + optional: true 2659 + 2660 + '@esbuild/linux-loong64@0.27.3': 2661 + optional: true 2662 + 2663 + '@esbuild/linux-mips64el@0.27.3': 2664 + optional: true 2665 + 2666 + '@esbuild/linux-ppc64@0.27.3': 2667 + optional: true 2668 + 2669 + '@esbuild/linux-riscv64@0.27.3': 2670 + optional: true 2671 + 2672 + '@esbuild/linux-s390x@0.27.3': 2673 + optional: true 2674 + 2675 + '@esbuild/linux-x64@0.27.3': 2676 + optional: true 2677 + 2678 + '@esbuild/netbsd-arm64@0.27.3': 2679 + optional: true 2680 + 2681 + '@esbuild/netbsd-x64@0.27.3': 2682 + optional: true 2683 + 2684 + '@esbuild/openbsd-arm64@0.27.3': 2685 + optional: true 2686 + 2687 + '@esbuild/openbsd-x64@0.27.3': 2688 + optional: true 2689 + 2690 + '@esbuild/openharmony-arm64@0.27.3': 2691 + optional: true 2692 + 2693 + '@esbuild/sunos-x64@0.27.3': 2694 + optional: true 2695 + 2696 + '@esbuild/win32-arm64@0.27.3': 2697 + optional: true 2698 + 2699 + '@esbuild/win32-ia32@0.27.3': 2700 + optional: true 2701 + 2702 + '@esbuild/win32-x64@0.27.3': 2703 + optional: true 2704 + 2319 2705 '@eslint-community/eslint-utils@4.9.1(eslint@9.39.3(jiti@2.6.1))': 2320 2706 dependencies: 2321 2707 eslint: 9.39.3(jiti@2.6.1) ··· 2620 3006 tslib: 2.8.1 2621 3007 optional: true 2622 3008 3009 + '@types/better-sqlite3@7.6.13': 3010 + dependencies: 3011 + '@types/node': 20.19.35 3012 + 2623 3013 '@types/estree@1.0.8': {} 2624 3014 2625 3015 '@types/json-schema@7.0.15': {} ··· 2892 3282 2893 3283 balanced-match@4.0.4: {} 2894 3284 3285 + base64-js@1.5.1: {} 3286 + 2895 3287 baseline-browser-mapping@2.10.0: {} 3288 + 3289 + better-sqlite3@12.6.2: 3290 + dependencies: 3291 + bindings: 1.5.0 3292 + prebuild-install: 7.1.3 3293 + 3294 + bindings@1.5.0: 3295 + dependencies: 3296 + file-uri-to-path: 1.0.0 3297 + 3298 + bl@4.1.0: 3299 + dependencies: 3300 + buffer: 5.7.1 3301 + inherits: 2.0.4 3302 + readable-stream: 3.6.2 2896 3303 2897 3304 brace-expansion@1.1.12: 2898 3305 dependencies: ··· 2915 3322 node-releases: 2.0.36 2916 3323 update-browserslist-db: 1.2.3(browserslist@4.28.1) 2917 3324 3325 + buffer@5.7.1: 3326 + dependencies: 3327 + base64-js: 1.5.1 3328 + ieee754: 1.2.1 3329 + 2918 3330 call-bind-apply-helpers@1.0.2: 2919 3331 dependencies: 2920 3332 es-errors: 1.3.0 ··· 2940 3352 dependencies: 2941 3353 ansi-styles: 4.3.0 2942 3354 supports-color: 7.2.0 3355 + 3356 + chownr@1.1.4: {} 2943 3357 2944 3358 client-only@0.0.1: {} 2945 3359 ··· 2991 3405 dependencies: 2992 3406 ms: 2.1.3 2993 3407 3408 + decompress-response@6.0.0: 3409 + dependencies: 3410 + mimic-response: 3.1.0 3411 + 3412 + deep-extend@0.6.0: {} 3413 + 2994 3414 deep-is@0.1.4: {} 2995 3415 2996 3416 define-data-property@1.1.4: ··· 3020 3440 electron-to-chromium@1.5.307: {} 3021 3441 3022 3442 emoji-regex@9.2.2: {} 3443 + 3444 + end-of-stream@1.4.5: 3445 + dependencies: 3446 + once: 1.4.0 3023 3447 3024 3448 enhanced-resolve@5.20.0: 3025 3449 dependencies: ··· 3127 3551 is-date-object: 1.1.0 3128 3552 is-symbol: 1.1.1 3129 3553 3554 + esbuild@0.27.3: 3555 + optionalDependencies: 3556 + '@esbuild/aix-ppc64': 0.27.3 3557 + '@esbuild/android-arm': 0.27.3 3558 + '@esbuild/android-arm64': 0.27.3 3559 + '@esbuild/android-x64': 0.27.3 3560 + '@esbuild/darwin-arm64': 0.27.3 3561 + '@esbuild/darwin-x64': 0.27.3 3562 + '@esbuild/freebsd-arm64': 0.27.3 3563 + '@esbuild/freebsd-x64': 0.27.3 3564 + '@esbuild/linux-arm': 0.27.3 3565 + '@esbuild/linux-arm64': 0.27.3 3566 + '@esbuild/linux-ia32': 0.27.3 3567 + '@esbuild/linux-loong64': 0.27.3 3568 + '@esbuild/linux-mips64el': 0.27.3 3569 + '@esbuild/linux-ppc64': 0.27.3 3570 + '@esbuild/linux-riscv64': 0.27.3 3571 + '@esbuild/linux-s390x': 0.27.3 3572 + '@esbuild/linux-x64': 0.27.3 3573 + '@esbuild/netbsd-arm64': 0.27.3 3574 + '@esbuild/netbsd-x64': 0.27.3 3575 + '@esbuild/openbsd-arm64': 0.27.3 3576 + '@esbuild/openbsd-x64': 0.27.3 3577 + '@esbuild/openharmony-arm64': 0.27.3 3578 + '@esbuild/sunos-x64': 0.27.3 3579 + '@esbuild/win32-arm64': 0.27.3 3580 + '@esbuild/win32-ia32': 0.27.3 3581 + '@esbuild/win32-x64': 0.27.3 3582 + 3130 3583 escalade@3.2.0: {} 3131 3584 3132 3585 escape-string-regexp@4.0.0: {} ··· 3336 3789 3337 3790 esutils@2.0.3: {} 3338 3791 3792 + expand-template@2.0.3: {} 3793 + 3339 3794 fast-deep-equal@3.1.3: {} 3340 3795 3341 3796 fast-glob@3.3.1: ··· 3361 3816 file-entry-cache@8.0.0: 3362 3817 dependencies: 3363 3818 flat-cache: 4.0.1 3819 + 3820 + file-uri-to-path@1.0.0: {} 3364 3821 3365 3822 fill-range@7.1.1: 3366 3823 dependencies: ··· 3382 3839 dependencies: 3383 3840 is-callable: 1.2.7 3384 3841 3842 + fs-constants@1.0.0: {} 3843 + 3844 + fsevents@2.3.3: 3845 + optional: true 3846 + 3385 3847 function-bind@1.1.2: {} 3386 3848 3387 3849 function.prototype.name@1.1.8: ··· 3426 3888 get-tsconfig@4.13.6: 3427 3889 dependencies: 3428 3890 resolve-pkg-maps: 1.0.0 3891 + 3892 + github-from-package@0.0.0: {} 3429 3893 3430 3894 glob-parent@5.1.2: 3431 3895 dependencies: ··· 3476 3940 dependencies: 3477 3941 hermes-estree: 0.25.1 3478 3942 3943 + ieee754@1.2.1: {} 3944 + 3479 3945 ignore@5.3.2: {} 3480 3946 3481 3947 ignore@7.0.5: {} ··· 3487 3953 3488 3954 imurmurhash@0.1.4: {} 3489 3955 3956 + inherits@2.0.4: {} 3957 + 3958 + ini@1.3.8: {} 3959 + 3490 3960 internal-slot@1.1.0: 3491 3961 dependencies: 3492 3962 es-errors: 1.3.0 ··· 3657 4127 dependencies: 3658 4128 json-buffer: 3.0.1 3659 4129 4130 + kysely@0.28.11: {} 4131 + 3660 4132 language-subtag-registry@0.3.23: {} 3661 4133 3662 4134 language-tags@1.0.9: ··· 3746 4218 braces: 3.0.3 3747 4219 picomatch: 2.3.1 3748 4220 4221 + mimic-response@3.1.0: {} 4222 + 3749 4223 minimatch@10.2.4: 3750 4224 dependencies: 3751 4225 brace-expansion: 5.0.4 ··· 3756 4230 3757 4231 minimist@1.2.8: {} 3758 4232 4233 + mkdirp-classic@0.5.3: {} 4234 + 3759 4235 ms@2.1.3: {} 3760 4236 3761 4237 multiformats@9.9.0: {} 3762 4238 3763 4239 nanoid@3.3.11: {} 4240 + 4241 + napi-build-utils@2.0.0: {} 3764 4242 3765 4243 napi-postinstall@0.3.4: {} 3766 4244 ··· 3790 4268 - '@babel/core' 3791 4269 - babel-plugin-macros 3792 4270 4271 + node-abi@3.87.0: 4272 + dependencies: 4273 + semver: 7.7.4 4274 + 3793 4275 node-exports-info@1.6.0: 3794 4276 dependencies: 3795 4277 array.prototype.flatmap: 1.3.3 ··· 3841 4323 define-properties: 1.2.1 3842 4324 es-object-atoms: 1.1.1 3843 4325 4326 + once@1.4.0: 4327 + dependencies: 4328 + wrappy: 1.0.2 4329 + 3844 4330 optionator@0.9.4: 3845 4331 dependencies: 3846 4332 deep-is: 0.1.4 ··· 3894 4380 picocolors: 1.1.1 3895 4381 source-map-js: 1.2.1 3896 4382 4383 + prebuild-install@7.1.3: 4384 + dependencies: 4385 + detect-libc: 2.1.2 4386 + expand-template: 2.0.3 4387 + github-from-package: 0.0.0 4388 + minimist: 1.2.8 4389 + mkdirp-classic: 0.5.3 4390 + napi-build-utils: 2.0.0 4391 + node-abi: 3.87.0 4392 + pump: 3.0.4 4393 + rc: 1.2.8 4394 + simple-get: 4.0.1 4395 + tar-fs: 2.1.4 4396 + tunnel-agent: 0.6.0 4397 + 3897 4398 prelude-ls@1.2.1: {} 3898 4399 3899 4400 prop-types@15.8.1: ··· 3902 4403 object-assign: 4.1.1 3903 4404 react-is: 16.13.1 3904 4405 4406 + pump@3.0.4: 4407 + dependencies: 4408 + end-of-stream: 1.4.5 4409 + once: 1.4.0 4410 + 3905 4411 punycode@2.3.1: {} 3906 4412 3907 4413 queue-microtask@1.2.3: {} 4414 + 4415 + rc@1.2.8: 4416 + dependencies: 4417 + deep-extend: 0.6.0 4418 + ini: 1.3.8 4419 + minimist: 1.2.8 4420 + strip-json-comments: 2.0.1 3908 4421 3909 4422 react-dom@19.2.3(react@19.2.3): 3910 4423 dependencies: ··· 3915 4428 3916 4429 react@19.2.3: {} 3917 4430 4431 + readable-stream@3.6.2: 4432 + dependencies: 4433 + inherits: 2.0.4 4434 + string_decoder: 1.3.0 4435 + util-deprecate: 1.0.2 4436 + 3918 4437 reflect.getprototypeof@1.0.10: 3919 4438 dependencies: 3920 4439 call-bind: 1.0.8 ··· 3967 4486 get-intrinsic: 1.3.0 3968 4487 has-symbols: 1.1.0 3969 4488 isarray: 2.0.5 4489 + 4490 + safe-buffer@5.2.1: {} 3970 4491 3971 4492 safe-push-apply@1.0.0: 3972 4493 dependencies: ··· 4073 4594 side-channel-map: 1.0.1 4074 4595 side-channel-weakmap: 1.0.2 4075 4596 4597 + simple-concat@1.0.1: {} 4598 + 4599 + simple-get@4.0.1: 4600 + dependencies: 4601 + decompress-response: 6.0.0 4602 + once: 1.4.0 4603 + simple-concat: 1.0.1 4604 + 4076 4605 source-map-js@1.2.1: {} 4077 4606 4078 4607 stable-hash@0.0.5: {} ··· 4132 4661 define-properties: 1.2.1 4133 4662 es-object-atoms: 1.1.1 4134 4663 4664 + string_decoder@1.3.0: 4665 + dependencies: 4666 + safe-buffer: 5.2.1 4667 + 4135 4668 strip-bom@3.0.0: {} 4669 + 4670 + strip-json-comments@2.0.1: {} 4136 4671 4137 4672 strip-json-comments@3.1.1: {} 4138 4673 ··· 4153 4688 4154 4689 tapable@2.3.0: {} 4155 4690 4691 + tar-fs@2.1.4: 4692 + dependencies: 4693 + chownr: 1.1.4 4694 + mkdirp-classic: 0.5.3 4695 + pump: 3.0.4 4696 + tar-stream: 2.2.0 4697 + 4698 + tar-stream@2.2.0: 4699 + dependencies: 4700 + bl: 4.1.0 4701 + end-of-stream: 1.4.5 4702 + fs-constants: 1.0.0 4703 + inherits: 2.0.4 4704 + readable-stream: 3.6.2 4705 + 4156 4706 tinyglobby@0.2.15: 4157 4707 dependencies: 4158 4708 fdir: 6.5.0(picomatch@4.0.3) ··· 4174 4724 strip-bom: 3.0.0 4175 4725 4176 4726 tslib@2.8.1: {} 4727 + 4728 + tsx@4.21.0: 4729 + dependencies: 4730 + esbuild: 0.27.3 4731 + get-tsconfig: 4.13.6 4732 + optionalDependencies: 4733 + fsevents: 2.3.3 4734 + 4735 + tunnel-agent@0.6.0: 4736 + dependencies: 4737 + safe-buffer: 5.2.1 4177 4738 4178 4739 type-check@0.4.0: 4179 4740 dependencies: ··· 4276 4837 dependencies: 4277 4838 punycode: 2.3.1 4278 4839 4840 + util-deprecate@1.0.2: {} 4841 + 4279 4842 which-boxed-primitive@1.1.1: 4280 4843 dependencies: 4281 4844 is-bigint: 1.1.0 ··· 4322 4885 isexe: 2.0.0 4323 4886 4324 4887 word-wrap@1.2.5: {} 4888 + 4889 + wrappy@1.0.2: {} 4325 4890 4326 4891 yallist@3.1.1: {} 4327 4892
+2
pnpm-workspace.yaml
··· 1 + onlyBuiltDependencies: 2 + - better-sqlite3
+10
scripts/migrate.ts
··· 1 + import { getMigrator } from "@/lib/db/migrations"; 2 + 3 + async function main() { 4 + const migrator = getMigrator(); 5 + const { error } = await migrator.migrateToLatest(); 6 + if (error) throw error; 7 + console.log("Migrations complete."); 8 + } 9 + 10 + main();