├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── partykit.json ├── public ├── favicon.svg └── index.html ├── src ├── client │ ├── App.tsx │ ├── Buttons.tsx │ ├── Share.tsx │ ├── hooks.ts │ ├── index.css │ └── index.tsx └── server │ └── index.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | logs 2 | *.log 3 | npm-debug.log* 4 | yarn-debug.log* 5 | yarn-error.log* 6 | pnpm-debug.log* 7 | lerna-debug.log* 8 | 9 | node_modules 10 | dist 11 | dist-ssr 12 | *.local 13 | 14 | .vscode/* 15 | !.vscode/extensions.json 16 | .idea 17 | .DS_Store 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw? 23 | 24 | .partykit 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tinybase-ts-react-partykit 2 | 3 | This is a template for a simple [TinyBase](https://tinybase.org/) app, using 4 | TypeScript, React, and PartyKit. 5 | 6 | image 7 | 8 | ## Instructions 9 | 10 | 1. Make a copy of this template into a new directory: 11 | 12 | ```sh 13 | npx tiged tinyplex/tinybase-ts-react-partykit my-tinybase-app 14 | ``` 15 | 16 | 2. Go into the directory: 17 | 18 | ```sh 19 | cd my-tinybase-app 20 | ``` 21 | 22 | 3. Install the dependencies: 23 | 24 | ```sh 25 | npm install 26 | ``` 27 | 28 | 4. Run the server: 29 | 30 | ```sh 31 | npm run dev 32 | ``` 33 | 34 | 5. Go the URL shown and enjoy! 35 | 36 | ## Other templates 37 | 38 | There are eleven templates for TinyBase, of which this is one: 39 | 40 | | | Template | Language | React | Plus | 41 | | --- | -------------------------------------------------------------------------------------------------------------------- | ---------- | ----- | ---------------------- | 42 | | | [vite-tinybase](https://github.com/tinyplex/vite-tinybase) | JavaScript | No | | 43 | | | [vite-tinybase-ts](https://github.com/tinyplex/vite-tinybase-ts) | TypeScript | No | | 44 | | | [vite-tinybase-react](https://github.com/tinyplex/vite-tinybase-react) | JavaScript | Yes | | 45 | | | [vite-tinybase-ts-react](https://github.com/tinyplex/vite-tinybase-ts-react) | TypeScript | Yes | | 46 | | | [vite-tinybase-ts-react-sync](https://github.com/tinyplex/vite-tinybase-ts-react-sync) | TypeScript | Yes | Synchronization | 47 | | | [vite-tinybase-ts-react-sync-durable-object](https://github.com/tinyplex/vite-tinybase-ts-react-sync-durable-object) | TypeScript | Yes | Sync & Durable Objects | 48 | | | [vite-tinybase-ts-react-pglite](https://github.com/tinyplex/vite-tinybase-ts-react-pglite) | TypeScript | Yes | PGlite | 49 | | | [vite-tinybase-ts-react-crsqlite](https://github.com/tinyplex/vite-tinybase-ts-react-crsqlite) | TypeScript | Yes | CR-SQLite | 50 | | 👉 | [tinybase-ts-react-partykit](https://github.com/tinyplex/tinybase-ts-react-partykit) | TypeScript | Yes | PartyKit | 51 | | | [tinybase-ts-react-electricsql](https://github.com/tinyplex/tinybase-ts-react-electricsql) | TypeScript | Yes | ElectricSQL | 52 | | | [expo/examples/with-tinybase](https://github.com/expo/examples/tree/master/with-tinybase) | JavaScript | Yes | React Native & Expo | 53 | 54 | ## License 55 | 56 | This template has no license, and so you can use it however you want! 57 | [TinyBase](https://github.com/tinyplex/tinybase/blob/main/LICENSE) and 58 | [PartyKit](https://github.com/partykit/partykit/blob/main/LICENSE) themselves 59 | are both MIT licensed. 60 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tinybase-ts-react-partykit", 3 | "version": "1.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "tinybase-ts-react-partykit", 9 | "version": "1.0.1", 10 | "dependencies": { 11 | "partysocket": "^1.1.3", 12 | "react": "^19.1.0", 13 | "react-dom": "^19.1.0", 14 | "tinybase": "^6.0.0" 15 | }, 16 | "devDependencies": { 17 | "@types/react": "^19.0.12", 18 | "@types/react-dom": "^19.0.4", 19 | "partykit": "^0.0.114", 20 | "typescript": "^5.8.2" 21 | } 22 | }, 23 | "node_modules/@cloudflare/workerd-darwin-64": { 24 | "version": "1.20240718.0", 25 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240718.0.tgz", 26 | "integrity": "sha512-BsPZcSCgoGnufog2GIgdPuiKicYTNyO/Dp++HbpLRH+yQdX3x4aWx83M+a0suTl1xv76dO4g9aw7SIB6OSgIyQ==", 27 | "cpu": [ 28 | "x64" 29 | ], 30 | "dev": true, 31 | "license": "Apache-2.0", 32 | "optional": true, 33 | "os": [ 34 | "darwin" 35 | ], 36 | "engines": { 37 | "node": ">=16" 38 | } 39 | }, 40 | "node_modules/@cloudflare/workerd-darwin-arm64": { 41 | "version": "1.20240718.0", 42 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240718.0.tgz", 43 | "integrity": "sha512-nlr4gaOO5gcJerILJQph3+2rnas/nx/lYsuaot1ntHu4LAPBoQo1q/Pucj2cSIav4UiMzTbDmoDwPlls4Kteog==", 44 | "cpu": [ 45 | "arm64" 46 | ], 47 | "dev": true, 48 | "license": "Apache-2.0", 49 | "optional": true, 50 | "os": [ 51 | "darwin" 52 | ], 53 | "engines": { 54 | "node": ">=16" 55 | } 56 | }, 57 | "node_modules/@cloudflare/workerd-linux-64": { 58 | "version": "1.20240718.0", 59 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240718.0.tgz", 60 | "integrity": "sha512-LJ/k3y47pBcjax0ee4K+6ZRrSsqWlfU4lbU8Dn6u5tSC9yzwI4YFNXDrKWInB0vd7RT3w4Yqq1S6ZEbfRrqVUg==", 61 | "cpu": [ 62 | "x64" 63 | ], 64 | "dev": true, 65 | "license": "Apache-2.0", 66 | "optional": true, 67 | "os": [ 68 | "linux" 69 | ], 70 | "engines": { 71 | "node": ">=16" 72 | } 73 | }, 74 | "node_modules/@cloudflare/workerd-linux-arm64": { 75 | "version": "1.20240718.0", 76 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240718.0.tgz", 77 | "integrity": "sha512-zBEZvy88EcAMGRGfuVtS00Yl7lJdUM9sH7i651OoL+q0Plv9kphlCC0REQPwzxrEYT1qibSYtWcD9IxQGgx2/g==", 78 | "cpu": [ 79 | "arm64" 80 | ], 81 | "dev": true, 82 | "license": "Apache-2.0", 83 | "optional": true, 84 | "os": [ 85 | "linux" 86 | ], 87 | "engines": { 88 | "node": ">=16" 89 | } 90 | }, 91 | "node_modules/@cloudflare/workerd-windows-64": { 92 | "version": "1.20240718.0", 93 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240718.0.tgz", 94 | "integrity": "sha512-YpCRvvT47XanFum7C3SedOZKK6BfVhqmwdAAVAQFyc4gsCdegZo0JkUkdloC/jwuWlbCACOG2HTADHOqyeolzQ==", 95 | "cpu": [ 96 | "x64" 97 | ], 98 | "dev": true, 99 | "license": "Apache-2.0", 100 | "optional": true, 101 | "os": [ 102 | "win32" 103 | ], 104 | "engines": { 105 | "node": ">=16" 106 | } 107 | }, 108 | "node_modules/@cloudflare/workers-types": { 109 | "version": "4.20250327.0", 110 | "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250327.0.tgz", 111 | "integrity": "sha512-rkoGnSY/GgBLCuhjZMIC3mt0jjqqvL17uOK92OI4eivmE+pMFOAchowDxIWOzDyYe5vwNCakbCeIM/FrSmwGJA==", 112 | "license": "MIT OR Apache-2.0", 113 | "optional": true, 114 | "peer": true 115 | }, 116 | "node_modules/@cspotcode/source-map-support": { 117 | "version": "0.8.1", 118 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 119 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 120 | "devOptional": true, 121 | "license": "MIT", 122 | "dependencies": { 123 | "@jridgewell/trace-mapping": "0.3.9" 124 | }, 125 | "engines": { 126 | "node": ">=12" 127 | } 128 | }, 129 | "node_modules/@esbuild/aix-ppc64": { 130 | "version": "0.21.5", 131 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 132 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 133 | "cpu": [ 134 | "ppc64" 135 | ], 136 | "dev": true, 137 | "optional": true, 138 | "os": [ 139 | "aix" 140 | ], 141 | "engines": { 142 | "node": ">=12" 143 | } 144 | }, 145 | "node_modules/@esbuild/android-arm": { 146 | "version": "0.21.5", 147 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 148 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 149 | "cpu": [ 150 | "arm" 151 | ], 152 | "dev": true, 153 | "optional": true, 154 | "os": [ 155 | "android" 156 | ], 157 | "engines": { 158 | "node": ">=12" 159 | } 160 | }, 161 | "node_modules/@esbuild/android-arm64": { 162 | "version": "0.21.5", 163 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 164 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 165 | "cpu": [ 166 | "arm64" 167 | ], 168 | "dev": true, 169 | "optional": true, 170 | "os": [ 171 | "android" 172 | ], 173 | "engines": { 174 | "node": ">=12" 175 | } 176 | }, 177 | "node_modules/@esbuild/android-x64": { 178 | "version": "0.21.5", 179 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 180 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 181 | "cpu": [ 182 | "x64" 183 | ], 184 | "dev": true, 185 | "optional": true, 186 | "os": [ 187 | "android" 188 | ], 189 | "engines": { 190 | "node": ">=12" 191 | } 192 | }, 193 | "node_modules/@esbuild/darwin-arm64": { 194 | "version": "0.21.5", 195 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 196 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 197 | "cpu": [ 198 | "arm64" 199 | ], 200 | "dev": true, 201 | "optional": true, 202 | "os": [ 203 | "darwin" 204 | ], 205 | "engines": { 206 | "node": ">=12" 207 | } 208 | }, 209 | "node_modules/@esbuild/darwin-x64": { 210 | "version": "0.21.5", 211 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 212 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 213 | "cpu": [ 214 | "x64" 215 | ], 216 | "dev": true, 217 | "optional": true, 218 | "os": [ 219 | "darwin" 220 | ], 221 | "engines": { 222 | "node": ">=12" 223 | } 224 | }, 225 | "node_modules/@esbuild/freebsd-arm64": { 226 | "version": "0.21.5", 227 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 228 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 229 | "cpu": [ 230 | "arm64" 231 | ], 232 | "dev": true, 233 | "optional": true, 234 | "os": [ 235 | "freebsd" 236 | ], 237 | "engines": { 238 | "node": ">=12" 239 | } 240 | }, 241 | "node_modules/@esbuild/freebsd-x64": { 242 | "version": "0.21.5", 243 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 244 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 245 | "cpu": [ 246 | "x64" 247 | ], 248 | "dev": true, 249 | "optional": true, 250 | "os": [ 251 | "freebsd" 252 | ], 253 | "engines": { 254 | "node": ">=12" 255 | } 256 | }, 257 | "node_modules/@esbuild/linux-arm": { 258 | "version": "0.21.5", 259 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 260 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 261 | "cpu": [ 262 | "arm" 263 | ], 264 | "dev": true, 265 | "optional": true, 266 | "os": [ 267 | "linux" 268 | ], 269 | "engines": { 270 | "node": ">=12" 271 | } 272 | }, 273 | "node_modules/@esbuild/linux-arm64": { 274 | "version": "0.21.5", 275 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 276 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 277 | "cpu": [ 278 | "arm64" 279 | ], 280 | "dev": true, 281 | "optional": true, 282 | "os": [ 283 | "linux" 284 | ], 285 | "engines": { 286 | "node": ">=12" 287 | } 288 | }, 289 | "node_modules/@esbuild/linux-ia32": { 290 | "version": "0.21.5", 291 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 292 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 293 | "cpu": [ 294 | "ia32" 295 | ], 296 | "dev": true, 297 | "optional": true, 298 | "os": [ 299 | "linux" 300 | ], 301 | "engines": { 302 | "node": ">=12" 303 | } 304 | }, 305 | "node_modules/@esbuild/linux-loong64": { 306 | "version": "0.21.5", 307 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 308 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 309 | "cpu": [ 310 | "loong64" 311 | ], 312 | "dev": true, 313 | "optional": true, 314 | "os": [ 315 | "linux" 316 | ], 317 | "engines": { 318 | "node": ">=12" 319 | } 320 | }, 321 | "node_modules/@esbuild/linux-mips64el": { 322 | "version": "0.21.5", 323 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 324 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 325 | "cpu": [ 326 | "mips64el" 327 | ], 328 | "dev": true, 329 | "optional": true, 330 | "os": [ 331 | "linux" 332 | ], 333 | "engines": { 334 | "node": ">=12" 335 | } 336 | }, 337 | "node_modules/@esbuild/linux-ppc64": { 338 | "version": "0.21.5", 339 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 340 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 341 | "cpu": [ 342 | "ppc64" 343 | ], 344 | "dev": true, 345 | "optional": true, 346 | "os": [ 347 | "linux" 348 | ], 349 | "engines": { 350 | "node": ">=12" 351 | } 352 | }, 353 | "node_modules/@esbuild/linux-riscv64": { 354 | "version": "0.21.5", 355 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 356 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 357 | "cpu": [ 358 | "riscv64" 359 | ], 360 | "dev": true, 361 | "optional": true, 362 | "os": [ 363 | "linux" 364 | ], 365 | "engines": { 366 | "node": ">=12" 367 | } 368 | }, 369 | "node_modules/@esbuild/linux-s390x": { 370 | "version": "0.21.5", 371 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 372 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 373 | "cpu": [ 374 | "s390x" 375 | ], 376 | "dev": true, 377 | "optional": true, 378 | "os": [ 379 | "linux" 380 | ], 381 | "engines": { 382 | "node": ">=12" 383 | } 384 | }, 385 | "node_modules/@esbuild/linux-x64": { 386 | "version": "0.21.5", 387 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 388 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 389 | "cpu": [ 390 | "x64" 391 | ], 392 | "dev": true, 393 | "optional": true, 394 | "os": [ 395 | "linux" 396 | ], 397 | "engines": { 398 | "node": ">=12" 399 | } 400 | }, 401 | "node_modules/@esbuild/netbsd-x64": { 402 | "version": "0.21.5", 403 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 404 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 405 | "cpu": [ 406 | "x64" 407 | ], 408 | "dev": true, 409 | "optional": true, 410 | "os": [ 411 | "netbsd" 412 | ], 413 | "engines": { 414 | "node": ">=12" 415 | } 416 | }, 417 | "node_modules/@esbuild/openbsd-x64": { 418 | "version": "0.21.5", 419 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 420 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 421 | "cpu": [ 422 | "x64" 423 | ], 424 | "dev": true, 425 | "optional": true, 426 | "os": [ 427 | "openbsd" 428 | ], 429 | "engines": { 430 | "node": ">=12" 431 | } 432 | }, 433 | "node_modules/@esbuild/sunos-x64": { 434 | "version": "0.21.5", 435 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 436 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 437 | "cpu": [ 438 | "x64" 439 | ], 440 | "dev": true, 441 | "optional": true, 442 | "os": [ 443 | "sunos" 444 | ], 445 | "engines": { 446 | "node": ">=12" 447 | } 448 | }, 449 | "node_modules/@esbuild/win32-arm64": { 450 | "version": "0.21.5", 451 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 452 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 453 | "cpu": [ 454 | "arm64" 455 | ], 456 | "dev": true, 457 | "optional": true, 458 | "os": [ 459 | "win32" 460 | ], 461 | "engines": { 462 | "node": ">=12" 463 | } 464 | }, 465 | "node_modules/@esbuild/win32-ia32": { 466 | "version": "0.21.5", 467 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 468 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 469 | "cpu": [ 470 | "ia32" 471 | ], 472 | "dev": true, 473 | "optional": true, 474 | "os": [ 475 | "win32" 476 | ], 477 | "engines": { 478 | "node": ">=12" 479 | } 480 | }, 481 | "node_modules/@esbuild/win32-x64": { 482 | "version": "0.21.5", 483 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 484 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 485 | "cpu": [ 486 | "x64" 487 | ], 488 | "dev": true, 489 | "optional": true, 490 | "os": [ 491 | "win32" 492 | ], 493 | "engines": { 494 | "node": ">=12" 495 | } 496 | }, 497 | "node_modules/@fastify/busboy": { 498 | "version": "2.1.1", 499 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 500 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 501 | "devOptional": true, 502 | "license": "MIT", 503 | "engines": { 504 | "node": ">=14" 505 | } 506 | }, 507 | "node_modules/@jridgewell/resolve-uri": { 508 | "version": "3.1.2", 509 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 510 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 511 | "devOptional": true, 512 | "license": "MIT", 513 | "engines": { 514 | "node": ">=6.0.0" 515 | } 516 | }, 517 | "node_modules/@jridgewell/sourcemap-codec": { 518 | "version": "1.5.0", 519 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 520 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 521 | "devOptional": true, 522 | "license": "MIT" 523 | }, 524 | "node_modules/@jridgewell/trace-mapping": { 525 | "version": "0.3.9", 526 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 527 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 528 | "devOptional": true, 529 | "license": "MIT", 530 | "dependencies": { 531 | "@jridgewell/resolve-uri": "^3.0.3", 532 | "@jridgewell/sourcemap-codec": "^1.4.10" 533 | } 534 | }, 535 | "node_modules/@types/react": { 536 | "version": "19.0.12", 537 | "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.12.tgz", 538 | "integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==", 539 | "dev": true, 540 | "license": "MIT", 541 | "dependencies": { 542 | "csstype": "^3.0.2" 543 | } 544 | }, 545 | "node_modules/@types/react-dom": { 546 | "version": "19.0.4", 547 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", 548 | "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", 549 | "dev": true, 550 | "license": "MIT", 551 | "peerDependencies": { 552 | "@types/react": "^19.0.0" 553 | } 554 | }, 555 | "node_modules/acorn": { 556 | "version": "8.14.1", 557 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 558 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 559 | "devOptional": true, 560 | "license": "MIT", 561 | "bin": { 562 | "acorn": "bin/acorn" 563 | }, 564 | "engines": { 565 | "node": ">=0.4.0" 566 | } 567 | }, 568 | "node_modules/acorn-walk": { 569 | "version": "8.3.4", 570 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 571 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 572 | "devOptional": true, 573 | "license": "MIT", 574 | "dependencies": { 575 | "acorn": "^8.11.0" 576 | }, 577 | "engines": { 578 | "node": ">=0.4.0" 579 | } 580 | }, 581 | "node_modules/as-table": { 582 | "version": "1.0.55", 583 | "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", 584 | "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", 585 | "devOptional": true, 586 | "license": "MIT", 587 | "dependencies": { 588 | "printable-characters": "^1.0.42" 589 | } 590 | }, 591 | "node_modules/capnp-ts": { 592 | "version": "0.7.0", 593 | "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", 594 | "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", 595 | "devOptional": true, 596 | "license": "MIT", 597 | "dependencies": { 598 | "debug": "^4.3.1", 599 | "tslib": "^2.2.0" 600 | } 601 | }, 602 | "node_modules/clipboardy": { 603 | "version": "4.0.0", 604 | "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", 605 | "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", 606 | "devOptional": true, 607 | "dependencies": { 608 | "execa": "^8.0.1", 609 | "is-wsl": "^3.1.0", 610 | "is64bit": "^2.0.0" 611 | }, 612 | "engines": { 613 | "node": ">=18" 614 | }, 615 | "funding": { 616 | "url": "https://github.com/sponsors/sindresorhus" 617 | } 618 | }, 619 | "node_modules/confbox": { 620 | "version": "0.1.8", 621 | "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", 622 | "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", 623 | "devOptional": true, 624 | "license": "MIT" 625 | }, 626 | "node_modules/cookie": { 627 | "version": "0.5.0", 628 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 629 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 630 | "devOptional": true, 631 | "license": "MIT", 632 | "engines": { 633 | "node": ">= 0.6" 634 | } 635 | }, 636 | "node_modules/cross-spawn": { 637 | "version": "7.0.3", 638 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 639 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 640 | "devOptional": true, 641 | "dependencies": { 642 | "path-key": "^3.1.0", 643 | "shebang-command": "^2.0.0", 644 | "which": "^2.0.1" 645 | }, 646 | "engines": { 647 | "node": ">= 8" 648 | } 649 | }, 650 | "node_modules/csstype": { 651 | "version": "3.1.3", 652 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 653 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 654 | "dev": true 655 | }, 656 | "node_modules/data-uri-to-buffer": { 657 | "version": "2.0.2", 658 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", 659 | "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", 660 | "devOptional": true, 661 | "license": "MIT" 662 | }, 663 | "node_modules/debug": { 664 | "version": "4.3.7", 665 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 666 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 667 | "devOptional": true, 668 | "license": "MIT", 669 | "dependencies": { 670 | "ms": "^2.1.3" 671 | }, 672 | "engines": { 673 | "node": ">=6.0" 674 | }, 675 | "peerDependenciesMeta": { 676 | "supports-color": { 677 | "optional": true 678 | } 679 | } 680 | }, 681 | "node_modules/defu": { 682 | "version": "6.1.4", 683 | "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", 684 | "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", 685 | "devOptional": true, 686 | "license": "MIT" 687 | }, 688 | "node_modules/esbuild": { 689 | "version": "0.21.5", 690 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 691 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 692 | "devOptional": true, 693 | "hasInstallScript": true, 694 | "bin": { 695 | "esbuild": "bin/esbuild" 696 | }, 697 | "engines": { 698 | "node": ">=12" 699 | }, 700 | "optionalDependencies": { 701 | "@esbuild/aix-ppc64": "0.21.5", 702 | "@esbuild/android-arm": "0.21.5", 703 | "@esbuild/android-arm64": "0.21.5", 704 | "@esbuild/android-x64": "0.21.5", 705 | "@esbuild/darwin-arm64": "0.21.5", 706 | "@esbuild/darwin-x64": "0.21.5", 707 | "@esbuild/freebsd-arm64": "0.21.5", 708 | "@esbuild/freebsd-x64": "0.21.5", 709 | "@esbuild/linux-arm": "0.21.5", 710 | "@esbuild/linux-arm64": "0.21.5", 711 | "@esbuild/linux-ia32": "0.21.5", 712 | "@esbuild/linux-loong64": "0.21.5", 713 | "@esbuild/linux-mips64el": "0.21.5", 714 | "@esbuild/linux-ppc64": "0.21.5", 715 | "@esbuild/linux-riscv64": "0.21.5", 716 | "@esbuild/linux-s390x": "0.21.5", 717 | "@esbuild/linux-x64": "0.21.5", 718 | "@esbuild/netbsd-x64": "0.21.5", 719 | "@esbuild/openbsd-x64": "0.21.5", 720 | "@esbuild/sunos-x64": "0.21.5", 721 | "@esbuild/win32-arm64": "0.21.5", 722 | "@esbuild/win32-ia32": "0.21.5", 723 | "@esbuild/win32-x64": "0.21.5" 724 | } 725 | }, 726 | "node_modules/event-target-polyfill": { 727 | "version": "0.0.4", 728 | "resolved": "https://registry.npmjs.org/event-target-polyfill/-/event-target-polyfill-0.0.4.tgz", 729 | "integrity": "sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==", 730 | "license": "MIT" 731 | }, 732 | "node_modules/execa": { 733 | "version": "8.0.1", 734 | "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", 735 | "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", 736 | "devOptional": true, 737 | "dependencies": { 738 | "cross-spawn": "^7.0.3", 739 | "get-stream": "^8.0.1", 740 | "human-signals": "^5.0.0", 741 | "is-stream": "^3.0.0", 742 | "merge-stream": "^2.0.0", 743 | "npm-run-path": "^5.1.0", 744 | "onetime": "^6.0.0", 745 | "signal-exit": "^4.1.0", 746 | "strip-final-newline": "^3.0.0" 747 | }, 748 | "engines": { 749 | "node": ">=16.17" 750 | }, 751 | "funding": { 752 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 753 | } 754 | }, 755 | "node_modules/exit-hook": { 756 | "version": "2.2.1", 757 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", 758 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", 759 | "devOptional": true, 760 | "license": "MIT", 761 | "engines": { 762 | "node": ">=6" 763 | }, 764 | "funding": { 765 | "url": "https://github.com/sponsors/sindresorhus" 766 | } 767 | }, 768 | "node_modules/fsevents": { 769 | "version": "2.3.3", 770 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 771 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 772 | "dev": true, 773 | "hasInstallScript": true, 774 | "optional": true, 775 | "os": [ 776 | "darwin" 777 | ], 778 | "engines": { 779 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 780 | } 781 | }, 782 | "node_modules/get-source": { 783 | "version": "2.0.12", 784 | "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", 785 | "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", 786 | "devOptional": true, 787 | "license": "Unlicense", 788 | "dependencies": { 789 | "data-uri-to-buffer": "^2.0.0", 790 | "source-map": "^0.6.1" 791 | } 792 | }, 793 | "node_modules/get-stream": { 794 | "version": "8.0.1", 795 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", 796 | "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", 797 | "devOptional": true, 798 | "engines": { 799 | "node": ">=16" 800 | }, 801 | "funding": { 802 | "url": "https://github.com/sponsors/sindresorhus" 803 | } 804 | }, 805 | "node_modules/glob-to-regexp": { 806 | "version": "0.4.1", 807 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 808 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 809 | "devOptional": true, 810 | "license": "BSD-2-Clause" 811 | }, 812 | "node_modules/human-signals": { 813 | "version": "5.0.0", 814 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", 815 | "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", 816 | "devOptional": true, 817 | "engines": { 818 | "node": ">=16.17.0" 819 | } 820 | }, 821 | "node_modules/is-docker": { 822 | "version": "3.0.0", 823 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", 824 | "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", 825 | "devOptional": true, 826 | "bin": { 827 | "is-docker": "cli.js" 828 | }, 829 | "engines": { 830 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 831 | }, 832 | "funding": { 833 | "url": "https://github.com/sponsors/sindresorhus" 834 | } 835 | }, 836 | "node_modules/is-inside-container": { 837 | "version": "1.0.0", 838 | "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", 839 | "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", 840 | "devOptional": true, 841 | "dependencies": { 842 | "is-docker": "^3.0.0" 843 | }, 844 | "bin": { 845 | "is-inside-container": "cli.js" 846 | }, 847 | "engines": { 848 | "node": ">=14.16" 849 | }, 850 | "funding": { 851 | "url": "https://github.com/sponsors/sindresorhus" 852 | } 853 | }, 854 | "node_modules/is-stream": { 855 | "version": "3.0.0", 856 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", 857 | "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", 858 | "devOptional": true, 859 | "engines": { 860 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 861 | }, 862 | "funding": { 863 | "url": "https://github.com/sponsors/sindresorhus" 864 | } 865 | }, 866 | "node_modules/is-wsl": { 867 | "version": "3.1.0", 868 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", 869 | "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", 870 | "devOptional": true, 871 | "dependencies": { 872 | "is-inside-container": "^1.0.0" 873 | }, 874 | "engines": { 875 | "node": ">=16" 876 | }, 877 | "funding": { 878 | "url": "https://github.com/sponsors/sindresorhus" 879 | } 880 | }, 881 | "node_modules/is64bit": { 882 | "version": "2.0.0", 883 | "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", 884 | "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", 885 | "devOptional": true, 886 | "dependencies": { 887 | "system-architecture": "^0.1.0" 888 | }, 889 | "engines": { 890 | "node": ">=18" 891 | }, 892 | "funding": { 893 | "url": "https://github.com/sponsors/sindresorhus" 894 | } 895 | }, 896 | "node_modules/isexe": { 897 | "version": "2.0.0", 898 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 899 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 900 | "devOptional": true 901 | }, 902 | "node_modules/merge-stream": { 903 | "version": "2.0.0", 904 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 905 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 906 | "devOptional": true 907 | }, 908 | "node_modules/mimic-fn": { 909 | "version": "4.0.0", 910 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", 911 | "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", 912 | "devOptional": true, 913 | "engines": { 914 | "node": ">=12" 915 | }, 916 | "funding": { 917 | "url": "https://github.com/sponsors/sindresorhus" 918 | } 919 | }, 920 | "node_modules/miniflare": { 921 | "version": "3.20240718.0", 922 | "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240718.0.tgz", 923 | "integrity": "sha512-TKgSeyqPBeT8TBLxbDJOKPWlq/wydoJRHjAyDdgxbw59N6wbP8JucK6AU1vXCfu21eKhrEin77ssXOpbfekzPA==", 924 | "devOptional": true, 925 | "license": "MIT", 926 | "dependencies": { 927 | "@cspotcode/source-map-support": "0.8.1", 928 | "acorn": "^8.8.0", 929 | "acorn-walk": "^8.2.0", 930 | "capnp-ts": "^0.7.0", 931 | "exit-hook": "^2.2.1", 932 | "glob-to-regexp": "^0.4.1", 933 | "stoppable": "^1.1.0", 934 | "undici": "^5.28.4", 935 | "workerd": "1.20240718.0", 936 | "ws": "^8.17.1", 937 | "youch": "^3.2.2", 938 | "zod": "^3.22.3" 939 | }, 940 | "bin": { 941 | "miniflare": "bootstrap.js" 942 | }, 943 | "engines": { 944 | "node": ">=16.13" 945 | } 946 | }, 947 | "node_modules/mlly": { 948 | "version": "1.7.4", 949 | "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", 950 | "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", 951 | "devOptional": true, 952 | "license": "MIT", 953 | "dependencies": { 954 | "acorn": "^8.14.0", 955 | "pathe": "^2.0.1", 956 | "pkg-types": "^1.3.0", 957 | "ufo": "^1.5.4" 958 | } 959 | }, 960 | "node_modules/mlly/node_modules/pathe": { 961 | "version": "2.0.3", 962 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 963 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 964 | "devOptional": true, 965 | "license": "MIT" 966 | }, 967 | "node_modules/ms": { 968 | "version": "2.1.3", 969 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 970 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 971 | "devOptional": true, 972 | "license": "MIT" 973 | }, 974 | "node_modules/mustache": { 975 | "version": "4.2.0", 976 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", 977 | "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", 978 | "devOptional": true, 979 | "license": "MIT", 980 | "bin": { 981 | "mustache": "bin/mustache" 982 | } 983 | }, 984 | "node_modules/npm-run-path": { 985 | "version": "5.3.0", 986 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", 987 | "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", 988 | "devOptional": true, 989 | "dependencies": { 990 | "path-key": "^4.0.0" 991 | }, 992 | "engines": { 993 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 994 | }, 995 | "funding": { 996 | "url": "https://github.com/sponsors/sindresorhus" 997 | } 998 | }, 999 | "node_modules/npm-run-path/node_modules/path-key": { 1000 | "version": "4.0.0", 1001 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", 1002 | "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", 1003 | "devOptional": true, 1004 | "engines": { 1005 | "node": ">=12" 1006 | }, 1007 | "funding": { 1008 | "url": "https://github.com/sponsors/sindresorhus" 1009 | } 1010 | }, 1011 | "node_modules/ohash": { 1012 | "version": "1.1.6", 1013 | "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.6.tgz", 1014 | "integrity": "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==", 1015 | "devOptional": true, 1016 | "license": "MIT" 1017 | }, 1018 | "node_modules/onetime": { 1019 | "version": "6.0.0", 1020 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", 1021 | "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", 1022 | "devOptional": true, 1023 | "dependencies": { 1024 | "mimic-fn": "^4.0.0" 1025 | }, 1026 | "engines": { 1027 | "node": ">=12" 1028 | }, 1029 | "funding": { 1030 | "url": "https://github.com/sponsors/sindresorhus" 1031 | } 1032 | }, 1033 | "node_modules/partykit": { 1034 | "version": "0.0.114", 1035 | "resolved": "https://registry.npmjs.org/partykit/-/partykit-0.0.114.tgz", 1036 | "integrity": "sha512-ZKXNA/1lCWtqopQ7+JMwjuiNI5/IwwB2+ohjF7CKj1hdYvbZPg+5CeSGEac/Eu0MLDTdmxXYKtwFSTXijxBy7A==", 1037 | "devOptional": true, 1038 | "license": "MIT", 1039 | "dependencies": { 1040 | "@cloudflare/workers-types": "4.20240718.0", 1041 | "clipboardy": "4.0.0", 1042 | "esbuild": "0.21.5", 1043 | "miniflare": "3.20240718.0", 1044 | "ts-dedent": "^2.2.0", 1045 | "unenv": "2.0.0-rc.0", 1046 | "yoga-wasm-web": "0.3.3" 1047 | }, 1048 | "bin": { 1049 | "partykit": "dist/bin.mjs" 1050 | }, 1051 | "optionalDependencies": { 1052 | "fsevents": "2.3.3" 1053 | } 1054 | }, 1055 | "node_modules/partykit/node_modules/@cloudflare/workers-types": { 1056 | "version": "4.20240718.0", 1057 | "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240718.0.tgz", 1058 | "integrity": "sha512-7RqxXIM9HyhjfZ9ztXjITuc7mL0w4s+zXgypqKmMuvuObC3DgXutJ3bOYbQ+Ss5QbywrzWSNMlmGdL/ldg/yZg==", 1059 | "devOptional": true, 1060 | "license": "MIT OR Apache-2.0" 1061 | }, 1062 | "node_modules/partysocket": { 1063 | "version": "1.1.3", 1064 | "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-1.1.3.tgz", 1065 | "integrity": "sha512-87Jd/nqPoWnVfzHE6Z12WLWTJ+TAgxs0b7i2S163HfQSrVDUK5tW/FC64T5N8L5ss+gqF+EV0BwjZMWggMY3UA==", 1066 | "license": "ISC", 1067 | "dependencies": { 1068 | "event-target-polyfill": "^0.0.4" 1069 | } 1070 | }, 1071 | "node_modules/path-key": { 1072 | "version": "3.1.1", 1073 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1074 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1075 | "devOptional": true, 1076 | "engines": { 1077 | "node": ">=8" 1078 | } 1079 | }, 1080 | "node_modules/pathe": { 1081 | "version": "1.1.2", 1082 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", 1083 | "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", 1084 | "devOptional": true, 1085 | "license": "MIT" 1086 | }, 1087 | "node_modules/pkg-types": { 1088 | "version": "1.3.1", 1089 | "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", 1090 | "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", 1091 | "devOptional": true, 1092 | "license": "MIT", 1093 | "dependencies": { 1094 | "confbox": "^0.1.8", 1095 | "mlly": "^1.7.4", 1096 | "pathe": "^2.0.1" 1097 | } 1098 | }, 1099 | "node_modules/pkg-types/node_modules/pathe": { 1100 | "version": "2.0.3", 1101 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 1102 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 1103 | "devOptional": true, 1104 | "license": "MIT" 1105 | }, 1106 | "node_modules/printable-characters": { 1107 | "version": "1.0.42", 1108 | "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", 1109 | "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", 1110 | "devOptional": true, 1111 | "license": "Unlicense" 1112 | }, 1113 | "node_modules/react": { 1114 | "version": "19.1.0", 1115 | "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", 1116 | "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", 1117 | "license": "MIT", 1118 | "engines": { 1119 | "node": ">=0.10.0" 1120 | } 1121 | }, 1122 | "node_modules/react-dom": { 1123 | "version": "19.1.0", 1124 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", 1125 | "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", 1126 | "license": "MIT", 1127 | "dependencies": { 1128 | "scheduler": "^0.26.0" 1129 | }, 1130 | "peerDependencies": { 1131 | "react": "^19.1.0" 1132 | } 1133 | }, 1134 | "node_modules/scheduler": { 1135 | "version": "0.26.0", 1136 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", 1137 | "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", 1138 | "license": "MIT" 1139 | }, 1140 | "node_modules/shebang-command": { 1141 | "version": "2.0.0", 1142 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1143 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1144 | "devOptional": true, 1145 | "dependencies": { 1146 | "shebang-regex": "^3.0.0" 1147 | }, 1148 | "engines": { 1149 | "node": ">=8" 1150 | } 1151 | }, 1152 | "node_modules/shebang-regex": { 1153 | "version": "3.0.0", 1154 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1155 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1156 | "devOptional": true, 1157 | "engines": { 1158 | "node": ">=8" 1159 | } 1160 | }, 1161 | "node_modules/signal-exit": { 1162 | "version": "4.1.0", 1163 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1164 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1165 | "devOptional": true, 1166 | "engines": { 1167 | "node": ">=14" 1168 | }, 1169 | "funding": { 1170 | "url": "https://github.com/sponsors/isaacs" 1171 | } 1172 | }, 1173 | "node_modules/source-map": { 1174 | "version": "0.6.1", 1175 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1176 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1177 | "devOptional": true, 1178 | "license": "BSD-3-Clause", 1179 | "engines": { 1180 | "node": ">=0.10.0" 1181 | } 1182 | }, 1183 | "node_modules/stacktracey": { 1184 | "version": "2.1.8", 1185 | "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", 1186 | "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", 1187 | "devOptional": true, 1188 | "license": "Unlicense", 1189 | "dependencies": { 1190 | "as-table": "^1.0.36", 1191 | "get-source": "^2.0.12" 1192 | } 1193 | }, 1194 | "node_modules/stoppable": { 1195 | "version": "1.1.0", 1196 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 1197 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 1198 | "devOptional": true, 1199 | "license": "MIT", 1200 | "engines": { 1201 | "node": ">=4", 1202 | "npm": ">=6" 1203 | } 1204 | }, 1205 | "node_modules/strip-final-newline": { 1206 | "version": "3.0.0", 1207 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", 1208 | "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", 1209 | "devOptional": true, 1210 | "engines": { 1211 | "node": ">=12" 1212 | }, 1213 | "funding": { 1214 | "url": "https://github.com/sponsors/sindresorhus" 1215 | } 1216 | }, 1217 | "node_modules/system-architecture": { 1218 | "version": "0.1.0", 1219 | "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", 1220 | "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", 1221 | "devOptional": true, 1222 | "engines": { 1223 | "node": ">=18" 1224 | }, 1225 | "funding": { 1226 | "url": "https://github.com/sponsors/sindresorhus" 1227 | } 1228 | }, 1229 | "node_modules/tinybase": { 1230 | "version": "6.0.0", 1231 | "resolved": "https://registry.npmjs.org/tinybase/-/tinybase-6.0.0.tgz", 1232 | "integrity": "sha512-wjIiS8iNPS/DNvFvlYEAOrZq7+tcAoFn5+xjW8ZUcCR11DafP1aJ3n1tDRTI9Nfq+Vz5Axj9kOmUTvuv2lyAVA==", 1233 | "license": "MIT", 1234 | "peerDependencies": { 1235 | "@automerge/automerge-repo": "^1.2.1", 1236 | "@cloudflare/workers-types": "^4.20250327.0", 1237 | "@electric-sql/pglite": "^0.2.17", 1238 | "@libsql/client": "^0.15.1", 1239 | "@powersync/common": "^1.26.0", 1240 | "@sqlite.org/sqlite-wasm": "^3.49.1-build2", 1241 | "@vlcn.io/crsqlite-wasm": "^0.16.0", 1242 | "electric-sql": "^0.12.1", 1243 | "expo": "^52.0.4", 1244 | "expo-sqlite": "^15.1.3", 1245 | "partykit": "^0.0.114", 1246 | "partysocket": "^1.1.3", 1247 | "postgres": "^3.4.5", 1248 | "react": "^19.0.0", 1249 | "react-dom": "^19.0.0", 1250 | "sqlite3": "^5.1.7", 1251 | "ws": "^8.18.1", 1252 | "yjs": "^13.6.24" 1253 | }, 1254 | "peerDependenciesMeta": { 1255 | "@automerge/automerge-repo": { 1256 | "optional": true 1257 | }, 1258 | "@cloudflare/workers-types": { 1259 | "optional": true 1260 | }, 1261 | "@electric-sql/pglite": { 1262 | "optional": true 1263 | }, 1264 | "@libsql/client": { 1265 | "optional": true 1266 | }, 1267 | "@powersync/common": { 1268 | "optional": true 1269 | }, 1270 | "@sqlite.org/sqlite-wasm": { 1271 | "optional": true 1272 | }, 1273 | "@vlcn.io/crsqlite-wasm": { 1274 | "optional": true 1275 | }, 1276 | "electric-sql": { 1277 | "optional": true 1278 | }, 1279 | "expo": { 1280 | "optional": true 1281 | }, 1282 | "expo-sqlite": { 1283 | "optional": true 1284 | }, 1285 | "partykit": { 1286 | "optional": true 1287 | }, 1288 | "partysocket": { 1289 | "optional": true 1290 | }, 1291 | "postgres": { 1292 | "optional": true 1293 | }, 1294 | "prettier": { 1295 | "optional": true 1296 | }, 1297 | "react": { 1298 | "optional": true 1299 | }, 1300 | "react-dom": { 1301 | "optional": true 1302 | }, 1303 | "sqlite3": { 1304 | "optional": true 1305 | }, 1306 | "ws": { 1307 | "optional": true 1308 | }, 1309 | "yjs": { 1310 | "optional": true 1311 | } 1312 | } 1313 | }, 1314 | "node_modules/ts-dedent": { 1315 | "version": "2.2.0", 1316 | "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", 1317 | "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", 1318 | "devOptional": true, 1319 | "license": "MIT", 1320 | "engines": { 1321 | "node": ">=6.10" 1322 | } 1323 | }, 1324 | "node_modules/tslib": { 1325 | "version": "2.7.0", 1326 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", 1327 | "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", 1328 | "devOptional": true, 1329 | "license": "0BSD" 1330 | }, 1331 | "node_modules/typescript": { 1332 | "version": "5.8.2", 1333 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 1334 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 1335 | "dev": true, 1336 | "license": "Apache-2.0", 1337 | "bin": { 1338 | "tsc": "bin/tsc", 1339 | "tsserver": "bin/tsserver" 1340 | }, 1341 | "engines": { 1342 | "node": ">=14.17" 1343 | } 1344 | }, 1345 | "node_modules/ufo": { 1346 | "version": "1.5.4", 1347 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", 1348 | "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", 1349 | "devOptional": true, 1350 | "license": "MIT" 1351 | }, 1352 | "node_modules/undici": { 1353 | "version": "5.28.4", 1354 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", 1355 | "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", 1356 | "devOptional": true, 1357 | "license": "MIT", 1358 | "dependencies": { 1359 | "@fastify/busboy": "^2.0.0" 1360 | }, 1361 | "engines": { 1362 | "node": ">=14.0" 1363 | } 1364 | }, 1365 | "node_modules/unenv": { 1366 | "version": "2.0.0-rc.0", 1367 | "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.0.tgz", 1368 | "integrity": "sha512-H0kl2w8jFL/FAk0xvjVing4bS3jd//mbg1QChDnn58l9Sc5RtduaKmLAL8n+eBw5jJo8ZjYV7CrEGage5LAOZQ==", 1369 | "devOptional": true, 1370 | "license": "MIT", 1371 | "dependencies": { 1372 | "defu": "^6.1.4", 1373 | "mlly": "^1.7.4", 1374 | "ohash": "^1.1.4", 1375 | "pathe": "^1.1.2", 1376 | "ufo": "^1.5.4" 1377 | } 1378 | }, 1379 | "node_modules/which": { 1380 | "version": "2.0.2", 1381 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1382 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1383 | "devOptional": true, 1384 | "dependencies": { 1385 | "isexe": "^2.0.0" 1386 | }, 1387 | "bin": { 1388 | "node-which": "bin/node-which" 1389 | }, 1390 | "engines": { 1391 | "node": ">= 8" 1392 | } 1393 | }, 1394 | "node_modules/workerd": { 1395 | "version": "1.20240718.0", 1396 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240718.0.tgz", 1397 | "integrity": "sha512-w7lOLRy0XecQTg/ujTLWBiJJuoQvzB3CdQ6/8Wgex3QxFhV9Pbnh3UbwIuUfMw3OCCPQc4o7y+1P+mISAgp6yg==", 1398 | "devOptional": true, 1399 | "hasInstallScript": true, 1400 | "license": "Apache-2.0", 1401 | "bin": { 1402 | "workerd": "bin/workerd" 1403 | }, 1404 | "engines": { 1405 | "node": ">=16" 1406 | }, 1407 | "optionalDependencies": { 1408 | "@cloudflare/workerd-darwin-64": "1.20240718.0", 1409 | "@cloudflare/workerd-darwin-arm64": "1.20240718.0", 1410 | "@cloudflare/workerd-linux-64": "1.20240718.0", 1411 | "@cloudflare/workerd-linux-arm64": "1.20240718.0", 1412 | "@cloudflare/workerd-windows-64": "1.20240718.0" 1413 | } 1414 | }, 1415 | "node_modules/ws": { 1416 | "version": "8.18.1", 1417 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", 1418 | "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", 1419 | "devOptional": true, 1420 | "license": "MIT", 1421 | "engines": { 1422 | "node": ">=10.0.0" 1423 | }, 1424 | "peerDependencies": { 1425 | "bufferutil": "^4.0.1", 1426 | "utf-8-validate": ">=5.0.2" 1427 | }, 1428 | "peerDependenciesMeta": { 1429 | "bufferutil": { 1430 | "optional": true 1431 | }, 1432 | "utf-8-validate": { 1433 | "optional": true 1434 | } 1435 | } 1436 | }, 1437 | "node_modules/yoga-wasm-web": { 1438 | "version": "0.3.3", 1439 | "resolved": "https://registry.npmjs.org/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz", 1440 | "integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==", 1441 | "devOptional": true 1442 | }, 1443 | "node_modules/youch": { 1444 | "version": "3.3.3", 1445 | "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz", 1446 | "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==", 1447 | "devOptional": true, 1448 | "license": "MIT", 1449 | "dependencies": { 1450 | "cookie": "^0.5.0", 1451 | "mustache": "^4.2.0", 1452 | "stacktracey": "^2.1.8" 1453 | } 1454 | }, 1455 | "node_modules/zod": { 1456 | "version": "3.23.8", 1457 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", 1458 | "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", 1459 | "devOptional": true, 1460 | "license": "MIT", 1461 | "funding": { 1462 | "url": "https://github.com/sponsors/colinhacks" 1463 | } 1464 | } 1465 | } 1466 | } 1467 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tinybase-ts-react-partykit", 3 | "version": "1.0.1", 4 | "scripts": { 5 | "dev": "partykit dev", 6 | "deploy": "partykit deploy" 7 | }, 8 | "dependencies": { 9 | "partysocket": "^1.1.3", 10 | "react": "^19.1.0", 11 | "react-dom": "^19.1.0", 12 | "tinybase": "^6.0.0" 13 | }, 14 | "devDependencies": { 15 | "@types/react": "^19.0.12", 16 | "@types/react-dom": "^19.0.4", 17 | "partykit": "^0.0.114", 18 | "typescript": "^5.8.2" 19 | } 20 | } -------------------------------------------------------------------------------- /partykit.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tinybase-ts-react-partykit", 3 | "main": "src/server/index.ts", 4 | "serve": { 5 | "path": "public", 6 | "build": "src/client/index.tsx" 7 | } 8 | } -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 8 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | A TinyBase App 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/client/App.tsx: -------------------------------------------------------------------------------- 1 | import React, { StrictMode } from 'react'; 2 | import PartySocket from 'partysocket'; 3 | import { createStore } from 'tinybase'; 4 | import { createPartyKitPersister } from 'tinybase/persisters/persister-partykit-client'; 5 | import { 6 | Provider, 7 | useCreatePersister, 8 | useCreateStore, 9 | } from 'tinybase/ui-react'; 10 | import { 11 | SortedTableInHtmlTable, 12 | ValuesInHtmlTable, 13 | } from 'tinybase/ui-react-dom'; 14 | import { Inspector } from 'tinybase/ui-react-inspector'; 15 | import { Buttons } from './Buttons'; 16 | import { useRoomId } from './hooks'; 17 | import { Share } from './Share'; 18 | 19 | declare const PARTYKIT_HOST: string; 20 | 21 | export const App = () => { 22 | const store = useCreateStore(() => { 23 | // Create the TinyBase Store and initialize the Store's data 24 | return createStore() 25 | .setValue('counter', 0) 26 | .setRow('pets', '0', { name: 'fido', species: 'dog' }) 27 | .setTable('species', { 28 | dog: { price: 5 }, 29 | cat: { price: 4 }, 30 | fish: { price: 2 }, 31 | worm: { price: 1 }, 32 | parrot: { price: 3 }, 33 | }); 34 | }); 35 | 36 | const [roomId, createRoomId] = useRoomId(); 37 | useCreatePersister( 38 | store, 39 | (store) => { 40 | if (roomId) { 41 | return createPartyKitPersister( 42 | store, 43 | new PartySocket({ host: PARTYKIT_HOST, room: roomId }), 44 | location.protocol.slice(0, -1) as 'http' | 'https' 45 | ); 46 | } 47 | }, 48 | [roomId], 49 | async (persister) => { 50 | if (persister) { 51 | await persister.startAutoSave(); 52 | await persister.startAutoLoad(); 53 | } 54 | } 55 | ); 56 | 57 | return ( 58 | 59 | 60 |
61 |

62 | 63 | TinyBase & PartyKit 64 |

65 |
66 | 67 | 68 |
69 |

Values

70 | 71 |
72 |
73 |

Pets Table

74 | 82 |
83 | 84 |
85 |
86 | ); 87 | }; 88 | -------------------------------------------------------------------------------- /src/client/Buttons.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { ValueOrUndefined } from 'tinybase'; 3 | import { useAddRowCallback, useSetValueCallback } from 'tinybase/ui-react'; 4 | 5 | // Convenience function for generating a random integer 6 | const getRandom = (max = 100) => Math.floor(Math.random() * max); 7 | 8 | export const Buttons = () => { 9 | // Attach events to the buttons to mutate the data in the TinyBase Store 10 | const handleCount = useSetValueCallback( 11 | 'counter', 12 | () => (value: ValueOrUndefined) => ((value ?? 0) as number) + 1 13 | ); 14 | const handleRandom = useSetValueCallback('random', () => getRandom()); 15 | const handleAddPet = useAddRowCallback('pets', (_, store) => ({ 16 | name: ['fido', 'felix', 'bubbles', 'lowly', 'polly'][getRandom(5)], 17 | species: store.getRowIds('species')[getRandom(5)], 18 | })); 19 | 20 | return ( 21 |
22 | 23 | 24 | 25 |
26 | ); 27 | }; 28 | -------------------------------------------------------------------------------- /src/client/Share.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | type Props = { roomId: string; createRoomId: () => void }; 4 | 5 | export const Share = ({ roomId, createRoomId }: Props) => ( 6 |
7 | {roomId ? ( 8 | 9 | 🔗 Share link 10 | 11 | ) : ( 12 | 🎈 Start sharing 13 | )} 14 |
15 | ); 16 | -------------------------------------------------------------------------------- /src/client/hooks.ts: -------------------------------------------------------------------------------- 1 | import { useCallback, useState } from 'react'; 2 | 3 | export const useRoomId = (): [roomId: string, createRoomId: () => void] => { 4 | const [roomId, setRoomId] = useState(parent.location.search.substring(1)); 5 | return [ 6 | roomId, 7 | useCallback(() => { 8 | const newRoomId = ('' + Math.random()).substring(2, 12); 9 | parent.history.replaceState(null, '', '?' + newRoomId); 10 | setRoomId(newRoomId); 11 | }, []), 12 | ]; 13 | }; 14 | -------------------------------------------------------------------------------- /src/client/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | color: #bbb; 3 | background: #111; 4 | font-family: 'Inter', sans-serif; 5 | user-select: none; 6 | } 7 | 8 | #app { 9 | max-width: 40rem; 10 | margin: 2rem auto; 11 | display: grid; 12 | grid-template-columns: 1fr; 13 | column-gap: 2rem; 14 | align-items: start; 15 | row-gap: 1rem; 16 | } 17 | 18 | h1 { 19 | font-weight: 600; 20 | img { 21 | margin-right: 1rem; 22 | height: 2.5rem; 23 | vertical-align: text-bottom; 24 | } 25 | } 26 | 27 | h2 { 28 | text-align: center; 29 | font-weight: 800; 30 | font-size: 1.3rem; 31 | margin: 1rem 0 0; 32 | } 33 | 34 | a { 35 | color: unset; 36 | } 37 | 38 | #buttons { 39 | border: solid #666; 40 | border-width: 1px 0; 41 | text-align: center; 42 | } 43 | 44 | #buttons button { 45 | border: 1px solid #666; 46 | border-radius: 0.25rem; 47 | padding: 0.5rem 1rem; 48 | background: #222; 49 | color: #fff; 50 | font-family: inherit; 51 | font-weight: 800; 52 | font-size: 0.8rem; 53 | width: 10rem; 54 | margin: 1rem; 55 | } 56 | #buttons button:hover { 57 | border-color: #d81b60; 58 | } 59 | 60 | table { 61 | border-collapse: collapse; 62 | font-size: inherit; 63 | line-height: inherit; 64 | margin-top: 0.5rem; 65 | table-layout: fixed; 66 | width: 100%; 67 | margin-bottom: 2rem; 68 | caption-side: bottom; 69 | } 70 | table caption { 71 | text-align: left; 72 | button { 73 | border: 0; 74 | margin-right: 0.25rem; 75 | } 76 | } 77 | table caption button { 78 | line-height: 0.7rem; 79 | margin: 0 0.25rem 0 0; 80 | vertical-align: middle; 81 | } 82 | th, 83 | td { 84 | padding: 0.25rem 0.5rem 0.25rem 0; 85 | text-align: left; 86 | } 87 | thead th, 88 | thead td { 89 | border: solid #999; 90 | border-width: 1px 0; 91 | } 92 | tbody th, 93 | tbody td { 94 | border-bottom: 1px solid #333; 95 | } 96 | 97 | table.sortedTable thead th { 98 | cursor: pointer; 99 | } 100 | 101 | @media (min-width: 40rem) { 102 | #app { 103 | grid-template-columns: 1fr 1fr; 104 | } 105 | header, 106 | #buttons { 107 | grid-column: span 2; 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /src/client/index.tsx: -------------------------------------------------------------------------------- 1 | import './index.css'; 2 | import React from 'react'; 3 | import ReactDOM from 'react-dom/client'; 4 | import { App } from './App'; 5 | 6 | addEventListener('load', () => 7 | ReactDOM.createRoot(document.getElementById('app')!).render() 8 | ); 9 | -------------------------------------------------------------------------------- /src/server/index.ts: -------------------------------------------------------------------------------- 1 | import { TinyBasePartyKitServer } from 'tinybase/persisters/persister-partykit-server'; 2 | 3 | export default class extends TinyBasePartyKitServer {} 4 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "alwaysStrict": true, 4 | "noImplicitAny": true, 5 | "noImplicitThis": true, 6 | "strict": true, 7 | "removeComments": true, 8 | "module": "es2020", 9 | "target": "es2020", 10 | "jsx": "react", 11 | "moduleResolution": "node", 12 | "allowSyntheticDefaultImports": true 13 | } 14 | } 15 | --------------------------------------------------------------------------------