{ "name": "flyer-crawler", "private": true, "version": "0.0.0", "type": "module", "scripts": { "dev": "concurrently \"npm:start:dev\" \"vite\"", "start": "npm run start:prod", "build": "vite build", "preview": "vite preview", "test": "node --max-old-space-size=8192 ./node_modules/vitest/vitest.mjs run", "test:coverage": "npm run clean; npm run test:unit -- --coverage --reporter=verbose --reporter=tree --includeTaskLocation --testTimeout=20000; npm run test:integration -- --coverage --reporter=verbose --reporter=tree --includeTaskLocation --testTimeout=20000", "test:unit": "node --max-old-space-size=8192 ./node_modules/vitest/vitest.mjs run --project unit -c vite.config.ts", "test:integration": "node --max-old-space-size=8192 ./node_modules/vitest/vitest.mjs run --project integration -c vitest.config.integration.ts", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "clean": "rimraf coverage .coverage", "start:dev": "tsx --env-file .env.test server.ts", "start:prod": "tsx --env-file .env server.ts", "start:test": "NODE_V8_COVERAGE=.coverage/tmp/integration-server tsx --env-file .env.test server.ts", "db:reset:test": "tsx --env-file .env.test src/db/seed.ts" }, "dependencies": { "@google/genai": "^1.30.0", "@types/connect-timeout": "^1.9.0", "bcrypt": "^5.1.1", "connect-timeout": "^1.9.1", "cookie-parser": "^1.4.7", "date-fns": "^4.1.0", "express": "^5.1.0", "express-list-endpoints": "^7.1.1", "express-rate-limit": "^8.2.1", "jsonwebtoken": "^9.0.2", "lucide-react": "^0.555.0", "msw": "^2.12.3", "multer": "^2.0.2", "node-cron": "^4.2.1", "nodemailer": "^7.0.10", "passport": "^0.7.0", "passport-github2": "^0.1.12", "passport-google-oauth20": "^2.0.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", "pdfjs-dist": "^5.4.394", "pg": "^8.16.3", "react": "^19.2.0", "react-dom": "^19.2.0", "react-hot-toast": "^2.6.0", "react-router-dom": "^7.9.6", "recharts": "^3.4.1", "sharp": "^0.34.5", "tsx": "^4.20.6", "zxcvbn": "^4.4.2" }, "devDependencies": { "@tailwindcss/postcss": "4.1.17", "@testcontainers/postgresql": "^11.8.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", "@types/bcrypt": "^5.0.2", "@types/cookie-parser": "^1.4.10", "@types/express": "^5.0.5", "@types/jsonwebtoken": "^9.0.10", "@types/multer": "^2.0.0", "@types/node": "^24.10.1", "@types/node-cron": "^3.0.11", "@types/nodemailer": "^7.0.4", "@types/passport": "^1.0.17", "@types/passport-github2": "^1.2.9", "@types/passport-google-oauth20": "^2.0.17", "@types/passport-jwt": "^4.0.1", "@types/passport-local": "^1.0.38", "@types/pg": "^8.15.6", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "@types/sharp": "^0.31.1", "@types/supertest": "^6.0.3", "@types/zxcvbn": "^4.4.5", "@typescript-eslint/eslint-plugin": "^8.47.0", "@typescript-eslint/parser": "^8.47.0", "@vitejs/plugin-react": "5.1.1", "@vitest/coverage-v8": "^4.0.13", "autoprefixer": "^10.4.22", "c8": "^10.1.3", "concurrently": "^9.2.1", "dotenv": "^17.2.3", "eslint": "9.39.1", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.4.24", "glob": "^13.0.0", "globals": "16.5.0", "istanbul-reports": "^3.2.0", "jsdom": "^27.2.0", "nyc": "^17.1.0", "postcss": "^8.5.6", "rimraf": "^6.1.2", "supertest": "^7.1.4", "tailwindcss": "^4.1.17", "testcontainers": "^11.8.1", "typescript": "^5.9.3", "typescript-eslint": "^8.47.0", "vite": "^7.2.4", "vitest": "^4.0.13" } }