diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..e1037e9
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,2 @@
+DATABASE_URL="mysql://username:password@host:port/database"
+NEXTAUTH_SECRET="your-secret-key"
diff --git a/.gitignore b/.gitignore
index d32cc78..14e8ef7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,7 +30,7 @@ yarn-debug.log*
yarn-error.log*
# env files (can opt-in for committing if needed)
-.env*
+.env
# vercel
.vercel
diff --git a/app/(user)/layout.tsx b/app/(user)/layout.tsx
new file mode 100644
index 0000000..89fbfa5
--- /dev/null
+++ b/app/(user)/layout.tsx
@@ -0,0 +1,12 @@
+import Navbar from "@/components/Navbar";
+import Footer from "@/components/Footer";
+
+export default function Layout({ children }: { children: React.ReactNode }) {
+ return (
+
+
+ {children}
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/_app.tsx b/app/_app.tsx
deleted file mode 100644
index a8be272..0000000
--- a/app/_app.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-// pages/_app.tsx
-import "@/styles/globals.css";
-import Navbar from "@/components/Navbar";
-import Footer from "@/components/Footer";
-import { AppProps } from "next/app";
-import localFont from "next/font/local";
-
-const googlesans = localFont({
- src: [
- {
- path: "../assets/Fonts/GoogleSans-Regular-v1.27.ttf",
- weight: "400",
- style: "normal",
- },
- {
- path: "../assets/Fonts/GoogleSans-Italic-v1.27.ttf",
- weight: "400",
- style: "italic",
- },
- {
- path: "../assets/Fonts/GoogleSans-Medium-v1.27.ttf",
- weight: "500",
- style: "normal",
- },
- {
- path: "../assets/Fonts/GoogleSans-MediumItalic-v1.27.ttf",
- weight: "500",
- style: "italic",
- },
- {
- path: "../assets/Fonts/GoogleSans-Bold-v1.27.ttf",
- weight: "700",
- style: "normal",
- },
- {
- path: "../assets/Fonts/GoogleSans-BoldItalic-v1.27.ttf",
- weight: "700",
- style: "italic",
- },
- ],
-});
-
-export default function App({ Component, pageProps }: AppProps) {
- return (
-
-
-
-
-
-
-
- );
-}
diff --git a/app/_document.tsx b/app/_document.tsx
deleted file mode 100644
index 1f2a00d..0000000
--- a/app/_document.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import Footer from "@/components/Footer";
-import Navbar from "@/components/Navbar";
-import { Head, Html, Main, NextScript } from "next/document";
-
-export default function Document() {
- return (
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/app/admin/dashboard/page.tsx b/app/admin/dashboard/page.tsx
index d86d3be..b790304 100644
--- a/app/admin/dashboard/page.tsx
+++ b/app/admin/dashboard/page.tsx
@@ -1,37 +1,11 @@
+"use client"
import React from 'react';
-// import { Card } from '@/components/CardName';
-import Container from "@/components/Container";
-
+import { useSession } from "next-auth/react";
function Page() {
-
- const getName = "Lorem";
- const greeting = (): string => {
- const clock = new Date().getHours();
- if (clock < 12) {
- return "Good Morning";
- } else if (clock < 18) {
- return "Good Afternoon";
- } else if (clock < 22) {
- return "Good Evening";
- } else {
- return "Good Night";
- }
- }
-
+ const { data: session } = useSession();
return (
<>
- Hai, {getName} !!!!, {greeting()} 👋
-
- {/* konten */}
-
-
Short Summary
-
-
- lakjwd
-
-
-
-
+ {JSON.stringify(session)}
>
);
}
diff --git a/app/admin/layout.tsx b/app/admin/layout.tsx
index 161ebf5..108d3fd 100644
--- a/app/admin/layout.tsx
+++ b/app/admin/layout.tsx
@@ -1,3 +1,4 @@
+"use client"
import { SidebarInset, SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar"
import { AppSidebar } from "@/components/app-sidebar"
import {
@@ -12,7 +13,7 @@ import {
import { LogOut, User } from "lucide-react"
import { Separator } from "@/components/ui/separator"
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
-
+import { signOut } from "next-auth/react"
export default function Layout({ children }: { children: React.ReactNode }) {
@@ -49,7 +50,7 @@ export default function Layout({ children }: { children: React.ReactNode }) {
Profile
-
+ signOut()}>
Log out
diff --git a/app/api/auth/[...nextauth]/route.ts b/app/api/auth/[...nextauth]/route.ts
new file mode 100644
index 0000000..cf499ae
--- /dev/null
+++ b/app/api/auth/[...nextauth]/route.ts
@@ -0,0 +1,6 @@
+import NextAuth from "next-auth/next";
+import { authOptions } from "@/lib/auth";
+
+const handler = NextAuth(authOptions);
+
+export { handler as GET, handler as POST };
diff --git a/app/auth/login/form.tsx b/app/auth/login/form.tsx
new file mode 100644
index 0000000..e82a050
--- /dev/null
+++ b/app/auth/login/form.tsx
@@ -0,0 +1,121 @@
+"use client"
+import React, { useEffect } from 'react'
+import { Input } from "@/components/ui/input"
+import { Button } from "@/components/ui/button"
+import { z } from "zod"
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { signIn } from "next-auth/react"
+import toast from "react-hot-toast"
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form"
+import { useSessionContext } from '@/app/context/sessionContext'
+
+const schema = z.object({
+ email: z.string().email({ message: "Invalid email address" }),
+ password: z.string().min(8, { message: "Password must be at least 8 characters" }),
+})
+
+export default function FormComponent() {
+ const form = useForm>({
+ resolver: zodResolver(schema),
+ defaultValues: {
+ email: "",
+ password: "",
+ },
+ })
+
+ const { isLoading, session } = useSessionContext()
+
+ async function onSubmit(values: z.infer) {
+ try {
+ const response = await signIn("credentials", {
+ email: values.email,
+ password: values.password,
+ redirect: false,
+ method: "post",
+ })
+
+ if (response?.ok) {
+ toast.success("Login Successful")
+ } else {
+ const errorMessage = response?.error === "CredentialsSignin"
+ ? "Email or password is incorrect"
+ : response?.error
+ toast.error(errorMessage)
+ }
+ } catch (error) {
+ toast.error("An unexpected error occurred.")
+ console.error("Login error:", error)
+ }
+ }
+
+ useEffect(() => {
+ if (!isLoading && session) {
+ switch (session.user.role) {
+ case "ADMIN":
+ case "SUPERADMIN":
+ window.location.href = "/admin/dashboard"
+ break
+ case "MEMBER":
+ window.location.href = "/"
+ break
+ default:
+ window.location.href = "/"
+ break
+ }
+ }
+ }, [isLoading, session])
+
+ return (
+
+
+ )
+}
diff --git a/app/auth/login/page.tsx b/app/auth/login/page.tsx
index ed5d07f..63d1614 100644
--- a/app/auth/login/page.tsx
+++ b/app/auth/login/page.tsx
@@ -1,8 +1,5 @@
-import { Label } from "@/components/ui/label"
-import { Input } from "@/components/ui/input"
import Link from "next/link"
-import { Button } from "@/components/ui/button"
-
+import From from './form'
export default function Page() {
return (
@@ -22,24 +19,14 @@ export default function Page() {
Welcome back!
Enter your email and password to sign in.
-
+
+
+ Don't have an account?{" "}
+
+ {" "}
+ Sign Up{" "}
+
+
diff --git a/app/context/sessionContext.tsx b/app/context/sessionContext.tsx
new file mode 100644
index 0000000..0fcebce
--- /dev/null
+++ b/app/context/sessionContext.tsx
@@ -0,0 +1,38 @@
+"use client"
+import React, { createContext, useContext, useState, useEffect } from "react";
+import { useSession } from "next-auth/react";
+import { Session } from "next-auth";
+
+interface SessionContextType {
+ session: Session | null;
+ isLoading: boolean;
+}
+
+const SessionContext = createContext(undefined);
+
+interface SessionProviderProps {
+ children: React.ReactNode;
+}
+
+export const SessionProvider: React.FC = ({ children }) => {
+ const { data: session, status } = useSession();
+ const [isLoading, setIsLoading] = useState(status === "loading");
+
+ useEffect(() => {
+ setIsLoading(status === "loading");
+ }, [status]);
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useSessionContext = (): SessionContextType => {
+ const context = useContext(SessionContext);
+ if (!context) {
+ throw new Error("useSessionContext must be used within a SessionProvider");
+ }
+ return context;
+};
diff --git a/app/layout.tsx b/app/layout.tsx
index a4d2a16..597b572 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,9 +1,8 @@
-"use client"
-import Navbar from "@/components/Navbar"; // Pastikan jalur ini benar
-import Footer from "@/components/Footer"; // Pastikan jalur ini benar
import localFont from "next/font/local";
-import { usePathname } from "next/navigation"; // Import usePathname untuk mengakses path
+import { NextAuthProvider } from "./providers/NextAuthProvider";
+import { SessionProvider } from '@/app/context/sessionContext'
import "./globals.css";
+import { Toaster } from "react-hot-toast";
const geistSans = localFont({
src: "./fonts/GeistVF.woff",
@@ -26,21 +25,16 @@ export default function RootLayout({
}: {
children: React.ReactNode;
}) {
- // Menggunakan useRouter untuk mendapatkan path saat ini
- const pathname = usePathname();
-
- // Mengecek apakah path mengandung "/admin"
- const isAdminPage = pathname.startsWith('/admin/');
return (
-
+
+
+
+
- {/* Navbar dan Footer hanya akan tampil jika bukan di halaman admin */}
- {!isAdminPage && }
- {children}
- {!isAdminPage && }
+ className={`${geistSans.variable} ${geistMono.variable} antialiased`}>
+ {children}
+
);
diff --git a/app/providers/NextAuthProvider.tsx b/app/providers/NextAuthProvider.tsx
new file mode 100644
index 0000000..5a340d8
--- /dev/null
+++ b/app/providers/NextAuthProvider.tsx
@@ -0,0 +1,11 @@
+"use client";
+
+import { SessionProvider } from "next-auth/react";
+
+type Props = {
+ children?: React.ReactNode;
+};
+
+export const NextAuthProvider = ({ children }: Props) => {
+ return {children};
+};
\ No newline at end of file
diff --git a/lib/auth.ts b/lib/auth.ts
new file mode 100644
index 0000000..90d59e0
--- /dev/null
+++ b/lib/auth.ts
@@ -0,0 +1,80 @@
+import { NextAuthOptions } from "next-auth";
+import { PrismaAdapter } from "@next-auth/prisma-adapter";
+import CredentialsProvider from "next-auth/providers/credentials";
+import { prisma } from "@/lib/prisma";
+import bcrypt from "bcrypt";
+
+export const authOptions: NextAuthOptions = {
+ adapter: PrismaAdapter(prisma),
+ pages: {
+ signIn: "/auth/login",
+ },
+ providers: [
+ CredentialsProvider({
+ name: "Credentials",
+ credentials: {
+ email: { label: "Email", type: "email" },
+ password: { label: "Password", type: "password" },
+ },
+ async authorize(credentials) {
+ if (!credentials?.email || !credentials.password) {
+ return null;
+ }
+ const user = await prisma.user.findUnique({
+ where: { email: credentials.email },
+ });
+
+ if (
+ user &&
+ bcrypt.compareSync(credentials.password, user.password)
+ ) {
+ return {
+ id: user.id,
+ email: user.email,
+ name: user.name,
+ avatar: user.avatar,
+ role: user.role,
+ };
+ }
+
+ return null;
+ },
+ }),
+ ],
+ session: {
+ strategy: "jwt",
+ },
+ secret: process.env.NEXTAUTH_SECRET,
+ callbacks: {
+ jwt: ({ token, user, trigger, session }) => {
+ console.log("JWT Callback", { token, user });
+ if (user) {
+ token.id = user.id;
+ token.email = user.email ?? null;
+ token.name = user.name ?? null;
+ token.role = user.role ?? null;
+ token.avatar = user.avatar ?? null;
+ }
+ if (trigger === "update" && session) {
+ token.id = session.user.id;
+ token.email = session.user.email;
+ token.name = session.user.name;
+ token.role = session.user.role;
+ token.avatar = session.user.avatar
+ }
+ return token;
+ },
+ session: ({ session, token }) => {
+ console.log("Session Callback", { session, token });
+ return {
+ ...session,
+ user: {
+ ...session.user,
+ id: token.id,
+ role: token.role,
+ avatar: token.avatar,
+ },
+ };
+ },
+ },
+};
diff --git a/lib/prisma.ts b/lib/prisma.ts
new file mode 100644
index 0000000..3ce99fb
--- /dev/null
+++ b/lib/prisma.ts
@@ -0,0 +1,11 @@
+import { PrismaClient } from "@prisma/client";
+
+const globalForPrisma = global as unknown as { prisma: PrismaClient };
+
+export const prisma =
+ globalForPrisma.prisma ||
+ new PrismaClient({
+ log: ["query"],
+ });
+
+if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
diff --git a/package.json b/package.json
index f6c264f..ce8a669 100644
--- a/package.json
+++ b/package.json
@@ -2,6 +2,9 @@
"name": "homesite-refactor",
"version": "0.1.0",
"private": true,
+ "prisma": {
+ "seed": "ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts"
+ },
"scripts": {
"dev": "next dev --turbopack",
"build": "next build",
@@ -13,6 +16,8 @@
},
"dependencies": {
"@hookform/resolvers": "^3.9.1",
+ "@next-auth/prisma-adapter": "^1.0.7",
+ "@prisma/client": "^6.1.0",
"@radix-ui/react-avatar": "^1.1.1",
"@radix-ui/react-dialog": "^1.1.4",
"@radix-ui/react-dropdown-menu": "^2.1.2",
@@ -23,14 +28,17 @@
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.6",
"@tanstack/react-table": "^8.20.6",
+ "bcrypt": "^5.1.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"gray-matter": "^4.0.3",
"lucide-react": "^0.468.0",
"next": "15.0.4",
+ "next-auth": "^4.24.11",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-hook-form": "^7.54.0",
+ "react-hot-toast": "^2.5.1",
"sweetalert2": "^11.15.3",
"tailwind-merge": "^2.5.5",
"tailwindcss-animate": "^1.0.7",
@@ -38,14 +46,17 @@
"zod": "^3.24.1"
},
"devDependencies": {
- "@types/node": "^20",
+ "@types/bcrypt": "^5.0.2",
+ "@types/node": "^20.17.10",
"@types/react": "^19",
"@types/react-dom": "^19",
"eslint": "^8",
"eslint-config-next": "15.0.4",
"postcss": "^8",
+ "prisma": "^6.1.0",
"tailwindcss": "^3.4.1",
- "typescript": "^5"
+ "ts-node": "^10.9.2",
+ "typescript": "^5.7.2"
},
"engines": {
"node": ">=20.0.0"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b964c25..7d0a781 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,6 +11,12 @@ importers:
'@hookform/resolvers':
specifier: ^3.9.1
version: 3.9.1(react-hook-form@7.54.0(react@19.0.0))
+ '@next-auth/prisma-adapter':
+ specifier: ^1.0.7
+ version: 1.0.7(@prisma/client@6.1.0(prisma@6.1.0))(next-auth@4.24.11(next@15.0.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
+ '@prisma/client':
+ specifier: ^6.1.0
+ version: 6.1.0(prisma@6.1.0)
'@radix-ui/react-avatar':
specifier: ^1.1.1
version: 1.1.1(@types/react-dom@19.0.2(@types/react@19.0.1))(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@@ -41,6 +47,9 @@ importers:
'@tanstack/react-table':
specifier: ^8.20.6
version: 8.20.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ bcrypt:
+ specifier: ^5.1.1
+ version: 5.1.1
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -56,6 +65,9 @@ importers:
next:
specifier: 15.0.4
version: 15.0.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ next-auth:
+ specifier: ^4.24.11
+ version: 4.24.11(next@15.0.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react:
specifier: ^19.0.0
version: 19.0.0
@@ -65,6 +77,9 @@ importers:
react-hook-form:
specifier: ^7.54.0
version: 7.54.0(react@19.0.0)
+ react-hot-toast:
+ specifier: ^2.5.1
+ version: 2.5.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
sweetalert2:
specifier: ^11.15.3
version: 11.15.3
@@ -73,7 +88,7 @@ importers:
version: 2.5.5
tailwindcss-animate:
specifier: ^1.0.7
- version: 1.0.7(tailwindcss@3.4.16)
+ version: 1.0.7(tailwindcss@3.4.16(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2)))
uuid:
specifier: ^11.0.3
version: 11.0.3
@@ -81,8 +96,11 @@ importers:
specifier: ^3.24.1
version: 3.24.1
devDependencies:
+ '@types/bcrypt':
+ specifier: ^5.0.2
+ version: 5.0.2
'@types/node':
- specifier: ^20
+ specifier: ^20.17.10
version: 20.17.10
'@types/react':
specifier: ^19
@@ -99,11 +117,17 @@ importers:
postcss:
specifier: ^8
version: 8.4.49
+ prisma:
+ specifier: ^6.1.0
+ version: 6.1.0
tailwindcss:
specifier: ^3.4.1
- version: 3.4.16
+ version: 3.4.16(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2))
+ ts-node:
+ specifier: ^10.9.2
+ version: 10.9.2(@types/node@20.17.10)(typescript@5.7.2)
typescript:
- specifier: ^5
+ specifier: ^5.7.2
version: 5.7.2
packages:
@@ -112,6 +136,14 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
+ '@babel/runtime@7.26.0':
+ resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
+ engines: {node: '>=6.9.0'}
+
+ '@cspotcode/source-map-support@0.8.1':
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+
'@emnapi/runtime@1.3.1':
resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
@@ -293,6 +325,19 @@ packages:
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+ '@jridgewell/trace-mapping@0.3.9':
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+
+ '@mapbox/node-pre-gyp@1.0.11':
+ resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
+ hasBin: true
+
+ '@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.0.4':
resolution: {integrity: sha512-WNRvtgnRVDD4oM8gbUcRc27IAhaL4eXQ/2ovGbgLnPGUvdyDr8UdXP4Q/IBDdAdojnD2eScryIDirv0YUCjUVw==}
@@ -363,10 +408,37 @@ packages:
resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
engines: {node: '>=12.4.0'}
+ '@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'}
+ '@prisma/client@6.1.0':
+ resolution: {integrity: sha512-AbQYc5+EJKm1Ydfq3KxwcGiy7wIbm4/QbjCKWWoNROtvy7d6a3gmAGkKjK0iUCzh+rHV8xDhD5Cge8ke/kiy5Q==}
+ engines: {node: '>=18.18'}
+ peerDependencies:
+ prisma: '*'
+ peerDependenciesMeta:
+ prisma:
+ optional: true
+
+ '@prisma/debug@6.1.0':
+ resolution: {integrity: sha512-0himsvcM4DGBTtvXkd2Tggv6sl2JyUYLzEGXXleFY+7Kp6rZeSS3hiTW9mwtUlXrwYbJP6pwlVNB7jYElrjWUg==}
+
+ '@prisma/engines-version@6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959':
+ resolution: {integrity: sha512-PdJqmYM2Fd8K0weOOtQThWylwjsDlTig+8Pcg47/jszMuLL9iLIaygC3cjWJLda69siRW4STlCTMSgOjZzvKPQ==}
+
+ '@prisma/engines@6.1.0':
+ resolution: {integrity: sha512-GnYJbCiep3Vyr1P/415ReYrgJUjP79fBNc1wCo7NP6Eia0CzL2Ot9vK7Infczv3oK7JLrCcawOSAxFxNFsAERQ==}
+
+ '@prisma/fetch-engine@6.1.0':
+ resolution: {integrity: sha512-asdFi7TvPlEZ8CzSZ/+Du5wZ27q6OJbRSXh+S8ISZguu+S9KtS/gP7NeXceZyb1Jv1SM1S5YfiCv+STDsG6rrg==}
+
+ '@prisma/get-platform@6.1.0':
+ resolution: {integrity: sha512-ia8bNjboBoHkmKGGaWtqtlgQOhCi7+f85aOkPJKgNwWvYrT6l78KgojLekE8zMhVk0R9lWcifV0Pf8l3/15V0Q==}
+
'@radix-ui/number@1.1.0':
resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==}
@@ -910,6 +982,21 @@ packages:
resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==}
engines: {node: '>=12'}
+ '@tsconfig/node10@1.0.11':
+ resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
+
+ '@tsconfig/node12@1.0.11':
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+
+ '@tsconfig/node14@1.0.3':
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+
+ '@tsconfig/node16@1.0.4':
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+
+ '@types/bcrypt@5.0.2':
+ resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==}
+
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
@@ -974,16 +1061,27 @@ packages:
'@ungap/structured-clone@1.2.1':
resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==}
+ abbrev@1.1.1:
+ resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
+
acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ acorn-walk@8.3.4:
+ resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
+ engines: {node: '>=0.4.0'}
+
acorn@8.14.0:
resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
engines: {node: '>=0.4.0'}
hasBin: true
+ agent-base@6.0.2:
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+ engines: {node: '>= 6.0.0'}
+
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
@@ -1010,6 +1108,17 @@ packages:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
+ aproba@2.0.0:
+ resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
+
+ are-we-there-yet@2.0.0:
+ resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
+ engines: {node: '>=10'}
+ deprecated: This package is no longer supported.
+
+ arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+
arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
@@ -1077,6 +1186,10 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ bcrypt@5.1.1:
+ resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==}
+ engines: {node: '>= 10.0.0'}
+
binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
@@ -1126,6 +1239,10 @@ packages:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
+ chownr@2.0.0:
+ resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
+ engines: {node: '>=10'}
+
class-variance-authority@0.7.1:
resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
@@ -1146,6 +1263,10 @@ packages:
color-string@1.9.1:
resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+ color-support@1.1.3:
+ resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
+ hasBin: true
+
color@4.2.3:
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
engines: {node: '>=12.5.0'}
@@ -1157,6 +1278,16 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ console-control-strings@1.1.0:
+ resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
+
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+ engines: {node: '>= 0.6'}
+
+ create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
@@ -1212,6 +1343,9 @@ packages:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
+ delegates@1.0.0:
+ resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
+
detect-libc@2.0.3:
resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
engines: {node: '>=8'}
@@ -1222,6 +1356,10 @@ packages:
didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+ diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
@@ -1452,6 +1590,10 @@ packages:
resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
engines: {node: '>=14'}
+ fs-minipass@2.1.0:
+ resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
+ engines: {node: '>= 8'}
+
fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
@@ -1470,6 +1612,11 @@ packages:
functions-have-names@1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ gauge@3.0.2:
+ resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
+ engines: {node: '>=10'}
+ deprecated: This package is no longer supported.
+
get-intrinsic@1.2.6:
resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==}
engines: {node: '>= 0.4'}
@@ -1509,6 +1656,11 @@ packages:
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'}
+ goober@2.1.16:
+ resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==}
+ peerDependencies:
+ csstype: ^3.0.10
+
gopd@1.2.0:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
@@ -1545,10 +1697,17 @@ packages:
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
engines: {node: '>= 0.4'}
+ has-unicode@2.0.1:
+ resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
+
hasown@2.0.2:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
+ https-proxy-agent@5.0.1:
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+ engines: {node: '>= 6'}
+
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
@@ -1713,6 +1872,9 @@ packages:
resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
hasBin: true
+ jose@4.15.9:
+ resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==}
+
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -1780,11 +1942,22 @@ 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'}
+
lucide-react@0.468.0:
resolution: {integrity: sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
+ make-dir@3.1.0:
+ resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
+ engines: {node: '>=8'}
+
+ make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
math-intrinsics@1.0.0:
resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==}
engines: {node: '>= 0.4'}
@@ -1807,10 +1980,27 @@ packages:
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ minipass@3.3.6:
+ resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
+ engines: {node: '>=8'}
+
+ minipass@5.0.0:
+ resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
+ engines: {node: '>=8'}
+
minipass@7.1.2:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
+ minizlib@2.1.2:
+ resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
+ engines: {node: '>= 8'}
+
+ mkdirp@1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -1825,6 +2015,20 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ 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.0.4:
resolution: {integrity: sha512-nuy8FH6M1FG0lktGotamQDCXhh5hZ19Vo0ht1AOIQWrYJLP598TIUagKtvJrfJ5AGwB/WmDqkKaKhMpVifvGPA==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
@@ -1846,14 +2050,42 @@ packages:
sass:
optional: true
+ node-addon-api@5.1.0:
+ resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==}
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
+ nopt@5.0.0:
+ resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
+ npmlog@5.0.1:
+ resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
+ deprecated: This package is no longer supported.
+
+ 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'}
@@ -1886,9 +2118,16 @@ packages:
resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
engines: {node: '>= 0.4'}
+ oidc-token-hash@5.0.3:
+ resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==}
+ engines: {node: ^10.13.0 || >=12.0.0}
+
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ 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'}
@@ -1991,10 +2230,26 @@ packages:
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
engines: {node: ^10 || ^12 || >=14}
+ preact-render-to-string@5.2.6:
+ resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==}
+ peerDependencies:
+ preact: '>=10'
+
+ preact@10.25.4:
+ resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==}
+
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
+ pretty-format@3.8.0:
+ resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==}
+
+ prisma@6.1.0:
+ resolution: {integrity: sha512-aFI3Yi+ApUxkwCJJwyQSwpyzUX7YX3ihzuHNHOyv4GJg3X5tQsmRaJEnZ+ZyfHpMtnyahhmXVfbTZ+lS8ZtfKw==}
+ engines: {node: '>=18.18'}
+ hasBin: true
+
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
@@ -2016,6 +2271,13 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17 || ^18 || ^19
+ react-hot-toast@2.5.1:
+ resolution: {integrity: sha512-54Gq1ZD1JbmAb4psp9bvFHjS7lje+8ubboUmvKZkCsQBLH6AOpZ9JemfRvIdHcfb9AZXRaFLrb3qUobGYDJhFQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>=16'
+ react-dom: '>=16'
+
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
@@ -2086,6 +2348,10 @@ packages:
read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
@@ -2094,6 +2360,9 @@ packages:
resolution: {integrity: sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==}
engines: {node: '>= 0.4'}
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
regexp.prototype.flags@1.5.3:
resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==}
engines: {node: '>= 0.4'}
@@ -2129,6 +2398,9 @@ packages:
resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
engines: {node: '>=0.4'}
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
safe-regex-test@1.0.3:
resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
engines: {node: '>= 0.4'}
@@ -2149,6 +2421,9 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ set-blocking@2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+
set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
@@ -2185,6 +2460,9 @@ packages:
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
@@ -2237,6 +2515,9 @@ packages:
resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
engines: {node: '>= 0.4'}
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
@@ -2303,6 +2584,10 @@ packages:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
+ tar@6.2.1:
+ resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
+ engines: {node: '>=10'}
+
text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
@@ -2317,6 +2602,9 @@ packages:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
ts-api-utils@1.4.3:
resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
engines: {node: '>=16'}
@@ -2326,6 +2614,20 @@ packages:
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+ ts-node@10.9.2:
+ resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+
tsconfig-paths@3.15.0:
resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
@@ -2407,6 +2709,19 @@ packages:
resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==}
hasBin: true
+ 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==}
+
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
which-boxed-primitive@1.1.0:
resolution: {integrity: sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==}
engines: {node: '>= 0.4'}
@@ -2428,6 +2743,9 @@ packages:
engines: {node: '>= 8'}
hasBin: true
+ wide-align@1.1.5:
+ resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
+
word-wrap@1.2.5:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
@@ -2443,11 +2761,18 @@ 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.6.1:
resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==}
engines: {node: '>= 14'}
hasBin: true
+ yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+
yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
@@ -2459,6 +2784,14 @@ snapshots:
'@alloc/quick-lru@5.2.0': {}
+ '@babel/runtime@7.26.0':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@cspotcode/source-map-support@0.8.1':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+
'@emnapi/runtime@1.3.1':
dependencies:
tslib: 2.8.1
@@ -2621,6 +2954,31 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping@0.3.9':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ '@mapbox/node-pre-gyp@1.0.11':
+ dependencies:
+ detect-libc: 2.0.3
+ https-proxy-agent: 5.0.1
+ make-dir: 3.1.0
+ node-fetch: 2.7.0
+ nopt: 5.0.0
+ npmlog: 5.0.1
+ rimraf: 3.0.2
+ semver: 7.6.3
+ tar: 6.2.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@next-auth/prisma-adapter@1.0.7(@prisma/client@6.1.0(prisma@6.1.0))(next-auth@4.24.11(next@15.0.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))':
+ dependencies:
+ '@prisma/client': 6.1.0(prisma@6.1.0)
+ next-auth: 4.24.11(next@15.0.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+
'@next/env@15.0.4': {}
'@next/eslint-plugin-next@15.0.4':
@@ -2665,9 +3023,36 @@ snapshots:
'@nolyfill/is-core-module@1.0.39': {}
+ '@panva/hkdf@1.2.1': {}
+
'@pkgjs/parseargs@0.11.0':
optional: true
+ '@prisma/client@6.1.0(prisma@6.1.0)':
+ optionalDependencies:
+ prisma: 6.1.0
+
+ '@prisma/debug@6.1.0': {}
+
+ '@prisma/engines-version@6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959': {}
+
+ '@prisma/engines@6.1.0':
+ dependencies:
+ '@prisma/debug': 6.1.0
+ '@prisma/engines-version': 6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959
+ '@prisma/fetch-engine': 6.1.0
+ '@prisma/get-platform': 6.1.0
+
+ '@prisma/fetch-engine@6.1.0':
+ dependencies:
+ '@prisma/debug': 6.1.0
+ '@prisma/engines-version': 6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959
+ '@prisma/get-platform': 6.1.0
+
+ '@prisma/get-platform@6.1.0':
+ dependencies:
+ '@prisma/debug': 6.1.0
+
'@radix-ui/number@1.1.0': {}
'@radix-ui/primitive@1.1.0': {}
@@ -3184,6 +3569,18 @@ snapshots:
'@tanstack/table-core@8.20.5': {}
+ '@tsconfig/node10@1.0.11': {}
+
+ '@tsconfig/node12@1.0.11': {}
+
+ '@tsconfig/node14@1.0.3': {}
+
+ '@tsconfig/node16@1.0.4': {}
+
+ '@types/bcrypt@5.0.2':
+ dependencies:
+ '@types/node': 20.17.10
+
'@types/json5@0.0.29': {}
'@types/node@20.17.10':
@@ -3277,12 +3674,24 @@ snapshots:
'@ungap/structured-clone@1.2.1': {}
+ abbrev@1.1.1: {}
+
acorn-jsx@5.3.2(acorn@8.14.0):
dependencies:
acorn: 8.14.0
+ acorn-walk@8.3.4:
+ dependencies:
+ acorn: 8.14.0
+
acorn@8.14.0: {}
+ agent-base@6.0.2:
+ dependencies:
+ debug: 4.4.0
+ transitivePeerDependencies:
+ - supports-color
+
ajv@6.12.6:
dependencies:
fast-deep-equal: 3.1.3
@@ -3307,6 +3716,15 @@ snapshots:
normalize-path: 3.0.0
picomatch: 2.3.1
+ aproba@2.0.0: {}
+
+ are-we-there-yet@2.0.0:
+ dependencies:
+ delegates: 1.0.0
+ readable-stream: 3.6.2
+
+ arg@4.1.3: {}
+
arg@5.0.2: {}
argparse@1.0.10:
@@ -3398,6 +3816,14 @@ snapshots:
balanced-match@1.0.2: {}
+ bcrypt@5.1.1:
+ dependencies:
+ '@mapbox/node-pre-gyp': 1.0.11
+ node-addon-api: 5.1.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
binary-extensions@2.3.0: {}
brace-expansion@1.1.11:
@@ -3457,6 +3883,8 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
+ chownr@2.0.0: {}
+
class-variance-authority@0.7.1:
dependencies:
clsx: 2.1.1
@@ -3477,6 +3905,8 @@ snapshots:
simple-swizzle: 0.2.2
optional: true
+ color-support@1.1.3: {}
+
color@4.2.3:
dependencies:
color-convert: 2.0.1
@@ -3487,6 +3917,12 @@ snapshots:
concat-map@0.0.1: {}
+ console-control-strings@1.1.0: {}
+
+ cookie@0.7.2: {}
+
+ create-require@1.1.1: {}
+
cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
@@ -3539,13 +3975,16 @@ snapshots:
has-property-descriptors: 1.0.2
object-keys: 1.1.1
- detect-libc@2.0.3:
- optional: true
+ delegates@1.0.0: {}
+
+ detect-libc@2.0.3: {}
detect-node-es@1.1.0: {}
didyoumean@1.2.2: {}
+ diff@4.0.2: {}
+
dlv@1.1.3: {}
doctrine@2.1.0:
@@ -3927,6 +4366,10 @@ snapshots:
cross-spawn: 7.0.6
signal-exit: 4.1.0
+ fs-minipass@2.1.0:
+ dependencies:
+ minipass: 3.3.6
+
fs.realpath@1.0.0: {}
fsevents@2.3.3:
@@ -3943,6 +4386,18 @@ snapshots:
functions-have-names@1.2.3: {}
+ gauge@3.0.2:
+ dependencies:
+ aproba: 2.0.0
+ color-support: 1.1.3
+ console-control-strings: 1.1.0
+ has-unicode: 2.0.1
+ object-assign: 4.1.1
+ signal-exit: 3.0.7
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wide-align: 1.1.5
+
get-intrinsic@1.2.6:
dependencies:
call-bind-apply-helpers: 1.0.1
@@ -4003,6 +4458,10 @@ snapshots:
define-properties: 1.2.1
gopd: 1.2.0
+ goober@2.1.16(csstype@3.1.3):
+ dependencies:
+ csstype: 3.1.3
+
gopd@1.2.0: {}
graceful-fs@4.2.11: {}
@@ -4034,10 +4493,19 @@ snapshots:
dependencies:
has-symbols: 1.1.0
+ has-unicode@2.0.1: {}
+
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
+ https-proxy-agent@5.0.1:
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.4.0
+ transitivePeerDependencies:
+ - supports-color
+
ignore@5.3.2: {}
import-fresh@3.3.0:
@@ -4197,6 +4665,8 @@ snapshots:
jiti@1.21.6: {}
+ jose@4.15.9: {}
+
js-tokens@4.0.0: {}
js-yaml@3.14.1:
@@ -4258,10 +4728,20 @@ snapshots:
lru-cache@10.4.3: {}
+ lru-cache@6.0.0:
+ dependencies:
+ yallist: 4.0.0
+
lucide-react@0.468.0(react@19.0.0):
dependencies:
react: 19.0.0
+ make-dir@3.1.0:
+ dependencies:
+ semver: 6.3.1
+
+ make-error@1.3.6: {}
+
math-intrinsics@1.0.0: {}
merge2@1.4.1: {}
@@ -4281,8 +4761,21 @@ snapshots:
minimist@1.2.8: {}
+ minipass@3.3.6:
+ dependencies:
+ yallist: 4.0.0
+
+ minipass@5.0.0: {}
+
minipass@7.1.2: {}
+ minizlib@2.1.2:
+ dependencies:
+ minipass: 3.3.6
+ yallist: 4.0.0
+
+ mkdirp@1.0.4: {}
+
ms@2.1.3: {}
mz@2.7.0:
@@ -4295,6 +4788,21 @@ snapshots:
natural-compare@1.4.0: {}
+ next-auth@4.24.11(next@15.0.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+ dependencies:
+ '@babel/runtime': 7.26.0
+ '@panva/hkdf': 1.2.1
+ cookie: 0.7.2
+ jose: 4.15.9
+ next: 15.0.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ oauth: 0.9.15
+ openid-client: 5.7.1
+ preact: 10.25.4
+ preact-render-to-string: 5.2.6(preact@10.25.4)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ uuid: 8.3.2
+
next@15.0.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
'@next/env': 15.0.4
@@ -4320,10 +4828,31 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
+ node-addon-api@5.1.0: {}
+
+ node-fetch@2.7.0:
+ dependencies:
+ whatwg-url: 5.0.0
+
+ nopt@5.0.0:
+ dependencies:
+ abbrev: 1.1.1
+
normalize-path@3.0.0: {}
+ npmlog@5.0.1:
+ dependencies:
+ are-we-there-yet: 2.0.0
+ console-control-strings: 1.1.0
+ gauge: 3.0.2
+ set-blocking: 2.0.0
+
+ oauth@0.9.15: {}
+
object-assign@4.1.1: {}
+ object-hash@2.2.0: {}
+
object-hash@3.0.0: {}
object-inspect@1.13.3: {}
@@ -4362,10 +4891,19 @@ snapshots:
define-properties: 1.2.1
es-object-atoms: 1.0.0
+ oidc-token-hash@5.0.3: {}
+
once@1.4.0:
dependencies:
wrappy: 1.0.2
+ openid-client@5.7.1:
+ dependencies:
+ jose: 4.15.9
+ lru-cache: 6.0.0
+ object-hash: 2.2.0
+ oidc-token-hash: 5.0.3
+
optionator@0.9.4:
dependencies:
deep-is: 0.1.4
@@ -4424,12 +4962,13 @@ snapshots:
camelcase-css: 2.0.1
postcss: 8.4.49
- postcss-load-config@4.0.2(postcss@8.4.49):
+ postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2)):
dependencies:
lilconfig: 3.1.3
yaml: 2.6.1
optionalDependencies:
postcss: 8.4.49
+ ts-node: 10.9.2(@types/node@20.17.10)(typescript@5.7.2)
postcss-nested@6.2.0(postcss@8.4.49):
dependencies:
@@ -4455,8 +4994,23 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
+ preact-render-to-string@5.2.6(preact@10.25.4):
+ dependencies:
+ preact: 10.25.4
+ pretty-format: 3.8.0
+
+ preact@10.25.4: {}
+
prelude-ls@1.2.1: {}
+ pretty-format@3.8.0: {}
+
+ prisma@6.1.0:
+ dependencies:
+ '@prisma/engines': 6.1.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
prop-types@15.8.1:
dependencies:
loose-envify: 1.4.0
@@ -4476,6 +5030,13 @@ snapshots:
dependencies:
react: 19.0.0
+ react-hot-toast@2.5.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+ dependencies:
+ csstype: 3.1.3
+ goober: 2.1.16(csstype@3.1.3)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+
react-is@16.13.1: {}
react-remove-scroll-bar@2.3.6(@types/react@19.0.1)(react@19.0.0):
@@ -4539,6 +5100,12 @@ snapshots:
dependencies:
pify: 2.3.0
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
@@ -4554,6 +5121,8 @@ snapshots:
gopd: 1.2.0
which-builtin-type: 1.2.0
+ regenerator-runtime@0.14.1: {}
+
regexp.prototype.flags@1.5.3:
dependencies:
call-bind: 1.0.8
@@ -4594,6 +5163,8 @@ snapshots:
has-symbols: 1.1.0
isarray: 2.0.5
+ safe-buffer@5.2.1: {}
+
safe-regex-test@1.0.3:
dependencies:
call-bind: 1.0.8
@@ -4611,6 +5182,8 @@ snapshots:
semver@7.6.3: {}
+ set-blocking@2.0.0: {}
+
set-function-length@1.2.2:
dependencies:
define-data-property: 1.1.4
@@ -4688,6 +5261,8 @@ snapshots:
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
+ signal-exit@3.0.7: {}
+
signal-exit@4.1.0: {}
simple-swizzle@0.2.2:
@@ -4764,6 +5339,10 @@ snapshots:
define-properties: 1.2.1
es-object-atoms: 1.0.0
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
@@ -4803,11 +5382,11 @@ snapshots:
tailwind-merge@2.5.5: {}
- tailwindcss-animate@1.0.7(tailwindcss@3.4.16):
+ tailwindcss-animate@1.0.7(tailwindcss@3.4.16(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2))):
dependencies:
- tailwindcss: 3.4.16
+ tailwindcss: 3.4.16(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2))
- tailwindcss@3.4.16:
+ tailwindcss@3.4.16(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2)):
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
@@ -4826,7 +5405,7 @@ snapshots:
postcss: 8.4.49
postcss-import: 15.1.0(postcss@8.4.49)
postcss-js: 4.0.1(postcss@8.4.49)
- postcss-load-config: 4.0.2(postcss@8.4.49)
+ postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2))
postcss-nested: 6.2.0(postcss@8.4.49)
postcss-selector-parser: 6.1.2
resolve: 1.22.8
@@ -4836,6 +5415,15 @@ snapshots:
tapable@2.2.1: {}
+ tar@6.2.1:
+ dependencies:
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ minipass: 5.0.0
+ minizlib: 2.1.2
+ mkdirp: 1.0.4
+ yallist: 4.0.0
+
text-table@0.2.0: {}
thenify-all@1.6.0:
@@ -4850,12 +5438,32 @@ snapshots:
dependencies:
is-number: 7.0.0
+ tr46@0.0.3: {}
+
ts-api-utils@1.4.3(typescript@5.7.2):
dependencies:
typescript: 5.7.2
ts-interface-checker@0.1.13: {}
+ ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.11
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 20.17.10
+ acorn: 8.14.0
+ acorn-walk: 8.3.4
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.7.2
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+
tsconfig-paths@3.15.0:
dependencies:
'@types/json5': 0.0.29
@@ -4945,6 +5553,17 @@ snapshots:
uuid@11.0.3: {}
+ uuid@8.3.2: {}
+
+ v8-compile-cache-lib@3.0.1: {}
+
+ webidl-conversions@3.0.1: {}
+
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
which-boxed-primitive@1.1.0:
dependencies:
is-bigint: 1.1.0
@@ -4988,6 +5607,10 @@ snapshots:
dependencies:
isexe: 2.0.0
+ wide-align@1.1.5:
+ dependencies:
+ string-width: 4.2.3
+
word-wrap@1.2.5: {}
wrap-ansi@7.0.0:
@@ -5004,8 +5627,12 @@ snapshots:
wrappy@1.0.2: {}
+ yallist@4.0.0: {}
+
yaml@2.6.1: {}
+ yn@3.1.1: {}
+
yocto-queue@0.1.0: {}
zod@3.24.1: {}
diff --git a/prisma/migrations/20241230150056_init/migration.sql b/prisma/migrations/20241230150056_init/migration.sql
new file mode 100644
index 0000000..ff319e7
--- /dev/null
+++ b/prisma/migrations/20241230150056_init/migration.sql
@@ -0,0 +1,15 @@
+-- CreateTable
+CREATE TABLE `User` (
+ `id` VARCHAR(191) NOT NULL,
+ `nim` VARCHAR(191) NOT NULL,
+ `name` VARCHAR(191) NOT NULL,
+ `avatar` VARCHAR(191) NOT NULL,
+ `role` ENUM('MEMBER', 'ADMIN', 'SUPERADMIN') NOT NULL DEFAULT 'MEMBER',
+ `email` VARCHAR(191) NOT NULL,
+ `password` VARCHAR(191) NOT NULL,
+ `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ `updatedAt` DATETIME(3) NOT NULL,
+
+ UNIQUE INDEX `User_email_key`(`email`),
+ PRIMARY KEY (`id`)
+) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
diff --git a/prisma/migrations/20250101092221_init/migration.sql b/prisma/migrations/20250101092221_init/migration.sql
new file mode 100644
index 0000000..d24c404
--- /dev/null
+++ b/prisma/migrations/20250101092221_init/migration.sql
@@ -0,0 +1,64 @@
+-- CreateTable
+CREATE TABLE `Article` (
+ `id` VARCHAR(191) NOT NULL,
+ `title` VARCHAR(191) NOT NULL,
+ `content` TEXT NOT NULL,
+ `image` VARCHAR(191) NOT NULL,
+ `authorId` VARCHAR(191) NOT NULL,
+ `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ `updatedAt` DATETIME(3) NOT NULL,
+
+ PRIMARY KEY (`id`)
+) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+
+-- CreateTable
+CREATE TABLE `Quiz` (
+ `id` VARCHAR(191) NOT NULL,
+ `title` VARCHAR(191) NOT NULL,
+ `content` VARCHAR(191) NOT NULL,
+ `image` VARCHAR(191) NOT NULL,
+ `authorId` VARCHAR(191) NOT NULL,
+ `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ `updatedAt` DATETIME(3) NOT NULL,
+
+ PRIMARY KEY (`id`)
+) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+
+-- CreateTable
+CREATE TABLE `Questions` (
+ `id` VARCHAR(191) NOT NULL,
+ `question` VARCHAR(191) NOT NULL,
+ `answer` VARCHAR(191) NOT NULL,
+ `quizId` VARCHAR(191) NOT NULL,
+ `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ `updatedAt` DATETIME(3) NOT NULL,
+
+ PRIMARY KEY (`id`)
+) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+
+-- CreateTable
+CREATE TABLE `QuizResult` (
+ `id` VARCHAR(191) NOT NULL,
+ `userId` VARCHAR(191) NOT NULL,
+ `quizId` VARCHAR(191) NOT NULL,
+ `score` INTEGER NOT NULL,
+ `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ `updatedAt` DATETIME(3) NOT NULL,
+
+ PRIMARY KEY (`id`)
+) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+
+-- AddForeignKey
+ALTER TABLE `Article` ADD CONSTRAINT `Article_authorId_fkey` FOREIGN KEY (`authorId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE `Quiz` ADD CONSTRAINT `Quiz_authorId_fkey` FOREIGN KEY (`authorId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE `Questions` ADD CONSTRAINT `Questions_quizId_fkey` FOREIGN KEY (`quizId`) REFERENCES `Quiz`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE `QuizResult` ADD CONSTRAINT `QuizResult_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE `QuizResult` ADD CONSTRAINT `QuizResult_quizId_fkey` FOREIGN KEY (`quizId`) REFERENCES `Quiz`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml
new file mode 100644
index 0000000..8a21669
--- /dev/null
+++ b/prisma/migrations/migration_lock.toml
@@ -0,0 +1,3 @@
+# Please do not edit this file manually
+# It should be added in your version-control system (e.g., Git)
+provider = "mysql"
\ No newline at end of file
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
new file mode 100644
index 0000000..3461a9b
--- /dev/null
+++ b/prisma/schema.prisma
@@ -0,0 +1,81 @@
+// This is your Prisma schema file,
+// learn more about it in the docs: https://pris.ly/d/prisma-schema
+
+// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
+// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
+// ...existing code...
+
+enum Role {
+ MEMBER
+ ADMIN
+ SUPERADMIN
+}
+
+generator client {
+ provider = "prisma-client-js"
+}
+
+datasource db {
+ provider = "mysql"
+ url = env("DATABASE_URL")
+}
+
+model User {
+ id String @id @default(uuid())
+ nim String
+ name String
+ avatar String
+ role Role @default(MEMBER)
+ email String @unique
+ password String
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+ articles Article[]
+ quizzes Quiz[]
+ results QuizResult[]
+}
+
+model Article {
+ id String @id @default(uuid())
+ title String
+ content String @db.Text
+ image String
+ author User @relation(fields: [authorId], references: [id])
+ authorId String
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+}
+
+model Quiz {
+ id String @id @default(uuid())
+ title String
+ content String
+ image String
+ author User @relation(fields: [authorId], references: [id])
+ authorId String
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+ questions Questions[]
+ results QuizResult[]
+}
+
+model Questions {
+ id String @id @default(uuid())
+ question String
+ answer String
+ quiz Quiz @relation(fields: [quizId], references: [id])
+ quizId String
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+}
+
+model QuizResult {
+ id String @id @default(uuid())
+ user User @relation(fields: [userId], references: [id])
+ userId String
+ quiz Quiz @relation(fields: [quizId], references: [id])
+ quizId String
+ score Int
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+}
\ No newline at end of file
diff --git a/prisma/seed.ts b/prisma/seed.ts
new file mode 100644
index 0000000..5230899
--- /dev/null
+++ b/prisma/seed.ts
@@ -0,0 +1,29 @@
+import { PrismaClient } from "@prisma/client";
+import { hash } from "bcrypt";
+
+const prisma = new PrismaClient();
+
+async function main() {
+ const password = await hash("password123", 12);
+ const user = await prisma.user.upsert({
+ where: { email: "admin@admin.com" },
+ update: {},
+ create: {
+ id: "d5f2e78c-c9e0-45d6-b577-5af5c196e9d2",
+ nim: "220535608548",
+ name: "Alvalen Shafelbilyunazra",
+ email: "admin@admin.com",
+ avatar: "https://res.cloudinary.com/startup-grind/image/upload/c_fill,w_250,h_250,g_center/c_fill,dpr_2.0,f_auto,g_center,q_auto:good/v1/gcs/platform-data-goog/avatars/alvalen_shafel_5fUEnek.jpg",
+ role: "SUPERADMIN",
+ password,
+ },
+ });
+ console.log({ user });
+}
+main()
+ .then(() => prisma.$disconnect())
+ .catch(async (e) => {
+ console.error(e);
+ await prisma.$disconnect();
+ process.exit(1);
+ });
diff --git a/types/next-auth.d.ts b/types/next-auth.d.ts
new file mode 100644
index 0000000..62dc445
--- /dev/null
+++ b/types/next-auth.d.ts
@@ -0,0 +1,19 @@
+import { DefaultSession } from "next-auth";
+
+declare module "next-auth" {
+ interface Session {
+ user: {
+ id: string;
+ role: "MEMBER" | "ADMIN" | "SUPERADMIN";
+ avatar: string | null;
+ } & DefaultSession["user"];
+ }
+
+ interface User {
+ id: string;
+ email: string | null;
+ name: string | null;
+ avatar: string | null;
+ role : "MEMBER" | "ADMIN" | "SUPERADMIN";
+ }
+}