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

backpedal a bit on caching

This commit is contained in:
Jake Jarvis 2025-04-08 09:38:44 -04:00
parent 53d6f57699
commit 30b6e02b83
Signed by: jake
SSH Key Fingerprint: SHA256:nCkvAjYA6XaSPUqc4TfbBQTpzr8Xj7ritg/sGInCdkc
17 changed files with 373 additions and 579 deletions

View File

@ -2,8 +2,9 @@ import { NextResponse } from "next/server";
import { unstable_cache as cache } from "next/cache"; import { unstable_cache as cache } from "next/cache";
import redis from "../../../lib/helpers/redis"; import redis from "../../../lib/helpers/redis";
export const GET = async (): Promise< // cache response from the db
NextResponse<{ const getData = cache(
async (): Promise<{
total: { total: {
hits: number; hits: number;
}; };
@ -11,10 +12,7 @@ export const GET = async (): Promise<
slug: string; slug: string;
hits: number; hits: number;
}>; }>;
}> }> => {
> => {
const { total, pages } = await cache(
async () => {
// get all keys (aka slugs) // get all keys (aka slugs)
const slugs = await redis.scan(0, { const slugs = await redis.scan(0, {
match: "hits:*", match: "hits:*",
@ -46,10 +44,10 @@ export const GET = async (): Promise<
}, },
undefined, undefined,
{ {
revalidate: 1800, // 30 minutes revalidate: 900, // 15 minutes
tags: ["hits"], tags: ["hits"],
} }
)(); );
return NextResponse.json({ total, pages }); export const GET = async (): Promise<NextResponse<Awaited<ReturnType<typeof getData>>>> =>
}; NextResponse.json(await getData());

122
app/contact/action.ts Normal file
View File

@ -0,0 +1,122 @@
"use server";
import { headers } from "next/headers";
import * as v from "valibot";
import { Resend } from "resend";
import * as config from "../../lib/config";
const ContactSchema = v.object({
// TODO: replace duplicate error messages with v.message() when released. see:
// https://valibot.dev/api/message/
// https://github.com/fabian-hiller/valibot/blob/main/library/src/methods/message/message.ts
name: v.pipe(v.string("Your name is required."), v.trim(), v.nonEmpty("Your name is required.")),
email: v.pipe(
v.string("Your email address is required."),
v.trim(),
v.nonEmpty("Your email address is required."),
v.email("Invalid email address.")
),
message: v.pipe(
v.string("A message is required."),
v.trim(),
v.nonEmpty("A message is required."),
v.minLength(10, "Your message must be at least 10 characters.")
),
"cf-turnstile-response": v.pipe(
// token wasn't submitted at _all_, most likely a direct POST request by a spam bot
v.string("Shoo, bot."),
// form submitted properly but token was missing, might be a forgetful human
v.nonEmpty("Just do the stinkin CAPTCHA, human! 🤖"),
// very rudimentary length check based on Cloudflare's docs
// https://developers.cloudflare.com/turnstile/troubleshooting/testing/
v.minLength("XXXX.DUMMY.TOKEN.XXXX".length),
// "A Turnstile token can have up to 2048 characters."
// https://developers.cloudflare.com/turnstile/get-started/server-side-validation/
v.maxLength(2048),
v.readonly()
),
});
export type ContactInput = v.InferInput<typeof ContactSchema>;
export type ContactState = {
success: boolean;
message: string;
errors?: v.FlatErrors<typeof ContactSchema>["nested"];
};
export const send = async (state: ContactState, payload: FormData): Promise<ContactState> => {
// TODO: remove after debugging why automated spam entries are causing 500 errors
console.debug("[contact form] received payload:", payload);
if (!process.env.RESEND_API_KEY) {
throw new Error("[contact form] 'RESEND_API_KEY' is not set.");
}
try {
const data = v.safeParse(ContactSchema, Object.fromEntries(payload));
if (!data.success) {
return {
success: false,
message: "Please make sure all fields are filled in.",
errors: v.flatten(data.issues).nested,
};
}
// try to get the client IP (for turnstile accuracy, not logging!) but no biggie if we can't
let remoteip;
try {
remoteip = (await headers()).get("x-forwarded-for");
} catch {} // eslint-disable-line no-empty
// validate captcha
const turnstileResponse = await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
secret: process.env.TURNSTILE_SECRET_KEY || "1x0000000000000000000000000000000AA",
response: data.output["cf-turnstile-response"],
remoteip,
}),
cache: "no-store",
});
if (!turnstileResponse || !turnstileResponse.ok) {
throw new Error(`[contact form] turnstile validation failed: ${turnstileResponse.status}`);
}
const turnstileData = (await turnstileResponse.json()) as { success: boolean };
if (!turnstileData.success) {
return {
success: false,
message: "Did you complete the CAPTCHA? (If you're human, that is...)",
};
}
if (!process.env.RESEND_FROM_EMAIL) {
// https://resend.com/docs/api-reference/emails/send-email
console.warn("[contact form] 'RESEND_FROM_EMAIL' is not set, falling back to onboarding@resend.dev.");
}
// send email
const resend = new Resend(process.env.RESEND_API_KEY!);
await resend.emails.send({
from: `${data.output.name} <${process.env.RESEND_FROM_EMAIL || "onboarding@resend.dev"}>`,
replyTo: `${data.output.name} <${data.output.email}>`,
to: [config.authorEmail],
subject: `[${config.siteName}] Contact Form Submission`,
text: data.output.message,
});
return { success: true, message: "Thanks! You should hear from me soon." };
} catch (error) {
console.error("[contact form] fatal error:", error);
return {
success: false,
message: "Internal server error. Please try again later or shoot me an email.",
};
}
};

View File

