diff --git a/.changeset/light-parrots-walk.md b/.changeset/light-parrots-walk.md new file mode 100644 index 000000000..16e26c79a --- /dev/null +++ b/.changeset/light-parrots-walk.md @@ -0,0 +1,9 @@ +--- +"@opennextjs/aws": minor +--- + +fix page router json data for next 15.2 + +This PR also use `getRequestHandlerWithMetadata` instead of `getRequestHandler` to allow assign metadata to the request. + +BREAKING CHANGE: `MiddlewareResult` now contains `initialURL` instead of `initialPath` \ No newline at end of file diff --git a/packages/open-next/src/adapters/middleware.ts b/packages/open-next/src/adapters/middleware.ts index cd2129a6e..21bd6fb8d 100644 --- a/packages/open-next/src/adapters/middleware.ts +++ b/packages/open-next/src/adapters/middleware.ts @@ -17,7 +17,7 @@ import { } from "../core/resolve"; import { constructNextUrl } from "../core/routing/util"; import routingHandler, { - INTERNAL_HEADER_INITIAL_PATH, + INTERNAL_HEADER_INITIAL_URL, INTERNAL_HEADER_RESOLVED_ROUTES, } from "../core/routingHandler"; @@ -70,15 +70,16 @@ const defaultHandler = async ( ...result.internalEvent, headers: { ...result.internalEvent.headers, - [INTERNAL_HEADER_INITIAL_PATH]: internalEvent.rawPath, - [INTERNAL_HEADER_RESOLVED_ROUTES]: - JSON.stringify(result.resolvedRoutes) ?? "[]", + [INTERNAL_HEADER_INITIAL_URL]: internalEvent.url, + [INTERNAL_HEADER_RESOLVED_ROUTES]: JSON.stringify( + result.resolvedRoutes, + ), }, }, isExternalRewrite: result.isExternalRewrite, origin, isISR: result.isISR, - initialPath: result.initialPath, + initialURL: result.initialURL, resolvedRoutes: result.resolvedRoutes, }; } @@ -98,7 +99,7 @@ const defaultHandler = async ( isExternalRewrite: false, origin: false, isISR: result.isISR, - initialPath: result.internalEvent.rawPath, + initialURL: result.internalEvent.url, resolvedRoutes: [{ route: "/500", type: "page" }], }; } diff --git a/packages/open-next/src/core/requestHandler.ts b/packages/open-next/src/core/requestHandler.ts index 9435f4006..849c2ef71 100644 --- a/packages/open-next/src/core/requestHandler.ts +++ b/packages/open-next/src/core/requestHandler.ts @@ -10,16 +10,18 @@ import type { } from "types/open-next"; import { runWithOpenNextRequestContext } from "utils/promise"; +import { NextConfig } from "config/index"; import type { OpenNextHandlerOptions } from "types/overrides"; import { debug, error, warn } from "../adapters/logger"; import { patchAsyncStorage } from "./patchAsyncStorage"; import { constructNextUrl, convertRes, + convertToQuery, createServerResponse, } from "./routing/util"; import routingHandler, { - INTERNAL_HEADER_INITIAL_PATH, + INTERNAL_HEADER_INITIAL_URL, INTERNAL_HEADER_RESOLVED_ROUTES, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_HEADER_PREFIX_LEN, @@ -51,7 +53,7 @@ export async function openNextHandler( // These 2 will get overwritten by the routing handler if not using an external middleware const internalHeaders = { initialPath: - initialHeaders[INTERNAL_HEADER_INITIAL_PATH] ?? internalEvent.rawPath, + initialHeaders[INTERNAL_HEADER_INITIAL_URL] ?? internalEvent.rawPath, resolvedRoutes: initialHeaders[INTERNAL_HEADER_RESOLVED_ROUTES] ? JSON.parse(initialHeaders[INTERNAL_HEADER_RESOLVED_ROUTES]) : ([] as ResolvedRoute[]), @@ -62,6 +64,7 @@ export async function openNextHandler( isExternalRewrite: false, origin: false, isISR: false, + initialURL: internalEvent.url, ...internalHeaders, }; @@ -115,7 +118,7 @@ export async function openNextHandler( isExternalRewrite: false, isISR: false, origin: false, - initialPath: internalEvent.rawPath, + initialURL: internalEvent.url, resolvedRoutes: [{ route: "/500", type: "page" }], }; } @@ -131,7 +134,7 @@ export async function openNextHandler( isISR: false, resolvedRoutes: [], origin: false, - initialPath: internalEvent.rawPath, + initialURL: internalEvent.url, }, headers, options.streamCreator, @@ -182,7 +185,7 @@ export async function openNextHandler( options?.streamCreator, ); - await processRequest(req, res, preprocessedEvent); + await processRequest(req, res, routingResult); const { statusCode, @@ -207,7 +210,7 @@ export async function openNextHandler( async function processRequest( req: IncomingMessage, res: OpenNextNodeResponse, - internalEvent: InternalEvent, + routingResult: RoutingResult, ) { // @ts-ignore // Next.js doesn't parse body if the property exists @@ -216,20 +219,44 @@ async function processRequest( try { //#override applyNextjsPrebundledReact - setNextjsPrebundledReact(internalEvent.rawPath); + setNextjsPrebundledReact(routingResult.internalEvent.rawPath); //#endOverride + // Here we try to apply as much request metadata as possible + // We apply every metadata from `resolve-routes` https://github.com/vercel/next.js/blob/canary/packages/next/src/server/lib/router-utils/resolve-routes.ts + // and `router-server` https://github.com/vercel/next.js/blob/canary/packages/next/src/server/lib/router-server.ts + const initialURL = new URL(routingResult.initialURL); + let invokeStatus: number | undefined; + if (routingResult.internalEvent.rawPath === "/500") { + invokeStatus = 500; + } else if (routingResult.internalEvent.rawPath === "/404") { + invokeStatus = 404; + } + const requestMetadata = { + isNextDataReq: routingResult.internalEvent.query.__nextDataReq === "1", + initURL: routingResult.initialURL, + initQuery: convertToQuery(initialURL.search), + initProtocol: initialURL.protocol, + defaultLocale: NextConfig.i18n?.defaultLocale, + locale: routingResult.locale, + middlewareInvoke: false, + // By setting invokePath and invokeQuery we can bypass some of the routing logic in Next.js + invokePath: routingResult.internalEvent.rawPath, + invokeQuery: routingResult.internalEvent.query, + // invokeStatus is only used for error pages + invokeStatus, + }; // Next Server - await requestHandler(req, res); + await requestHandler(requestMetadata)(req, res); } catch (e: any) { // This might fail when using bundled next, importing won't do the trick either if (e.constructor.name === "NoFallbackError") { // Do we need to handle _not-found // Ideally this should never get triggered and be intercepted by the routing handler - await tryRenderError("404", res, internalEvent); + await tryRenderError("404", res, routingResult.internalEvent); } else { error("NextJS request failed.", e); - await tryRenderError("500", res, internalEvent); + await tryRenderError("500", res, routingResult.internalEvent); } } } @@ -247,7 +274,14 @@ async function tryRenderError( body: internalEvent.body, remoteAddress: internalEvent.remoteAddress, }); - await requestHandler(_req, res); + // By setting this it will allow us to bypass and directly render the 404 or 500 page + const requestMetadata = { + // By setting invokePath and invokeQuery we can bypass some of the routing logic in Next.js + invokePath: type === "404" ? "/404" : "/500", + invokeStatus: type === "404" ? 404 : 500, + middlewareInvoke: false, + }; + await requestHandler(requestMetadata)(_req, res); } catch (e) { error("NextJS request failed.", e); res.setHeader("Content-Type", "application/json"); diff --git a/packages/open-next/src/core/routing/i18n/index.ts b/packages/open-next/src/core/routing/i18n/index.ts index 59c07ad7f..fb1f16d72 100644 --- a/packages/open-next/src/core/routing/i18n/index.ts +++ b/packages/open-next/src/core/routing/i18n/index.ts @@ -20,7 +20,10 @@ function getLocaleFromCookie(cookies: Record) { : undefined; } -function detectLocale(internalEvent: InternalEvent, i18n: i18nConfig): string { +export function detectLocale( + internalEvent: InternalEvent, + i18n: i18nConfig, +): string { if (i18n.localeDetection === false) { return i18n.defaultLocale; } diff --git a/packages/open-next/src/core/routing/util.ts b/packages/open-next/src/core/routing/util.ts index 35d5029d4..5aeab0977 100644 --- a/packages/open-next/src/core/routing/util.ts +++ b/packages/open-next/src/core/routing/util.ts @@ -414,7 +414,8 @@ export async function invalidateCDNOnRequest( params: RoutingResult, headers: OutgoingHttpHeaders, ) { - const { internalEvent, initialPath, resolvedRoutes } = params; + const { internalEvent, resolvedRoutes, initialURL } = params; + const initialPath = new URL(initialURL).pathname; const isIsrRevalidation = internalEvent.headers["x-isr"] === "1"; if ( !isIsrRevalidation && diff --git a/packages/open-next/src/core/routingHandler.ts b/packages/open-next/src/core/routingHandler.ts index e10bf131a..1d4950502 100644 --- a/packages/open-next/src/core/routingHandler.ts +++ b/packages/open-next/src/core/routingHandler.ts @@ -1,6 +1,7 @@ import { BuildId, ConfigHeaders, + NextConfig, PrerenderManifest, RoutesManifest, } from "config/index"; @@ -13,6 +14,7 @@ import type { import { debug } from "../adapters/logger"; import { cacheInterceptor } from "./routing/cacheInterceptor"; +import { detectLocale } from "./routing/i18n"; import { fixDataPage, getNextConfigHeaders, @@ -31,7 +33,8 @@ import { constructNextUrl } from "./routing/util"; export const MIDDLEWARE_HEADER_PREFIX = "x-middleware-response-"; export const MIDDLEWARE_HEADER_PREFIX_LEN = MIDDLEWARE_HEADER_PREFIX.length; export const INTERNAL_HEADER_PREFIX = "x-opennext-"; -export const INTERNAL_HEADER_INITIAL_PATH = `${INTERNAL_HEADER_PREFIX}initial-path`; +export const INTERNAL_HEADER_INITIAL_URL = `${INTERNAL_HEADER_PREFIX}initial-url`; +export const INTERNAL_HEADER_LOCALE = `${INTERNAL_HEADER_PREFIX}locale`; export const INTERNAL_HEADER_RESOLVED_ROUTES = `${INTERNAL_HEADER_PREFIX}resolved-routes`; // Geolocation headers starting from Nextjs 15 @@ -221,7 +224,10 @@ export default async function routingHandler( isExternalRewrite, origin: false, isISR, - initialPath: event.rawPath, resolvedRoutes, + initialURL: event.url, + locale: NextConfig.i18n + ? detectLocale(internalEvent, NextConfig.i18n) + : undefined, }; } diff --git a/packages/open-next/src/core/util.ts b/packages/open-next/src/core/util.ts index a337ad510..ab8a8db9e 100644 --- a/packages/open-next/src/core/util.ts +++ b/packages/open-next/src/core/util.ts @@ -26,7 +26,7 @@ applyNextjsRequireHooksOverride(); //#endOverride const cacheHandlerPath = require.resolve("./cache.cjs"); // @ts-ignore -export const requestHandler = new NextServer.default({ +const nextServer = new NextServer.default({ //#override requestHandlerHost hostname: "localhost", port: 3000, @@ -57,7 +57,14 @@ export const requestHandler = new NextServer.default({ customServer: false, dev: false, dir: __dirname, -}).getRequestHandler(); +}); + +// `getRequestHandlerWithMetadata` is not available in older versions of Next.js +// It is required to for next 15.2 to pass metadata for page router data route +export const requestHandler = (metadata: Record) => + "getRequestHandlerWithMetadata" in nextServer + ? nextServer.getRequestHandlerWithMetadata(metadata) + : nextServer.getRequestHandler(); //#override setNextjsPrebundledReact export function setNextjsPrebundledReact(rawPath: string) { diff --git a/packages/open-next/src/types/open-next.ts b/packages/open-next/src/types/open-next.ts index 83afb0f0e..f9e435a28 100644 --- a/packages/open-next/src/types/open-next.ts +++ b/packages/open-next/src/types/open-next.ts @@ -126,8 +126,11 @@ export interface RoutingResult { origin: Origin | false; // If the request is for an ISR route, will be false on every server function. Only used in external middleware isISR: boolean; - // The initial rawPath of the request before applying rewrites, if used with an external middleware will be defined in x-opennext-initial-path header - initialPath: string; + // The initial URL of the request before applying rewrites, if used with an external middleware will be defined in x-opennext-initial-url header + initialURL: string; + + // The locale of the request, if used with an external middleware will be defined in x-opennext-locale header + locale?: string; // The resolved route after applying rewrites, if used with an external middleware will be defined in x-opennext-resolved-routes header as a json encoded array resolvedRoutes: ResolvedRoute[]; diff --git a/packages/tests-unit/tests/core/routing/util.test.ts b/packages/tests-unit/tests/core/routing/util.test.ts index 6d5b1a6bc..b8e4bfd94 100644 --- a/packages/tests-unit/tests/core/routing/util.test.ts +++ b/packages/tests-unit/tests/core/routing/util.test.ts @@ -746,6 +746,7 @@ describe("invalidateCDNOnRequest", () => { internalEvent: { headers: {}, }, + initialURL: "http://localhost/path", }, headers, ); @@ -767,6 +768,7 @@ describe("invalidateCDNOnRequest", () => { "x-isr": "1", }, }, + initialURL: "http://localhost/path", }, headers, ); @@ -782,7 +784,6 @@ describe("invalidateCDNOnRequest", () => { }; await invalidateCDNOnRequest( { - initialPath: "/path", internalEvent: { rawPath: "/path", headers: {}, @@ -793,6 +794,7 @@ describe("invalidateCDNOnRequest", () => { route: "/path", }, ], + initialURL: "http://localhost/path", }, headers, ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08177831e..a53debc16 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,6 +9,30 @@ catalogs: '@types/node': specifier: 20.17.6 version: 20.17.6 + '@types/react': + specifier: 19.0.0 + version: 19.0.0 + '@types/react-dom': + specifier: 19.0.0 + version: 19.0.0 + autoprefixer: + specifier: 10.4.15 + version: 10.4.15 + next: + specifier: 15.2.0 + version: 15.2.0 + postcss: + specifier: 8.4.27 + version: 8.4.27 + react: + specifier: 19.0.0 + version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0 + tailwindcss: + specifier: 3.3.3 + version: 3.3.3 typescript: specifier: 5.6.3 version: 5.6.3 @@ -43,7 +67,7 @@ importers: version: link:../../packages/open-next next: specifier: 'catalog:' - version: 15.1.0(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.2.0(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 'catalog:' version: 19.0.0 @@ -83,7 +107,7 @@ importers: version: link:../../packages/open-next next: specifier: 'catalog:' - version: 15.1.0(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.2.0(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 'catalog:' version: 19.0.0 @@ -120,7 +144,7 @@ importers: version: link:../shared next: specifier: 'catalog:' - version: 15.1.0(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.2.0(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 'catalog:' version: 19.0.0 @@ -1677,53 +1701,53 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.1.0': - resolution: {integrity: sha512-UcCO481cROsqJuszPPXJnb7GGuLq617ve4xuAyyNG4VSSocJNtMU5Fsx+Lp6mlN8c7W58aZLc5y6D/2xNmaK+w==} + '@next/env@15.2.0': + resolution: {integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==} - '@next/swc-darwin-arm64@15.1.0': - resolution: {integrity: sha512-ZU8d7xxpX14uIaFC3nsr4L++5ZS/AkWDm1PzPO6gD9xWhFkOj2hzSbSIxoncsnlJXB1CbLOfGVN4Zk9tg83PUw==} + '@next/swc-darwin-arm64@15.2.0': + resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.1.0': - resolution: {integrity: sha512-DQ3RiUoW2XC9FcSM4ffpfndq1EsLV0fj0/UY33i7eklW5akPUCo6OX2qkcLXZ3jyPdo4sf2flwAED3AAq3Om2Q==} + '@next/swc-darwin-x64@15.2.0': + resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.1.0': - resolution: {integrity: sha512-M+vhTovRS2F//LMx9KtxbkWk627l5Q7AqXWWWrfIzNIaUFiz2/NkOFkxCFyNyGACi5YbA8aekzCLtbDyfF/v5Q==} + '@next/swc-linux-arm64-gnu@15.2.0': + resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.0': - resolution: {integrity: sha512-Qn6vOuwaTCx3pNwygpSGtdIu0TfS1KiaYLYXLH5zq1scoTXdwYfdZtwvJTpB1WrLgiQE2Ne2kt8MZok3HlFqmg==} + '@next/swc-linux-arm64-musl@15.2.0': + resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.0': - resolution: {integrity: sha512-yeNh9ofMqzOZ5yTOk+2rwncBzucc6a1lyqtg8xZv0rH5znyjxHOWsoUtSq4cUTeeBIiXXX51QOOe+VoCjdXJRw==} + '@next/swc-linux-x64-gnu@15.2.0': + resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.0': - resolution: {integrity: sha512-t9IfNkHQs/uKgPoyEtU912MG6a1j7Had37cSUyLTKx9MnUpjj+ZDKw9OyqTI9OwIIv0wmkr1pkZy+3T5pxhJPg==} + '@next/swc-linux-x64-musl@15.2.0': + resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.1.0': - resolution: {integrity: sha512-WEAoHyG14t5sTavZa1c6BnOIEukll9iqFRTavqRVPfYmfegOAd5MaZfXgOGG6kGo1RduyGdTHD4+YZQSdsNZXg==} + '@next/swc-win32-arm64-msvc@15.2.0': + resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.0': - resolution: {integrity: sha512-J1YdKuJv9xcixzXR24Dv+4SaDKc2jj31IVUEMdO5xJivMTXuE6MAdIi4qPjSymHuFG8O5wbfWKnhJUcHHpj5CA==} + '@next/swc-win32-x64-msvc@15.2.0': + resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -4145,8 +4169,8 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - next@15.1.0: - resolution: {integrity: sha512-QKhzt6Y8rgLNlj30izdMbxAwjHMFANnLwDwZ+WQh5sMhyt4lEBqDK9QpvWHtIM4rINKPoJ8aiRZKg5ULSybVHw==} + next@15.2.0: + resolution: {integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -7880,30 +7904,30 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.1.0': {} + '@next/env@15.2.0': {} - '@next/swc-darwin-arm64@15.1.0': + '@next/swc-darwin-arm64@15.2.0': optional: true - '@next/swc-darwin-x64@15.1.0': + '@next/swc-darwin-x64@15.2.0': optional: true - '@next/swc-linux-arm64-gnu@15.1.0': + '@next/swc-linux-arm64-gnu@15.2.0': optional: true - '@next/swc-linux-arm64-musl@15.1.0': + '@next/swc-linux-arm64-musl@15.2.0': optional: true - '@next/swc-linux-x64-gnu@15.1.0': + '@next/swc-linux-x64-gnu@15.2.0': optional: true - '@next/swc-linux-x64-musl@15.1.0': + '@next/swc-linux-x64-musl@15.2.0': optional: true - '@next/swc-win32-arm64-msvc@15.1.0': + '@next/swc-win32-arm64-msvc@15.2.0': optional: true - '@next/swc-win32-x64-msvc@15.1.0': + '@next/swc-win32-x64-msvc@15.2.0': optional: true '@node-minify/core@8.0.6': @@ -9198,7 +9222,7 @@ snapshots: axios@1.7.7: dependencies: - follow-redirects: 1.15.9 + follow-redirects: 1.15.9(debug@4.3.4) form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -10024,8 +10048,6 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - follow-redirects@1.15.9: {} - follow-redirects@1.15.9(debug@4.3.4): optionalDependencies: debug: 4.3.4 @@ -10798,9 +10820,9 @@ snapshots: negotiator@1.0.0: {} - next@15.1.0(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.2.0(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.1.0 + '@next/env': 15.2.0 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -10810,14 +10832,14 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.0 - '@next/swc-darwin-x64': 15.1.0 - '@next/swc-linux-arm64-gnu': 15.1.0 - '@next/swc-linux-arm64-musl': 15.1.0 - '@next/swc-linux-x64-gnu': 15.1.0 - '@next/swc-linux-x64-musl': 15.1.0 - '@next/swc-win32-arm64-msvc': 15.1.0 - '@next/swc-win32-x64-msvc': 15.1.0 + '@next/swc-darwin-arm64': 15.2.0 + '@next/swc-darwin-x64': 15.2.0 + '@next/swc-linux-arm64-gnu': 15.2.0 + '@next/swc-linux-arm64-musl': 15.2.0 + '@next/swc-linux-x64-gnu': 15.2.0 + '@next/swc-linux-x64-musl': 15.2.0 + '@next/swc-win32-arm64-msvc': 15.2.0 + '@next/swc-win32-x64-msvc': 15.2.0 '@playwright/test': 1.49.1 sharp: 0.33.5 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1e0bb6055..106e0be17 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,7 +3,7 @@ packages: - "packages/*" catalog: - next: 15.1.0 + next: 15.2.0 react: 19.0.0 react-dom: 19.0.0 "@types/node": 20.17.6