From 4989bf6de4eeea2e0d39bb614cf42eff295ec9d9 Mon Sep 17 00:00:00 2001 From: Don Strawsburg Date: Fri, 30 Jan 2026 22:22:41 -0500 Subject: [PATCH] upgraded to next 15 and react 19. --- app/admin/users/page.tsx | 1 + app/api/admin/beta-invites/route.ts | 4 +- app/api/admin/beta-invites/route.ts.bak | 35 + .../admin/beta/requests/[id]/invite/route.ts | 8 +- .../beta/requests/[id]/invite/route.ts.bak | 39 + app/api/admin/beta/requests/route.ts | 3 +- app/api/admin/beta/requests/route.ts.bak | 39 + app/api/admin/calibers/route.ts | 4 +- app/api/admin/calibers/route.ts.bak | 40 + app/api/admin/dashboard/overview/route.ts | 3 +- app/api/admin/dashboard/overview/route.ts.bak | 35 + app/api/admin/email/[id]/route.ts | 13 +- app/api/admin/email/[id]/route.ts.bak | 63 + app/api/admin/email/route.ts | 3 +- app/api/admin/email/route.ts.bak | 56 + .../admin/enrichment/[id]/[action]/route.ts | 10 +- .../enrichment/[id]/[action]/route.ts.bak | 48 + app/api/admin/enrichment/ai/run/route.ts | 4 +- app/api/admin/enrichment/ai/run/route.ts.bak | 46 + app/api/admin/enrichment/queue2/route.ts | 4 +- app/api/admin/enrichment/queue2/route.ts.bak | 44 + app/api/admin/enrichment/run/route.ts | 4 +- app/api/admin/enrichment/run/route.ts.bak | 46 + .../admin/import-status/by-merchant/route.ts | 3 +- .../import-status/by-merchant/route.ts.bak | 35 + app/api/admin/import-status/summary/route.ts | 3 +- .../admin/import-status/summary/route.ts.bak | 35 + app/api/admin/mapping/apply/route.ts | 3 +- app/api/admin/mapping/apply/route.ts.bak | 40 + app/api/admin/mapping/options/route.ts | 3 +- app/api/admin/mapping/options/route.ts.bak | 35 + .../admin/mapping/pending-buckets/route.ts | 3 +- .../mapping/pending-buckets/route.ts.bak | 35 + app/api/admin/mapping/raw-categories/route.ts | 3 +- .../admin/mapping/raw-categories/route.ts.bak | 39 + app/api/admin/mapping/upsert/route.ts | 3 +- app/api/admin/mapping/upsert/route.ts.bak | 40 + app/api/admin/merchants/[id]/import/route.ts | 8 +- .../admin/merchants/[id]/import/route.ts.bak | 35 + .../admin/merchants/[id]/offer-sync/route.ts | 8 +- .../merchants/[id]/offer-sync/route.ts.bak | 35 + app/api/admin/merchants/[id]/route.ts | 18 +- app/api/admin/merchants/[id]/route.ts.bak | 90 ++ app/api/admin/merchants/route.ts | 3 +- app/api/admin/merchants/route.ts.bak | 54 + app/api/admin/platforms/[id]/route.ts | 13 +- app/api/admin/platforms/[id]/route.ts.bak | 68 + app/api/admin/platforms/route.ts | 3 +- app/api/admin/platforms/route.ts.bak | 72 + app/api/admin/products/bulk/route.ts | 4 +- app/api/admin/products/bulk/route.ts.bak | 41 + app/api/admin/products/calibers/route.ts | 4 +- app/api/admin/products/calibers/route.ts.bak | 40 + app/api/admin/products/roles/route.ts | 4 +- app/api/admin/products/roles/route.ts.bak | 40 + app/api/admin/products/route.ts | 4 +- app/api/admin/products/route.ts.bak | 42 + app/api/admin/users/[id]/route.ts | 13 +- app/api/admin/users/[id]/route.ts.bak | 68 + app/api/admin/users/route.ts | 3 +- app/api/admin/users/route.ts.bak | 72 + app/api/auth/login/route.ts | 3 +- app/api/auth/logout/route.ts | 3 +- app/api/auth/me/route.ts | 5 +- app/api/auth/register/route.ts | 3 +- app/api/builds/[id]/route.ts | 18 +- app/api/builds/route.ts | 3 +- app/builds/[buildId]/page.tsx | 8 +- components/ui/RichTextEditor.tsx | 20 +- next-env.d.ts | 3 +- next.config.mjs | 3 - package-lock.json | 1162 +++++++++++------ package.json | 11 +- 73 files changed, 2353 insertions(+), 463 deletions(-) create mode 100644 app/api/admin/beta-invites/route.ts.bak create mode 100644 app/api/admin/beta/requests/[id]/invite/route.ts.bak create mode 100644 app/api/admin/beta/requests/route.ts.bak create mode 100644 app/api/admin/calibers/route.ts.bak create mode 100644 app/api/admin/dashboard/overview/route.ts.bak create mode 100644 app/api/admin/email/[id]/route.ts.bak create mode 100644 app/api/admin/email/route.ts.bak create mode 100644 app/api/admin/enrichment/[id]/[action]/route.ts.bak create mode 100644 app/api/admin/enrichment/ai/run/route.ts.bak create mode 100644 app/api/admin/enrichment/queue2/route.ts.bak create mode 100644 app/api/admin/enrichment/run/route.ts.bak create mode 100644 app/api/admin/import-status/by-merchant/route.ts.bak create mode 100644 app/api/admin/import-status/summary/route.ts.bak create mode 100644 app/api/admin/mapping/apply/route.ts.bak create mode 100644 app/api/admin/mapping/options/route.ts.bak create mode 100644 app/api/admin/mapping/pending-buckets/route.ts.bak create mode 100644 app/api/admin/mapping/raw-categories/route.ts.bak create mode 100644 app/api/admin/mapping/upsert/route.ts.bak create mode 100644 app/api/admin/merchants/[id]/import/route.ts.bak create mode 100644 app/api/admin/merchants/[id]/offer-sync/route.ts.bak create mode 100644 app/api/admin/merchants/[id]/route.ts.bak create mode 100644 app/api/admin/merchants/route.ts.bak create mode 100644 app/api/admin/platforms/[id]/route.ts.bak create mode 100644 app/api/admin/platforms/route.ts.bak create mode 100644 app/api/admin/products/bulk/route.ts.bak create mode 100644 app/api/admin/products/calibers/route.ts.bak create mode 100644 app/api/admin/products/roles/route.ts.bak create mode 100644 app/api/admin/products/route.ts.bak create mode 100644 app/api/admin/users/[id]/route.ts.bak create mode 100644 app/api/admin/users/route.ts.bak diff --git a/app/admin/users/page.tsx b/app/admin/users/page.tsx index fb9941e..2ec72ff 100644 --- a/app/admin/users/page.tsx +++ b/app/admin/users/page.tsx @@ -17,6 +17,7 @@ export default function AdminUsersPage() { const [error, setError] = useState(null); async function fetchUsers() { + console.log("in the users fetch"); try { setLoading(true); setError(null); diff --git a/app/api/admin/beta-invites/route.ts b/app/api/admin/beta-invites/route.ts index d2606b4..dddc086 100644 --- a/app/api/admin/beta-invites/route.ts +++ b/app/api/admin/beta-invites/route.ts @@ -6,7 +6,9 @@ const API_BASE_URL = // POST /api/admin/beta-invites?dryRun=true&limit=10&tokenMinutes=30 export async function POST(req: Request) { - const token = cookies().get("session_token")?.value; + const cookieStore = await cookies(); + + const token = cookieStore.get("session_token")?.value; if (!token) { return NextResponse.json({ error: "Missing admin token" }, { status: 401 }); diff --git a/app/api/admin/beta-invites/route.ts.bak b/app/api/admin/beta-invites/route.ts.bak new file mode 100644 index 0000000..d2606b4 --- /dev/null +++ b/app/api/admin/beta-invites/route.ts.bak @@ -0,0 +1,35 @@ +import { NextResponse } from "next/server"; +import { cookies } from "next/headers"; + +const API_BASE_URL = + process.env.NEXT_PUBLIC_API_BASE_URL ?? ""; + +// POST /api/admin/beta-invites?dryRun=true&limit=10&tokenMinutes=30 +export async function POST(req: Request) { + const token = cookies().get("session_token")?.value; + + if (!token) { + return NextResponse.json({ error: "Missing admin token" }, { status: 401 }); + } + + const url = new URL(req.url); + const dryRun = url.searchParams.get("dryRun") ?? "true"; + const limit = url.searchParams.get("limit") ?? "0"; + const tokenMinutes = url.searchParams.get("tokenMinutes") ?? "30"; + + const upstream = `${API_BASE_URL}/api/v1/admin/beta/invites/send?dryRun=${dryRun}&limit=${limit}&tokenMinutes=${tokenMinutes}`; + + const res = await fetch(upstream, { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + }, + cache: "no-store", + }); + + const text = await res.text(); + return new NextResponse(text, { + status: res.status, + headers: { "Content-Type": res.headers.get("content-type") ?? "application/json" }, + }); +} diff --git a/app/api/admin/beta/requests/[id]/invite/route.ts b/app/api/admin/beta/requests/[id]/invite/route.ts index 4fcb173..afa3d32 100644 --- a/app/api/admin/beta/requests/[id]/invite/route.ts +++ b/app/api/admin/beta/requests/[id]/invite/route.ts @@ -5,19 +5,21 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get("session_token")?.value; + const cookieStore = await cookies(); + const token = cookieStore.get("session_token")?.value; if (!token) throw new Error("Unauthorized"); return { Authorization: `Bearer ${token}` }; } export async function POST( _req: Request, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); const res = await fetch( - `${API_BASE_URL}/api/v1/admin/beta/requests/${params.id}/invite`, + `${API_BASE_URL}/api/v1/admin/beta/requests/${resolvedParams.id}/invite`, { method: "POST", headers, diff --git a/app/api/admin/beta/requests/[id]/invite/route.ts.bak b/app/api/admin/beta/requests/[id]/invite/route.ts.bak new file mode 100644 index 0000000..4fcb173 --- /dev/null +++ b/app/api/admin/beta/requests/[id]/invite/route.ts.bak @@ -0,0 +1,39 @@ +import { NextResponse } from "next/server"; +import { cookies } from "next/headers"; + +const API_BASE_URL = + process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get("session_token")?.value; + if (!token) throw new Error("Unauthorized"); + return { Authorization: `Bearer ${token}` }; +} + +export async function POST( + _req: Request, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/beta/requests/${params.id}/invite`, + { + method: "POST", + headers, + cache: "no-store", + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + } +} diff --git a/app/api/admin/beta/requests/route.ts b/app/api/admin/beta/requests/route.ts index a4b35d4..6aa35e1 100644 --- a/app/api/admin/beta/requests/route.ts +++ b/app/api/admin/beta/requests/route.ts @@ -5,7 +5,8 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get("session_token")?.value; + const cookieStore = await cookies(); + const token = cookieStore.get("session_token")?.value; if (!token) throw new Error("Unauthorized"); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/beta/requests/route.ts.bak b/app/api/admin/beta/requests/route.ts.bak new file mode 100644 index 0000000..a4b35d4 --- /dev/null +++ b/app/api/admin/beta/requests/route.ts.bak @@ -0,0 +1,39 @@ +import { NextResponse } from "next/server"; +import { cookies } from "next/headers"; + +const API_BASE_URL = + process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get("session_token")?.value; + if (!token) throw new Error("Unauthorized"); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET(req: Request) { + try { + const headers = await getAuthHeader(); + const url = new URL(req.url); + const search = url.searchParams.toString(); + + const upstream = `${API_BASE_URL}/api/v1/admin/beta/requests${ + search ? `?${search}` : "" + }`; + + const res = await fetch(upstream, { + headers, + cache: "no-store", + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + } +} diff --git a/app/api/admin/calibers/route.ts b/app/api/admin/calibers/route.ts index 9b8ef1f..ae2de4d 100644 --- a/app/api/admin/calibers/route.ts +++ b/app/api/admin/calibers/route.ts @@ -5,7 +5,9 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BAS export async function GET(request: NextRequest) { try { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + + const token = cookieStore.get('session_token')?.value; if (!token) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } diff --git a/app/api/admin/calibers/route.ts.bak b/app/api/admin/calibers/route.ts.bak new file mode 100644 index 0000000..9b8ef1f --- /dev/null +++ b/app/api/admin/calibers/route.ts.bak @@ -0,0 +1,40 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +export async function GET(request: NextRequest) { + try { + const token = cookies().get('session_token')?.value; + if (!token) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const searchParams = request.nextUrl.searchParams; + const queryString = searchParams.toString(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/calibers${queryString ? `?${queryString}` : ''}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + }, + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/dashboard/overview/route.ts b/app/api/admin/dashboard/overview/route.ts index 5e5607c..f422143 100644 --- a/app/api/admin/dashboard/overview/route.ts +++ b/app/api/admin/dashboard/overview/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/dashboard/overview/route.ts.bak b/app/api/admin/dashboard/overview/route.ts.bak new file mode 100644 index 0000000..5e5607c --- /dev/null +++ b/app/api/admin/dashboard/overview/route.ts.bak @@ -0,0 +1,35 @@ +import { NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET() { + try { + const headers = await getAuthHeader(); + + const res = await fetch(`${API_BASE_URL}/api/admin/dashboard/overview`, { + headers, + cache: 'no-store', + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} diff --git a/app/api/admin/email/[id]/route.ts b/app/api/admin/email/[id]/route.ts index 3cca2bc..53c522c 100644 --- a/app/api/admin/email/[id]/route.ts +++ b/app/api/admin/email/[id]/route.ts @@ -5,20 +5,22 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get("session_token")?.value; + const cookieStore = await cookies(); + const token = cookieStore.get("session_token")?.value; if (!token) throw new Error("Unauthorized"); return { Authorization: `Bearer ${token}` }; } export async function PUT( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); const body = await request.json(); - const res = await fetch(`${API_BASE_URL}/api/email/${params.id}`, { + const res = await fetch(`${API_BASE_URL}/api/email/${resolvedParams.id}`, { method: "PUT", headers: { ...headers, "Content-Type": "application/json" }, body: JSON.stringify(body), @@ -39,12 +41,13 @@ export async function PUT( export async function DELETE( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); - const res = await fetch(`${API_BASE_URL}/api/email/${params.id}`, { + const res = await fetch(`${API_BASE_URL}/api/email/${resolvedParams.id}`, { method: "DELETE", headers, }); diff --git a/app/api/admin/email/[id]/route.ts.bak b/app/api/admin/email/[id]/route.ts.bak new file mode 100644 index 0000000..3cca2bc --- /dev/null +++ b/app/api/admin/email/[id]/route.ts.bak @@ -0,0 +1,63 @@ +import { NextRequest, NextResponse } from "next/server"; +import { cookies } from "next/headers"; + +const API_BASE_URL = + process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get("session_token")?.value; + if (!token) throw new Error("Unauthorized"); + return { Authorization: `Bearer ${token}` }; +} + +export async function PUT( + request: NextRequest, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + const body = await request.json(); + + const res = await fetch(`${API_BASE_URL}/api/email/${params.id}`, { + method: "PUT", + headers: { ...headers, "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + } +} + +export async function DELETE( + request: NextRequest, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + + const res = await fetch(`${API_BASE_URL}/api/email/${params.id}`, { + method: "DELETE", + headers, + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json({ ok: true }); + } catch (err: any) { + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + } +} diff --git a/app/api/admin/email/route.ts b/app/api/admin/email/route.ts index b03331f..eb05a7a 100644 --- a/app/api/admin/email/route.ts +++ b/app/api/admin/email/route.ts @@ -5,7 +5,8 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get("session_token")?.value; + const cookieStore = await cookies(); + const token = cookieStore.get("session_token")?.value; if (!token) throw new Error("Unauthorized"); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/email/route.ts.bak b/app/api/admin/email/route.ts.bak new file mode 100644 index 0000000..b03331f --- /dev/null +++ b/app/api/admin/email/route.ts.bak @@ -0,0 +1,56 @@ +import { NextRequest, NextResponse } from "next/server"; +import { cookies } from "next/headers"; + +const API_BASE_URL = + process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get("session_token")?.value; + if (!token) throw new Error("Unauthorized"); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET() { + try { + const headers = await getAuthHeader(); + const res = await fetch(`${API_BASE_URL}/api/email`, { + headers, + cache: "no-store", + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + } +} + +export async function POST(request: NextRequest) { + try { + const headers = await getAuthHeader(); + const body = await request.json(); + + const res = await fetch(`${API_BASE_URL}/api/email`, { + method: "POST", + headers: { ...headers, "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + } +} diff --git a/app/api/admin/enrichment/[id]/[action]/route.ts b/app/api/admin/enrichment/[id]/[action]/route.ts index d1578cc..d814a0f 100644 --- a/app/api/admin/enrichment/[id]/[action]/route.ts +++ b/app/api/admin/enrichment/[id]/[action]/route.ts @@ -5,15 +5,19 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BAS export async function POST( request: NextRequest, - { params }: { params: { id: string; action: string } } + { params }: { params: Promise<{ id: string; action: string }> } ) { try { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + + const token = cookieStore.get('session_token')?.value; if (!token) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } - const { id, action } = params; + const resolvedParams = await params; + + const { id, action } = resolvedParams; const res = await fetch( `${API_BASE_URL}/api/admin/enrichment/${id}/${action}`, diff --git a/app/api/admin/enrichment/[id]/[action]/route.ts.bak b/app/api/admin/enrichment/[id]/[action]/route.ts.bak new file mode 100644 index 0000000..d1578cc --- /dev/null +++ b/app/api/admin/enrichment/[id]/[action]/route.ts.bak @@ -0,0 +1,48 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +export async function POST( + request: NextRequest, + { params }: { params: { id: string; action: string } } +) { + try { + const token = cookies().get('session_token')?.value; + if (!token) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const { id, action } = params; + + const res = await fetch( + `${API_BASE_URL}/api/admin/enrichment/${id}/${action}`, + { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + const contentType = res.headers.get('content-type'); + if (contentType?.includes('application/json')) { + return NextResponse.json(await res.json()); + } + + return NextResponse.json({ success: true }); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/enrichment/ai/run/route.ts b/app/api/admin/enrichment/ai/run/route.ts index 3241f75..cb972f5 100644 --- a/app/api/admin/enrichment/ai/run/route.ts +++ b/app/api/admin/enrichment/ai/run/route.ts @@ -5,7 +5,9 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BAS export async function POST(request: NextRequest) { try { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + + const token = cookieStore.get('session_token')?.value; if (!token) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } diff --git a/app/api/admin/enrichment/ai/run/route.ts.bak b/app/api/admin/enrichment/ai/run/route.ts.bak new file mode 100644 index 0000000..3241f75 --- /dev/null +++ b/app/api/admin/enrichment/ai/run/route.ts.bak @@ -0,0 +1,46 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +export async function POST(request: NextRequest) { + try { + const token = cookies().get('session_token')?.value; + if (!token) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const searchParams = request.nextUrl.searchParams; + const queryString = searchParams.toString(); + + const res = await fetch( + `${API_BASE_URL}/api/admin/enrichment/ai/run${queryString ? `?${queryString}` : ''}`, + { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + const contentType = res.headers.get('content-type'); + if (contentType?.includes('application/json')) { + return NextResponse.json(await res.json()); + } + + return NextResponse.json({ success: true }); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/enrichment/queue2/route.ts b/app/api/admin/enrichment/queue2/route.ts index e033a6a..0dcb1d7 100644 --- a/app/api/admin/enrichment/queue2/route.ts +++ b/app/api/admin/enrichment/queue2/route.ts @@ -6,7 +6,9 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BAS export async function GET(request: NextRequest) { try { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + + const token = cookieStore.get('session_token')?.value; if (!token) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } diff --git a/app/api/admin/enrichment/queue2/route.ts.bak b/app/api/admin/enrichment/queue2/route.ts.bak new file mode 100644 index 0000000..e033a6a --- /dev/null +++ b/app/api/admin/enrichment/queue2/route.ts.bak @@ -0,0 +1,44 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; +import { fixImageUrls } from '@/lib/server/image-utils'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +export async function GET(request: NextRequest) { + try { + const token = cookies().get('session_token')?.value; + if (!token) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const searchParams = request.nextUrl.searchParams; + const queryString = searchParams.toString(); + + const res = await fetch( + `${API_BASE_URL}/api/admin/enrichment/queue2${queryString ? `?${queryString}` : ''}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + }, + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + const data = await res.json(); + + // Fix mixed content warnings: upgrade HTTP image URLs to HTTPS + return NextResponse.json(fixImageUrls(data)); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/enrichment/run/route.ts b/app/api/admin/enrichment/run/route.ts index c2c61f6..0861e88 100644 --- a/app/api/admin/enrichment/run/route.ts +++ b/app/api/admin/enrichment/run/route.ts @@ -5,7 +5,9 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BAS export async function POST(request: NextRequest) { try { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + + const token = cookieStore.get('session_token')?.value; if (!token) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } diff --git a/app/api/admin/enrichment/run/route.ts.bak b/app/api/admin/enrichment/run/route.ts.bak new file mode 100644 index 0000000..c2c61f6 --- /dev/null +++ b/app/api/admin/enrichment/run/route.ts.bak @@ -0,0 +1,46 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +export async function POST(request: NextRequest) { + try { + const token = cookies().get('session_token')?.value; + if (!token) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const searchParams = request.nextUrl.searchParams; + const queryString = searchParams.toString(); + + const res = await fetch( + `${API_BASE_URL}/api/admin/enrichment/run${queryString ? `?${queryString}` : ''}`, + { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + const contentType = res.headers.get('content-type'); + if (contentType?.includes('application/json')) { + return NextResponse.json(await res.json()); + } + + return NextResponse.json({ success: true }); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/import-status/by-merchant/route.ts b/app/api/admin/import-status/by-merchant/route.ts index c25fac7..f545202 100644 --- a/app/api/admin/import-status/by-merchant/route.ts +++ b/app/api/admin/import-status/by-merchant/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/import-status/by-merchant/route.ts.bak b/app/api/admin/import-status/by-merchant/route.ts.bak new file mode 100644 index 0000000..c25fac7 --- /dev/null +++ b/app/api/admin/import-status/by-merchant/route.ts.bak @@ -0,0 +1,35 @@ +import { NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET() { + try { + const headers = await getAuthHeader(); + + const res = await fetch(`${API_BASE_URL}/api/admin/import-status/by-merchant`, { + headers, + cache: 'no-store', + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} diff --git a/app/api/admin/import-status/summary/route.ts b/app/api/admin/import-status/summary/route.ts index 2da4586..9e16695 100644 --- a/app/api/admin/import-status/summary/route.ts +++ b/app/api/admin/import-status/summary/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/import-status/summary/route.ts.bak b/app/api/admin/import-status/summary/route.ts.bak new file mode 100644 index 0000000..2da4586 --- /dev/null +++ b/app/api/admin/import-status/summary/route.ts.bak @@ -0,0 +1,35 @@ +import { NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET() { + try { + const headers = await getAuthHeader(); + + const res = await fetch(`${API_BASE_URL}/api/admin/import-status/summary`, { + headers, + cache: 'no-store', + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} diff --git a/app/api/admin/mapping/apply/route.ts b/app/api/admin/mapping/apply/route.ts index 87484d4..cc12128 100644 --- a/app/api/admin/mapping/apply/route.ts +++ b/app/api/admin/mapping/apply/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/mapping/apply/route.ts.bak b/app/api/admin/mapping/apply/route.ts.bak new file mode 100644 index 0000000..87484d4 --- /dev/null +++ b/app/api/admin/mapping/apply/route.ts.bak @@ -0,0 +1,40 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function POST(request: NextRequest) { + try { + const headers = await getAuthHeader(); + const body = await request.json(); + + const res = await fetch(`${API_BASE_URL}/api/admin/mapping/apply`, { + method: 'POST', + headers: { + ...headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} diff --git a/app/api/admin/mapping/options/route.ts b/app/api/admin/mapping/options/route.ts index 95917c9..d248d8a 100644 --- a/app/api/admin/mapping/options/route.ts +++ b/app/api/admin/mapping/options/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/mapping/options/route.ts.bak b/app/api/admin/mapping/options/route.ts.bak new file mode 100644 index 0000000..95917c9 --- /dev/null +++ b/app/api/admin/mapping/options/route.ts.bak @@ -0,0 +1,35 @@ +import { NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET() { + try { + const headers = await getAuthHeader(); + + const res = await fetch(`${API_BASE_URL}/api/admin/mapping/options`, { + headers, + cache: 'no-store', + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} diff --git a/app/api/admin/mapping/pending-buckets/route.ts b/app/api/admin/mapping/pending-buckets/route.ts index 47ec6f9..5320623 100644 --- a/app/api/admin/mapping/pending-buckets/route.ts +++ b/app/api/admin/mapping/pending-buckets/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/mapping/pending-buckets/route.ts.bak b/app/api/admin/mapping/pending-buckets/route.ts.bak new file mode 100644 index 0000000..47ec6f9 --- /dev/null +++ b/app/api/admin/mapping/pending-buckets/route.ts.bak @@ -0,0 +1,35 @@ +import { NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET() { + try { + const headers = await getAuthHeader(); + + const res = await fetch(`${API_BASE_URL}/api/admin/mapping/pending-buckets`, { + headers, + cache: 'no-store', + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} diff --git a/app/api/admin/mapping/raw-categories/route.ts b/app/api/admin/mapping/raw-categories/route.ts index 34bba01..e88f9e1 100644 --- a/app/api/admin/mapping/raw-categories/route.ts +++ b/app/api/admin/mapping/raw-categories/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/mapping/raw-categories/route.ts.bak b/app/api/admin/mapping/raw-categories/route.ts.bak new file mode 100644 index 0000000..34bba01 --- /dev/null +++ b/app/api/admin/mapping/raw-categories/route.ts.bak @@ -0,0 +1,39 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET(request: NextRequest) { + try { + const headers = await getAuthHeader(); + const { searchParams } = new URL(request.url); + + const res = await fetch( + `${API_BASE_URL}/api/admin/mapping/raw-categories?${searchParams.toString()}`, + { + headers, + cache: 'no-store', + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} diff --git a/app/api/admin/mapping/upsert/route.ts b/app/api/admin/mapping/upsert/route.ts index 3496a30..4cde791 100644 --- a/app/api/admin/mapping/upsert/route.ts +++ b/app/api/admin/mapping/upsert/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/mapping/upsert/route.ts.bak b/app/api/admin/mapping/upsert/route.ts.bak new file mode 100644 index 0000000..3496a30 --- /dev/null +++ b/app/api/admin/mapping/upsert/route.ts.bak @@ -0,0 +1,40 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function POST(request: NextRequest) { + try { + const headers = await getAuthHeader(); + const body = await request.json(); + + const res = await fetch(`${API_BASE_URL}/api/admin/mapping/upsert`, { + method: 'POST', + headers: { + ...headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} diff --git a/app/api/admin/merchants/[id]/import/route.ts b/app/api/admin/merchants/[id]/import/route.ts index 1724997..d97a982 100644 --- a/app/api/admin/merchants/[id]/import/route.ts +++ b/app/api/admin/merchants/[id]/import/route.ts @@ -4,20 +4,22 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } export async function POST( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); const res = await fetch( - `${API_BASE_URL}/api/v1/admin/merchants/${params.id}/import`, + `${API_BASE_URL}/api/v1/admin/merchants/${resolvedParams.id}/import`, { method: 'POST', headers } ); diff --git a/app/api/admin/merchants/[id]/import/route.ts.bak b/app/api/admin/merchants/[id]/import/route.ts.bak new file mode 100644 index 0000000..1724997 --- /dev/null +++ b/app/api/admin/merchants/[id]/import/route.ts.bak @@ -0,0 +1,35 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function POST( + request: NextRequest, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/merchants/${params.id}/import`, + { method: 'POST', headers } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } +} diff --git a/app/api/admin/merchants/[id]/offer-sync/route.ts b/app/api/admin/merchants/[id]/offer-sync/route.ts index 5830936..8a5b370 100644 --- a/app/api/admin/merchants/[id]/offer-sync/route.ts +++ b/app/api/admin/merchants/[id]/offer-sync/route.ts @@ -4,20 +4,22 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } export async function POST( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); const res = await fetch( - `${API_BASE_URL}/api/v1/admin/merchants/${params.id}/offer-sync`, + `${API_BASE_URL}/api/v1/admin/merchants/${resolvedParams.id}/offer-sync`, { method: 'POST', headers } ); diff --git a/app/api/admin/merchants/[id]/offer-sync/route.ts.bak b/app/api/admin/merchants/[id]/offer-sync/route.ts.bak new file mode 100644 index 0000000..5830936 --- /dev/null +++ b/app/api/admin/merchants/[id]/offer-sync/route.ts.bak @@ -0,0 +1,35 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function POST( + request: NextRequest, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/merchants/${params.id}/offer-sync`, + { method: 'POST', headers } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } +} diff --git a/app/api/admin/merchants/[id]/route.ts b/app/api/admin/merchants/[id]/route.ts index ab02998..eb344cf 100644 --- a/app/api/admin/merchants/[id]/route.ts +++ b/app/api/admin/merchants/[id]/route.ts @@ -4,20 +4,22 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } export async function GET( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); const res = await fetch( - `${API_BASE_URL}/api/v1/admin/merchants/${params.id}`, + `${API_BASE_URL}/api/v1/admin/merchants/${resolvedParams.id}`, { headers } ); @@ -36,14 +38,15 @@ export async function GET( export async function PUT( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); const body = await request.json(); const res = await fetch( - `${API_BASE_URL}/api/v1/admin/merchants/${params.id}`, + `${API_BASE_URL}/api/v1/admin/merchants/${resolvedParams.id}`, { method: 'PUT', headers: { ...headers, 'Content-Type': 'application/json' }, @@ -66,13 +69,14 @@ export async function PUT( export async function DELETE( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); const res = await fetch( - `${API_BASE_URL}/api/v1/admin/merchants/${params.id}`, + `${API_BASE_URL}/api/v1/admin/merchants/${resolvedParams.id}`, { method: 'DELETE', headers } ); diff --git a/app/api/admin/merchants/[id]/route.ts.bak b/app/api/admin/merchants/[id]/route.ts.bak new file mode 100644 index 0000000..ab02998 --- /dev/null +++ b/app/api/admin/merchants/[id]/route.ts.bak @@ -0,0 +1,90 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET( + request: NextRequest, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/merchants/${params.id}`, + { headers } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } +} + +export async function PUT( + request: NextRequest, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + const body = await request.json(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/merchants/${params.id}`, + { + method: 'PUT', + headers: { ...headers, 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } +} + +export async function DELETE( + request: NextRequest, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/merchants/${params.id}`, + { method: 'DELETE', headers } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } +} diff --git a/app/api/admin/merchants/route.ts b/app/api/admin/merchants/route.ts index e3f8e8f..e01d153 100644 --- a/app/api/admin/merchants/route.ts +++ b/app/api/admin/merchants/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/merchants/route.ts.bak b/app/api/admin/merchants/route.ts.bak new file mode 100644 index 0000000..e3f8e8f --- /dev/null +++ b/app/api/admin/merchants/route.ts.bak @@ -0,0 +1,54 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET() { + try { + const headers = await getAuthHeader(); + const res = await fetch(`${API_BASE_URL}/api/v1/admin/merchants`, { + headers, + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } +} + +export async function POST(request: NextRequest) { + try { + const headers = await getAuthHeader(); + const body = await request.json(); + + const res = await fetch(`${API_BASE_URL}/api/v1/admin/merchants`, { + method: 'POST', + headers: { ...headers, 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } +} diff --git a/app/api/admin/platforms/[id]/route.ts b/app/api/admin/platforms/[id]/route.ts index 199abf3..258f344 100644 --- a/app/api/admin/platforms/[id]/route.ts +++ b/app/api/admin/platforms/[id]/route.ts @@ -4,21 +4,23 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } export async function PATCH( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); const body = await request.json(); const res = await fetch( - `${API_BASE_URL}/api/v1/admin/platforms/${params.id}`, + `${API_BASE_URL}/api/v1/admin/platforms/${resolvedParams.id}`, { method: 'PATCH', headers: { @@ -44,13 +46,14 @@ export async function PATCH( export async function DELETE( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); const res = await fetch( - `${API_BASE_URL}/api/v1/admin/platforms/${params.id}`, + `${API_BASE_URL}/api/v1/admin/platforms/${resolvedParams.id}`, { method: 'DELETE', headers } ); diff --git a/app/api/admin/platforms/[id]/route.ts.bak b/app/api/admin/platforms/[id]/route.ts.bak new file mode 100644 index 0000000..199abf3 --- /dev/null +++ b/app/api/admin/platforms/[id]/route.ts.bak @@ -0,0 +1,68 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function PATCH( + request: NextRequest, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + const body = await request.json(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/platforms/${params.id}`, + { + method: 'PATCH', + headers: { + ...headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } +} + +export async function DELETE( + request: NextRequest, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/platforms/${params.id}`, + { method: 'DELETE', headers } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json({ ok: true }); + } catch (err: any) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } +} diff --git a/app/api/admin/platforms/route.ts b/app/api/admin/platforms/route.ts index 91ecce3..d8301fa 100644 --- a/app/api/admin/platforms/route.ts +++ b/app/api/admin/platforms/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/platforms/route.ts.bak b/app/api/admin/platforms/route.ts.bak new file mode 100644 index 0000000..91ecce3 --- /dev/null +++ b/app/api/admin/platforms/route.ts.bak @@ -0,0 +1,72 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET(request: NextRequest) { + try { + const headers = await getAuthHeader(); + const searchParams = request.nextUrl.searchParams; + const queryString = searchParams.toString(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/platforms${queryString ? `?${queryString}` : ''}`, + { + headers: { + ...headers, + Accept: 'application/json', + }, + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} + +export async function POST(request: NextRequest) { + try { + const headers = await getAuthHeader(); + const body = await request.json(); + + const res = await fetch(`${API_BASE_URL}/api/v1/admin/platforms`, { + method: 'POST', + headers: { + ...headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} diff --git a/app/api/admin/products/bulk/route.ts b/app/api/admin/products/bulk/route.ts index 26ae31f..7fd1697 100644 --- a/app/api/admin/products/bulk/route.ts +++ b/app/api/admin/products/bulk/route.ts @@ -5,7 +5,9 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BAS export async function PATCH(request: NextRequest) { try { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + + const token = cookieStore.get('session_token')?.value; if (!token) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } diff --git a/app/api/admin/products/bulk/route.ts.bak b/app/api/admin/products/bulk/route.ts.bak new file mode 100644 index 0000000..26ae31f --- /dev/null +++ b/app/api/admin/products/bulk/route.ts.bak @@ -0,0 +1,41 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +export async function PATCH(request: NextRequest) { + try { + const token = cookies().get('session_token')?.value; + if (!token) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const body = await request.json(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/products/bulk`, + { + method: 'PATCH', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/products/calibers/route.ts b/app/api/admin/products/calibers/route.ts index a5fe1f5..8896927 100644 --- a/app/api/admin/products/calibers/route.ts +++ b/app/api/admin/products/calibers/route.ts @@ -5,7 +5,9 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BAS export async function GET(request: NextRequest) { try { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + + const token = cookieStore.get('session_token')?.value; if (!token) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } diff --git a/app/api/admin/products/calibers/route.ts.bak b/app/api/admin/products/calibers/route.ts.bak new file mode 100644 index 0000000..a5fe1f5 --- /dev/null +++ b/app/api/admin/products/calibers/route.ts.bak @@ -0,0 +1,40 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +export async function GET(request: NextRequest) { + try { + const token = cookies().get('session_token')?.value; + if (!token) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const searchParams = request.nextUrl.searchParams; + const queryString = searchParams.toString(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/products/calibers${queryString ? `?${queryString}` : ''}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + }, + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/products/roles/route.ts b/app/api/admin/products/roles/route.ts index 37e01f9..ade6f24 100644 --- a/app/api/admin/products/roles/route.ts +++ b/app/api/admin/products/roles/route.ts @@ -5,7 +5,9 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BAS export async function GET(request: NextRequest) { try { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + + const token = cookieStore.get('session_token')?.value; if (!token) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } diff --git a/app/api/admin/products/roles/route.ts.bak b/app/api/admin/products/roles/route.ts.bak new file mode 100644 index 0000000..37e01f9 --- /dev/null +++ b/app/api/admin/products/roles/route.ts.bak @@ -0,0 +1,40 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +export async function GET(request: NextRequest) { + try { + const token = cookies().get('session_token')?.value; + if (!token) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const searchParams = request.nextUrl.searchParams; + const queryString = searchParams.toString(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/products/roles${queryString ? `?${queryString}` : ''}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + }, + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/products/route.ts b/app/api/admin/products/route.ts index c694270..41ce020 100644 --- a/app/api/admin/products/route.ts +++ b/app/api/admin/products/route.ts @@ -6,7 +6,9 @@ const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BAS export async function GET(request: NextRequest) { try { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + + const token = cookieStore.get('session_token')?.value; if (!token) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } diff --git a/app/api/admin/products/route.ts.bak b/app/api/admin/products/route.ts.bak new file mode 100644 index 0000000..c694270 --- /dev/null +++ b/app/api/admin/products/route.ts.bak @@ -0,0 +1,42 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; +import { fixImageUrls } from '@/lib/server/image-utils'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +export async function GET(request: NextRequest) { + try { + const token = cookies().get('session_token')?.value; + if (!token) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const searchParams = request.nextUrl.searchParams; + const queryString = searchParams.toString(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/products${queryString ? `?${queryString}` : ''}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + }, + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + const data = await res.json(); + return NextResponse.json(fixImageUrls(data)); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/users/[id]/route.ts b/app/api/admin/users/[id]/route.ts index 199abf3..258f344 100644 --- a/app/api/admin/users/[id]/route.ts +++ b/app/api/admin/users/[id]/route.ts @@ -4,21 +4,23 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } export async function PATCH( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); const body = await request.json(); const res = await fetch( - `${API_BASE_URL}/api/v1/admin/platforms/${params.id}`, + `${API_BASE_URL}/api/v1/admin/platforms/${resolvedParams.id}`, { method: 'PATCH', headers: { @@ -44,13 +46,14 @@ export async function PATCH( export async function DELETE( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const resolvedParams = await params; const headers = await getAuthHeader(); const res = await fetch( - `${API_BASE_URL}/api/v1/admin/platforms/${params.id}`, + `${API_BASE_URL}/api/v1/admin/platforms/${resolvedParams.id}`, { method: 'DELETE', headers } ); diff --git a/app/api/admin/users/[id]/route.ts.bak b/app/api/admin/users/[id]/route.ts.bak new file mode 100644 index 0000000..199abf3 --- /dev/null +++ b/app/api/admin/users/[id]/route.ts.bak @@ -0,0 +1,68 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function PATCH( + request: NextRequest, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + const body = await request.json(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/platforms/${params.id}`, + { + method: 'PATCH', + headers: { + ...headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } +} + +export async function DELETE( + request: NextRequest, + { params }: { params: { id: string } } +) { + try { + const headers = await getAuthHeader(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/platforms/${params.id}`, + { method: 'DELETE', headers } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json({ ok: true }); + } catch (err: any) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } +} diff --git a/app/api/admin/users/route.ts b/app/api/admin/users/route.ts index b3a1807..f684f83 100644 --- a/app/api/admin/users/route.ts +++ b/app/api/admin/users/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/api/admin/users/route.ts.bak b/app/api/admin/users/route.ts.bak new file mode 100644 index 0000000..b3a1807 --- /dev/null +++ b/app/api/admin/users/route.ts.bak @@ -0,0 +1,72 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; + +const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; + +async function getAuthHeader() { + const token = cookies().get('session_token')?.value; + if (!token) throw new Error('Unauthorized'); + return { Authorization: `Bearer ${token}` }; +} + +export async function GET(request: NextRequest) { + try { + const headers = await getAuthHeader(); + const searchParams = request.nextUrl.searchParams; + const queryString = searchParams.toString(); + + const res = await fetch( + `${API_BASE_URL}/api/v1/admin/users${queryString ? `?${queryString}` : ''}`, + { + headers: { + ...headers, + Accept: 'application/json', + }, + } + ); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + const data = await res.json(); + return NextResponse.json(data); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} + +export async function POST(request: NextRequest) { + try { + const headers = await getAuthHeader(); + const body = await request.json(); + + const res = await fetch(`${API_BASE_URL}/api/v1/admin/users`, { + method: 'POST', + headers: { + ...headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }); + + if (!res.ok) { + return NextResponse.json( + { error: await res.text() }, + { status: res.status } + ); + } + + return NextResponse.json(await res.json()); + } catch (err: any) { + return NextResponse.json( + { error: err?.message || 'Unauthorized' }, + { status: 401 } + ); + } +} diff --git a/app/api/auth/login/route.ts b/app/api/auth/login/route.ts index 4dc7978..b76f98e 100644 --- a/app/api/auth/login/route.ts +++ b/app/api/auth/login/route.ts @@ -25,7 +25,8 @@ export async function POST(request: NextRequest) { const data = await res.json(); // Set HTTP-only cookie instead of returning token - cookies().set('session_token', data.token, { + const cookieStore = await cookies(); + cookieStore.set('session_token', data.token, { httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'lax', diff --git a/app/api/auth/logout/route.ts b/app/api/auth/logout/route.ts index a34af3c..20b45cb 100644 --- a/app/api/auth/logout/route.ts +++ b/app/api/auth/logout/route.ts @@ -2,6 +2,7 @@ import { NextResponse } from 'next/server'; import { cookies } from 'next/headers'; export async function POST() { - cookies().delete('session_token'); + const cookieStore = await cookies(); + cookieStore.delete('session_token'); return NextResponse.json({ success: true }); } diff --git a/app/api/auth/me/route.ts b/app/api/auth/me/route.ts index 277c0cc..0b6764d 100644 --- a/app/api/auth/me/route.ts +++ b/app/api/auth/me/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; export async function GET(request: NextRequest) { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); @@ -16,7 +17,7 @@ export async function GET(request: NextRequest) { }); if (!res.ok) { - cookies().delete('session_token'); + cookieStore.delete('session_token'); return NextResponse.json({ error: 'Session expired' }, { status: 401 }); } diff --git a/app/api/auth/register/route.ts b/app/api/auth/register/route.ts index a2b75d8..8f451ba 100644 --- a/app/api/auth/register/route.ts +++ b/app/api/auth/register/route.ts @@ -26,7 +26,8 @@ export async function POST(request: NextRequest) { // Set HTTP-only cookie on successful registration if (data.token) { - cookies().set('session_token', data.token, { + const cookieStore = await cookies(); + cookieStore.set('session_token', data.token, { httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'lax', diff --git a/app/api/builds/[id]/route.ts b/app/api/builds/[id]/route.ts index 66d70ef..98ae848 100644 --- a/app/api/builds/[id]/route.ts +++ b/app/api/builds/[id]/route.ts @@ -4,20 +4,22 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } export async function GET( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const { id } = await params; const headers = await getAuthHeader(); const res = await fetch( - `${API_BASE_URL}/api/v1/gunbuilder/builds/${params.id}`, + `${API_BASE_URL}/api/v1/gunbuilder/builds/${id}`, { headers } ); @@ -36,14 +38,15 @@ export async function GET( export async function PUT( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const { id } = await params; const headers = await getAuthHeader(); const body = await request.json(); const res = await fetch( - `${API_BASE_URL}/api/v1/gunbuilder/builds/${params.id}`, + `${API_BASE_URL}/api/v1/gunbuilder/builds/${id}`, { method: 'PUT', headers: { ...headers, 'Content-Type': 'application/json' }, @@ -66,13 +69,14 @@ export async function PUT( export async function DELETE( request: NextRequest, - { params }: { params: { id: string } } + { params }: { params: Promise<{ id: string }> } ) { try { + const { id } = await params; const headers = await getAuthHeader(); const res = await fetch( - `${API_BASE_URL}/api/v1/gunbuilder/builds/${params.id}`, + `${API_BASE_URL}/api/v1/gunbuilder/builds/${id}`, { method: 'DELETE', headers } ); diff --git a/app/api/builds/route.ts b/app/api/builds/route.ts index 1a86f8c..b707981 100644 --- a/app/api/builds/route.ts +++ b/app/api/builds/route.ts @@ -4,7 +4,8 @@ import { cookies } from 'next/headers'; const API_BASE_URL = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL; async function getAuthHeader() { - const token = cookies().get('session_token')?.value; + const cookieStore = await cookies(); + const token = cookieStore.get('session_token')?.value; if (!token) throw new Error('Unauthorized'); return { Authorization: `Bearer ${token}` }; } diff --git a/app/builds/[buildId]/page.tsx b/app/builds/[buildId]/page.tsx index 8a24ed7..c389327 100644 --- a/app/builds/[buildId]/page.tsx +++ b/app/builds/[buildId]/page.tsx @@ -29,11 +29,13 @@ function timeAgo(iso?: string | null) { export default async function BuildBreakdownPage({ params, }: { - params: { buildId: string }; + params: Promise<{ buildId: string }>; }) { + const { buildId } = await params; + // Public detail endpoint - use Next.js API route const baseUrl = process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000'; - const res = await fetch(`${baseUrl}/api/builds/public/${params.buildId}`, { + const res = await fetch(`${baseUrl}/api/builds/public/${buildId}`, { cache: "no-store", }); @@ -359,7 +361,7 @@ export default async function BuildBreakdownPage({
Build ID - {(build.uuid ?? params.buildId).slice(0, 8)}… + {(build.uuid ?? buildId).slice(0, 8)}…
diff --git a/components/ui/RichTextEditor.tsx b/components/ui/RichTextEditor.tsx index d81eb8f..61d8c9d 100644 --- a/components/ui/RichTextEditor.tsx +++ b/components/ui/RichTextEditor.tsx @@ -3,17 +3,17 @@ import { useMemo } from "react"; import dynamic from "next/dynamic"; import type React from "react"; -import "react-quill/dist/quill.snow.css"; +// import "react-quill/dist/quill.snow.css"; + +const ReactQuill = dynamic(() => import("react-quill-new"), { ssr: false }); + +type RichTextEditorProps = { + value: string; + onChange: (html: string) => void; + placeholder?: string; + className?: string; +}; -const ReactQuill = dynamic(() => import("react-quill"), { ssr: false }); - -type RichTextEditorProps = { - value: string; - onChange: (html: string) => void; - placeholder?: string; - className?: string; -}; - export default function RichTextEditor({ value, onChange, diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03..830fb59 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,5 +1,6 @@ /// /// +/// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/next.config.mjs b/next.config.mjs index a2a9b1a..ba381fd 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,8 +1,5 @@ /** @type {import('next').NextConfig} */ const nextConfig = { - experimental: { - appDir: true, - }, typescript: { ignoreBuildErrors: true, }, diff --git a/package-lock.json b/package-lock.json index 52ce261..7e33f2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,23 @@ { - "name": "gunbuilder-prototype", - "version": "0.1.0", + "name": "battl.builders", + "version": "1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "gunbuilder-prototype", - "version": "0.1.0", + "name": "battl.builders", + "version": "1.0", + "license": "UNLICENSED", "dependencies": { "@headlessui/react": "^2.2.9", "@heroicons/react": "^2.2.0", "clsx": "^2.1.1", "lucide-react": "^0.555.0", - "next": "14.2.3", - "quill": "^2.0.3", + "next": "15.5.11", "quill-image-resize-module": "^3.0.0", - "react": "18.3.1", - "react-dom": "18.3.1", - "react-quill": "^2.0.0" + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-quill-new": "^3.7.0" }, "devDependencies": { "@types/node": "20.12.7", @@ -45,9 +45,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", - "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", "dev": true, "license": "MIT", "optional": true, @@ -57,10 +57,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", - "dev": true, + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "license": "MIT", "optional": true, "dependencies": { @@ -79,9 +78,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -142,21 +141,21 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.3", + "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, @@ -176,12 +175,12 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz", + "integrity": "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.4" + "@floating-ui/dom": "^1.7.5" }, "peerDependencies": { "react": ">=16.8.0", @@ -261,6 +260,472 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "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.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "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-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -361,9 +826,9 @@ } }, "node_modules/@next/env": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz", - "integrity": "sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==", + "version": "15.5.11", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.11.tgz", + "integrity": "sha512-g9s5SS9gC7GJCEOR3OV3zqs7C5VddqxP9X+/6BpMbdXRkqsWfFf2CJPBZNvNEtAkKTNuRgRXAgNxSAXzfLdaTg==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -377,9 +842,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz", - "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.7.tgz", + "integrity": "sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==", "cpu": [ "arm64" ], @@ -393,9 +858,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", - "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.7.tgz", + "integrity": "sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==", "cpu": [ "x64" ], @@ -409,9 +874,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", - "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.7.tgz", + "integrity": "sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==", "cpu": [ "arm64" ], @@ -425,9 +890,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", - "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.7.tgz", + "integrity": "sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==", "cpu": [ "arm64" ], @@ -441,9 +906,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", - "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.7.tgz", + "integrity": "sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==", "cpu": [ "x64" ], @@ -457,9 +922,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", - "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.7.tgz", + "integrity": "sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==", "cpu": [ "x64" ], @@ -473,9 +938,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", - "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.7.tgz", + "integrity": "sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==", "cpu": [ "arm64" ], @@ -488,26 +953,10 @@ "node": ">= 10" } }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", - "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz", - "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.7.tgz", + "integrity": "sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==", "cpu": [ "x64" ], @@ -690,29 +1139,22 @@ "dev": true, "license": "MIT" }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" - }, "node_modules/@swc/helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", + "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", "license": "Apache-2.0", "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" + "tslib": "^2.8.0" } }, "node_modules/@tanstack/react-virtual": { - "version": "3.13.14", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.14.tgz", - "integrity": "sha512-WG0d7mBD54eA7dgA3+sO5csS0B49QKqM6Gy5Rf31+Oq/LTKROQSao9m2N/vz1IqVragOKU5t5k1LAcqh/DfTxw==", + "version": "3.13.18", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.18.tgz", + "integrity": "sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==", "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.13.14" + "@tanstack/virtual-core": "3.13.18" }, "funding": { "type": "github", @@ -724,9 +1166,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.13.14", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.14.tgz", - "integrity": "sha512-b5Uvd8J2dc7ICeX9SRb/wkCxWk7pUwN214eEPAQsqrsktSKTCmyLxOQWSMgogBByXclZeAdgZ3k4o0fIYUIBqQ==", + "version": "3.13.18", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.18.tgz", + "integrity": "sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==", "license": "MIT", "funding": { "type": "github", @@ -768,21 +1210,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/quill": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", - "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", - "license": "MIT", - "dependencies": { - "parchment": "^1.1.2" - } - }, - "node_modules/@types/quill/node_modules/parchment": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", - "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", - "license": "BSD-3-Clause" - }, "node_modules/@types/react": { "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", @@ -1567,9 +1994,9 @@ } }, "node_modules/axe-core": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", - "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", "dev": true, "license": "MPL-2.0", "engines": { @@ -1594,9 +2021,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.31", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.31.tgz", - "integrity": "sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==", + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1641,9 +2068,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -1661,11 +2088,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -1674,17 +2101,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -1753,9 +2169,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001757", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", - "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", + "version": "1.0.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", "funding": [ { "type": "opencollective", @@ -2063,6 +2479,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -2125,9 +2551,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.260", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.260.tgz", - "integrity": "sha512-ov8rBoOBhVawpzdre+Cmz4FB+y66Eqrk6Gwqd8NGxuhv99GQ8XqMAr351KEkOt7gukXWDg6gJWEMKgL2RLMPtA==", + "version": "1.5.283", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", + "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", "dev": true, "license": "ISC" }, @@ -2139,9 +2565,9 @@ "license": "MIT" }, "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "dev": true, "license": "MIT", "dependencies": { @@ -2226,27 +2652,27 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.24.1", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.3.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", "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", + "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" }, "engines": { @@ -2737,9 +3163,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2783,9 +3209,9 @@ } }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==", "license": "MIT" }, "node_modules/extend": { @@ -2852,9 +3278,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -3100,9 +3526,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.1.tgz", + "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", "dev": true, "license": "MIT", "dependencies": { @@ -3240,12 +3666,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -3928,6 +4348,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -4071,15 +4492,15 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", "license": "MIT" }, "node_modules/lodash.clonedeep": { @@ -4106,6 +4527,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -4257,41 +4679,40 @@ "license": "MIT" }, "node_modules/next": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz", - "integrity": "sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==", + "version": "15.5.11", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.11.tgz", + "integrity": "sha512-L2KPiKmqTDpRdeVDdPjhf43g2/VPe0NCNndq7OKDCgOLWtxe1kbr/zXGIZtYY7kZEAjRf7Bj/mwUFSr+tYC2Yg==", "license": "MIT", "dependencies": { - "@next/env": "14.2.3", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", + "@next/env": "15.5.11", + "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", "postcss": "8.4.31", - "styled-jsx": "5.1.1" + "styled-jsx": "5.1.6" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=18.17.0" + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.3", - "@next/swc-darwin-x64": "14.2.3", - "@next/swc-linux-arm64-gnu": "14.2.3", - "@next/swc-linux-arm64-musl": "14.2.3", - "@next/swc-linux-x64-gnu": "14.2.3", - "@next/swc-linux-x64-musl": "14.2.3", - "@next/swc-win32-arm64-msvc": "14.2.3", - "@next/swc-win32-ia32-msvc": "14.2.3", - "@next/swc-win32-x64-msvc": "14.2.3" + "@next/swc-darwin-arm64": "15.5.7", + "@next/swc-darwin-x64": "15.5.7", + "@next/swc-linux-arm64-gnu": "15.5.7", + "@next/swc-linux-arm64-musl": "15.5.7", + "@next/swc-linux-x64-gnu": "15.5.7", + "@next/swc-linux-x64-musl": "15.5.7", + "@next/swc-win32-arm64-msvc": "15.5.7", + "@next/swc-win32-x64-msvc": "15.5.7", + "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "@playwright/test": "^1.51.1", + "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": { @@ -4301,11 +4722,23 @@ "@playwright/test": { "optional": true }, + "babel-plugin-react-compiler": { + "optional": true + }, "sass": { "optional": true } } }, + "node_modules/next/node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -4588,9 +5021,9 @@ } }, "node_modules/parchment": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz", - "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", "license": "BSD-3-Clause" }, "node_modules/parent-module": { @@ -4792,6 +5225,55 @@ "postcss": "^8.4.21" } }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/postcss-nested": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", @@ -4893,18 +5375,17 @@ "license": "MIT" }, "node_modules/quill": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.3.tgz", - "integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", "license": "BSD-3-Clause", "dependencies": { - "eventemitter3": "^5.0.1", - "lodash-es": "^4.17.21", - "parchment": "^3.0.0", - "quill-delta": "^5.1.0" - }, - "engines": { - "npm": ">=8.2.3" + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" } }, "node_modules/quill-delta": { @@ -4932,39 +5413,13 @@ "raw-loader": "^0.5.1" } }, - "node_modules/quill-image-resize-module/node_modules/eventemitter3": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", - "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==", - "license": "MIT" - }, - "node_modules/quill-image-resize-module/node_modules/fast-diff": { + "node_modules/quill/node_modules/fast-diff": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", "license": "Apache-2.0" }, - "node_modules/quill-image-resize-module/node_modules/parchment": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", - "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", - "license": "BSD-3-Clause" - }, - "node_modules/quill-image-resize-module/node_modules/quill": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", - "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", - "license": "BSD-3-Clause", - "dependencies": { - "clone": "^2.1.1", - "deep-equal": "^1.0.1", - "eventemitter3": "^2.0.3", - "extend": "^3.0.2", - "parchment": "^1.1.4", - "quill-delta": "^3.6.2" - } - }, - "node_modules/quill-image-resize-module/node_modules/quill-delta": { + "node_modules/quill/node_modules/quill-delta": { "version": "3.6.3", "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", @@ -4984,28 +5439,24 @@ "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==" }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.2.4" } }, "node_modules/react-is": { @@ -5015,65 +5466,46 @@ "dev": true, "license": "MIT" }, - "node_modules/react-quill": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", - "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", + "node_modules/react-quill-new": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/react-quill-new/-/react-quill-new-3.7.0.tgz", + "integrity": "sha512-i5qz1WukIR84ktJrA2VMcZdkRrfOl/4TAK6ygMTX1/9Grcrgj0NW+LnoanBhuIbHaHJZwcvcWMBvSjUFsxQIQA==", "license": "MIT", "dependencies": { - "@types/quill": "^1.3.10", - "lodash": "^4.17.4", - "quill": "^1.3.7" + "lodash-es": "^4.17.21", + "quill": "~2.0.2" }, "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" + "quill-delta": "^5.1.0", + "react": "^16 || ^17 || ^18 || ^19", + "react-dom": "^16 || ^17 || ^18 || ^19" } }, - "node_modules/react-quill/node_modules/eventemitter3": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", - "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==", + "node_modules/react-quill-new/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, - "node_modules/react-quill/node_modules/fast-diff": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", - "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", - "license": "Apache-2.0" - }, - "node_modules/react-quill/node_modules/parchment": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", - "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", + "node_modules/react-quill-new/node_modules/parchment": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz", + "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==", "license": "BSD-3-Clause" }, - "node_modules/react-quill/node_modules/quill": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", - "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "node_modules/react-quill-new/node_modules/quill": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.3.tgz", + "integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==", "license": "BSD-3-Clause", "dependencies": { - "clone": "^2.1.1", - "deep-equal": "^1.0.1", - "eventemitter3": "^2.0.3", - "extend": "^3.0.2", - "parchment": "^1.1.4", - "quill-delta": "^3.6.2" - } - }, - "node_modules/react-quill/node_modules/quill-delta": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", - "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", - "license": "MIT", - "dependencies": { - "deep-equal": "^1.0.1", - "extend": "^3.0.2", - "fast-diff": "1.1.2" + "eventemitter3": "^5.0.1", + "lodash-es": "^4.17.21", + "parchment": "^3.0.0", + "quill-delta": "^5.1.0" }, "engines": { - "node": ">=0.10" + "npm": ">=8.2.3" } }, "node_modules/read-cache": { @@ -5313,19 +5745,16 @@ } }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5381,6 +5810,51 @@ "node": ">= 0.4" } }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5533,14 +6007,6 @@ "node": ">= 0.4" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -5775,9 +6241,9 @@ } }, "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", "license": "MIT", "dependencies": { "client-only": "0.0.1" @@ -5786,7 +6252,7 @@ "node": ">= 12.0.0" }, "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" }, "peerDependenciesMeta": { "@babel/core": { @@ -5847,9 +6313,9 @@ } }, "node_modules/tabbable": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", - "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "license": "MIT" }, "node_modules/tailwindcss": { @@ -5890,55 +6356,6 @@ "node": ">=14.0.0" } }, - "node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/tailwindcss/node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -6249,9 +6666,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -6389,9 +6806,9 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -6529,9 +6946,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", "bin": { @@ -6539,6 +6956,9 @@ }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yocto-queue": { diff --git a/package.json b/package.json index 31f3806..5806758 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ ], "license": "UNLICENSED", "scripts": { - "dev": "next dev --turbopack", + "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" @@ -29,12 +29,11 @@ "@heroicons/react": "^2.2.0", "clsx": "^2.1.1", "lucide-react": "^0.555.0", - "next": "14.2.3", - "quill": "^2.0.3", + "next": "15.5.11", "quill-image-resize-module": "^3.0.0", - "react": "18.3.1", - "react-dom": "18.3.1", - "react-quill": "^2.0.0" + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-quill-new": "^3.7.0" }, "devDependencies": { "@types/node": "20.12.7",