@ -6,16 +6,13 @@ import Turnstile from "react-turnstile";
import clsx from "clsx"; import clsx from "clsx";
import { CheckIcon, XIcon } from "lucide-react"; import { CheckIcon, XIcon } from "lucide-react";
import Link from "../../components/Link"; import Link from "../../components/Link";
import type { ContactInput, ContactState } from "./schema";
import { send, type ContactState, type ContactInput } from "./action";
import styles from "./form.module.css"; import styles from "./form.module.css";
const ContactForm = ({ const ContactForm = () => {
serverAction, const [formState, formAction, pending] = useActionState<ContactState, FormData>(send, {
}: {
serverAction: (state: ContactState, payload: FormData) => Promise<ContactState>;
}) => {
const [formState, formAction, pending] = useActionState<ContactState, FormData>(serverAction, {
success: false, success: false,
message: "", message: "",
}); });

View File

@ -1,13 +1,8 @@
import { headers } from "next/headers";
import * as v from "valibot";
import { Resend } from "resend";
import PageTitle from "../../components/PageTitle"; import PageTitle from "../../components/PageTitle";
import Link from "../../components/Link"; import Link from "../../components/Link";
import { addMetadata } from "../../lib/helpers/metadata"; import { addMetadata } from "../../lib/helpers/metadata";
import * as config from "../../lib/config";
import ContactForm from "./form"; import ContactForm from "./form";
import ContactSchema, { type ContactState } from "./schema";
export const metadata = addMetadata({ export const metadata = addMetadata({
title: "Contact Me", title: "Contact Me",
@ -17,84 +12,6 @@ export const metadata = addMetadata({
}, },
}); });
const send = async (state: ContactState, payload: FormData): Promise<ContactState> => {
"use server";
// TODO: remove after debugging why automated spam entries are causing 500 errors
console.debug("[contact form] received payload:", payload);
if (!process.env.RESEND_API_KEY) {
throw new Error("[contact form] 'RESEND_API_KEY' is not set.");
}
try {
const data = v.safeParse(ContactSchema, Object.fromEntries(payload));
if (!data.success) {
return {
success: false,
message: "Please make sure all fields are filled in.",
errors: v.flatten(data.issues).nested,
};
}
// try to get the client IP (for turnstile accuracy, not logging!) but no biggie if we can't
let remoteip;
try {
remoteip = (await headers()).get("x-forwarded-for");
} catch {} // eslint-disable-line no-empty
// validate captcha
const turnstileResponse = await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
secret: process.env.TURNSTILE_SECRET_KEY || "1x0000000000000000000000000000000AA",
response: data.output["cf-turnstile-response"],
remoteip,
}),
cache: "no-store",
});
if (!turnstileResponse || !turnstileResponse.ok) {
throw new Error(`[contact form] turnstile validation failed: ${turnstileResponse.status}`);
}
const turnstileData = (await turnstileResponse.json()) as { success: boolean };
if (!turnstileData.success) {
return {
success: false,
message: "Did you complete the CAPTCHA? (If you're human, that is...)",
};
}
if (!process.env.RESEND_FROM_EMAIL) {
// https://resend.com/docs/api-reference/emails/send-email
console.warn("[contact form] 'RESEND_FROM_EMAIL' is not set, falling back to onboarding@resend.dev.");
}
// send email
const resend = new Resend(process.env.RESEND_API_KEY!);
await resend.emails.send({
from: `${data.output.name} <${process.env.RESEND_FROM_EMAIL || "onboarding@resend.dev"}>`,
replyTo: `${data.output.name} <${data.output.email}>`,
to: [config.authorEmail],
subject: `[${config.siteName}] Contact Form Submission`,
text: data.output.message,
});
return { success: true, message: "Thanks! You should hear from me soon." };
} catch (error) {
console.error("[contact form] fatal error:", error);
return {
success: false,
message: "Internal server error. Please try again later or shoot me an email.",
};
}
};
const Page = () => { const Page = () => {
return ( return (
<div <div
@ -127,7 +44,7 @@ const Page = () => {
. .
</p> </p>
<ContactForm serverAction={send} /> <ContactForm />
</div> </div>
); );
}; };

View File

@ -1,43 +0,0 @@
import * as v from "valibot";
export const ContactSchema = v.object({
// TODO: replace duplicate error messages with v.message() when released. see:
// https://valibot.dev/api/message/
// https://github.com/fabian-hiller/valibot/blob/main/library/src/methods/message/message.ts
name: v.pipe(v.string("Your name is required."), v.trim(), v.nonEmpty("Your name is required.")),
email: v.pipe(
v.string("Your email address is required."),
v.trim(),
v.nonEmpty("Your email address is required."),
v.email("Invalid email address.")
),
message: v.pipe(
v.string("A message is required."),
v.trim(),
v.nonEmpty("A message is required."),
v.minLength(10, "Your message must be at least 10 characters.")
),
"cf-turnstile-response": v.pipe(
// token wasn't submitted at _all_, most likely a direct POST request by a spam bot
v.string("Shoo, bot."),
// form submitted properly but token was missing, might be a forgetful human
v.nonEmpty("Just do the stinkin CAPTCHA, human! 🤖"),
// very rudimentary length check based on Cloudflare's docs
// https://developers.cloudflare.com/turnstile/troubleshooting/testing/
v.minLength("XXXX.DUMMY.TOKEN.XXXX".length),
// "A Turnstile token can have up to 2048 characters."
// https://developers.cloudflare.com/turnstile/get-started/server-side-validation/
v.maxLength(2048),
v.readonly()
),
});
export type ContactInput = v.InferInput<typeof ContactSchema>;
export type ContactState = {
success: boolean;
message: string;
errors?: v.FlatErrors<typeof ContactSchema>["nested"];
};
export default ContactSchema;

View File

@ -1,3 +1,4 @@
import { NextResponse } from "next/server";
import { buildFeed } from "../../lib/helpers/build-feed"; import { buildFeed } from "../../lib/helpers/build-feed";
export const dynamic = "force-static"; export const dynamic = "force-static";
@ -5,7 +6,7 @@ export const dynamic = "force-static";
export const GET = async () => { export const GET = async () => {
const feed = await buildFeed(); const feed = await buildFeed();
return new Response(feed.atom1(), { return new NextResponse(feed.atom1(), {
headers: { headers: {
"content-type": "application/atom+xml; charset=utf-8", "content-type": "application/atom+xml; charset=utf-8",
}, },

View File

@ -1,3 +1,4 @@
import { NextResponse } from "next/server";
import { buildFeed } from "../../lib/helpers/build-feed"; import { buildFeed } from "../../lib/helpers/build-feed";
export const dynamic = "force-static"; export const dynamic = "force-static";
@ -5,7 +6,7 @@ export const dynamic = "force-static";
export const GET = async () => { export const GET = async () => {
const feed = await buildFeed(); const feed = await buildFeed();
return new Response(feed.rss2(), { return new NextResponse(feed.rss2(), {
headers: { headers: {
"content-type": "application/rss+xml; charset=utf-8", "content-type": "application/rss+xml; charset=utf-8",
}, },

View File

@ -1,6 +1,8 @@
import * as config from "../lib/config"; import * as config from "../lib/config";
import type { MetadataRoute } from "next"; import type { MetadataRoute } from "next";
export const dynamic = "force-static";
const manifest = (): MetadataRoute.Manifest => { const manifest = (): MetadataRoute.Manifest => {
return { return {
name: config.siteName, name: config.siteName,

View File

@ -1,3 +1,4 @@
import clsx from "clsx";
import hash from "@emotion/hash"; import hash from "@emotion/hash";
import { rgba } from "polished"; import { rgba } from "polished";
import { LockIcon } from "lucide-react"; import { LockIcon } from "lucide-react";
@ -9,16 +10,18 @@ import styles from "./page.module.css";
const Link = ({ const Link = ({
lightColor, lightColor,
darkColor, darkColor,
className,
children, children,
...rest ...rest
}: ComponentPropsWithoutRef<typeof UnstyledLink> & { }: ComponentPropsWithoutRef<typeof UnstyledLink> & {
lightColor: string; lightColor?: string;
darkColor: string; darkColor?: string;
}) => { }) => {
if (lightColor && darkColor) {
const uniqueId = hash(`${lightColor},${darkColor}`); const uniqueId = hash(`${lightColor},${darkColor}`);
return ( return (
<UnstyledLink className={`t_${uniqueId}`} {...rest}> <UnstyledLink className={clsx(`t_${uniqueId}`, className)} {...rest}>
{children} {children}
<style <style
@ -31,6 +34,13 @@ const Link = ({
</style> </style>
</UnstyledLink> </UnstyledLink>
); );
}
return (
<UnstyledLink className={className} {...rest}>
{children}
</UnstyledLink>
);
}; };
const Page = () => { const Page = () => {

View File

@ -36,7 +36,8 @@ const sitemap = async (): Promise<MetadataRoute.Sitemap> => {
}); });
}); });
(await getFrontMatter()).forEach((post) => { const frontmatter = await getFrontMatter();
frontmatter.forEach((post) => {
routes.push({ routes.push({
url: post.permalink, url: post.permalink,
// pull lastModified from front matter date // pull lastModified from front matter date

View File

@ -1,7 +1,7 @@
/* accessible invisibility stuff pulled from @reach/skip-nav: /* accessible invisibility stuff pulled from @reach/skip-nav:
https://github.com/reach/reach-ui/blob/main/packages/skip-nav/styles.css */ https://github.com/reach/reach-ui/blob/main/packages/skip-nav/styles.css */
.skipNav { .hidden {
border: 0; border: 0;
clip: rect(0 0 0 0); clip: rect(0 0 0 0);
height: 1px; height: 1px;
@ -12,7 +12,7 @@ https://github.com/reach/reach-ui/blob/main/packages/skip-nav/styles.css */
position: absolute; position: absolute;
} }
.skipNav:focus { .hidden:focus {
padding: 1rem; padding: 1rem;
position: fixed; position: fixed;
top: 10px; top: 10px;

View File

@ -4,7 +4,7 @@ const skipNavId = "skip-nav";
export const SkipToContentLink = () => { export const SkipToContentLink = () => {
return ( return (
<a href={`#${skipNavId}`} tabIndex={0} className={styles.skipNav}> <a href={`#${skipNavId}`} tabIndex={0} className={styles.hidden}>
Skip to content Skip to content
</a> </a>
); );

View File

@ -12,7 +12,7 @@ export type TweetProps = Omit<ComponentPropsWithoutRef<typeof EmbeddedTweet>, "t
className?: string; className?: string;
}; };
const fetchTweet = cache(async (id: string) => _fetchTweet(id), undefined, { const fetchTweet = cache(_fetchTweet, undefined, {
revalidate: false, // cache indefinitely revalidate: false, // cache indefinitely
tags: ["tweet"], tags: ["tweet"],
}); });

View File

@ -1,4 +1,3 @@
import { cache } from "react";
import { Feed } from "feed"; import { Feed } from "feed";
import { getFrontMatter, getContent } from "./posts"; import { getFrontMatter, getContent } from "./posts";
import * as config from "../config"; import * as config from "../config";
@ -11,7 +10,7 @@ import ogImage from "../../app/opengraph-image.jpg";
* Returns a `Feed` object, which can then be processed with `feed.rss2()`, `feed.atom1()`, or `feed.json1()`. * Returns a `Feed` object, which can then be processed with `feed.rss2()`, `feed.atom1()`, or `feed.json1()`.
* @see https://github.com/jpmonette/feed#example * @see https://github.com/jpmonette/feed#example
*/ */
export const buildFeed = cache(async (): Promise<Feed> => { export const buildFeed = async (): Promise<Feed> => {
const feed = new Feed({ const feed = new Feed({
id: BASE_URL, id: BASE_URL,
link: BASE_URL, link: BASE_URL,
@ -62,4 +61,4 @@ export const buildFeed = cache(async (): Promise<Feed> => {
}); });
return feed; return feed;
}); };

View File

@ -1,4 +1,3 @@
import { cache } from "react";
import path from "path"; import path from "path";
import fs from "fs/promises"; import fs from "fs/promises";
import glob from "fast-glob"; import glob from "fast-glob";
@ -20,7 +19,7 @@ export type FrontMatter = {
}; };
/** Use filesystem to get a simple list of all post slugs */ /** Use filesystem to get a simple list of all post slugs */
export const getSlugs = cache(async (): Promise<string[]> => { export const getSlugs = async (): Promise<string[]> => {
// list all .mdx files in POSTS_DIR // list all .mdx files in POSTS_DIR
const mdxFiles = await glob("*/index.mdx", { const mdxFiles = await glob("*/index.mdx", {
cwd: path.join(process.cwd(), POSTS_DIR), cwd: path.join(process.cwd(), POSTS_DIR),
@ -31,7 +30,7 @@ export const getSlugs = cache(async (): Promise<string[]> => {
const slugs = mdxFiles.map((fileName) => fileName.replace(/\/index\.mdx$/, "")); const slugs = mdxFiles.map((fileName) => fileName.replace(/\/index\.mdx$/, ""));
return slugs; return slugs;
}); };
// overloaded to return either the front matter of a single post or ALL posts // overloaded to return either the front matter of a single post or ALL posts
export const getFrontMatter: { export const getFrontMatter: {
@ -43,9 +42,11 @@ export const getFrontMatter: {
* Parses and returns the front matter of a given slug, or undefined if the slug does not exist * Parses and returns the front matter of a given slug, or undefined if the slug does not exist
*/ */
(slug: string): Promise<FrontMatter | undefined>; (slug: string): Promise<FrontMatter | undefined>;
} = cache( } = async (
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
async (slug?: any): Promise<any> => { slug?: any
): // eslint-disable-next-line @typescript-eslint/no-explicit-any
Promise<any> => {
if (typeof slug === "string") { if (typeof slug === "string") {
try { try {
const { frontmatter } = await import(`../../${POSTS_DIR}/${slug}/index.mdx`); const { frontmatter } = await import(`../../${POSTS_DIR}/${slug}/index.mdx`);
@ -96,11 +97,10 @@ export const getFrontMatter: {
} }
throw new Error(`getFrontMatter() called with invalid argument.`); throw new Error(`getFrontMatter() called with invalid argument.`);
} };
);
/** Returns the content of a post with very limited processing to include in RSS feeds */ /** Returns the content of a post with very limited processing to include in RSS feeds */
export const getContent = cache(async (slug: string): Promise<string | undefined> => { export const getContent = async (slug: string): Promise<string | undefined> => {
try { try {
// TODO: also remove MDX-related syntax (e.g. import/export statements) // TODO: also remove MDX-related syntax (e.g. import/export statements)
const content = await unified() const content = await unified()
@ -138,4 +138,4 @@ export const getContent = cache(async (slug: string): Promise<string | undefined
console.error(`Failed to load/parse content for post with slug "${slug}":`, error); console.error(`Failed to load/parse content for post with slug "${slug}":`, error);
return undefined; return undefined;
} }
}); };

View File

@ -23,8 +23,8 @@
"@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.41", "@next/bundle-analyzer": "15.3.0-canary.43",
"@next/mdx": "15.3.0-canary.41", "@next/mdx": "15.3.0-canary.43",
"@octokit/graphql": "^8.2.1", "@octokit/graphql": "^8.2.1",
"@octokit/graphql-schema": "^15.26.0", "@octokit/graphql-schema": "^15.26.0",
"@upstash/redis": "^1.34.7", "@upstash/redis": "^1.34.7",
@ -37,7 +37,7 @@
"html-entities": "^2.6.0", "html-entities": "^2.6.0",
"lucide-react": "0.487.0", "lucide-react": "0.487.0",
"modern-normalize": "^3.0.1", "modern-normalize": "^3.0.1",
"next": "15.3.0-canary.41", "next": "15.3.0-canary.43",
"polished": "^4.3.1", "polished": "^4.3.1",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react": "19.1.0", "react": "19.1.0",
@ -80,7 +80,7 @@
"babel-plugin-react-compiler": "19.0.0-beta-e993439-20250405", "babel-plugin-react-compiler": "19.0.0-beta-e993439-20250405",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"eslint": "^9.24.0", "eslint": "^9.24.0",
"eslint-config-next": "15.3.0-canary.41", "eslint-config-next": "15.3.0-canary.43",
"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",
@ -101,12 +101,12 @@
"typescript": "5.8.3" "typescript": "5.8.3"
}, },
"optionalDependencies": { "optionalDependencies": {
"sharp": "^0.34.0" "sharp": "^0.34.1"
}, },
"engines": { "engines": {
"node": ">=20.x" "node": ">=20.x"
}, },
"packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808", "packageManager": "pnpm@10.8.0+sha512.0e82714d1b5b43c74610193cb20734897c1d00de89d0e18420aebc5977fa13d780a9cb05734624e81ebd81cc876cd464794850641c48b9544326b5622ca29971",
"cacheDirectories": [ "cacheDirectories": [
"node_modules", "node_modules",
".next/cache" ".next/cache"

437
pnpm-lock.yaml generated
View File

@ -27,11 +27,11 @@ importers:
specifier: ^3.1.0 specifier: ^3.1.0
version: 3.1.0(@types/react@19.1.0)(react@19.1.0) version: 3.1.0(@types/react@19.1.0)(react@19.1.0)
'@next/bundle-analyzer': '@next/bundle-analyzer':
specifier: 15.3.0-canary.41 specifier: 15.3.0-canary.43
version: 15.3.0-canary.41 version: 15.3.0-canary.43
'@next/mdx': '@next/mdx':
specifier: 15.3.0-canary.41 specifier: 15.3.0-canary.43
version: 15.3.0-canary.41(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0)) version: 15.3.0-canary.43(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0))
'@octokit/graphql': '@octokit/graphql':
specifier: ^8.2.1 specifier: ^8.2.1
version: 8.2.1 version: 8.2.1
@ -58,7 +58,7 @@ 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.41(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) version: 1.3.1(next@15.3.0-canary.43(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
html-entities: html-entities:
specifier: ^2.6.0 specifier: ^2.6.0
version: 2.6.0 version: 2.6.0
@ -69,8 +69,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.41 specifier: 15.3.0-canary.43
version: 15.3.0-canary.41(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) version: 15.3.0-canary.43(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
polished: polished:
specifier: ^4.3.1 specifier: ^4.3.1
version: 4.3.1 version: 4.3.1
@ -193,8 +193,8 @@ importers:
specifier: ^9.24.0 specifier: ^9.24.0
version: 9.24.0 version: 9.24.0
eslint-config-next: eslint-config-next:
specifier: 15.3.0-canary.41 specifier: 15.3.0-canary.43
version: 15.3.0-canary.41(eslint@9.24.0)(typescript@5.8.3) version: 15.3.0-canary.43(eslint@9.24.0)(typescript@5.8.3)
eslint-config-prettier: eslint-config-prettier:
specifier: ^10.1.1 specifier: ^10.1.1
version: 10.1.1(eslint@9.24.0) version: 10.1.1(eslint@9.24.0)
@ -251,8 +251,8 @@ importers:
version: 5.8.3 version: 5.8.3
optionalDependencies: optionalDependencies:
sharp: sharp:
specifier: ^0.34.0 specifier: ^0.34.1
version: 0.34.0 version: 0.34.1
packages: packages:
@ -482,65 +482,33 @@ packages:
resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==}
engines: {node: '>=18.18'} engines: {node: '>=18.18'}
'@img/sharp-darwin-arm64@0.33.5': '@img/sharp-darwin-arm64@0.34.1':
resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@img/sharp-darwin-arm64@0.34.0': '@img/sharp-darwin-x64@0.34.1':
resolution: {integrity: sha512-BLT8CQ234EOJFN4NCAkZUkJr2lyXavD+aQH/Jc2skPqAJTMjKeH2BUulaZNkd4MJ9hcCicTdupcbCRg4bto0Ow==} resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==}
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} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@img/sharp-darwin-x64@0.34.0':
resolution: {integrity: sha512-FZLxjWEtz+QbxZbtFb+f6AbD47/M9k6GuZ9dedTFdsgI9HwUMvyinxFMAeyP1fJZkJBw999Ht5Cus4sqpFlBPg==}
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.1.0': '@img/sharp-libvips-darwin-arm64@1.1.0':
resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==}
cpu: [arm64] cpu: [arm64]
os: [darwin] 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.1.0': '@img/sharp-libvips-darwin-x64@1.1.0':
resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==}
cpu: [x64] cpu: [x64]
os: [darwin] 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.1.0': '@img/sharp-libvips-linux-arm64@1.1.0':
resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==}
cpu: [arm64] cpu: [arm64]
os: [linux] 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.1.0': '@img/sharp-libvips-linux-arm@1.1.0':
resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==}
cpu: [arm] cpu: [arm]
@ -551,148 +519,75 @@ packages:
cpu: [ppc64] cpu: [ppc64]
os: [linux] 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.1.0': '@img/sharp-libvips-linux-s390x@1.1.0':
resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==}
cpu: [s390x] cpu: [s390x]
os: [linux] 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.1.0': '@img/sharp-libvips-linux-x64@1.1.0':
resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==}
cpu: [x64] cpu: [x64]
os: [linux] 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.1.0': '@img/sharp-libvips-linuxmusl-arm64@1.1.0':
resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==}
cpu: [arm64] cpu: [arm64]
os: [linux] 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.1.0': '@img/sharp-libvips-linuxmusl-x64@1.1.0':
resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@img/sharp-linux-arm64@0.33.5': '@img/sharp-linux-arm64@0.34.1':
resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@img/sharp-linux-arm64@0.34.0': '@img/sharp-linux-arm@0.34.1':
resolution: {integrity: sha512-fpvIy7rPdTegqthhUNAaQikg8CzNUGxuf7VTIs5HEQllCTL322rBDuGHVoH/pZ6Qms9enHe++DsUoG/Ux93E1A==} resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==}
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} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@img/sharp-linux-arm@0.34.0': '@img/sharp-linux-s390x@0.34.1':
resolution: {integrity: sha512-MfbqXi4zdy0CsSONwESFzrdpzcNSN66qbt8a7CdesOFfZHmlPXgC+xOy+2SLYn6+MFi/06qngGRIje7vfAV/5Q==} resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm]
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} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
'@img/sharp-linux-s390x@0.34.0': '@img/sharp-linux-x64@0.34.1':
resolution: {integrity: sha512-04jdT+VCZIqj0RoTEpWXh0lErZC9prhkxEZWrQdGt1MZ368SlvXpKkXCD4Ww5ISc3LexBmfnAW/+ErUmD9sRPQ==} resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==}
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} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@img/sharp-linux-x64@0.34.0': '@img/sharp-linuxmusl-arm64@0.34.1':
resolution: {integrity: sha512-Y98V1d5vh8RIpf+pUb7U9a0SGzfPa7x7KPXsqtvb7i52L7HXAMv5U0aaOdnnf/CAqVUVaTJajINJ3KyrLcwByQ==} resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==}
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} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@img/sharp-linuxmusl-arm64@0.34.0': '@img/sharp-linuxmusl-x64@0.34.1':
resolution: {integrity: sha512-pmsehGlQIOlAQ8lgtDxpGInXXMAV6JrFwoJ0Ib9PpsVYuwFM+Soa9mVZMfsTO+u9dBhCMEn2AP3mRUljgpGYvQ==} resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==}
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} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@img/sharp-linuxmusl-x64@0.34.0': '@img/sharp-wasm32@0.34.1':
resolution: {integrity: sha512-t80LMHorxyKGIPWIX3Qyamg72vj/TGYLyOvzjvkywvNmlQurgHu3ZI2aZnUc5YQlrKPOovnwkVmTEbH+YllQ5Q==} resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==}
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} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [wasm32] cpu: [wasm32]
'@img/sharp-wasm32@0.34.0': '@img/sharp-win32-ia32@0.34.1':
resolution: {integrity: sha512-oI6xsOqLHhRA3LSZb07KW3dMAmo1PpyAxwdHkuiC5+N8HzodpqXusOtzBEXKeFG8Za5ycry0xLYsu7hG5aUxoQ==} resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [wasm32]
'@img/sharp-win32-ia32@0.33.5':
resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
'@img/sharp-win32-ia32@0.34.0': '@img/sharp-win32-x64@0.34.1':
resolution: {integrity: sha512-ofcDYsjJJ1zya9s/GCnXjbFIhTw5/gRVr+SivAGPMXmAml/rLLyDu/HtWntvhiacnL4VYvtgMFw/B2Zz/kgoWQ==} resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==}
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.0':
resolution: {integrity: sha512-S0X+Uty7Qe6tBfTigFEInchNsGYM/uRjuF1ixi8mLubMfTClmbnVIMxR2/cD5I5Z1m6lHP5D6ASneM3qsF3KFA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@ -753,17 +648,17 @@ packages:
'@napi-rs/wasm-runtime@0.2.8': '@napi-rs/wasm-runtime@0.2.8':
resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==} resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==}
'@next/bundle-analyzer@15.3.0-canary.41': '@next/bundle-analyzer@15.3.0-canary.43':
resolution: {integrity: sha512-fdxfhf38ShtOI8Wz4h77HwA4HxvcblVrXM1/VzkexE6IZCBalB2rWZsldS30TAGCkXGCZAThHkvTTPuvvbqDcw==} resolution: {integrity: sha512-SxNOtoAIDPjbOVkg3BM9br6wP5LkSAox6crIxKjuPBjLTDTOH9crPdy0iCP2gDInbuVfc2XTKOvHEHub40Mblw==}
'@next/env@15.3.0-canary.41': '@next/env@15.3.0-canary.43':
resolution: {integrity: sha512-M+gqSE/plVT1JEsgyyrstLLWtF1PY0CP80dRxP4qRd7LvI8qJYTLJrFuLojt/WQTdTaCHOOg0F1cmZld+QuT9A==} resolution: {integrity: sha512-ogryUGufxhtidxr/42NY6+ADlvxt9Hq6Q/DOMS/20vGuePZ70wO6Z5m1RP3Q397RGgpe1gSWyYdlg+Mt7H4KeQ==}
'@next/eslint-plugin-next@15.3.0-canary.41': '@next/eslint-plugin-next@15.3.0-canary.43':
resolution: {integrity: sha512-roDi0s4nmZ/nQh5BFtPXraFwyzOGZVbZ+1KKxAGjfxes01FRQ9TS0DaUKT4+/So9X8gT55ZXkVdTclcLqZjnHQ==} resolution: {integrity: sha512-q3SklwAtay8QH7mpgkpgukFqffUx+TRHN2CMy9yN96MUbJEWXn0DjMjHXeaW2LF+UnYsq7mfTRKT+/S74t+Qtg==}
'@next/mdx@15.3.0-canary.41': '@next/mdx@15.3.0-canary.43':
resolution: {integrity: sha512-a6b476AsqnXCojAmhG/O1y+4DoZt8l/hwFmbgrfH2jag3csdZ7ekquDpfzSH5v1yAHgiAyDlFCWCEsR+cbZCmw==} resolution: {integrity: sha512-dxkxJdvRrWc6gjFUIk+YYUlnO/ONZP1/FVTvb2Y6AlDK7ThPy3PheNmHUQTrhzh7bMq5QFGINC7dVpEHnYyg0A==}
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'
@ -773,50 +668,50 @@ packages:
'@mdx-js/react': '@mdx-js/react':
optional: true optional: true
'@next/swc-darwin-arm64@15.3.0-canary.41': '@next/swc-darwin-arm64@15.3.0-canary.43':
resolution: {integrity: sha512-p6soiDBtZTzkvhHmmKqag2xo26N77yZvvACmULieLBOqmgz4kbH7GoVW7OetRJcJ4J+3tyWNkJTX17Y2/SwZlg==} resolution: {integrity: sha512-eXrs8CyIBgdnMTNjku+h/xm61gmRCcKAT+tM2CjpEXbEqXBux5hRIakOk5kJJDu2fA2P3pzQGt5PRD1hg4srXA==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@next/swc-darwin-x64@15.3.0-canary.41': '@next/swc-darwin-x64@15.3.0-canary.43':
resolution: {integrity: sha512-6PwzOqeJn0D8QHB/gJAZ4Ypl9RDMcaqDIKsvWdojXSYVplVxJ9bRrfl+k3MQLV1jBeUSx2IRFRng00/z3iBaxw==} resolution: {integrity: sha512-iRGvblEh/b2grxkkp9pT+yea9EzGNM4tLyUZoCzkejkU2jMLsn2DH6h3bQwCfEYZL3YFGsYmVISrVCOVi8LeMw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@next/swc-linux-arm64-gnu@15.3.0-canary.41': '@next/swc-linux-arm64-gnu@15.3.0-canary.43':
resolution: {integrity: sha512-Q02F1gYR6jAzbbJRKeCBfGVKqFs3kKWS8PxEOYGCY4sROmFrrtel2fmLiKbdUOWpZ7Uhrij+fqzFXS413W9xhQ==} resolution: {integrity: sha512-IqknHGNxpL03uIutIuv7FPjGHuD/AnJVC5exi5g+C7P3f6JVvOjFLS264eqi91tVCXhN2LpcKNGwTlK81bJVVg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@next/swc-linux-arm64-musl@15.3.0-canary.41': '@next/swc-linux-arm64-musl@15.3.0-canary.43':
resolution: {integrity: sha512-XLsAUQyUGszbbGAoJMiMLeJKUSRfLb7PGqrguVBYDX6QQph7siE2be78DvU0nh1CtWJrCyLeyDCLUw7UDdLCUg==} resolution: {integrity: sha512-FbO0dnFsNe3f1LWTn4vyXTWTSrZdwNRnURYExSQ+0AINHphNfwKQNrPqVLrapQ9CAOCOz8R5p9Kf1++IsH3JJQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@next/swc-linux-x64-gnu@15.3.0-canary.41': '@next/swc-linux-x64-gnu@15.3.0-canary.43':
resolution: {integrity: sha512-4peIAKvJQh633m6vMA6Y+PSuRO3LoW41KKF7MgOgdbsKSXFzY4GAMmItrubMke4FvCyO7raI0Dv0gJjER6dogA==} resolution: {integrity: sha512-MAaLEm8eO6Xir3YC3xLYDHDjLGogAAGRrxhuflvaqAtGQZ6NIMG4YjvAyramYTq/SwrUIDobggKxdQLtu8/pPQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@next/swc-linux-x64-musl@15.3.0-canary.41': '@next/swc-linux-x64-musl@15.3.0-canary.43':
resolution: {integrity: sha512-HLq8CkS66WKr96cijy7RhHkuJxRbS7I0oVcbZmL00Lr0t/kO6OPyGRlazjyMQEQgcEsny/4LAvYZL/ZzZMTltg==} resolution: {integrity: sha512-gdwF79/EQjY3zgcolO0jlDe0yfII9tXyXQeqL+uvzA8gZT5FpH0KkwSWzxj8EUswWzZcprbDa87sq8H0Eo+whw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@next/swc-win32-arm64-msvc@15.3.0-canary.41': '@next/swc-win32-arm64-msvc@15.3.0-canary.43':
resolution: {integrity: sha512-gcY2HlPBuqLGXZ6lEmn0e/T5ae5XUJLP9Rn1UHcuze/RXpVTMEL5VkJw2LOj4VhJpcKs1G5zm7GzfwrjtDd/zw==} resolution: {integrity: sha512-5WYne3jvo1478kUfe901wFxvPMdC8tRKundKIgU5Upe1HafMMS7ymm1hQ7CUpp3/1vY/R1TV1oKHHJfqDubiNg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@next/swc-win32-x64-msvc@15.3.0-canary.41': '@next/swc-win32-x64-msvc@15.3.0-canary.43':
resolution: {integrity: sha512-Ay4afan1UBLu3QjWEZeC2bTpIXLbQDrSsZykRBcpGaQUq113OtM5pMhmPni1qLBtXTIHdLVTgeJjh4duKfZICQ==} resolution: {integrity: sha512-xE3WZhwjb91eezecVsmXn/OtdISfMsIfS3t0ZXsS/+bMvO/LZLdcVBtl0Zy5yR+XJyKfXXmwpdYbL6WH4dGuQg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@ -1629,8 +1524,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.41: eslint-config-next@15.3.0-canary.43:
resolution: {integrity: sha512-c+2+MtxW3iGxbpAzINdKGjrEtOQCO4tVF3bjYfzwqIPz8eqrlkroFn4ok1B04Dz9H03jvrmYdbMKXfmpyX4vzg==} resolution: {integrity: sha512-RL8kWM1EH+5/Yg31u6HwMJOjxxYiStcO9KtgQ2e4ajKqeE3xfNbZ20BLBW7uQgzSYHpU1wXiXaYqUqo7NUbRhw==}
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'
@ -2724,8 +2619,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.41: next@15.3.0-canary.43:
resolution: {integrity: sha512-jQANaTx8vXRyMUlwOlv4nB2t6rWvQ5K/mXE/lcm4GY1NOcMdOODZEsRFuxr2F/DrUHSGwnHl/RXu+2RKFfNulQ==} resolution: {integrity: sha512-am6xpZIx2P0VJ26N7K2CImmznYUP65XS0e0nkYtypWf/RiMsScwmCqrA4qrEK9u/tiPlA+583IcQPos9yKLg1Q==}
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:
@ -3272,12 +3167,8 @@ packages:
resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
sharp@0.33.5: sharp@0.34.1:
resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
sharp@0.34.0:
resolution: {integrity: sha512-l7K33wCojhluT82RQXKm3X/y9Y6yBioJ4GaOlGT67yDv8bXZcU3aOlxUM0W1zUUKQjOoIh3VcfQEKHVW9AyijQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
shebang-command@2.0.0: shebang-command@2.0.0:
@ -4090,157 +3981,82 @@ snapshots:
'@humanwhocodes/retry@0.4.2': {} '@humanwhocodes/retry@0.4.2': {}
'@img/sharp-darwin-arm64@0.33.5': '@img/sharp-darwin-arm64@0.34.1':
optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.0.4
optional: true
'@img/sharp-darwin-arm64@0.34.0':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.1.0 '@img/sharp-libvips-darwin-arm64': 1.1.0
optional: true optional: true
'@img/sharp-darwin-x64@0.33.5': '@img/sharp-darwin-x64@0.34.1':
optionalDependencies:
'@img/sharp-libvips-darwin-x64': 1.0.4
optional: true
'@img/sharp-darwin-x64@0.34.0':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-darwin-x64': 1.1.0 '@img/sharp-libvips-darwin-x64': 1.1.0
optional: true optional: true
'@img/sharp-libvips-darwin-arm64@1.0.4':
optional: true
'@img/sharp-libvips-darwin-arm64@1.1.0': '@img/sharp-libvips-darwin-arm64@1.1.0':
optional: true optional: true
'@img/sharp-libvips-darwin-x64@1.0.4':
optional: true
'@img/sharp-libvips-darwin-x64@1.1.0': '@img/sharp-libvips-darwin-x64@1.1.0':
optional: true optional: true
'@img/sharp-libvips-linux-arm64@1.0.4':
optional: true
'@img/sharp-libvips-linux-arm64@1.1.0': '@img/sharp-libvips-linux-arm64@1.1.0':
optional: true optional: true
'@img/sharp-libvips-linux-arm@1.0.5':
optional: true
'@img/sharp-libvips-linux-arm@1.1.0': '@img/sharp-libvips-linux-arm@1.1.0':
optional: true optional: true
'@img/sharp-libvips-linux-ppc64@1.1.0': '@img/sharp-libvips-linux-ppc64@1.1.0':
optional: true optional: true
'@img/sharp-libvips-linux-s390x@1.0.4':
optional: true
'@img/sharp-libvips-linux-s390x@1.1.0': '@img/sharp-libvips-linux-s390x@1.1.0':
optional: true optional: true
'@img/sharp-libvips-linux-x64@1.0.4':
optional: true
'@img/sharp-libvips-linux-x64@1.1.0': '@img/sharp-libvips-linux-x64@1.1.0':
optional: true optional: true
'@img/sharp-libvips-linuxmusl-arm64@1.0.4':
optional: true
'@img/sharp-libvips-linuxmusl-arm64@1.1.0': '@img/sharp-libvips-linuxmusl-arm64@1.1.0':
optional: true optional: true
'@img/sharp-libvips-linuxmusl-x64@1.0.4':
optional: true
'@img/sharp-libvips-linuxmusl-x64@1.1.0': '@img/sharp-libvips-linuxmusl-x64@1.1.0':
optional: true optional: true
'@img/sharp-linux-arm64@0.33.5': '@img/sharp-linux-arm64@0.34.1':
optionalDependencies:
'@img/sharp-libvips-linux-arm64': 1.0.4
optional: true
'@img/sharp-linux-arm64@0.34.0':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-arm64': 1.1.0 '@img/sharp-libvips-linux-arm64': 1.1.0
optional: true optional: true
'@img/sharp-linux-arm@0.33.5': '@img/sharp-linux-arm@0.34.1':
optionalDependencies:
'@img/sharp-libvips-linux-arm': 1.0.5
optional: true
'@img/sharp-linux-arm@0.34.0':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-arm': 1.1.0 '@img/sharp-libvips-linux-arm': 1.1.0
optional: true optional: true
'@img/sharp-linux-s390x@0.33.5': '@img/sharp-linux-s390x@0.34.1':
optionalDependencies:
'@img/sharp-libvips-linux-s390x': 1.0.4
optional: true
'@img/sharp-linux-s390x@0.34.0':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-s390x': 1.1.0 '@img/sharp-libvips-linux-s390x': 1.1.0
optional: true optional: true
'@img/sharp-linux-x64@0.33.5': '@img/sharp-linux-x64@0.34.1':
optionalDependencies:
'@img/sharp-libvips-linux-x64': 1.0.4
optional: true
'@img/sharp-linux-x64@0.34.0':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-x64': 1.1.0 '@img/sharp-libvips-linux-x64': 1.1.0
optional: true optional: true
'@img/sharp-linuxmusl-arm64@0.33.5': '@img/sharp-linuxmusl-arm64@0.34.1':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-arm64': 1.0.4
optional: true
'@img/sharp-linuxmusl-arm64@0.34.0':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linuxmusl-arm64': 1.1.0 '@img/sharp-libvips-linuxmusl-arm64': 1.1.0
optional: true optional: true
'@img/sharp-linuxmusl-x64@0.33.5': '@img/sharp-linuxmusl-x64@0.34.1':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-x64': 1.0.4
optional: true
'@img/sharp-linuxmusl-x64@0.34.0':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linuxmusl-x64': 1.1.0 '@img/sharp-libvips-linuxmusl-x64': 1.1.0
optional: true optional: true
'@img/sharp-wasm32@0.33.5': '@img/sharp-wasm32@0.34.1':
dependencies: dependencies:
'@emnapi/runtime': 1.4.0 '@emnapi/runtime': 1.4.0
optional: true optional: true
'@img/sharp-wasm32@0.34.0': '@img/sharp-win32-ia32@0.34.1':
dependencies:
'@emnapi/runtime': 1.4.0
optional: true optional: true
'@img/sharp-win32-ia32@0.33.5': '@img/sharp-win32-x64@0.34.1':
optional: true
'@img/sharp-win32-ia32@0.34.0':
optional: true
'@img/sharp-win32-x64@0.33.5':
optional: true
'@img/sharp-win32-x64@0.34.0':
optional: true optional: true
'@isaacs/cliui@8.0.2': '@isaacs/cliui@8.0.2':
@ -4334,48 +4150,48 @@ snapshots:
'@tybys/wasm-util': 0.9.0 '@tybys/wasm-util': 0.9.0
optional: true optional: true
'@next/bundle-analyzer@15.3.0-canary.41': '@next/bundle-analyzer@15.3.0-canary.43':
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.41': {} '@next/env@15.3.0-canary.43': {}
'@next/eslint-plugin-next@15.3.0-canary.41': '@next/eslint-plugin-next@15.3.0-canary.43':
dependencies: dependencies:
fast-glob: 3.3.1 fast-glob: 3.3.1
'@next/mdx@15.3.0-canary.41(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0))': '@next/mdx@15.3.0-canary.43(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.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.1.0)(react@19.1.0) '@mdx-js/react': 3.1.0(@types/react@19.1.0)(react@19.1.0)
'@next/swc-darwin-arm64@15.3.0-canary.41': '@next/swc-darwin-arm64@15.3.0-canary.43':
optional: true optional: true
'@next/swc-darwin-x64@15.3.0-canary.41': '@next/swc-darwin-x64@15.3.0-canary.43':
optional: true optional: true
'@next/swc-linux-arm64-gnu@15.3.0-canary.41': '@next/swc-linux-arm64-gnu@15.3.0-canary.43':
optional: true optional: true
'@next/swc-linux-arm64-musl@15.3.0-canary.41': '@next/swc-linux-arm64-musl@15.3.0-canary.43':
optional: true optional: true
'@next/swc-linux-x64-gnu@15.3.0-canary.41': '@next/swc-linux-x64-gnu@15.3.0-canary.43':
optional: true optional: true
'@next/swc-linux-x64-musl@15.3.0-canary.41': '@next/swc-linux-x64-musl@15.3.0-canary.43':
optional: true optional: true
'@next/swc-win32-arm64-msvc@15.3.0-canary.41': '@next/swc-win32-arm64-msvc@15.3.0-canary.43':
optional: true optional: true
'@next/swc-win32-x64-msvc@15.3.0-canary.41': '@next/swc-win32-x64-msvc@15.3.0-canary.43':
optional: true optional: true
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
@ -5286,9 +5102,9 @@ snapshots:
escape-string-regexp@5.0.0: {} escape-string-regexp@5.0.0: {}
eslint-config-next@15.3.0-canary.41(eslint@9.24.0)(typescript@5.8.3): eslint-config-next@15.3.0-canary.43(eslint@9.24.0)(typescript@5.8.3):
dependencies: dependencies:
'@next/eslint-plugin-next': 15.3.0-canary.41 '@next/eslint-plugin-next': 15.3.0-canary.43
'@rushstack/eslint-patch': 1.11.0 '@rushstack/eslint-patch': 1.11.0
'@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3)
'@typescript-eslint/parser': 8.29.0(eslint@9.24.0)(typescript@5.8.3) '@typescript-eslint/parser': 8.29.0(eslint@9.24.0)(typescript@5.8.3)
@ -5707,9 +5523,9 @@ snapshots:
functions-have-names@1.2.3: {} functions-have-names@1.2.3: {}
geist@1.3.1(next@15.3.0-canary.41(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)): geist@1.3.1(next@15.3.0-canary.43(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)):
dependencies: dependencies:
next: 15.3.0-canary.41(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next: 15.3.0-canary.43(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
gensync@1.0.0-beta.2: {} gensync@1.0.0-beta.2: {}
@ -6842,9 +6658,9 @@ snapshots:
natural-compare@1.4.0: {} natural-compare@1.4.0: {}
next@15.3.0-canary.41(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): next@15.3.0-canary.43(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies: dependencies:
'@next/env': 15.3.0-canary.41 '@next/env': 15.3.0-canary.43
'@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
@ -6854,16 +6670,16 @@ snapshots:
react-dom: 19.1.0(react@19.1.0) react-dom: 19.1.0(react@19.1.0)
styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.1.0) styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.1.0)
optionalDependencies: optionalDependencies:
'@next/swc-darwin-arm64': 15.3.0-canary.41 '@next/swc-darwin-arm64': 15.3.0-canary.43
'@next/swc-darwin-x64': 15.3.0-canary.41 '@next/swc-darwin-x64': 15.3.0-canary.43
'@next/swc-linux-arm64-gnu': 15.3.0-canary.41 '@next/swc-linux-arm64-gnu': 15.3.0-canary.43
'@next/swc-linux-arm64-musl': 15.3.0-canary.41 '@next/swc-linux-arm64-musl': 15.3.0-canary.43
'@next/swc-linux-x64-gnu': 15.3.0-canary.41 '@next/swc-linux-x64-gnu': 15.3.0-canary.43
'@next/swc-linux-x64-musl': 15.3.0-canary.41 '@next/swc-linux-x64-musl': 15.3.0-canary.43
'@next/swc-win32-arm64-msvc': 15.3.0-canary.41 '@next/swc-win32-arm64-msvc': 15.3.0-canary.43
'@next/swc-win32-x64-msvc': 15.3.0-canary.41 '@next/swc-win32-x64-msvc': 15.3.0-canary.43
babel-plugin-react-compiler: 19.0.0-beta-e993439-20250405 babel-plugin-react-compiler: 19.0.0-beta-e993439-20250405
sharp: 0.33.5 sharp: 0.34.1
transitivePeerDependencies: transitivePeerDependencies:
- '@babel/core' - '@babel/core'
- babel-plugin-macros - babel-plugin-macros
@ -7523,41 +7339,14 @@ snapshots:
es-errors: 1.3.0 es-errors: 1.3.0
es-object-atoms: 1.1.1 es-object-atoms: 1.1.1
sharp@0.33.5: sharp@0.34.1:
dependencies: dependencies:
color: 4.2.3 color: 4.2.3
detect-libc: 2.0.3 detect-libc: 2.0.3
semver: 7.7.1 semver: 7.7.1
optionalDependencies: optionalDependencies:
'@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-arm64': 0.34.1
'@img/sharp-darwin-x64': 0.33.5 '@img/sharp-darwin-x64': 0.34.1
'@img/sharp-libvips-darwin-arm64': 1.0.4
'@img/sharp-libvips-darwin-x64': 1.0.4
'@img/sharp-libvips-linux-arm': 1.0.5
'@img/sharp-libvips-linux-arm64': 1.0.4
'@img/sharp-libvips-linux-s390x': 1.0.4
'@img/sharp-libvips-linux-x64': 1.0.4
'@img/sharp-libvips-linuxmusl-arm64': 1.0.4
'@img/sharp-libvips-linuxmusl-x64': 1.0.4
'@img/sharp-linux-arm': 0.33.5
'@img/sharp-linux-arm64': 0.33.5
'@img/sharp-linux-s390x': 0.33.5
'@img/sharp-linux-x64': 0.33.5
'@img/sharp-linuxmusl-arm64': 0.33.5
'@img/sharp-linuxmusl-x64': 0.33.5
'@img/sharp-wasm32': 0.33.5
'@img/sharp-win32-ia32': 0.33.5
'@img/sharp-win32-x64': 0.33.5
optional: true
sharp@0.34.0:
dependencies:
color: 4.2.3
detect-libc: 2.0.3
semver: 7.7.1
optionalDependencies:
'@img/sharp-darwin-arm64': 0.34.0
'@img/sharp-darwin-x64': 0.34.0
'@img/sharp-libvips-darwin-arm64': 1.1.0 '@img/sharp-libvips-darwin-arm64': 1.1.0
'@img/sharp-libvips-darwin-x64': 1.1.0 '@img/sharp-libvips-darwin-x64': 1.1.0
'@img/sharp-libvips-linux-arm': 1.1.0 '@img/sharp-libvips-linux-arm': 1.1.0
@ -7567,15 +7356,15 @@ snapshots:
'@img/sharp-libvips-linux-x64': 1.1.0 '@img/sharp-libvips-linux-x64': 1.1.0
'@img/sharp-libvips-linuxmusl-arm64': 1.1.0 '@img/sharp-libvips-linuxmusl-arm64': 1.1.0
'@img/sharp-libvips-linuxmusl-x64': 1.1.0 '@img/sharp-libvips-linuxmusl-x64': 1.1.0
'@img/sharp-linux-arm': 0.34.0 '@img/sharp-linux-arm': 0.34.1
'@img/sharp-linux-arm64': 0.34.0 '@img/sharp-linux-arm64': 0.34.1
'@img/sharp-linux-s390x': 0.34.0 '@img/sharp-linux-s390x': 0.34.1
'@img/sharp-linux-x64': 0.34.0 '@img/sharp-linux-x64': 0.34.1
'@img/sharp-linuxmusl-arm64': 0.34.0 '@img/sharp-linuxmusl-arm64': 0.34.1
'@img/sharp-linuxmusl-x64': 0.34.0 '@img/sharp-linuxmusl-x64': 0.34.1
'@img/sharp-wasm32': 0.34.0 '@img/sharp-wasm32': 0.34.1
'@img/sharp-win32-ia32': 0.34.0 '@img/sharp-win32-ia32': 0.34.1
'@img/sharp-win32-x64': 0.34.0 '@img/sharp-win32-x64': 0.34.1
optional: true optional: true
shebang-command@2.0.0: shebang-command@2.0.0: