1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-04-26 06:45:23 -04:00

more caching and error handling

This commit is contained in:
Jake Jarvis 2025-03-24 11:45:48 -04:00
parent 8890c1d08d
commit d3250bd00e
Signed by: jake
SSH Key Fingerprint: SHA256:nCkvAjYA6XaSPUqc4TfbBQTpzr8Xj7ritg/sGInCdkc
18 changed files with 335 additions and 327 deletions

View File

@ -38,3 +38,8 @@ RESEND_DOMAIN=
NEXT_PUBLIC_TURNSTILE_SITE_KEY= NEXT_PUBLIC_TURNSTILE_SITE_KEY=
# used for backend validation of turnstile result. # used for backend validation of turnstile result.
TURNSTILE_SECRET_KEY= TURNSTILE_SECRET_KEY=
# optional. sets "Onion-Location" response header to advertise a hidden service for the site; browsers like Brave and
# Tor Browser will automatically pick this up and offer to redirect users to it.
# https://community.torproject.org/onion-services/advanced/onion-location/
NEXT_PUBLIC_ONION_DOMAIN=

View File

@ -54,9 +54,9 @@ export const sendMessage = async (
throw new Error(`[contact form] turnstile validation failed: ${turnstileResponse.status}`); throw new Error(`[contact form] turnstile validation failed: ${turnstileResponse.status}`);
} }
const turnstileData = await turnstileResponse?.json(); const turnstileData = (await turnstileResponse.json()) as { success: boolean };
if (!turnstileData?.success) { if (!turnstileData.success) {
return { return {
success: false, success: false,
message: "Did you complete the CAPTCHA? (If you're human, that is...)", message: "Did you complete the CAPTCHA? (If you're human, that is...)",

View File

@ -54,7 +54,7 @@ const Image = async ({ params }: { params: Promise<{ slug: string }> }) => {
const { slug } = await params; const { slug } = await params;
// get the post's title and image filename from its frontmatter // get the post's title and image filename from its frontmatter
const { title, image: imagePath } = await getFrontMatter(slug); const frontmatter = await getFrontMatter(slug);
return new ImageResponse( return new ImageResponse(
( (
@ -67,7 +67,7 @@ const Image = async ({ params }: { params: Promise<{ slug: string }> }) => {
background: "linear-gradient(0deg, hsla(197, 14%, 57%, 1) 0%, hsla(192, 17%, 94%, 1) 100%)", background: "linear-gradient(0deg, hsla(197, 14%, 57%, 1) 0%, hsla(192, 17%, 94%, 1) 100%)",
}} }}
> >
{imagePath && ( {frontmatter!.image && (
<div <div
style={{ style={{
display: "flex", display: "flex",
@ -78,7 +78,7 @@ const Image = async ({ params }: { params: Promise<{ slug: string }> }) => {
{/* eslint-disable-next-line jsx-a11y/alt-text */} {/* eslint-disable-next-line jsx-a11y/alt-text */}
<img <img
// @ts-expect-error // @ts-expect-error
src={await getLocalImage(`${POSTS_DIR}/${slug}/${imagePath}`)} src={await getLocalImage(`${POSTS_DIR}/${slug}/${frontmatter!.image}`)}
style={{ objectFit: "cover", height: "100%", width: "100%" }} style={{ objectFit: "cover", height: "100%", width: "100%" }}
/> />
</div> </div>
@ -117,7 +117,7 @@ const Image = async ({ params }: { params: Promise<{ slug: string }> }) => {
color: "#fefefe", color: "#fefefe",
}} }}
> >
{title} {frontmatter!.title}
</div> </div>
</div> </div>
), ),

View File

@ -65,7 +65,7 @@
margin-top: 2em; margin-top: 2em;
padding-top: 2em; padding-top: 2em;
border-top: 2px solid var(--colors-light); border-top: 2px solid var(--colors-light);
min-height: 360px; min-height: 140px;
} }
@media (max-width: 768px) { @media (max-width: 768px) {

View File

@ -37,14 +37,14 @@ export const generateMetadata = async ({ params }: { params: Promise<{ slug: str
const frontmatter = await getFrontMatter(slug); const frontmatter = await getFrontMatter(slug);
return addMetadata({ return addMetadata({
title: frontmatter.title, title: frontmatter!.title,
description: frontmatter.description, description: frontmatter!.description,
openGraph: { openGraph: {
type: "article", type: "article",
authors: [config.authorName], authors: [config.authorName],
tags: frontmatter.tags, tags: frontmatter!.tags,
publishedTime: frontmatter.date, publishedTime: frontmatter!.date,
modifiedTime: frontmatter.date, modifiedTime: frontmatter!.date,
}, },
twitter: { twitter: {
card: "summary_large_image", card: "summary_large_image",
@ -67,13 +67,13 @@ const Page = async ({ params }: { params: Promise<{ slug: string }> }) => {
item={{ item={{
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "Article", "@type": "Article",
headline: frontmatter.title, headline: frontmatter!.title,
description: frontmatter.description, description: frontmatter!.description,
url: frontmatter.permalink, url: frontmatter!.permalink,
image: [`${BASE_URL}/notes/${slug}/opengraph-image`], image: [`${BASE_URL}/notes/${slug}/opengraph-image`],
keywords: frontmatter.tags, keywords: frontmatter!.tags,
datePublished: frontmatter.date, datePublished: frontmatter!.date,
dateModified: frontmatter.date, dateModified: frontmatter!.date,
inLanguage: config.siteLocale, inLanguage: config.siteLocale,
license: config.licenseUrl, license: config.licenseUrl,
author: { author: {
@ -85,17 +85,17 @@ const Page = async ({ params }: { params: Promise<{ slug: string }> }) => {
<div className={styles.meta}> <div className={styles.meta}>
<div className={styles.metaItem}> <div className={styles.metaItem}>
<Link href={`/notes/${frontmatter.slug}` as Route} plain className={styles.metaLink}> <Link href={`/notes/${frontmatter!.slug}` as Route} plain className={styles.metaLink}>
<CalendarIcon size="1.2em" className={styles.metaIcon} /> <CalendarIcon size="1.2em" className={styles.metaIcon} />
<Time date={frontmatter.date} format="MMMM d, y" /> <Time date={frontmatter!.date} format="MMMM d, y" />
</Link> </Link>
</div> </div>
{frontmatter.tags && ( {frontmatter!.tags && (
<div className={styles.metaItem}> <div className={styles.metaItem}>
<TagIcon size="1.2em" className={styles.metaIcon} /> <TagIcon size="1.2em" className={styles.metaIcon} />
<span className={styles.metaTags}> <span className={styles.metaTags}>
{frontmatter.tags.map((tag) => ( {frontmatter!.tags.map((tag) => (
<span key={tag} title={tag} className={styles.metaTag} aria-label={`Tagged with ${tag}`}> <span key={tag} title={tag} className={styles.metaTag} aria-label={`Tagged with ${tag}`}>
{tag} {tag}
</span> </span>
@ -106,8 +106,8 @@ const Page = async ({ params }: { params: Promise<{ slug: string }> }) => {
<div className={styles.metaItem}> <div className={styles.metaItem}>
<Link <Link
href={`https://github.com/${config.githubRepo}/blob/main/notes/${frontmatter.slug}/index.mdx`} href={`https://github.com/${config.githubRepo}/blob/main/notes/${frontmatter!.slug}/index.mdx`}
title={`Edit "${frontmatter.title}" on GitHub`} title={`Edit "${frontmatter!.title}" on GitHub`}
plain plain
className={styles.metaLink} className={styles.metaLink}
> >
@ -129,7 +129,7 @@ const Page = async ({ params }: { params: Promise<{ slug: string }> }) => {
> >
<EyeIcon size="1.2em" className={styles.metaIcon} /> <EyeIcon size="1.2em" className={styles.metaIcon} />
<Suspense fallback={<Loading boxes={3} width={20} />}> <Suspense fallback={<Loading boxes={3} width={20} />}>
<HitCounter slug={`notes/${frontmatter.slug}`} /> <HitCounter slug={`notes/${frontmatter!.slug}`} />
</Suspense> </Suspense>
</div> </div>
</ErrorBoundary> </ErrorBoundary>
@ -138,8 +138,8 @@ const Page = async ({ params }: { params: Promise<{ slug: string }> }) => {
<h1 className={styles.title}> <h1 className={styles.title}>
<Link <Link
href={`/notes/${frontmatter.slug}` as Route} href={`/notes/${frontmatter!.slug}` as Route}
dangerouslySetInnerHTML={{ __html: frontmatter.htmlTitle || frontmatter.title }} dangerouslySetInnerHTML={{ __html: frontmatter!.htmlTitle || frontmatter!.title }}
plain plain
className={styles.link} className={styles.link}
/> />
@ -147,9 +147,11 @@ const Page = async ({ params }: { params: Promise<{ slug: string }> }) => {
<MDXContent /> <MDXContent />
{!frontmatter.noComments && ( {!frontmatter!.noComments && (
<div id="comments" className={styles.comments}> <div id="comments" className={styles.comments}>
<Comments title={frontmatter.title} /> <Suspense fallback={<Loading boxes={3} width={40} style={{ display: "block", margin: "2em auto" }} />}>
<Comments title={frontmatter!.title} />
</Suspense>
</div> </div>
)} )}
</> </>

View File

@ -18,7 +18,6 @@ const Comments = ({ title }: CommentsProps) => {
return null; return null;
} }
// TODO: use custom `<Loading />` spinner component during suspense
return ( return (
<Giscus <Giscus
repo={config.githubRepo as GiscusProps["repo"]} repo={config.githubRepo as GiscusProps["repo"]}

View File

@ -12,6 +12,7 @@ const Image = ({ src, height, width, placeholder, className, ...rest }: ImagePro
const constrainWidth = (width?: number | `${number}`) => { const constrainWidth = (width?: number | `${number}`) => {
if (!width) return MAX_WIDTH; if (!width) return MAX_WIDTH;
// ensure that the image width is not greater than the global maximum width
return Math.min(typeof width === "string" ? parseInt(width, 10) : width, MAX_WIDTH); return Math.min(typeof width === "string" ? parseInt(width, 10) : width, MAX_WIDTH);
}; };

View File

@ -1,11 +1,8 @@
"use client"; "use client";
import TimeAgo from "react-timeago";
import Time from "../Time";
import { useHasMounted } from "../../hooks"; import { useHasMounted } from "../../hooks";
import { format, formatISO, formatDistanceToNowStrict } from "date-fns";
import { enUS } from "date-fns/locale";
import { tz } from "@date-fns/tz";
import { utc } from "@date-fns/utc";
import * as config from "../../lib/config";
import type { ComponentPropsWithoutRef } from "react"; import type { ComponentPropsWithoutRef } from "react";
export type RelativeTimeProps = ComponentPropsWithoutRef<"time"> & { export type RelativeTimeProps = ComponentPropsWithoutRef<"time"> & {
@ -17,17 +14,11 @@ const RelativeTime = ({ date, ...rest }: RelativeTimeProps) => {
// cause a react hydration mismatch error. // cause a react hydration mismatch error.
const hasMounted = useHasMounted(); const hasMounted = useHasMounted();
return ( if (!hasMounted) {
<time return <Time date={date} format="MMM d, y" {...rest} />;
dateTime={formatISO(date, { in: utc })} }
title={format(date, "MMM d, y, h:mm a O", { in: tz(config.timeZone), locale: enUS })}
{...rest} return <TimeAgo date={date} {...rest} />;
>
{hasMounted
? formatDistanceToNowStrict(date, { locale: enUS, addSuffix: true })
: `on ${format(date, "MMM d, y", { in: tz(config.timeZone), locale: enUS })}`}
</time>
);
}; };
export default RelativeTime; export default RelativeTime;

View File

@ -1,14 +1,5 @@
.player { .player {
margin: 0 auto; margin: 0 auto;
} width: 100%;
height: auto;
.wrapper.responsive {
position: relative;
padding-top: 56.25%; /* ratio of 1280x720 */
}
.wrapper.responsive .player {
position: absolute;
top: 0;
left: 0;
} }

View File

@ -7,43 +7,38 @@ export type VideoProps = Omit<Partial<ComponentPropsWithoutRef<"video">>, "src">
src: string[]; src: string[];
poster?: string; poster?: string;
autoplay?: boolean; autoplay?: boolean;
responsive?: boolean;
}; };
const Video = ({ src, poster, autoplay = false, responsive = true, className, ...rest }: VideoProps) => { const Video = ({ src, poster, autoplay = false, className, ...rest }: VideoProps) => {
return ( return (
<div className={clsx(styles.wrapper, responsive && styles.responsive, className)}> <video
<video className={clsx(styles.player, className)}
width="100%" poster={poster}
height="100%" {...(autoplay
className={styles.player} ? {
poster={poster} preload: "auto",
{...(autoplay controls: false,
? { autoPlay: true,
preload: "auto", playsInline: true, // safari autoplay workaround
controls: false, loop: true,
autoPlay: true, muted: true,
playsInline: true, // safari autoplay workaround
loop: true,
muted: true,
}
: {
preload: "metadata",
controls: true,
})}
{...rest}
>
{src.map((file) => {
const extension = file.split(".").pop();
if (extension === "vtt") {
return <track key={file} kind="subtitles" src={file} srcLang="en" label="English" default />;
} else {
return <source key={file} src={file} type={`video/${extension}`} />;
} }
})} : {
</video> preload: "metadata",
</div> controls: true,
})}
{...rest}
>
{src.map((file) => {
const extension = file.split(".").pop();
if (extension === "vtt") {
return <track key={file} kind="subtitles" src={file} srcLang="en" label="English" default />;
} else {
return <source key={file} src={file} type={`video/${extension}`} />;
}
})}
</video>
); );
}; };

View File

@ -7,7 +7,6 @@ const useLocalStorage = <T = string>(
key: string, key: string,
initialValue?: T initialValue?: T
): [T | undefined, Dispatch<SetStateAction<T | undefined>>, () => void] => { ): [T | undefined, Dispatch<SetStateAction<T | undefined>>, () => void] => {
// TODO: make these customizable (e.g. `JSON.stringify()` and `JSON.parse()`)
const serializer = (value: T | undefined) => String(value); const serializer = (value: T | undefined) => String(value);
const deserializer = (value: string) => value as unknown as T; const deserializer = (value: string) => value as unknown as T;

View File

@ -2,7 +2,6 @@
export const siteName = "Jake Jarvis"; export const siteName = "Jake Jarvis";
export const siteLocale = "en-US"; export const siteLocale = "en-US";
export const timeZone = "America/New_York"; // https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List export const timeZone = "America/New_York"; // https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
export const onionDomain = "jarvis2i2vp4j4tbxjogsnqdemnte5xhzyi7hziiyzxwge3hzmh57zad.onion";
export const shortDescription = "Frontend Web Developer in Boston, MA"; export const shortDescription = "Frontend Web Developer in Boston, MA";
export const longDescription = export const longDescription =
"Hi there! I'm a frontend web developer based in Boston, Massachusetts specializing in TypeScript, React, Next.js, and other JavaScript frameworks."; "Hi there! I'm a frontend web developer based in Boston, Massachusetts specializing in TypeScript, React, Next.js, and other JavaScript frameworks.";

View File

@ -19,38 +19,42 @@ export type FrontMatter = {
}; };
// returns front matter and the **raw & uncompiled** markdown of a given slug // returns front matter and the **raw & uncompiled** markdown of a given slug
export const getFrontMatter = async (slug: string): Promise<FrontMatter> => { export const getFrontMatter = cache(async (slug: string): Promise<FrontMatter | null> => {
const { frontmatter } = await import(`../../${POSTS_DIR}/${slug}/index.mdx`); try {
const { frontmatter } = await import(`../../${POSTS_DIR}/${slug}/index.mdx`);
// process markdown title to html... // process markdown title to html...
const htmlTitle = await unified() const htmlTitle = await unified()
.use(remarkParse) .use(remarkParse)
.use(remarkSmartypants) .use(remarkSmartypants)
.use(remarkHtml, { .use(remarkHtml, {
sanitize: { sanitize: {
// allow *very* limited markdown to be used in post titles // allow *very* limited markdown to be used in post titles
tagNames: ["code", "em", "strong"], tagNames: ["code", "em", "strong"],
}, },
}) })
.process(frontmatter.title) .process(frontmatter.title)
.then((result) => result.toString().trim()); .then((result) => result.toString().trim());
// ...and then (sketchily) remove said html for a plaintext version: // ...and then (sketchily) remove said html for a plaintext version:
// https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/ // https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/
const title = decode(htmlTitle.replace(/<[^>]*>/g, "")); const title = decode(htmlTitle.replace(/<[^>]*>/g, ""));
// return both the parsed YAML front matter (with a few amendments) and the raw, unparsed markdown content return {
return { ...(frontmatter as Partial<FrontMatter>),
...(frontmatter as Partial<FrontMatter>), // plain title without html or markdown syntax:
// plain title without html or markdown syntax: title,
title, // stylized title with limited html tags:
// stylized title with limited html tags: htmlTitle,
htmlTitle, slug,
slug, date: new Date(frontmatter.date).toISOString(), // validate/normalize the date string provided from front matter
date: new Date(frontmatter.date).toISOString(), // validate/normalize the date string provided from front matter permalink: `${BASE_URL}/${POSTS_DIR}/${slug}`,
permalink: `${BASE_URL}/${POSTS_DIR}/${slug}`, };
}; } catch (error) {
}; console.error(`Failed to load front matter for post with slug "${slug}":`, error);
return null;
}
});
// use filesystem to get a simple list of all post slugs // use filesystem to get a simple list of all post slugs
export const getPostSlugs = cache(async (): Promise<string[]> => { export const getPostSlugs = cache(async (): Promise<string[]> => {
@ -70,7 +74,7 @@ export const getPostSlugs = cache(async (): Promise<string[]> => {
export const getAllPosts = cache(async (): Promise<FrontMatter[]> => { export const getAllPosts = cache(async (): Promise<FrontMatter[]> => {
// concurrently fetch the front matter of each post // concurrently fetch the front matter of each post
const slugs = await getPostSlugs(); const slugs = await getPostSlugs();
const posts = await Promise.all(slugs.map(getFrontMatter)); const posts = (await Promise.all(slugs.map(getFrontMatter))) as FrontMatter[];
// sort the results reverse chronologically and return // sort the results reverse chronologically and return
return posts.sort((post1, post2) => new Date(post1.date).getTime() - new Date(post2.date).getTime()); return posts.sort((post1, post2) => new Date(post1.date).getTime() - new Date(post2.date).getTime());

View File

@ -1,23 +1,23 @@
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import type { NextRequest } from "next/server"; import type { NextRequest } from "next/server";
import * as siteConfig from "./lib/config";
// assign "short codes" to approved reverse proxy destinations. for example: // assign "short codes" to approved reverse proxy destinations. for example:
// ["abc", "https://jakejarvis.github.io"] => /_stream/abc/123.html -> https://jakejarvis.github.io/123.html // ["abc", "https://jakejarvis.github.io"] => /_stream/abc/123.html -> https://jakejarvis.github.io/123.html
const rewritePrefix = "/_stream/"; const rewritePrefix = "/_stream/";
const rewrites = new Map([ const rewrites = new Map();
// umami backend, see https://umami.is/docs/guides/running-on-vercel#proxy-umami-analytics-via-vercel
["u", process.env.NEXT_PUBLIC_UMAMI_URL || "https://cloud.umami.is"], // umami backend, see https://umami.is/docs/guides/running-on-vercel#proxy-umami-analytics-via-vercel
]); if (process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID) {
rewrites.set("u", process.env.NEXT_PUBLIC_UMAMI_URL || "https://cloud.umami.is");
}
export const middleware = (request: NextRequest) => { export const middleware = (request: NextRequest) => {
const headers = new Headers(); const headers = new Headers();
// https://gitweb.torproject.org/tor-browser-spec.git/tree/proposals/100-onion-location-header.txt // https://community.torproject.org/onion-services/advanced/onion-location/
if (siteConfig.onionDomain) { if (process.env.NEXT_PUBLIC_ONION_DOMAIN) {
const onionUrl = request.nextUrl.clone(); const onionUrl = request.nextUrl.clone();
onionUrl.hostname = siteConfig.onionDomain; onionUrl.hostname = process.env.NEXT_PUBLIC_ONION_DOMAIN;
onionUrl.protocol = "http"; onionUrl.protocol = "http";
onionUrl.port = ""; onionUrl.port = "";
@ -51,7 +51,6 @@ export const middleware = (request: NextRequest) => {
const proxiedPath = slashIndex === -1 ? "/" : pathAfterPrefix.slice(slashIndex); const proxiedPath = slashIndex === -1 ? "/" : pathAfterPrefix.slice(slashIndex);
const proxiedUrl = new URL(`${proxiedPath}${request.nextUrl.search}`, proxiedOrigin); const proxiedUrl = new URL(`${proxiedPath}${request.nextUrl.search}`, proxiedOrigin);
// TODO: remove debugging headers
headers.set("x-rewrite-url", proxiedUrl.toString()); headers.set("x-rewrite-url", proxiedUrl.toString());
// finally do the rewriting // finally do the rewriting

View File

@ -16,7 +16,7 @@ noComments: true
--- ---
![Hillary for New Hampshire Winter Fellows with Hillary Clinton in Derry, NH (February 3, 2016)](./24707394571_0818d4ab83_o-1-copy.jpg) ![Hillary for New Hampshire Winter Fellows with Hillary Clinton in Derry, NH (February 3, 2016)](./24707394571_0818d4ab83_o-1-copy.jpg)
_ [Hillary for New Hampshire](https://medium.com/@HillaryForNH) Winter Fellows with [Hillary Clinton](https://medium.com/@HillaryClinton) in Derry, NH ([February 3, 2016](https://www.flickr.com/photos/hillaryclinton/24707394571/))_ _[Hillary for New Hampshire](https://medium.com/@HillaryForNH) Winter Fellows with [Hillary Clinton](https://medium.com/@HillaryClinton) in Derry, NH ([February 3, 2016](https://www.flickr.com/photos/hillaryclinton/24707394571/))_
## Keeping in mind the big picture... ## Keeping in mind the big picture...

View File

@ -34,7 +34,6 @@ Although the designer who selected this GIF likely had _thousands_ of choices wh
]} ]}
crossOrigin="anonymous" crossOrigin="anonymous"
autoplay autoplay
responsive={false}
/> />
## 3. Joe Biden — [joebiden.com](https://joebiden.com/asdfasdf404) ## 3. Joe Biden — [joebiden.com](https://joebiden.com/asdfasdf404)
@ -54,7 +53,6 @@ A ballsy move, considering Beto's infamous [DUI arrest](https://www.politifact.c
]} ]}
crossOrigin="anonymous" crossOrigin="anonymous"
autoplay autoplay
responsive={false}
/> />
## 5. Kamala Harris — [kamalaharris.org](https://kamalaharris.org/asdfasdf404) ## 5. Kamala Harris — [kamalaharris.org](https://kamalaharris.org/asdfasdf404)
@ -68,7 +66,6 @@ Another clean and simple page with a top-notch GIF. It injected some emotion int
]} ]}
crossOrigin="anonymous" crossOrigin="anonymous"
autoplay autoplay
responsive={false}
/> />
## 6. Pete Buttigeg — [peteforamerica.com](https://peteforamerica.com/asdfasdf404/) ## 6. Pete Buttigeg — [peteforamerica.com](https://peteforamerica.com/asdfasdf404/)

View File

@ -24,9 +24,9 @@
"@giscus/react": "^3.1.0", "@giscus/react": "^3.1.0",
"@mdx-js/loader": "^3.1.0", "@mdx-js/loader": "^3.1.0",
"@mdx-js/react": "^3.1.0", "@mdx-js/react": "^3.1.0",
"@next/bundle-analyzer": "15.3.0-canary.17", "@next/bundle-analyzer": "15.3.0-canary.19",
"@next/mdx": "15.3.0-canary.17", "@next/mdx": "15.3.0-canary.19",
"@next/third-parties": "15.3.0-canary.17", "@next/third-parties": "15.3.0-canary.19",
"@octokit/graphql": "^8.2.1", "@octokit/graphql": "^8.2.1",
"@octokit/graphql-schema": "^15.26.0", "@octokit/graphql-schema": "^15.26.0",
"@prisma/client": "^6.5.0", "@prisma/client": "^6.5.0",
@ -37,10 +37,10 @@
"fast-glob": "^3.3.3", "fast-glob": "^3.3.3",
"feed": "^4.2.2", "feed": "^4.2.2",
"geist": "^1.3.1", "geist": "^1.3.1",
"html-entities": "^2.5.2", "html-entities": "^2.5.3",
"lucide-react": "0.483.0", "lucide-react": "0.483.0",
"modern-normalize": "^3.0.1", "modern-normalize": "^3.0.1",
"next": "15.3.0-canary.17", "next": "15.3.0-canary.19",
"obj-str": "^1.1.0", "obj-str": "^1.1.0",
"polished": "^4.3.1", "polished": "^4.3.1",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
@ -51,6 +51,7 @@
"react-is": "19.0.0", "react-is": "19.0.0",
"react-schemaorg": "^2.0.0", "react-schemaorg": "^2.0.0",
"react-textarea-autosize": "^8.5.8", "react-textarea-autosize": "^8.5.8",
"react-timeago": "^8.0.0",
"react-turnstile": "^1.1.4", "react-turnstile": "^1.1.4",
"react-tweet": "^3.2.2", "react-tweet": "^3.2.2",
"rehype-mdx-import-media": "^1.2.0", "rehype-mdx-import-media": "^1.2.0",
@ -60,7 +61,7 @@
"remark-frontmatter": "^5.0.0", "remark-frontmatter": "^5.0.0",
"remark-gfm": "^4.0.1", "remark-gfm": "^4.0.1",
"remark-html": "^16.0.1", "remark-html": "^16.0.1",
"remark-mdx-frontmatter": "^5.0.0", "remark-mdx-frontmatter": "^5.1.0",
"remark-parse": "^11.0.0", "remark-parse": "^11.0.0",
"remark-smartypants": "^3.0.2", "remark-smartypants": "^3.0.2",
"resend": "^4.1.2", "resend": "^4.1.2",
@ -69,8 +70,8 @@
"zod": "^3.24.2" "zod": "^3.24.2"
}, },
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3.3.0", "@eslint/eslintrc": "^3.3.1",
"@eslint/js": "^9.22.0", "@eslint/js": "^9.23.0",
"@jakejarvis/eslint-config": "^4.0.7", "@jakejarvis/eslint-config": "^4.0.7",
"@types/comma-number": "^2.1.2", "@types/comma-number": "^2.1.2",
"@types/mdx": "^2.0.13", "@types/mdx": "^2.0.13",
@ -81,8 +82,8 @@
"@types/react-is": "^19.0.0", "@types/react-is": "^19.0.0",
"babel-plugin-react-compiler": "19.0.0-beta-3229e95-20250315", "babel-plugin-react-compiler": "19.0.0-beta-3229e95-20250315",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"eslint": "^9.22.0", "eslint": "^9.23.0",
"eslint-config-next": "15.3.0-canary.17", "eslint-config-next": "15.3.0-canary.19",
"eslint-config-prettier": "^10.1.1", "eslint-config-prettier": "^10.1.1",
"eslint-plugin-css-modules": "^2.12.0", "eslint-plugin-css-modules": "^2.12.0",
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.31.0",

387
pnpm-lock.yaml generated
View File

@ -27,14 +27,14 @@ importers:
specifier: ^3.1.0 specifier: ^3.1.0
version: 3.1.0(@types/react@19.0.12)(react@19.0.0) version: 3.1.0(@types/react@19.0.12)(react@19.0.0)
'@next/bundle-analyzer': '@next/bundle-analyzer':
specifier: 15.3.0-canary.17 specifier: 15.3.0-canary.19
version: 15.3.0-canary.17 version: 15.3.0-canary.19
'@next/mdx': '@next/mdx':
specifier: 15.3.0-canary.17 specifier: 15.3.0-canary.19
version: 15.3.0-canary.17(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0)) version: 15.3.0-canary.19(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0))
'@next/third-parties': '@next/third-parties':
specifier: 15.3.0-canary.17 specifier: 15.3.0-canary.19
version: 15.3.0-canary.17(next@15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) version: 15.3.0-canary.19(next@15.3.0-canary.19(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)
'@octokit/graphql': '@octokit/graphql':
specifier: ^8.2.1 specifier: ^8.2.1
version: 8.2.1 version: 8.2.1
@ -64,10 +64,10 @@ importers:
version: 4.2.2 version: 4.2.2
geist: geist:
specifier: ^1.3.1 specifier: ^1.3.1
version: 1.3.1(next@15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) version: 1.3.1(next@15.3.0-canary.19(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
html-entities: html-entities:
specifier: ^2.5.2 specifier: ^2.5.3
version: 2.5.2 version: 2.5.3
lucide-react: lucide-react:
specifier: 0.483.0 specifier: 0.483.0
version: 0.483.0(react@19.0.0) version: 0.483.0(react@19.0.0)
@ -75,8 +75,8 @@ importers:
specifier: ^3.0.1 specifier: ^3.0.1
version: 3.0.1 version: 3.0.1
next: next:
specifier: 15.3.0-canary.17 specifier: 15.3.0-canary.19
version: 15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) version: 15.3.0-canary.19(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
obj-str: obj-str:
specifier: ^1.1.0 specifier: ^1.1.0
version: 1.1.0 version: 1.1.0
@ -107,6 +107,9 @@ importers:
react-textarea-autosize: react-textarea-autosize:
specifier: ^8.5.8 specifier: ^8.5.8
version: 8.5.8(@types/react@19.0.12)(react@19.0.0) version: 8.5.8(@types/react@19.0.12)(react@19.0.0)
react-timeago:
specifier: ^8.0.0
version: 8.0.0(react@19.0.0)
react-turnstile: react-turnstile:
specifier: ^1.1.4 specifier: ^1.1.4
version: 1.1.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) version: 1.1.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@ -135,8 +138,8 @@ importers:
specifier: ^16.0.1 specifier: ^16.0.1
version: 16.0.1 version: 16.0.1
remark-mdx-frontmatter: remark-mdx-frontmatter:
specifier: ^5.0.0 specifier: ^5.1.0
version: 5.0.0 version: 5.1.0
remark-parse: remark-parse:
specifier: ^11.0.0 specifier: ^11.0.0
version: 11.0.0 version: 11.0.0
@ -157,14 +160,14 @@ importers:
version: 3.24.2 version: 3.24.2
devDependencies: devDependencies:
'@eslint/eslintrc': '@eslint/eslintrc':
specifier: ^3.3.0 specifier: ^3.3.1
version: 3.3.0 version: 3.3.1
'@eslint/js': '@eslint/js':
specifier: ^9.22.0 specifier: ^9.23.0
version: 9.22.0 version: 9.23.0
'@jakejarvis/eslint-config': '@jakejarvis/eslint-config':
specifier: ^4.0.7 specifier: ^4.0.7
version: 4.0.7(eslint@9.22.0) version: 4.0.7(eslint@9.23.0)
'@types/comma-number': '@types/comma-number':
specifier: ^2.1.2 specifier: ^2.1.2
version: 2.1.2 version: 2.1.2
@ -193,38 +196,38 @@ importers:
specifier: ^7.0.3 specifier: ^7.0.3
version: 7.0.3 version: 7.0.3
eslint: eslint:
specifier: ^9.22.0 specifier: ^9.23.0
version: 9.22.0 version: 9.23.0
eslint-config-next: eslint-config-next:
specifier: 15.3.0-canary.17 specifier: 15.3.0-canary.19
version: 15.3.0-canary.17(eslint@9.22.0)(typescript@5.8.2) version: 15.3.0-canary.19(eslint@9.23.0)(typescript@5.8.2)
eslint-config-prettier: eslint-config-prettier:
specifier: ^10.1.1 specifier: ^10.1.1
version: 10.1.1(eslint@9.22.0) version: 10.1.1(eslint@9.23.0)
eslint-plugin-css-modules: eslint-plugin-css-modules:
specifier: ^2.12.0 specifier: ^2.12.0
version: 2.12.0(eslint@9.22.0) version: 2.12.0(eslint@9.23.0)
eslint-plugin-import: eslint-plugin-import:
specifier: ^2.31.0 specifier: ^2.31.0
version: 2.31.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.9.1)(eslint@9.22.0) version: 2.31.0(@typescript-eslint/parser@8.27.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.9.1)(eslint@9.23.0)
eslint-plugin-jsx-a11y: eslint-plugin-jsx-a11y:
specifier: ^6.10.2 specifier: ^6.10.2
version: 6.10.2(eslint@9.22.0) version: 6.10.2(eslint@9.23.0)
eslint-plugin-mdx: eslint-plugin-mdx:
specifier: ^3.2.0 specifier: ^3.2.0
version: 3.2.0(eslint@9.22.0) version: 3.2.0(eslint@9.23.0)
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: ^5.2.3 specifier: ^5.2.3
version: 5.2.3(eslint-config-prettier@10.1.1(eslint@9.22.0))(eslint@9.22.0)(prettier@3.5.3) version: 5.2.3(eslint-config-prettier@10.1.1(eslint@9.23.0))(eslint@9.23.0)(prettier@3.5.3)
eslint-plugin-react: eslint-plugin-react:
specifier: ^7.37.4 specifier: ^7.37.4
version: 7.37.4(eslint@9.22.0) version: 7.37.4(eslint@9.23.0)
eslint-plugin-react-compiler: eslint-plugin-react-compiler:
specifier: 19.0.0-beta-3229e95-20250315 specifier: 19.0.0-beta-3229e95-20250315
version: 19.0.0-beta-3229e95-20250315(eslint@9.22.0) version: 19.0.0-beta-3229e95-20250315(eslint@9.23.0)
eslint-plugin-react-hooks: eslint-plugin-react-hooks:
specifier: ^5.2.0 specifier: ^5.2.0
version: 5.2.0(eslint@9.22.0) version: 5.2.0(eslint@9.23.0)
lint-staged: lint-staged:
specifier: ^15.5.0 specifier: ^15.5.0
version: 15.5.0 version: 15.5.0
@ -584,20 +587,20 @@ packages:
resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/config-helpers@0.1.0': '@eslint/config-helpers@0.2.0':
resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==} resolution: {integrity: sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/core@0.12.0': '@eslint/core@0.12.0':
resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/eslintrc@3.3.0': '@eslint/eslintrc@3.3.1':
resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/js@9.22.0': '@eslint/js@9.23.0':
resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==} resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.6': '@eslint/object-schema@2.1.6':
@ -795,17 +798,17 @@ packages:
'@napi-rs/wasm-runtime@0.2.7': '@napi-rs/wasm-runtime@0.2.7':
resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==} resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==}
'@next/bundle-analyzer@15.3.0-canary.17': '@next/bundle-analyzer@15.3.0-canary.19':
resolution: {integrity: sha512-WyOWsIqFVthvkqgxRdli8OqnBz9xTDPhY0YUvBjjtH+52dOPoV6U2B/Cg9tyGe6KM3Nsy3iKZ4KNCCw2G8Bilg==} resolution: {integrity: sha512-iql8r+ch9fIqjmwBrJzw07kCVKIkGwS+UQBKJ53EBsNC8fhuA5QjYhxkR8GDMOyIlOHXVCK11JG6fq3mwUMb3Q==}
'@next/env@15.3.0-canary.17': '@next/env@15.3.0-canary.19':
resolution: {integrity: sha512-i6ieFwiZAvPUR0O7ojiUOQzhnxMH1LAjP3bLe8d0DqFKjKLFm3S/WwhVT4bskyFY2oI9FHCp3T1lc+2Ae43j7w==} resolution: {integrity: sha512-sV1GYx3sxpyXRPhkQXdGi/XNFqq/ZlzpI8aYwC95+DQwpDL4r4uR9Hca4dH8v+LsaHQuvqyUaylA1ictJEGc/Q==}
'@next/eslint-plugin-next@15.3.0-canary.17': '@next/eslint-plugin-next@15.3.0-canary.19':
resolution: {integrity: sha512-x/1QkV8cYwqVqK715ahnVSkjT6EeBJNc3CSuKiPgG2ucnGfwVbMvSFF3WtqvpgLJW7Kz3xUlgWjakoTLxxUaWA==} resolution: {integrity: sha512-FvCznlWQV+Du2ImiuBX5UPyIJ++9d1/3qp4BwuL2R527Bl7AqEdOUAvpGxz44lEk8qJLEh5B0qkH5xsq0X3WrA==}
'@next/mdx@15.3.0-canary.17': '@next/mdx@15.3.0-canary.19':
resolution: {integrity: sha512-5+T4+9GAI3tUVVfpECGfXgCs8u1O29mx4/2px+Xr2m0qlZP3QG+oB9q7qpLAxIPfzSMkxYSIe62vjHjp1M5Feg==} resolution: {integrity: sha512-MKQbKmnTPcA+D6LCpy00GlliqGcXmbNuLMTULDPE6Mhq24+pgcyQKbf6M2UZVNGmu8Qbxrd8ILOcr7RmNFasBg==}
peerDependencies: peerDependencies:
'@mdx-js/loader': '>=0.15.0' '@mdx-js/loader': '>=0.15.0'
'@mdx-js/react': '>=0.15.0' '@mdx-js/react': '>=0.15.0'
@ -815,56 +818,56 @@ packages:
'@mdx-js/react': '@mdx-js/react':
optional: true optional: true
'@next/swc-darwin-arm64@15.3.0-canary.17': '@next/swc-darwin-arm64@15.3.0-canary.19':
resolution: {integrity: sha512-VcnuH8pzj9vT9w700t+fCA4DkF0mEjQdjRfoWbxz5ZLjry4/CcIBhyrsQ0CIIRJ6KeEyX2SQM3enETknUP1y7w==} resolution: {integrity: sha512-NhO7NswDPM/DxxbjMEdtGD8R8ubrfujabjcs6ztqFZC/O1jVUJ9DjReE3DSxLUID3Q0VrJLtimP3m+Nm0cc53w==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@next/swc-darwin-x64@15.3.0-canary.17': '@next/swc-darwin-x64@15.3.0-canary.19':
resolution: {integrity: sha512-K7J7kQOjki9zxaNAdx+lJlc9Ber5ltJGTD5Uvc8sOcOqT8jein+USyoOyBgy4zPqDjubYsytIDG2pJatijSYSg==} resolution: {integrity: sha512-cANV3R3Rdnif+S7eTMl2a7JtxWdQCGgRF9VmpOuw5lRtNHvzXf+NBB3Qb821JYBgjVD0k+QQoEuHH3gVBccj7Q==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@next/swc-linux-arm64-gnu@15.3.0-canary.17': '@next/swc-linux-arm64-gnu@15.3.0-canary.19':
resolution: {integrity: sha512-Q3Er1XvvsUmPm5VH9W/59Zxg+HZrQuzDAYWyvKK4jgJBRqy2v2ywejvcPZsYUyJnfrls+DcX8oqR7V+L1i9fmg==} resolution: {integrity: sha512-M4LqrhEZ6zbriRvlVg0GqdLRzbLRYnE5y1NfBDpcTSc9M5i/sNgKzrbhW+NmzPbH9awqQJZepjUsJSSO7V9QKw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@next/swc-linux-arm64-musl@15.3.0-canary.17': '@next/swc-linux-arm64-musl@15.3.0-canary.19':
resolution: {integrity: sha512-ewJuZxqF49l3qSRiDOZUmK3yw0tS3xZ9F4szEAPa5as1/SH+Mfog6Q9+5mjfBXRJEpP//jXmvLlfbJlnK8Sxpg==} resolution: {integrity: sha512-jkIgnfsjicmDIg6lC+PUUJjQhTY/JZm+U8cn0imZF+nupCnh21Sgu3RSFMJEKLzpPx23TYo3UZBsbiU8NOVhmQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@next/swc-linux-x64-gnu@15.3.0-canary.17': '@next/swc-linux-x64-gnu@15.3.0-canary.19':
resolution: {integrity: sha512-aGW3iyeaEUyF3oHZsq92QZ49PTmz7LA+HhkjEPjbGhQXyPRKljnMTjt9ORGvRpre1wDvhEBe+9NOdQvqQV6Qhg==} resolution: {integrity: sha512-qepbgJYOmAfhF3Ba1dKsCCc19tBc8vdTicbS88dquSBIhmY29vYKZeG+UeSGmsz4FpR49K6nnxhVvc/Viyr2uQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@next/swc-linux-x64-musl@15.3.0-canary.17': '@next/swc-linux-x64-musl@15.3.0-canary.19':
resolution: {integrity: sha512-MEF13N9vDvdZ513Aeecjk/09ewvQN5HaU7bKc4v1CjL+QTJLnr+LkVXWBatMO9hLVvL73VIGJFjXhfwa3YfdBQ==} resolution: {integrity: sha512-fNTuuVeZwtLz8keX95GogGI52/6AbEyxBeZCi3GxqnwPmNXrVDBOBWqGsysoee7JYJoHZhXVOD9YLjXvlr5a1g==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@next/swc-win32-arm64-msvc@15.3.0-canary.17': '@next/swc-win32-arm64-msvc@15.3.0-canary.19':
resolution: {integrity: sha512-QVc6WKSaMO47Vpc7AnYTXGVq4d/OWlAtgzNVNjX0NVlpWKBUUKsQQCGOFJzx2fP4pZwRV9+HC+65FKc3/H+pwA==} resolution: {integrity: sha512-gDDg6bjkPsuCjzGzZ116ryQzS+4CqvyhrhJit0l6U921LZqUNAs7c3QvH4A2yZ54q/Nwg2JFfaVmAJzdRUCA9g==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@next/swc-win32-x64-msvc@15.3.0-canary.17': '@next/swc-win32-x64-msvc@15.3.0-canary.19':
resolution: {integrity: sha512-ctmA1bWo/LuA0zP0luoIA1BUNPZmyWWn14nTgI/2Iv6B3CgFJZSWnU3RN8n9RNalX0Pqcfe7jlhBMCExjAOsFA==} resolution: {integrity: sha512-Ohq6ipeeeYRA5wyIKj/wLJ5vQYjeJReKiJ68BaiCew1bopvi6Yljr5czfGlY44/t3QNnaLDHs6Tz4heoAVY+0g==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@next/third-parties@15.3.0-canary.17': '@next/third-parties@15.3.0-canary.19':
resolution: {integrity: sha512-aZhAZJ/tqVeetFI6B4oGy7BdGUJxLHawdxUnv6xqJaAa/dYHzFXSN/rWPxdxhpHLIVVirOg7Sl618TyUL+sWNg==} resolution: {integrity: sha512-vyu3YdXuNGr8Q4MROFc4UORBAXurYusZLzYQvBT9QKMasP6C+bcyu8uBqdm5AZjZGzhZ5PmRMWILicbhhjtZiA==}
peerDependencies: peerDependencies:
next: ^13.0.0 || ^14.0.0 || ^15.0.0 next: ^13.0.0 || ^14.0.0 || ^15.0.0
react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
@ -941,8 +944,8 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'} engines: {node: '>=14'}
'@pkgr/core@0.1.1': '@pkgr/core@0.1.2':
resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} resolution: {integrity: sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==}
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
'@polka/url@1.0.0-next.28': '@polka/url@1.0.0-next.28':
@ -1376,8 +1379,8 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'} engines: {node: '>=6'}
caniuse-lite@1.0.30001706: caniuse-lite@1.0.30001707:
resolution: {integrity: sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==} resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==}
ccount@2.0.1: ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
@ -1619,8 +1622,8 @@ packages:
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
electron-to-chromium@1.5.122: electron-to-chromium@1.5.123:
resolution: {integrity: sha512-EML1wnwkY5MFh/xUnCvY8FrhUuKzdYhowuZExZOfwJo+Zu9OsNCI23Cgl5y7awy7HrUHSwB1Z8pZX5TI34lsUg==} resolution: {integrity: sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==}
emoji-regex-xs@1.0.0: emoji-regex-xs@1.0.0:
resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==}
@ -1712,8 +1715,8 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'} engines: {node: '>=12'}
eslint-config-next@15.3.0-canary.17: eslint-config-next@15.3.0-canary.19:
resolution: {integrity: sha512-vA/gCvVCfGUg28MUfsPL3aMJ+wzK3OXW1zmFRHC7bFLkXjyPL3g6mSCLYAFYXRkXkbl13qmoDIknkL4rQsDzNQ==} resolution: {integrity: sha512-slpbC0jkvQNyugmlqXjQmyiaPzIseeZPX3OBuUI4rGN7VsB18NvuJz9keKkq/MtJsMz5V0Pmxc7b1yugLyzxfw==}
peerDependencies: peerDependencies:
eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
typescript: '>=3.3.1' typescript: '>=3.3.1'
@ -1842,8 +1845,8 @@ packages:
resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@9.22.0: eslint@9.23.0:
resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==} resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -2198,8 +2201,8 @@ packages:
resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
engines: {node: ^16.14.0 || >=18.0.0} engines: {node: ^16.14.0 || >=18.0.0}
html-entities@2.5.2: html-entities@2.5.3:
resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} resolution: {integrity: sha512-D3AfvN7SjhTgBSA8L1BN4FpPzuEd06uy4lHwSoRWr0lndi9BKaNzPLKGOWZ2ocSGguozr08TTb2jhCLHaemruw==}
html-escaper@2.0.2: html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
@ -2820,8 +2823,8 @@ packages:
natural-compare@1.4.0: natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
next@15.3.0-canary.17: next@15.3.0-canary.19:
resolution: {integrity: sha512-uTQPf+80W7n4ZZIStulH2NtXd7fvoWNNbBIXZrnhNXm0BYe9Vhuc2Ov8GS5NezRGZ7ifJdjND9Da+S1u8qdiAw==} resolution: {integrity: sha512-rqDzGQGdIWaM82gFS+X/DlBppxaRVMG9+eJuPdDjJSX73Y+Mf2RJFke/GkwS0+WxVZ11KxzLGfOjx+0oQEaXVw==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -3154,6 +3157,11 @@ packages:
peerDependencies: peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-timeago@8.0.0:
resolution: {integrity: sha512-I/Lsewkw87xryZVXU8mv8o2lsnxTd7uHBJF9fl76vRx/GkAFNctgSg9q0hOKvgv9V6cTXmDiuXJJYyblD4kGRA==}
peerDependencies:
react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-turnstile@1.1.4: react-turnstile@1.1.4:
resolution: {integrity: sha512-oluyRWADdsufCt5eMqacW4gfw8/csr6Tk+fmuaMx0PWMKP1SX1iCviLvD2D5w92eAzIYDHi/krUWGHhlfzxTpQ==} resolution: {integrity: sha512-oluyRWADdsufCt5eMqacW4gfw8/csr6Tk+fmuaMx0PWMKP1SX1iCviLvD2D5w92eAzIYDHi/krUWGHhlfzxTpQ==}
peerDependencies: peerDependencies:
@ -3240,8 +3248,8 @@ packages:
remark-html@16.0.1: remark-html@16.0.1:
resolution: {integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==} resolution: {integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==}
remark-mdx-frontmatter@5.0.0: remark-mdx-frontmatter@5.1.0:
resolution: {integrity: sha512-kI75pshe27TM71R+0iX7C3p4MbGMdygkvSbrk1WYSar88WAwR2JfQilofcDGgDNFAWUo5IwTPyq9XvGpifTwqQ==} resolution: {integrity: sha512-F2l+FydK/QVwYMC4niMYl4Kh83TIfoR4qV9ekh/riWRakTTyjcLLyKTBo9fVgEtOmTEfIrqWwiYIm42+I5PMfQ==}
remark-mdx@3.1.0: remark-mdx@3.1.0:
resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==}
@ -3702,6 +3710,9 @@ packages:
unist-util-is@6.0.0: unist-util-is@6.0.0:
resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
unist-util-mdx-define@1.1.1:
resolution: {integrity: sha512-wW3Uq+92zHTCoJRVWBWr4KHMpkOIHMVZ5kyU/HVV4l1UMl6j2Vs6P+uj8tFMUk9QoA3wR/7wOVD23Cx77dXXoA==}
unist-util-modify-children@4.0.0: unist-util-modify-children@4.0.0:
resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==}
@ -4180,9 +4191,9 @@ snapshots:
'@esbuild/win32-x64@0.25.1': '@esbuild/win32-x64@0.25.1':
optional: true optional: true
'@eslint-community/eslint-utils@4.5.1(eslint@9.22.0)': '@eslint-community/eslint-utils@4.5.1(eslint@9.23.0)':
dependencies: dependencies:
eslint: 9.22.0 eslint: 9.23.0
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.1': {} '@eslint-community/regexpp@4.12.1': {}
@ -4195,13 +4206,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint/config-helpers@0.1.0': {} '@eslint/config-helpers@0.2.0': {}
'@eslint/core@0.12.0': '@eslint/core@0.12.0':
dependencies: dependencies:
'@types/json-schema': 7.0.15 '@types/json-schema': 7.0.15
'@eslint/eslintrc@3.3.0': '@eslint/eslintrc@3.3.1':
dependencies: dependencies:
ajv: 6.12.6 ajv: 6.12.6
debug: 4.4.0 debug: 4.4.0
@ -4215,7 +4226,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint/js@9.22.0': {} '@eslint/js@9.23.0': {}
'@eslint/object-schema@2.1.6': {} '@eslint/object-schema@2.1.6': {}
@ -4327,9 +4338,9 @@ snapshots:
wrap-ansi: 8.1.0 wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0 wrap-ansi-cjs: wrap-ansi@7.0.0
'@jakejarvis/eslint-config@4.0.7(eslint@9.22.0)': '@jakejarvis/eslint-config@4.0.7(eslint@9.23.0)':
dependencies: dependencies:
eslint: 9.22.0 eslint: 9.23.0
'@jridgewell/gen-mapping@0.3.8': '@jridgewell/gen-mapping@0.3.8':
dependencies: dependencies:
@ -4409,53 +4420,53 @@ snapshots:
'@tybys/wasm-util': 0.9.0 '@tybys/wasm-util': 0.9.0
optional: true optional: true
'@next/bundle-analyzer@15.3.0-canary.17': '@next/bundle-analyzer@15.3.0-canary.19':
dependencies: dependencies:
webpack-bundle-analyzer: 4.10.1 webpack-bundle-analyzer: 4.10.1
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
- utf-8-validate - utf-8-validate
'@next/env@15.3.0-canary.17': {} '@next/env@15.3.0-canary.19': {}
'@next/eslint-plugin-next@15.3.0-canary.17': '@next/eslint-plugin-next@15.3.0-canary.19':
dependencies: dependencies:
fast-glob: 3.3.1 fast-glob: 3.3.1
'@next/mdx@15.3.0-canary.17(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0))': '@next/mdx@15.3.0-canary.19(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0))':
dependencies: dependencies:
source-map: 0.7.4 source-map: 0.7.4
optionalDependencies: optionalDependencies:
'@mdx-js/loader': 3.1.0(acorn@8.14.1) '@mdx-js/loader': 3.1.0(acorn@8.14.1)
'@mdx-js/react': 3.1.0(@types/react@19.0.12)(react@19.0.0) '@mdx-js/react': 3.1.0(@types/react@19.0.12)(react@19.0.0)
'@next/swc-darwin-arm64@15.3.0-canary.17': '@next/swc-darwin-arm64@15.3.0-canary.19':
optional: true optional: true
'@next/swc-darwin-x64@15.3.0-canary.17': '@next/swc-darwin-x64@15.3.0-canary.19':
optional: true optional: true
'@next/swc-linux-arm64-gnu@15.3.0-canary.17': '@next/swc-linux-arm64-gnu@15.3.0-canary.19':
optional: true optional: true
'@next/swc-linux-arm64-musl@15.3.0-canary.17': '@next/swc-linux-arm64-musl@15.3.0-canary.19':
optional: true optional: true
'@next/swc-linux-x64-gnu@15.3.0-canary.17': '@next/swc-linux-x64-gnu@15.3.0-canary.19':
optional: true optional: true
'@next/swc-linux-x64-musl@15.3.0-canary.17': '@next/swc-linux-x64-musl@15.3.0-canary.19':
optional: true optional: true
'@next/swc-win32-arm64-msvc@15.3.0-canary.17': '@next/swc-win32-arm64-msvc@15.3.0-canary.19':
optional: true optional: true
'@next/swc-win32-x64-msvc@15.3.0-canary.17': '@next/swc-win32-x64-msvc@15.3.0-canary.19':
optional: true optional: true
'@next/third-parties@15.3.0-canary.17(next@15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)': '@next/third-parties@15.3.0-canary.19(next@15.3.0-canary.19(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)':
dependencies: dependencies:
next: 15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: 15.3.0-canary.19(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react: 19.0.0 react: 19.0.0
third-party-capital: 1.0.20 third-party-capital: 1.0.20
@ -4564,7 +4575,7 @@ snapshots:
'@pkgjs/parseargs@0.11.0': '@pkgjs/parseargs@0.11.0':
optional: true optional: true
'@pkgr/core@0.1.1': {} '@pkgr/core@0.1.2': {}
'@polka/url@1.0.0-next.28': {} '@polka/url@1.0.0-next.28': {}
@ -4730,15 +4741,15 @@ snapshots:
'@types/unist@3.0.3': {} '@types/unist@3.0.3': {}
'@typescript-eslint/eslint-plugin@8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)': '@typescript-eslint/eslint-plugin@8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.1 '@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.27.0(eslint@9.22.0)(typescript@5.8.2) '@typescript-eslint/parser': 8.27.0(eslint@9.23.0)(typescript@5.8.2)
'@typescript-eslint/scope-manager': 8.27.0 '@typescript-eslint/scope-manager': 8.27.0
'@typescript-eslint/type-utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) '@typescript-eslint/type-utils': 8.27.0(eslint@9.23.0)(typescript@5.8.2)
'@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) '@typescript-eslint/utils': 8.27.0(eslint@9.23.0)(typescript@5.8.2)
'@typescript-eslint/visitor-keys': 8.27.0 '@typescript-eslint/visitor-keys': 8.27.0
eslint: 9.22.0 eslint: 9.23.0
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.2 ignore: 5.3.2
natural-compare: 1.4.0 natural-compare: 1.4.0
@ -4747,14 +4758,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2)': '@typescript-eslint/parser@8.27.0(eslint@9.23.0)(typescript@5.8.2)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.27.0 '@typescript-eslint/scope-manager': 8.27.0
'@typescript-eslint/types': 8.27.0 '@typescript-eslint/types': 8.27.0
'@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2) '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2)
'@typescript-eslint/visitor-keys': 8.27.0 '@typescript-eslint/visitor-keys': 8.27.0
debug: 4.4.0 debug: 4.4.0
eslint: 9.22.0 eslint: 9.23.0
typescript: 5.8.2 typescript: 5.8.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -4764,12 +4775,12 @@ snapshots:
'@typescript-eslint/types': 8.27.0 '@typescript-eslint/types': 8.27.0
'@typescript-eslint/visitor-keys': 8.27.0 '@typescript-eslint/visitor-keys': 8.27.0
'@typescript-eslint/type-utils@8.27.0(eslint@9.22.0)(typescript@5.8.2)': '@typescript-eslint/type-utils@8.27.0(eslint@9.23.0)(typescript@5.8.2)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2) '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2)
'@typescript-eslint/utils': 8.27.0(eslint@9.22.0)(typescript@5.8.2) '@typescript-eslint/utils': 8.27.0(eslint@9.23.0)(typescript@5.8.2)
debug: 4.4.0 debug: 4.4.0
eslint: 9.22.0 eslint: 9.23.0
ts-api-utils: 2.1.0(typescript@5.8.2) ts-api-utils: 2.1.0(typescript@5.8.2)
typescript: 5.8.2 typescript: 5.8.2
transitivePeerDependencies: transitivePeerDependencies:
@ -4791,13 +4802,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.27.0(eslint@9.22.0)(typescript@5.8.2)': '@typescript-eslint/utils@8.27.0(eslint@9.23.0)(typescript@5.8.2)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0) '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0)
'@typescript-eslint/scope-manager': 8.27.0 '@typescript-eslint/scope-manager': 8.27.0
'@typescript-eslint/types': 8.27.0 '@typescript-eslint/types': 8.27.0
'@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2) '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2)
eslint: 9.22.0 eslint: 9.23.0
typescript: 5.8.2 typescript: 5.8.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -5000,8 +5011,8 @@ snapshots:
browserslist@4.24.4: browserslist@4.24.4:
dependencies: dependencies:
caniuse-lite: 1.0.30001706 caniuse-lite: 1.0.30001707
electron-to-chromium: 1.5.122 electron-to-chromium: 1.5.123
node-releases: 2.0.19 node-releases: 2.0.19
update-browserslist-db: 1.1.3(browserslist@4.24.4) update-browserslist-db: 1.1.3(browserslist@4.24.4)
@ -5040,7 +5051,7 @@ snapshots:
callsites@3.1.0: {} callsites@3.1.0: {}
caniuse-lite@1.0.30001706: {} caniuse-lite@1.0.30001707: {}
ccount@2.0.1: {} ccount@2.0.1: {}
@ -5264,7 +5275,7 @@ snapshots:
minimatch: 9.0.1 minimatch: 9.0.1
semver: 7.7.1 semver: 7.7.1
electron-to-chromium@1.5.122: {} electron-to-chromium@1.5.123: {}
emoji-regex-xs@1.0.0: {} emoji-regex-xs@1.0.0: {}
@ -5439,19 +5450,19 @@ snapshots:
escape-string-regexp@5.0.0: {} escape-string-regexp@5.0.0: {}
eslint-config-next@15.3.0-canary.17(eslint@9.22.0)(typescript@5.8.2): eslint-config-next@15.3.0-canary.19(eslint@9.23.0)(typescript@5.8.2):
dependencies: dependencies:
'@next/eslint-plugin-next': 15.3.0-canary.17 '@next/eslint-plugin-next': 15.3.0-canary.19
'@rushstack/eslint-patch': 1.11.0 '@rushstack/eslint-patch': 1.11.0
'@typescript-eslint/eslint-plugin': 8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2) '@typescript-eslint/eslint-plugin': 8.27.0(@typescript-eslint/parser@8.27.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2)
'@typescript-eslint/parser': 8.27.0(eslint@9.22.0)(typescript@5.8.2) '@typescript-eslint/parser': 8.27.0(eslint@9.23.0)(typescript@5.8.2)
eslint: 9.22.0 eslint: 9.23.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.9.1(eslint-plugin-import@2.31.0)(eslint@9.22.0) eslint-import-resolver-typescript: 3.9.1(eslint-plugin-import@2.31.0)(eslint@9.23.0)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.9.1)(eslint@9.22.0) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.27.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.9.1)(eslint@9.23.0)
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.22.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.23.0)
eslint-plugin-react: 7.37.4(eslint@9.22.0) eslint-plugin-react: 7.37.4(eslint@9.23.0)
eslint-plugin-react-hooks: 5.2.0(eslint@9.22.0) eslint-plugin-react-hooks: 5.2.0(eslint@9.23.0)
optionalDependencies: optionalDependencies:
typescript: 5.8.2 typescript: 5.8.2
transitivePeerDependencies: transitivePeerDependencies:
@ -5459,9 +5470,9 @@ snapshots:
- eslint-plugin-import-x - eslint-plugin-import-x
- supports-color - supports-color
eslint-config-prettier@10.1.1(eslint@9.22.0): eslint-config-prettier@10.1.1(eslint@9.23.0):
dependencies: dependencies:
eslint: 9.22.0 eslint: 9.23.0
eslint-import-resolver-node@0.3.9: eslint-import-resolver-node@0.3.9:
dependencies: dependencies:
@ -5471,26 +5482,26 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.31.0)(eslint@9.22.0): eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.31.0)(eslint@9.23.0):
dependencies: dependencies:
'@nolyfill/is-core-module': 1.0.39 '@nolyfill/is-core-module': 1.0.39
debug: 4.4.0 debug: 4.4.0
eslint: 9.22.0 eslint: 9.23.0
get-tsconfig: 4.10.0 get-tsconfig: 4.10.0
is-bun-module: 1.3.0 is-bun-module: 1.3.0
rspack-resolver: 1.2.2 rspack-resolver: 1.2.2
stable-hash: 0.0.5 stable-hash: 0.0.5
tinyglobby: 0.2.12 tinyglobby: 0.2.12
optionalDependencies: optionalDependencies:
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.9.1)(eslint@9.22.0) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.27.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.9.1)(eslint@9.23.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-mdx@3.2.0(eslint@9.22.0): eslint-mdx@3.2.0(eslint@9.23.0):
dependencies: dependencies:
acorn: 8.14.1 acorn: 8.14.1
acorn-jsx: 5.3.2(acorn@8.14.1) acorn-jsx: 5.3.2(acorn@8.14.1)
eslint: 9.22.0 eslint: 9.23.0
espree: 9.6.1 espree: 9.6.1
estree-util-visit: 2.0.0 estree-util-visit: 2.0.0
remark-mdx: 3.1.0 remark-mdx: 3.1.0
@ -5507,24 +5518,24 @@ snapshots:
- bluebird - bluebird
- supports-color - supports-color
eslint-module-utils@2.12.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.1)(eslint@9.22.0): eslint-module-utils@2.12.0(@typescript-eslint/parser@8.27.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.1)(eslint@9.23.0):
dependencies: dependencies:
debug: 3.2.7 debug: 3.2.7
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.27.0(eslint@9.22.0)(typescript@5.8.2) '@typescript-eslint/parser': 8.27.0(eslint@9.23.0)(typescript@5.8.2)
eslint: 9.22.0 eslint: 9.23.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.9.1(eslint-plugin-import@2.31.0)(eslint@9.22.0) eslint-import-resolver-typescript: 3.9.1(eslint-plugin-import@2.31.0)(eslint@9.23.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-css-modules@2.12.0(eslint@9.22.0): eslint-plugin-css-modules@2.12.0(eslint@9.23.0):
dependencies: dependencies:
eslint: 9.22.0 eslint: 9.23.0
gonzales-pe: 4.3.0 gonzales-pe: 4.3.0
lodash: 4.17.21 lodash: 4.17.21
eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.9.1)(eslint@9.22.0): eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.27.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.9.1)(eslint@9.23.0):
dependencies: dependencies:
'@rtsao/scc': 1.1.0 '@rtsao/scc': 1.1.0
array-includes: 3.1.8 array-includes: 3.1.8
@ -5533,9 +5544,9 @@ snapshots:
array.prototype.flatmap: 1.3.3 array.prototype.flatmap: 1.3.3
debug: 3.2.7 debug: 3.2.7
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 9.22.0 eslint: 9.23.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.27.0(eslint@9.22.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.1)(eslint@9.22.0) eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.27.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.1)(eslint@9.23.0)
hasown: 2.0.2 hasown: 2.0.2
is-core-module: 2.16.1 is-core-module: 2.16.1
is-glob: 4.0.3 is-glob: 4.0.3
@ -5547,13 +5558,13 @@ snapshots:
string.prototype.trimend: 1.0.9 string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0 tsconfig-paths: 3.15.0
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.27.0(eslint@9.22.0)(typescript@5.8.2) '@typescript-eslint/parser': 8.27.0(eslint@9.23.0)(typescript@5.8.2)
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-typescript - eslint-import-resolver-typescript
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
- supports-color - supports-color
eslint-plugin-jsx-a11y@6.10.2(eslint@9.22.0): eslint-plugin-jsx-a11y@6.10.2(eslint@9.23.0):
dependencies: dependencies:
aria-query: 5.3.2 aria-query: 5.3.2
array-includes: 3.1.8 array-includes: 3.1.8
@ -5563,7 +5574,7 @@ snapshots:
axobject-query: 4.1.0 axobject-query: 4.1.0
damerau-levenshtein: 1.0.8 damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2 emoji-regex: 9.2.2
eslint: 9.22.0 eslint: 9.23.0
hasown: 2.0.2 hasown: 2.0.2
jsx-ast-utils: 3.3.5 jsx-ast-utils: 3.3.5
language-tags: 1.0.9 language-tags: 1.0.9
@ -5572,10 +5583,10 @@ snapshots:
safe-regex-test: 1.1.0 safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1 string.prototype.includes: 2.0.1
eslint-plugin-mdx@3.2.0(eslint@9.22.0): eslint-plugin-mdx@3.2.0(eslint@9.23.0):
dependencies: dependencies:
eslint: 9.22.0 eslint: 9.23.0
eslint-mdx: 3.2.0(eslint@9.22.0) eslint-mdx: 3.2.0(eslint@9.23.0)
mdast-util-from-markdown: 2.0.2 mdast-util-from-markdown: 2.0.2
remark-mdx: 3.1.0 remark-mdx: 3.1.0
remark-parse: 11.0.0 remark-parse: 11.0.0
@ -5588,32 +5599,32 @@ snapshots:
- bluebird - bluebird
- supports-color - supports-color
eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.1.1(eslint@9.22.0))(eslint@9.22.0)(prettier@3.5.3): eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.1.1(eslint@9.23.0))(eslint@9.23.0)(prettier@3.5.3):
dependencies: dependencies:
eslint: 9.22.0 eslint: 9.23.0
prettier: 3.5.3 prettier: 3.5.3
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.0
synckit: 0.9.2 synckit: 0.9.2
optionalDependencies: optionalDependencies:
eslint-config-prettier: 10.1.1(eslint@9.22.0) eslint-config-prettier: 10.1.1(eslint@9.23.0)
eslint-plugin-react-compiler@19.0.0-beta-3229e95-20250315(eslint@9.22.0): eslint-plugin-react-compiler@19.0.0-beta-3229e95-20250315(eslint@9.23.0):
dependencies: dependencies:
'@babel/core': 7.26.10 '@babel/core': 7.26.10
'@babel/parser': 7.26.10 '@babel/parser': 7.26.10
'@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.10) '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.10)
eslint: 9.22.0 eslint: 9.23.0
hermes-parser: 0.25.1 hermes-parser: 0.25.1
zod: 3.24.2 zod: 3.24.2
zod-validation-error: 3.4.0(zod@3.24.2) zod-validation-error: 3.4.0(zod@3.24.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-react-hooks@5.2.0(eslint@9.22.0): eslint-plugin-react-hooks@5.2.0(eslint@9.23.0):
dependencies: dependencies:
eslint: 9.22.0 eslint: 9.23.0
eslint-plugin-react@7.37.4(eslint@9.22.0): eslint-plugin-react@7.37.4(eslint@9.23.0):
dependencies: dependencies:
array-includes: 3.1.8 array-includes: 3.1.8
array.prototype.findlast: 1.2.5 array.prototype.findlast: 1.2.5
@ -5621,7 +5632,7 @@ snapshots:
array.prototype.tosorted: 1.1.4 array.prototype.tosorted: 1.1.4
doctrine: 2.1.0 doctrine: 2.1.0
es-iterator-helpers: 1.2.1 es-iterator-helpers: 1.2.1
eslint: 9.22.0 eslint: 9.23.0
estraverse: 5.3.0 estraverse: 5.3.0
hasown: 2.0.2 hasown: 2.0.2
jsx-ast-utils: 3.3.5 jsx-ast-utils: 3.3.5
@ -5644,15 +5655,15 @@ snapshots:
eslint-visitor-keys@4.2.0: {} eslint-visitor-keys@4.2.0: {}
eslint@9.22.0: eslint@9.23.0:
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0) '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0)
'@eslint-community/regexpp': 4.12.1 '@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.19.2 '@eslint/config-array': 0.19.2
'@eslint/config-helpers': 0.1.0 '@eslint/config-helpers': 0.2.0
'@eslint/core': 0.12.0 '@eslint/core': 0.12.0
'@eslint/eslintrc': 3.3.0 '@eslint/eslintrc': 3.3.1
'@eslint/js': 9.22.0 '@eslint/js': 9.23.0
'@eslint/plugin-kit': 0.2.7 '@eslint/plugin-kit': 0.2.7
'@humanfs/node': 0.16.6 '@humanfs/node': 0.16.6
'@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/module-importer': 1.0.1
@ -5866,9 +5877,9 @@ snapshots:
functions-have-names@1.2.3: {} functions-have-names@1.2.3: {}
geist@1.3.1(next@15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)): geist@1.3.1(next@15.3.0-canary.19(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)):
dependencies: dependencies:
next: 15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: 15.3.0-canary.19(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
gensync@1.0.0-beta.2: {} gensync@1.0.0-beta.2: {}
@ -6137,7 +6148,7 @@ snapshots:
dependencies: dependencies:
lru-cache: 10.4.3 lru-cache: 10.4.3
html-entities@2.5.2: {} html-entities@2.5.3: {}
html-escaper@2.0.2: {} html-escaper@2.0.2: {}
@ -7015,26 +7026,26 @@ snapshots:
natural-compare@1.4.0: {} natural-compare@1.4.0: {}
next@15.3.0-canary.17(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): next@15.3.0-canary.19(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-3229e95-20250315)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies: dependencies:
'@next/env': 15.3.0-canary.17 '@next/env': 15.3.0-canary.19
'@swc/counter': 0.1.3 '@swc/counter': 0.1.3
'@swc/helpers': 0.5.15 '@swc/helpers': 0.5.15
busboy: 1.6.0 busboy: 1.6.0
caniuse-lite: 1.0.30001706 caniuse-lite: 1.0.30001707
postcss: 8.4.31 postcss: 8.4.31
react: 19.0.0 react: 19.0.0
react-dom: 19.0.0(react@19.0.0) react-dom: 19.0.0(react@19.0.0)
styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.0.0) styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.0.0)
optionalDependencies: optionalDependencies:
'@next/swc-darwin-arm64': 15.3.0-canary.17 '@next/swc-darwin-arm64': 15.3.0-canary.19
'@next/swc-darwin-x64': 15.3.0-canary.17 '@next/swc-darwin-x64': 15.3.0-canary.19
'@next/swc-linux-arm64-gnu': 15.3.0-canary.17 '@next/swc-linux-arm64-gnu': 15.3.0-canary.19
'@next/swc-linux-arm64-musl': 15.3.0-canary.17 '@next/swc-linux-arm64-musl': 15.3.0-canary.19
'@next/swc-linux-x64-gnu': 15.3.0-canary.17 '@next/swc-linux-x64-gnu': 15.3.0-canary.19
'@next/swc-linux-x64-musl': 15.3.0-canary.17 '@next/swc-linux-x64-musl': 15.3.0-canary.19
'@next/swc-win32-arm64-msvc': 15.3.0-canary.17 '@next/swc-win32-arm64-msvc': 15.3.0-canary.19
'@next/swc-win32-x64-msvc': 15.3.0-canary.17 '@next/swc-win32-x64-msvc': 15.3.0-canary.19
babel-plugin-react-compiler: 19.0.0-beta-3229e95-20250315 babel-plugin-react-compiler: 19.0.0-beta-3229e95-20250315
sharp: 0.33.5 sharp: 0.33.5
transitivePeerDependencies: transitivePeerDependencies:
@ -7360,6 +7371,10 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- '@types/react' - '@types/react'
react-timeago@8.0.0(react@19.0.0):
dependencies:
react: 19.0.0
react-turnstile@1.1.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): react-turnstile@1.1.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies: dependencies:
react: 19.0.0 react: 19.0.0
@ -7525,13 +7540,13 @@ snapshots:
mdast-util-to-hast: 13.2.0 mdast-util-to-hast: 13.2.0
unified: 11.0.5 unified: 11.0.5
remark-mdx-frontmatter@5.0.0: remark-mdx-frontmatter@5.1.0:
dependencies: dependencies:
'@types/mdast': 4.0.4 '@types/mdast': 4.0.4
estree-util-is-identifier-name: 3.0.0
estree-util-value-to-estree: 3.3.2 estree-util-value-to-estree: 3.3.2
toml: 3.0.0 toml: 3.0.0
unified: 11.0.5 unified: 11.0.5
unist-util-mdx-define: 1.1.1
yaml: 2.7.0 yaml: 2.7.0
remark-mdx@3.1.0: remark-mdx@3.1.0:
@ -8051,7 +8066,7 @@ snapshots:
synckit@0.9.2: synckit@0.9.2:
dependencies: dependencies:
'@pkgr/core': 0.1.1 '@pkgr/core': 0.1.2
tslib: 2.8.1 tslib: 2.8.1
table@6.9.0: table@6.9.0:
@ -8193,6 +8208,16 @@ snapshots:
dependencies: dependencies:
'@types/unist': 3.0.3 '@types/unist': 3.0.3
unist-util-mdx-define@1.1.1:
dependencies:
'@types/estree': 1.0.6
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
estree-util-is-identifier-name: 3.0.0
estree-util-scope: 1.0.0
estree-walker: 3.0.3
vfile: 6.0.3
unist-util-modify-children@4.0.0: unist-util-modify-children@4.0.0:
dependencies: dependencies:
'@types/unist': 3.0.3 '@types/unist': 3.0.3