From e6815eca1fe80e1268cd4ca4a03cd09458888e71 Mon Sep 17 00:00:00 2001 From: manNomi Date: Wed, 27 May 2026 01:22:06 +0900 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20=EC=9B=B9=20React=2019=20=EC=97=85?= =?UTF-8?q?=EA=B7=B8=EB=A0=88=EC=9D=B4=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/next.config.mjs | 21 +- apps/web/package.json | 16 +- apps/web/sentry.client.config.ts | 45 - .../_ui/PopularUniversitySection/index.tsx | 13 +- apps/web/src/app/(home)/page.tsx | 10 +- apps/web/src/app/api/revalidate/route.ts | 4 +- .../[boardCode]/[postId]/modify/page.tsx | 8 +- .../community/[boardCode]/[postId]/page.tsx | 10 +- .../app/community/[boardCode]/create/page.tsx | 4 +- .../src/app/community/[boardCode]/page.tsx | 8 +- apps/web/src/app/favicon.ico | Bin 1417 -> 410598 bytes apps/web/src/app/layout.tsx | 11 +- apps/web/src/app/login/page.tsx | 9 +- apps/web/src/app/mentor/[id]/page.tsx | 7 +- .../web/src/app/mentor/chat/[chatId]/page.tsx | 7 +- .../app/university/[homeUniversity]/page.tsx | 11 +- .../app/university/application/apply/page.tsx | 9 +- apps/web/src/app/university/score/page.tsx | 4 +- .../score/submit/gpa/_lib/schema.ts | 3 +- .../app/university/score/submit/gpa/page.tsx | 6 +- .../score/submit/language-test/_lib/schema.ts | 3 +- .../score/submit/language-test/page.tsx | 4 +- apps/web/src/app/university/search/page.tsx | 4 +- .../components/layout/GlobalLayout/index.tsx | 5 +- apps/web/src/instrumentation-client.ts | 33 + apps/web/src/instrumentation.ts | 13 + apps/web/src/{middleware.ts => proxy.ts} | 2 +- apps/web/src/utils/isServerStateLogin.ts | 4 +- apps/web/tsconfig.json | 17 +- pnpm-lock.yaml | 1091 ++++++++++------- 30 files changed, 777 insertions(+), 605 deletions(-) delete mode 100644 apps/web/sentry.client.config.ts create mode 100644 apps/web/src/instrumentation-client.ts create mode 100644 apps/web/src/instrumentation.ts rename apps/web/src/{middleware.ts => proxy.ts} (96%) diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs index cf9c4041..b35edd0b 100644 --- a/apps/web/next.config.mjs +++ b/apps/web/next.config.mjs @@ -7,26 +7,30 @@ const withBundleAnalyzer = bundleAnalyzer({ enabled: process.env.ANALYZE === "true", }); +const imageRemotePatterns = [ + "k.kakaocdn.net", + "cdn.default.solid-connection.com", + "cdn.upload.solid-connection.com", +].map((hostname) => ({ + protocol: "https", + hostname, +})); + /** @type {import('next').NextConfig} */ const nextConfig = { - swcMinify: true, transpilePackages: ["@solid-connect/ai-inspector"], images: { unoptimized: true, - domains: ["k.kakaocdn.net", "cdn.default.solid-connection.com", "cdn.upload.solid-connection.com"], + remotePatterns: imageRemotePatterns, formats: ["image/avif", "image/webp"], deviceSizes: [360, 640, 768, 1024, 1280], }, - // 폰트 최적화 설정 - optimizeFonts: true, // 압축 활성화 compress: true, // 정적 리소스 최적화 experimental: { optimizeCss: true, gzipSize: true, - // Sentry instrumentation 활성화 (Web Vitals 수집에 필요) - instrumentationHook: true, optimizePackageImports: [ "lucide-react", "@radix-ui/react-select", @@ -41,11 +45,6 @@ const nextConfig = { "@hookform/resolvers", ], }, - eslint: { - // Warning: This allows production builds to successfully complete even if - // your project has ESLint errors. - ignoreDuringBuilds: true, - }, typescript: { ignoreBuildErrors: true, }, diff --git a/apps/web/package.json b/apps/web/package.json index 051704f8..aa6ed880 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev": "next dev", - "build": "next build", + "build": "next build --webpack", "start": "next start", "lint": "biome check --write .", "lint:check": "biome check .", @@ -13,11 +13,11 @@ "typecheck": "tsc --noEmit", "typecheck:ci": "tsc --noEmit -p tsconfig.ci.json", "ci:check": "pnpm run lint:check && pnpm run typecheck:ci", - "analyze": "ANALYZE=true next build" + "analyze": "ANALYZE=true next build --webpack" }, "dependencies": { "@hookform/resolvers": "^5.2.2", - "@next/third-parties": "^14.2.4", + "@next/third-parties": "^16.2.6", "@radix-ui/react-checkbox": "^1.1.4", "@radix-ui/react-label": "^2.1.2", "@radix-ui/react-progress": "^1.1.2", @@ -37,10 +37,10 @@ "linkify-react": "^4.3.2", "linkifyjs": "^4.3.2", "lucide-react": "^0.479.0", - "next": "^14.2.35", + "next": "^16.2.6", "next-render-analyzer": "^0.1.2", - "react": "^18", - "react-dom": "^18", + "react": "^19.2.6", + "react-dom": "^19.2.6", "react-hook-form": "^7.60.0", "react-hot-toast": "^2.6.0", "sockjs-client": "^1.6.1", @@ -50,10 +50,10 @@ "zustand": "^5.0.7" }, "devDependencies": { - "@next/bundle-analyzer": "^16.1.6", + "@next/bundle-analyzer": "^16.2.6", "@svgr/webpack": "^8.1.0", "@types/node": "^20.11.19", - "@types/react": "19.2.10", + "@types/react": "19.2.15", "@types/react-dom": "19.2.3", "autoprefixer": "^10.4.20", "critters": "^0.0.23", diff --git a/apps/web/sentry.client.config.ts b/apps/web/sentry.client.config.ts deleted file mode 100644 index d8604a2a..00000000 --- a/apps/web/sentry.client.config.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as Sentry from "@sentry/nextjs"; - -// 프로덕션 환경에서만 Sentry 초기화 -if (process.env.NODE_ENV === "production") { - Sentry.init({ - dsn: process.env.NEXT_PUBLIC_SENTRY_DSN || process.env.SENTRY_DSN || "", - environment: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT || process.env.SENTRY_ENVIRONMENT || "production", - - // Adds request headers and IP for users - // https://docs.sentry.io/platforms/javascript/guides/nextjs/configuration/options/#sendDefaultPii - sendDefaultPii: true, - - // Performance Monitoring: 프로덕션에서 30% 샘플링 - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate - tracesSampleRate: 0.3, - - // Session Replay 샘플링 설정 - // Capture Replay for 10% of all sessions, plus 100% of sessions with an error - // https://docs.sentry.io/platforms/javascript/session-replay/configuration/#general-integration-configuration - replaysSessionSampleRate: 0.1, // 일반 세션의 10% - replaysOnErrorSampleRate: 1.0, // 에러 발생 시 100% - - // tracePropagationTargets는 최상위 옵션으로 설정 - tracePropagationTargets: ["solid-connection.com", /^https:\/\/(www\.)?solid[-]?connection\.com/], - - integrations: [ - // Browser Tracing: 페이지 로드 및 네비게이션 성능 측정 - Sentry.browserTracingIntegration({ - // Web Vitals 자동 수집 활성화 - enableInp: true, // Interaction to Next Paint (INP) 측정 - }), - ], - }); - - // Session Replay: 초기 번들에서 제외하고 lazy load (~30-40kB 절감) - // https://docs.sentry.io/platforms/javascript/session-replay/#lazy-loading-replay - Sentry.lazyLoadIntegration("replayIntegration").then((replay) => { - Sentry.addIntegration( - replay({ - maskAllText: true, - blockAllMedia: true, - }), - ); - }); -} diff --git a/apps/web/src/app/(home)/_ui/PopularUniversitySection/index.tsx b/apps/web/src/app/(home)/_ui/PopularUniversitySection/index.tsx index 29304d00..a8db309d 100644 --- a/apps/web/src/app/(home)/_ui/PopularUniversitySection/index.tsx +++ b/apps/web/src/app/(home)/_ui/PopularUniversitySection/index.tsx @@ -1,18 +1,7 @@ -import dynamic from "next/dynamic"; import { Suspense } from "react"; import type { ListUniversity } from "@/types/university"; import PopularUniversityCard from "./_ui/PopularUniversityCard"; -// PopularUniversityCard를 동적 임포트 -const PopularUniversityCardDynamic = dynamic(() => import("./_ui/PopularUniversityCard"), { - ssr: false, - loading: () => ( -
-
-
- ), -}); - type PopularUniversitySectionProps = { universities: ListUniversity[]; }; @@ -46,7 +35,7 @@ const PopularUniversitySection = ({ universities }: PopularUniversitySectionProp
} > - import("./_ui/NewsSection"), { - ssr: false, - loading: () => , -}); - const baseUrl = process.env.NEXT_PUBLIC_WEB_URL || "https://solid-connection.com"; const ogImageUrl = `${baseUrl}/opengraph-image.png`; const homeMetaTitle = "교환학생 사이트 | 솔리드 커넥션 – 교환학생 커뮤니티, 플랫폼"; @@ -106,7 +100,7 @@ const HomePage = async () => { - + ); diff --git a/apps/web/src/app/api/revalidate/route.ts b/apps/web/src/app/api/revalidate/route.ts index 11a1568d..7cdb7bc8 100644 --- a/apps/web/src/app/api/revalidate/route.ts +++ b/apps/web/src/app/api/revalidate/route.ts @@ -57,7 +57,7 @@ async function POST(request: NextRequest) { // boardCode가 있으면 해당 커뮤니티 페이지 revalidate if (boardCode) { revalidatePath(`/community/${boardCode}`); - revalidateTag(`posts-${boardCode}`); + revalidateTag(`posts-${boardCode}`, { expire: 0 }); return NextResponse.json({ revalidated: true, @@ -78,7 +78,7 @@ async function POST(request: NextRequest) { // 특정 태그 revalidate if (tag) { - revalidateTag(tag); + revalidateTag(tag, { expire: 0 }); return NextResponse.json({ revalidated: true, message: `Tag ${tag} revalidated`, diff --git a/apps/web/src/app/community/[boardCode]/[postId]/modify/page.tsx b/apps/web/src/app/community/[boardCode]/[postId]/modify/page.tsx index 83ebf24f..ca1b315f 100644 --- a/apps/web/src/app/community/[boardCode]/[postId]/modify/page.tsx +++ b/apps/web/src/app/community/[boardCode]/[postId]/modify/page.tsx @@ -5,18 +5,18 @@ import TopDetailNavigation from "@/components/layout/TopDetailNavigation"; import PostModifyContent from "./PostModifyContent"; interface PostModifyPageProps { - params: { + params: Promise<{ boardCode: string; postId: string; - }; + }>; } export const metadata: Metadata = { title: "글 수정", }; -const PostModifyPage = ({ params }: PostModifyPageProps) => { - const { boardCode, postId } = params; +const PostModifyPage = async ({ params }: PostModifyPageProps) => { + const { boardCode, postId } = await params; return ( <> diff --git a/apps/web/src/app/community/[boardCode]/[postId]/page.tsx b/apps/web/src/app/community/[boardCode]/[postId]/page.tsx index 2780d50b..cd382117 100644 --- a/apps/web/src/app/community/[boardCode]/[postId]/page.tsx +++ b/apps/web/src/app/community/[boardCode]/[postId]/page.tsx @@ -3,19 +3,19 @@ import type { Metadata } from "next"; import PostPageContent from "./PostPageContent"; interface PostPageProps { - params: { + params: Promise<{ boardCode: string; postId: string; - }; + }>; } export const metadata: Metadata = { title: "게시글", }; -const PostPage = ({ params }: PostPageProps) => { - const { boardCode } = params; - const postId = Number(params.postId); +const PostPage = async ({ params }: PostPageProps) => { + const { boardCode, postId: postIdParam } = await params; + const postId = Number(postIdParam); return (
diff --git a/apps/web/src/app/community/[boardCode]/create/page.tsx b/apps/web/src/app/community/[boardCode]/create/page.tsx index 0f5aca6f..a95ec635 100644 --- a/apps/web/src/app/community/[boardCode]/create/page.tsx +++ b/apps/web/src/app/community/[boardCode]/create/page.tsx @@ -4,8 +4,8 @@ export const metadata = { title: "글쓰기", }; -const PostCreatePage = ({ params }: { params: { boardCode: string } }) => { - const { boardCode } = params; +const PostCreatePage = async ({ params }: { params: Promise<{ boardCode: string }> }) => { + const { boardCode } = await params; return (
diff --git a/apps/web/src/app/community/[boardCode]/page.tsx b/apps/web/src/app/community/[boardCode]/page.tsx index 1b60046f..a61b97dc 100644 --- a/apps/web/src/app/community/[boardCode]/page.tsx +++ b/apps/web/src/app/community/[boardCode]/page.tsx @@ -7,13 +7,13 @@ export const metadata: Metadata = { }; interface CommunityPageProps { - params: { + params: Promise<{ boardCode: string; - }; + }>; } -const CommunityPage = ({ params }: CommunityPageProps) => { - const { boardCode } = params; +const CommunityPage = async ({ params }: CommunityPageProps) => { + const { boardCode } = await params; return (
diff --git a/apps/web/src/app/favicon.ico b/apps/web/src/app/favicon.ico index 60a03576fbe057f3f0a4559d250771fb88ae23a3..ec7d51d1ee9e6218883a69c9ed349c281a0cb5f2 100644 GIT binary patch literal 410598 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 X{NSw7Kwkaj00000NkvXXu0mjfr7Dy1 diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index f6d23c80..552a51e6 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -1,18 +1,20 @@ import type { Metadata, Viewport } from "next"; -import dynamic from "next/dynamic"; import localFont from "next/font/local"; import type { ReactNode } from "react"; import { Toaster } from "react-hot-toast"; import GlobalLayout from "@/components/layout/GlobalLayout"; import ReissueProvider from "@/components/layout/ReissueProvider"; - import QueryProvider from "@/lib/react-query/QueryProvider"; +import AppleScriptLoader from "@/lib/ScriptLoader/AppleScriptLoader"; import "@/styles/globals.css"; import { GoogleAnalytics } from "@next/third-parties/google"; import { SpeedInsights } from "@vercel/speed-insights/next"; +const siteUrl = process.env.NEXT_PUBLIC_WEB_URL || "https://solid-connection.com"; + export const metadata: Metadata = { + metadataBase: new URL(siteUrl), title: "솔리드 커넥션", description: "솔리드 커넥션. 교환학생의 첫 걸음", verification: { @@ -39,11 +41,6 @@ const pretendard = localFont({ ], }); -const AppleScriptLoader = dynamic(() => import("@/lib/ScriptLoader/AppleScriptLoader"), { - ssr: false, - loading: () => null, -}); - declare global { interface Window { Kakao: { diff --git a/apps/web/src/app/login/page.tsx b/apps/web/src/app/login/page.tsx index 787674f8..4346dbfd 100644 --- a/apps/web/src/app/login/page.tsx +++ b/apps/web/src/app/login/page.tsx @@ -1,11 +1,6 @@ import type { Metadata } from "next"; -import dynamic from "next/dynamic"; - -const KakaoScriptLoader = dynamic(() => import("@/lib/ScriptLoader/KakaoScriptLoader"), { - ssr: false, - loading: () => null, -}); -const LoginContent = dynamic(() => import("./LoginContent"), { ssr: false }); +import KakaoScriptLoader from "@/lib/ScriptLoader/KakaoScriptLoader"; +import LoginContent from "./LoginContent"; export const metadata: Metadata = { title: "로그인", diff --git a/apps/web/src/app/mentor/[id]/page.tsx b/apps/web/src/app/mentor/[id]/page.tsx index ffda2381..0b34a435 100644 --- a/apps/web/src/app/mentor/[id]/page.tsx +++ b/apps/web/src/app/mentor/[id]/page.tsx @@ -9,11 +9,12 @@ export const metadata: Metadata = { }; interface MentorDetailPageProps { - params: { id: string }; + params: Promise<{ id: string }>; } -const MentorDetailPage = ({ params }: MentorDetailPageProps) => { - const mentorId = Number(params.id); +const MentorDetailPage = async ({ params }: MentorDetailPageProps) => { + const { id } = await params; + const mentorId = Number(id); return (
diff --git a/apps/web/src/app/mentor/chat/[chatId]/page.tsx b/apps/web/src/app/mentor/chat/[chatId]/page.tsx index d1b833ad..f2596a4c 100644 --- a/apps/web/src/app/mentor/chat/[chatId]/page.tsx +++ b/apps/web/src/app/mentor/chat/[chatId]/page.tsx @@ -11,11 +11,12 @@ export const metadata: Metadata = { }; interface ChatDetailPageProps { - params: { chatId: string }; + params: Promise<{ chatId: string }>; } -const ChatDetailPage = ({ params }: ChatDetailPageProps) => { - const chatId = Number(params.chatId); +const ChatDetailPage = async ({ params }: ChatDetailPageProps) => { + const { chatId: chatIdParam } = await params; + const chatId = Number(chatIdParam); if (Number.isNaN(chatId)) notFound(); return ( diff --git a/apps/web/src/app/university/[homeUniversity]/page.tsx b/apps/web/src/app/university/[homeUniversity]/page.tsx index 422c1be0..a8985d77 100644 --- a/apps/web/src/app/university/[homeUniversity]/page.tsx +++ b/apps/web/src/app/university/[homeUniversity]/page.tsx @@ -24,7 +24,7 @@ export async function generateStaticParams() { type PageProps = { params: Promise<{ homeUniversity: string }>; - searchParams?: Record; + searchParams?: Promise>; }; type SearchParamValue = string | string[] | undefined; @@ -80,10 +80,11 @@ export async function generateMetadata({ params }: PageProps): Promise const UniversityListPage = async ({ params, searchParams }: PageProps) => { const { homeUniversity } = await params; - const initialSearchText = getFirstSearchParamValue(searchParams?.searchText).trim(); - const languageTestTypeParam = getFirstSearchParamValue(searchParams?.languageTestType).trim(); - const countryCodeParams = getSearchParamValues(searchParams?.countryCode).filter(isCountryCode); - const regionParams = getSearchParamValues(searchParams?.region).filter(isRegionFilterValue); + const resolvedSearchParams = await searchParams; + const initialSearchText = getFirstSearchParamValue(resolvedSearchParams?.searchText).trim(); + const languageTestTypeParam = getFirstSearchParamValue(resolvedSearchParams?.languageTestType).trim(); + const countryCodeParams = getSearchParamValues(resolvedSearchParams?.countryCode).filter(isCountryCode); + const regionParams = getSearchParamValues(resolvedSearchParams?.region).filter(isRegionFilterValue); const initialRegion = regionParams.length === 1 ? regionParams[0] : RegionEnumExtend.ALL; const languageTestType = isLanguageTestType(languageTestTypeParam) ? languageTestTypeParam : undefined; diff --git a/apps/web/src/app/university/application/apply/page.tsx b/apps/web/src/app/university/application/apply/page.tsx index dbe02f79..83e31d3e 100644 --- a/apps/web/src/app/university/application/apply/page.tsx +++ b/apps/web/src/app/university/application/apply/page.tsx @@ -1,18 +1,13 @@ import type { Metadata } from "next"; -import dynamic from "next/dynamic"; +import ApplyPageContent from "./ApplyPageContent"; export const metadata: Metadata = { title: "지원하기", }; -const ApplyPageContentDynamic = dynamic(() => import("./ApplyPageContent"), { - ssr: false, - loading: () => null, -}); - const ApplyPage = () => { return (
- +
); }; diff --git a/apps/web/src/app/university/score/page.tsx b/apps/web/src/app/university/score/page.tsx index f8cd1778..013fd7be 100644 --- a/apps/web/src/app/university/score/page.tsx +++ b/apps/web/src/app/university/score/page.tsx @@ -1,9 +1,7 @@ import type { Metadata } from "next"; -import dynamic from "next/dynamic"; import TopDetailNavigation from "@/components/layout/TopDetailNavigation"; - -const ScoreScreen = dynamic(() => import("./ScoreScreen"), { ssr: false }); +import ScoreScreen from "./ScoreScreen"; export const metadata: Metadata = { title: "성적 확인하기", diff --git a/apps/web/src/app/university/score/submit/gpa/_lib/schema.ts b/apps/web/src/app/university/score/submit/gpa/_lib/schema.ts index 2eedcd20..3f48c510 100644 --- a/apps/web/src/app/university/score/submit/gpa/_lib/schema.ts +++ b/apps/web/src/app/university/score/submit/gpa/_lib/schema.ts @@ -3,6 +3,7 @@ import { z } from "zod"; // 1. Zod 스키마 정의: GPA 폼 데이터의 유효성 규칙 const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB const ACCEPTED_FILE_TYPES = ["image/jpeg", "image/png", "application/pdf", "image/webp"]; +const isFileList = (value: unknown): value is FileList => typeof FileList !== "undefined" && value instanceof FileList; export const gpaSchema = z .object({ @@ -11,7 +12,7 @@ export const gpaSchema = z }), gpa: z.string().min(1, "점수를 입력해주세요."), file: z - .instanceof(FileList) + .custom(isFileList, "증명서 파일을 첨부해주세요.") .refine((files) => files?.length === 1, "증명서 파일을 첨부해주세요.") .refine((files) => files?.[0]?.size <= MAX_FILE_SIZE, `파일 크기는 5MB를 초과할 수 없습니다.`) .refine((files) => ACCEPTED_FILE_TYPES.includes(files?.[0]?.type), ".jpeg, .png, .webp, .pdf 파일만 지원합니다."), diff --git a/apps/web/src/app/university/score/submit/gpa/page.tsx b/apps/web/src/app/university/score/submit/gpa/page.tsx index 1007e08e..0290eb48 100644 --- a/apps/web/src/app/university/score/submit/gpa/page.tsx +++ b/apps/web/src/app/university/score/submit/gpa/page.tsx @@ -1,9 +1,7 @@ import type { Metadata } from "next"; -import dynamic from "next/dynamic"; import TopDetailNavigation from "@/components/layout/TopDetailNavigation"; - -const ClientGpaForm = dynamic(() => import("./GpaSubmitForm"), { ssr: false }); +import GpaSubmitForm from "./GpaSubmitForm"; export const metadata: Metadata = { title: "성적 입력하기", @@ -14,7 +12,7 @@ const SubmitGpaPage = () => { <>
- +
); diff --git a/apps/web/src/app/university/score/submit/language-test/_lib/schema.ts b/apps/web/src/app/university/score/submit/language-test/_lib/schema.ts index 44093db1..e8f4d833 100644 --- a/apps/web/src/app/university/score/submit/language-test/_lib/schema.ts +++ b/apps/web/src/app/university/score/submit/language-test/_lib/schema.ts @@ -5,6 +5,7 @@ import validateLanguageScore from "@/utils/scoreUtils"; // 1. Zod 스키마 정의: 폼 데이터의 유효성 규칙 const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB const ACCEPTED_FILE_TYPES = ["image/jpeg", "image/png", "image/webp", "application/pdf"]; +const isFileList = (value: unknown): value is FileList => typeof FileList !== "undefined" && value instanceof FileList; export const languageTestSchema = z .object({ @@ -13,7 +14,7 @@ export const languageTestSchema = z }), score: z.string().min(1, "점수를 입력해주세요."), file: z - .instanceof(FileList) + .custom(isFileList, "증명서 파일을 첨부해주세요.") .refine((files) => files?.length === 1, "증명서 파일을 첨부해주세요.") .refine((files) => files?.[0]?.size <= MAX_FILE_SIZE, `파일 크기는 5MB를 초과할 수 없습니다.`) .refine((files) => ACCEPTED_FILE_TYPES.includes(files?.[0]?.type), ".jpeg, .png, .pdf 파일만 지원합니다."), diff --git a/apps/web/src/app/university/score/submit/language-test/page.tsx b/apps/web/src/app/university/score/submit/language-test/page.tsx index 2ffb8cde..9325c986 100644 --- a/apps/web/src/app/university/score/submit/language-test/page.tsx +++ b/apps/web/src/app/university/score/submit/language-test/page.tsx @@ -1,9 +1,7 @@ import type { Metadata } from "next"; -import dynamic from "next/dynamic"; import TopDetailNavigation from "@/components/layout/TopDetailNavigation"; - -const LanguageTestSubmitForm = dynamic(() => import("./LanguageTestSubmitForm"), { ssr: false }); +import LanguageTestSubmitForm from "./LanguageTestSubmitForm"; export const metadata: Metadata = { title: "성적 입력하기", diff --git a/apps/web/src/app/university/search/page.tsx b/apps/web/src/app/university/search/page.tsx index a019c2cd..ad28e4eb 100644 --- a/apps/web/src/app/university/search/page.tsx +++ b/apps/web/src/app/university/search/page.tsx @@ -1,9 +1,7 @@ import type { Metadata } from "next"; -import dynamic from "next/dynamic"; import TopDetailNavigation from "@/components/layout/TopDetailNavigation"; - -const SearchClientContent = dynamic(() => import("./SearchClientContent"), { ssr: false }); +import SearchClientContent from "./SearchClientContent"; export const metadata: Metadata = { title: "파견 학교 목록", diff --git a/apps/web/src/components/layout/GlobalLayout/index.tsx b/apps/web/src/components/layout/GlobalLayout/index.tsx index 4db968f5..aee5bc8a 100644 --- a/apps/web/src/components/layout/GlobalLayout/index.tsx +++ b/apps/web/src/components/layout/GlobalLayout/index.tsx @@ -1,13 +1,12 @@ -import dynamic from "next/dynamic"; import type { ReactNode } from "react"; +import AIInspectorFab from "./ui/AIInspectorFab/index"; import BottomNavigation from "./ui/BottomNavigation"; +import ClientModal from "./ui/ClientModal"; // import ServerModal from "./ui/ServerModal"; // const BottomNavigationDynamic = dynamic(() => import("./ui/BottomNavigation"), { ssr: false, loading: () => null }); -const AIInspectorFab = dynamic(() => import("./ui/AIInspectorFab/index"), { ssr: false, loading: () => null }); -const ClientModal = dynamic(() => import("./ui/ClientModal"), { ssr: false, loading: () => null }); type LayoutProps = { children: ReactNode; diff --git a/apps/web/src/instrumentation-client.ts b/apps/web/src/instrumentation-client.ts new file mode 100644 index 00000000..7d8c412b --- /dev/null +++ b/apps/web/src/instrumentation-client.ts @@ -0,0 +1,33 @@ +import * as Sentry from "@sentry/nextjs"; + +export const onRouterTransitionStart = Sentry.captureRouterTransitionStart; + +if (process.env.NODE_ENV === "production") { + Sentry.init({ + dsn: process.env.NEXT_PUBLIC_SENTRY_DSN || process.env.SENTRY_DSN || "", + environment: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT || process.env.SENTRY_ENVIRONMENT || "production", + + sendDefaultPii: true, + tracesSampleRate: 0.3, + + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, + + tracePropagationTargets: ["solid-connection.com", /^https:\/\/(www\.)?solid[-]?connection\.com/], + + integrations: [ + Sentry.browserTracingIntegration({ + enableInp: true, + }), + ], + }); + + Sentry.lazyLoadIntegration("replayIntegration").then((replay) => { + Sentry.addIntegration( + replay({ + maskAllText: true, + blockAllMedia: true, + }), + ); + }); +} diff --git a/apps/web/src/instrumentation.ts b/apps/web/src/instrumentation.ts new file mode 100644 index 00000000..ecb65282 --- /dev/null +++ b/apps/web/src/instrumentation.ts @@ -0,0 +1,13 @@ +import * as Sentry from "@sentry/nextjs"; + +export async function register() { + if (process.env.NEXT_RUNTIME === "nodejs") { + await import("../sentry.server.config"); + } + + if (process.env.NEXT_RUNTIME === "edge") { + await import("../sentry.edge.config"); + } +} + +export const onRequestError = Sentry.captureRequestError; diff --git a/apps/web/src/middleware.ts b/apps/web/src/proxy.ts similarity index 96% rename from apps/web/src/middleware.ts rename to apps/web/src/proxy.ts index d63c548c..ba38ed22 100644 --- a/apps/web/src/middleware.ts +++ b/apps/web/src/proxy.ts @@ -25,7 +25,7 @@ const isProbePath = (pathname: string) => { return blockedPathPrefixes.some((prefix) => pathname.startsWith(prefix)); }; -export function middleware(request: NextRequest) { +export function proxy(request: NextRequest) { const pathname = request.nextUrl.pathname; if (pathname === "/robots.txt" && isStageHostname(request.nextUrl.hostname)) { diff --git a/apps/web/src/utils/isServerStateLogin.ts b/apps/web/src/utils/isServerStateLogin.ts index 3e73a120..ea287ced 100644 --- a/apps/web/src/utils/isServerStateLogin.ts +++ b/apps/web/src/utils/isServerStateLogin.ts @@ -2,8 +2,8 @@ import { cookies } from "next/headers"; import { isTokenExpired } from "./jwtUtils"; -const isServerStateLogin = (): boolean => { - const cookieStore = cookies(); +const isServerStateLogin = async (): Promise => { + const cookieStore = await cookies(); const refreshToken = cookieStore.get("refreshToken")?.value; const isLogin = !!(refreshToken && !isTokenExpired(refreshToken)); return isLogin; diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 6631e2db..34e7b439 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -8,10 +8,10 @@ "incremental": true, "esModuleInterop": true, "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "types": ["react", "react-dom"], "typeRoots": ["./node_modules/@types"], "paths": { @@ -23,8 +23,17 @@ "name": "next" } ], - "strictNullChecks": true + "strictNullChecks": true, + "target": "ES2017" }, - "include": ["next-env.d.ts", "svg.d.ts", "images.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": [ + "next-env.d.ts", + "svg.d.ts", + "images.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], "exclude": ["node_modules"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e28b482f..6d907335 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,7 +125,7 @@ importers: version: 5.9.3 vinext: specifier: ^0.0.51 - version: 0.0.51(@vitejs/plugin-react@6.0.2(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(@vitejs/plugin-rsc@0.5.26(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.2)))(react@19.2.6)(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@14.2.35(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.2)))(react@19.2.6)(typescript@5.9.3)(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 0.0.51(@vitejs/plugin-react@6.0.2(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(@vitejs/plugin-rsc@0.5.26(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.2)))(react@19.2.6)(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.2.6(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.2)))(react@19.2.6)(typescript@5.9.3)(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) @@ -140,28 +140,28 @@ importers: dependencies: '@hookform/resolvers': specifier: ^5.2.2 - version: 5.2.2(react-hook-form@7.71.1(react@18.3.1)) + version: 5.2.2(react-hook-form@7.71.1(react@19.2.6)) '@next/third-parties': - specifier: ^14.2.4 - version: 14.2.35(next@14.2.35(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + specifier: ^16.2.6 + version: 16.2.6(next@16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) '@radix-ui/react-checkbox': specifier: ^1.1.4 - version: 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@radix-ui/react-label': specifier: ^2.1.2 - version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@radix-ui/react-progress': specifier: ^1.1.2 - version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@radix-ui/react-select': specifier: ^2.1.6 - version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@react-google-maps/api': specifier: ^2.19.2 - version: 2.20.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.20.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@sentry/nextjs': specifier: ^10.22.0 - version: 10.34.0(@opentelemetry/context-async-hooks@2.4.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.4.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.4.0(@opentelemetry/api@1.9.0))(next@14.2.35(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.104.1) + version: 10.34.0(@opentelemetry/context-async-hooks@2.4.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.4.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.4.0(@opentelemetry/api@1.9.0))(next@16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(webpack@5.104.1) '@solid-connect/ai-inspector': specifier: workspace:^ version: link:../../packages/ai-inspector @@ -170,16 +170,16 @@ importers: version: 7.2.1 '@tanstack/react-query': specifier: ^5.84.1 - version: 5.90.19(react@18.3.1) + version: 5.90.19(react@19.2.6) '@tanstack/react-query-devtools': specifier: ^5.84.1 - version: 5.91.2(@tanstack/react-query@5.90.19(react@18.3.1))(react@18.3.1) + version: 5.91.2(@tanstack/react-query@5.90.19(react@19.2.6))(react@19.2.6) '@tanstack/react-virtual': specifier: ^3.13.12 - version: 3.13.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.13.18(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@vercel/speed-insights': specifier: ^1.3.1 - version: 1.3.1(next@14.2.35(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 1.3.1(next@16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) axios: specifier: ^1.6.7 version: 1.13.2 @@ -194,31 +194,31 @@ importers: version: 13.7.0 linkify-react: specifier: ^4.3.2 - version: 4.3.2(linkifyjs@4.3.2)(react@18.3.1) + version: 4.3.2(linkifyjs@4.3.2)(react@19.2.6) linkifyjs: specifier: ^4.3.2 version: 4.3.2 lucide-react: specifier: ^0.479.0 - version: 0.479.0(react@18.3.1) + version: 0.479.0(react@19.2.6) next: - specifier: ^14.2.35 - version: 14.2.35(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^16.2.6 + version: 16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) next-render-analyzer: specifier: ^0.1.2 version: 0.1.2 react: - specifier: ^18 - version: 18.3.1 + specifier: ^19.2.6 + version: 19.2.6 react-dom: - specifier: ^18 - version: 18.3.1(react@18.3.1) + specifier: ^19.2.6 + version: 19.2.6(react@19.2.6) react-hook-form: specifier: ^7.60.0 - version: 7.71.1(react@18.3.1) + version: 7.71.1(react@19.2.6) react-hot-toast: specifier: ^2.6.0 - version: 2.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.6.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) sockjs-client: specifier: ^1.6.1 version: 1.6.1 @@ -233,11 +233,11 @@ importers: version: 4.3.5 zustand: specifier: ^5.0.7 - version: 5.0.10(@types/react@19.2.10)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) + version: 5.0.10(@types/react@19.2.15)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)) devDependencies: '@next/bundle-analyzer': - specifier: ^16.1.6 - version: 16.1.6 + specifier: ^16.2.6 + version: 16.2.6 '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.9.3) @@ -245,11 +245,11 @@ importers: specifier: ^20.11.19 version: 20.19.30 '@types/react': - specifier: 19.2.10 - version: 19.2.10 + specifier: 19.2.15 + version: 19.2.15 '@types/react-dom': specifier: 19.2.3 - version: 19.2.3(@types/react@19.2.10) + version: 19.2.3(@types/react@19.2.15) autoprefixer: specifier: ^10.4.20 version: 10.4.23(postcss@8.5.6) @@ -1357,6 +1357,143 @@ packages: peerDependencies: react-hook-form: ^7.55.0 + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1389,71 +1526,65 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@next/bundle-analyzer@16.1.6': - resolution: {integrity: sha512-ee2kagdTaeEWPlotgdTOqFHYcD3e2m2bbE3I9Rq2i6ABYi5OgopmtEUe8NM23viaYxLV2tDH/2nd5+qKoEr6cw==} + '@next/bundle-analyzer@16.2.6': + resolution: {integrity: sha512-amPkVtHCTJAdBwyhhl5+qztHk24O4JlASgrWqh15AmnYi74apfZR46NGC0u4pM6BMAU1mYld4WdzD3cRBP3dOA==} - '@next/env@14.2.35': - resolution: {integrity: sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==} + '@next/env@16.2.6': + resolution: {integrity: sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==} - '@next/swc-darwin-arm64@14.2.33': - resolution: {integrity: sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==} + '@next/swc-darwin-arm64@16.2.6': + resolution: {integrity: sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.33': - resolution: {integrity: sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==} + '@next/swc-darwin-x64@16.2.6': + resolution: {integrity: sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.33': - resolution: {integrity: sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==} + '@next/swc-linux-arm64-gnu@16.2.6': + resolution: {integrity: sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.33': - resolution: {integrity: sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==} + '@next/swc-linux-arm64-musl@16.2.6': + resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.33': - resolution: {integrity: sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==} + '@next/swc-linux-x64-gnu@16.2.6': + resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.33': - resolution: {integrity: sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==} + '@next/swc-linux-x64-musl@16.2.6': + resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.33': - resolution: {integrity: sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==} + '@next/swc-win32-arm64-msvc@16.2.6': + resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.33': - resolution: {integrity: sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@14.2.33': - resolution: {integrity: sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==} + '@next/swc-win32-x64-msvc@16.2.6': + resolution: {integrity: sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@next/third-parties@14.2.35': - resolution: {integrity: sha512-dG1J+4uYungW1snGViN7tAVyfO0iz0zoB+sqsLMUo8kwR0NED2muLTMbOChmrliHhzOFj6ZpHfkvhy5NJjFvSQ==} + '@next/third-parties@16.2.6': + resolution: {integrity: sha512-PDPIPVj1NX6Taxsl8OJteAUJ7iwR+QrokwWig68eh0cOmuNjC6MBL+ZzBjO8Bv0n/HOSqjGArZpM5KMSUxm+MQ==} peerDependencies: - next: ^13.0.0 || ^14.0.0 - react: ^18.2.0 + next: ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0-beta.0 + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -2538,11 +2669,8 @@ packages: resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} engines: {node: '>=14'} - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@tailwindcss/node@4.1.18': resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} @@ -2755,6 +2883,9 @@ packages: '@types/react@19.2.10': resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==} + '@types/react@19.2.15': + resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==} + '@types/request@2.48.13': resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==} @@ -3059,6 +3190,11 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.10.32: + resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==} + engines: {node: '>=6.0.0'} + hasBin: true + baseline-browser-mapping@2.9.15: resolution: {integrity: sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg==} hasBin: true @@ -3094,10 +3230,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -4382,21 +4514,24 @@ packages: engines: {node: '>=16.0.0'} hasBin: true - next@14.2.35: - resolution: {integrity: sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==} - engines: {node: '>=18.17.0'} + next@16.2.6: + resolution: {integrity: sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==} + engines: {node: '>=20.9.0'} hasBin: true 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: '@opentelemetry/api': optional: true '@playwright/test': optional: true + babel-plugin-react-compiler: + optional: true sass: optional: true @@ -4703,11 +4838,6 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - react-dom@19.2.6: resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} peerDependencies: @@ -4767,10 +4897,6 @@ packages: '@types/react': optional: true - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - react@19.2.4: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} @@ -4878,9 +5004,6 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -4900,6 +5023,10 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -4968,10 +5095,6 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -5003,13 +5126,13 @@ packages: stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' - 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': optional: true @@ -6849,11 +6972,11 @@ snapshots: '@floating-ui/core': 1.7.3 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react-dom@2.1.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@floating-ui/dom': 1.7.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) '@floating-ui/utils@0.2.10': {} @@ -6932,10 +7055,107 @@ snapshots: yargs: 17.7.2 optional: true - '@hookform/resolvers@5.2.2(react-hook-form@7.71.1(react@18.3.1))': + '@hookform/resolvers@5.2.2(react-hook-form@7.71.1(react@19.2.6))': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.71.1(react@18.3.1) + react-hook-form: 7.71.1(react@19.2.6) + + '@img/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.10.0 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true '@isaacs/cliui@8.0.2': dependencies: @@ -6980,46 +7200,43 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/bundle-analyzer@16.1.6': + '@next/bundle-analyzer@16.2.6': dependencies: webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: - bufferutil - utf-8-validate - '@next/env@14.2.35': {} - - '@next/swc-darwin-arm64@14.2.33': - optional: true + '@next/env@16.2.6': {} - '@next/swc-darwin-x64@14.2.33': + '@next/swc-darwin-arm64@16.2.6': optional: true - '@next/swc-linux-arm64-gnu@14.2.33': + '@next/swc-darwin-x64@16.2.6': optional: true - '@next/swc-linux-arm64-musl@14.2.33': + '@next/swc-linux-arm64-gnu@16.2.6': optional: true - '@next/swc-linux-x64-gnu@14.2.33': + '@next/swc-linux-arm64-musl@16.2.6': optional: true - '@next/swc-linux-x64-musl@14.2.33': + '@next/swc-linux-x64-gnu@16.2.6': optional: true - '@next/swc-win32-arm64-msvc@14.2.33': + '@next/swc-linux-x64-musl@16.2.6': optional: true - '@next/swc-win32-ia32-msvc@14.2.33': + '@next/swc-win32-arm64-msvc@16.2.6': optional: true - '@next/swc-win32-x64-msvc@14.2.33': + '@next/swc-win32-x64-msvc@16.2.6': optional: true - '@next/third-parties@14.2.35(next@14.2.35(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@next/third-parties@16.2.6(next@16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)': dependencies: - next: 14.2.35(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 + next: 16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 third-party-capital: 1.0.20 '@nodelib/fs.scandir@2.1.5': @@ -7321,42 +7538,30 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) - - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: @@ -7370,11 +7575,17 @@ snapshots: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - react: 18.3.1 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.10)(react@19.2.6)': dependencies: @@ -7382,11 +7593,11 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-context@1.1.2(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.15)(react@19.2.6)': dependencies: - react: 18.3.1 + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 '@radix-ui/react-context@1.1.2(@types/react@19.2.10)(react@19.2.6)': dependencies: @@ -7394,17 +7605,17 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-context@1.1.3(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.15)(react@19.2.6)': dependencies: - react: 18.3.1 + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 - '@radix-ui/react-direction@1.1.1(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-context@1.1.3(@types/react@19.2.15)(react@19.2.6)': dependencies: - react: 18.3.1 + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 '@radix-ui/react-direction@1.1.1(@types/react@19.2.10)(react@19.2.6)': dependencies: @@ -7412,42 +7623,41 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-direction@1.1.1(@types/react@19.2.15)(react@19.2.6)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.15 - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - react: 18.3.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.15)(react@19.2.6)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.15 - '@radix-ui/react-id@1.1.1(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) '@radix-ui/react-id@1.1.1(@types/react@19.2.10)(react@19.2.6)': dependencies: @@ -7456,14 +7666,12 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.15)(react@19.2.6)': dependencies: - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.15 '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: @@ -7474,43 +7682,42 @@ snapshots: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/rect': 1.1.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) - - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/rect': 1.1.1 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: @@ -7522,14 +7729,15 @@ snapshots: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: @@ -7540,14 +7748,14 @@ snapshots: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: @@ -7558,15 +7766,24 @@ snapshots: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-progress@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-progress@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@radix-ui/react-context': 1.1.3(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-context': 1.1.3(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: @@ -7585,41 +7802,34 @@ snapshots: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) aria-hidden: 1.2.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@18.3.1) - optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) - - '@radix-ui/react-slot@1.2.3(@types/react@19.2.10)(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-remove-scroll: 2.7.2(@types/react@19.2.15)(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) '@radix-ui/react-slot@1.2.3(@types/react@19.2.10)(react@19.2.6)': dependencies: @@ -7628,12 +7838,12 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.15)(react@19.2.6)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 '@radix-ui/react-slot@1.2.4(@types/react@19.2.10)(react@19.2.6)': dependencies: @@ -7642,6 +7852,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 + '@radix-ui/react-slot@1.2.4(@types/react@19.2.15)(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -7658,25 +7875,17 @@ snapshots: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.10)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 19.2.10 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.10)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.15)(react@19.2.6)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.10)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.10)(react@19.2.6)': dependencies: @@ -7686,12 +7895,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.15)(react@19.2.6)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.10)(react@19.2.6)': dependencies: @@ -7700,18 +7910,19 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.15)(react@19.2.6)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.15)(react@19.2.6)': dependencies: - react: 18.3.1 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.10)(react@19.2.6)': dependencies: @@ -7719,38 +7930,44 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.15)(react@19.2.6)': dependencies: - react: 18.3.1 + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.15)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.15)(react@19.2.6)': dependencies: '@radix-ui/rect': 1.1.1 - react: 18.3.1 + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.10)(react@18.3.1)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.15)(react@19.2.6)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@18.3.1) - react: 18.3.1 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) '@radix-ui/rect@1.1.1': {} - '@react-google-maps/api@2.20.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-google-maps/api@2.20.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@googlemaps/js-api-loader': 1.16.8 '@googlemaps/markerclusterer': 2.5.3 @@ -7758,8 +7975,8 @@ snapshots: '@react-google-maps/marker-clusterer': 2.20.0 '@types/google.maps': 3.58.1 invariant: 2.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) '@react-google-maps/infobox@2.20.0': {} @@ -8003,7 +8220,7 @@ snapshots: '@sentry/core@10.34.0': {} - '@sentry/nextjs@10.34.0(@opentelemetry/context-async-hooks@2.4.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.4.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.4.0(@opentelemetry/api@1.9.0))(next@14.2.35(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.104.1)': + '@sentry/nextjs@10.34.0(@opentelemetry/context-async-hooks@2.4.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.4.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.4.0(@opentelemetry/api@1.9.0))(next@16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(webpack@5.104.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.39.0 @@ -8013,10 +8230,10 @@ snapshots: '@sentry/core': 10.34.0 '@sentry/node': 10.34.0 '@sentry/opentelemetry': 10.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.4.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.4.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.4.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.39.0) - '@sentry/react': 10.34.0(react@18.3.1) + '@sentry/react': 10.34.0(react@19.2.6) '@sentry/vercel-edge': 10.34.0 '@sentry/webpack-plugin': 4.6.2(webpack@5.104.1) - next: 14.2.35(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) rollup: 4.55.1 stacktrace-parser: 0.1.11 transitivePeerDependencies: @@ -8093,11 +8310,11 @@ snapshots: '@opentelemetry/semantic-conventions': 1.39.0 '@sentry/core': 10.34.0 - '@sentry/react@10.34.0(react@18.3.1)': + '@sentry/react@10.34.0(react@19.2.6)': dependencies: '@sentry/browser': 10.34.0 '@sentry/core': 10.34.0 - react: 18.3.1 + react: 19.2.6 '@sentry/vercel-edge@10.34.0': dependencies: @@ -8217,11 +8434,8 @@ snapshots: - supports-color - typescript - '@swc/counter@0.1.3': {} - - '@swc/helpers@0.5.5': + '@swc/helpers@0.5.15': dependencies: - '@swc/counter': 0.1.3 tslib: 2.8.1 '@tailwindcss/node@4.1.18': @@ -8296,27 +8510,22 @@ snapshots: '@tanstack/query-devtools@5.92.0': {} - '@tanstack/react-query-devtools@5.91.2(@tanstack/react-query@5.90.19(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.91.2(@tanstack/react-query@5.90.19(react@19.2.6))(react@19.2.6)': dependencies: '@tanstack/query-devtools': 5.92.0 - '@tanstack/react-query': 5.90.19(react@18.3.1) - react: 18.3.1 - - '@tanstack/react-query@5.90.19(react@18.3.1)': - dependencies: - '@tanstack/query-core': 5.90.19 - react: 18.3.1 + '@tanstack/react-query': 5.90.19(react@19.2.6) + react: 19.2.6 '@tanstack/react-query@5.90.19(react@19.2.6)': dependencies: '@tanstack/query-core': 5.90.19 react: 19.2.6 - '@tanstack/react-virtual@3.13.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-virtual@3.13.18(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@tanstack/virtual-core': 3.13.18 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) '@tanstack/virtual-core@3.13.18': {} @@ -8423,10 +8632,18 @@ snapshots: dependencies: '@types/react': 19.2.10 + '@types/react-dom@19.2.3(@types/react@19.2.15)': + dependencies: + '@types/react': 19.2.15 + '@types/react@19.2.10': dependencies: csstype: 3.2.3 + '@types/react@19.2.15': + dependencies: + csstype: 3.2.3 + '@types/request@2.48.13': dependencies: '@types/caseless': 0.12.5 @@ -8448,23 +8665,23 @@ snapshots: dependencies: unpic: 4.2.2 - '@unpic/react@1.0.2(next@14.2.35(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@unpic/react@1.0.2(next@16.2.6(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@unpic/core': 1.0.3 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) optionalDependencies: - next: 14.2.35(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + next: 16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@vercel/og@0.8.6': dependencies: '@resvg/resvg-wasm': 2.4.0 satori: 0.16.0 - '@vercel/speed-insights@1.3.1(next@14.2.35(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@vercel/speed-insights@1.3.1(next@16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)': optionalDependencies: - next: 14.2.35(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 + next: 16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 '@vitejs/plugin-react@6.0.2(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: @@ -8753,6 +8970,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.10.32: {} + baseline-browser-mapping@2.9.15: {} bidi-js@1.0.3: @@ -8785,10 +9004,6 @@ snapshots: buffer-from@1.1.2: {} - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -9863,10 +10078,10 @@ snapshots: lines-and-columns@1.2.4: {} - linkify-react@4.3.2(linkifyjs@4.3.2)(react@18.3.1): + linkify-react@4.3.2(linkifyjs@4.3.2)(react@19.2.6): dependencies: linkifyjs: 4.3.2 - react: 18.3.1 + react: 19.2.6 linkifyjs@4.3.2: {} @@ -9944,9 +10159,9 @@ snapshots: lodash.clonedeep: 4.5.0 lru-cache: 6.0.0 - lucide-react@0.479.0(react@18.3.1): + lucide-react@0.479.0(react@19.2.6): dependencies: - react: 18.3.1 + react: 19.2.6 lucide-react@0.561.0(react@19.2.6): dependencies: @@ -10024,58 +10239,30 @@ snapshots: transitivePeerDependencies: - supports-color - next@14.2.35(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@next/env': 14.2.35 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001764 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.28.6)(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.33 - '@next/swc-darwin-x64': 14.2.33 - '@next/swc-linux-arm64-gnu': 14.2.33 - '@next/swc-linux-arm64-musl': 14.2.33 - '@next/swc-linux-x64-gnu': 14.2.33 - '@next/swc-linux-x64-musl': 14.2.33 - '@next/swc-win32-arm64-msvc': 14.2.33 - '@next/swc-win32-ia32-msvc': 14.2.33 - '@next/swc-win32-x64-msvc': 14.2.33 - '@opentelemetry/api': 1.9.0 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@14.2.35(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + next@16.2.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: - '@next/env': 14.2.35 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 + '@next/env': 16.2.6 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.10.32 caniuse-lite: 1.0.30001764 - graceful-fs: 4.2.11 postcss: 8.4.31 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - styled-jsx: 5.1.1(react@19.2.6) + styled-jsx: 5.1.6(@babel/core@7.28.6)(react@19.2.6) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.33 - '@next/swc-darwin-x64': 14.2.33 - '@next/swc-linux-arm64-gnu': 14.2.33 - '@next/swc-linux-arm64-musl': 14.2.33 - '@next/swc-linux-x64-gnu': 14.2.33 - '@next/swc-linux-x64-musl': 14.2.33 - '@next/swc-win32-arm64-msvc': 14.2.33 - '@next/swc-win32-ia32-msvc': 14.2.33 - '@next/swc-win32-x64-msvc': 14.2.33 + '@next/swc-darwin-arm64': 16.2.6 + '@next/swc-darwin-x64': 16.2.6 + '@next/swc-linux-arm64-gnu': 16.2.6 + '@next/swc-linux-arm64-musl': 16.2.6 + '@next/swc-linux-x64-gnu': 16.2.6 + '@next/swc-linux-x64-musl': 16.2.6 + '@next/swc-win32-arm64-msvc': 16.2.6 + '@next/swc-win32-x64-msvc': 16.2.6 '@opentelemetry/api': 1.9.0 + sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - optional: true nf3@0.3.17: {} @@ -10300,7 +10487,7 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -10367,48 +10554,42 @@ snapshots: dependencies: safe-buffer: 5.2.1 - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - react-dom@19.2.6(react@19.2.6): dependencies: react: 19.2.6 scheduler: 0.27.0 - react-hook-form@7.71.1(react@18.3.1): + react-hook-form@7.71.1(react@19.2.6): dependencies: - react: 18.3.1 + react: 19.2.6 - react-hot-toast@2.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-hot-toast@2.6.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: csstype: 3.2.3 goober: 2.1.18(csstype@3.2.3) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) react-is@17.0.2: {} - react-remove-scroll-bar@2.3.8(@types/react@19.2.10)(react@18.3.1): + react-remove-scroll-bar@2.3.8(@types/react@19.2.15)(react@19.2.6): dependencies: - react: 18.3.1 - react-style-singleton: 2.2.3(@types/react@19.2.10)(react@18.3.1) + react: 19.2.6 + react-style-singleton: 2.2.3(@types/react@19.2.15)(react@19.2.6) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 - react-remove-scroll@2.7.2(@types/react@19.2.10)(react@18.3.1): + react-remove-scroll@2.7.2(@types/react@19.2.15)(react@19.2.6): dependencies: - react: 18.3.1 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.10)(react@18.3.1) - react-style-singleton: 2.2.3(@types/react@19.2.10)(react@18.3.1) + react: 19.2.6 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.15)(react@19.2.6) + react-style-singleton: 2.2.3(@types/react@19.2.15)(react@19.2.6) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.10)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@19.2.10)(react@18.3.1) + use-callback-ref: 1.3.3(@types/react@19.2.15)(react@19.2.6) + use-sidecar: 1.1.3(@types/react@19.2.15)(react@19.2.6) optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.2)): dependencies: @@ -10419,17 +10600,13 @@ snapshots: webpack: 5.104.1(esbuild@0.27.2) webpack-sources: 3.3.3 - react-style-singleton@2.2.3(@types/react@19.2.10)(react@18.3.1): + react-style-singleton@2.2.3(@types/react@19.2.15)(react@19.2.6): dependencies: get-nonce: 1.0.1 - react: 18.3.1 + react: 19.2.6 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 + '@types/react': 19.2.15 react@19.2.4: {} @@ -10590,10 +10767,6 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - scheduler@0.27.0: {} schema-utils@4.3.3: @@ -10611,6 +10784,38 @@ snapshots: dependencies: randombytes: 2.1.0 + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.7.3 + 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 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -10676,8 +10881,6 @@ snapshots: stream-shift@1.0.3: optional: true - streamsearch@1.1.0: {} - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -10715,19 +10918,13 @@ snapshots: stubs@3.0.0: optional: true - styled-jsx@5.1.1(@babel/core@7.28.6)(react@18.3.1): + styled-jsx@5.1.6(@babel/core@7.28.6)(react@19.2.6): dependencies: client-only: 0.0.1 - react: 18.3.1 + react: 19.2.6 optionalDependencies: '@babel/core': 7.28.6 - styled-jsx@5.1.1(react@19.2.6): - dependencies: - client-only: 0.0.1 - react: 19.2.6 - optional: true - sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -11003,24 +11200,24 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-callback-ref@1.3.3(@types/react@19.2.10)(react@18.3.1): + use-callback-ref@1.3.3(@types/react@19.2.15)(react@19.2.6): dependencies: - react: 18.3.1 + react: 19.2.6 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 - use-sidecar@1.1.3(@types/react@19.2.10)(react@18.3.1): + use-sidecar@1.1.3(@types/react@19.2.15)(react@19.2.6): dependencies: detect-node-es: 1.1.0 - react: 18.3.1 + react: 19.2.6 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.15 - use-sync-external-store@1.6.0(react@18.3.1): + use-sync-external-store@1.6.0(react@19.2.6): dependencies: - react: 18.3.1 + react: 19.2.6 optional: true util-deprecate@1.0.2: {} @@ -11032,9 +11229,9 @@ snapshots: uuid@9.0.1: {} - vinext@0.0.51(@vitejs/plugin-react@6.0.2(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(@vitejs/plugin-rsc@0.5.26(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.2)))(react@19.2.6)(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@14.2.35(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.2)))(react@19.2.6)(typescript@5.9.3)(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vinext@0.0.51(@vitejs/plugin-react@6.0.2(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(@vitejs/plugin-rsc@0.5.26(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.2)))(react@19.2.6)(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.2.6(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.2)))(react@19.2.6)(typescript@5.9.3)(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - '@unpic/react': 1.0.2(next@14.2.35(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@unpic/react': 1.0.2(next@16.2.6(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@vercel/og': 0.8.6 '@vitejs/plugin-react': 6.0.2(vite@8.0.14(@types/node@22.19.7)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) image-size: 2.0.2 @@ -11367,8 +11564,8 @@ snapshots: zod@4.3.5: {} - zustand@5.0.10(@types/react@19.2.10)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)): + zustand@5.0.10(@types/react@19.2.15)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)): optionalDependencies: - '@types/react': 19.2.10 - react: 18.3.1 - use-sync-external-store: 1.6.0(react@18.3.1) + '@types/react': 19.2.15 + react: 19.2.6 + use-sync-external-store: 1.6.0(react@19.2.6) From f18f9b85ee0fba9743df18860e4782682393b670 Mon Sep 17 00:00:00 2001 From: manNomi Date: Wed, 27 May 2026 01:38:36 +0900 Subject: [PATCH 2/4] =?UTF-8?q?chore:=20next=2016=20turbopack=20=EB=B9=8C?= =?UTF-8?q?=EB=93=9C=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/next.config.mjs | 8 ++++++++ apps/web/package.json | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs index b35edd0b..9435aa90 100644 --- a/apps/web/next.config.mjs +++ b/apps/web/next.config.mjs @@ -19,6 +19,14 @@ const imageRemotePatterns = [ /** @type {import('next').NextConfig} */ const nextConfig = { transpilePackages: ["@solid-connect/ai-inspector"], + turbopack: { + rules: { + "*.svg": { + loaders: ["@svgr/webpack"], + as: "*.js", + }, + }, + }, images: { unoptimized: true, remotePatterns: imageRemotePatterns, diff --git a/apps/web/package.json b/apps/web/package.json index aa6ed880..d2819c39 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev": "next dev", - "build": "next build --webpack", + "build": "next build", "start": "next start", "lint": "biome check --write .", "lint:check": "biome check .", @@ -13,7 +13,7 @@ "typecheck": "tsc --noEmit", "typecheck:ci": "tsc --noEmit -p tsconfig.ci.json", "ci:check": "pnpm run lint:check && pnpm run typecheck:ci", - "analyze": "ANALYZE=true next build --webpack" + "analyze": "ANALYZE=true next build" }, "dependencies": { "@hookform/resolvers": "^5.2.2", From f548ec516ecab0fd4c7fd2fb6d592937b803a5f6 Mon Sep 17 00:00:00 2001 From: manNomi Date: Wed, 27 May 2026 01:52:58 +0900 Subject: [PATCH 3/4] =?UTF-8?q?chore:=20=EB=B2=88=EB=93=A4=20=EB=B6=84?= =?UTF-8?q?=EC=84=9D=20=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8=20webpack=20?= =?UTF-8?q?=EC=9C=A0=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/package.json b/apps/web/package.json index d2819c39..56481ee3 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -13,7 +13,7 @@ "typecheck": "tsc --noEmit", "typecheck:ci": "tsc --noEmit -p tsconfig.ci.json", "ci:check": "pnpm run lint:check && pnpm run typecheck:ci", - "analyze": "ANALYZE=true next build" + "analyze": "ANALYZE=true next build --webpack" }, "dependencies": { "@hookform/resolvers": "^5.2.2", From 2ae93b04e4a3df273f10d51e74a8eb6bfc316226 Mon Sep 17 00:00:00 2001 From: manNomi Date: Wed, 27 May 2026 15:09:53 +0900 Subject: [PATCH 4/4] =?UTF-8?q?chore:=20=EC=9B=B9=20=EB=B2=88=EB=93=A4=20?= =?UTF-8?q?=EB=B6=84=EC=84=9D=EC=9A=A9=20webpack=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/next.config.mjs | 57 ++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs index 9435aa90..6a940991 100644 --- a/apps/web/next.config.mjs +++ b/apps/web/next.config.mjs @@ -3,8 +3,11 @@ import bundleAnalyzer from "@next/bundle-analyzer"; import { withSentryConfig } from "@sentry/nextjs"; +const shouldRunBundleAnalyzer = process.env.ANALYZE === "true"; +const svgComponentLoaders = ["@svgr/webpack"]; + const withBundleAnalyzer = bundleAnalyzer({ - enabled: process.env.ANALYZE === "true", + enabled: shouldRunBundleAnalyzer, }); const imageRemotePatterns = [ @@ -22,7 +25,7 @@ const nextConfig = { turbopack: { rules: { "*.svg": { - loaders: ["@svgr/webpack"], + loaders: svgComponentLoaders, as: "*.js", }, }, @@ -56,31 +59,35 @@ const nextConfig = { typescript: { ignoreBuildErrors: true, }, - webpack: (config) => { - // CSS 최적화 - ensure nested objects exist - if (!config.optimization) { - config.optimization = {}; - } - if (!config.optimization.splitChunks) { - config.optimization.splitChunks = {}; - } - if (!config.optimization.splitChunks.cacheGroups) { - config.optimization.splitChunks.cacheGroups = {}; - } + ...(shouldRunBundleAnalyzer + ? { + webpack: (config) => { + // Bundle analyzer still runs through webpack because it is webpack-plugin based. + if (!config.optimization) { + config.optimization = {}; + } + if (!config.optimization.splitChunks) { + config.optimization.splitChunks = {}; + } + if (!config.optimization.splitChunks.cacheGroups) { + config.optimization.splitChunks.cacheGroups = {}; + } - config.optimization.splitChunks.cacheGroups.styles = { - name: "styles", - test: /\.(css|scss)$/, - chunks: "all", - enforce: true, - }; + config.optimization.splitChunks.cacheGroups.styles = { + name: "styles", + test: /\.(css|scss)$/, + chunks: "all", + enforce: true, + }; - config.module.rules.push({ - test: /\.svg$/, - use: ["@svgr/webpack"], - }); - return config; - }, + config.module.rules.push({ + test: /\.svg$/, + use: svgComponentLoaders, + }); + return config; + }, + } + : {}), }; export default withSentryConfig(