{ "name": "flyer-crawler", "private": true, "version": "0.11.17", "type": "module", "scripts": { "dev": "concurrently \"npm:start:dev\" \"vite\"", "dev:container": "concurrently \"npm:start:dev\" \"vite --host\"", "start": "npm run start:prod", "build": "vite build", "preview": "vite preview", "test": "node scripts/check-linux.js && cross-env NODE_ENV=test tsx ./node_modules/vitest/vitest.mjs run", "test-wsl": "cross-env NODE_ENV=test vitest run", "test:coverage": "npm run clean && npm run test:unit -- --coverage && npm run test:integration -- --coverage", "test:unit": "node scripts/check-linux.js && cross-env NODE_ENV=test tsx --max-old-space-size=8192 ./node_modules/vitest/vitest.mjs run --project unit -c vite.config.ts", "test:integration": "node scripts/check-linux.js && cross-env NODE_ENV=test tsx --max-old-space-size=8192 ./node_modules/vitest/vitest.mjs run --project integration -c vitest.config.integration.ts", "test:e2e": "node scripts/check-linux.js && cross-env NODE_ENV=test tsx --max-old-space-size=8192 ./node_modules/vitest/vitest.mjs run --config vitest.config.e2e.ts", "format": "prettier --write .", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "type-check": "tsc --noEmit", "validate": "(prettier --check . || true) && npm run type-check && (npm run lint || true)", "clean": "rimraf coverage .coverage", "start:dev": "NODE_ENV=development tsx watch server.ts", "start:prod": "NODE_ENV=production tsx server.ts", "start:test": "NODE_ENV=test NODE_V8_COVERAGE=.coverage/tmp/integration-server tsx server.ts", "db:reset:dev": "NODE_ENV=development tsx src/db/seed.ts", "db:reset:test": "NODE_ENV=test tsx src/db/seed.ts", "worker:prod": "NODE_ENV=production tsx src/services/queueService.server.ts", "prepare": "node -e \"try { require.resolve('husky') } catch (e) { process.exit(0) }\" && husky || true" }, "dependencies": { "@bull-board/api": "^6.14.2", "@bull-board/express": "^6.14.2", "@google/genai": "^1.30.0", "@sentry/node": "^10.32.1", "@sentry/react": "^10.32.1", "@tanstack/react-query": "^5.90.12", "@types/connect-timeout": "^1.9.0", "bcrypt": "^5.1.1", "bullmq": "^5.65.1", "connect-timeout": "^1.9.1", "cookie-parser": "^1.4.7", "date-fns": "^4.1.0", "exif-parser": "^0.1.12", "express": "^5.1.0", "express-list-endpoints": "^7.1.1", "express-rate-limit": "^8.2.1", "helmet": "^8.1.0", "ioredis": "^5.8.2", "jsonwebtoken": "^9.0.2", "lucide-react": "^0.555.0", "multer": "^2.0.2", "node-cron": "^4.2.1", "nodemailer": "^7.0.10", "p-ratelimit": "^1.0.1", "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", "piexifjs": "^1.0.6", "pino": "^10.1.0", "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", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.1", "tsx": "^4.20.6", "zod": "^4.2.1", "zxcvbn": "^4.4.2", "zxing-wasm": "^2.2.4" }, "devDependencies": { "@sentry/vite-plugin": "^4.6.2", "@tailwindcss/postcss": "4.1.17", "@tanstack/react-query-devtools": "^5.91.2", "@testcontainers/postgresql": "^11.8.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", "@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/piexifjs": "^1.0.0", "@types/pino": "^7.0.4", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "@types/sharp": "^0.31.1", "@types/supertest": "^6.0.3", "@types/swagger-jsdoc": "^6.0.4", "@types/swagger-ui-express": "^4.1.8", "@types/ws": "^8.18.1", "@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.15", "@vitest/ui": "^4.0.15", "autoprefixer": "^10.4.22", "c8": "^10.1.3", "concurrently": "^9.2.1", "cross-env": "^10.1.0", "eslint": "9.39.1", "eslint-config-prettier": "^9.1.0", "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", "husky": "^9.1.7", "istanbul-reports": "^3.2.0", "jsdom": "^27.2.0", "lint-staged": "^16.2.7", "msw": "^2.12.3", "nyc": "^17.1.0", "pino-pretty": "^13.1.3", "postcss": "^8.5.6", "prettier": "^3.3.2", "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.15" } }