From 692bcdbdcf9263187fb1547e11411386224cb664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=B9=E0=A4=BF=E0=A4=AE=E0=A4=BE=E0=A4=82=E0=A4=B6?= =?UTF-8?q?=E0=A5=81?= Date: Wed, 6 Aug 2025 18:24:31 +0530 Subject: [PATCH] Revert "Implement comprehensive authentication system with NextAuth.js (#4)" This reverts commit d20f662008124b85c9e4b7002cbd8cc70f832dfc. --- apps/web/app/api/auth/[...nextauth]/route.ts | 6 - apps/web/app/api/auth/signup/route.ts | 51 ------ apps/web/app/auth/signin/page.tsx | 100 ----------- apps/web/app/auth/signup/page.tsx | 154 ---------------- apps/web/app/dashboard/page.tsx | 62 ------- apps/web/app/layout.tsx | 20 +-- apps/web/app/page.tsx | 79 +-------- apps/web/components/auth-nav.tsx | 45 ----- apps/web/components/session-provider.tsx | 18 -- apps/web/lib/auth.ts | 63 ------- apps/web/middleware.ts | 21 --- apps/web/package.json | 10 +- apps/web/tsconfig.json | 5 +- apps/web/types/next-auth.d.ts | 25 --- docs/AUTHENTICATION.md | 177 ------------------- packages/prisma/prisma/schema.prisma | 54 ------ packages/prisma/src/mock.ts | 74 -------- pnpm-lock.yaml | 170 +----------------- 18 files changed, 16 insertions(+), 1118 deletions(-) delete mode 100644 apps/web/app/api/auth/[...nextauth]/route.ts delete mode 100644 apps/web/app/api/auth/signup/route.ts delete mode 100644 apps/web/app/auth/signin/page.tsx delete mode 100644 apps/web/app/auth/signup/page.tsx delete mode 100644 apps/web/app/dashboard/page.tsx delete mode 100644 apps/web/components/auth-nav.tsx delete mode 100644 apps/web/components/session-provider.tsx delete mode 100644 apps/web/lib/auth.ts delete mode 100644 apps/web/middleware.ts delete mode 100644 apps/web/types/next-auth.d.ts delete mode 100644 docs/AUTHENTICATION.md delete mode 100644 packages/prisma/src/mock.ts diff --git a/apps/web/app/api/auth/[...nextauth]/route.ts b/apps/web/app/api/auth/[...nextauth]/route.ts deleted file mode 100644 index a8ed0a8..0000000 --- a/apps/web/app/api/auth/[...nextauth]/route.ts +++ /dev/null @@ -1,6 +0,0 @@ -import NextAuth from "next-auth" -import { authOptions } from "@/lib/auth" - -const handler = NextAuth(authOptions) - -export { handler as GET, handler as POST } \ No newline at end of file diff --git a/apps/web/app/api/auth/signup/route.ts b/apps/web/app/api/auth/signup/route.ts deleted file mode 100644 index f458e12..0000000 --- a/apps/web/app/api/auth/signup/route.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { NextRequest, NextResponse } from "next/server" -// Use mock client temporarily until Prisma generation works -import { PrismaClient } from "@collax/prisma/src/mock" - -const prisma = new PrismaClient() - -export async function POST(req: NextRequest) { - try { - const { email, password, name } = await req.json() - - if (!email || !password || !name) { - return NextResponse.json( - { message: "Missing required fields" }, - { status: 400 } - ) - } - - // Check if user already exists - const existingUser = await prisma.user.findUnique({ - where: { email } - }) - - if (existingUser) { - return NextResponse.json( - { message: "User already exists" }, - { status: 400 } - ) - } - - // Create user (in production, hash the password) - const user = await prisma.user.create({ - data: { - email, - name, - // Note: In production, hash the password before storing - // password: await bcrypt.hash(password, 12) - } - }) - - return NextResponse.json( - { message: "User created successfully", userId: user.id }, - { status: 201 } - ) - } catch (error) { - console.error("Signup error:", error) - return NextResponse.json( - { message: "Internal server error" }, - { status: 500 } - ) - } -} \ No newline at end of file diff --git a/apps/web/app/auth/signin/page.tsx b/apps/web/app/auth/signin/page.tsx deleted file mode 100644 index 43021d3..0000000 --- a/apps/web/app/auth/signin/page.tsx +++ /dev/null @@ -1,100 +0,0 @@ -"use client" - -import { signIn } from "next-auth/react" -import { Button } from "@collax/ui/components/ui/button" -import { useState } from "react" - -export default function SignIn() { - const [email, setEmail] = useState("") - const [password, setPassword] = useState("") - - const handleCredentialsSignIn = async (e: React.FormEvent) => { - e.preventDefault() - await signIn("credentials", { - email, - password, - callbackUrl: "/", - }) - } - - const handleGoogleSignIn = () => { - signIn("google", { callbackUrl: "/" }) - } - - return ( -
-
-
-

