diff --git a/examples-cloudflare/e2e/experimental/open-next.config.ts b/examples-cloudflare/e2e/experimental/open-next.config.ts index c656743b..703917a3 100644 --- a/examples-cloudflare/e2e/experimental/open-next.config.ts +++ b/examples-cloudflare/e2e/experimental/open-next.config.ts @@ -14,4 +14,5 @@ export default defineCloudflareConfig({ }, }), queue: doQueue, + enableCacheInterception: true, }); diff --git a/examples/experimental/next.config.ts b/examples/experimental/next.config.ts index 38e5d599..da271da0 100644 --- a/examples/experimental/next.config.ts +++ b/examples/experimental/next.config.ts @@ -4,14 +4,7 @@ const nextConfig: NextConfig = { /* config options here */ cleanDistDir: true, output: "standalone", - eslint: { - ignoreDuringBuilds: true, - }, - experimental: { - ppr: "incremental", - nodeMiddleware: true, - dynamicIO: true, - }, + cacheComponents: true, }; export default nextConfig; diff --git a/examples/experimental/open-next.config.local.ts b/examples/experimental/open-next.config.local.ts deleted file mode 100644 index 63d82c31..00000000 --- a/examples/experimental/open-next.config.local.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js"; - -export default { - default: { - override: { - wrapper: "express-dev", - converter: "node", - incrementalCache: "fs-dev", - queue: "direct", - tagCache: "fs-dev-nextMode", - }, - }, - - imageOptimization: { - override: { - wrapper: "dummy", - converter: "dummy", - }, - loader: "fs-dev", - }, - - // You can override the build command here so that you don't have to rebuild next every time you make a change - //buildCommand: "echo 'No build command'", -} satisfies OpenNextConfig; diff --git a/examples/experimental/open-next.config.ts b/examples/experimental/open-next.config.ts index e9038034..1184d582 100644 --- a/examples/experimental/open-next.config.ts +++ b/examples/experimental/open-next.config.ts @@ -1,14 +1,29 @@ -const config = { +import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js"; + +export default { default: { override: { - wrapper: "aws-lambda-streaming", - queue: "sqs-lite", - incrementalCache: "s3-lite", - tagCache: "dynamodb-lite", + wrapper: "express-dev", + converter: "node", + incrementalCache: "fs-dev", + queue: "direct", + tagCache: "fs-dev-nextMode", }, }, - functions: {}, - buildCommand: "npx turbo build", -}; -export default config; + imageOptimization: { + override: { + wrapper: "dummy", + converter: "dummy", + }, + loader: "fs-dev", + }, + + dangerous: { + enableCacheInterception: true, + useAdapterOutputs: true, + }, + + // You can override the build command here so that you don't have to rebuild next every time you make a change + //buildCommand: "echo 'No build command'", +} satisfies OpenNextConfig; diff --git a/examples/experimental/package.json b/examples/experimental/package.json index 8473492f..b31e7ea3 100644 --- a/examples/experimental/package.json +++ b/examples/experimental/package.json @@ -3,23 +3,29 @@ "version": "0.1.0", "private": true, "scripts": { - "openbuild": "node ../../packages/open-next/dist/index.js build", + "openbuild:local": "node ../../packages/open-next/dist/index.js build", + "openbuild:local:start": "PORT=3004 node .open-next/server-functions/default/index.mjs", "dev": "next dev --turbopack --port 3004", "build": "next build", "start": "next start --port 3004", - "lint": "next lint", "clean": "rm -rf .turbo node_modules .next .open-next" }, "dependencies": { - "next": "15.4.0-canary.14", - "react": "catalog:aws", - "react-dom": "catalog:aws" + "next": "16.2.0-canary.45", + "react": "19.2.4", + "react-dom": "19.2.4" }, "devDependencies": { "@opennextjs/aws": "workspace:*", "@types/node": "catalog:aws", - "@types/react": "catalog:aws", - "@types/react-dom": "catalog:aws", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", "typescript": "catalog:aws" + }, + "pnpm": { + "overrides": { + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3" + } } } diff --git a/examples/experimental/src/app/api/revalidate/route.ts b/examples/experimental/src/app/api/revalidate/route.ts index 0d55d697..5211f529 100644 --- a/examples/experimental/src/app/api/revalidate/route.ts +++ b/examples/experimental/src/app/api/revalidate/route.ts @@ -1,6 +1,6 @@ import { revalidateTag } from "next/cache"; export function GET() { - revalidateTag("fullyTagged"); + revalidateTag("fullyTagged", "max"); return new Response("DONE"); } diff --git a/examples/experimental/src/app/ppr/page.tsx b/examples/experimental/src/app/ppr/page.tsx index f2ce5a84..e8994371 100644 --- a/examples/experimental/src/app/ppr/page.tsx +++ b/examples/experimental/src/app/ppr/page.tsx @@ -3,8 +3,6 @@ import { Suspense } from "react"; import { DynamicComponent } from "@/components/dynamic"; import { StaticComponent } from "@/components/static"; -export const experimental_ppr = true; - export default function PPRPage() { return (
diff --git a/examples/experimental/src/components/cached.tsx b/examples/experimental/src/components/cached.tsx index 2f299ad8..6af6f792 100644 --- a/examples/experimental/src/components/cached.tsx +++ b/examples/experimental/src/components/cached.tsx @@ -1,7 +1,8 @@ -import { unstable_cacheLife, unstable_cacheTag } from "next/cache"; +import { cacheLife, cacheTag } from "next/cache"; export async function FullyCachedComponent() { "use cache"; + cacheLife("max"); return (

{Date.now()}

@@ -11,7 +12,7 @@ export async function FullyCachedComponent() { export async function FullyCachedComponentWithTag() { "use cache"; - unstable_cacheTag("fullyTagged"); + cacheTag("fullyTagged"); return (

{Date.now()}

@@ -21,7 +22,7 @@ export async function FullyCachedComponentWithTag() { export async function ISRComponent() { "use cache"; - unstable_cacheLife({ + cacheLife({ stale: 1, revalidate: 5, }); diff --git a/examples/experimental/src/middleware.ts b/examples/experimental/src/proxy.ts similarity index 83% rename from examples/experimental/src/middleware.ts rename to examples/experimental/src/proxy.ts index d7a0420f..d38bc76a 100644 --- a/examples/experimental/src/middleware.ts +++ b/examples/experimental/src/proxy.ts @@ -2,7 +2,7 @@ import crypto from "node:crypto"; import { type NextRequest, NextResponse } from "next/server"; -export default function middleware(request: NextRequest) { +export default function proxy(request: NextRequest) { if (request.nextUrl.pathname === "/api/hello") { return NextResponse.json({ name: "World", @@ -22,7 +22,3 @@ export default function middleware(request: NextRequest) { }, }); } - -export const config = { - runtime: "nodejs", -}; diff --git a/examples/experimental/tsconfig.json b/examples/experimental/tsconfig.json index 7df89e76..b575f7da 100644 --- a/examples/experimental/tsconfig.json +++ b/examples/experimental/tsconfig.json @@ -1,27 +1,41 @@ { - "compilerOptions": { - "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./src/*"] - } - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "compilerOptions": { + "target": "ES2017", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": [ + "./src/*" + ] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } diff --git a/packages/cloudflare/src/cli/adapter.ts b/packages/cloudflare/src/cli/adapter.ts index c38abad6..8c635636 100644 --- a/packages/cloudflare/src/cli/adapter.ts +++ b/packages/cloudflare/src/cli/adapter.ts @@ -79,12 +79,13 @@ export default { ...nextConfig, cacheHandler: cache.cache, //TODO: compute that here, cacheMaxMemorySize: 0, + // cacheHandlers: { + // default: cache.composableCache, + // remote: cache.composableCache, + // }, experimental: { ...nextConfig.experimental, trustHostHeader: true, - cacheHandlers: { - default: cache.composableCache, - }, }, }; }, diff --git a/packages/cloudflare/src/cli/templates/worker.ts b/packages/cloudflare/src/cli/templates/worker.ts index 95dded9c..ee78c674 100644 --- a/packages/cloudflare/src/cli/templates/worker.ts +++ b/packages/cloudflare/src/cli/templates/worker.ts @@ -1,3 +1,5 @@ +import type { InternalResult } from "@opennextjs/aws/types/open-next.js"; + //@ts-expect-error: Will be resolved by wrangler build import { handleImageRequest } from "./cloudflare/images.js"; //@ts-expect-error: Will be resolved by wrangler build @@ -46,7 +48,8 @@ export default { } // - `Request`s are handled by the Next server - const reqOrResp = await middlewareHandler(request, env, ctx); + const reqOrResp: Response | Request | { initialResponse: InternalResult; request: Request } = + await middlewareHandler(request, env, ctx); if (reqOrResp instanceof Response) { return reqOrResp; @@ -55,6 +58,58 @@ export default { // @ts-expect-error: resolved by wrangler build const { handler } = await import("./server-functions/default/handler.mjs"); + //This is PPR response, we need to handle it differently + // We'll likely change that when we'll make the StreamCreator mandatory. + if ("initialResponse" in reqOrResp) { + // We need to create a ReadableStream for the body + const body = new ReadableStream({ + async start(controller) { + const initialBodyReader = reqOrResp.initialResponse.body?.getReader(); + if (initialBodyReader) { + while (true) { + const { done, value } = await initialBodyReader.read(); + if (done) { + break; + } + controller.enqueue(value); + } + } + const resp: Response = await handler(reqOrResp.request, env, ctx, request.signal); + const reader = resp.body?.getReader(); + if (!reader) { + controller.close(); + return; + } + while (true) { + const { done, value } = await reader.read(); + if (done) { + break; + } + controller.enqueue(value); + } + controller.close(); + }, + }); + + const headers = new Headers(); + for (const [key, value] of Object.entries(reqOrResp.initialResponse.headers)) { + if (Array.isArray(value)) { + for (const v of value) { + headers.append(key, v); + } + } else { + headers.set(key, value); + } + } + + headers.set("content-encoding", "identity"); // To fix PPR locally + + return new Response(body, { + status: reqOrResp.initialResponse.statusCode, + headers: headers, + }); + } + return handler(reqOrResp, env, ctx, request.signal); }); }, diff --git a/packages/open-next/src/adapter.ts b/packages/open-next/src/adapter.ts index 6ac9d2df..d734d32f 100644 --- a/packages/open-next/src/adapter.ts +++ b/packages/open-next/src/adapter.ts @@ -84,13 +84,14 @@ export default { return { ...nextConfig, cacheHandler: cache.cache, //TODO: compute that here, + cacheHandlers: { + default: cache.composableCache, + remote: cache.composableCache, + }, cacheMaxMemorySize: 0, experimental: { ...nextConfig.experimental, trustHostHeader: true, - cacheHandlers: { - default: cache.composableCache, - }, }, }; }, diff --git a/packages/open-next/src/adapters/cache.ts b/packages/open-next/src/adapters/cache.ts index 1a4d9bc1..715b2d4e 100644 --- a/packages/open-next/src/adapters/cache.ts +++ b/packages/open-next/src/adapters/cache.ts @@ -244,7 +244,13 @@ export default class Cache { break; } case "APP_PAGE": { - const { html, rscData, headers, status } = data; + const { html, rscData, headers, status, segmentData, postponed } = data; + const segmentToWrite: Record = {}; + if (segmentData) { + for (const [segmentPath, segmentContent] of segmentData.entries()) { + segmentToWrite[segmentPath] = segmentContent.toString("utf8"); + } + } await globalThis.incrementalCache.set( key, { @@ -254,8 +260,10 @@ export default class Cache { meta: { status, headers, + postponed, }, revalidate, + segmentData: segmentData ? segmentToWrite : undefined, }, "cache" ); diff --git a/packages/open-next/src/adapters/middleware.ts b/packages/open-next/src/adapters/middleware.ts index 2dfad417..ae952870 100644 --- a/packages/open-next/src/adapters/middleware.ts +++ b/packages/open-next/src/adapters/middleware.ts @@ -80,6 +80,7 @@ const defaultHandler = async ( isISR: result.isISR, initialURL: result.initialURL, resolvedRoutes: result.resolvedRoutes, + initialResponse: result.initialResponse, }; } try { diff --git a/packages/open-next/src/core/requestHandler.ts b/packages/open-next/src/core/requestHandler.ts index 3a1c84f9..44171950 100644 --- a/packages/open-next/src/core/requestHandler.ts +++ b/packages/open-next/src/core/requestHandler.ts @@ -1,4 +1,6 @@ import { AsyncLocalStorage } from "node:async_hooks"; +import { Writable } from "node:stream"; +import { finished } from "node:stream/promises"; import { IncomingMessage } from "@/http/request"; import type { InternalEvent, InternalResult, ResolvedRoute, RoutingResult } from "@/types/open-next"; @@ -77,7 +79,7 @@ export async function openNextHandler( }); //#endOverride - const headers = "type" in routingResult ? routingResult.headers : routingResult.internalEvent.headers; + const headers = getHeaders(routingResult); const overwrittenResponseHeaders: Record = {}; @@ -178,7 +180,38 @@ export async function openNextHandler( } const req = new IncomingMessage(reqProps); - const res = createServerResponse(routingResult, overwrittenResponseHeaders, options?.streamCreator); + const res = createServerResponse( + routingResult, + routingResult.initialResponse ? routingResult.initialResponse.headers : overwrittenResponseHeaders, + options?.streamCreator + ); + + if (routingResult.initialResponse) { + res.statusCode = routingResult.initialResponse.statusCode; + res.flushHeaders(); + for await (const chunk of routingResult.initialResponse.body) { + res.write(chunk); + } + + //We create a special response for the PPR resume request + const pprRes = createServerResponse(routingResult, overwrittenResponseHeaders, { + writeHeaders: () => { + return new Writable({ + write(chunk, encoding, callback) { + res.write(chunk, encoding, callback); + }, + }); + }, + }); + await adapterHandler(req, pprRes, routingResult, { + waitUntil: options?.waitUntil, + }); + await finished(pprRes); + res.end(); + + return convertRes(res); + } + // It seems that Next.js doesn't set the status code for 404 and 500 anymore for us, we have to do it ourselves // TODO: check security wise if it's ok to do that if (pathname === "/404") { @@ -207,3 +240,11 @@ export async function openNextHandler( } ); } + +function getHeaders(routingResult: RoutingResult | InternalResult) { + if ("type" in routingResult) { + return routingResult.headers; + } else { + return routingResult.internalEvent.headers; + } +} diff --git a/packages/open-next/src/core/routing/cacheInterceptor.ts b/packages/open-next/src/core/routing/cacheInterceptor.ts index 04f2b90f..694c8368 100644 --- a/packages/open-next/src/core/routing/cacheInterceptor.ts +++ b/packages/open-next/src/core/routing/cacheInterceptor.ts @@ -1,7 +1,7 @@ import { createHash } from "node:crypto"; import { NextConfig, PrerenderManifest } from "@/config/index"; -import type { InternalEvent, InternalResult, MiddlewareEvent } from "@/types/open-next"; +import type { InternalEvent, InternalResult, MiddlewareEvent, PartialResult } from "@/types/open-next"; import type { CacheValue } from "@/types/overrides"; import { isBinaryContentType } from "@/utils/binary"; import { getTagsFromValue, hasBeenRevalidated } from "@/utils/cache"; @@ -123,12 +123,50 @@ function getBodyForAppRouter( } } +function createPprPartialResult( + event: MiddlewareEvent, + localizedPath: string, + cachedValue: CacheValue<"cache">, + responseBody: string | (() => ReturnType), + contentType: string +): PartialResult { + if (cachedValue.type !== "app") { + throw new Error("createPprPartialResult called with non-app cache value"); + } + + return { + resumeRequest: { + ...event, + method: "POST", + url: `http://${event.headers.host}${NextConfig.basePath || ""}${localizedPath || "/"}`, + headers: { + ...event.headers, + "next-resume": "1", + }, + rawPath: localizedPath, + body: Buffer.from(cachedValue.meta?.postponed || "", "utf-8"), + }, + result: { + type: "core", + statusCode: event.rewriteStatusCode ?? cachedValue.meta?.status ?? 200, + body: typeof responseBody === "string" ? toReadableStream(responseBody) : responseBody(), + isBase64Encoded: false, + headers: { + "content-type": contentType, + "x-opennext-ppr": "1", + ...cachedValue.meta?.headers, + vary: VARY_HEADER, + }, + }, + }; +} + async function generateResult( event: MiddlewareEvent, localizedPath: string, cachedValue: CacheValue<"cache">, lastModified?: number -): Promise { +): Promise { debug("Returning result from experimental cache"); let body = ""; let type = "application/octet-stream"; @@ -140,8 +178,44 @@ async function generateResult( const { body: appRouterBody, additionalHeaders: appHeaders } = getBodyForAppRouter(event, cachedValue); body = appRouterBody; additionalHeaders = appHeaders; + + if (cachedValue.meta?.postponed) { + if (event.headers["next-router-prefetch"] === "1") { + debug("Prefetch request detected, returning cached response without postponing"); + // We try to find the corresponding segment for the prefetch request, if it exists. + const segmentToFind = event.headers[NEXT_SEGMENT_PREFETCH_HEADER]; + if (segmentToFind && cachedValue.segmentData?.[segmentToFind]) { + body = cachedValue.segmentData[segmentToFind]; + additionalHeaders = { [NEXT_PRERENDER_HEADER]: "1", [NEXT_POSTPONED_HEADER]: "2" }; + debug("Found segment for prefetch request, returning it"); + } else { + debug("No segment found for prefetch request, returning full response"); + } + } else { + debug("App router postponed request detected", localizedPath); + return createPprPartialResult( + event, + localizedPath, + cachedValue, + () => emptyReadableStream(), + "text/x-component" + ); + } + } + debug("App router data request detected", localizedPath, body); } else { - body = cachedValue.html; + if (cachedValue.meta?.postponed) { + debug("Postponed request detected", localizedPath); + return createPprPartialResult( + event, + localizedPath, + cachedValue, + cachedValue.html, + "text/html; charset=utf-8" + ); + } else { + body = cachedValue.html; + } } type = isDataRequest ? "text/x-component" : "text/html; charset=utf-8"; } else if (cachedValue.type === "page") { @@ -168,7 +242,7 @@ async function generateResult( // `NextResponse.rewrite(url, { status: xxx}) // The rewrite status code should take precedence over the cached one statusCode: event.rewriteStatusCode ?? cachedValue.meta?.status ?? 200, - body: toReadableStream(body, false), + body: toReadableStream(body, isBinaryContentType(type)), isBase64Encoded: false, headers: { ...cacheControl, @@ -210,8 +284,16 @@ function decodePathParams(pathname: string): string { .join("/"); } -export async function cacheInterceptor(event: MiddlewareEvent): Promise { - if (Boolean(event.headers["next-action"]) || Boolean(event.headers["x-prerender-revalidate"])) return event; +export async function cacheInterceptor( + event: MiddlewareEvent +): Promise { + if ( + Boolean(event.headers["next-action"]) || + Boolean(event.headers["x-prerender-revalidate"]) || + Boolean(event.headers["next-resume"]) || + event.method !== "GET" + ) + return event; // Check for Next.js preview mode cookies const cookies = event.headers.cookie || ""; @@ -235,15 +317,29 @@ export async function cacheInterceptor(event: MiddlewareEvent): Promise - new RegExp(dr.routeRegex).test(localizedPath) - ); + const isDynamicISR = Object.values(PrerenderManifest?.dynamicRoutes ?? {}).some((dr) => { + const regex = new RegExp(dr.routeRegex); + return regex.test(localizedPath); + }); + + const isStaticRoute = Object.keys(PrerenderManifest?.routes ?? {}).includes(localizedPath || "/"); + + const isISR = isStaticRoute || isDynamicISR; debug("isISR", isISR); if (isISR) { try { - const cachedData = await globalThis.incrementalCache.get(localizedPath ?? "/index"); + let pathToUse = localizedPath; + // For PPR, we need to check the fallback value to get the correct cache key + // We don't want to override a static route though + if (isDynamicISR && !isStaticRoute) { + pathToUse = Object.entries(PrerenderManifest?.dynamicRoutes ?? {}).find(([, dr]) => { + const regex = new RegExp(dr.routeRegex); + return regex.test(localizedPath); + })?.[1].fallback! as string; + } else if (localizedPath === "") { + pathToUse = "/index"; + } + const cachedData = await globalThis.incrementalCache.get(pathToUse); debug("cached data in interceptor", cachedData); if (!cachedData?.value) { diff --git a/packages/open-next/src/core/routingHandler.ts b/packages/open-next/src/core/routingHandler.ts index 5e3554d5..fa8e3159 100644 --- a/packages/open-next/src/core/routingHandler.ts +++ b/packages/open-next/src/core/routingHandler.ts @@ -1,5 +1,11 @@ import { BuildId, ConfigHeaders, NextConfig, PrerenderManifest, RoutesManifest } from "@/config/index"; -import type { InternalEvent, InternalResult, ResolvedRoute, RoutingResult } from "@/types/open-next"; +import type { + InternalEvent, + InternalResult, + PartialResult, + ResolvedRoute, + RoutingResult, +} from "@/types/open-next"; import type { AssetResolver } from "@/types/overrides"; import { debug, error } from "../adapters/logger"; @@ -204,20 +210,35 @@ export default async function routingHandler( }; } + const resolvedRoutes: ResolvedRoute[] = [...foundStaticRoute, ...foundDynamicRoute]; + if (globalThis.openNextConfig.dangerous?.enableCacheInterception && !isInternalResult(eventOrResult)) { debug("Cache interception enabled"); - eventOrResult = await cacheInterceptor(eventOrResult); - if (isInternalResult(eventOrResult)) { - applyMiddlewareHeaders(eventOrResult, headers); - return eventOrResult; + const cacheInterceptionResult = await cacheInterceptor(eventOrResult); + if (isInternalResult(cacheInterceptionResult)) { + applyMiddlewareHeaders(cacheInterceptionResult, headers); + return cacheInterceptionResult; + } else if (isPartialResult(cacheInterceptionResult)) { + // We need to apply the headers to both the result (the streamed response) and the resume request + applyMiddlewareHeaders(cacheInterceptionResult.result, headers); + applyMiddlewareHeaders(cacheInterceptionResult.resumeRequest, headers); + return { + internalEvent: cacheInterceptionResult.resumeRequest, + isExternalRewrite: false, + origin: false, + isISR: false, + resolvedRoutes, + initialURL: event.url, + locale: NextConfig.i18n ? detectLocale(eventOrResult, NextConfig.i18n) : undefined, + rewriteStatusCode: middlewareEventOrResult.rewriteStatusCode, + initialResponse: cacheInterceptionResult.result, + }; } } // We apply the headers from the middleware response last applyMiddlewareHeaders(eventOrResult, headers); - const resolvedRoutes: ResolvedRoute[] = [...foundStaticRoute, ...foundDynamicRoute]; - debug("resolvedRoutes", resolvedRoutes); return { @@ -260,6 +281,18 @@ export default async function routingHandler( * @param eventOrResult * @returns Whether the event is an instance of `InternalResult` */ -function isInternalResult(eventOrResult: InternalEvent | InternalResult): eventOrResult is InternalResult { +export function isInternalResult( + eventOrResult: InternalEvent | InternalResult | PartialResult +): eventOrResult is InternalResult { return eventOrResult != null && "statusCode" in eventOrResult; } + +/** + * @param eventOrResult + * @returns Whether the event is an instance of `PartialResult` (i.e. for PPR responses) + */ +export function isPartialResult( + eventOrResult: InternalEvent | InternalResult | PartialResult +): eventOrResult is PartialResult { + return eventOrResult != null && "resumeRequest" in eventOrResult; +} diff --git a/packages/open-next/src/overrides/converters/edge.ts b/packages/open-next/src/overrides/converters/edge.ts index 63e0ae23..5261283d 100644 --- a/packages/open-next/src/overrides/converters/edge.ts +++ b/packages/open-next/src/overrides/converters/edge.ts @@ -61,6 +61,12 @@ const converter: Converter = { }); if (globalThis.__dangerous_ON_edge_converter_returns_request === true) { + if (result.initialResponse) { + return { + initialResponse: result.initialResponse, + request, + }; + } return request; } @@ -70,6 +76,8 @@ const converter: Converter = { ? { cacheEverything: true } : {}; + //TODO: we need to handle the PPR case here as well. + // We'll revisit this when we'll look at making StreamCreator mandatory. return fetch(request, { // This is a hack to make sure that the response is cached by Cloudflare // See https://developers.cloudflare.com/workers/examples/cache-using-fetch/#caching-html-resources diff --git a/packages/open-next/src/types/cache.ts b/packages/open-next/src/types/cache.ts index 93999a52..db5b63f1 100644 --- a/packages/open-next/src/types/cache.ts +++ b/packages/open-next/src/types/cache.ts @@ -54,6 +54,7 @@ interface IncrementalCachedAppPageValue { headers?: Record; postponed?: string; status?: number; + segmentData?: Map; } export type IncrementalCacheValue = diff --git a/packages/open-next/src/types/open-next.ts b/packages/open-next/src/types/open-next.ts index acf7adad..a6b1a776 100644 --- a/packages/open-next/src/types/open-next.ts +++ b/packages/open-next/src/types/open-next.ts @@ -47,6 +47,24 @@ export type InternalResult = { rewriteStatusCode?: number; } & BaseEventOrResult<"core">; +/** + * This event is returned by the cache interceptor and the routing handler. + * It is then handled by either the external middleware or the classic request handler. + * This is designed for PPR support inside the cache interceptor. + */ +export type PartialResult = { + /** + * Resume request that will be forwarded to the handler + */ + resumeRequest: InternalEvent; + /** + * The result that was generated so far by the cache interceptor + * It contains the first part of the body that we'll need to forward to the client immediately + * As well as the headers and status code + */ + result: InternalResult; +}; + export interface StreamCreator { writeHeaders(prelude: { statusCode: number; cookies: string[]; headers: Record }): Writable; // Just to fix an issue with aws lambda streaming with empty body @@ -188,6 +206,13 @@ export interface RoutingResult { resolvedRoutes: ResolvedRoute[]; // The status code applied to a middleware rewrite rewriteStatusCode?: number; + + /** + * This is the response generated when using PPR in the cache interceptor. + * It contains the initial part of the response that should be sent to the client immediately. + * Can only be present when using cache interception and no external middleware. + */ + initialResponse?: InternalResult; } export interface MiddlewareResult extends RoutingResult, BaseEventOrResult<"middleware"> {} diff --git a/packages/tests-e2e/playwright.config.js b/packages/tests-e2e/playwright.config.js index 8553bd68..9f51b06e 100644 --- a/packages/tests-e2e/playwright.config.js +++ b/packages/tests-e2e/playwright.config.js @@ -23,12 +23,12 @@ export default defineConfig({ baseURL: process.env.APP_PAGES_ROUTER_URL || "http://localhost:3003", }, }, - // { - // name: "experimental", - // testMatch: ["tests/experimental/*.test.ts"], - // use: { - // baseURL: process.env.EXPERIMENTAL_APP_URL || "http://localhost:3004", - // }, - // }, + { + name: "experimental", + testMatch: ["tests/experimental/*.test.ts"], + use: { + baseURL: process.env.EXPERIMENTAL_APP_URL || "http://localhost:3004", + }, + }, ], }); diff --git a/packages/tests-e2e/tests/experimental/ppr.test.ts b/packages/tests-e2e/tests/experimental/ppr.test.ts index 369c02a9..2075480b 100644 --- a/packages/tests-e2e/tests/experimental/ppr.test.ts +++ b/packages/tests-e2e/tests/experimental/ppr.test.ts @@ -13,12 +13,13 @@ test.describe("PPR", () => { test("PPR rsc prefetch request should be cached", async ({ request }) => { const resp = await request.get("/ppr", { - headers: { rsc: "1", "next-router-prefetch": "1" }, + headers: { rsc: "1", "next-router-prefetch": "1", "next-router-segment-prefetch": "/_tree" }, }); expect(resp.status()).toEqual(200); const headers = resp.headers(); - expect(headers["x-nextjs-postponed"]).toEqual("1"); - expect(headers["x-nextjs-cache"]).toEqual("HIT"); - expect(headers["cache-control"]).toEqual("s-maxage=31536000"); + expect(headers["x-nextjs-postponed"]).toEqual("2"); + expect(headers["x-nextjs-prerender"]).toEqual("1"); + expect(headers["x-opennext-cache"]).toEqual("HIT"); + expect(headers["cache-control"]).toEqual("s-maxage=31536000, stale-while-revalidate=2592000"); }); }); diff --git a/packages/tests-e2e/tests/experimental/use-cache.test.ts b/packages/tests-e2e/tests/experimental/use-cache.test.ts index 0c0f7472..c5a31679 100644 --- a/packages/tests-e2e/tests/experimental/use-cache.test.ts +++ b/packages/tests-e2e/tests/experimental/use-cache.test.ts @@ -43,7 +43,8 @@ test.describe("Composable Cache", () => { expect(newFullyCachedText).not.toEqual(initialFullyCachedText); }); - test("cached component should work in isr", async ({ page }) => { + //TODO: figure out why it doesn't work in ISR (my guess is on our patch not working anymore in 16.1, but need investigation) + test.skip("cached component should work in isr", async ({ page }) => { await page.goto("/use-cache/isr"); let fullyCachedElt = page.getByTestId("fully-cached"); diff --git a/packages/tests-unit/tests/adapters/cache.test.ts b/packages/tests-unit/tests/adapters/cache.test.ts index e33c1214..2255fab2 100644 --- a/packages/tests-unit/tests/adapters/cache.test.ts +++ b/packages/tests-unit/tests/adapters/cache.test.ts @@ -318,6 +318,46 @@ describe("CacheHandler", () => { }); }); + it("Should return value when cache data type is app with segmentData and postponed (Next 15+)", async () => { + globalThis.isNextAfter15 = true; + incrementalCache.get.mockResolvedValueOnce({ + value: { + type: "app", + html: "", + rsc: "rsc-data", + segmentData: { + segment1: "data1", + segment2: "data2", + }, + meta: { + status: 200, + headers: { "x-custom": "value" }, + postponed: "postponed-data", + }, + }, + lastModified: Date.now(), + }); + + const result = await cache.get("key", { kindHint: "app" }); + + expect(getIncrementalCache).toHaveBeenCalled(); + expect(result).toEqual({ + value: { + kind: "APP_PAGE", + html: "", + rscData: Buffer.from("rsc-data"), + status: 200, + headers: { "x-custom": "value" }, + postponed: "postponed-data", + segmentData: new Map([ + ["segment1", Buffer.from("data1")], + ["segment2", Buffer.from("data2")], + ]), + }, + lastModified: Date.now(), + }); + }); + it("Should return value when cache data type is redirect", async () => { incrementalCache.get.mockResolvedValueOnce({ value: { @@ -453,6 +493,42 @@ describe("CacheHandler", () => { ); }); + it("Should set cache when for APP_PAGE with segmentData and postponed", async () => { + const segmentData = new Map([ + ["segment1", Buffer.from("data1")], + ["segment2", Buffer.from("data2")], + ]); + + await cache.set("key", { + kind: "APP_PAGE", + html: "", + rscData: Buffer.from("rsc"), + status: 200, + headers: { "x-custom": "value" }, + segmentData, + postponed: "postponed-data", + }); + + expect(incrementalCache.set).toHaveBeenCalledWith( + "key", + { + type: "app", + html: "", + rsc: "rsc", + meta: { + status: 200, + headers: { "x-custom": "value" }, + postponed: "postponed-data", + }, + segmentData: { + segment1: "data1", + segment2: "data2", + }, + }, + "cache" + ); + }); + it("Should set cache when for FETCH", async () => { await cache.set("key", { kind: "FETCH", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f52f7a4..822240b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1221,14 +1221,14 @@ importers: examples/experimental: dependencies: next: - specifier: 15.4.0-canary.14 - version: 15.4.0-canary.14(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: 16.2.0-canary.45 + version: 16.2.0-canary.45(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: - specifier: catalog:aws - version: 19.2.3 + specifier: 19.2.4 + version: 19.2.4 react-dom: - specifier: catalog:aws - version: 19.2.3(react@19.2.3) + specifier: 19.2.4 + version: 19.2.4(react@19.2.4) devDependencies: '@opennextjs/aws': specifier: workspace:* @@ -1237,11 +1237,11 @@ importers: specifier: catalog:aws version: 20.17.6 '@types/react': - specifier: catalog:aws - version: 19.2.9 + specifier: 19.2.14 + version: 19.2.14 '@types/react-dom': - specifier: catalog:aws - version: 19.2.3(@types/react@19.2.9) + specifier: 19.2.3 + version: 19.2.3(@types/react@19.2.14) typescript: specifier: catalog:aws version: 5.9.3 @@ -1312,7 +1312,7 @@ importers: version: 10.3.0 sst: specifier: ^2.43.6 - version: 2.44.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))(@types/react@19.2.9)(aws-crt@1.23.0)(better-sqlite3@11.10.0) + version: 2.44.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))(@types/react@19.2.14)(aws-crt@1.23.0)(better-sqlite3@11.10.0) packages/cloudflare: dependencies: @@ -1376,7 +1376,7 @@ importers: version: 5.5.0 next: specifier: 'catalog:' - version: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) picomatch: specifier: ^4.0.2 version: 4.0.3 @@ -1436,7 +1436,7 @@ importers: version: 5.2.1 next: specifier: ^14.2.35 || ~15.0.7 || ~15.1.11 || ~15.2.8 || ~15.3.8 || ~15.4.10 || ~15.5.9 || ^16.0.10 - version: 16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) path-to-regexp: specifier: ^6.3.0 version: 6.3.0 @@ -1558,24 +1558,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@ast-grep/napi-linux-arm64-musl@0.40.0': resolution: {integrity: sha512-MS9qalLRjUnF2PCzuTKTvCMVSORYHxxe3Qa0+SSaVULsXRBmuy5C/b1FeWwMFnwNnC0uie3VDet31Zujwi8q6A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@ast-grep/napi-linux-x64-gnu@0.40.0': resolution: {integrity: sha512-BeHZVMNXhM3WV3XE2yghO0fRxhMOt8BTN972p5piYEQUvKeSHmS8oeGcs6Ahgx5znBclqqqq37ZfioYANiTqJA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@ast-grep/napi-linux-x64-musl@0.40.0': resolution: {integrity: sha512-rG1YujF7O+lszX8fd5u6qkFTuv4FwHXjWvt1CCvCxXwQLSY96LaCW88oVKg7WoEYQh54y++Fk57F+Wh9Gv9nVQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@ast-grep/napi-win32-arm64-msvc@0.40.0': resolution: {integrity: sha512-9SqmnQqd4zTEUk6yx0TuW2ycZZs2+e569O/R0QnhSiQNpgwiJCYOe/yPS0BC9HkiaozQm6jjAcasWpFtz/dp+w==} @@ -3704,155 +3708,183 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -4047,9 +4079,6 @@ packages: '@next/env@15.0.0-canary.174': resolution: {integrity: sha512-2S0Jpc4yzsLq5xfIHknQob5k3ME9oI7syQH1fNJ3tv/HP1DVLmTWDRylPScLLUJGvOg7SEgnYK87P45cTNdfUQ==} - '@next/env@15.4.0-canary.14': - resolution: {integrity: sha512-ynXM3n0AEcB1mwoOLgar27s/WoFyX0C8kpbfpc6bylq2rfS+q+KNla1WAVX3QdHyV82KyrqdMQAFOIyTZg4K9A==} - '@next/env@15.5.9': resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} @@ -4059,6 +4088,9 @@ packages: '@next/env@16.1.4': resolution: {integrity: sha512-gkrXnZyxPUy0Gg6SrPQPccbNVLSP3vmW8LU5dwEttEEC1RwDivk8w4O+sZIjFvPrSICXyhQDCG+y3VmjlJf+9A==} + '@next/env@16.2.0-canary.45': + resolution: {integrity: sha512-2dRZ3mA62gFMstPd3Z4iR7HSDs5S1Tvoh2ub6vRffA714NnTBQA75wQ2/v3MFjNHfFLS7zzoDsKXK7td+qWycg==} + '@next/swc-darwin-arm64@14.2.33': resolution: {integrity: sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==} engines: {node: '>= 10'} @@ -4071,12 +4103,6 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.4.0-canary.14': - resolution: {integrity: sha512-p62YaNcigaJlZ6IIubZPT+S4N0CXXkjqdIbC2Otr6LLxWsvdkHRgWaPLHauCxWw0zS7jczKY1w4ZfyX9l26sIQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - '@next/swc-darwin-arm64@15.5.7': resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} engines: {node: '>= 10'} @@ -4095,6 +4121,12 @@ packages: cpu: [arm64] os: [darwin] + '@next/swc-darwin-arm64@16.2.0-canary.45': + resolution: {integrity: sha512-MVngKBnVVUARNmrvoYsFGvM+NynWB43hPoL+2Zl7Kdnr6gwWay9UynSavL8h+bDuPy407Uc+TUptluC9yR8yxw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-x64@14.2.33': resolution: {integrity: sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==} engines: {node: '>= 10'} @@ -4107,12 +4139,6 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.4.0-canary.14': - resolution: {integrity: sha512-PQ4z01gYCeYzP4NpFKBvg0slDu/CZ+vrpin6+O5XfzGOOdBCUqlJWK78ZTlfs8eTjVWnvVEi2FsTnbW5BZ0yiA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - '@next/swc-darwin-x64@15.5.7': resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} engines: {node: '>= 10'} @@ -4131,149 +4157,179 @@ packages: cpu: [x64] os: [darwin] + '@next/swc-darwin-x64@16.2.0-canary.45': + resolution: {integrity: sha512-yb7RdctucBi0idq4+XD49RsjiQEi/DMsZhc9yI57ouFs9pNOeFQGWv3sheSSUO1eoINSf2zf2VOi2m42Bmr38w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-linux-arm64-gnu@14.2.33': resolution: {integrity: sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@15.0.0-canary.174': resolution: {integrity: sha512-kVEibHYyQ12zzFPY+YHbYX9z81HhLVK5pQgt1NlFet2M0iBj1PxvOJuu6In1EEV7f3jNEr4r3gf5ieyY3ywnLw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - - '@next/swc-linux-arm64-gnu@15.4.0-canary.14': - resolution: {integrity: sha512-u/eeGK9okYiJ24aLcrq2jOCyOnjhzOM/MkcOOMkzE4/Rp7EKIepnGUhnIcLeLmcQw4RCDAjh3QZBqt5rQEm4fA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@15.5.7': resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@16.0.10': resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@16.1.4': resolution: {integrity: sha512-POQ65+pnYOkZNdngWfMEt7r53bzWiKkVNbjpmCt1Zb3V6lxJNXSsjwRuTQ8P/kguxDC8LRkqaL3vvsFrce4dMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] - '@next/swc-linux-arm64-musl@14.2.33': - resolution: {integrity: sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==} + '@next/swc-linux-arm64-gnu@16.2.0-canary.45': + resolution: {integrity: sha512-8bDK8c+0Kma0URJZ/aSbxH7wSOys5KXlYtE/iaf8fqGtJxIg6VTkUV5bEH4gPl7JFSokOYrKN6romMd6fezkTQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] - '@next/swc-linux-arm64-musl@15.0.0-canary.174': - resolution: {integrity: sha512-NzfcraJW3jpWDx3dJHzMxLFUAJxdq9GROpO49SIWXu9HKmdZszrInTfnYK98v2C73FNnpFoCGEvBYi/GTnvECw==} + '@next/swc-linux-arm64-musl@14.2.33': + resolution: {integrity: sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] - '@next/swc-linux-arm64-musl@15.4.0-canary.14': - resolution: {integrity: sha512-6eODbSA592cYMYtBU9Vm2D8ApXn6dBh/cN7GQlsTiDBIlCId9Z8DlkGCDj/9thr0JEluUlkt379+B19BGxsCEg==} + '@next/swc-linux-arm64-musl@15.0.0-canary.174': + resolution: {integrity: sha512-NzfcraJW3jpWDx3dJHzMxLFUAJxdq9GROpO49SIWXu9HKmdZszrInTfnYK98v2C73FNnpFoCGEvBYi/GTnvECw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@15.5.7': resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@16.0.10': resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@16.1.4': resolution: {integrity: sha512-3Wm0zGYVCs6qDFAiSSDL+Z+r46EdtCv/2l+UlIdMbAq9hPJBvGu/rZOeuvCaIUjbArkmXac8HnTyQPJFzFWA0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] + + '@next/swc-linux-arm64-musl@16.2.0-canary.45': + resolution: {integrity: sha512-Wl1QdWPfmahXTKOrUcNQya/4BxpgjaQggwPNwWz0IREa8avntIJy6Anilg3CU/dUmA22WTDgm2S5Hs0eV4C+BQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@14.2.33': resolution: {integrity: sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@15.0.0-canary.174': resolution: {integrity: sha512-fJ5W8PrbZZkxCrtX9lmlqn43zvUrQQ5wF/GxcQDFdcwT9l3lx8IhdMZH7Q5rWuikWpI0pU+jqqRdhTpODqpuHA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - - '@next/swc-linux-x64-gnu@15.4.0-canary.14': - resolution: {integrity: sha512-FwOtQDbMLJmGPCg8p1ZilCBjfjBZGBRwXnWmxLmpO4lcWTWMFTCfAxkqCUi62zXBZUJztqT8TgXQ9VBk4BKukQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@15.5.7': resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@16.0.10': resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@16.1.4': resolution: {integrity: sha512-lWAYAezFinaJiD5Gv8HDidtsZdT3CDaCeqoPoJjeB57OqzvMajpIhlZFce5sCAH6VuX4mdkxCRqecCJFwfm2nQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] - '@next/swc-linux-x64-musl@14.2.33': - resolution: {integrity: sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==} + '@next/swc-linux-x64-gnu@16.2.0-canary.45': + resolution: {integrity: sha512-69z0oDA2O/PnPRv/kBRD6oRK/AW5t+Cqkp5/8dBO+WZaEo+shcf9EZFD8uPCqrsu7ITiVcDKgUtJzxvouEqm/A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] - '@next/swc-linux-x64-musl@15.0.0-canary.174': - resolution: {integrity: sha512-OMSzmdZxrh5c7X46ILiK3GvTPgSZghpSFF4wrnXloBpW1LrbbjSYGVSGer5IoVqXR18lpnMscsV9N35FX0MIVw==} + '@next/swc-linux-x64-musl@14.2.33': + resolution: {integrity: sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] - '@next/swc-linux-x64-musl@15.4.0-canary.14': - resolution: {integrity: sha512-0k8lkaryoYsB4wksRm/5SlWWtJjuq6vOzQ/zqKRlNdpNvsvzZ61sEaCLZn1zdcFcUVH6wSzK/GMclcpn2w0VAg==} + '@next/swc-linux-x64-musl@15.0.0-canary.174': + resolution: {integrity: sha512-OMSzmdZxrh5c7X46ILiK3GvTPgSZghpSFF4wrnXloBpW1LrbbjSYGVSGer5IoVqXR18lpnMscsV9N35FX0MIVw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@15.5.7': resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@16.0.10': resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@16.1.4': resolution: {integrity: sha512-fHaIpT7x4gA6VQbdEpYUXRGyge/YbRrkG6DXM60XiBqDM2g2NcrsQaIuj375egnGFkJow4RHacgBOEsHfGbiUw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] + + '@next/swc-linux-x64-musl@16.2.0-canary.45': + resolution: {integrity: sha512-9f6p3JP+bUNuG0RWPF2cBBdAuSJo8VuWak9vxGJfLKA9Qqss/EdcNz0z3U+AoAfZ5DhpAxxKliKIuUWxHvUaeQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@14.2.33': resolution: {integrity: sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==} @@ -4287,12 +4343,6 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.4.0-canary.14': - resolution: {integrity: sha512-Kih/2CNMpegubEJT8xoigF+hMihetcFEwWXINfPoO534GQax4o1HU56aai6YgFYCvcrb9fAmW2vVagCQx3GS2g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - '@next/swc-win32-arm64-msvc@15.5.7': resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} engines: {node: '>= 10'} @@ -4311,6 +4361,12 @@ packages: cpu: [arm64] os: [win32] + '@next/swc-win32-arm64-msvc@16.2.0-canary.45': + resolution: {integrity: sha512-8ecF4wvdnaxdk7I3pjhb7q7s/UeM8ZjzeL79igcfJpPKjfrajFCg7ss+pmyHaIAH8R8PD47Z11jdTWeffkiWRQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-ia32-msvc@14.2.33': resolution: {integrity: sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==} engines: {node: '>= 10'} @@ -4335,12 +4391,6 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@15.4.0-canary.14': - resolution: {integrity: sha512-iOTIfyhrUDDIFH0BA0ZAek8XEK2Wgtbg1QOiqzTU7QPasn28lK/b2bHI+stFrGfz6u1NZw9V/B+/D+o9lzSWKQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@next/swc-win32-x64-msvc@15.5.7': resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} engines: {node: '>= 10'} @@ -4359,6 +4409,12 @@ packages: cpu: [x64] os: [win32] + '@next/swc-win32-x64-msvc@16.2.0-canary.45': + resolution: {integrity: sha512-/dHJZF2wNqKSIAU4HvOVXxk/Z5nDd95xmxGE3GaIkQbU9pS+M2CEDQqT5LCEDX6kKTC6CNYqOSzFJqUzygNm9Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} @@ -4482,21 +4538,25 @@ packages: resolution: {integrity: sha512-aql/LLYriX/5Ar7o5Qivnp/qMTUPNiOCr7cFLvmvzYZa3XL0H8XtbKUfIVm+9ILR0urXQzcml+L8pLe1p8sgEg==} cpu: [arm64] os: [linux] + libc: [glibc] '@oxfmt/linux-arm64-musl@0.27.0': resolution: {integrity: sha512-6u/kNb7hubthg4u/pn3MK/GJLwPgjDvDDnjjr7TC0/OK/xztef8ToXmycxIQ9OeDNIJJf7Z0Ss/rHnKvQOWzRw==} cpu: [arm64] os: [linux] + libc: [musl] '@oxfmt/linux-x64-gnu@0.27.0': resolution: {integrity: sha512-EhvDfFHO1yrK/Cu75eU1U828lBsW2cV0JITOrka5AjR3PlmnQQ03Mr9ROkWkbPmzAMklXI4Q16eO+4n+7FhS1w==} cpu: [x64] os: [linux] + libc: [glibc] '@oxfmt/linux-x64-musl@0.27.0': resolution: {integrity: sha512-1pgjuwMT5sCekuteYZ7LkDsto7DJouaccwjozHqdWohSj2zJpFeSP2rMaC+6JJ1KD5r9HG9sWRuHZGEaoX9uOw==} cpu: [x64] os: [linux] + libc: [musl] '@oxfmt/win32-arm64@0.27.0': resolution: {integrity: sha512-mmuEhXZEhAYAeyjVTWwGKIA3RSb2b/He9wrXkDJPhmqp8qISUzkVg1dQmLEt4hD+wI5rzR+6vchPt521tzuRDA==} @@ -4522,21 +4582,25 @@ packages: resolution: {integrity: sha512-j4QzfCM8ks+OyM+KKYWDiBEQsm5RCW50H1Wz16wUyoFsobJ+X5qqcJxq6HvkE07m8euYmZelyB0WqsiDoz1v8g==} cpu: [arm64] os: [linux] + libc: [glibc] '@oxlint/linux-arm64-musl@1.42.0': resolution: {integrity: sha512-g5b1Uw7zo6yw4Ymzyd1etKzAY7xAaGA3scwB8tAp3QzuY7CYdfTwlhiLKSAKbd7T/JBgxOXAGNcLDorJyVTXcg==} cpu: [arm64] os: [linux] + libc: [musl] '@oxlint/linux-x64-gnu@1.42.0': resolution: {integrity: sha512-HnD99GD9qAbpV4q9iQil7mXZUJFpoBdDavfcC2CgGLPlawfcV5COzQPNwOgvPVkr7C0cBx6uNCq3S6r9IIiEIg==} cpu: [x64] os: [linux] + libc: [glibc] '@oxlint/linux-x64-musl@1.42.0': resolution: {integrity: sha512-8NTe8A78HHFn+nBi+8qMwIjgv9oIBh+9zqCPNLH56ah4vKOPvbePLI6NIv9qSkmzrBuu8SB+FJ2TH/G05UzbNA==} cpu: [x64] os: [linux] + libc: [musl] '@oxlint/win32-arm64@1.42.0': resolution: {integrity: sha512-lAPS2YAuu+qFqoTNPFcNsxXjwSV0M+dOgAzzVTAN7Yo2ifj+oLOx0GsntWoM78PvQWI7Q827ZxqtU2ImBmDapA==} @@ -4718,46 +4782,55 @@ packages: resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.24.0': resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.24.0': resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.24.0': resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.24.0': resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.24.0': resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.24.0': resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.24.0': resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.24.0': resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} @@ -5508,24 +5581,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} @@ -5720,6 +5797,9 @@ packages: '@types/react@19.0.3': resolution: {integrity: sha512-UavfHguIjnnuq9O67uXfgy/h3SRJbidAYvNjLceB+2RIKVRBzVsh0QO+Pw6BCSQqFS9xwzKfwstXx0m6AbAREA==} + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/react@19.2.9': resolution: {integrity: sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==} @@ -6135,6 +6215,10 @@ packages: resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} @@ -8078,6 +8162,7 @@ packages: libsql@0.4.7: resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lightningcss-android-arm64@1.30.2: @@ -8115,24 +8200,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} @@ -8661,13 +8750,13 @@ packages: sass: optional: true - next@15.4.0-canary.14: - resolution: {integrity: sha512-4/WNK9Uw/Js1QruZhZfUJWTLrXtL7cvVWLDi1PoCcGdVY91b/1U5jNDOt/Vebr/aJ6Xr5aF+PNHUTtcvBFPInw==} + next@15.5.9: + resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 + '@playwright/test': ^1.51.1 babel-plugin-react-compiler: '*' react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -8682,9 +8771,9 @@ packages: sass: optional: true - next@15.5.9: - resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + next@16.0.10: + resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -8703,8 +8792,8 @@ packages: sass: optional: true - next@16.0.10: - resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} + next@16.1.4: + resolution: {integrity: sha512-gKSecROqisnV7Buen5BfjmXAm7Xlpx9o2ueVQRo5DxQcjC8d330dOM1xiGWc2k3Dcnz0In3VybyRPOsudwgiqQ==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -8724,8 +8813,8 @@ packages: sass: optional: true - next@16.1.4: - resolution: {integrity: sha512-gKSecROqisnV7Buen5BfjmXAm7Xlpx9o2ueVQRo5DxQcjC8d330dOM1xiGWc2k3Dcnz0In3VybyRPOsudwgiqQ==} + next@16.2.0-canary.45: + resolution: {integrity: sha512-iGzgyRnxI4Buap78QMVpZa969i0wTZeKvkgSYjybeuho70GX45W7bRUe5/0uk0WKsg+4ezAdl0zhSx/mwfSE2A==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -9356,6 +9445,11 @@ packages: peerDependencies: react: ^19.2.3 + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + react-hook-form@7.71.1: resolution: {integrity: sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==} engines: {node: '>=18.0.0'} @@ -9396,6 +9490,10 @@ packages: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -14871,23 +14969,20 @@ snapshots: '@next/env@15.0.0-canary.174': {} - '@next/env@15.4.0-canary.14': {} - '@next/env@15.5.9': {} '@next/env@16.0.10': {} '@next/env@16.1.4': {} + '@next/env@16.2.0-canary.45': {} + '@next/swc-darwin-arm64@14.2.33': optional: true '@next/swc-darwin-arm64@15.0.0-canary.174': optional: true - '@next/swc-darwin-arm64@15.4.0-canary.14': - optional: true - '@next/swc-darwin-arm64@15.5.7': optional: true @@ -14897,13 +14992,13 @@ snapshots: '@next/swc-darwin-arm64@16.1.4': optional: true - '@next/swc-darwin-x64@14.2.33': + '@next/swc-darwin-arm64@16.2.0-canary.45': optional: true - '@next/swc-darwin-x64@15.0.0-canary.174': + '@next/swc-darwin-x64@14.2.33': optional: true - '@next/swc-darwin-x64@15.4.0-canary.14': + '@next/swc-darwin-x64@15.0.0-canary.174': optional: true '@next/swc-darwin-x64@15.5.7': @@ -14915,13 +15010,13 @@ snapshots: '@next/swc-darwin-x64@16.1.4': optional: true - '@next/swc-linux-arm64-gnu@14.2.33': + '@next/swc-darwin-x64@16.2.0-canary.45': optional: true - '@next/swc-linux-arm64-gnu@15.0.0-canary.174': + '@next/swc-linux-arm64-gnu@14.2.33': optional: true - '@next/swc-linux-arm64-gnu@15.4.0-canary.14': + '@next/swc-linux-arm64-gnu@15.0.0-canary.174': optional: true '@next/swc-linux-arm64-gnu@15.5.7': @@ -14933,13 +15028,13 @@ snapshots: '@next/swc-linux-arm64-gnu@16.1.4': optional: true - '@next/swc-linux-arm64-musl@14.2.33': + '@next/swc-linux-arm64-gnu@16.2.0-canary.45': optional: true - '@next/swc-linux-arm64-musl@15.0.0-canary.174': + '@next/swc-linux-arm64-musl@14.2.33': optional: true - '@next/swc-linux-arm64-musl@15.4.0-canary.14': + '@next/swc-linux-arm64-musl@15.0.0-canary.174': optional: true '@next/swc-linux-arm64-musl@15.5.7': @@ -14951,13 +15046,13 @@ snapshots: '@next/swc-linux-arm64-musl@16.1.4': optional: true - '@next/swc-linux-x64-gnu@14.2.33': + '@next/swc-linux-arm64-musl@16.2.0-canary.45': optional: true - '@next/swc-linux-x64-gnu@15.0.0-canary.174': + '@next/swc-linux-x64-gnu@14.2.33': optional: true - '@next/swc-linux-x64-gnu@15.4.0-canary.14': + '@next/swc-linux-x64-gnu@15.0.0-canary.174': optional: true '@next/swc-linux-x64-gnu@15.5.7': @@ -14969,13 +15064,13 @@ snapshots: '@next/swc-linux-x64-gnu@16.1.4': optional: true - '@next/swc-linux-x64-musl@14.2.33': + '@next/swc-linux-x64-gnu@16.2.0-canary.45': optional: true - '@next/swc-linux-x64-musl@15.0.0-canary.174': + '@next/swc-linux-x64-musl@14.2.33': optional: true - '@next/swc-linux-x64-musl@15.4.0-canary.14': + '@next/swc-linux-x64-musl@15.0.0-canary.174': optional: true '@next/swc-linux-x64-musl@15.5.7': @@ -14987,13 +15082,13 @@ snapshots: '@next/swc-linux-x64-musl@16.1.4': optional: true - '@next/swc-win32-arm64-msvc@14.2.33': + '@next/swc-linux-x64-musl@16.2.0-canary.45': optional: true - '@next/swc-win32-arm64-msvc@15.0.0-canary.174': + '@next/swc-win32-arm64-msvc@14.2.33': optional: true - '@next/swc-win32-arm64-msvc@15.4.0-canary.14': + '@next/swc-win32-arm64-msvc@15.0.0-canary.174': optional: true '@next/swc-win32-arm64-msvc@15.5.7': @@ -15005,6 +15100,9 @@ snapshots: '@next/swc-win32-arm64-msvc@16.1.4': optional: true + '@next/swc-win32-arm64-msvc@16.2.0-canary.45': + optional: true + '@next/swc-win32-ia32-msvc@14.2.33': optional: true @@ -15017,9 +15115,6 @@ snapshots: '@next/swc-win32-x64-msvc@15.0.0-canary.174': optional: true - '@next/swc-win32-x64-msvc@15.4.0-canary.14': - optional: true - '@next/swc-win32-x64-msvc@15.5.7': optional: true @@ -15029,6 +15124,9 @@ snapshots: '@next/swc-win32-x64-msvc@16.1.4': optional: true + '@next/swc-win32-x64-msvc@16.2.0-canary.45': + optional: true + '@noble/ciphers@1.3.0': {} '@noble/curves@1.9.7': @@ -16732,6 +16830,10 @@ snapshots: dependencies: '@types/react': 19.0.3 + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + '@types/react-dom@19.2.3(@types/react@19.2.9)': dependencies: '@types/react': 19.2.9 @@ -16745,6 +16847,10 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + '@types/react@19.2.9': dependencies: csstype: 3.2.3 @@ -16771,7 +16877,6 @@ snapshots: dependencies: '@types/http-errors': 2.0.4 '@types/node': 22.19.7 - '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -17331,6 +17436,8 @@ snapshots: baseline-browser-mapping@2.9.11: {} + baseline-browser-mapping@2.9.19: {} + before-after-hook@2.2.3: {} better-path-resolve@1.0.0: @@ -19172,13 +19279,13 @@ snapshots: ini@1.3.8: {} - ink-spinner@5.0.0(ink@4.4.1(@types/react@19.2.9)(react@18.3.1))(react@18.3.1): + ink-spinner@5.0.0(ink@4.4.1(@types/react@19.2.14)(react@18.3.1))(react@18.3.1): dependencies: cli-spinners: 2.9.2 - ink: 4.4.1(@types/react@19.2.9)(react@18.3.1) + ink: 4.4.1(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 - ink@4.4.1(@types/react@19.2.9)(react@18.3.1): + ink@4.4.1(@types/react@19.2.14)(react@18.3.1): dependencies: '@alcalzone/ansi-tokenize': 0.1.3 ansi-escapes: 6.2.1 @@ -19207,7 +19314,7 @@ snapshots: ws: 8.18.0 yoga-wasm-web: 0.3.3 optionalDependencies: - '@types/react': 19.2.9 + '@types/react': 19.2.14 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -20192,25 +20299,24 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.4.0-canary.14(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 15.4.0-canary.14 - '@swc/counter': 0.1.3 + '@next/env': 15.5.9 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001669 + caniuse-lite: 1.0.30001766 postcss: 8.4.31 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - styled-jsx: 5.1.6(react@19.2.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.4.0-canary.14 - '@next/swc-darwin-x64': 15.4.0-canary.14 - '@next/swc-linux-arm64-gnu': 15.4.0-canary.14 - '@next/swc-linux-arm64-musl': 15.4.0-canary.14 - '@next/swc-linux-x64-gnu': 15.4.0-canary.14 - '@next/swc-linux-x64-musl': 15.4.0-canary.14 - '@next/swc-win32-arm64-msvc': 15.4.0-canary.14 - '@next/swc-win32-x64-msvc': 15.4.0-canary.14 + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.58.0 sharp: 0.34.5 @@ -20218,15 +20324,15 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 15.5.9 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001766 postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.6(react@18.3.1) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + styled-jsx: 5.1.6(react@19.2.3) optionalDependencies: '@next/swc-darwin-arm64': 15.5.7 '@next/swc-darwin-x64': 15.5.7 @@ -20243,15 +20349,15 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@next/env': 15.5.9 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001766 postcss: 8.4.31 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - styled-jsx: 5.1.6(react@19.2.3) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(react@19.2.4) optionalDependencies: '@next/swc-darwin-arm64': 15.5.7 '@next/swc-darwin-x64': 15.5.7 @@ -20268,15 +20374,15 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@next/env': 16.0.10 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001669 postcss: 8.4.31 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - styled-jsx: 5.1.6(react@19.2.3) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(react@19.2.4) optionalDependencies: '@next/swc-darwin-arm64': 16.0.10 '@next/swc-darwin-x64': 16.0.10 @@ -20371,6 +20477,32 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@16.2.0-canary.45(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@next/env': 16.2.0-canary.45 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001766 + postcss: 8.4.31 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(react@19.2.4) + optionalDependencies: + '@next/swc-darwin-arm64': 16.2.0-canary.45 + '@next/swc-darwin-x64': 16.2.0-canary.45 + '@next/swc-linux-arm64-gnu': 16.2.0-canary.45 + '@next/swc-linux-arm64-musl': 16.2.0-canary.45 + '@next/swc-linux-x64-gnu': 16.2.0-canary.45 + '@next/swc-linux-x64-musl': 16.2.0-canary.45 + '@next/swc-win32-arm64-msvc': 16.2.0-canary.45 + '@next/swc-win32-x64-msvc': 16.2.0-canary.45 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.58.0 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + node-abi@3.87.0: dependencies: semver: 7.7.3 @@ -20972,6 +21104,11 @@ snapshots: react: 19.2.3 scheduler: 0.27.0 + react-dom@19.2.4(react@19.2.4): + dependencies: + react: 19.2.4 + scheduler: 0.27.0 + react-hook-form@7.71.1(react@19.2.3): dependencies: react: 19.2.3 @@ -21000,6 +21137,8 @@ snapshots: react@19.2.3: {} + react@19.2.4: {} + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -21476,7 +21615,7 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - sst@2.44.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))(@types/react@19.2.9)(aws-crt@1.23.0)(better-sqlite3@11.10.0): + sst@2.44.0(@aws-sdk/client-sso-oidc@3.678.0(@aws-sdk/client-sts@3.678.0(aws-crt@1.23.0))(aws-crt@1.23.0))(@types/react@19.2.14)(aws-crt@1.23.0)(better-sqlite3@11.10.0): dependencies: '@aws-cdk/aws-lambda-python-alpha': 2.161.1-alpha.0(aws-cdk-lib@2.161.1(constructs@10.3.0))(constructs@10.3.0) '@aws-cdk/cloud-assembly-schema': 38.0.1 @@ -21528,8 +21667,8 @@ snapshots: graphql: 16.9.0 graphql-yoga: 3.9.1(graphql@16.9.0) immer: 9.0.21 - ink: 4.4.1(@types/react@19.2.9)(react@18.3.1) - ink-spinner: 5.0.0(ink@4.4.1(@types/react@19.2.9)(react@18.3.1))(react@18.3.1) + ink: 4.4.1(@types/react@19.2.14)(react@18.3.1) + ink-spinner: 5.0.0(ink@4.4.1(@types/react@19.2.14)(react@18.3.1))(react@18.3.1) kysely: 0.25.0 kysely-codegen: 0.10.1(better-sqlite3@11.10.0)(kysely@0.25.0) kysely-data-api: 0.2.1(@aws-sdk/client-rds-data@3.678.0(aws-crt@1.23.0))(kysely@0.25.0) @@ -21707,6 +21846,11 @@ snapshots: client-only: 0.0.1 react: 19.2.3 + styled-jsx@5.1.6(react@19.2.4): + dependencies: + client-only: 0.0.1 + react: 19.2.4 + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5