From bbe5eb0ccd92cb7d89784aa0a87ef3ed2cfc983c Mon Sep 17 00:00:00 2001 From: Brian Nelson Date: Mon, 23 Jun 2025 10:20:37 -0400 Subject: [PATCH] Initial commit for wedding-planner MVP --- .gitignore | 7 + Dockerfile | 46 + README.md | 36 + app/api/events/route.ts | 20 + app/api/setup/route.ts | 21 + app/events/[eventId]/guests/page.tsx | 33 + app/events/create/page.tsx | 32 + app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 3 + app/layout.tsx | 24 + app/page.tsx | 112 + app/setup/page.tsx | 65 + bun.lockb | Bin 0 -> 176383 bytes components/CreateEventForm.tsx | 28 + docker-compose.yml | 34 + eslint.config.mjs | 16 + lib/auth.ts | 69 + lib/mutations.ts | 34 + lib/prisma.ts | 13 + lib/queries.ts | 5 + lib/setup.ts | 14 + next-env.d.ts | 5 + next.config.ts | 7 + package-lock.json | 4831 +++++++++++++++++ package.json | 34 + postcss.config.mjs | 5 + .../20250623121157_init/migration.sql | 44 + .../20250623135246_add_password/migration.sql | 6 + prisma/migrations/migration_lock.toml | 3 + prisma/schema.prisma | 50 + public/file.svg | 1 + public/globe.svg | 1 + public/next.svg | 1 + public/vercel.svg | 1 + public/window.svg | 1 + tsconfig.json | 28 + types/next-auth.d.ts | 20 + 37 files changed, 5650 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 app/api/events/route.ts create mode 100644 app/api/setup/route.ts create mode 100644 app/events/[eventId]/guests/page.tsx create mode 100644 app/events/create/page.tsx create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/page.tsx create mode 100644 app/setup/page.tsx create mode 100755 bun.lockb create mode 100644 components/CreateEventForm.tsx create mode 100644 docker-compose.yml create mode 100644 eslint.config.mjs create mode 100644 lib/auth.ts create mode 100644 lib/mutations.ts create mode 100644 lib/prisma.ts create mode 100644 lib/queries.ts create mode 100644 lib/setup.ts create mode 100644 next-env.d.ts create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 prisma/migrations/20250623121157_init/migration.sql create mode 100644 prisma/migrations/20250623135246_add_password/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 prisma/schema.prisma create mode 100644 public/file.svg create mode 100644 public/globe.svg create mode 100644 public/next.svg create mode 100644 public/vercel.svg create mode 100644 public/window.svg create mode 100644 tsconfig.json create mode 100644 types/next-auth.d.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c30b990 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules/ +.next/ +.env +*.log +data/postgres/ +uploads/ + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c65e036 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,46 @@ +# Install dependencies +FROM node:20-alpine AS deps +WORKDIR /app + +# Prevent Prisma from generating client prematurely +ENV PRISMA_GENERATE_SKIP_AUTOMATICALLY=true + +COPY package.json package-lock.json* ./ +RUN npm ci + +# Build Prisma client separately +FROM node:20-alpine AS prisma +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +RUN npx prisma generate + +# Build Next.js app +FROM node:20-alpine AS builder +WORKDIR /app + +COPY --from=deps /app/node_modules ./node_modules +COPY --from=prisma /app ./ + +RUN npm run build + +# Final image +FROM node:20-alpine AS runner +WORKDIR /app + +ENV NODE_ENV production + +# Prevent Next.js telemetry prompt +ENV NEXT_TELEMETRY_DISABLED 1 + +# Only copy necessary files +COPY --from=builder /app/public ./public +COPY --from=builder /app/.next ./.next +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/package.json ./package.json +COPY --from=builder /app/prisma ./prisma + +EXPOSE 3000 + +CMD ["npm", "start"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..e215bc4 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/app/api/events/route.ts b/app/api/events/route.ts new file mode 100644 index 0000000..07e407c --- /dev/null +++ b/app/api/events/route.ts @@ -0,0 +1,20 @@ +import { auth } from '@/lib/auth'; +import { mutations } from '@/lib/mutations'; +import { NextRequest, NextResponse } from 'next/server'; + +export async function POST(req: NextRequest) { + const session = await auth(); + if (!session?.user) return new NextResponse('Unauthorized', { status: 401 }); + + const body = await req.json(); + const { name, date, location } = body; + + const event = await mutations.createEvent({ + name, + date, + location, + creatorId: session.user.id, + }); + + return NextResponse.json(event) +} \ No newline at end of file diff --git a/app/api/setup/route.ts b/app/api/setup/route.ts new file mode 100644 index 0000000..f628037 --- /dev/null +++ b/app/api/setup/route.ts @@ -0,0 +1,21 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { prisma } from '@/lib/prisma'; +import bcrypt from 'bcrypt'; + +export async function POST(req: NextRequest) { + const { email, password, role } = await req.json(); + + const existing = await prisma.user.findUnique({ where: { email }}); + if (existing) return new NextResponse('User already exists', { status: 400 }); + + const hashed = await bcrypt.hash(password, 10); + const user = await prisma.user.create({ + data: { + email, + password: hashed, + role + } + }); + + return NextResponse.json(user) +} \ No newline at end of file diff --git a/app/events/[eventId]/guests/page.tsx b/app/events/[eventId]/guests/page.tsx new file mode 100644 index 0000000..294ba1c --- /dev/null +++ b/app/events/[eventId]/guests/page.tsx @@ -0,0 +1,33 @@ +'use client' +import { useState } from 'react'; + +export default function GuestManager({ params }: { params: { eventId: string } }) { + const [guests, setGuests] = useState<{ name: string; email: string }[]>([]); + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + + async function addGuest() { + const res = await fetch(`/api/events/${params.eventId}/guests`, { + method: 'POST', + body: JSON.stringify({ name, email }), + }); + const newGuest = await res.json(); + setGuests([...guests, newGuest]); + setName(''); + setEmail(''); + } + + return ( +
+

