Custom auth stack: bcryptjs password hashing (cost 10, GoTrue-compatible), jose JWT session cookies (edge-safe, 8hr TTL), new API routes for login/logout/reset/change-password, middleware rewritten to JWT-only verification with no DB access. All 38 protected pages and API routes migrated from supabase.auth.getUser() to getSession(). Supabase .from() queries retained for Phase 4. lib/db/index.ts refactored to lazy Proxy singleton to avoid module-level throw during Next.js build. tsc: clean, build: clean, tests: 4/4 passed Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
53 lines
1.3 KiB
JSON
53 lines
1.3 KiB
JSON
{
|
|
"name": "ims-app",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"scripts": {
|
|
"dev": "next dev",
|
|
"build": "next build",
|
|
"start": "next start",
|
|
"lint": "eslint",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"generate-qr": "tsx scripts/generate-qr.ts"
|
|
},
|
|
"dependencies": {
|
|
"@anthropic-ai/sdk": "^0.111.0",
|
|
"@supabase/ssr": "^0.12.0",
|
|
"@supabase/supabase-js": "^2.110.2",
|
|
"bcryptjs": "^3.0.3",
|
|
"drizzle-orm": "^0.45.2",
|
|
"file-type": "^22.0.1",
|
|
"idb": "^8.0.3",
|
|
"jose": "^6.2.4",
|
|
"next": "^15.5.20",
|
|
"openai": "^6.46.0",
|
|
"pdf-lib": "^1.17.1",
|
|
"pg": "^8.22.0",
|
|
"react": "^19.2.7",
|
|
"react-dom": "^19.2.7",
|
|
"resend": "^6.17.2"
|
|
},
|
|
"devDependencies": {
|
|
"@tailwindcss/postcss": "^4",
|
|
"@testing-library/jest-dom": "^6.9.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/bcryptjs": "^2.4.6",
|
|
"@types/node": "^20",
|
|
"@types/pg": "^8.20.0",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/react": "^19",
|
|
"@types/react-dom": "^19",
|
|
"@vitejs/plugin-react": "^6.0.3",
|
|
"drizzle-kit": "^0.31.10",
|
|
"eslint": "^9",
|
|
"eslint-config-next": "16.2.10",
|
|
"jsdom": "^29.1.1",
|
|
"qrcode": "^1.5.4",
|
|
"tailwindcss": "^4",
|
|
"tsx": "^4.23.0",
|
|
"typescript": "^5",
|
|
"vitest": "^4.1.10"
|
|
}
|
|
}
|