fix: make sitemap.xml prerenderable

This commit is contained in:
2026-08-16 17:36:41 -04:00
parent 38a00cf203
commit 615df000f2
12 changed files with 175 additions and 207 deletions
+2 -2
View File
@@ -2,8 +2,8 @@ import { NextResponse } from "next/server";
import { buildFeed } from "@/lib/build-feed";
export const GET = async () => {
const feed = await buildFeed();
export const GET = () => {
const feed = buildFeed();
return new NextResponse(feed.atom1(), {
headers: {
+2 -2
View File
@@ -2,8 +2,8 @@ import { NextResponse } from "next/server";
import { buildFeed } from "@/lib/build-feed";
export const GET = async () => {
const feed = await buildFeed();
export const GET = () => {
const feed = buildFeed();
return new NextResponse(feed.rss2(), {
headers: {
+24 -26
View File
@@ -7,13 +7,9 @@ import { ImageResponse } from "next/og";
import siteConfig from "@/lib/config/site";
import { getFrontMatter, getSlugs, POSTS_DIR } from "@/lib/posts";
// Reading Inter fonts from the local @fontsource/inter package (instead of
// fetching Google Fonts at build time) avoids flaky network timeouts on
// Vercel's build infra that caused OG image generation to fail intermittently.
// Satori supports .woff but not .woff2. The two file paths are listed explicitly
// in next.config.ts under `outputFileTracingIncludes` so NFT ships them with
// the function output.
const loadInterFont = async (weight: 400 | 600): Promise<ArrayBuffer> => {
"use cache";
const fontPath = path.join(
/* turbopackIgnore: true */ process.cwd(),
"node_modules/@fontsource/inter/files",
@@ -23,23 +19,9 @@ const loadInterFont = async (weight: 400 | 600): Promise<ArrayBuffer> => {
return Uint8Array.from(buffer).buffer;
};
export const contentType = "image/png";
export const size = {
// https://developers.facebook.com/docs/sharing/webmasters/images/
width: 1200,
height: 630,
};
export const generateStaticParams = async () => {
const slugs = await getSlugs();
// map slugs into a static paths object required by next.js
return slugs.map((slug) => ({
slug,
}));
};
const getLocalImage = async (src: string): Promise<ArrayBuffer | string> => {
"use cache";
// https://stackoverflow.com/questions/5775469/whats-the-valid-way-to-include-an-image-with-no-src/14115340#14115340
const NO_IMAGE = "data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=";
@@ -68,12 +50,28 @@ const getLocalImage = async (src: string): Promise<ArrayBuffer | string> => {
}
};
export const contentType = "image/png";
export const size = {
// https://developers.facebook.com/docs/sharing/webmasters/images/
width: 1200,
height: 630,
};
export const generateStaticParams = () => {
const slugs = getSlugs();
// map slugs into a static paths object required by next.js
return slugs.map((slug) => ({
slug,
}));
};
const OpenGraphImage = async ({ params }: { params: Promise<{ slug: string }> }) => {
try {
const { slug } = await params;
// get the post's title and image filename from its frontmatter
const frontmatter = await getFrontMatter(slug);
const frontmatter = getFrontMatter(slug);
if (!frontmatter) notFound();
// IMPORTANT: include these exact paths in next.config.ts under "outputFileTracingIncludes"
@@ -160,10 +158,10 @@ const OpenGraphImage = async ({ params }: { params: Promise<{ slug: string }> })
)}
<span
style={{
fontSize: "1.825rem",
fontWeight: 600,
fontSize: "1.925rem",
fontWeight: 400,
lineHeight: "3rem",
letterSpacing: "-0.015em",
letterSpacing: "-0.025em",
marginLeft: "0.75rem",
}}
>
+4 -4
View File
@@ -18,8 +18,8 @@ import { getFrontMatter, getPost, getSlugs, POSTS_DIR } from "@/lib/posts";
import { size as ogImageSize } from "./opengraph-image";
export const generateStaticParams = async () => {
const slugs = await getSlugs();
export const generateStaticParams = () => {
const slugs = getSlugs();
// map slugs into a static paths object required by next.js
return slugs.map((slug) => ({
@@ -33,7 +33,7 @@ export const generateMetadata = async ({
params: Promise<{ slug: string }>;
}): Promise<Metadata> => {
const { slug } = await params;
const frontmatter = await getFrontMatter(slug);
const frontmatter = getFrontMatter(slug);
return createMetadata({
title: frontmatter?.title,
@@ -54,7 +54,7 @@ export const generateMetadata = async ({
const Page = async ({ params }: { params: Promise<{ slug: string }> }) => {
const { slug } = await params;
const post = await getPost(slug);
const post = getPost(slug);
if (!post) notFound();
const d = new Date(post.date);
+3 -3
View File
@@ -14,8 +14,8 @@ export const metadata = createMetadata({
canonical: `/${POSTS_DIR}`,
});
const PostsList = async () => {
const posts = await getFrontMatter();
const PostsList = () => {
const posts = getFrontMatter();
const formattedPosts = posts.map((post) => {
const d = new Date(post.date);
@@ -92,7 +92,7 @@ const PostsList = async () => {
return <>{sections.toReversed()}</>;
};
const Page = async () => (
const Page = () => (
<DirectionalTransition>
<PageTitle canonical="/notes">Notes</PageTitle>
<PostStatsProvider>
+18 -16
View File
@@ -1,10 +1,23 @@
import path from "node:path";
import glob from "fast-glob";
import type { MetadataRoute } from "next";
import { glob } from "tinyglobby";
import { getFrontMatter } from "@/lib/posts";
const getStaticRoutes = async (): Promise<string[]> => {
"use cache";
return glob("**/page.{tsx,mdx}", {
cwd: path.join(process.cwd(), "app"),
expandDirectories: false,
ignore: [
// don't include dynamic routes or route groups
"**/{\\[*\\],\\(*\\)}/page.{tsx,mdx}",
],
});
};
const sitemap = async (): Promise<MetadataRoute.Sitemap> => {
// start with manual routes
const routes: MetadataRoute.Sitemap = [
@@ -12,25 +25,14 @@ const sitemap = async (): Promise<MetadataRoute.Sitemap> => {
// homepage
url: process.env.NEXT_PUBLIC_BASE_URL ?? "/",
priority: 1.0,
lastModified: new Date(),
lastModified: new Date(process.env.BUILD_TIME ?? 0),
},
{ url: `${process.env.NEXT_PUBLIC_BASE_URL}/tweets` },
{ url: `${process.env.NEXT_PUBLIC_BASE_URL}/y2k` },
];
const [staticRoutes, frontmatter] = await Promise.all([
// static routes in app directory
glob("**/page.{tsx,mdx}", {
cwd: path.join(process.cwd(), "app"),
ignore: [
// don't include dynamic routes or route groups
"**/{\\[*\\],\\(*\\)}/page.{tsx,mdx}",
],
}),
// blog posts
getFrontMatter(),
]);
const staticRoutes = await getStaticRoutes();
const frontmatter = getFrontMatter();
// normalize static routes and blog slugs to be absolute URLs
staticRoutes.forEach((route) => {
@@ -53,7 +55,7 @@ const sitemap = async (): Promise<MetadataRoute.Sitemap> => {
});
});
// sort alphabetically by URL, sometimes fast-glob returns results in a different order
// sort alphabetically by URL, sometimes glob returns results in a different order
routes.sort((a, b) => (a.url < b.url ? -1 : 1));
return routes;
+4 -3
View File
@@ -21,7 +21,7 @@ const parseableDate = z.string().refine((value) => !Number.isNaN(Date.parse(valu
});
const titleToHtml = async (title: string): Promise<string> => {
return unified()
const parsedTitle = await unified()
.use(remarkParse)
.use(remarkSmartypants)
.use(remarkRehype)
@@ -29,8 +29,9 @@ const titleToHtml = async (title: string): Promise<string> => {
tagNames: ["code", "em", "strong"],
})
.use(rehypeStringify)
.process(title)
.then((result) => result.toString().trim());
.process(title);
return parsedTitle.toString().trim();
};
const contentToFeedHtml = async (content: string): Promise<string> => {
+18 -20
View File
@@ -3,14 +3,14 @@ import { Feed, type Item as FeedItem } from "feed";
import ogImage from "@/app/opengraph-image.jpg";
import authorConfig from "@/lib/config/author";
import siteConfig from "@/lib/config/site";
import { getContent, getFrontMatter } from "@/lib/posts";
import { getPost, getFrontMatter } from "@/lib/posts";
/**
* Returns a `Feed` object, which can then be processed with `feed.rss2()`, `feed.atom1()`, or `feed.json1()`.
* @see https://github.com/jpmonette/feed#example
*/
export const buildFeed = async (): Promise<Feed> => {
const frontmatter = await getFrontMatter();
export const buildFeed = (): Feed => {
const frontmatter = getFrontMatter();
const feed = new Feed({
id: `${process.env.NEXT_PUBLIC_BASE_URL}`,
@@ -32,25 +32,23 @@ export const buildFeed = async (): Promise<Feed> => {
});
// parse posts into feed items
const posts: FeedItem[] = await Promise.all(
frontmatter.map(async (post) => ({
guid: post.permalink,
link: post.permalink,
title: post.title,
description: post.description,
author: [
{
name: authorConfig.name,
link: `${process.env.NEXT_PUBLIC_BASE_URL}`,
},
],
date: new Date(post.date),
content: `
${await getContent(post.slug)}
const posts: FeedItem[] = frontmatter.map((post) => ({
guid: post.permalink,
link: post.permalink,
title: post.title,
description: post.description,
author: [
{
name: authorConfig.name,
link: `${process.env.NEXT_PUBLIC_BASE_URL}`,
},
],
date: new Date(post.date),
content: `
${getPost(post.slug)?.feedHtml}
<p><a href="${post.permalink}"><strong>Continue reading...</strong></a></p>
`.trim(),
})),
);
}));
// sort posts reverse chronologically in case the promises resolved out of order
posts.sort((post1, post2) => new Date(post2.date).getTime() - new Date(post1.date).getTime());
+9 -27
View File
@@ -17,38 +17,25 @@ export type Post = (typeof allPosts)[number];
/** Path to directory with .mdx files, relative to project root. */
export const POSTS_DIR = "notes" as const;
const sortPosts = (posts: Post[]): Post[] => {
return posts.toSorted(
(post1, post2) => new Date(post2.date).getTime() - new Date(post1.date).getTime(),
);
};
/** Use generated content collections data to get all post slugs. */
export const getSlugs = async (): Promise<string[]> => {
"use cache";
export const getSlugs = (): string[] => {
return allPosts.map((post) => post.slug);
};
export const getPost = async (slug: string): Promise<Post | undefined> => {
"use cache";
/** Returns the post for a given slug, or undefined if the slug does not exist. */
export const getPost = (slug: string): Post | undefined => {
return allPosts.find((post) => post.slug === slug);
};
/**
* Returns the front matter of ALL posts, sorted reverse chronologically.
*/
export async function getFrontMatter(): Promise<FrontMatter[]>;
export function getFrontMatter(): FrontMatter[];
/**
* Returns the front matter of a given slug, or undefined if the slug does not exist.
*/
export async function getFrontMatter(slug: string): Promise<FrontMatter | undefined>;
export async function getFrontMatter(
slug?: string,
): Promise<FrontMatter[] | FrontMatter | undefined> {
"use cache";
export function getFrontMatter(slug: string): FrontMatter | undefined;
export function getFrontMatter(slug?: string): FrontMatter[] | FrontMatter | undefined {
const toFrontMatter = (post: Post): FrontMatter => ({
slug: post.slug,
permalink: post.permalink,
@@ -67,15 +54,10 @@ export async function getFrontMatter(
}
if (!slug) {
return sortPosts(allPosts).map(toFrontMatter);
return allPosts
.toSorted((post1, post2) => new Date(post2.date).getTime() - new Date(post1.date).getTime())
.map(toFrontMatter);
}
throw new Error("getFrontMatter() called with invalid argument.");
}
/** Returns the sanitized HTML content of a post for RSS feeds. */
export const getContent = async (slug: string): Promise<string | undefined> => {
"use cache";
return allPosts.find((post) => post.slug === slug)?.feedHtml;
};
+6
View File
@@ -17,6 +17,12 @@ const nextConfig = {
},
],
},
compiler: {
defineServer: {
// Inlined at `next build`; `new Date()` here is config-time, not prerender I/O.
"process.env.BUILD_TIME": new Date().toISOString(),
},
},
outputFileTracingIncludes: {
"/notes/[slug]/opengraph-image": [
"./notes/**/*",
+1 -1
View File
@@ -41,7 +41,6 @@
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"drizzle-orm": "1.0.0-rc.5-ab785fc",
"fast-glob": "^3.3.3",
"feed": "^6.0.0",
"html-entities": "^2.6.0",
"next": "16.3.1",
@@ -77,6 +76,7 @@
"shiki": "^4.4.3",
"sonner": "^2.0.8",
"tailwind-merge": "^3.6.0",
"tinyglobby": "^0.2.17",
"unified": "^11.0.5",
"zod": "^4.4.3"
},
+84 -103
View File
@@ -13,7 +13,7 @@ importers:
version: 1.7.0(@types/react@19.2.18)(date-fns@4.4.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@better-auth/drizzle-adapter':
specifier: 1.7.0-rc.4
version: 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.5-ab785fc(@types/pg@8.21.0)(pg@8.23.0)(zod@4.4.3))
version: 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.5-ab785fc(@types/pg@8.21.0)(pg@8.23.0)(zod@4.4.3))
'@fontsource/inter':
specifier: ^5.3.0
version: 5.3.0
@@ -62,9 +62,6 @@ importers:
drizzle-orm:
specifier: 1.0.0-rc.5-ab785fc
version: 1.0.0-rc.5-ab785fc(@types/pg@8.21.0)(pg@8.23.0)(zod@4.4.3)
fast-glob:
specifier: ^3.3.3
version: 3.3.3
feed:
specifier: ^6.0.0
version: 6.0.0
@@ -170,6 +167,9 @@ importers:
tailwind-merge:
specifier: ^3.6.0
version: 3.6.0
tinyglobby:
specifier: ^0.2.17
version: 0.2.17
unified:
specifier: ^11.0.5
version: 11.0.5
@@ -376,10 +376,6 @@ packages:
resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==}
engines: {node: '>=6.9.0'}
'@babel/types@7.29.7':
resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==}
engines: {node: '>=6.9.0'}
'@babel/types@7.29.8':
resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
engines: {node: '>=6.9.0'}
@@ -487,6 +483,9 @@ packages:
'@better-auth/utils@0.4.2':
resolution: {integrity: sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A==}
'@better-auth/utils@0.4.3':
resolution: {integrity: sha512-/X4gRYJBwRuLFjjANVpTDJJkAhLD6Sf8SIBypQ+Q2kDW1MnCsyxUujJzdKYsp59i4c41+AaMtpY/WQAQumqtOA==}
'@better-fetch/fetch@1.3.1':
resolution: {integrity: sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g==}
@@ -1631,8 +1630,8 @@ packages:
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
acorn@8.17.0:
resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==}
acorn@8.18.0:
resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==}
engines: {node: '>=0.4.0'}
hasBin: true
@@ -1897,10 +1896,6 @@ packages:
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
engines: {node: '>= 0.6'}
content-type@2.0.0:
resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==}
engines: {node: '>=18'}
content-type@2.1.0:
resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==}
engines: {node: '>=18'}
@@ -2211,8 +2206,8 @@ packages:
encoding-sniffer@0.2.1:
resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==}
enhanced-resolve@5.24.3:
resolution: {integrity: sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==}
enhanced-resolve@5.24.5:
resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==}
engines: {node: '>=10.13.0'}
enquirer@2.4.1:
@@ -2687,17 +2682,14 @@ packages:
jose@5.10.0:
resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==}
jose@6.2.8:
resolution: {integrity: sha512-Bsdjwm3Qsd/P0jR+BHDe3LytDfY7WBq2HmCCLIwuVRHMuEC9ae7/R474GIUdF1NgCyZjzVo/A9DOiOBtXq8ZoQ==}
jose@6.2.9:
resolution: {integrity: sha512-XrchZOFZUl/T3vTwRe8XK+cJrGtMF4th1ARnDfwbBXFKThGhlsxEE4Zu03AD/bjJSt/9jT/mxrOCkJWOg77aPA==}
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
js-yaml@3.15.0:
resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==}
js-yaml@3.15.1:
resolution: {integrity: sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==}
hasBin: true
js-yaml@4.3.1:
@@ -2724,8 +2716,8 @@ packages:
json-schema-typed@8.0.2:
resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==}
json-with-bigint@3.5.10:
resolution: {integrity: sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==}
json-with-bigint@3.5.11:
resolution: {integrity: sha512-WvkM9Hfb9kqzCcbsvpwfWDvdfGZDhYuCoaCwHRe5q3LtULKkbrI/L6JYcN8owflgA3di5dP2yVAV2NVCXkgtkA==}
json5@2.2.3:
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
@@ -2747,8 +2739,8 @@ packages:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
kysely@0.29.4:
resolution: {integrity: sha512-y5mVgQNkMbs1eK9Xyc0pmNdabN2wHhRYY/5r4W5HrUT1rYCEPeVNSj1RUJeSDKT3U0p+mXCvLgkrFuIafYI6BA==}
kysely@0.29.5:
resolution: {integrity: sha512-ooa+eSbBNPTo3MycPEuW5jdrxQdQwdtB3LC3h43FiXQbIry5tR0C5lDG7eealK0E4D7XjrnOP5DIUg/LyjRMYQ==}
engines: {node: '>=22.0.0'}
lightningcss-android-arm64@1.32.0:
@@ -3454,8 +3446,8 @@ packages:
resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==}
engines: {node: '>=0.10.0'}
readdirp@5.0.0:
resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==}
readdirp@5.1.1:
resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==}
engines: {node: '>= 20.19.0'}
recast@0.23.21:
@@ -3591,8 +3583,8 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
sax@1.6.0:
resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==}
sax@1.6.1:
resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==}
engines: {node: '>=11.0.0'}
scheduler@0.27.0:
@@ -3624,8 +3616,8 @@ packages:
resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
engines: {node: '>= 18'}
serialize-javascript@7.0.7:
resolution: {integrity: sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==}
serialize-javascript@7.1.0:
resolution: {integrity: sha512-RNEqWOyhhUQYN9V1GfHwu9AR/g+NTciH6Z5u3/no6X3/w+04J2lVDL+svFQVXgXrEGBMG2puMVN3gq2SNGuTGw==}
engines: {node: '>=20.0.0'}
serve-static@2.2.1:
@@ -3795,8 +3787,8 @@ packages:
babel-plugin-macros:
optional: true
swr@2.4.2:
resolution: {integrity: sha512-ej644Y2bvkIajfR32KGeSSdBXQW+ScjGjkybZgSE7kFpk9eGnV44XY9FJylXi+W75pavSX1PVNB57W5EbhGIYw==}
swr@2.5.1:
resolution: {integrity: sha512-BRw55e8r0B7SpDN20CAzoQAHl7y1yP7/Zt7oqUjMv0vSt2u2Xnkm88Ws+VypbV9BXHQVuSuyVq7zMjO16wSExw==}
peerDependencies:
react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -3875,10 +3867,6 @@ packages:
undici-types@8.3.0:
resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==}
undici@7.28.0:
resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==}
engines: {node: '>=20.18.1'}
undici@7.29.0:
resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==}
engines: {node: '>=20.18.1'}
@@ -4222,11 +4210,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@babel/types@7.29.7':
dependencies:
'@babel/helper-string-parser': 7.29.7
'@babel/helper-validator-identifier': 7.29.7
'@babel/types@7.29.8':
dependencies:
'@babel/helper-string-parser': 7.29.7
@@ -4256,50 +4239,50 @@ snapshots:
optionalDependencies:
'@types/react': 19.2.18
'@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2)':
'@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2)':
dependencies:
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
'@opentelemetry/semantic-conventions': 1.43.0
'@standard-schema/spec': 1.1.0
better-call: 1.3.7(zod@4.4.3)
jose: 6.2.8
kysely: 0.29.4
jose: 6.2.9
kysely: 0.29.5
nanostores: 1.4.2
zod: 4.4.3
'@better-auth/drizzle-adapter@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.5-ab785fc(@types/pg@8.21.0)(pg@8.23.0)(zod@4.4.3))':
'@better-auth/drizzle-adapter@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.5-ab785fc(@types/pg@8.21.0)(pg@8.23.0)(zod@4.4.3))':
dependencies:
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2)
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2)
'@better-auth/utils': 0.4.2
optionalDependencies:
drizzle-orm: 1.0.0-rc.5-ab785fc(@types/pg@8.21.0)(pg@8.23.0)(zod@4.4.3)
'@better-auth/kysely-adapter@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.4)':
'@better-auth/kysely-adapter@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
dependencies:
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2)
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2)
'@better-auth/utils': 0.4.2
optionalDependencies:
kysely: 0.29.4
kysely: 0.29.5
'@better-auth/memory-adapter@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)':
'@better-auth/memory-adapter@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)':
dependencies:
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2)
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2)
'@better-auth/utils': 0.4.2
'@better-auth/mongo-adapter@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)':
'@better-auth/mongo-adapter@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)':
dependencies:
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2)
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2)
'@better-auth/utils': 0.4.2
'@better-auth/prisma-adapter@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)':
'@better-auth/prisma-adapter@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)':
dependencies:
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2)
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2)
'@better-auth/utils': 0.4.2
'@better-auth/telemetry@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
'@better-auth/telemetry@1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
dependencies:
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2)
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -4307,6 +4290,10 @@ snapshots:
dependencies:
'@noble/hashes': 2.3.0
'@better-auth/utils@0.4.3':
dependencies:
'@noble/hashes': 2.3.0
'@better-fetch/fetch@1.3.1': {}
'@clerc/core@1.3.1':
@@ -4357,7 +4344,7 @@ snapshots:
p-limit: 6.2.0
picomatch: 4.0.5
pluralize: 8.0.0
serialize-javascript: 7.0.7
serialize-javascript: 7.1.0
tinyglobby: 0.2.17
typescript: 6.0.3
yaml: 2.9.0
@@ -4652,7 +4639,7 @@ snapshots:
'@types/estree-jsx': 1.0.5
'@types/hast': 3.0.5
'@types/mdx': 2.0.14
acorn: 8.17.0
acorn: 8.18.0
collapse-white-space: 2.1.0
devlop: 1.1.0
estree-util-is-identifier-name: 3.0.0
@@ -4661,7 +4648,7 @@ snapshots:
hast-util-to-jsx-runtime: 2.3.6
markdown-extensions: 2.0.0
recma-build-jsx: 1.0.0
recma-jsx: 1.0.1(acorn@8.17.0)
recma-jsx: 1.0.1(acorn@8.18.0)
recma-stringify: 1.0.0
rehype-recma: 1.0.0
remark-mdx: 3.1.1
@@ -4787,8 +4774,8 @@ snapshots:
'@octokit/endpoint': 11.0.4
'@octokit/request-error': 7.1.1
'@octokit/types': 17.0.0
content-type: 2.0.0
json-with-bigint: 3.5.10
content-type: 2.1.0
json-with-bigint: 3.5.11
universal-user-agent: 7.0.3
'@octokit/types@17.0.0':
@@ -4989,7 +4976,7 @@ snapshots:
'@tailwindcss/node@4.3.3':
dependencies:
'@jridgewell/remapping': 2.3.5
enhanced-resolve: 5.24.3
enhanced-resolve: 5.24.5
jiti: 2.7.0
lightningcss: 1.32.0
magic-string: 0.30.21
@@ -5154,11 +5141,11 @@ snapshots:
mime-types: 3.0.2
negotiator: 1.0.0
acorn-jsx@5.3.2(acorn@8.17.0):
acorn-jsx@5.3.2(acorn@8.18.0):
dependencies:
acorn: 8.17.0
acorn: 8.18.0
acorn@8.17.0: {}
acorn@8.18.0: {}
ajv-formats@2.1.1(ajv@8.20.0):
optionalDependencies:
@@ -5199,7 +5186,7 @@ snapshots:
babel-plugin-react-compiler@1.0.0:
dependencies:
'@babel/types': 7.29.7
'@babel/types': 7.29.8
bail@2.0.2: {}
@@ -5209,21 +5196,21 @@ snapshots:
better-auth@1.7.0-rc.4(drizzle-kit@1.0.0-rc.5-ab785fc)(drizzle-orm@1.0.0-rc.5-ab785fc(@types/pg@8.21.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.1(@babel/core@7.29.7)(@types/node@26.2.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
dependencies:
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2)
'@better-auth/drizzle-adapter': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.5-ab785fc(@types/pg@8.21.0)(pg@8.23.0)(zod@4.4.3))
'@better-auth/kysely-adapter': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.4)
'@better-auth/memory-adapter': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)
'@better-auth/mongo-adapter': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)
'@better-auth/prisma-adapter': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)
'@better-auth/telemetry': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.8)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
'@better-auth/core': 1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2)
'@better-auth/drizzle-adapter': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.5-ab785fc(@types/pg@8.21.0)(pg@8.23.0)(zod@4.4.3))
'@better-auth/kysely-adapter': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.5)
'@better-auth/memory-adapter': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)
'@better-auth/mongo-adapter': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)
'@better-auth/prisma-adapter': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)
'@better-auth/telemetry': 1.7.0-rc.4(@better-auth/core@1.7.0-rc.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
'@noble/ciphers': 2.3.0
'@noble/hashes': 2.3.0
better-call: 1.3.7(zod@4.4.3)
defu: 6.1.7
jose: 6.2.8
kysely: 0.29.4
jose: 6.2.9
kysely: 0.29.5
nanostores: 1.4.2
zod: 4.4.3
optionalDependencies:
@@ -5239,7 +5226,7 @@ snapshots:
better-call@1.3.7(zod@4.4.3):
dependencies:
'@better-auth/utils': 0.4.2
'@better-auth/utils': 0.4.3
'@better-fetch/fetch': 1.3.1
rou3: 0.7.12
set-cookie-parser: 3.1.2
@@ -5332,12 +5319,12 @@ snapshots:
parse5: 7.3.0
parse5-htmlparser2-tree-adapter: 7.1.0
parse5-parser-stream: 7.1.2
undici: 7.28.0
undici: 7.29.0
whatwg-mimetype: 4.0.0
chokidar@5.0.0:
dependencies:
readdirp: 5.0.0
readdirp: 5.1.1
class-variance-authority@0.7.1:
dependencies:
@@ -5380,8 +5367,6 @@ snapshots:
content-type@1.0.5: {}
content-type@2.0.0: {}
content-type@2.1.0: {}
convert-source-map@2.0.0: {}
@@ -5524,7 +5509,7 @@ snapshots:
iconv-lite: 0.6.3
whatwg-encoding: 3.1.1
enhanced-resolve@5.24.3:
enhanced-resolve@5.24.5:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.3
@@ -5564,7 +5549,7 @@ snapshots:
esast-util-from-js@2.0.1:
dependencies:
'@types/estree-jsx': 1.0.5
acorn: 8.17.0
acorn: 8.18.0
esast-util-from-estree: 2.0.0
vfile-message: 4.0.3
@@ -5853,7 +5838,7 @@ snapshots:
gray-matter@4.0.3:
dependencies:
js-yaml: 3.15.0
js-yaml: 3.15.1
kind-of: 6.0.3
section-matter: 1.0.0
strip-bom-string: 1.0.0
@@ -6082,13 +6067,11 @@ snapshots:
jose@5.10.0: {}
jose@6.2.8: {}
jose@6.2.9: {}
js-tokens@4.0.0: {}
js-yaml@3.15.0:
js-yaml@3.15.1:
dependencies:
argparse: 1.0.10
esprima: 4.0.1
@@ -6109,7 +6092,7 @@ snapshots:
json-schema-typed@8.0.2: {}
json-with-bigint@3.5.10: {}
json-with-bigint@3.5.11: {}
json5@2.2.3: {}
@@ -6125,7 +6108,7 @@ snapshots:
kleur@4.1.5: {}
kysely@0.29.4: {}
kysely@0.29.5: {}
lightningcss-android-arm64@1.32.0:
optional: true
@@ -6514,8 +6497,8 @@ snapshots:
micromark-extension-mdxjs@3.0.0:
dependencies:
acorn: 8.17.0
acorn-jsx: 5.3.2(acorn@8.17.0)
acorn: 8.18.0
acorn-jsx: 5.3.2(acorn@8.18.0)
micromark-extension-mdx-expression: 3.0.1
micromark-extension-mdx-jsx: 3.0.2
micromark-extension-mdx-md: 2.0.0
@@ -7106,11 +7089,11 @@ snapshots:
clsx: 2.1.1
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
swr: 2.4.2(react@19.2.8)
swr: 2.5.1(react@19.2.8)
react@19.2.8: {}
readdirp@5.0.0: {}
readdirp@5.1.1: {}
recast@0.23.21:
dependencies:
@@ -7126,10 +7109,10 @@ snapshots:
estree-util-build-jsx: 3.0.1
vfile: 6.0.3
recma-jsx@1.0.1(acorn@8.17.0):
recma-jsx@1.0.1(acorn@8.18.0):
dependencies:
acorn: 8.17.0
acorn-jsx: 5.3.2(acorn@8.17.0)
acorn: 8.18.0
acorn-jsx: 5.3.2(acorn@8.18.0)
estree-util-to-js: 2.0.0
recma-parse: 1.0.0
recma-stringify: 1.0.0
@@ -7354,7 +7337,7 @@ snapshots:
safer-buffer@2.1.2: {}
sax@1.6.0: {}
sax@1.6.1: {}
scheduler@0.27.0: {}
@@ -7393,7 +7376,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
serialize-javascript@7.0.7: {}
serialize-javascript@7.1.0: {}
serve-static@2.2.1:
dependencies:
@@ -7614,7 +7597,7 @@ snapshots:
optionalDependencies:
'@babel/core': 7.29.7
swr@2.4.2(react@19.2.8):
swr@2.5.1(react@19.2.8):
dependencies:
dequal: 2.0.3
react: 19.2.8
@@ -7678,8 +7661,6 @@ snapshots:
undici-types@8.3.0: {}
undici@7.28.0: {}
undici@7.29.0: {}
unicorn-magic@0.3.0: {}
@@ -7804,7 +7785,7 @@ snapshots:
xml-js@1.6.11:
dependencies:
sax: 1.6.0
sax: 1.6.1
xtend@4.0.2: {}