mirror of
https://github.com/tiennm99/vngeoguessr.git
synced 2026-10-13 18:16:26 +00:00
npm run leaderboard:import writes a decrypted backup back to Redis. It is a dry run until --apply, prints the destination prefix first, and accepts only score and distance board keys. By default each backed-up score is set and newer players are kept; --replace rewrites each board exactly. Members go in up to 1000 per ZADD through a new zAddMany helper. docs/leaderboard-backup.md covers what the backup holds, decrypting it and restoring it. The gitignore now covers the decrypted and encrypted file names the workflow uses, not only the dated export.
70 lines
2.3 KiB
JSON
70 lines
2.3 KiB
JSON
{
|
|
"name": "vngeoguessr",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"scripts": {
|
|
"dev": "next dev",
|
|
"dev:clean": "node -e \"require('fs').rmSync('.next',{recursive:true,force:true})\" && next dev",
|
|
"build": "next build",
|
|
"build:check": "node scripts/build-check.mjs",
|
|
"start": "next start",
|
|
"lint": "eslint .",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:integration": "vitest run --config vitest.integration.config.mjs",
|
|
"redis:up": "docker compose up -d --wait",
|
|
"redis:down": "docker compose down -v",
|
|
"data:boundaries": "node scripts/build-region-boundaries.mjs",
|
|
"data:panos": "node scripts/build-pano-index.mjs",
|
|
"data:districts": "node scripts/assign-pano-districts.mjs",
|
|
"data:repartition": "npm run data:boundaries -- --regenerate && npm run data:districts",
|
|
"data:seed": "node scripts/seed-pano-db.mjs",
|
|
"data:refresh": "npm run data:boundaries && npm run data:panos && npm run data:districts && npm run data:seed",
|
|
"stats": "node scripts/stats.mjs",
|
|
"leaderboard:export": "node scripts/export-leaderboards.mjs",
|
|
"leaderboard:import": "node scripts/import-leaderboards.mjs",
|
|
"test:e2e": "playwright test"
|
|
},
|
|
"dependencies": {
|
|
"@neondatabase/serverless": "^1.1.0",
|
|
"@photo-sphere-viewer/core": "^5.15.1",
|
|
"@radix-ui/react-accordion": "^1.2.20",
|
|
"@radix-ui/react-dialog": "^1.1.19",
|
|
"@radix-ui/react-label": "^2.1.11",
|
|
"@radix-ui/react-select": "^2.3.7",
|
|
"@radix-ui/react-slot": "^1.3.0",
|
|
"@turf/turf": "^7.4.0",
|
|
"@upstash/redis": "^1.38.3",
|
|
"@vercel/analytics": "^1.5.0",
|
|
"@vercel/speed-insights": "^1.2.0",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"leaflet": "^1.9.4",
|
|
"lucide-react": "^1.37.0",
|
|
"next": "^16.3.3",
|
|
"react": "^19.2.8",
|
|
"react-dom": "^19.2.8",
|
|
"tailwind-merge": "^3.3.1"
|
|
},
|
|
"devDependencies": {
|
|
"@electric-sql/pglite": "^0.5.8",
|
|
"@mapbox/vector-tile": "^3.0.0",
|
|
"@playwright/test": "^1.62.1",
|
|
"@tailwindcss/postcss": "^4.3.3",
|
|
"eslint": "^9.39.5",
|
|
"eslint-config-next": "^16.3.3",
|
|
"globals": "^17.11.0",
|
|
"pbf": "^5.1.2",
|
|
"tailwindcss": "^4.3.3",
|
|
"tw-animate-css": "^1.3.6",
|
|
"vitest": "^4.1.11"
|
|
},
|
|
"engines": {
|
|
"node": ">=24"
|
|
},
|
|
"overrides": {
|
|
"js-yaml": "^4.2.0",
|
|
"postcss": "^8.5.10"
|
|
}
|
|
}
|