diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 092743e0..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "extends": ["next/core-web-vitals", "next/typescript"], - "plugins": ["import", "unused-imports"], - "rules": { - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": "warn", - "@typescript-eslint/no-explicit-any": "warn", - "import/extensions": ["off"], - "import/first": ["error"], - "import/no-duplicates": ["error"], - "import/no-extraneous-dependencies": ["off"], - "import/no-relative-packages": ["off"], - "import/no-self-import": ["error"], - "import/order": [ - "error", - { - "groups": ["builtin", "external", "internal", "parent", "sibling"], - "pathGroups": [ - { - "pattern": "@*/**", - "group": "external", - "position": "after" - } - ], - "pathGroupsExcludedImportTypes": [], - "alphabetize": { - "order": "asc", - "caseInsensitive": true - }, - "newlines-between": "never" - } - ], - "unused-imports/no-unused-imports": ["error"], - "react-hooks/exhaustive-deps": ["off"], - "@typescript-eslint/naming-convention": ["off"] - } -} diff --git a/app/admin/comments/page.tsx b/app/admin/comments/page.tsx index 01eb0640..de1e4a32 100644 --- a/app/admin/comments/page.tsx +++ b/app/admin/comments/page.tsx @@ -54,30 +54,30 @@ const AdminCommentsPage = () => { }, [status, router]); useEffect(() => { + const fetchComments = async () => { + try { + setLoading(true); + const response = await fetch('/api/admin/comments'); + const data = await response.json(); + + if (data.success) { + setIssuesWithComments(data.data); + } else { + setError(data.error || '댓글을 불러올 수 없습니다.'); + } + } catch (err) { + setError('댓글을 불러오는 중 오류가 발생했습니다.'); + console.error(err); + } finally { + setLoading(false); + } + }; + if (status === 'authenticated') { fetchComments(); } }, [status]); - const fetchComments = async () => { - try { - setLoading(true); - const response = await fetch('/api/admin/comments'); - const data = await response.json(); - - if (data.success) { - setIssuesWithComments(data.data); - } else { - setError(data.error || '댓글을 불러올 수 없습니다.'); - } - } catch (err) { - setError('댓글을 불러오는 중 오류가 발생했습니다.'); - console.error(err); - } finally { - setLoading(false); - } - }; - if (status === 'loading' || loading) { return (
diff --git a/app/admin/page.tsx b/app/admin/page.tsx index 4851b2f8..2bf1b1d1 100644 --- a/app/admin/page.tsx +++ b/app/admin/page.tsx @@ -1,7 +1,7 @@ 'use client'; import Link from 'next/link'; import { signIn, signOut, useSession } from 'next-auth/react'; -import { useEffect, useState } from 'react'; +import { useEffect, useSyncExternalStore } from 'react'; import { BiFolder , BiCommentDetail } from 'react-icons/bi'; import { FaChartBar } from 'react-icons/fa'; import { FaBuffer } from 'react-icons/fa6'; @@ -18,10 +18,9 @@ import DecryptedText from '../entities/bits/DecryptedText'; const AdminDashboard = () => { const { data: session } = useSession(); const toast = useToast(); - const [mounted, setMounted] = useState(false); + const mounted = useSyncExternalStore(() => () => {}, () => true, () => false); useEffect(() => { - setMounted(true); if (session) { toast.success('관리자 페이지에 오신 것을 환영합니다.'); } diff --git a/app/admin/posts/page.tsx b/app/admin/posts/page.tsx index e499c264..ea5e409e 100644 --- a/app/admin/posts/page.tsx +++ b/app/admin/posts/page.tsx @@ -23,24 +23,24 @@ const AdminPostListPage = () => { const ITEMS_PER_PAGE = 8; useEffect(() => { + const getPosts = async () => { + const response = await axios.get('/api/posts', { + params: { + compact: 'true', + page: currentPage, + limit: ITEMS_PER_PAGE, + private: 'true', + }, + }); + const data = await response.data; + setPosts(data.posts); + setTotalItems(data.pagination.totalPosts); + setLoading(false); + }; + getPosts(); }, [currentPage]); - const getPosts = async () => { - const response = await axios.get('/api/posts', { - params: { - compact: 'true', - page: currentPage, - limit: ITEMS_PER_PAGE, - private: 'true', - }, - }); - const data = await response.data; - setPosts(data.posts); - setTotalItems(data.pagination.totalPosts); - setLoading(false); - }; - const handleEdit = (slug: string) => { toast.success('글 수정 페이지로 이동합니다.'); router.push(`/admin/write?slug=${slug}`); diff --git a/app/admin/series/page.tsx b/app/admin/series/page.tsx index 669e743b..0a3b15d9 100644 --- a/app/admin/series/page.tsx +++ b/app/admin/series/page.tsx @@ -11,7 +11,7 @@ import useDataFetch, { import { Series } from '@/app/types/Series'; const AdminSeriesPage = () => { const [seriesList, setSeriesList] = useState(null); - const getSeriesListConfig: useDataFetchConfig = { + const getSeriesListConfig: useDataFetchConfig = { url: '/api/series', method: 'GET', config: { @@ -19,7 +19,7 @@ const AdminSeriesPage = () => { compact: 'true', }, }, - onSuccess: (data: Series[]) => { + onSuccess: (data) => { setSeriesList(data); }, }; diff --git a/app/admin/settings/page.tsx b/app/admin/settings/page.tsx index f797cef2..28959283 100644 --- a/app/admin/settings/page.tsx +++ b/app/admin/settings/page.tsx @@ -6,6 +6,8 @@ import { FiArrowLeft, FiRefreshCw } from 'react-icons/fi'; import { HiOutlineDocumentText } from 'react-icons/hi'; import useToast from '@/app/hooks/useToast'; +const SKELETON_WIDTHS = [72, 88, 65, 91, 78, 83, 69, 95]; + const SettingsPage = () => { const toast = useToast(); const [llmsContent, setLlmsContent] = useState(null); @@ -87,7 +89,7 @@ const SettingsPage = () => { {llmsFetching ? (
{[...Array(8)].map((_, i) => ( -
+
))}
) : llmsContent ? ( diff --git a/app/api/admin/comments/route.ts b/app/api/admin/comments/route.ts index c70b2d79..d1f2109c 100644 --- a/app/api/admin/comments/route.ts +++ b/app/api/admin/comments/route.ts @@ -71,6 +71,7 @@ export async function GET() { Accept: 'application/vnd.github+json', 'X-GitHub-Api-Version': '2022-11-28', }, + cache: 'no-store', } ); @@ -111,6 +112,7 @@ export async function GET() { Accept: 'application/vnd.github+json', 'X-GitHub-Api-Version': '2022-11-28', }, + cache: 'no-store', } ); diff --git a/app/api/atelier/messages/[id]/reaction/route.ts b/app/api/atelier/messages/[id]/reaction/route.ts index 0298f840..a7293c1b 100644 --- a/app/api/atelier/messages/[id]/reaction/route.ts +++ b/app/api/atelier/messages/[id]/reaction/route.ts @@ -5,13 +5,14 @@ import BlockedFingerprint from '@/app/models/BlockedFingerprint'; import { ATELIER_EMOJIS, ReactionBucket } from '@/app/types/Atelier'; interface RouteParams { - params: { id: string }; + params: Promise<{ id: string }>; } // 허용 이모지 화이트리스트 const allowedEmojiSet = new Set(ATELIER_EMOJIS); -export const POST = async (request: Request, { params }: RouteParams) => { +export const POST = async (request: Request, props: RouteParams) => { + const params = await props.params; try { await dbConnect(); diff --git a/app/api/atelier/messages/[id]/route.ts b/app/api/atelier/messages/[id]/route.ts index fe333a60..a1f427a5 100644 --- a/app/api/atelier/messages/[id]/route.ts +++ b/app/api/atelier/messages/[id]/route.ts @@ -8,10 +8,11 @@ import dbConnect from '@/app/lib/dbConnect'; import AtelierMessage from '@/app/models/AtelierMessage'; interface RouteParams { - params: { id: string }; + params: Promise<{ id: string }>; } -export const DELETE = async (request: Request, { params }: RouteParams) => { +export const DELETE = async (request: Request, props: RouteParams) => { + const params = await props.params; try { await dbConnect(); @@ -78,7 +79,8 @@ export const DELETE = async (request: Request, { params }: RouteParams) => { } }; -export const PATCH = async (request: Request, { params }: RouteParams) => { +export const PATCH = async (request: Request, props: RouteParams) => { + const params = await props.params; try { await dbConnect(); @@ -139,7 +141,8 @@ export const PATCH = async (request: Request, { params }: RouteParams) => { } }; -export const PUT = async (request: Request, { params }: RouteParams) => { +export const PUT = async (request: Request, props: RouteParams) => { + const params = await props.params; try { await dbConnect(); diff --git a/app/api/atelier/messages/[id]/thread/route.ts b/app/api/atelier/messages/[id]/thread/route.ts index 277b399e..ccf507d5 100644 --- a/app/api/atelier/messages/[id]/thread/route.ts +++ b/app/api/atelier/messages/[id]/thread/route.ts @@ -9,10 +9,11 @@ import dbConnect from '@/app/lib/dbConnect'; import AtelierMessage from '@/app/models/AtelierMessage'; interface RouteParams { - params: { id: string }; + params: Promise<{ id: string }>; } -export const GET = async (request: Request, { params }: RouteParams) => { +export const GET = async (request: Request, props: RouteParams) => { + const params = await props.params; try { await dbConnect(); diff --git a/app/api/opengraph/route.ts b/app/api/opengraph/route.ts index 22e7347b..ecd2b9a9 100644 --- a/app/api/opengraph/route.ts +++ b/app/api/opengraph/route.ts @@ -38,6 +38,7 @@ export const GET = async (request: Request) => { Accept: 'text/html,application/xhtml+xml', }, signal: AbortSignal.timeout(5000), + next: { revalidate: 3600 }, }); if (!res.ok) diff --git a/app/api/portfolio/[slug]/route.ts b/app/api/portfolio/[slug]/route.ts index 95e6f799..2a23142c 100644 --- a/app/api/portfolio/[slug]/route.ts +++ b/app/api/portfolio/[slug]/route.ts @@ -1,9 +1,7 @@ import { portfolioData } from '@/app/api/portfolio/data'; -export async function GET( - request: Request, - { params }: { params: { slug: string } } -) { +export async function GET(request: Request, props: { params: Promise<{ slug: string }> }) { + const params = await props.params; try { const slug = params.slug?.toLowerCase(); diff --git a/app/api/posts/[slug]/route.ts b/app/api/posts/[slug]/route.ts index 831fa6cc..63ad08f3 100644 --- a/app/api/posts/[slug]/route.ts +++ b/app/api/posts/[slug]/route.ts @@ -7,10 +7,8 @@ import { getThumbnailInMarkdown } from '@/app/lib/utils/parse'; import Post from '@/app/models/Post'; import Series from '@/app/models/Series'; -export async function GET( - req: NextRequest, - { params }: { params: { slug: string } } -) { +export async function GET(req: NextRequest, props: { params: Promise<{ slug: string }> }) { + const params = await props.params; try { await dbConnect(); const post = await Post.findOne({ slug: params.slug }).lean(); @@ -40,10 +38,8 @@ export async function GET( } } -export async function PUT( - req: NextRequest, - { params }: { params: { slug: string } } -) { +export async function PUT(req: NextRequest, props: { params: Promise<{ slug: string }> }) { + const params = await props.params; try { // 글 수정은 관리자 전용 const session = await getServerSession(); @@ -109,10 +105,8 @@ export async function PUT( } } -export async function DELETE( - request: Request, - { params }: { params: { slug: string } } -) { +export async function DELETE(request: Request, props: { params: Promise<{ slug: string }> }) { + const params = await props.params; try { // 글 삭제는 관리자 전용 const session = await getServerSession(); diff --git a/app/api/series/[slug]/route.ts b/app/api/series/[slug]/route.ts index 4a3c6e22..325b9639 100644 --- a/app/api/series/[slug]/route.ts +++ b/app/api/series/[slug]/route.ts @@ -5,10 +5,8 @@ import dbConnect from '@/app/lib/dbConnect'; import Series from '@/app/models/Series'; import '@/app/models/Post'; -export async function GET( - request: Request, - { params }: { params: { slug: string } } -) { +export async function GET(request: Request, props: { params: Promise<{ slug: string }> }) { + const params = await props.params; try { await dbConnect(); @@ -38,10 +36,8 @@ export async function GET( } } -export async function PUT( - request: Request, - { params }: { params: { slug: string } } -) { +export async function PUT(request: Request, props: { params: Promise<{ slug: string }> }) { + const params = await props.params; try { const session = await getServerSession(); @@ -81,10 +77,8 @@ export async function PUT( } } -export async function DELETE( - request: Request, - { params }: { params: { slug: string } } -) { +export async function DELETE(request: Request, props: { params: Promise<{ slug: string }> }) { + const params = await props.params; try { const session = await getServerSession(); diff --git a/app/api/subscribe/unsubscribe/route.ts b/app/api/subscribe/unsubscribe/route.ts index a2426035..579a1cba 100644 --- a/app/api/subscribe/unsubscribe/route.ts +++ b/app/api/subscribe/unsubscribe/route.ts @@ -1,4 +1,4 @@ -import { isRedirectError } from 'next/dist/client/components/redirect'; +import { isRedirectError } from 'next/dist/client/components/redirect-error'; import { redirect } from 'next/navigation'; import { NextRequest } from 'next/server'; import dbConnect from '@/app/lib/dbConnect'; diff --git a/app/api/subscribe/verify/route.ts b/app/api/subscribe/verify/route.ts index e6bfb6f3..4bf7b8e4 100644 --- a/app/api/subscribe/verify/route.ts +++ b/app/api/subscribe/verify/route.ts @@ -1,4 +1,4 @@ -import { isRedirectError } from 'next/dist/client/components/redirect'; +import { isRedirectError } from 'next/dist/client/components/redirect-error'; import { redirect } from 'next/navigation'; import { NextRequest } from 'next/server'; import dbConnect from '@/app/lib/dbConnect'; diff --git a/app/entities/atelier/FlowerOverlay.tsx b/app/entities/atelier/FlowerOverlay.tsx index 031e9309..7c3f2f30 100644 --- a/app/entities/atelier/FlowerOverlay.tsx +++ b/app/entities/atelier/FlowerOverlay.tsx @@ -1,22 +1,19 @@ 'use client'; -import { useMemo } from 'react'; -export default function FlowerOverlay({ children }: { children: React.ReactNode }) { - const particles = useMemo(() => { - const chars = ['🌸', '🌺', '✿', '❀']; - return Array.from({ length: 8 }, (_, i) => ({ - id: i, - char: chars[i % chars.length], - // 각 파티클별 랜덤 값 (마운트 시 1회 고정) - px: Math.random() * 60 - 30, // -30px ~ 30px - py: Math.random() * 30 - 40, // -40px ~ -10px (위로 떠오름) - pr: Math.random() * 360 - 180, // -180deg ~ 180deg - delay: Math.random() * 0.6, // 0 ~ 0.6s - duration: Math.random() * 0.6 + 0.8, // 0.8s ~ 1.4s - color: ['text-pink-300', 'text-pink-400', 'text-rose-400'][i % 3], - })); - }, []); +const chars = ['🌸', '🌺', '✿', '❀']; +const colors = ['text-pink-300', 'text-pink-400', 'text-rose-400']; +const particles = Array.from({ length: 8 }, (_, i) => ({ + id: i, + char: chars[i % chars.length], + px: Math.random() * 60 - 30, + py: Math.random() * 30 - 40, + pr: Math.random() * 360 - 180, + delay: Math.random() * 0.6, + duration: Math.random() * 0.6 + 0.8, + color: colors[i % 3], +})); +const FlowerOverlay = ({ children }: { children: React.ReactNode }) => { return (
{children} @@ -24,13 +21,15 @@ export default function FlowerOverlay({ children }: { children: React.ReactNode {particles.map((p) => (
{p.char} @@ -39,4 +38,5 @@ export default function FlowerOverlay({ children }: { children: React.ReactNode
); -} +}; +export default FlowerOverlay; diff --git a/app/entities/atelier/SparkleOverlay.tsx b/app/entities/atelier/SparkleOverlay.tsx index df6a30f8..c8585349 100644 --- a/app/entities/atelier/SparkleOverlay.tsx +++ b/app/entities/atelier/SparkleOverlay.tsx @@ -1,20 +1,18 @@ 'use client'; -import { useMemo } from 'react'; -export default function SparkleOverlay({ children }: { children: React.ReactNode }) { - const particles = useMemo(() => { - const chars = ['★', '✦', '✧', '·']; - return Array.from({ length: 8 }, (_, i) => ({ - id: i, - char: chars[i % chars.length], - sx: Math.random() * 60 - 30, - sy: Math.random() * 30 - 40, - sr: Math.random() * 360 - 180, - delay: Math.random() * 0.6, - duration: Math.random() * 0.6 + 0.8, - color: ['text-amber-300', 'text-amber-400', 'text-amber-500'][i % 3], - })); - }, []); +const chars = ['★', '✦', '✧', '·']; +const particles = Array.from({ length: 8 }, (_, i) => ({ + id: i, + char: chars[i % chars.length], + sx: Math.random() * 60 - 30, + sy: Math.random() * 30 - 40, + sr: Math.random() * 360 - 180, + delay: Math.random() * 0.6, + duration: Math.random() * 0.6 + 0.8, + color: ['text-amber-300', 'text-amber-400', 'text-amber-500'][i % 3], +})); + +const SparkleOverlay = ({ children }: { children: React.ReactNode }) => { return (
@@ -23,13 +21,15 @@ export default function SparkleOverlay({ children }: { children: React.ReactNode {particles.map((p) => (
{p.char} @@ -38,4 +38,6 @@ export default function SparkleOverlay({ children }: { children: React.ReactNode
); -} +}; + +export default SparkleOverlay; diff --git a/app/entities/atelier/ThreadPanel.tsx b/app/entities/atelier/ThreadPanel.tsx index 998dbb63..e86e51d5 100644 --- a/app/entities/atelier/ThreadPanel.tsx +++ b/app/entities/atelier/ThreadPanel.tsx @@ -53,7 +53,7 @@ const ThreadPanel = ({ } }; fetchThread(); - }, [parentId]); // eslint-disable-line react-hooks/exhaustive-deps + }, [parentId]); const handleSend = async (content: string) => { if (author.needsNickname) { diff --git a/app/entities/bits/DecryptedText.tsx b/app/entities/bits/DecryptedText.tsx index 0b49ee90..59173b9b 100644 --- a/app/entities/bits/DecryptedText.tsx +++ b/app/entities/bits/DecryptedText.tsx @@ -37,8 +37,20 @@ const DecryptedText = ({ new Set() ); const [hasAnimated, setHasAnimated] = useState(false); + const [prevIsHovering, setPrevIsHovering] = useState(isHovering); const containerRef = useRef(null); + if (isHovering !== prevIsHovering) { + setPrevIsHovering(isHovering); + if (isHovering) { + setIsScrambling(true); + setRevealedIndices(new Set()); + } + } + + const currentDisplayText = isHovering ? displayText : text; + const isCurrentlyScrambling = isHovering && isScrambling; + useEffect(() => { let interval: NodeJS.Timeout; let currentIteration = 0; @@ -124,7 +136,6 @@ const DecryptedText = ({ }; if (isHovering) { - setIsScrambling(true); interval = setInterval(() => { setRevealedIndices((prevRevealed) => { if (sequential) { @@ -151,10 +162,6 @@ const DecryptedText = ({ } }); }, speed); - } else { - setDisplayText(text); - setRevealedIndices(new Set()); - setIsScrambling(false); } return () => { @@ -218,12 +225,12 @@ const DecryptedText = ({ {...hoverProps} {...props} > - {displayText} + {currentDisplayText}
diff --git a/app/entities/post/list/SearchSection.tsx b/app/entities/post/list/SearchSection.tsx index 26329a57..6b762271 100644 --- a/app/entities/post/list/SearchSection.tsx +++ b/app/entities/post/list/SearchSection.tsx @@ -30,12 +30,12 @@ const SearchSection = ({ const latest = useSearchQueryStore((state) => state.latestSearchQueries); const [series, setSeries] = useState([]); - const getSeries = async () => { - const data = await getAllSeriesData(); - setSeries(data); - }; - useEffect(() => { + const getSeries = async () => { + const data = await getAllSeriesData(); + setSeries(data); + }; + getSeries(); }, []); diff --git a/app/entities/series/detail/SeriesDetailHeader.tsx b/app/entities/series/detail/SeriesDetailHeader.tsx index 6be32df0..3d071004 100644 --- a/app/entities/series/detail/SeriesDetailHeader.tsx +++ b/app/entities/series/detail/SeriesDetailHeader.tsx @@ -1,8 +1,8 @@ import Image from 'next/image'; -import { Series } from '@/app/types/Series'; +import { SeriesDetail } from '@/app/types/Series'; interface SeriesDetailHeaderProps { - series: Series; + series: SeriesDetail; } const SeriesDetailHeader = ({ series }: SeriesDetailHeaderProps) => { return ( diff --git a/app/entities/series/detail/SeriesDetailPostList.tsx b/app/entities/series/detail/SeriesDetailPostList.tsx index 871e96e0..36e1f9a3 100644 --- a/app/entities/series/detail/SeriesDetailPostList.tsx +++ b/app/entities/series/detail/SeriesDetailPostList.tsx @@ -3,10 +3,10 @@ import { FaChevronDown } from 'react-icons/fa'; import Select from '@/app/entities/common/Select'; import SeriesPostListItem from '@/app/entities/post/list/SeriesInnerPostListItem'; import { Post } from '@/app/types/Post'; -import { Series } from '@/app/types/Series'; +import { SeriesDetail } from '@/app/types/Series'; interface SeriesDetailPostListProps { - series: Series; + series: SeriesDetail; orderOption: 'latest' | 'oldest' | string; setOrderOption: (value: 'latest' | 'oldest' | string) => void; posts: Post[]; diff --git a/app/entities/series/list/SeriesList.tsx b/app/entities/series/list/SeriesList.tsx index 1941eab7..7631dc25 100644 --- a/app/entities/series/list/SeriesList.tsx +++ b/app/entities/series/list/SeriesList.tsx @@ -13,13 +13,13 @@ const SeriesList = () => { const [loading, setLoading] = useState(true); const cols = useGridColumns(); - const getSeries = async () => { - const data = await getAllSeriesData(); - setSeries(data); - setLoading(false); - }; - useEffect(() => { + const getSeries = async () => { + const data = await getAllSeriesData(); + setSeries(data); + setLoading(false); + }; + getSeries(); }, []); diff --git a/app/entities/tag/TagCloud.tsx b/app/entities/tag/TagCloud.tsx index 92fcd56a..19e3f40e 100644 --- a/app/entities/tag/TagCloud.tsx +++ b/app/entities/tag/TagCloud.tsx @@ -2,7 +2,7 @@ import { motion } from 'motion/react'; import Link from 'next/link'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'; import { TagData, TagWithPosition } from '@/app/types/Tag'; interface TagCloudProps { @@ -21,44 +21,36 @@ const RADIUS = 200; const PARTICLE_COUNT = 80; const GOLDEN_RATIO = (1 + Math.sqrt(5)) / 2; +const particles: Particle[] = Array.from({ length: PARTICLE_COUNT }, (_, i) => { + const phi = Math.acos(1 - (2 * (i + 0.5)) / PARTICLE_COUNT); + const theta = 2 * Math.PI * i * GOLDEN_RATIO; + const r = RADIUS * (0.8 + Math.random() * 0.4); + return { + id: i, + x: r * Math.sin(phi) * Math.cos(theta), + y: r * Math.sin(phi) * Math.sin(theta), + z: r * Math.cos(phi), + size: 2 + Math.random() * 2, + }; +}); + const TagCloud = ({ tags }: TagCloudProps) => { const [hoveredTag, setHoveredTag] = useState(null); const [mousePos, setMousePos] = useState({ x: 0, y: 0 }); - const [isMobile, setIsMobile] = useState(false); + const isMobile = useSyncExternalStore( + (cb) => { window.addEventListener('resize', cb); return () => window.removeEventListener('resize', cb); }, + () => window.innerWidth < 768, + () => false, + ); const mousePosRef = useRef({ x: 0, y: 0 }); const rafRef = useRef(undefined); - useEffect(() => { - setIsMobile(window.innerWidth < 768); - - const onResize = () => setIsMobile(window.innerWidth < 768); - window.addEventListener('resize', onResize); - return () => window.removeEventListener('resize', onResize); - }, []); - useEffect(() => { return () => { if (rafRef.current !== undefined) cancelAnimationFrame(rafRef.current); }; }, []); - // 입자 생성 — RADIUS, PARTICLE_COUNT가 상수이므로 의존성 없음 - const particles = useMemo(() => { - return Array.from({ length: PARTICLE_COUNT }, (_, i) => { - const phi = Math.acos(1 - (2 * (i + 0.5)) / PARTICLE_COUNT); - const theta = 2 * Math.PI * i * GOLDEN_RATIO; - const r = RADIUS * (0.8 + Math.random() * 0.4); - - return { - id: i, - x: r * Math.sin(phi) * Math.cos(theta), - y: r * Math.sin(phi) * Math.sin(theta), - z: r * Math.cos(phi), - size: 2 + Math.random() * 2, - }; - }); - }, []); - // 마우스 위치 추적 — RAF로 throttle해 리렌더 횟수 제한 const handleMouseMove = useCallback( (e: React.MouseEvent) => { diff --git a/app/hooks/atelier/useAtelierMessages.ts b/app/hooks/atelier/useAtelierMessages.ts index ce1916e0..fa830f32 100644 --- a/app/hooks/atelier/useAtelierMessages.ts +++ b/app/hooks/atelier/useAtelierMessages.ts @@ -30,7 +30,6 @@ interface UseAtelierMessagesReturn { lastAppendedId: string | null; } -// 메시지 맵 → ASC 정렬 배열 const toSortedArray = (map: Map): AtelierMessage[] => { return Array.from(map.values()).sort((a, b) => { const aTime = new Date(a.createdAt).getTime(); @@ -39,6 +38,17 @@ const toSortedArray = (map: Map): AtelierMessage[] => { }); }; +const computeOldestCursor = (map: Map): string | null => { + let oldest: string | null = null; + map.forEach((msg) => { + if ((msg as OptimisticAtelierMessage).tempId) return; + if (!oldest || new Date(msg.createdAt) < new Date(oldest)) { + oldest = msg.createdAt; + } + }); + return oldest; +}; + const useAtelierMessages = ( options: UseAtelierMessagesOptions = {} ): UseAtelierMessagesReturn => { @@ -60,39 +70,53 @@ const useAtelierMessages = ( const isLoadingOlderRef = useRef(false); const hasMoreRef = useRef(false); - // 현재 가장 오래된 실제 메시지의 createdAt 을 계산 - const computeOldestCursor = ( - map: Map - ): string | null => { - let oldest: string | null = null; - map.forEach((msg) => { - // optimistic 메시지는 _id 가 tempId 와 같으므로 제외 - if ((msg as OptimisticAtelierMessage).tempId) return; - if (!oldest || new Date(msg.createdAt) < new Date(oldest)) { - oldest = msg.createdAt; - } - }); - return oldest; - }; + // ref 동기화 + useEffect(() => { + isLoadingOlderRef.current = isLoadingOlder; + }, [isLoadingOlder]); - // 초기 로드 / 새로고침 - const fetchInitial = useCallback(async () => { + useEffect(() => { + hasMoreRef.current = hasMore; + }, [hasMore]); + + // 초기 로드 — setState는 .then/.catch/.finally 콜백 안에서만 호출 + useEffect(() => { + let cancelled = false; + axios + .get('/api/atelier/messages', { params: { limit } }) + .then(({ data }) => { + if (cancelled) return; + setError(null); + const next = new Map(); + for (const m of data.messages) next.set(m._id, m); + setMessageMap(next); + const sorted = toSortedArray(next); + setLastAppendedId(sorted.length > 0 ? sorted[sorted.length - 1]._id : null); + setHasMore(data.hasMore); + oldestCursorRef.current = computeOldestCursor(next); + }) + .catch((e) => { + if (cancelled) return; + setError(e instanceof Error ? e : new Error('메시지를 불러오지 못했어요')); + }) + .finally(() => { + if (!cancelled) setIsInitialLoading(false); + }); + return () => { cancelled = true; }; + }, [limit]); + + // 새로고침 — 사용자 액션에서 호출되므로 동기 setState 허용 + const refresh = useCallback(async () => { setIsInitialLoading(true); setError(null); try { - const { data } = await axios.get( - '/api/atelier/messages', - { params: { limit } } - ); + const { data } = await axios.get('/api/atelier/messages', { params: { limit } }); + setError(null); const next = new Map(); for (const m of data.messages) next.set(m._id, m); setMessageMap(next); const sorted = toSortedArray(next); - if (sorted.length > 0) { - setLastAppendedId(sorted[sorted.length - 1]._id); - } else { - setLastAppendedId(null); - } + setLastAppendedId(sorted.length > 0 ? sorted[sorted.length - 1]._id : null); setHasMore(data.hasMore); oldestCursorRef.current = computeOldestCursor(next); } catch (e) { @@ -102,19 +126,6 @@ const useAtelierMessages = ( } }, [limit]); - // ref 동기화 - useEffect(() => { - isLoadingOlderRef.current = isLoadingOlder; - }, [isLoadingOlder]); - - useEffect(() => { - hasMoreRef.current = hasMore; - }, [hasMore]); - - useEffect(() => { - fetchInitial(); - }, [fetchInitial]); - // 10초 폴링 — 최신 메시지를 가져와 기존 맵에 병합 useEffect(() => { if (isInitialLoading) return; @@ -273,7 +284,7 @@ const useAtelierMessages = ( removeMessage, getSnapshot, restoreMessage, - refresh: fetchInitial, + refresh, lastAppendedId, }; }; diff --git a/app/hooks/common/useBlockNavigate.ts b/app/hooks/common/useBlockNavigate.ts index d71da05a..8a264108 100644 --- a/app/hooks/common/useBlockNavigate.ts +++ b/app/hooks/common/useBlockNavigate.ts @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useEffect } from 'react'; interface PostForm { title: string; @@ -6,13 +6,7 @@ interface PostForm { } export const useBlockNavigate = (formData: PostForm, alertMessage?: string) => { - const [isDirty, setIsDirty] = useState(false); - - useEffect(() => { - if (formData.title || formData.content) { - setIsDirty(true); - } - }, [formData]); + const isDirty = !!(formData.title || formData.content); useEffect(() => { const handleBeforeUnload = (e: BeforeUnloadEvent) => { diff --git a/app/hooks/common/useDataFetch.ts b/app/hooks/common/useDataFetch.ts index be2776d3..ce7824bb 100644 --- a/app/hooks/common/useDataFetch.ts +++ b/app/hooks/common/useDataFetch.ts @@ -1,18 +1,24 @@ import axios, { AxiosError, AxiosRequestConfig, Method } from 'axios'; -import { useCallback, useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; -export interface useDataFetchConfig { +export interface useDataFetchConfig { url: string; method: Method; - body?: Record; + body?: Record; config?: AxiosRequestConfig; onSuccess?: (data: T) => void; - onError?: (error: any) => void; + onError?: (error: unknown) => void; onLoading?: () => void; onBeforeFetch?: () => void; - dependencies?: any[]; + dependencies?: unknown[]; } +type FetchResult = { + key: string; + data: T | null; + error: AxiosError | Error | null; +}; + const useDataFetch = ({ url, method, @@ -24,9 +30,7 @@ const useDataFetch = ({ onBeforeFetch, dependencies = [], }: useDataFetchConfig) => { - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - const [data, setData] = useState(); + const [result, setResult] = useState>({ key: '', data: null, error: null }); const axiosConfig: AxiosRequestConfig = { method, @@ -35,44 +39,39 @@ const useDataFetch = ({ ...config, }; - const fetchData = useCallback(async () => { - try { - setLoading(true); - setError(null); - if (onBeforeFetch) { - onBeforeFetch(); - } + const depsKey = JSON.stringify(dependencies); + const currentKey = url + depsKey; + const loading = result.key !== currentKey; - const response = await axios(axiosConfig); - const data = response.data; + useEffect(() => { + let ignore = false; + onBeforeFetch?.(); - setData(data); - setLoading(false); - if (onSuccess) { - onSuccess(data); - } - if (onLoading) { - onLoading(); - } - } catch (e) { - if (axios.isAxiosError(e)) { - console.error('데이터를 Fetch 하는데에 실패했습니다.', e); - setError(e); - setLoading(false); - if (onError) { - onError(e); + axios(axiosConfig) + .then((response) => { + if (ignore) return; + const data = response.data as T; + setResult({ key: currentKey, data, error: null }); + onSuccess?.(data); + onLoading?.(); + }) + .catch((e) => { + if (ignore) return; + if (axios.isAxiosError(e)) { + console.error('데이터를 Fetch 하는데에 실패했습니다.', e); + setResult({ key: currentKey, data: null, error: e }); + onError?.(e); + } else { + console.error('Unknown Error:', e); } - } else { - console.error('Unknown Error:', e); - } - } - }, [url, ...dependencies]); + }); - useEffect(() => { - fetchData(); - }, [fetchData]); + return () => { + ignore = true; + }; + }, [url, depsKey]); - return { data, loading, error }; + return { data: result.data, loading, error: loading ? null : result.error }; }; export default useDataFetch; diff --git a/app/hooks/post/useCloudDraft.ts b/app/hooks/post/useCloudDraft.ts index 2de44621..b747de20 100644 --- a/app/hooks/post/useCloudDraft.ts +++ b/app/hooks/post/useCloudDraft.ts @@ -1,24 +1,15 @@ import axios from 'axios'; -import { useEffect, useRef, useState } from 'react'; +import { useRef, useState } from 'react'; import { v4 as uuidv4 } from 'uuid'; import { CloudDraft } from '@/app/types/Draft'; const useCloudDraft = () => { const [cloudDrafts, setCloudDrafts] = useState([]); const [loading, setLoading] = useState(false); - const [autoSyncEnabled, setAutoSyncEnabled] = useState(false); - const draftIdRef = useRef(null); - - useEffect(() => { - if (!draftIdRef.current) { - draftIdRef.current = uuidv4(); - } - }, []); - - useEffect(() => { - const savedSetting = localStorage.getItem('cloudDraftAutoSync'); - setAutoSyncEnabled(savedSetting === 'true'); - }, []); + const [autoSyncEnabled, setAutoSyncEnabled] = useState( + () => typeof window !== 'undefined' && localStorage.getItem('cloudDraftAutoSync') === 'true' + ); + const draftIdRef = useRef(uuidv4()); const fetchCloudDrafts = async () => { try { diff --git a/app/hooks/post/usePost.ts b/app/hooks/post/usePost.ts index 07fccc50..8478a2fc 100644 --- a/app/hooks/post/usePost.ts +++ b/app/hooks/post/usePost.ts @@ -66,30 +66,48 @@ const usePost = (slug = '') => { }; useEffect(() => { + // 시리즈 + const getSeries = async () => { + try { + const data = await getAllSeriesData(); + setSeriesList(data); + // 편집 모드(slug 존재)에서는 getPostDetail이 seriesId를 설정하므로 덮어쓰지 않음 + if (!slug) { + setFormData((prev) => ({ ...prev, seriesId: data[0]._id })); + } + setUIState((prev) => ({ ...prev, seriesLoading: false })); + } catch (e) { + console.error('시리즈 조회 중 오류 발생', e); + } + }; + getSeries(); }, []); useEffect(() => { if (slug) { + const getPostDetail = async () => { + try { + const response = await axios.get(`/api/posts/${slug}`); + const data = await response.data; + setFormData({ + title: data.post.title || '', + subTitle: data.post.subTitle, + content: data.post.content, + seriesId: data.post.seriesId || '', + tags: data.post.tags || [], + isPrivate: data.post.isPrivate || false, + sendToSubscribers: false, + }); + } catch (e) { + console.error('글 조회 중 오류 발생', e); + } + }; + getPostDetail(); } }, [slug]); - // 시리즈 - const getSeries = async () => { - try { - const data = await getAllSeriesData(); - setSeriesList(data); - // 편집 모드(slug 존재)에서는 getPostDetail이 seriesId를 설정하므로 덮어쓰지 않음 - if (!slug) { - setFormData((prev) => ({ ...prev, seriesId: data[0]._id })); - } - setUIState((prev) => ({ ...prev, seriesLoading: false })); - } catch (e) { - console.error('시리즈 조회 중 오류 발생', e); - } - }; - // Method const postBlog = async (post: PostBody) => { try { @@ -176,24 +194,6 @@ const usePost = (slug = '') => { } }; - const getPostDetail = async () => { - try { - const response = await axios.get(`/api/posts/${slug}`); - const data = await response.data; - setFormData({ - title: data.post.title || '', - subTitle: data.post.subTitle, - content: data.post.content, - seriesId: data.post.seriesId || '', - tags: data.post.tags || [], - isPrivate: data.post.isPrivate || false, - sendToSubscribers: false, - }); - } catch (e) { - console.error('글 조회 중 오류 발생', e); - } - }; - const handleLinkCopy = (image: string) => { navigator.clipboard.writeText(image); toast.success('이미지 링크가 복사되었습니다.'); diff --git a/app/hooks/post/useTagAutocomplete.ts b/app/hooks/post/useTagAutocomplete.ts index 6316a888..cb669dcf 100644 --- a/app/hooks/post/useTagAutocomplete.ts +++ b/app/hooks/post/useTagAutocomplete.ts @@ -21,6 +21,7 @@ const useTagAutocomplete = ({ const [allTags, setAllTags] = useState([]); const [isOpen, setIsOpen] = useState(false); const [highlightedIndex, setHighlightedIndex] = useState(-1); + const [prevSuggestions, setPrevSuggestions] = useState([]); useEffect(() => { fetch('/api/tags') @@ -43,10 +44,11 @@ const useTagAutocomplete = ({ .slice(0, 8); }, [allTags, tagInput, currentTags]); - useEffect(() => { + if (suggestions !== prevSuggestions) { + setPrevSuggestions(suggestions); setIsOpen(suggestions.length > 0); setHighlightedIndex(-1); - }, [suggestions]); + } return { suggestions, diff --git a/app/lib/dbConnect.ts b/app/lib/dbConnect.ts index 4e108c85..e51893d3 100644 --- a/app/lib/dbConnect.ts +++ b/app/lib/dbConnect.ts @@ -1,7 +1,7 @@ import mongoose, { Mongoose } from 'mongoose'; declare global { - // eslint-disable-next-line no-var + var mongoose: { conn: Mongoose | null; promise: Promise | null; diff --git a/app/portfolio/[slug]/page.tsx b/app/portfolio/[slug]/page.tsx index 336870ca..3fd3b548 100644 --- a/app/portfolio/[slug]/page.tsx +++ b/app/portfolio/[slug]/page.tsx @@ -3,17 +3,16 @@ import { portfolioData } from '@/app/api/portfolio/data'; import PortfolioDetailClient from './PortfolioDetailClient'; interface PortfolioDetailPageProps { - params: { + params: Promise<{ slug: string; - }; + }>; } const baseUrl = process.env.NEXT_PUBLIC_DEPLOYMENT_URL || 'https://shipfriend.dev'; -export async function generateMetadata({ - params, -}: PortfolioDetailPageProps): Promise { +export async function generateMetadata(props: PortfolioDetailPageProps): Promise { + const params = await props.params; const portfolio = portfolioData[params.slug as keyof typeof portfolioData]; if (!portfolio) { @@ -50,7 +49,8 @@ export async function generateMetadata({ }; } -const PortfolioDetailPage = ({ params }: PortfolioDetailPageProps) => { +const PortfolioDetailPage = async (props: PortfolioDetailPageProps) => { + const params = await props.params; return ; }; diff --git a/app/posts/[slug]/llms.txt/route.ts b/app/posts/[slug]/llms.txt/route.ts index df4c82e4..1e5e7c9a 100644 --- a/app/posts/[slug]/llms.txt/route.ts +++ b/app/posts/[slug]/llms.txt/route.ts @@ -3,10 +3,8 @@ import Post from '@/app/models/Post'; export const revalidate = 300; -export async function GET( - _req: Request, - { params }: { params: { slug: string } } -) { +export async function GET(_req: Request, props: { params: Promise<{ slug: string }> }) { + const params = await props.params; await dbConnect(); const post = await Post.findOne({ diff --git a/app/posts/[slug]/page.tsx b/app/posts/[slug]/page.tsx index bf5254e4..74c4c242 100644 --- a/app/posts/[slug]/page.tsx +++ b/app/posts/[slug]/page.tsx @@ -39,11 +39,12 @@ async function getPostDetail(slug: string) { return { post: JSON.parse(JSON.stringify(post)) }; } -export const generateMetadata = async ({ - params, -}: { - params: { slug: string }; -}): Promise => { +export const generateMetadata = async ( + props: { + params: Promise<{ slug: string }>; + } +): Promise => { + const params = await props.params; const { post } = await getPostDetail(params.slug); const baseUrl = process.env.NEXT_PUBLIC_DEPLOYMENT_URL || 'https://shipfriend.dev'; @@ -83,7 +84,8 @@ export const generateMetadata = async ({ }; }; -const BlogDetailPage = async ({ params }: { params: { slug: string } }) => { +const BlogDetailPage = async (props: { params: Promise<{ slug: string }> }) => { + const params = await props.params; const { post } = await getPostDetail(params.slug); return ( <> diff --git a/app/posts/page.tsx b/app/posts/page.tsx index d44a6d81..c2366c6c 100644 --- a/app/posts/page.tsx +++ b/app/posts/page.tsx @@ -30,7 +30,7 @@ const BlogList = () => { const [totalPosts, setTotalPosts] = useState(0); const ITEMS_PER_PAGE = 12; - const config = useMemo((): useDataFetchConfig => { + const config = useMemo((): useDataFetchConfig<{ posts: Post[]; pagination: PaginationData }> => { return { url: `/api/posts`, method: 'GET' as const, diff --git a/app/series/[slug]/SeriesDetailClient.tsx b/app/series/[slug]/SeriesDetailClient.tsx index 4a713f33..c4494373 100644 --- a/app/series/[slug]/SeriesDetailClient.tsx +++ b/app/series/[slug]/SeriesDetailClient.tsx @@ -9,6 +9,7 @@ import SeriesDetailPostList from '@/app/entities/series/detail/SeriesDetailPostL import useDataFetch, { useDataFetchConfig, } from '@/app/hooks/common/useDataFetch'; +import { SeriesDetail } from '@/app/types/Series'; interface SeriesDetailClientProps { slug: string; @@ -19,12 +20,12 @@ const SeriesDetailClient = ({ slug }: SeriesDetailClientProps) => { 'latest' ); - const getSeriesDetailConfig: useDataFetchConfig = { + const getSeriesDetailConfig: useDataFetchConfig = { url: `/api/series/${slug}`, method: 'GET', }; - const { data: series, loading, error } = useDataFetch(getSeriesDetailConfig); + const { data: series, loading, error } = useDataFetch(getSeriesDetailConfig); const posts = loading || !series?.posts ? [] diff --git a/app/series/[slug]/layout.tsx b/app/series/[slug]/layout.tsx index dd49dadd..ff186061 100644 --- a/app/series/[slug]/layout.tsx +++ b/app/series/[slug]/layout.tsx @@ -5,14 +5,15 @@ import { Series } from '@/app/types/Series'; interface LayoutProps { children: React.ReactNode; - params: { slug: string }; + params: Promise<{ slug: string }>; } -export async function generateMetadata({ - params, -}: { - params: { slug: string }; -}): Promise { +export async function generateMetadata( + props: { + params: Promise<{ slug: string }>; + } +): Promise { + const params = await props.params; const baseUrl = process.env.NEXT_PUBLIC_DEPLOYMENT_URL || 'https://shipfriend.dev'; diff --git a/app/series/[slug]/page.tsx b/app/series/[slug]/page.tsx index cdc38976..5b8a0fd3 100644 --- a/app/series/[slug]/page.tsx +++ b/app/series/[slug]/page.tsx @@ -4,16 +4,17 @@ import Series from '@/app/models/Series'; import SeriesDetailClient from './SeriesDetailClient'; interface SeriesDetailPageProps { - params: { + params: Promise<{ slug: string; - }; + }>; } function isObjectId(str: string): boolean { return /^[a-f\d]{24}$/i.test(str); } -const SeriesDetailPage = async ({ params }: SeriesDetailPageProps) => { +const SeriesDetailPage = async (props: SeriesDetailPageProps) => { + const params = await props.params; if (isObjectId(params.slug)) { await dbConnect(); const series = await Series.findById(params.slug, { slug: 1 }).lean() as { slug: string } | null; diff --git a/app/subscribe/error/page.tsx b/app/subscribe/error/page.tsx index 3ccb9ebb..5cf5bbd7 100644 --- a/app/subscribe/error/page.tsx +++ b/app/subscribe/error/page.tsx @@ -14,11 +14,12 @@ const errorMessages: Record = { server_error: '서버 오류가 발생했습니다. 잠시 후 다시 시도해주세요.', }; -export default function ErrorPage({ - searchParams, -}: { - searchParams: { message?: string }; -}) { +export default async function ErrorPage( + props: { + searchParams: Promise<{ message?: string }>; + } +) { + const searchParams = await props.searchParams; const errorMessage = errorMessages[searchParams.message || ''] || '알 수 없는 오류가 발생했습니다.'; diff --git a/app/subscribe/unsubscribed/page.tsx b/app/subscribe/unsubscribed/page.tsx index 7ffcf9a4..3d57f1a6 100644 --- a/app/subscribe/unsubscribed/page.tsx +++ b/app/subscribe/unsubscribed/page.tsx @@ -5,11 +5,12 @@ export const metadata: Metadata = { robots: { index: false, follow: false }, }; -export default function UnsubscribedPage({ - searchParams, -}: { - searchParams: { message?: string }; -}) { +export default async function UnsubscribedPage( + props: { + searchParams: Promise<{ message?: string }>; + } +) { + const searchParams = await props.searchParams; const isAlreadyUnsubscribed = searchParams.message === 'already_unsubscribed'; return ( diff --git a/app/subscribe/verified/page.tsx b/app/subscribe/verified/page.tsx index dd37f2b7..af17a1b7 100644 --- a/app/subscribe/verified/page.tsx +++ b/app/subscribe/verified/page.tsx @@ -5,11 +5,12 @@ export const metadata: Metadata = { robots: { index: false, follow: false }, }; -export default function VerifiedPage({ - searchParams, -}: { - searchParams: { message?: string }; -}) { +export default async function VerifiedPage( + props: { + searchParams: Promise<{ message?: string }>; + } +) { + const searchParams = await props.searchParams; const isAlreadyVerified = searchParams.message === 'already_verified'; return ( diff --git a/app/types/Series.d.ts b/app/types/Series.d.ts index afbed495..c6dcc82e 100644 --- a/app/types/Series.d.ts +++ b/app/types/Series.d.ts @@ -11,3 +11,5 @@ export interface Series { createdAt: string; updatedAt: string; } + +export type SeriesDetail = Omit & { posts: Post[] }; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..0cc1a48d --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,54 @@ +import coreWebVitals from "eslint-config-next/core-web-vitals"; +import nextTypescript from "eslint-config-next/typescript"; +import importPlugin from "eslint-plugin-import"; +import unusedImports from "eslint-plugin-unused-imports"; + +/** @type {import("eslint").Linter.Config[]} */ +const config = [ + // Next.js recommended rules (core-web-vitals + typescript) + ...coreWebVitals, + ...nextTypescript, + + // Custom rules on top + { + plugins: { + import: importPlugin, + "unused-imports": unusedImports, + }, + rules: { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": "warn", + "@typescript-eslint/no-explicit-any": "warn", + "import/extensions": ["off"], + "import/first": ["error"], + "import/no-duplicates": ["error"], + "import/no-extraneous-dependencies": ["off"], + "import/no-relative-packages": ["off"], + "import/no-self-import": ["error"], + "import/order": [ + "error", + { + groups: ["builtin", "external", "internal", "parent", "sibling"], + pathGroups: [ + { + pattern: "@*/**", + group: "external", + position: "after", + }, + ], + pathGroupsExcludedImportTypes: [], + alphabetize: { + order: "asc", + caseInsensitive: true, + }, + "newlines-between": "never", + }, + ], + "unused-imports/no-unused-imports": ["error"], + "react-hooks/exhaustive-deps": ["off"], + "@typescript-eslint/naming-convention": ["off"], + }, + }, +]; + +export default config; diff --git a/next.config.js b/next.config.mjs similarity index 86% rename from next.config.js rename to next.config.mjs index f4cf6594..b772206e 100644 --- a/next.config.js +++ b/next.config.mjs @@ -1,5 +1,11 @@ /** @type {import('next').NextConfig} */ -const withBundleAnalyzer = require('@next/bundle-analyzer')({ +import { dirname } from 'path'; +import { fileURLToPath } from 'url'; +import bundleAnalyzer from '@next/bundle-analyzer'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +const withBundleAnalyzer = bundleAnalyzer({ enabled: process.env.ANALYZE === 'true', }); @@ -36,7 +42,11 @@ const securityHeaders = [ ]; const nextConfig = { + turbopack: { + root: __dirname, + }, images: { + qualities: [30, 75], remotePatterns: [ { protocol: 'https', @@ -48,7 +58,7 @@ const nextConfig = { hostname: '*', }, ], - }, // 빌드 시 RSS 피드를 생성하는 스크립트 실행 + }, async headers() { return [ { @@ -79,4 +89,4 @@ const nextConfig = { reactStrictMode: false, }; -module.exports = withBundleAnalyzer(nextConfig); +export default withBundleAnalyzer(nextConfig); diff --git a/package.json b/package.json index 690eccc8..a8918019 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,13 @@ { "name": "blog", - "version": "0.1.0", + "version": "1.2.0", "private": true, "scripts": { "dev": "next dev --turbo", "build": "node scripts/generate-llms.mjs && next build", + "analyze": "ANALYZE=true node scripts/generate-llms.mjs && ANALYZE=true next build --webpack", "start": "next start", - "lint": "next lint", + "lint": "eslint .", "type-check": "tsc --noEmit", "test": "jest", "prepare": "husky" @@ -14,7 +15,7 @@ "dependencies": { "@fingerprintjs/fingerprintjs": "^4.6.2", "@giscus/react": "^3.1.0", - "@next/third-parties": "^15.3.1", + "@next/third-parties": "^16.2.6", "@types/lodash": "^4.17.16", "@types/three": "^0.183.1", "@uiw/react-markdown-preview": "^5.2.0", @@ -25,11 +26,11 @@ "lodash": "^4.17.21", "mongoose": "^8.13.2", "motion": "^12.23.24", - "next": "14.2.35", + "next": "16.2.6", "next-auth": "^4.24.11", "prettier": "^3.5.3", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "react": "^19.2.6", + "react-dom": "^19.2.6", "react-icons": "^5.5.0", "react-lottie-player": "^2.1.0", "recharts": "^3.8.0", @@ -40,21 +41,26 @@ "zustand": "^5.0.3" }, "lint-staged": { - "*.{ts,tsx}": "pnpm exec next lint --fix --file" + "*.{ts,tsx}": "pnpm exec eslint --fix" + }, + "pnpm": { + "overrides": { + "csstype": "3.1.3" + } }, "devDependencies": { - "@next/bundle-analyzer": "^15.3.4", + "@next/bundle-analyzer": "^16.2.6", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@types/hast": "^3.0.4", "@types/jest": "^29.5.14", "@types/node": "^20.17.30", - "@types/react": "^18.3.20", - "@types/react-dom": "^18.3.6", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", "@types/react-lottie": "^1.2.10", - "eslint": "^8.57.1", - "eslint-config-next": "14.2.13", + "eslint": "^9.39.4", + "eslint-config-next": "16.2.6", "eslint-plugin-import": "^2.32.0", "eslint-plugin-unused-imports": "^4.3.0", "husky": "^9.1.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6fdb5e2d..e3303021 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + csstype: 3.1.3 + importers: .: @@ -13,10 +16,10 @@ importers: version: 4.6.2 '@giscus/react': specifier: ^3.1.0 - version: 3.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.1.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@next/third-parties': - specifier: ^15.3.1 - version: 15.3.1(next@14.2.35(@babel/core@7.26.10)(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.26.10)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) '@types/lodash': specifier: ^4.17.16 version: 4.17.16 @@ -25,10 +28,10 @@ importers: version: 0.183.1 '@uiw/react-markdown-preview': specifier: ^5.2.0 - version: 5.2.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.2.0(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@uiw/react-md-editor': specifier: ^4.0.5 - version: 4.0.5(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.0.5(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@vercel/blob': specifier: ^0.27.3 version: 0.27.3 @@ -46,31 +49,31 @@ importers: version: 8.13.2 motion: specifier: ^12.23.24 - version: 12.23.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 12.23.24(react-dom@19.2.6(react@19.2.6))(react@19.2.6) next: - specifier: 14.2.35 - version: 14.2.35(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 16.2.6 + version: 16.2.6(@babel/core@7.26.10)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) next-auth: specifier: ^4.24.11 - version: 4.24.11(next@14.2.35(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.24.11(next@16.2.6(@babel/core@7.26.10)(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) prettier: specifier: ^3.5.3 version: 3.5.3 react: - specifier: ^18.3.1 - version: 18.3.1 + specifier: ^19.2.6 + version: 19.2.6 react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: ^19.2.6 + version: 19.2.6(react@19.2.6) react-icons: specifier: ^5.5.0 - version: 5.5.0(react@18.3.1) + version: 5.5.0(react@19.2.6) react-lottie-player: specifier: ^2.1.0 - version: 2.1.0(react@18.3.1) + version: 2.1.0(react@19.2.6) recharts: specifier: ^3.8.0 - version: 3.8.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(redux@5.0.1) + version: 3.8.0(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react-is@18.3.1)(react@19.2.6)(redux@5.0.1) resend: specifier: ^6.5.2 version: 6.5.2 @@ -85,11 +88,11 @@ importers: version: 13.0.0 zustand: specifier: ^5.0.3 - version: 5.0.3(@types/react@18.3.20)(immer@11.1.4)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) + version: 5.0.3(@types/react@19.2.14)(immer@11.1.4)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)) devDependencies: '@next/bundle-analyzer': - specifier: ^15.3.4 - version: 15.3.4 + specifier: ^16.2.6 + version: 16.2.6 '@testing-library/dom': specifier: ^10.4.0 version: 10.4.0 @@ -98,7 +101,7 @@ importers: version: 6.6.3 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.6(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@types/hast': specifier: ^3.0.4 version: 3.0.4 @@ -109,26 +112,26 @@ importers: specifier: ^20.17.30 version: 20.17.30 '@types/react': - specifier: ^18.3.20 - version: 18.3.20 + specifier: ^19.2.14 + version: 19.2.14 '@types/react-dom': - specifier: ^18.3.6 - version: 18.3.6(@types/react@18.3.20) + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) '@types/react-lottie': specifier: ^1.2.10 version: 1.2.10 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.39.4 + version: 9.39.4(jiti@1.21.7) eslint-config-next: - specifier: 14.2.13 - version: 14.2.13(eslint@8.57.1)(typescript@5.8.3) + specifier: 16.2.6 + version: 16.2.6(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + version: 2.32.0(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.39.4(jiti@1.21.7)) eslint-plugin-unused-imports: specifier: ^4.3.0 - version: 4.3.0(@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + version: 4.3.0(@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint@9.39.4(jiti@1.21.7)) husky: specifier: ^9.1.7 version: 9.1.7 @@ -349,29 +352,52 @@ packages: '@emnapi/core@1.4.3': resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} '@emnapi/wasi-threads@1.0.2': resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} - '@eslint-community/eslint-utils@4.6.1': - resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.4': + resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} @@ -386,18 +412,29 @@ packages: react: ^16 || ^17 || ^18 || ^19 react-dom: ^16 || ^17 || ^18 || ^19 - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} @@ -405,105 +442,238 @@ packages: cpu: [arm64] os: [darwin] + '@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.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] 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.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] 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.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] 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.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + '@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.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] 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.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] 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.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] 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.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] 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.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] 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.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] 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.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] 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.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] 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.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] 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.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] 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.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] 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.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@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.33.5': resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] 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.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] 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'} @@ -615,73 +785,67 @@ packages: '@napi-rs/wasm-runtime@0.2.9': resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} - '@next/bundle-analyzer@15.3.4': - resolution: {integrity: sha512-AN9H9S+4WaIIahyJBGe6arLj5kopvVZPLffAJsDhkbQPGqirYqaHhwO6vheytXtdq3xNjwJLpbmYNa5ZQnitSw==} + '@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/eslint-plugin-next@14.2.13': - resolution: {integrity: sha512-z8Mk0VljxhIzsSiZUSdt3wp+t2lKd+jk5a9Jsvh3zDGkItgDMfjv/ZbET6HsxEl/fSihVoHGsXV6VLyDH0lfTQ==} + '@next/eslint-plugin-next@16.2.6': + resolution: {integrity: sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==} - '@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@15.3.1': - resolution: {integrity: sha512-8v1pAtRjcaCbs80qcYLLCrSsECgeSb0WMU0J3pMBYNavG3Y3yQOgFog18nVgiNrNB20HkyrScquWsy8gcdiGRA==} + '@next/third-parties@16.2.6': + resolution: {integrity: sha512-PDPIPVj1NX6Taxsl8OJteAUJ7iwR+QrokwWig68eh0cOmuNjC6MBL+ZzBjO8Bv0n/HOSqjGArZpM5KMSUxm+MQ==} peerDependencies: - next: ^13.0.0 || ^14.0.0 || ^15.0.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': @@ -724,9 +888,6 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.11.0': - resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} - '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -745,11 +906,8 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@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==} '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} @@ -847,6 +1005,9 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -871,6 +1032,9 @@ packages: '@types/jsdom@20.0.1': resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -895,10 +1059,10 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/react-dom@18.3.6': - resolution: {integrity: sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: - '@types/react': ^18.0.0 + '@types/react': ^19.2.0 '@types/react-lottie@1.2.10': resolution: {integrity: sha512-rCd1p3US4ELKJlqwVnP0h5b24zt5p9OCvKUoNpYExLqwbFZMWEiJ6EGLMmH7nmq5V7KomBIbWO2X/XRFsL0vCA==} @@ -906,6 +1070,9 @@ packages: '@types/react@18.3.20': resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -945,51 +1112,63 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.30.1': - resolution: {integrity: sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==} + '@typescript-eslint/eslint-plugin@8.59.3': + resolution: {integrity: sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.59.3 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.59.3': + resolution: {integrity: sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.30.1': - resolution: {integrity: sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==} + '@typescript-eslint/project-service@8.59.3': + resolution: {integrity: sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.30.1': - resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} + '@typescript-eslint/scope-manager@8.59.3': + resolution: {integrity: sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.30.1': - resolution: {integrity: sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==} + '@typescript-eslint/tsconfig-utils@8.59.3': + resolution: {integrity: sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.59.3': + resolution: {integrity: sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.30.1': - resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} + '@typescript-eslint/types@8.59.3': + resolution: {integrity: sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.30.1': - resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} + '@typescript-eslint/typescript-estree@8.59.3': + resolution: {integrity: sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.30.1': - resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} + '@typescript-eslint/utils@8.59.3': + resolution: {integrity: sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.30.1': - resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} + '@typescript-eslint/visitor-keys@8.59.3': + resolution: {integrity: sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@uiw/copy-to-clipboard@1.0.17': @@ -1118,12 +1297,17 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} @@ -1191,10 +1375,6 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - array-includes@3.1.9: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} @@ -1282,6 +1462,15 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} + engines: {node: '>=6.0.0'} + hasBin: true + bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} @@ -1298,6 +1487,10 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1317,10 +1510,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'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1581,6 +1770,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} @@ -1625,6 +1823,10 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1654,10 +1856,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -1769,10 +1967,10 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-next@14.2.13: - resolution: {integrity: sha512-aro1EKAoyYchnO/3Tlo91hnNBO7QO7qnv/79MAFC+4Jq8TdUVKQlht5d2F+YjrePjdpOvfL+mV9JPfyYNwkk1g==} + eslint-config-next@16.2.6: + resolution: {integrity: sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==} peerDependencies: - eslint: ^7.23.0 || ^8.0.0 + eslint: '>=9.0.0' typescript: '>=3.3.1' peerDependenciesMeta: typescript: @@ -1831,11 +2029,11 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: - resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==} - engines: {node: '>=10'} + eslint-plugin-react-hooks@7.1.1: + resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} + engines: {node: '>=18'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} @@ -1852,35 +2050,43 @@ packages: '@typescript-eslint/eslint-plugin': optional: true - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@9.39.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -1919,6 +2125,10 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -1946,6 +2156,15 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + feed@4.2.2: resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} engines: {node: '>=0.4.0'} @@ -1953,9 +2172,9 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -1969,9 +2188,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -2078,11 +2297,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -2095,9 +2309,13 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} @@ -2110,9 +2328,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -2192,6 +2407,12 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} @@ -2230,6 +2451,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + immer@10.2.0: resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} @@ -2379,10 +2604,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -2468,10 +2689,6 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -2627,8 +2844,8 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true jsdom@20.0.3: @@ -2949,9 +3166,16 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -3057,21 +3281,24 @@ packages: nodemailer: optional: 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 @@ -3234,10 +3461,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -3363,10 +3586,10 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@19.2.6: + resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} peerDependencies: - react: ^18.3.1 + react: ^19.2.6 react-icons@5.5.0: resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} @@ -3406,8 +3629,8 @@ packages: redux: optional: true - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@19.2.6: + resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -3562,11 +3785,6 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3592,8 +3810,8 @@ 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==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -3604,6 +3822,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -3620,6 +3843,10 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + 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'} @@ -3707,10 +3934,6 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -3799,13 +4022,13 @@ packages: style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} - 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 @@ -3844,9 +4067,6 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -3875,6 +4095,10 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -3904,8 +4128,8 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -3941,10 +4165,6 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -3965,6 +4185,13 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typescript-eslint@8.59.3: + resolution: {integrity: sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -4213,6 +4440,15 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zustand@5.0.3: resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} engines: {node: '>=12.20.0'} @@ -4424,7 +4660,7 @@ snapshots: '@babel/parser': 7.27.0 '@babel/template': 7.27.0 '@babel/types': 7.27.0 - debug: 4.4.0 + debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -4450,6 +4686,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 @@ -4460,28 +4701,51 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.6.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@1.21.7))': dependencies: - eslint: 8.57.1 + eslint: 9.39.4(jiti@1.21.7) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.21.2': dependencies: - ajv: 6.12.6 - debug: 4.4.0 - espree: 9.6.1 - globals: 13.24.0 + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.5': + dependencies: + ajv: 6.15.0 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 + js-yaml: 4.1.1 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/js@9.39.4': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 '@fastify/busboy@2.1.1': {} @@ -4489,99 +4753,200 @@ snapshots: dependencies: tslib: 2.8.1 - '@giscus/react@3.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@giscus/react@3.1.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: giscus: 1.6.0 - 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) - '@humanwhocodes/config-array@0.13.0': + '@humanfs/core@0.19.2': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} + + '@img/colour@1.1.0': + optional: true '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 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.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.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.0.4': optional: true + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm@1.0.5': 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.0.4': optional: true + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + '@img/sharp-libvips-linux-x64@1.0.4': optional: true + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.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.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 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.33.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.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.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.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.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.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.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.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.33.5': dependencies: '@emnapi/runtime': 1.4.3 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.33.5': optional: true + '@img/sharp-win32-ia32@0.34.5': + optional: true + '@img/sharp-win32-x64@0.33.5': optional: true + '@img/sharp-win32-x64@0.34.5': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4798,54 +5163,51 @@ snapshots: '@napi-rs/wasm-runtime@0.2.9': dependencies: '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.9.0 optional: true - '@next/bundle-analyzer@15.3.4': + '@next/bundle-analyzer@16.2.6': dependencies: webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: - bufferutil - utf-8-validate - '@next/env@14.2.35': {} + '@next/env@16.2.6': {} - '@next/eslint-plugin-next@14.2.13': + '@next/eslint-plugin-next@16.2.6': dependencies: - glob: 10.3.10 - - '@next/swc-darwin-arm64@14.2.33': - optional: true + fast-glob: 3.3.1 - '@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@15.3.1(next@14.2.35(@babel/core@7.26.10)(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.26.10)(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.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 + next: 16.2.6(@babel/core@7.26.10)(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': @@ -4869,7 +5231,7 @@ snapshots: '@polka/url@1.0.0-next.29': {} - '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@18.3.20)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': + '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1))(react@19.2.6)': dependencies: '@standard-schema/spec': 1.1.0 '@standard-schema/utils': 0.3.0 @@ -4878,13 +5240,11 @@ snapshots: redux-thunk: 3.1.0(redux@5.0.1) reselect: 5.1.1 optionalDependencies: - react: 18.3.1 - react-redux: 9.2.0(@types/react@18.3.20)(react@18.3.1)(redux@5.0.1) + react: 19.2.6 + react-redux: 9.2.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1) '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.11.0': {} - '@sinclair/typebox@0.27.8': {} '@sinonjs/commons@3.0.1': @@ -4901,11 +5261,8 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@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 '@testing-library/dom@10.4.0': @@ -4929,15 +5286,15 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.6(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@babel/runtime': 7.27.0 '@testing-library/dom': 10.4.0 - 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) optionalDependencies: - '@types/react': 18.3.20 - '@types/react-dom': 18.3.6(@types/react@18.3.20) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) '@tootallnate/once@2.0.0': {} @@ -5009,10 +5366,12 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.9 '@types/estree@1.0.7': {} + '@types/estree@1.0.9': {} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 20.17.30 @@ -5046,6 +5405,8 @@ snapshots: '@types/tough-cookie': 4.0.5 parse5: 7.2.1 + '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} '@types/lodash@4.17.16': {} @@ -5068,9 +5429,9 @@ snapshots: '@types/prop-types@15.7.14': {} - '@types/react-dom@18.3.6(@types/react@18.3.20)': + '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: - '@types/react': 18.3.20 + '@types/react': 19.2.14 '@types/react-lottie@1.2.10': dependencies: @@ -5081,6 +5442,10 @@ snapshots: '@types/prop-types': 15.7.14 csstype: 3.1.3 + '@types/react@19.2.14': + dependencies: + csstype: 3.1.3 + '@types/stack-utils@2.0.3': {} '@types/stats.js@0.17.4': {} @@ -5119,92 +5484,106 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.30.1(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.30.1 - '@typescript-eslint/type-utils': 8.30.1(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 8.30.1(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.30.1 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/type-utils': 8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.59.3 + eslint: 9.39.4(jiti@1.21.7) + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) + ts-api-utils: 2.5.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.30.1 - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.30.1 - debug: 4.4.0 - eslint: 8.57.1 + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.59.3 + debug: 4.4.3 + eslint: 9.39.4(jiti@1.21.7) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.59.3(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@5.8.3) + '@typescript-eslint/types': 8.59.3 + debug: 4.4.3 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.30.1': + '@typescript-eslint/scope-manager@8.59.3': dependencies: - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/visitor-keys': 8.30.1 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 - '@typescript-eslint/type-utils@8.30.1(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.59.3(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.30.1(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.0 - eslint: 8.57.1 - ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.8.3) + '@typescript-eslint/utils': 8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) + debug: 4.4.3 + eslint: 9.39.4(jiti@1.21.7) + ts-api-utils: 2.5.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.30.1': {} + '@typescript-eslint/types@8.59.3': {} - '@typescript-eslint/typescript-estree@8.30.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.59.3(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/visitor-keys': 8.30.1 - debug: 4.4.0 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.3) + '@typescript-eslint/project-service': 8.59.3(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@5.8.3) + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.0 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.30.1(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.30.1 - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) - eslint: 8.57.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.8.3) + eslint: 9.39.4(jiti@1.21.7) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.30.1': + '@typescript-eslint/visitor-keys@8.59.3': dependencies: - '@typescript-eslint/types': 8.30.1 - eslint-visitor-keys: 4.2.0 + '@typescript-eslint/types': 8.59.3 + eslint-visitor-keys: 5.0.1 '@uiw/copy-to-clipboard@1.0.17': {} - '@uiw/react-markdown-preview@5.2.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@uiw/react-markdown-preview@5.2.0(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@babel/runtime': 7.27.0 '@uiw/copy-to-clipboard': 1.0.17 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-markdown: 10.1.0(@types/react@18.3.20)(react@18.3.1) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-markdown: 10.1.0(@types/react@19.2.14)(react@19.2.6) rehype-attr: 4.0.2 rehype-autolink-headings: 7.1.0 rehype-ignore: 2.0.2 @@ -5219,12 +5598,12 @@ snapshots: - '@types/react' - supports-color - '@uiw/react-md-editor@4.0.5(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@uiw/react-md-editor@4.0.5(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@babel/runtime': 7.27.0 - '@uiw/react-markdown-preview': 5.2.0(@types/react@18.3.20)(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) + '@uiw/react-markdown-preview': 5.2.0(@types/react@19.2.14)(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) rehype: 13.0.2 rehype-prism-plus: 2.0.1 transitivePeerDependencies: @@ -5300,9 +5679,9 @@ snapshots: acorn: 8.14.1 acorn-walk: 8.3.4 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.14.1 + acorn: 8.16.0 acorn-walk@8.3.4: dependencies: @@ -5310,13 +5689,15 @@ snapshots: acorn@8.14.1: {} + acorn@8.16.0: {} + agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color - ajv@6.12.6: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -5375,15 +5756,6 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-includes@3.1.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - array-includes@3.1.9: dependencies: call-bind: 1.0.8 @@ -5399,7 +5771,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -5432,7 +5804,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 @@ -5531,6 +5903,10 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.29: {} + bcp-47-match@2.0.3: {} binary-extensions@2.3.0: {} @@ -5546,6 +5922,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -5565,10 +5945,6 @@ snapshots: buffer-from@1.1.2: {} - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -5806,6 +6182,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decimal.js-light@2.5.1: {} decimal.js@10.5.0: {} @@ -5838,6 +6218,9 @@ snapshots: detect-libc@2.0.3: {} + detect-libc@2.1.2: + optional: true + detect-newline@3.1.0: {} devlop@1.1.0: @@ -5858,10 +6241,6 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -6018,7 +6397,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -6073,22 +6452,22 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@14.2.13(eslint@8.57.1)(typescript@5.8.3): + eslint-config-next@16.2.6(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3): dependencies: - '@next/eslint-plugin-next': 14.2.13 - '@rushstack/eslint-patch': 1.11.0 - '@typescript-eslint/eslint-plugin': 8.30.1(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/parser': 8.30.1(eslint@8.57.1)(typescript@5.8.3) - eslint: 8.57.1 + '@next/eslint-plugin-next': 16.2.6 + eslint: 9.39.4(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-react-hooks: 7.1.1(eslint@9.39.4(jiti@1.21.7)) + globals: 16.4.0 + typescript-eslint: 8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: + - '@typescript-eslint/parser' - eslint-import-resolver-webpack - eslint-plugin-import-x - supports-color @@ -6101,33 +6480,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 - eslint: 8.57.1 + eslint: 9.39.4(jiti@1.21.7) get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.12 unrs-resolver: 1.5.0 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.39.4(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@9.39.4(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.30.1(eslint@8.57.1)(typescript@5.8.3) - eslint: 8.57.1 + '@typescript-eslint/parser': 8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) + eslint: 9.39.4(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.39.4(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -6136,9 +6515,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.1 + eslint: 9.39.4(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@9.39.4(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -6150,23 +6529,23 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.30.1(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@1.21.7)): dependencies: aria-query: 5.3.2 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 axe-core: 4.10.3 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.57.1 + eslint: 9.39.4(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -6175,19 +6554,26 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1): + eslint-plugin-react-hooks@7.1.1(eslint@9.39.4(jiti@1.21.7)): dependencies: - eslint: 8.57.1 + '@babel/core': 7.26.10 + '@babel/parser': 7.27.0 + eslint: 9.39.4(jiti@1.21.7) + hermes-parser: 0.25.1 + zod: 4.4.3 + zod-validation-error: 4.0.2(zod@4.4.3) + transitivePeerDependencies: + - supports-color - eslint-plugin-react@7.37.5(eslint@8.57.1): + eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@1.21.7)): dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 8.57.1 + eslint: 9.39.4(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -6201,73 +6587,73 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): + eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint@9.39.4(jiti@1.21.7)): dependencies: - eslint: 8.57.1 + eslint: 9.39.4(jiti@1.21.7) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.30.1(@typescript-eslint/parser@8.30.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) - eslint-scope@7.2.2: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.1: {} - eslint@8.57.1: + eslint@9.39.4(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.5 + '@eslint/js': 9.39.4 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 - doctrine: 3.0.0 + debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.7 transitivePeerDependencies: - supports-color - espree@9.6.1: + espree@10.4.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 3.4.3 + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -6309,6 +6695,14 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6331,9 +6725,13 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.4.3(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.4 feed@4.2.2: dependencies: @@ -6341,9 +6739,9 @@ snapshots: fflate@0.8.2: {} - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: @@ -6359,11 +6757,10 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.3.3 keyv: 4.5.4 - rimraf: 3.0.2 flatted@3.3.3: {} @@ -6385,14 +6782,14 @@ snapshots: es-set-tostringtag: 2.1.0 mime-types: 2.1.35 - framer-motion@12.23.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + framer-motion@12.23.24(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: motion-dom: 12.23.23 motion-utils: 12.23.6 tslib: 2.8.1 optionalDependencies: - 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) fs.realpath@1.0.0: {} @@ -6464,14 +6861,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.10: - dependencies: - foreground-child: 3.3.1 - jackspeak: 2.3.6 - minimatch: 9.0.5 - minipass: 7.1.2 - path-scurry: 1.11.1 - glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -6492,9 +6881,9 @@ snapshots: globals@11.12.0: {} - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@14.0.0: {} + + globals@16.4.0: {} globalthis@1.0.4: dependencies: @@ -6505,8 +6894,6 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - gzip-size@6.0.0: dependencies: duplexer: 0.1.2 @@ -6675,6 +7062,12 @@ snapshots: property-information: 7.0.0 space-separated-tokens: 2.0.2 + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + html-encoding-sniffer@3.0.0: dependencies: whatwg-encoding: 2.0.0 @@ -6710,6 +7103,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + immer@10.2.0: {} immer@11.1.4: {} @@ -6787,7 +7182,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.1 + semver: 7.8.0 is-callable@1.2.7: {} @@ -6848,8 +7243,6 @@ snapshots: is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-plain-obj@4.1.0: {} is-plain-object@5.0.0: {} @@ -6931,7 +7324,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -6951,12 +7344,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -7298,7 +7685,7 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -7355,7 +7742,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -7806,7 +8193,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0 + debug: 4.4.3 decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -7842,10 +8229,18 @@ snapshots: min-indent@1.0.1: {} + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.11 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -7890,13 +8285,13 @@ snapshots: motion-utils@12.23.6: {} - motion@12.23.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + motion@12.23.24(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: - framer-motion: 12.23.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + framer-motion: 12.23.24(react-dom@19.2.6(react@19.2.6))(react@19.2.6) tslib: 2.8.1 optionalDependencies: - 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) mpath@0.9.0: {} @@ -7920,42 +8315,41 @@ snapshots: natural-compare@1.4.0: {} - next-auth@4.24.11(next@14.2.35(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-auth@4.24.11(next@16.2.6(@babel/core@7.26.10)(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: '@babel/runtime': 7.27.0 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 - next: 14.2.35(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 16.2.6(@babel/core@7.26.10)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) oauth: 0.9.15 openid-client: 5.7.1 preact: 10.26.5 preact-render-to-string: 5.2.6(preact@10.26.5) - 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) uuid: 8.3.2 - next@14.2.35(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@16.2.6(@babel/core@7.26.10)(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.29 caniuse-lite: 1.0.30001761 - 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.26.10)(react@18.3.1) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + styled-jsx: 5.1.6(@babel/core@7.26.10)(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 + sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -8126,8 +8520,6 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} - picomatch@4.0.4: {} pify@2.3.0: {} @@ -8238,15 +8630,14 @@ snapshots: queue-microtask@1.2.3: {} - react-dom@18.3.1(react@18.3.1): + react-dom@19.2.6(react@19.2.6): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 19.2.6 + scheduler: 0.27.0 - react-icons@5.5.0(react@18.3.1): + react-icons@5.5.0(react@19.2.6): dependencies: - react: 18.3.1 + react: 19.2.6 react-is@16.13.1: {} @@ -8254,23 +8645,23 @@ snapshots: react-is@18.3.1: {} - react-lottie-player@2.1.0(react@18.3.1): + react-lottie-player@2.1.0(react@19.2.6): dependencies: fast-deep-equal: 3.1.3 lottie-web: 5.12.2 - react: 18.3.1 + react: 19.2.6 rfdc: 1.4.1 - react-markdown@10.1.0(@types/react@18.3.20)(react@18.3.1): + react-markdown@10.1.0(@types/react@19.2.14)(react@19.2.6): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@types/react': 18.3.20 + '@types/react': 19.2.14 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 mdast-util-to-hast: 13.2.0 - react: 18.3.1 + react: 19.2.6 remark-parse: 11.0.0 remark-rehype: 11.1.2 unified: 11.0.5 @@ -8279,18 +8670,16 @@ snapshots: transitivePeerDependencies: - supports-color - react-redux@9.2.0(@types/react@18.3.20)(react@18.3.1)(redux@5.0.1): + react-redux@9.2.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 - react: 18.3.1 - use-sync-external-store: 1.6.0(react@18.3.1) + react: 19.2.6 + use-sync-external-store: 1.6.0(react@19.2.6) optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 19.2.14 redux: 5.0.1 - react@18.3.1: - dependencies: - loose-envify: 1.4.0 + react@19.2.6: {} read-cache@1.0.0: dependencies: @@ -8300,21 +8689,21 @@ snapshots: dependencies: picomatch: 2.3.1 - recharts@3.8.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(redux@5.0.1): + recharts@3.8.0(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react-is@18.3.1)(react@19.2.6)(redux@5.0.1): dependencies: - '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0(@types/react@18.3.20)(react@18.3.1)(redux@5.0.1))(react@18.3.1) + '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1))(react@19.2.6) clsx: 2.1.1 decimal.js-light: 2.5.1 es-toolkit: 1.45.1 eventemitter3: 5.0.4 immer: 10.2.0 - 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: 18.3.1 - react-redux: 9.2.0(@types/react@18.3.20)(react@18.3.1)(redux@5.0.1) + react-redux: 9.2.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1) reselect: 5.1.1 tiny-invariant: 1.3.3 - use-sync-external-store: 1.6.0(react@18.3.1) + use-sync-external-store: 1.6.0(react@19.2.6) victory-vendor: 37.3.6 transitivePeerDependencies: - '@types/react' @@ -8511,10 +8900,6 @@ snapshots: rfdc@1.4.1: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -8546,14 +8931,14 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 + scheduler@0.27.0: {} semver@6.3.1: {} semver@7.7.1: {} + semver@7.8.0: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -8602,6 +8987,38 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.0 + 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 @@ -8694,8 +9111,6 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - streamsearch@1.1.0: {} - string-argv@0.3.2: {} string-length@4.0.2: @@ -8730,14 +9145,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -8751,7 +9166,7 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: @@ -8813,10 +9228,10 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - styled-jsx@5.1.1(@babel/core@7.26.10)(react@18.3.1): + styled-jsx@5.1.6(@babel/core@7.26.10)(react@19.2.6): dependencies: client-only: 0.0.1 - react: 18.3.1 + react: 19.2.6 optionalDependencies: '@babel/core': 7.26.10 @@ -8884,8 +9299,6 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - text-table@0.2.0: {} - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -8906,8 +9319,13 @@ snapshots: tinyglobby@0.2.12: dependencies: - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.3(picomatch@4.0.4) + picomatch: 4.0.4 + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tmpl@1.0.5: {} @@ -8936,7 +9354,7 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.5.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -8975,8 +9393,6 @@ snapshots: type-detect@4.0.8: {} - type-fest@0.20.2: {} - type-fest@0.21.3: {} typed-array-buffer@1.0.3: @@ -9012,6 +9428,17 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typescript-eslint@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/parser': 8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.8.3) + '@typescript-eslint/utils': 8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.8.3) + eslint: 9.39.4(jiti@1.21.7) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + typescript@5.8.3: {} unbox-primitive@1.1.0: @@ -9104,9 +9531,9 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - 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 util-deprecate@1.0.2: {} @@ -9313,11 +9740,17 @@ snapshots: yocto-queue@0.1.0: {} - zustand@5.0.3(@types/react@18.3.20)(immer@11.1.4)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)): + zod-validation-error@4.0.2(zod@4.4.3): + dependencies: + zod: 4.4.3 + + zod@4.4.3: {} + + zustand@5.0.3(@types/react@19.2.14)(immer@11.1.4)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)): optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 19.2.14 immer: 11.1.4 - react: 18.3.1 - use-sync-external-store: 1.6.0(react@18.3.1) + react: 19.2.6 + use-sync-external-store: 1.6.0(react@19.2.6) zwitch@2.0.4: {} diff --git a/middleware.ts b/proxy.ts similarity index 92% rename from middleware.ts rename to proxy.ts index a0819e4d..a101c110 100644 --- a/middleware.ts +++ b/proxy.ts @@ -1,6 +1,6 @@ import { NextRequest, NextResponse } from 'next/server'; -export function middleware(request: NextRequest) { +export function proxy(request: NextRequest) { // /posts/[slug] 페이지 진입 시 HTTP Referer 헤더를 쿠키로 저장 if (request.nextUrl.pathname.startsWith('/posts/')) { const referer = request.headers.get('referer') ?? ''; diff --git a/scripts/generate-llms.mjs b/scripts/generate-llms.mjs index 5e4c4b13..90815433 100644 --- a/scripts/generate-llms.mjs +++ b/scripts/generate-llms.mjs @@ -2,10 +2,10 @@ // Vercel: 환경변수 자동 주입 // 로컬: node --env-file=.env scripts/generate-llms.mjs 또는 pnpm build 전 .env 로드 -import mongoose from 'mongoose'; import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; +import mongoose from 'mongoose'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); diff --git a/tsconfig.json b/tsconfig.json index 53b445a0..8dae775e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "ES2018", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -11,7 +15,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "plugins": [ { @@ -19,9 +23,19 @@ } ], "paths": { - "@/*": ["./*"] + "@/*": [ + "./*" + ] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] }