{
  "name": "exam-integrity-proctoring-system",
  "private": true,
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "dev": "tsx server.ts",
    "build": "vite build && esbuild server.ts --bundle --platform=node --format=cjs --packages=external --sourcemap --outfile=dist/server.cjs",
    "start": "node dist/server.cjs",
    "db:migrate": "node migrate.mjs",
    "clean": "node -e \"const fs=require('fs');['dist'].forEach(d=>fs.rmSync(d,{recursive:true,force:true}))\"",
    "lint": "eslint .",
    "lint:fix": "eslint . --fix",
    "test": "vitest run",
    "test:watch": "vitest",
    "typecheck": "tsc --noEmit"
  },
  "dependencies": {
    "@google/genai": "^2.4.0",
    "@tailwindcss/vite": "^4.1.14",
    "@vitejs/plugin-react": "^5.0.4",
    "bcryptjs": "^3.0.3",
    "cookie-parser": "^1.4.7",
    "d3": "^7.9.0",
    "dotenv": "^17.2.3",
    "express": "^4.21.2",
    "express-rate-limit": "^7.5.0",
    "helmet": "^8.1.0",
    "iconv-lite": "^0.7.3",
    "jsonwebtoken": "^9.0.3",
    "jspdf": "^4.2.1",
    "lucide-react": "^0.546.0",
    "motion": "^12.23.24",
    "mysql2": "^3.22.5",
    "react": "^19.0.1",
    "react-dom": "^19.0.1",
    "recharts": "^3.8.1",
    "vite": "^6.2.3",
    "ws": "^8.21.0"
  },
  "devDependencies": {
    "@eslint/js": "^10.0.1",
    "@testing-library/jest-dom": "^6.9.1",
    "@testing-library/react": "^16.3.2",
    "@testing-library/user-event": "^14.6.1",
    "@types/bcryptjs": "^2.4.6",
    "@types/cookie-parser": "^1.4.10",
    "@types/d3": "^7.4.3",
    "@types/express": "^4.17.21",
    "@types/iconv-lite": "^0.0.1",
    "@types/jsonwebtoken": "^9.0.10",
    "@types/node": "^22.14.0",
    "@types/react": "^19.2.17",
    "autoprefixer": "^10.4.21",
    "esbuild": "^0.25.0",
    "eslint": "^10.6.0",
    "eslint-plugin-react-hooks": "^7.1.1",
    "jsdom": "^29.1.1",
    "tailwindcss": "^4.1.14",
    "tsx": "^4.21.0",
    "typescript": "~5.8.2",
    "typescript-eslint": "^8.62.1",
    "vite": "^6.2.3",
    "vitest": "^4.1.9"
  }
}
