- Setup: nominate judges, copy personal links, QR codes (generated on demand in the browser), revoke/restore, and an open-link toggle. - GET /api/judge/[token] returns only that judge's own scores; PUT .../scores runs every check from ARCHITECTURE.md in checkJudgeWrite (pure, unit-tested) after one parallel lookup, plus a rate limit. - /j/[token]: mobile cards per team, spotlight pinned first, autosave with per-card status, read-only when locked/done, link-off when revoked. - /jo/[token]: name form -> personal link, remembered in localStorage so a re-scan doesn't create a second judge. - Control room: averages with on-request overrides, judge progress matrix, per-judge breakdown, spotlight select and lock toggle. - usePendingEdits shares the optimistic autosave logic between the admin grid and the judge page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
40 lines
1014 B
JSON
40 lines
1014 B
JSON
{
|
|
"name": "game-night-live",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"scripts": {
|
|
"dev": "next dev",
|
|
"build": "next build",
|
|
"start": "next start",
|
|
"lint": "eslint",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"check:rls": "node --env-file=.env.local scripts/check-rls.mjs",
|
|
"gen:types": "node --env-file=.env.local scripts/gen-types.mjs",
|
|
"test:coverage": "vitest run --coverage"
|
|
},
|
|
"dependencies": {
|
|
"@supabase/ssr": "^0.12.7",
|
|
"@supabase/supabase-js": "^2.117.2",
|
|
"next": "16.3.8",
|
|
"qrcode": "^1.5.4",
|
|
"react": "19.2.8",
|
|
"react-dom": "19.2.8",
|
|
"server-only": "^0.0.1",
|
|
"zod": "^4.6.5"
|
|
},
|
|
"devDependencies": {
|
|
"@tailwindcss/postcss": "^4",
|
|
"@types/node": "^22",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/react": "^19",
|
|
"@types/react-dom": "^19",
|
|
"@vitest/coverage-v8": "^5.0.3",
|
|
"eslint": "^9",
|
|
"eslint-config-next": "16.3.8",
|
|
"tailwindcss": "^4",
|
|
"typescript": "^5",
|
|
"vitest": "^5.0.3"
|
|
}
|
|
}
|