diff --git a/app/api/callback/route.ts b/app/api/callback/route.ts index 0d9dad0..2250e9f 100644 --- a/app/api/callback/route.ts +++ b/app/api/callback/route.ts @@ -1,16 +1,17 @@ -import { cookies } from "next/headers"; import { NextResponse } from "next/server"; -import { createRouteHandlerClient } from "@supabase/auth-helpers-nextjs"; +import { createClient } from "@/lib/supabase/server"; import type { NextRequest } from "next/server"; // Handles PKCE auth code exchange when Supabase redirects back with ?code=... +// The cookie-backed client reads the code verifier set during sign-in and +// writes the resulting session cookies onto the redirect response. export async function GET(req: NextRequest) { const { searchParams, origin } = new URL(req.url); const code = searchParams.get("code"); const next = searchParams.get("next") ?? "/"; if (code) { - const supabase = createRouteHandlerClient({ cookies }); + const supabase = createClient(); const { error } = await supabase.auth.exchangeCodeForSession(code); if (!error) { return NextResponse.redirect(`${origin}${next}`); @@ -21,18 +22,3 @@ export async function GET(req: NextRequest) { `${origin}/auth/email-link-sign-in?error=auth_callback_failed`, ); } - -// Syncs auth state changes (e.g. SIGNED_IN, SIGNED_OUT) sent from the client -export async function POST(req: NextRequest) { - const supabase = createRouteHandlerClient({ cookies }); - - const { event, session } = await req.json(); - - if (event === "SIGNED_IN" && session) { - await supabase.auth.setSession(session); - } else if (event === "SIGNED_OUT") { - await supabase.auth.signOut(); - } - - return NextResponse.json({ status: "success" }); -} diff --git a/app/api/email-sign-in/route.ts b/app/api/email-sign-in/route.ts index 60d4c6a..d1207cb 100644 --- a/app/api/email-sign-in/route.ts +++ b/app/api/email-sign-in/route.ts @@ -1,12 +1,7 @@ -import { createClient } from "@supabase/supabase-js"; +import { createClient } from "@/lib/supabase/server"; import { NextRequest, NextResponse } from "next/server"; export async function POST(req: NextRequest) { - const supabase = createClient( - process.env.NEXT_PUBLIC_SUPABASE_URL || "", - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || "", - ); - const { email } = await req.json(); if (!email || !email.endsWith("@pointblank.club")) { @@ -19,7 +14,12 @@ export async function POST(req: NextRequest) { ); } - const { data, error } = await supabase.auth.signInWithOtp({ + // Cookie-backed client: signInWithOtp stores the PKCE code verifier in a + // cookie that travels back to the browser, so /api/callback can complete the + // exchange when the user clicks the email link. + const supabase = createClient(); + + const { error } = await supabase.auth.signInWithOtp({ email, options: { emailRedirectTo: `${process.env.NEXT_PUBLIC_DOMAIN || "https://careers.pointblank.club"}/api/callback`, diff --git a/app/api/member/[type]/[id]/route.ts b/app/api/member/[type]/[id]/route.ts index 45eea1b..32fc235 100644 --- a/app/api/member/[type]/[id]/route.ts +++ b/app/api/member/[type]/[id]/route.ts @@ -1,7 +1,6 @@ import { NextRequest, NextResponse } from 'next/server'; import { createClient } from '@supabase/supabase-js'; -import { cookies } from 'next/headers'; -import { createServerComponentClient } from '@supabase/auth-helpers-nextjs'; +import { createClient as createServerSupabaseClient } from '@/lib/supabase/server'; import { AchievementService, @@ -63,7 +62,7 @@ export async function DELETE( return NextResponse.json({ error: 'DELETE not supported for this type' }, { status: 405 }); } - const supabase = createServerComponentClient({ cookies }); + const supabase = createServerSupabaseClient(); const { data: { user } } = await supabase.auth.getUser(); if (!user) { diff --git a/app/directory/page.tsx b/app/directory/page.tsx index 60566f7..ddbddc3 100644 --- a/app/directory/page.tsx +++ b/app/directory/page.tsx @@ -46,7 +46,8 @@ const getOrigin = (): string => { if (typeof window !== "undefined") { return window.location.origin; } - return process.env.NEXT_PUBLIC_SITE_URL || "https://career.pointblank.club"; + return process.env.NEXT_PUBLIC_DOMAIN + || "https://careers.pointblank.club"; }; function DirectoryContent() { diff --git a/app/page.tsx b/app/page.tsx index 5e87097..33434f8 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,46 +1,8 @@ -"use client"; -import { useEffect, Suspense } from "react"; -import { supabase } from "@/lib/supabaseClient"; -import { useAuthStore } from "@/lib/authStore"; -import { useRouter, useSearchParams } from "next/navigation"; import { HeroSection } from "@/components/home/hero-section"; -import { FeaturesSection } from "@/components/home/features-section"; import { AnimatedGradientBackground } from '@/components/ui/animated-gradient-background'; import Domains from '@/components/home/domains' -function AuthHandler() { - const router = useRouter(); - const searchParams = useSearchParams(); - - useEffect(() => { - const code = searchParams.get("code"); - if (code) { - supabase.auth - .exchangeCodeForSession(code) - .then(async ({ data, error }) => { - if (error) { - console.error("Exchange error:", error); - } - const { session } = data; - if (session) { - useAuthStore.getState().setUser(session.user); - router.replace(window.location.pathname); - } - }); - } else { - - supabase.auth.getSession().then(({ data: { session } }) => { - if (session) { - useAuthStore.getState().setUser(session.user); - } - }); - } - }, [router, searchParams]); - - return null; -} - -function PageContent() { +export default function UploadPage() { return (
{/* Animated gradient background with reduced opacity */} @@ -60,25 +22,3 @@ function PageContent() {
); } - -function PageLoading() { - return ( -
-
-
-
-
-
- ); -} - -export default function UploadPage() { - return ( - <> - - - - - - ); -} \ No newline at end of file diff --git a/app/profile/[id]/page.tsx b/app/profile/[id]/page.tsx index 8db22ed..73b07c1 100644 --- a/app/profile/[id]/page.tsx +++ b/app/profile/[id]/page.tsx @@ -1,7 +1,6 @@ import { Metadata } from "next"; import { notFound, redirect } from "next/navigation"; -import { createServerComponentClient } from "@supabase/auth-helpers-nextjs"; -import { cookies } from "next/headers"; +import { createClient } from "@/lib/supabase/server"; import { MemberService, SkillService, @@ -42,7 +41,7 @@ function formatResumeDisplayName(fullName: string, year: number): string { export async function generateMetadata({ params }: ProfilePageProps): Promise { const { id } = await params; - const supabase = createServerComponentClient({ cookies }); + const supabase = createClient(); let member = await MemberService.getMemberById(supabase, id); @@ -70,7 +69,7 @@ export async function generateMetadata({ params }: ProfilePageProps): Promise - - {children} - - - + + {children} + + ); } diff --git a/app/upload/confirm/page.tsx b/app/upload/confirm/page.tsx index 64f204b..cd8ee8a 100644 --- a/app/upload/confirm/page.tsx +++ b/app/upload/confirm/page.tsx @@ -11,7 +11,7 @@ import { v4 as uuidv4 } from 'uuid'; import { createClient } from '@supabase/supabase-js'; import { Checkbox } from "@/components/ui/checkbox"; import { Textarea } from "@/components/ui/textarea"; -import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'; +import { supabase } from "@/lib/supabaseClient"; import { Select, SelectContent, @@ -413,7 +413,6 @@ const handleSubmit = async (e: React.FormEvent) => { setSaving(true); try { - const supabase = createClientComponentClient(); const { data: { session }, error } = await supabase.auth.getSession(); if (!session || !session.user) throw new Error("Not authenticated"); diff --git a/components/profile/resume-section.tsx b/components/profile/resume-section.tsx index 433b553..079abdc 100644 --- a/components/profile/resume-section.tsx +++ b/components/profile/resume-section.tsx @@ -6,7 +6,7 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Dialog, DialogContent, DialogHeader, DialogTitle} from "@/components/ui/dialog"; -import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'; +import { supabase } from "@/lib/supabaseClient"; import { useToast } from "@/hooks/use-toast"; import { AlertDialog, @@ -180,7 +180,6 @@ export function ResumeSection({ resumeUrl, isEditable, userId, displayFileName } const [resumeFiles, setResumeFiles] = useState([]); const [loading, setLoading] = useState(true); const [uploading, setUploading] = useState(false); - const supabase = createClientComponentClient(); const { toast } = useToast(); useEffect(() => { diff --git a/components/upload/confirmation-form.tsx b/components/upload/confirmation-form.tsx index 6f391df..612b9d6 100644 --- a/components/upload/confirmation-form.tsx +++ b/components/upload/confirmation-form.tsx @@ -8,7 +8,6 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Separator } from "@/components/ui/separator"; import { useAuthStore } from "@/lib/authStore"; -import { createClientComponentClient } from "@supabase/auth-helpers-nextjs"; import { Card, CardContent, @@ -189,7 +188,6 @@ export function ConfirmationForm({ parsedData }: ConfirmationFormProps) { setIsSubmitting(true); try { - const supabase = createClientComponentClient(); const { data: { session }, error } = await supabase.auth.getSession(); if (!session || !session.access_token) { diff --git a/components/upload/resume-upload.tsx b/components/upload/resume-upload.tsx index 7bc246a..84ffad3 100644 --- a/components/upload/resume-upload.tsx +++ b/components/upload/resume-upload.tsx @@ -17,14 +17,13 @@ import { Input } from "@/components/ui/input"; import { Separator } from "@/components/ui/separator"; import { Badge } from "@/components/ui/badge"; import { useToast } from "@/hooks/use-toast"; -import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'; +import { supabase } from "@/lib/supabaseClient"; export function ResumeUpload() { const router = useRouter(); const { toast } = useToast(); const fileInputRef = useRef(null); - const supabase = createClientComponentClient(); - + const [file, setFile] = useState(null); const [isDragging, setIsDragging] = useState(false); const [uploading, setUploading] = useState(false); diff --git a/lib/authStore.ts b/lib/authStore.ts index 997ea59..0f1fec9 100644 --- a/lib/authStore.ts +++ b/lib/authStore.ts @@ -17,15 +17,10 @@ export const initAuthListener = () => { useAuthStore.getState().setUser(session?.user ?? null); }); - supabase.auth.onAuthStateChange(async (event, session) => { + // Cookies are now the single source of truth shared with the server, so no + // manual sync to /api/callback is needed — just mirror the user into the store + // so the UI reacts to auth changes. + supabase.auth.onAuthStateChange((_event, session) => { useAuthStore.getState().setUser(session?.user ?? null); - - await fetch("/api/callback", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ event, session }), - }); }); }; diff --git a/lib/supabase/server.ts b/lib/supabase/server.ts new file mode 100644 index 0000000..df98e6d --- /dev/null +++ b/lib/supabase/server.ts @@ -0,0 +1,33 @@ +import { createServerClient } from "@supabase/ssr"; +import { cookies } from "next/headers"; + +// Cookie-backed Supabase client for Route Handlers and Server Components. +// In Route Handlers the cookie store is writable, so the PKCE code verifier +// (and refreshed session) round-trips through the browser's cookies. In Server +// Components writing is a no-op (the store is read-only) — the middleware +// refreshes the session there instead. +export const createClient = () => { + const cookieStore = cookies(); + + return createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + getAll() { + return cookieStore.getAll(); + }, + setAll(cookiesToSet) { + try { + cookiesToSet.forEach(({ name, value, options }) => + cookieStore.set(name, value, options), + ); + } catch { + // Called from a Server Component — safe to ignore; the session is + // refreshed by middleware. + } + }, + }, + }, + ); +}; diff --git a/lib/supabaseClient.ts b/lib/supabaseClient.ts index 9d85fb9..0b0ac61 100644 --- a/lib/supabaseClient.ts +++ b/lib/supabaseClient.ts @@ -1,6 +1,9 @@ -import { createClient } from '@supabase/supabase-js'; +import { createBrowserClient } from "@supabase/ssr"; -export const supabase = createClient( +// Cookie-backed browser client. Sharing the cookie store with the server +// clients (middleware, route handlers, server components) gives the whole app a +// single source of truth for the session. +export const supabase = createBrowserClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! -); \ No newline at end of file + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, +); diff --git a/middleware.ts b/middleware.ts index 6d2752d..f6c087d 100644 --- a/middleware.ts +++ b/middleware.ts @@ -1,14 +1,34 @@ -import { createMiddlewareClient } from '@supabase/auth-helpers-nextjs'; +import { createServerClient } from '@supabase/ssr'; import { NextResponse } from 'next/server'; import type { NextRequest } from 'next/server'; export async function middleware(req: NextRequest) { - const res = NextResponse.next(); - const supabase = createMiddlewareClient({ req, res }); + let res = NextResponse.next({ request: req }); + const supabase = createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + getAll() { + return req.cookies.getAll(); + }, + setAll(cookiesToSet) { + cookiesToSet.forEach(({ name, value }) => req.cookies.set(name, value)); + res = NextResponse.next({ request: req }); + cookiesToSet.forEach(({ name, value, options }) => + res.cookies.set(name, value, options) + ); + }, + }, + } + ); + + // getUser() revalidates the token with the auth server (don't trust getSession + // in middleware) and refreshes cookies via setAll above. const { - data: { session }, - } = await supabase.auth.getSession(); + data: { user }, + } = await supabase.auth.getUser(); const protectedRoutes = [ '/api/profile/update', @@ -30,14 +50,20 @@ export async function middleware(req: NextRequest) { pathname.startsWith(route) ); - if (isProtected && !session) { + // Carry any refreshed auth cookies onto a redirect response. + const withAuthCookies = (redirect: NextResponse) => { + res.cookies.getAll().forEach((cookie) => redirect.cookies.set(cookie)); + return redirect; + }; + + if (isProtected && !user) { const redirectUrl = new URL('/auth/email-link-sign-in', req.url); redirectUrl.searchParams.set('redirect', pathname); - return NextResponse.redirect(redirectUrl); + return withAuthCookies(NextResponse.redirect(redirectUrl)); } - if (pathname.startsWith('/auth') && session) { - return NextResponse.redirect(new URL('/', req.url)); + if (pathname.startsWith('/auth') && user) { + return withAuthCookies(NextResponse.redirect(new URL('/', req.url))); } return res; diff --git a/package-lock.json b/package-lock.json index a57f1fc..b0f2b7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,8 +38,6 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", - "@supabase/auth-helpers-nextjs": "^0.9.0", - "@supabase/auth-helpers-react": "^0.5.0", "@supabase/ssr": "^0.6.1", "@supabase/supabase-js": "^2.50.2", "@types/node": "20.6.2", @@ -241,7 +239,6 @@ "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.13.1.tgz", "integrity": "sha512-0O33PKrXLoIWkoOO5ByFaLjZehBctSYWnb+xJkIdx2SKP/K9l1UPFXPwASyrOIqyY3ws+7orF/1j7wI5EKzPYQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.17", "@firebase/logger": "0.4.4", @@ -308,7 +305,6 @@ "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.4.1.tgz", "integrity": "sha512-9VGjnY23Gc1XryoF/ABWtZVJYnaPOnjHM7dsqq9YALgKRtxI1FryvELUVkDaEIUf4In2bfkb9ZENF1S9M273Dw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/app": "0.13.1", "@firebase/component": "0.6.17", @@ -324,8 +320,7 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@firebase/auth-compat": { "version": "0.5.27", @@ -776,7 +771,6 @@ "integrity": "sha512-Z4rK23xBCwgKDqmzGVMef+Vb4xso2j5Q8OG0vVL4m4fA5ZjPMYQazu8OJJC3vtQRC3SQ/Pgx/6TPNVsCd70QRw==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" }, @@ -1413,7 +1407,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -3064,43 +3057,6 @@ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==" }, - "node_modules/@supabase/auth-helpers-nextjs": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-nextjs/-/auth-helpers-nextjs-0.9.0.tgz", - "integrity": "sha512-V+UKFngSCkzAucX3Zi5D4TRiJZUUx0RDme7W217nIkwhCTvJY7Ih2L1cgnAMihQost2YYgTzJ7DrUzz4mm8i8A==", - "deprecated": "This package is now deprecated - please use the @supabase/ssr package instead.", - "license": "MIT", - "dependencies": { - "@supabase/auth-helpers-shared": "0.6.3", - "set-cookie-parser": "^2.6.0" - }, - "peerDependencies": { - "@supabase/supabase-js": "^2.19.0" - } - }, - "node_modules/@supabase/auth-helpers-react": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-react/-/auth-helpers-react-0.5.0.tgz", - "integrity": "sha512-5QSaV2CGuhDhd7RlQCoviVEAYsP7XnrFMReOcBazDvVmqSIyjKcDwhLhWvnrxMOq5qjOaA44MHo7wXqDiF0puQ==", - "deprecated": "This package is now deprecated - please use the @supabase/ssr package instead.", - "license": "MIT", - "peerDependencies": { - "@supabase/supabase-js": "^2.39.8" - } - }, - "node_modules/@supabase/auth-helpers-shared": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-shared/-/auth-helpers-shared-0.6.3.tgz", - "integrity": "sha512-xYQRLFeFkL4ZfwC7p9VKcarshj3FB2QJMgJPydvOY7J5czJe6xSG5/wM1z63RmAzGbCkKg+dzpq61oeSyWiGBQ==", - "deprecated": "This package is now deprecated - please use the @supabase/ssr package instead.", - "license": "MIT", - "dependencies": { - "jose": "^4.14.4" - }, - "peerDependencies": { - "@supabase/supabase-js": "^2.19.0" - } - }, "node_modules/@supabase/auth-js": { "version": "2.70.0", "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.70.0.tgz", @@ -3179,7 +3135,6 @@ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.50.3.tgz", "integrity": "sha512-Ld42AbfSXKnbCE2ObRvrGC5wj9OrfTOzswQZg0OcGQGx+QqcWYN/IqsLqrt4gCFrD57URbNRfGESSWzchzKAuQ==", "license": "MIT", - "peer": true, "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.5", @@ -3302,7 +3257,6 @@ "version": "18.2.22", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", - "peer": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3313,7 +3267,6 @@ "version": "18.2.7", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", - "peer": true, "dependencies": { "@types/react": "*" } @@ -3463,7 +3416,6 @@ "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3879,7 +3831,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001663", "electron-to-chromium": "^1.5.28", @@ -3899,7 +3850,6 @@ "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -4754,7 +4704,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -4940,8 +4889,7 @@ "node_modules/embla-carousel": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.3.0.tgz", - "integrity": "sha512-Ve8dhI4w28qBqR8J+aMtv7rLK89r1ZA5HocwFz6uMB/i5EiC7bGI7y+AM80yAVUJw3qqaZYK7clmZMUR8kM3UA==", - "peer": true + "integrity": "sha512-Ve8dhI4w28qBqR8J+aMtv7rLK89r1ZA5HocwFz6uMB/i5EiC7bGI7y+AM80yAVUJw3qqaZYK7clmZMUR8kM3UA==" }, "node_modules/embla-carousel-react": { "version": "8.3.0", @@ -4973,7 +4921,6 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "license": "MIT", - "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -5184,7 +5131,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -5339,7 +5285,6 @@ "version": "2.31.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", @@ -6766,15 +6711,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7544,7 +7480,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.0.tgz", "integrity": "sha512-7SKfdvP8CTNXjMUzfcVTaI+TDzBEeaUnVwiVGZQD1Hh33Kpev7liQba9uLd4CfN8r9mCVsD0JIpq03+Unpz+kg==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.9.0", "pg-pool": "^3.10.0", @@ -7755,7 +7690,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -8009,7 +7943,6 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -8034,7 +7967,6 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -8047,7 +7979,6 @@ "version": "7.53.0", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.0.tgz", "integrity": "sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==", - "peer": true, "engines": { "node": ">=18.0.0" }, @@ -8430,12 +8361,6 @@ "node": ">=10" } }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "license": "MIT" - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -8929,7 +8854,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -9183,7 +9107,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9290,7 +9213,6 @@ "integrity": "sha512-EYZR+OpIXp9Y1eG1iueg8KRsY8TuT8VNgnanZ0uA3STqhHQTLwbl+WX76/9X5OY12yQubymBpaBSmMPkSTQcKA==", "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -9594,7 +9516,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index f2d95b9..9cc22e8 100644 --- a/package.json +++ b/package.json @@ -39,8 +39,6 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", - "@supabase/auth-helpers-nextjs": "^0.9.0", - "@supabase/auth-helpers-react": "^0.5.0", "@supabase/ssr": "^0.6.1", "@supabase/supabase-js": "^2.50.2", "@types/node": "20.6.2",