server for refapp and refbot and other stuff
0

Configure Feed

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

Set up TypeScript build tooling

alpine (Jul 14, 2026, 11:11 PM +0200) 56de8ff8 53c8538f

+601 -6
+1
README.md
··· 11 11 ## Stack 12 12 13 13 - Node.js 24+ ES modules 14 + - TypeScript 5.6+ 14 15 - Express 15 16 - `ws` WebSocket server 16 17 - Mongoose / MongoDB
+2 -1
docs/plan.md
··· 80 80 81 81 ## API conventions 82 82 83 + - **Language:** TypeScript with strict mode enabled; source in `src/`, build output in `dist/`. 83 84 - **Versioning:** all routes prefixed with `/v1/`. 84 85 - **Error envelope:** `{ "error": { "code": "string", "message": "string" } }`. 85 86 - **Idempotency:** clients may send `Idempotency-Key: <uuid>` on mutating requests; refserver stores processed keys for 24 hours and replays the same response. ··· 285 286 286 287 Branch-and-cutover approach (match state can't safely have two writers at once): 287 288 288 - 1. **Foundation** — Express + WS + models + DB connection + OpenAPI skeleton + health endpoint 289 + 1. **Foundation** — TypeScript setup + Express + WS + models + DB connection + OpenAPI skeleton + health endpoint 289 290 2. **Pure utilities** — port deterministic helpers with unit tests 290 291 3. **External clients** — port `startgg.js`, `spinshare.js`, `spindata.js` 291 292 4. **Match engine** — port `state/match.js` + lifecycle flows without Discord; add audit logging
+567
package-lock.json
··· 1 + { 2 + "name": "refserver", 3 + "version": "0.0.0", 4 + "lockfileVersion": 3, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "refserver", 9 + "version": "0.0.0", 10 + "license": "ISC", 11 + "devDependencies": { 12 + "@types/node": "^22.0.0", 13 + "tsx": "^4.0.0", 14 + "typescript": "^5.6.0" 15 + } 16 + }, 17 + "node_modules/@esbuild/aix-ppc64": { 18 + "version": "0.28.1", 19 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", 20 + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", 21 + "cpu": [ 22 + "ppc64" 23 + ], 24 + "dev": true, 25 + "license": "MIT", 26 + "optional": true, 27 + "os": [ 28 + "aix" 29 + ], 30 + "engines": { 31 + "node": ">=18" 32 + } 33 + }, 34 + "node_modules/@esbuild/android-arm": { 35 + "version": "0.28.1", 36 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", 37 + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", 38 + "cpu": [ 39 + "arm" 40 + ], 41 + "dev": true, 42 + "license": "MIT", 43 + "optional": true, 44 + "os": [ 45 + "android" 46 + ], 47 + "engines": { 48 + "node": ">=18" 49 + } 50 + }, 51 + "node_modules/@esbuild/android-arm64": { 52 + "version": "0.28.1", 53 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", 54 + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", 55 + "cpu": [ 56 + "arm64" 57 + ], 58 + "dev": true, 59 + "license": "MIT", 60 + "optional": true, 61 + "os": [ 62 + "android" 63 + ], 64 + "engines": { 65 + "node": ">=18" 66 + } 67 + }, 68 + "node_modules/@esbuild/android-x64": { 69 + "version": "0.28.1", 70 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", 71 + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", 72 + "cpu": [ 73 + "x64" 74 + ], 75 + "dev": true, 76 + "license": "MIT", 77 + "optional": true, 78 + "os": [ 79 + "android" 80 + ], 81 + "engines": { 82 + "node": ">=18" 83 + } 84 + }, 85 + "node_modules/@esbuild/darwin-arm64": { 86 + "version": "0.28.1", 87 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", 88 + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", 89 + "cpu": [ 90 + "arm64" 91 + ], 92 + "dev": true, 93 + "license": "MIT", 94 + "optional": true, 95 + "os": [ 96 + "darwin" 97 + ], 98 + "engines": { 99 + "node": ">=18" 100 + } 101 + }, 102 + "node_modules/@esbuild/darwin-x64": { 103 + "version": "0.28.1", 104 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", 105 + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", 106 + "cpu": [ 107 + "x64" 108 + ], 109 + "dev": true, 110 + "license": "MIT", 111 + "optional": true, 112 + "os": [ 113 + "darwin" 114 + ], 115 + "engines": { 116 + "node": ">=18" 117 + } 118 + }, 119 + "node_modules/@esbuild/freebsd-arm64": { 120 + "version": "0.28.1", 121 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", 122 + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", 123 + "cpu": [ 124 + "arm64" 125 + ], 126 + "dev": true, 127 + "license": "MIT", 128 + "optional": true, 129 + "os": [ 130 + "freebsd" 131 + ], 132 + "engines": { 133 + "node": ">=18" 134 + } 135 + }, 136 + "node_modules/@esbuild/freebsd-x64": { 137 + "version": "0.28.1", 138 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", 139 + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", 140 + "cpu": [ 141 + "x64" 142 + ], 143 + "dev": true, 144 + "license": "MIT", 145 + "optional": true, 146 + "os": [ 147 + "freebsd" 148 + ], 149 + "engines": { 150 + "node": ">=18" 151 + } 152 + }, 153 + "node_modules/@esbuild/linux-arm": { 154 + "version": "0.28.1", 155 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", 156 + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", 157 + "cpu": [ 158 + "arm" 159 + ], 160 + "dev": true, 161 + "license": "MIT", 162 + "optional": true, 163 + "os": [ 164 + "linux" 165 + ], 166 + "engines": { 167 + "node": ">=18" 168 + } 169 + }, 170 + "node_modules/@esbuild/linux-arm64": { 171 + "version": "0.28.1", 172 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", 173 + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", 174 + "cpu": [ 175 + "arm64" 176 + ], 177 + "dev": true, 178 + "license": "MIT", 179 + "optional": true, 180 + "os": [ 181 + "linux" 182 + ], 183 + "engines": { 184 + "node": ">=18" 185 + } 186 + }, 187 + "node_modules/@esbuild/linux-ia32": { 188 + "version": "0.28.1", 189 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", 190 + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", 191 + "cpu": [ 192 + "ia32" 193 + ], 194 + "dev": true, 195 + "license": "MIT", 196 + "optional": true, 197 + "os": [ 198 + "linux" 199 + ], 200 + "engines": { 201 + "node": ">=18" 202 + } 203 + }, 204 + "node_modules/@esbuild/linux-loong64": { 205 + "version": "0.28.1", 206 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", 207 + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", 208 + "cpu": [ 209 + "loong64" 210 + ], 211 + "dev": true, 212 + "license": "MIT", 213 + "optional": true, 214 + "os": [ 215 + "linux" 216 + ], 217 + "engines": { 218 + "node": ">=18" 219 + } 220 + }, 221 + "node_modules/@esbuild/linux-mips64el": { 222 + "version": "0.28.1", 223 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", 224 + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", 225 + "cpu": [ 226 + "mips64el" 227 + ], 228 + "dev": true, 229 + "license": "MIT", 230 + "optional": true, 231 + "os": [ 232 + "linux" 233 + ], 234 + "engines": { 235 + "node": ">=18" 236 + } 237 + }, 238 + "node_modules/@esbuild/linux-ppc64": { 239 + "version": "0.28.1", 240 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", 241 + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", 242 + "cpu": [ 243 + "ppc64" 244 + ], 245 + "dev": true, 246 + "license": "MIT", 247 + "optional": true, 248 + "os": [ 249 + "linux" 250 + ], 251 + "engines": { 252 + "node": ">=18" 253 + } 254 + }, 255 + "node_modules/@esbuild/linux-riscv64": { 256 + "version": "0.28.1", 257 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", 258 + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", 259 + "cpu": [ 260 + "riscv64" 261 + ], 262 + "dev": true, 263 + "license": "MIT", 264 + "optional": true, 265 + "os": [ 266 + "linux" 267 + ], 268 + "engines": { 269 + "node": ">=18" 270 + } 271 + }, 272 + "node_modules/@esbuild/linux-s390x": { 273 + "version": "0.28.1", 274 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", 275 + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", 276 + "cpu": [ 277 + "s390x" 278 + ], 279 + "dev": true, 280 + "license": "MIT", 281 + "optional": true, 282 + "os": [ 283 + "linux" 284 + ], 285 + "engines": { 286 + "node": ">=18" 287 + } 288 + }, 289 + "node_modules/@esbuild/linux-x64": { 290 + "version": "0.28.1", 291 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", 292 + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", 293 + "cpu": [ 294 + "x64" 295 + ], 296 + "dev": true, 297 + "license": "MIT", 298 + "optional": true, 299 + "os": [ 300 + "linux" 301 + ], 302 + "engines": { 303 + "node": ">=18" 304 + } 305 + }, 306 + "node_modules/@esbuild/netbsd-arm64": { 307 + "version": "0.28.1", 308 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", 309 + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", 310 + "cpu": [ 311 + "arm64" 312 + ], 313 + "dev": true, 314 + "license": "MIT", 315 + "optional": true, 316 + "os": [ 317 + "netbsd" 318 + ], 319 + "engines": { 320 + "node": ">=18" 321 + } 322 + }, 323 + "node_modules/@esbuild/netbsd-x64": { 324 + "version": "0.28.1", 325 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", 326 + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", 327 + "cpu": [ 328 + "x64" 329 + ], 330 + "dev": true, 331 + "license": "MIT", 332 + "optional": true, 333 + "os": [ 334 + "netbsd" 335 + ], 336 + "engines": { 337 + "node": ">=18" 338 + } 339 + }, 340 + "node_modules/@esbuild/openbsd-arm64": { 341 + "version": "0.28.1", 342 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", 343 + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", 344 + "cpu": [ 345 + "arm64" 346 + ], 347 + "dev": true, 348 + "license": "MIT", 349 + "optional": true, 350 + "os": [ 351 + "openbsd" 352 + ], 353 + "engines": { 354 + "node": ">=18" 355 + } 356 + }, 357 + "node_modules/@esbuild/openbsd-x64": { 358 + "version": "0.28.1", 359 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", 360 + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", 361 + "cpu": [ 362 + "x64" 363 + ], 364 + "dev": true, 365 + "license": "MIT", 366 + "optional": true, 367 + "os": [ 368 + "openbsd" 369 + ], 370 + "engines": { 371 + "node": ">=18" 372 + } 373 + }, 374 + "node_modules/@esbuild/openharmony-arm64": { 375 + "version": "0.28.1", 376 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", 377 + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", 378 + "cpu": [ 379 + "arm64" 380 + ], 381 + "dev": true, 382 + "license": "MIT", 383 + "optional": true, 384 + "os": [ 385 + "openharmony" 386 + ], 387 + "engines": { 388 + "node": ">=18" 389 + } 390 + }, 391 + "node_modules/@esbuild/sunos-x64": { 392 + "version": "0.28.1", 393 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", 394 + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", 395 + "cpu": [ 396 + "x64" 397 + ], 398 + "dev": true, 399 + "license": "MIT", 400 + "optional": true, 401 + "os": [ 402 + "sunos" 403 + ], 404 + "engines": { 405 + "node": ">=18" 406 + } 407 + }, 408 + "node_modules/@esbuild/win32-arm64": { 409 + "version": "0.28.1", 410 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", 411 + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", 412 + "cpu": [ 413 + "arm64" 414 + ], 415 + "dev": true, 416 + "license": "MIT", 417 + "optional": true, 418 + "os": [ 419 + "win32" 420 + ], 421 + "engines": { 422 + "node": ">=18" 423 + } 424 + }, 425 + "node_modules/@esbuild/win32-ia32": { 426 + "version": "0.28.1", 427 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", 428 + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", 429 + "cpu": [ 430 + "ia32" 431 + ], 432 + "dev": true, 433 + "license": "MIT", 434 + "optional": true, 435 + "os": [ 436 + "win32" 437 + ], 438 + "engines": { 439 + "node": ">=18" 440 + } 441 + }, 442 + "node_modules/@esbuild/win32-x64": { 443 + "version": "0.28.1", 444 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", 445 + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", 446 + "cpu": [ 447 + "x64" 448 + ], 449 + "dev": true, 450 + "license": "MIT", 451 + "optional": true, 452 + "os": [ 453 + "win32" 454 + ], 455 + "engines": { 456 + "node": ">=18" 457 + } 458 + }, 459 + "node_modules/@types/node": { 460 + "version": "22.20.1", 461 + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", 462 + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", 463 + "dev": true, 464 + "license": "MIT", 465 + "dependencies": { 466 + "undici-types": "~6.21.0" 467 + } 468 + }, 469 + "node_modules/esbuild": { 470 + "version": "0.28.1", 471 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", 472 + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", 473 + "dev": true, 474 + "hasInstallScript": true, 475 + "license": "MIT", 476 + "bin": { 477 + "esbuild": "bin/esbuild" 478 + }, 479 + "engines": { 480 + "node": ">=18" 481 + }, 482 + "optionalDependencies": { 483 + "@esbuild/aix-ppc64": "0.28.1", 484 + "@esbuild/android-arm": "0.28.1", 485 + "@esbuild/android-arm64": "0.28.1", 486 + "@esbuild/android-x64": "0.28.1", 487 + "@esbuild/darwin-arm64": "0.28.1", 488 + "@esbuild/darwin-x64": "0.28.1", 489 + "@esbuild/freebsd-arm64": "0.28.1", 490 + "@esbuild/freebsd-x64": "0.28.1", 491 + "@esbuild/linux-arm": "0.28.1", 492 + "@esbuild/linux-arm64": "0.28.1", 493 + "@esbuild/linux-ia32": "0.28.1", 494 + "@esbuild/linux-loong64": "0.28.1", 495 + "@esbuild/linux-mips64el": "0.28.1", 496 + "@esbuild/linux-ppc64": "0.28.1", 497 + "@esbuild/linux-riscv64": "0.28.1", 498 + "@esbuild/linux-s390x": "0.28.1", 499 + "@esbuild/linux-x64": "0.28.1", 500 + "@esbuild/netbsd-arm64": "0.28.1", 501 + "@esbuild/netbsd-x64": "0.28.1", 502 + "@esbuild/openbsd-arm64": "0.28.1", 503 + "@esbuild/openbsd-x64": "0.28.1", 504 + "@esbuild/openharmony-arm64": "0.28.1", 505 + "@esbuild/sunos-x64": "0.28.1", 506 + "@esbuild/win32-arm64": "0.28.1", 507 + "@esbuild/win32-ia32": "0.28.1", 508 + "@esbuild/win32-x64": "0.28.1" 509 + } 510 + }, 511 + "node_modules/fsevents": { 512 + "version": "2.3.3", 513 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 514 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 515 + "dev": true, 516 + "hasInstallScript": true, 517 + "license": "MIT", 518 + "optional": true, 519 + "os": [ 520 + "darwin" 521 + ], 522 + "engines": { 523 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 524 + } 525 + }, 526 + "node_modules/tsx": { 527 + "version": "4.23.1", 528 + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.1.tgz", 529 + "integrity": "sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==", 530 + "dev": true, 531 + "license": "MIT", 532 + "dependencies": { 533 + "esbuild": "~0.28.0" 534 + }, 535 + "bin": { 536 + "tsx": "dist/cli.mjs" 537 + }, 538 + "engines": { 539 + "node": ">=18.0.0" 540 + }, 541 + "optionalDependencies": { 542 + "fsevents": "~2.3.3" 543 + } 544 + }, 545 + "node_modules/typescript": { 546 + "version": "5.9.3", 547 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", 548 + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", 549 + "dev": true, 550 + "license": "Apache-2.0", 551 + "bin": { 552 + "tsc": "bin/tsc", 553 + "tsserver": "bin/tsserver" 554 + }, 555 + "engines": { 556 + "node": ">=14.17" 557 + } 558 + }, 559 + "node_modules/undici-types": { 560 + "version": "6.21.0", 561 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", 562 + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", 563 + "dev": true, 564 + "license": "MIT" 565 + } 566 + } 567 + }
+11 -5
package.json
··· 3 3 "version": "0.0.0", 4 4 "description": "Tournament engine and public API for SpinShare tournament tooling", 5 5 "type": "module", 6 - "main": "src/index.js", 6 + "main": "dist/index.js", 7 + "types": "dist/index.d.ts", 7 8 "scripts": { 8 - "start": "node --env-file=.env src/index.js", 9 - "dev": "node --watch --env-file=.env src/index.js", 10 - "test": "node --test" 9 + "start": "node --env-file=.env dist/index.js", 10 + "dev": "tsx watch --env-file=.env src/index.ts", 11 + "build": "tsc", 12 + "test": "node --test dist/**/*.test.js" 11 13 }, 12 14 "keywords": [], 13 15 "author": "", 14 16 "license": "ISC", 15 17 "dependencies": {}, 16 - "devDependencies": {} 18 + "devDependencies": { 19 + "@types/node": "^22.0.0", 20 + "tsx": "^4.0.0", 21 + "typescript": "^5.6.0" 22 + } 17 23 }
src/index.js src/index.ts
+20
tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ES2022", 4 + "module": "NodeNext", 5 + "moduleResolution": "NodeNext", 6 + "lib": ["ES2022"], 7 + "outDir": "./dist", 8 + "rootDir": "./src", 9 + "strict": true, 10 + "esModuleInterop": true, 11 + "skipLibCheck": true, 12 + "forceConsistentCasingInFileNames": true, 13 + "resolveJsonModule": true, 14 + "declaration": true, 15 + "declarationMap": true, 16 + "sourceMap": true 17 + }, 18 + "include": ["src/**/*"], 19 + "exclude": ["node_modules", "dist"] 20 + }