Guest List

+ + setName(e.target.value)} /> + setEmail(e.target.value)} /> + +
+ ); +} diff --git a/app/events/create/page.tsx b/app/events/create/page.tsx new file mode 100644 index 0000000..70be375 --- /dev/null +++ b/app/events/create/page.tsx @@ -0,0 +1,32 @@ +'use client' +import { useState } from 'react'; +import { useRouter } from 'next/navigation'; + +export default function CreateEventPage() { + const [name, setName] = useState(''); + const router = useRouter(); + + async function handleSubmit(e: React.FormEvent) { + e.preventDefault(); + const res = await fetch('/api/events', { + method: 'POST', + body: JSON.stringify({ name }), + }); + const data = await res.json(); + router.push(`/events/${data.id}`); + } + + return ( +
+

Create Event

+ setName(e.target.value)} + /> + +
+ ); +} diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..a041a74 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,3 @@ +@import "tailwindcss"; + + diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..2f85159 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,24 @@ +import type { Metadata } from "next"; +import "./globals.css"; + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default async function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + + return ( + + +

Welcome to Wedding Planner

+ {children} + + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..4f6c7e0 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,112 @@ +import { isFirstSetup } from "@/lib/setup"; +import Image from "next/image"; +import { redirect } from "next/navigation"; + +export default async function Home() { + + const firstSetup = await isFirstSetup(); + + if (firstSetup) { + redirect('/setup') + } + + return ( +
+
+ Next.js logo +
    +
  1. + Get started by editing{" "} + + app/page.tsx + + . +
  2. +
  3. + Save and see your changes instantly. +
  4. +
+ + +
+ +
+ ); +} diff --git a/app/setup/page.tsx b/app/setup/page.tsx new file mode 100644 index 0000000..77973ce --- /dev/null +++ b/app/setup/page.tsx @@ -0,0 +1,65 @@ +'use client' + +import { signIn } from 'next-auth/react'; +import React, { useState } from 'react' + +export default function SetupPage() { + const [role, setRole] = useState<'COUPLE' | 'PLANNER' | null>(null); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + + async function handleSetup(e:React.FormEvent) { + e.preventDefault(); + + const res = await fetch('/api/setup', { + method: 'POST', + body: JSON.stringify({ email, password, role }), + }); + + if (res.ok) { + await signIn('credentials', { email, password, callbackUrl: '/' }); + } else { + alert('Error setting up user'); + } + } + + if (!role) { + return ( +
+

Welcome! Who are you?

+ + +
+ ); + } + return ( +
+

Create your account ({role})

+ setEmail(e.target.value)} + required + /> + setPassword(e.target.value)} + required + /> + +
+ ) +} diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..50bf268715a52d4cf87123ef05c38539df916076 GIT binary patch literal 176383 zcmeFa30O_t8~=TzC~1(2CZwVnQHoL;l~kHUnrE8l5{ir!GNnRMiYS>X@>CQmluAiL zlqrM|8S>tD=d8zmp8xO1Ir_iX^e=y!a{lY z77CwR8Tr6qpAbJ68Z8q5J~(d;4#t7Mk zEKO?!jV21`r5HL2R0Q(995mW^&^Crvf})>%P+`ziP_!T7?GhXab~bU-XpVYwE z75g0Wqd{vRkNqhIPLWH3e!%ijhI%v95fnK`2pa3zKptGh1_p$Lx`l+$OrTLXPCB4i z&)>yAz{j0Na}5h|4Tz%AOrh~;x0IdU{y@e==z((N@}V5#$OOgwNa!@258q($(BFGd z^cUsg>+2H|N?Q>S;sMQ~?ScAu-Yp$_$aSI5>j!}kkY|j@3dbud%VX8sDxQ2PbdA|_!20ox1+a;$&_qPTV$3M^|)LRLH zitzSv!?E!R@rVR>G&gS--<6;h%8YSy2~mPJc%6eh+HqMi*bLhBY4q!^7!>`61^Xzi z0H1+j{!wlL?jGMK(Z}~KDEey$#d>9+czvH@l$)vi^Lz%B$muS-0v4^0zu9#@ief`9e?_+E__Y82Z>Rb7(Y}da+Fm%?Cw(3n)zS zST9hxG-7o@VM@nNV3dE>px0{vMg9aRp5G6O{aMLqM=>bITV_ZvKLL3h@57+j|H(%5 ze)M$r38q2X3jG0H6srX)0_ti^kAv5Q9>;6QV>?Yi$Ae}sps(+4py=n{*J~Hl0iYQ7GEnqG)`b9QuNdTmJwgI}!#!wQE$Quw z1;u`v28!`{yMzQp_|s@rR`hv7u1i}+e+>gg`=s67Fxl|FbsH4tD?dauR0fFw&3|ax?G0tV6*v`d_JlAr1`*^J*wZUK{cPpk{C$?Xo%1`|}QzkB7V)fe;O#xzwKZT;}C~dqMuEmn4b=d6>>X4 zG5*aA1^Xc$p}3wY`MCt5x&#NiMA1UPAJ!9tdU&0(gJOU5fju0rC!pwG+MAx=3hl)6 zHz1GgTmtRH^J$EJ^8iII65_*pZ=gQ5$AytMXT+@vDhlNipxAGmpy>Y{@W>4Z#eT2z zrH|8GKe|5!P;6f!!;dKB(f@PEqo2E=*q_y)SbiE5`)79mJr9!)m-mn(P>%Ku8RykN z(XKq`Xi$Dov~v^U$Nnh>MLVlN2geH(`&%9q;}&8l2PoR9g?_>7;WX%Y(A_Z3Sbq~J z`n?Zhf#uPRe0CVUdFdh``=YxGbZ@QZ9cP6L^lZlb{2tR9O-N6aqvPtZ0E}u zy1l?ydVe)R9{Z`3p|I=^_U|-Mf`C_{RvRK z-)v#17bxBz3_&G9Wf;l{f>Qfl5F=)Fl`^(r9F#=(iGX z2ymTY|3{ zuLO$q$AaQ@`fVHC{}n*-uEKBKr(Du(eyfv0zEx`w#4mgJ&#CLCiM-UWj{Y|iqcdk-nGT!%$8phM6pW z-_9Rb&op=|b=+*2b3odj3C&^_7b zzjvMBs2r)8JKdr$9mrgL-FENI#@p+h4D)^*6F;TP$CmT9*3-L0q1u00s`<^S(FI4} zZ?a4~RkPfsuJ)BFXPiQFR&c}0)5}A)EEqU@L^{UFe4_N^%Pk2LcAELbnp) zZP%&ig{$K#r+3|sGOmB!u%pnZga6=$UA1wIJi-H$4a!e8ZIiLeuXNO&EB~%E zn7OWlYkQ>oBC#G*<6ANluJ3xrePKrDqadl4t(OjE$3%>OKA^mCd)U=ai+#UT-6)*U zyTWYeq)nX_88Weo3L89JO+MH7a=gj1exvCdE|>Mh?YwpDs+0UjKTirbDGU}gsfaxP zaW=;s=^6DA#uJbu$C8%*V}AcPn-2fwDxND*{bGqceXFESmS%K{nVKgIzkWk z%_-+xJ?h003GK|pFO4DP1I?D2TsQo-eabTLH9V@gq|Hj8`%Zml+;mgn<*f#lZf-ZH zz7O8j?tOvB?q03gw9AJ@YAXdln(yY-X*Zc4uYFt0qJ=LgIDt$*)HCG!};(-o0QO@W1ZS_W-PQ8jeB@v*(S+ojdOih z8o8gkuG*z^iJT8HU1{U2w{C;Th$Yfuvf;ahIhIP8NvyB&So0zxc(4sD#>UsvY5Cmu+O2#nI=Wn0)DC#5yA-}uqyd!eVyYB@tL+8i%n<9kQ? z|7}fylHlYKjhPJ>&#VsICZ9h?S7fozW14qanoHCeBXyz1F2yhPQRnpd{WLqCub=qf zNAi6ynR@x8A6<%1v|UsxcExK|xts=oT(t$8}xwa@&uYh<+zHH%L17u?&vy;np1X}G@H#5Vl` zzs2=hPme4uR{F+!kk+6{lW%7Wojjbsq4DzF<%TJXd-zQp9(X-e7jao^P{=oO<|*5b zh`!7AACGR8e0In_rYoV>Y=&g*#sd$%?%E6S8ZUG6zB6aSOhcFF(R(I4hPammkM7HF6#=}lGIB#NW-x#xR%S`_|p#}4^KdgBE@9TAjcD78+`Z1y} z{i@RKo-Mvk{8b3Hj<`_yY@*itic_`xs^08&D%Lkg;7YwbOX%l#+3FK=#@)<`a{tn`^YWAjL}RS|)5J-Ss(r+*riShSt23m%DM=kC0I z##MI4k$SP`VV}NL%Kj7|1L9Ky&7RvSy{n^Q~64 zGK(ZLtF+t4o<2EZ*X3c*hicEVnagNt-aiLKkTt9;to2y_n3Hlqtk|0 zC$$a2vIA1%pJz{~cvKqMy|~rzyY}1B<5qY#epw{6EmCse?#&08siV{;o=<$UD$Cr& zrQn8lv0>K!YDHBO!P|*?WjWVh54VZf`gE^&ANS+A-3xam^K`ouaA<|*G}AObgda9a zSj8a_T9TP=m`1y0QT5%Zv$I;iyuNt*JhP^pL)I2EQ)&hrwl8_vXm}^H){Fo31$L*4 z&dPdj_00X`NL%%FMaN4)?xKxvF!Zdf#Y9V9w*8ysL~QP3pQIKC0KSK z<4(h?yk@(+s|kf00xx7bvBRAQlN*3GZoZF!>Vo#BR<@pSYDbdC}!k?GDP3&0xg2zoN_^$J} zDW8Kk8;@8z!XQdFt@M%sPk8-~L#F1poBUdvp_DD~Hkjx3SkP0kM#p?y7Q>zU+JY&<*aXbB1pqS>nE zDl>+kzVzH_<9+LU(XtBS>YfVY0(UL9it1V6ZS*;!WA23|_QS+W9~7?_8h=1hnC<4g zSMJMf?rT=)zZg;Xa@^RMM)A+F+-J*A#5F`@{Se}vbotC*AzN0YEuHmxzP+8QxuC{^ zBmM=g6Gx03@uYXG&2YhRt+vab_VXWFU(vCywkFEauOvC

Afxj@0|RixzKuI(<&C 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 literal 0 HcmV?d00001 diff --git a/components/CreateEventForm.tsx b/components/CreateEventForm.tsx new file mode 100644 index 0000000..4043c76 --- /dev/null +++ b/components/CreateEventForm.tsx @@ -0,0 +1,28 @@ +'use client' + +import { useState } from "react" + +export default function CreateEventForm() { + const [name, setName] = useState(''); + + async function handleSubmit(e: React.FormEvent) { + e.preventDefault() + const res = await fetch('api/events', { + method: 'POST', + body: JSON.stringify({ name }), + }); + const event = await res.json(); + console.log('Created:', event); + }; + + return ( +

+ setName(e.target.value)} + placeholder="Event Name" + /> + + + ) +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8e26742 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,34 @@ +version: '3.8' + +services: + db: + image: postgres:15 + restart: always + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: wedding_planner + volumes: + - ./data/postgres:/var/lib/postgresql/data + ports: + - "5432:5432" + + # migrate: + # build: . + # command: npx prisma migrate deploy + # depends_on: + # - db + # environment: + # DATABASE_URL: postgres://postgres:postgres@db:5432/wedding_planner + + # app: + # build: . + # ports: + # - "3000:3000" + # depends_on: + # - db + # - migrate + # environment: + # DATABASE_URL: postgres://postgres:postgres@db:5432/wedding_planner + # NEXTAUTH_SECRET: changeme + # NEXTAUTH_URL: http://localhost:3000 diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..c85fb67 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,16 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [ + ...compat.extends("next/core-web-vitals", "next/typescript"), +]; + +export default eslintConfig; diff --git a/lib/auth.ts b/lib/auth.ts new file mode 100644 index 0000000..88b984c --- /dev/null +++ b/lib/auth.ts @@ -0,0 +1,69 @@ +// lib/auth.ts +import NextAuth from 'next-auth'; +import { PrismaAdapter } from '@next-auth/prisma-adapter'; +import CredentialsProvider from 'next-auth/providers/credentials'; +import { prisma } from './prisma'; +import type { NextAuthOptions, User } from 'next-auth'; +import bcrypt from "bcrypt"; + +export const authOptions: NextAuthOptions = { + adapter: PrismaAdapter(prisma), + providers: [ + CredentialsProvider({ + name: 'Credentials', + credentials: { + email: { label: "Email", type: "email" }, + password: { label: "Password", type: "password" }, + }, + async authorize(credentials) { + if (!credentials?.email || !credentials?.password) { + throw new Error("Missing email or password"); + } + + const user = await prisma.user.findUnique({ + where: { email: credentials.email }, + }); + + if (!user || !user.password) { + throw new Error("Invalid credentials"); + } + + const isValid = await bcrypt.compare(credentials.password, user.password); + if (!isValid) { + throw new Error("Invalid credentials"); + } + + return { + id: user.id, + email: user.email, + name: user.name, + role: user.role, + }; + }, + }), + ], + session: { + strategy: 'jwt', + }, + callbacks: { + async session({ session, token }: { session: any; token: any }) { + if (session.user) { + session.user.id = token.sub!; + session.user.role = token.role; + } + return session; + }, + async jwt({ token, user }: { token: any; user?: any }) { + if (user) { + token.role = user.role; + } + return token; + }, + }, + secret: process.env.NEXTAUTH_SECRET, +}; + +export const { + handlers: { GET, POST }, + auth, +} = NextAuth(authOptions); diff --git a/lib/mutations.ts b/lib/mutations.ts new file mode 100644 index 0000000..c97e1e5 --- /dev/null +++ b/lib/mutations.ts @@ -0,0 +1,34 @@ +import { prisma } from './prisma'; + +export const mutations = { + async createEvent(data: { + name: string; + date?: string; + location?: string; + creatorId: string; + }) { + const event = await prisma.event.create({ + data: { + name: data.name, + date: data.date ? new Date(data.date) : undefined, + location: data.location, + creatorId: data.creatorId, + }, + }); + return event; + }, + + async addGuest(data: { + eventId: string; + name: string; + email?: string; + }) { + return await prisma.guest.create({ + data: { + eventId: data.eventId, + name: data.name, + email: data.email, + }, + }); + } +}; \ No newline at end of file diff --git a/lib/prisma.ts b/lib/prisma.ts new file mode 100644 index 0000000..82551ed --- /dev/null +++ b/lib/prisma.ts @@ -0,0 +1,13 @@ +import { PrismaClient } from '@prisma/client' + +const globalForPrisma = globalThis as unknown as { + prisma: PrismaClient | undefined +} + +export const prisma = + globalForPrisma.prisma ?? + new PrismaClient({ + log: ['query', 'error', 'warn'], + }) + +if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma diff --git a/lib/queries.ts b/lib/queries.ts new file mode 100644 index 0000000..4d07594 --- /dev/null +++ b/lib/queries.ts @@ -0,0 +1,5 @@ +import { prisma } from './prisma'; + +export const queries = { + // Test for adding invitees +} \ No newline at end of file diff --git a/lib/setup.ts b/lib/setup.ts new file mode 100644 index 0000000..ee79cfd --- /dev/null +++ b/lib/setup.ts @@ -0,0 +1,14 @@ +import { prisma } from './prisma'; + +export async function isFirstSetup() { + const user = await prisma.user.findFirst({ + where: { + OR: [ + { role: 'COUPLE' }, + { role: 'PLANNER'}, + ] + } + }); + + return !user; +} \ No newline at end of file diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..1b3be08 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..96e5bda --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4831 @@ +{ + "name": "web", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web", + "version": "0.1.0", + "dependencies": { + "@next-auth/prisma-adapter": "^1.0.7", + "bcrypt": "^6.0.0", + "next": "15.3.4", + "next-auth": "^4.24.11", + "prisma": "^6.10.1", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/postcss": "^4", + "@types/bcrypt": "^5.0.2", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.3.4", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@auth/core": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.34.2.tgz", + "integrity": "sha512-KywHKRgLiF3l7PLyL73fjLSIBe1YNcA6sMeew4yMP6cfCWGXZrkkXd32AjRi1hlJ9nvovUBGZHvbn+LijO6ZeQ==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "@panva/hkdf": "^1.1.1", + "@types/cookie": "0.6.0", + "cookie": "0.6.0", + "jose": "^5.1.3", + "oauth4webapi": "^2.10.4", + "preact": "10.11.3", + "preact-render-to-string": "5.2.3" + }, + "peerDependencies": { + "@simplewebauthn/browser": "^9.0.1", + "@simplewebauthn/server": "^9.0.2", + "nodemailer": "^6.8.0" + }, + "peerDependenciesMeta": { + "@simplewebauthn/browser": { + "optional": true + }, + "@simplewebauthn/server": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, + "node_modules/@auth/core/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@auth/core/node_modules/jose": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@auth/core/node_modules/preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/@auth/core/node_modules/preact-render-to-string": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz", + "integrity": "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.14.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.29.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.2", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.1.0", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next-auth/prisma-adapter": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@next-auth/prisma-adapter/-/prisma-adapter-1.0.7.tgz", + "integrity": "sha512-Cdko4KfcmKjsyHFrWwZ//lfLUbcLqlyFqjd/nYE2m3aZ7tjMNUjpks47iw7NTCnXf+5UWz5Ypyt1dSs1EP5QJw==", + "license": "ISC", + "peerDependencies": { + "@prisma/client": ">=2.26.0 || >=3", + "next-auth": "^4" + } + }, + "node_modules/@next/env": { + "version": "15.3.4", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.3.4", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.4.tgz", + "integrity": "sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.4.tgz", + "integrity": "sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.4.tgz", + "integrity": "sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.4.tgz", + "integrity": "sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.4.tgz", + "integrity": "sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.4.tgz", + "integrity": "sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.4.tgz", + "integrity": "sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@panva/hkdf": { + "version": "1.2.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@prisma/client": { + "version": "6.10.1", + "hasInstallScript": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.10.1", + "license": "Apache-2.0", + "dependencies": { + "jiti": "2.4.2" + } + }, + "node_modules/@prisma/debug": { + "version": "6.10.1", + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.10.1", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.10.1", + "@prisma/engines-version": "6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c", + "@prisma/fetch-engine": "6.10.1", + "@prisma/get-platform": "6.10.1" + } + }, + "node_modules/@prisma/engines-version": { + "version": "6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c", + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.10.1", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.10.1", + "@prisma/engines-version": "6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c", + "@prisma/get-platform": "6.10.1" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.10.1", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.10.1" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.11.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.10" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.10", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.10", + "@tailwindcss/oxide-darwin-arm64": "4.1.10", + "@tailwindcss/oxide-darwin-x64": "4.1.10", + "@tailwindcss/oxide-freebsd-x64": "4.1.10", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.10", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.10", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.10", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.10", + "@tailwindcss/oxide-linux-x64-musl": "4.1.10", + "@tailwindcss/oxide-wasm32-wasi": "4.1.10", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.10", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.10", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.10", + "@tailwindcss/oxide": "4.1.10", + "postcss": "^8.4.41", + "tailwindcss": "4.1.10" + } + }, + "node_modules/@types/bcrypt": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz", + "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.1", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.6", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.34.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.34.1", + "@typescript-eslint/type-utils": "8.34.1", + "@typescript-eslint/utils": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.34.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.34.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.34.1", + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/typescript-estree": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.34.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.34.1", + "@typescript-eslint/types": "^8.34.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.34.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.34.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.34.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.34.1", + "@typescript-eslint/utils": "8.34.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.34.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.34.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.34.1", + "@typescript-eslint/tsconfig-utils": "8.34.1", + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.34.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.34.1", + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/typescript-estree": "8.34.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.34.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.34.1", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.9.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/acorn": { + "version": "8.15.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001724", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "devOptional": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.1", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.29.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "15.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "15.3.4", + "@rushstack/eslint-patch": "^1.10.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.0.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.22.10", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.4.6", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "license": "MIT", + "optional": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.4.2", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jose": { + "version": "4.15.9", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.2.4", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "15.3.4", + "license": "MIT", + "dependencies": { + "@next/env": "15.3.4", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.3.4", + "@next/swc-darwin-x64": "15.3.4", + "@next/swc-linux-arm64-gnu": "15.3.4", + "@next/swc-linux-arm64-musl": "15.3.4", + "@next/swc-linux-x64-gnu": "15.3.4", + "@next/swc-linux-x64-musl": "15.3.4", + "@next/swc-win32-arm64-msvc": "15.3.4", + "@next/swc-win32-x64-msvc": "15.3.4", + "sharp": "^0.34.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-auth": { + "version": "4.24.11", + "license": "ISC", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.7.0", + "jose": "^4.15.5", + "oauth": "^0.9.15", + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + }, + "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 + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-addon-api": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.4.0.tgz", + "integrity": "sha512-D9DI/gXHvVmjHS08SVch0Em8G5S1P+QWtU31appcKT/8wFSPRcdHadIFSAntdMMVM5zz+/DL+bL/gz3UDppqtg==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/oauth": { + "version": "0.9.15", + "license": "MIT" + }, + "node_modules/oauth4webapi": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.17.0.tgz", + "integrity": "sha512-lbC0Z7uzAFNFyzEYRIC+pkSVvDHJTbEW+dYlSBAlCYDe6RxUkJ26bClhk8ocBZip1wfI9uKTe0fm4Ib4RHn6uQ==", + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oidc-token-hash": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, + "node_modules/openid-client": { + "version": "5.7.1", + "license": "MIT", + "dependencies": { + "jose": "^4.15.9", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.26.9", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.6", + "license": "MIT", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "3.8.0", + "license": "MIT" + }, + "node_modules/prisma": { + "version": "6.10.1", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/config": "6.10.1", + "@prisma/engines": "6.10.1" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.2", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.4", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.2", + "@img/sharp-darwin-x64": "0.34.2", + "@img/sharp-libvips-darwin-arm64": "1.1.0", + "@img/sharp-libvips-darwin-x64": "1.1.0", + "@img/sharp-libvips-linux-arm": "1.1.0", + "@img/sharp-libvips-linux-arm64": "1.1.0", + "@img/sharp-libvips-linux-ppc64": "1.1.0", + "@img/sharp-libvips-linux-s390x": "1.1.0", + "@img/sharp-libvips-linux-x64": "1.1.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", + "@img/sharp-libvips-linuxmusl-x64": "1.1.0", + "@img/sharp-linux-arm": "0.34.2", + "@img/sharp-linux-arm64": "0.34.2", + "@img/sharp-linux-s390x": "0.34.2", + "@img/sharp-linux-x64": "0.34.2", + "@img/sharp-linuxmusl-arm64": "0.34.2", + "@img/sharp-linuxmusl-x64": "0.34.2", + "@img/sharp-wasm32": "0.34.2", + "@img/sharp-win32-arm64": "0.34.2", + "@img/sharp-win32-ia32": "0.34.2", + "@img/sharp-win32-x64": "0.34.2" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.10", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.9.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.2.2" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.9.1", + "@unrs/resolver-binding-android-arm64": "1.9.1", + "@unrs/resolver-binding-darwin-arm64": "1.9.1", + "@unrs/resolver-binding-darwin-x64": "1.9.1", + "@unrs/resolver-binding-freebsd-x64": "1.9.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.9.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.9.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.9.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.9.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.9.1", + "@unrs/resolver-binding-linux-x64-musl": "1.9.1", + "@unrs/resolver-binding-wasm32-wasi": "1.9.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.9.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.9.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.9.1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..61dd651 --- /dev/null +++ b/package.json @@ -0,0 +1,34 @@ +{ + "name": "web", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "prisma:generate": "prisma generate", + "prisma:migrate": "prisma migrate deploy" + }, + "dependencies": { + "@next-auth/prisma-adapter": "^1.0.7", + "bcrypt": "^6.0.0", + "next": "15.3.4", + "next-auth": "^4.24.11", + "prisma": "^6.10.1", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/postcss": "^4", + "@types/bcrypt": "^5.0.2", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.3.4", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..c7bcb4b --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +}; + +export default config; diff --git a/prisma/migrations/20250623121157_init/migration.sql b/prisma/migrations/20250623121157_init/migration.sql new file mode 100644 index 0000000..29c912f --- /dev/null +++ b/prisma/migrations/20250623121157_init/migration.sql @@ -0,0 +1,44 @@ +-- CreateEnum +CREATE TYPE "RsvpStatus" AS ENUM ('YES', 'NO', 'PENDING'); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "email" TEXT NOT NULL, + "name" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Event" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "date" TIMESTAMP(3), + "location" TEXT, + "creatorId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Event_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Guest" ( + "id" TEXT NOT NULL, + "eventId" TEXT NOT NULL, + "name" TEXT NOT NULL, + "email" TEXT, + "rsvp" "RsvpStatus" NOT NULL DEFAULT 'PENDING', + + CONSTRAINT "Guest_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- AddForeignKey +ALTER TABLE "Event" ADD CONSTRAINT "Event_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Guest" ADD CONSTRAINT "Guest_eventId_fkey" FOREIGN KEY ("eventId") REFERENCES "Event"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20250623135246_add_password/migration.sql b/prisma/migrations/20250623135246_add_password/migration.sql new file mode 100644 index 0000000..d9b8332 --- /dev/null +++ b/prisma/migrations/20250623135246_add_password/migration.sql @@ -0,0 +1,6 @@ +-- CreateEnum +CREATE TYPE "Role" AS ENUM ('COUPLE', 'PLANNER', 'GUEST'); + +-- AlterTable +ALTER TABLE "User" ADD COLUMN "password" TEXT, +ADD COLUMN "role" "Role" NOT NULL DEFAULT 'GUEST'; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..044d57c --- /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 = "postgresql" diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..4a1629f --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,50 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id String @id @default(cuid()) + email String @unique + password String? // hashed password + name String? + role Role @default(GUEST) + events Event[] @relation("EventCreator") + createdAt DateTime @default(now()) +} + +enum Role { + COUPLE + PLANNER + GUEST +} + +model Event { + id String @id @default(cuid()) + name String + date DateTime? + location String? + creator User @relation("EventCreator", fields: [creatorId], references: [id]) + creatorId String + guests Guest[] + createdAt DateTime @default(now()) +} + +model Guest { + id String @id @default(cuid()) + event Event @relation(fields: [eventId], references: [id]) + eventId String + name String + email String? + rsvp RsvpStatus @default(PENDING) +} + +enum RsvpStatus { + YES + NO + PENDING +} diff --git a/public/file.svg b/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/window.svg b/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3f6a0d4 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"], + "typeRoots": ["./types", "./node_modules/@types"] +} diff --git a/types/next-auth.d.ts b/types/next-auth.d.ts new file mode 100644 index 0000000..435ed8c --- /dev/null +++ b/types/next-auth.d.ts @@ -0,0 +1,20 @@ +import NextAuth from "next-auth"; + +declare module "next-auth" { + interface User { + id: string; + role: "COUPLE" | "PLANNER" | "GUEST"; + } + + interface Session { + user: { + id: string; + email: string; + role: "COUPLE" | "PLANNER" | "GUEST"; + }; + } + + interface JWT { + role: "COUPLE" | "PLANNER" | "GUEST"; + } +}