- Sign in to Collax -

-

- Your collaborative note-taking platform -

-
-
- - -
-
-
-
-
- Or continue with -
-
- -
-
- - setEmail(e.target.value)} - /> -
-
- - setPassword(e.target.value)} - /> -
- -
- -
-
-
-
-
- ) -} \ No newline at end of file diff --git a/apps/web/app/auth/signup/page.tsx b/apps/web/app/auth/signup/page.tsx deleted file mode 100644 index 3122ce2..0000000 --- a/apps/web/app/auth/signup/page.tsx +++ /dev/null @@ -1,154 +0,0 @@ -"use client" - -import { signIn } from "next-auth/react" -import { Button } from "@collax/ui/components/ui/button" -import { useState } from "react" -import Link from "next/link" - -export default function SignUp() { - const [email, setEmail] = useState("") - const [password, setPassword] = useState("") - const [name, setName] = useState("") - const [loading, setLoading] = useState(false) - - const handleSignUp = async (e: React.FormEvent) => { - e.preventDefault() - setLoading(true) - - try { - const response = await fetch("/api/auth/signup", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ email, password, name }), - }) - - if (response.ok) { - // Sign in after successful registration - await signIn("credentials", { - email, - password, - callbackUrl: "/", - }) - } else { - const data = await response.json() - alert(data.message || "Something went wrong") - } - } catch { - alert("Something went wrong") - } finally { - setLoading(false) - } - } - - const handleGoogleSignIn = () => { - signIn("google", { callbackUrl: "/" }) - } - - return ( -
-
-
-

- Create your account -

-

- Join Collax and start collaborating -

-
-
- - -
-
-
-
-
- Or continue with -
-
- -
-
- - setName(e.target.value)} - /> -
-
- - setEmail(e.target.value)} - /> -
-
- - setPassword(e.target.value)} - /> -
- -
- -
- -
- - Already have an account?{" "} - - Sign in - - -
-
-
-
-
- ) -} \ No newline at end of file diff --git a/apps/web/app/dashboard/page.tsx b/apps/web/app/dashboard/page.tsx deleted file mode 100644 index fedeafb..0000000 --- a/apps/web/app/dashboard/page.tsx +++ /dev/null @@ -1,62 +0,0 @@ -"use client" - -import { useSession } from "next-auth/react" -import AuthNav from "@/components/auth-nav" -import { Button } from "@collax/ui/components/ui/button" - -import Link from "next/link" - -export default function Dashboard() { - const { data: session } = useSession() - - return ( -
- {/* Navigation Header */} - - - {/* Main Content */} -
-
-

Dashboard

-

Welcome back, {session?.user?.name || session?.user?.email}!

-
- -
-
-

My Notes

-

Manage your personal notes

- -
- -
-

Shared Notes

-

Collaborate with others

- -
- -
-

Create New

-

Start a new note

- -
-
- -
-

Recent Activity

-

Your recent notes and collaborations will appear here.

-
-
-
- ) -} \ No newline at end of file diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 6e49e29..001920c 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,27 +1,21 @@ import type { Metadata } from "next"; import "@collax/ui/globals.css" -import SessionProvider from "@/components/session-provider" -import { getServerSession } from "next-auth" -import { authOptions } from "@/lib/auth" +import { Inter } from "next/font/google"; export const metadata: Metadata = { - title: "Collax - Collaborative Notes", - description: "A collaborative note-taking application", + title: "Create Next App", + description: "Generated by create next app", }; - -export default async function RootLayout({ +const inter = Inter({ subsets: ["latin"] }); +export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { - const session = await getServerSession(authOptions) - return ( - - - {children} - + + {children} ); diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index 6a2da07..b1e93cb 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -1,82 +1,9 @@ -"use client" - import { Button } from "@collax/ui/components/ui/button" -import AuthNav from "@/components/auth-nav" -import { useSession } from "next-auth/react" -import Link from "next/link" - export default function Page() { - const { data: session } = useSession() - return ( -
- {/* Navigation Header */} - - - {/* Main Content */} -
-
-

- Welcome to Collax -

-

- Your collaborative note-taking platform -

- - {session ? ( -
-

- Hello, {session.user?.name || session.user?.email}! -

-

- You are successfully authenticated. Ready to start taking notes? -

-
- - - - -
-
- ) : ( -
-

- Get Started Today -

-

- Sign up or sign in to start creating and collaborating on notes. -

-
- - - - - - -
-
- )} -
-
+
+

Hii

+
) } diff --git a/apps/web/components/auth-nav.tsx b/apps/web/components/auth-nav.tsx deleted file mode 100644 index 05c88af..0000000 --- a/apps/web/components/auth-nav.tsx +++ /dev/null @@ -1,45 +0,0 @@ -"use client" - -import { useSession, signOut } from "next-auth/react" -import { Button } from "@collax/ui/components/ui/button" -import Link from "next/link" - -export default function AuthNav() { - const { data: session, status } = useSession() - - if (status === "loading") { - return
Loading...
- } - - if (session) { - return ( -
- - Welcome, {session.user?.name || session.user?.email} - - -
- ) - } - - return ( -
- - - - - - -
- ) -} \ No newline at end of file diff --git a/apps/web/components/session-provider.tsx b/apps/web/components/session-provider.tsx deleted file mode 100644 index 2c3066d..0000000 --- a/apps/web/components/session-provider.tsx +++ /dev/null @@ -1,18 +0,0 @@ -"use client" - -import { SessionProvider as NextAuthSessionProvider } from "next-auth/react" -import { Session } from "next-auth" - -export default function SessionProvider({ - children, - session, -}: { - children: React.ReactNode - session: Session | null -}) { - return ( - - {children} - - ) -} \ No newline at end of file diff --git a/apps/web/lib/auth.ts b/apps/web/lib/auth.ts deleted file mode 100644 index f47b8a2..0000000 --- a/apps/web/lib/auth.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { NextAuthOptions } from "next-auth" -// import { PrismaAdapter } from "@next-auth/prisma-adapter" -import GoogleProvider from "next-auth/providers/google" -import CredentialsProvider from "next-auth/providers/credentials" -// Use mock client temporarily until Prisma generation works -import { PrismaClient } from "@collax/prisma/src/mock" - -const prisma = new PrismaClient() - -export const authOptions: NextAuthOptions = { - // adapter: PrismaAdapter(prisma as any), // Temporarily disabled - providers: [ - GoogleProvider({ - clientId: process.env.GOOGLE_CLIENT_ID || "mock-google-client-id", - clientSecret: process.env.GOOGLE_CLIENT_SECRET || "mock-google-client-secret", - }), - CredentialsProvider({ - name: "credentials", - credentials: { - email: { label: "Email", type: "email" }, - password: { label: "Password", type: "password" } - }, - async authorize(credentials) { - if (!credentials?.email || !credentials?.password) { - return null - } - - // For demo purposes, allow any email/password combination - // In production, you'd verify against a database - if (credentials.email && credentials.password) { - return { - id: "demo-user-id", - email: credentials.email, - name: "Demo User", - image: null, - } - } - - return null - } - }) - ], - session: { - strategy: "jwt", - }, - pages: { - signIn: "/auth/signin", - }, - callbacks: { - async jwt({ token, user }) { - if (user) { - token.id = user.id - } - return token - }, - async session({ session, token }) { - if (token) { - session.user.id = token.id as string - } - return session - }, - }, -} \ No newline at end of file diff --git a/apps/web/middleware.ts b/apps/web/middleware.ts deleted file mode 100644 index f18d277..0000000 --- a/apps/web/middleware.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { withAuth } from "next-auth/middleware" - -export default withAuth( - function middleware(req) { - // Add any additional middleware logic here - }, - { - callbacks: { - authorized: ({ token }) => !!token - }, - } -) - -export const config = { - matcher: [ - // Protect these routes - "/dashboard/:path*", - "/notes/:path*", - "/profile/:path*" - ] -} \ No newline at end of file diff --git a/apps/web/package.json b/apps/web/package.json index a22fe76..0acfe7c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -12,23 +12,21 @@ }, "dependencies": { "@collax/ui": "workspace:*", - "@next-auth/prisma-adapter": "^1.0.7", "next": "^15.3.0", - "next-auth": "^4.24.11", "react": "^19.1.0", "react-dom": "^19.1.0" }, "devDependencies": { "@collax/eslint-config": "workspace:*", - "@collax/prisma": "workspace:*", "@collax/typescript-config": "workspace:*", + "@collax/prisma": "workspace:*", "@types/node": "^22.15.3", "@types/react": "19.1.0", "@types/react-dom": "19.1.1", - "autoprefixer": "^10", "eslint": "^9.27.0", + "typescript": "5.8.2", + "autoprefixer": "^10", "postcss": "^8", - "tailwindcss": "^3.4.13", - "typescript": "5.8.2" + "tailwindcss": "^3.4.13" } } diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 4bad9f7..985ec1f 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -5,10 +5,7 @@ { "name": "next" } - ], - "paths": { - "@/*": ["./*"] - } + ] }, "include": [ "**/*.ts", diff --git a/apps/web/types/next-auth.d.ts b/apps/web/types/next-auth.d.ts deleted file mode 100644 index a716218..0000000 --- a/apps/web/types/next-auth.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import NextAuth from "next-auth" - -declare module "next-auth" { - interface Session { - user: { - id: string - name?: string | null - email?: string | null - image?: string | null - } - } - - interface User { - id: string - name?: string | null - email?: string | null - image?: string | null - } -} - -declare module "next-auth/jwt" { - interface JWT { - id: string - } -} \ No newline at end of file diff --git a/docs/AUTHENTICATION.md b/docs/AUTHENTICATION.md deleted file mode 100644 index a03fa9f..0000000 --- a/docs/AUTHENTICATION.md +++ /dev/null @@ -1,177 +0,0 @@ -# Authentication Setup - -This document describes the authentication system implemented in the Collax application. - -## Overview - -Collax uses NextAuth.js (v4) for comprehensive authentication with support for: -- **Google OAuth** - Social login with Google accounts -- **Email/Password** - Traditional credentials-based authentication -- **JWT Sessions** - Secure, stateless session management -- **Protected Routes** - Middleware-based route protection - -## Features - -### 🔐 **Multiple Authentication Methods** -- Google OAuth integration (production-ready with proper credentials) -- Email/password authentication (demo implementation) -- Extensible provider system for adding more auth methods - -### 🛡️ **Security Features** -- JWT-based sessions for scalability -- CSRF protection built-in with NextAuth.js -- Secure cookie handling -- Environment-based configuration - -### 🎨 **User Experience** -- Clean, responsive authentication UI -- Automatic redirects after authentication -- Persistent sessions across browser refreshes -- Clear authentication status in navigation - -### 🛣️ **Route Protection** -- Middleware-based protection for sensitive routes -- Automatic redirect to sign-in for unauthenticated users -- Callback URL preservation for seamless UX - -## Files Structure - -### Core Authentication -- `apps/web/lib/auth.ts` - NextAuth.js configuration -- `apps/web/app/api/auth/[...nextauth]/route.ts` - NextAuth.js API routes -- `apps/web/middleware.ts` - Route protection middleware - -### UI Components -- `apps/web/components/session-provider.tsx` - Session context provider -- `apps/web/components/auth-nav.tsx` - Authentication navigation component -- `apps/web/app/auth/signin/page.tsx` - Sign-in page -- `apps/web/app/auth/signup/page.tsx` - Sign-up page - -### Database Schema -- `packages/prisma/prisma/schema.prisma` - User, Account, Session models - -### Configuration -- `apps/web/.env.example` - Environment variables template -- `apps/web/types/next-auth.d.ts` - TypeScript type definitions - -## Environment Setup - -Copy the environment template and configure: - -```bash -cp apps/web/.env.example apps/web/.env.local -``` - -Required environment variables: -```env -NEXTAUTH_URL=http://localhost:3000 -NEXTAUTH_SECRET=your-secret-key - -# Optional: Google OAuth -GOOGLE_CLIENT_ID=your-google-client-id -GOOGLE_CLIENT_SECRET=your-google-client-secret - -# Database (when Prisma adapter is enabled) -DATABASE_URL="postgresql://username:password@localhost:5432/collax" -``` - -## Protected Routes - -The following routes are automatically protected by middleware: -- `/dashboard/*` - User dashboard and related pages -- `/notes/*` - Note management pages -- `/profile/*` - User profile pages - -Add more protected routes by updating the `matcher` config in `apps/web/middleware.ts`. - -## Usage Examples - -### Check Authentication Status -```tsx -import { useSession } from "next-auth/react" - -function MyComponent() { - const { data: session, status } = useSession() - - if (status === "loading") return

Loading...

- if (status === "unauthenticated") return

Please sign in

- - return

Welcome, {session.user.name}!

-} -``` - -### Server-Side Authentication -```tsx -import { getServerSession } from "next-auth" -import { authOptions } from "@/lib/auth" - -export default async function Page() { - const session = await getServerSession(authOptions) - - if (!session) { - return
Please sign in
- } - - return
Hello, {session.user.name}!
-} -``` - -### Programmatic Sign In/Out -```tsx -import { signIn, signOut } from "next-auth/react" - -// Sign in with credentials -await signIn("credentials", { - email: "user@example.com", - password: "password", - callbackUrl: "/dashboard" -}) - -// Sign in with Google -await signIn("google", { callbackUrl: "/dashboard" }) - -// Sign out -await signOut({ callbackUrl: "/" }) -``` - -## Production Deployment - -### Google OAuth Setup -1. Go to [Google Cloud Console](https://console.cloud.google.com/) -2. Create a new project or select existing -3. Enable Google+ API -4. Create OAuth 2.0 credentials -5. Add authorized redirect URIs: - - `https://yourdomain.com/api/auth/callback/google` -6. Set environment variables with real credentials - -### Database Setup -1. Set up PostgreSQL database -2. Update `DATABASE_URL` in environment -3. Run Prisma migrations: - ```bash - pnpm migrate:dev - pnpm generate - ``` - -### Security Considerations -- Use a strong, random `NEXTAUTH_SECRET` in production -- Enable HTTPS for all authentication flows -- Configure proper CORS settings -- Implement rate limiting for auth endpoints -- Regular security audits and dependency updates - -## Current Implementation Notes - -- **Demo Mode**: Currently using mock Prisma client due to development environment limitations -- **Password Hashing**: In production, implement proper password hashing with bcrypt -- **Database Integration**: Full Prisma integration ready when database is available -- **Email Verification**: Can be added with email provider configuration - -## Next Steps - -1. **Database Integration**: Connect to real PostgreSQL database -2. **Email Provider**: Add email verification and password reset -3. **Role-Based Access**: Implement user roles and permissions -4. **Security Enhancements**: Add rate limiting, password policies -5. **Social Providers**: Add more OAuth providers (GitHub, Discord, etc.) \ No newline at end of file diff --git a/packages/prisma/prisma/schema.prisma b/packages/prisma/prisma/schema.prisma index c9324d9..aaeee1b 100644 --- a/packages/prisma/prisma/schema.prisma +++ b/packages/prisma/prisma/schema.prisma @@ -13,57 +13,3 @@ datasource db { provider = "postgresql" url = env("DATABASE_URL") } - -// NextAuth.js Models -// NOTE: When using postgresql, mysql or sqlserver, -// uncomment the @db.Text annotations in model Account below -// Further reading: -// https://next-auth.js.org/schemas/models -// https://next-auth.js.org/schemas/adapters - -model Account { - id String @id @default(cuid()) - userId String - type String - provider String - providerAccountId String - refresh_token String? @db.Text - access_token String? @db.Text - expires_at Int? - token_type String? - scope String? - id_token String? @db.Text - session_state String? - - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - - @@unique([provider, providerAccountId]) -} - -model Session { - id String @id @default(cuid()) - sessionToken String @unique - userId String - expires DateTime - user User @relation(fields: [userId], references: [id], onDelete: Cascade) -} - -model User { - id String @id @default(cuid()) - name String? - email String @unique - emailVerified DateTime? - image String? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - accounts Account[] - sessions Session[] -} - -model VerificationToken { - identifier String - token String @unique - expires DateTime - - @@unique([identifier, token]) -} diff --git a/packages/prisma/src/mock.ts b/packages/prisma/src/mock.ts deleted file mode 100644 index df3e321..0000000 --- a/packages/prisma/src/mock.ts +++ /dev/null @@ -1,74 +0,0 @@ -// Temporary mock Prisma client for development -// This will be replaced once the actual Prisma client is generated - -export interface User { - id: string - email: string - name?: string | null - image?: string | null - emailVerified?: Date | null - createdAt: Date - updatedAt: Date -} - -export interface Account { - id: string - userId: string - type: string - provider: string - providerAccountId: string - refresh_token?: string | null - access_token?: string | null - expires_at?: number | null - token_type?: string | null - scope?: string | null - id_token?: string | null - session_state?: string | null -} - -export interface Session { - id: string - sessionToken: string - userId: string - expires: Date -} - -export interface VerificationToken { - identifier: string - token: string - expires: Date -} - -// Mock PrismaClient -export class PrismaClient { - user = { - findUnique: async ({ where }: { where: { email?: string; id?: string } }) => { - // Mock implementation - in development, return null to prevent errors - return null - }, - create: async ({ data }: { data: Partial }) => { - // Mock implementation - return { - id: "mock-id", - email: data.email!, - name: data.name || null, - image: null, - emailVerified: null, - createdAt: new Date(), - updatedAt: new Date(), - } - } - } - - account = { - // Mock account methods - } - - session = { - // Mock session methods - } - - verificationToken = { - // Mock verification token methods - } -} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6346c05..1ba6c87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,15 +60,9 @@ importers: '@collax/ui': specifier: workspace:* version: link:../../packages/ui - '@next-auth/prisma-adapter': - specifier: ^1.0.7 - version: 1.0.7(@prisma/client@6.8.2(prisma@6.8.2(typescript@5.8.2))(typescript@5.8.2))(next-auth@4.24.11(next@15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) next: specifier: ^15.3.0 version: 15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - next-auth: - specifier: ^4.24.11 - version: 4.24.11(next@15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: specifier: ^19.1.0 version: 19.1.0 @@ -94,18 +88,9 @@ importers: '@types/react-dom': specifier: 19.1.1 version: 19.1.1(@types/react@19.1.0) - autoprefixer: - specifier: ^10 - version: 10.4.21(postcss@8.5.6) eslint: specifier: ^9.27.0 version: 9.27.0(jiti@2.4.2) - postcss: - specifier: ^8 - version: 8.5.6 - tailwindcss: - specifier: ^3.4.13 - version: 3.4.17(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.8.2)) typescript: specifier: 5.8.2 version: 5.8.2 @@ -238,10 +223,6 @@ packages: resolution: {integrity: sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.28.2': - resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} - engines: {node: '>=6.9.0'} - '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -437,12 +418,6 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@next-auth/prisma-adapter@1.0.7': - resolution: {integrity: sha512-Cdko4KfcmKjsyHFrWwZ//lfLUbcLqlyFqjd/nYE2m3aZ7tjMNUjpks47iw7NTCnXf+5UWz5Ypyt1dSs1EP5QJw==} - peerDependencies: - '@prisma/client': '>=2.26.0 || >=3' - next-auth: ^4 - '@next/env@15.3.0': resolution: {integrity: sha512-6mDmHX24nWlHOlbwUiAOmMyY7KELimmi+ed8qWcJYjqXeC+G6JzPZ3QosOAfjNwgMIzwhXBiRiCgdh8axTTdTA==} @@ -509,9 +484,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@panva/hkdf@1.2.1': - resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -939,10 +911,6 @@ packages: constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - core-js-pure@3.41.0: resolution: {integrity: sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==} @@ -1297,7 +1265,6 @@ packages: glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} @@ -1585,9 +1552,6 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - jose@4.15.9: - resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1660,10 +1624,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -1724,7 +1684,6 @@ packages: nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -1736,20 +1695,6 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next-auth@4.24.11: - resolution: {integrity: sha512-pCFXzIDQX7xmHFs4KVH4luCjaCbuPRtZ9oBUjUhOk84mZ9WVPf94n87TxYI4rSRf9HmfHEF8Yep3JrYDVOo3Cw==} - peerDependencies: - '@auth/core': 0.34.2 - next: ^12.2.5 || ^13 || ^14 || ^15 - nodemailer: ^6.6.5 - react: ^17.0.2 || ^18 || ^19 - react-dom: ^17.0.2 || ^18 || ^19 - peerDependenciesMeta: - '@auth/core': - optional: true - nodemailer: - optional: true - next@15.3.0: resolution: {integrity: sha512-k0MgP6BsK8cZ73wRjMazl2y2UcXj49ZXLDEgx6BikWuby/CN+nh81qFFI16edgd7xYpe/jj2OZEIwCoqnzz0bQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} @@ -1793,17 +1738,10 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - oauth@0.9.15: - resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-hash@2.2.0: - resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} - engines: {node: '>= 6'} - object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} @@ -1832,10 +1770,6 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - oidc-token-hash@5.1.0: - resolution: {integrity: sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==} - engines: {node: ^10.13.0 || >=12.0.0} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -1843,9 +1777,6 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - openid-client@5.7.1: - resolution: {integrity: sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2010,14 +1941,6 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - preact-render-to-string@5.2.6: - resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} - peerDependencies: - preact: '>=10' - - preact@10.27.0: - resolution: {integrity: sha512-/DTYoB6mwwgPytiqQTh/7SFRL98ZdiD8Sk8zIUVOxtwq4oWcwrcd1uno9fE/zZmUaUrFNYzbH14CPebOz9tZQw==} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2026,9 +1949,6 @@ packages: resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} - pretty-format@3.8.0: - resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - prisma@6.8.2: resolution: {integrity: sha512-JNricTXQxzDtRS7lCGGOB4g5DJ91eg3nozdubXze3LpcMl1oWwcFddrj++Up3jnRE6X/3gB/xz3V+ecBk/eEGA==} engines: {node: '>=18.18'} @@ -2517,10 +2437,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -2573,9 +2489,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.8.0: resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} engines: {node: '>= 14.6'} @@ -2598,8 +2511,6 @@ snapshots: core-js-pure: 3.41.0 regenerator-runtime: 0.14.1 - '@babel/runtime@7.28.2': {} - '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -2772,11 +2683,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@next-auth/prisma-adapter@1.0.7(@prisma/client@6.8.2(prisma@6.8.2(typescript@5.8.2))(typescript@5.8.2))(next-auth@4.24.11(next@15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))': - dependencies: - '@prisma/client': 6.8.2(prisma@6.8.2(typescript@5.8.2))(typescript@5.8.2) - next-auth: 4.24.11(next@15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@next/env@15.3.0': {} '@next/eslint-plugin-next@15.3.0': @@ -2819,16 +2725,9 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@panva/hkdf@1.2.1': {} - '@pkgjs/parseargs@0.11.0': optional: true - '@prisma/client@6.8.2(prisma@6.8.2(typescript@5.8.2))(typescript@5.8.2)': - optionalDependencies: - prisma: 6.8.2(typescript@5.8.2) - typescript: 5.8.2 - '@prisma/client@6.8.2(prisma@6.8.2(typescript@5.8.3))(typescript@5.8.3)': optionalDependencies: prisma: 6.8.2(typescript@5.8.3) @@ -3154,23 +3053,13 @@ snapshots: autoprefixer@10.4.21(postcss@8.4.31): dependencies: browserslist: 4.25.1 - caniuse-lite: 1.0.30001731 + caniuse-lite: 1.0.30001713 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 postcss: 8.4.31 postcss-value-parser: 4.2.0 - autoprefixer@10.4.21(postcss@8.5.6): - dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001731 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -3354,8 +3243,6 @@ snapshots: snake-case: 2.1.0 upper-case: 1.1.3 - cookie@0.7.2: {} - core-js-pure@3.41.0: {} create-require@1.1.1: {} @@ -4165,8 +4052,6 @@ snapshots: jiti@2.4.2: {} - jose@4.15.9: {} - js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -4238,10 +4123,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - lru-cache@7.18.3: {} lucide-react@0.451.0(react@19.1.0): @@ -4297,21 +4178,6 @@ snapshots: netmask@2.0.2: {} - next-auth@4.24.11(next@15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - '@babel/runtime': 7.28.2 - '@panva/hkdf': 1.2.1 - cookie: 0.7.2 - jose: 4.15.9 - next: 15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - oauth: 0.9.15 - openid-client: 5.7.1 - preact: 10.27.0 - preact-render-to-string: 5.2.6(preact@10.27.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - uuid: 8.3.2 - next@15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@next/env': 15.3.0 @@ -4365,12 +4231,8 @@ snapshots: dependencies: path-key: 3.1.1 - oauth@0.9.15: {} - object-assign@4.1.1: {} - object-hash@2.2.0: {} - object-hash@3.0.0: {} object-inspect@1.13.4: {} @@ -4406,8 +4268,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - oidc-token-hash@5.1.0: {} - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -4416,13 +4276,6 @@ snapshots: dependencies: mimic-fn: 2.1.0 - openid-client@5.7.1: - dependencies: - jose: 4.15.9 - lru-cache: 6.0.0 - object-hash: 2.2.0 - oidc-token-hash: 5.1.0 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -4591,27 +4444,10 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact-render-to-string@5.2.6(preact@10.27.0): - dependencies: - preact: 10.27.0 - pretty-format: 3.8.0 - - preact@10.27.0: {} - prelude-ls@1.2.1: {} prettier@3.5.3: {} - pretty-format@3.8.0: {} - - prisma@6.8.2(typescript@5.8.2): - dependencies: - '@prisma/config': 6.8.2 - '@prisma/engines': 6.8.2 - optionalDependencies: - typescript: 5.8.2 - optional: true - prisma@6.8.2(typescript@5.8.3): dependencies: '@prisma/config': 6.8.2 @@ -5214,8 +5050,6 @@ snapshots: util-deprecate@1.0.2: {} - uuid@8.3.2: {} - v8-compile-cache-lib@3.0.1: {} validate-npm-package-name@5.0.1: {} @@ -5292,8 +5126,6 @@ snapshots: wrappy@1.0.2: {} - yallist@4.0.0: {} - yaml@2.8.0: {} yn@3.1.1: {}