diff --git a/.changeset/calm-parents-report.md b/.changeset/calm-parents-report.md new file mode 100644 index 000000000..53d93bdc3 --- /dev/null +++ b/.changeset/calm-parents-report.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Support composable cache in Next 16 diff --git a/examples/e2e/experimental/next.config.ts b/examples/e2e/experimental/next.config.ts index 886ddd589..d678d7520 100644 --- a/examples/e2e/experimental/next.config.ts +++ b/examples/e2e/experimental/next.config.ts @@ -4,16 +4,11 @@ const nextConfig: NextConfig = { /* config options here */ cleanDistDir: true, output: "standalone", - eslint: { - ignoreDuringBuilds: true, - }, + cacheComponents: true, typescript: { // Ignore type errors during build for now, we'll need to figure this out later ignoreBuildErrors: true, }, - experimental: { - cacheComponents: true, - }, }; export default nextConfig; diff --git a/examples/e2e/experimental/package.json b/examples/e2e/experimental/package.json index 6f5e09fe9..11c0ba495 100644 --- a/examples/e2e/experimental/package.json +++ b/examples/e2e/experimental/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev": "next dev --turbopack --port 3004", - "build": "next build", + "build": "next build --webpack", "start": "next start --port 3004", "lint": "next lint", "clean": "rm -rf .turbo node_modules .next .open-next", @@ -15,7 +15,7 @@ }, "dependencies": { "@opennextjs/cloudflare": "workspace:*", - "next": "15.4.2-canary.29", + "next": "catalog:e2e", "react": "catalog:e2e", "react-dom": "catalog:e2e" }, diff --git a/examples/e2e/experimental/src/app/api/revalidate/route.ts b/examples/e2e/experimental/src/app/api/revalidate/route.ts index 0d55d697a..5211f529b 100644 --- a/examples/e2e/experimental/src/app/api/revalidate/route.ts +++ b/examples/e2e/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/e2e/experimental/src/app/ppr/page.tsx b/examples/e2e/experimental/src/app/ppr/page.tsx index c252506b1..fd0378062 100644 --- a/examples/e2e/experimental/src/app/ppr/page.tsx +++ b/examples/e2e/experimental/src/app/ppr/page.tsx @@ -2,8 +2,6 @@ import { DynamicComponent } from "@/components/dynamic"; import { StaticComponent } from "@/components/static"; import { Suspense } from "react"; -export const experimental_ppr = true; - export default function PPRPage() { return (
{_headers.get("accept") ?? "No accept headers"}
+{Date.now()}
@@ -21,7 +21,7 @@ export async function FullyCachedComponentWithTag() { export async function ISRComponent() { "use cache"; - unstable_cacheLife({ + cacheLife({ stale: 1, revalidate: 5, }); diff --git a/examples/e2e/experimental/tsconfig.json b/examples/e2e/experimental/tsconfig.json index 7df89e76d..99cb56b62 100644 --- a/examples/e2e/experimental/tsconfig.json +++ b/examples/e2e/experimental/tsconfig.json @@ -11,7 +11,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "plugins": [ { @@ -22,6 +22,6 @@ "@/*": ["./src/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts"], "exclude": ["node_modules"] } diff --git a/packages/cloudflare/package.json b/packages/cloudflare/package.json index f59cd45c3..ecf72e142 100644 --- a/packages/cloudflare/package.json +++ b/packages/cloudflare/package.json @@ -54,7 +54,7 @@ "dependencies": { "@ast-grep/napi": "0.40.0", "@dotenvx/dotenvx": "catalog:", - "@opennextjs/aws": "3.9.6", + "@opennextjs/aws": "3.9.7", "cloudflare": "^4.4.1", "enquirer": "^2.4.1", "glob": "catalog:", diff --git a/packages/cloudflare/src/cli/build/patches/plugins/next-server.spec.ts b/packages/cloudflare/src/cli/build/patches/plugins/next-server.spec.ts index de12d23e7..c263a4cda 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/next-server.spec.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/next-server.spec.ts @@ -10,7 +10,7 @@ import { } from "./next-server.js"; describe("Next Server", () => { - const nextServerCode = ` + const next15ServerCode = ` class NextNodeServer extends _baseserver.default { constructor(options){ // Initialize super class @@ -168,8 +168,27 @@ class NextNodeServer extends _baseserver.default { // ... }`; + const next16ServerCode = ` +class NextNodeServer extends _baseserver.default { + // ... + + async loadCustomCacheHandlers() { + const { cacheMaxMemorySize, cacheHandlers } = this.nextConfig; + if (!cacheHandlers) return; + // If we've already initialized the cache handlers interface, don't do it + // again. + if (!(0, _handlers.initializeCacheHandlers)(cacheMaxMemorySize)) return; + for (const [kind, handler] of Object.entries(cacheHandlers)){ + if (!handler) continue; + (0, _handlers.setCacheHandler)(kind, (0, _interopdefault.interopDefault)(await dynamicImportEsmDefault((0, _formatdynamicimportpath.formatDynamicImportPath)(this.distDir, handler)))); + } + } + // ... +} +`; + test("build ID", () => { - expect(computePatchDiff("next-server.js", nextServerCode, buildIdRule)).toMatchInlineSnapshot(` + expect(computePatchDiff("next-server.js", next15ServerCode, buildIdRule)).toMatchInlineSnapshot(` "Index: next-server.js =================================================================== --- next-server.js @@ -206,7 +225,7 @@ class NextNodeServer extends _baseserver.default { }); test("cache handler", () => { - expect(computePatchDiff("next-server.js", nextServerCode, createCacheHandlerRule("manifest"))) + expect(computePatchDiff("next-server.js", next15ServerCode, createCacheHandlerRule("manifest"))) .toMatchInlineSnapshot(` "Index: next-server.js =================================================================== @@ -234,9 +253,10 @@ class NextNodeServer extends _baseserver.default { `); }); - test("composable cache handler", () => { - expect(computePatchDiff("next-server.js", nextServerCode, createComposableCacheHandlersRule("manifest"))) - .toMatchInlineSnapshot(` + test("composable cache handler (Next 15)", () => { + expect( + computePatchDiff("next-server.js", next15ServerCode, createComposableCacheHandlersRule("manifest")) + ).toMatchInlineSnapshot(` "Index: next-server.js =================================================================== --- next-server.js @@ -268,8 +288,38 @@ class NextNodeServer extends _baseserver.default { `); }); + test("composable cache handler (Next 16)", () => { + expect( + computePatchDiff("next-server.js", next16ServerCode, createComposableCacheHandlersRule("manifest")) + ).toMatchInlineSnapshot(` + "Index: next-server.js + =================================================================== + --- next-server.js + +++ next-server.js + @@ -1,10 +1,15 @@ + - + class NextNodeServer extends _baseserver.default { + // ... + + async loadCustomCacheHandlers() { + - const { cacheMaxMemorySize, cacheHandlers } = this.nextConfig; + + const cacheHandlers = null; + +const handlersSymbol = Symbol.for('@next/cache-handlers'); + +const handlersMapSymbol = Symbol.for('@next/cache-handlers-map'); + +const handlersSetSymbol = Symbol.for('@next/cache-handlers-set'); + +globalThis[handlersMapSymbol] = new Map(); + +globalThis[handlersMapSymbol].set("default", require('manifest').default); + +globalThis[handlersSetSymbol] = new Set(globalThis[handlersMapSymbol].values()); + if (!cacheHandlers) return; + // If we've already initialized the cache handlers interface, don't do it + // again. + if (!(0, _handlers.initializeCacheHandlers)(cacheMaxMemorySize)) return; + " + `); + }); + test("disable node middleware", () => { - expect(computePatchDiff("next-server.js", nextServerCode, disableNodeMiddlewareRule)) + expect(computePatchDiff("next-server.js", next15ServerCode, disableNodeMiddlewareRule)) .toMatchInlineSnapshot(` "Index: next-server.js =================================================================== @@ -312,7 +362,8 @@ class NextNodeServer extends _baseserver.default { }); test("attachRequestMeta", () => { - expect(computePatchDiff("next-server.js", nextServerCode, attachRequestMetaRule)).toMatchInlineSnapshot(` + expect(computePatchDiff("next-server.js", next15ServerCode, attachRequestMetaRule)) + .toMatchInlineSnapshot(` "Index: next-server.js =================================================================== --- next-server.js diff --git a/packages/cloudflare/src/cli/build/patches/plugins/next-server.ts b/packages/cloudflare/src/cli/build/patches/plugins/next-server.ts index 99355f181..5b4ff2470 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/next-server.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/next-server.ts @@ -102,7 +102,11 @@ fix: |- export function createComposableCacheHandlersRule(handlerPath: string) { return ` rule: - pattern: "const { cacheHandlers } = this.nextConfig.experimental;" + # matches + # - const { cacheHandlers } = this.nextConfig.experimental; pre Next 16 + # - const { cacheMaxMemorySize, cacheHandlers } = this.nextConfig; from Next 16 + kind: lexical_declaration + regex: cacheHandlers inside: kind: method_definition has: diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 616fe0247..2334aabda 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -526,8 +526,8 @@ importers: specifier: workspace:* version: link:../../../packages/cloudflare next: - specifier: 15.4.2-canary.29 - version: 15.4.2-canary.29(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.3(react@19.0.3))(react@19.0.3) + specifier: catalog:e2e + version: 16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.3(react@19.0.3))(react@19.0.3) react: specifier: catalog:e2e version: 19.0.3 @@ -1118,8 +1118,8 @@ importers: specifier: 'catalog:' version: 1.31.0 '@opennextjs/aws': - specifier: 3.9.6 - version: 3.9.6(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) + specifier: 3.9.7 + version: 3.9.7(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) cloudflare: specifier: ^4.4.1 version: 4.4.1 @@ -3526,9 +3526,6 @@ packages: '@next/env@15.0.0-canary.174': resolution: {integrity: sha512-2S0Jpc4yzsLq5xfIHknQob5k3ME9oI7syQH1fNJ3tv/HP1DVLmTWDRylPScLLUJGvOg7SEgnYK87P45cTNdfUQ==} - '@next/env@15.4.2-canary.29': - resolution: {integrity: sha512-zmkSqVO16lUnanrgywv4SfgiLyMI2V/IxEgRTKcded5Lor0jXC73eqtjTL4vKpFKK771l7M0zILv8Hv5uHsR1A==} - '@next/env@15.5.9': resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} @@ -3559,12 +3556,6 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.4.2-canary.29': - resolution: {integrity: sha512-W0isQe+NuLgGEccJoqfuikN8irbHrq7qHYI+w2hdw0l6CzgvKa4GYEQV4FnblK9epa9rU+SRdTB428vzl5eesQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - '@next/swc-darwin-arm64@15.5.7': resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} engines: {node: '>= 10'} @@ -3589,12 +3580,6 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.4.2-canary.29': - resolution: {integrity: sha512-vPIml27iYFMqRNwYRO82leBuBs0Boach3thGfrUIzbDUambfQmKaylMBaEYkX2s7if+p+FmmCHY0XYrRHQf4yQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - '@next/swc-darwin-x64@15.5.7': resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} engines: {node: '>= 10'} @@ -3619,12 +3604,6 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.4.2-canary.29': - resolution: {integrity: sha512-OfjJBsSqHCNzcyMkMD2zoMOe6/l1EIWkuWYGPmffImSvPelXwY42FL42VHvYvnX6cq8xeOOEj6WIj03mPiErIA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - '@next/swc-linux-arm64-gnu@15.5.7': resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} @@ -3649,12 +3628,6 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.4.2-canary.29': - resolution: {integrity: sha512-U2Rp+q3Fs/1P6/UPEIhSJ4zOuEUnq1SSLjsLdra1ZJNrt/bOiulB8EtCaGzNCP+Fc/C3x0o7HswUL1PTGPCaqA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - '@next/swc-linux-arm64-musl@15.5.7': resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} @@ -3679,12 +3652,6 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.4.2-canary.29': - resolution: {integrity: sha512-naAxNmS9fB4ayezHHWnoM2nHyxHge1V8rJnJ5sGFQDexsZI0B5u4ghvVrPvX+z7u3vyOhJrWQuXiAXHcbBP2xg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - '@next/swc-linux-x64-gnu@15.5.7': resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} @@ -3709,12 +3676,6 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.4.2-canary.29': - resolution: {integrity: sha512-4Id31wM5uep5jqwyvFlfzduPaXa6sbLdgQk+wWVMsSC9FqiIkevIB541OP/MnsoiQ6djTmd1NiRxeC0ffR7Llw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - '@next/swc-linux-x64-musl@15.5.7': resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} @@ -3739,12 +3700,6 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.4.2-canary.29': - resolution: {integrity: sha512-6x5I4/MskJ9rXC8Co+U9sAXUqGfz+pzikNE5Bt6atwILP39GNLV1RxkcZUHx1/qK/Z5+NFsUmPNfjlH6auph+g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - '@next/swc-win32-arm64-msvc@15.5.7': resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} engines: {node: '>= 10'} @@ -3781,12 +3736,6 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@15.4.2-canary.29': - resolution: {integrity: sha512-yKyOuM2HH1Ryvd80q+5wYZrMIcn8+4sEJo5++Ywf0CFEnkSZdj6gl5BX2qU4OdryiR2E/29PFwv7qEYTFUaXiQ==} - 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'} @@ -3895,8 +3844,8 @@ packages: '@octokit/types@13.10.0': resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - '@opennextjs/aws@3.9.6': - resolution: {integrity: sha512-46Z4si6Ov7pyiamRDovtfett8d1CLwIVSqMiPBrcPMD+we8DQpqBJeI1uM2y1KiOjwFpH8MKNXGtftpdACP0+g==} + '@opennextjs/aws@3.9.7': + resolution: {integrity: sha512-rj5br5fvWWqKsJo4YZvMowM4ObR2cz+dwCGuBA7amCiA+RpVmzcGfvfMucf01pUwhxxPgvdhXqdg7P2NVzQmkw==} hasBin: true peerDependencies: next: ^14.2.35 || ~15.0.7 || ~15.1.11 || ~15.2.8 || ~15.3.8 || ~15.4.10 || ~15.5.9 || ^16.0.10 @@ -7981,27 +7930,6 @@ packages: sass: optional: true - next@15.4.2-canary.29: - resolution: {integrity: sha512-jRBUNrhf69oYsxbo2sFRB9W5ZI8Wav5CEMKyRG+DQwZhRyEQ2+kpS0+j/bfBjs11CBk3fhGMoQti2/EoRlWInQ==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@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 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - 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} @@ -12975,8 +12903,6 @@ snapshots: '@next/env@15.0.0-canary.174': {} - '@next/env@15.4.2-canary.29': {} - '@next/env@15.5.9': {} '@next/env@16.0.10': {} @@ -13003,9 +12929,6 @@ snapshots: '@next/swc-darwin-arm64@15.0.0-canary.174': optional: true - '@next/swc-darwin-arm64@15.4.2-canary.29': - optional: true - '@next/swc-darwin-arm64@15.5.7': optional: true @@ -13018,9 +12941,6 @@ snapshots: '@next/swc-darwin-x64@15.0.0-canary.174': optional: true - '@next/swc-darwin-x64@15.4.2-canary.29': - optional: true - '@next/swc-darwin-x64@15.5.7': optional: true @@ -13033,9 +12953,6 @@ snapshots: '@next/swc-linux-arm64-gnu@15.0.0-canary.174': optional: true - '@next/swc-linux-arm64-gnu@15.4.2-canary.29': - optional: true - '@next/swc-linux-arm64-gnu@15.5.7': optional: true @@ -13048,9 +12965,6 @@ snapshots: '@next/swc-linux-arm64-musl@15.0.0-canary.174': optional: true - '@next/swc-linux-arm64-musl@15.4.2-canary.29': - optional: true - '@next/swc-linux-arm64-musl@15.5.7': optional: true @@ -13063,9 +12977,6 @@ snapshots: '@next/swc-linux-x64-gnu@15.0.0-canary.174': optional: true - '@next/swc-linux-x64-gnu@15.4.2-canary.29': - optional: true - '@next/swc-linux-x64-gnu@15.5.7': optional: true @@ -13078,9 +12989,6 @@ snapshots: '@next/swc-linux-x64-musl@15.0.0-canary.174': optional: true - '@next/swc-linux-x64-musl@15.4.2-canary.29': - optional: true - '@next/swc-linux-x64-musl@15.5.7': optional: true @@ -13093,9 +13001,6 @@ snapshots: '@next/swc-win32-arm64-msvc@15.0.0-canary.174': optional: true - '@next/swc-win32-arm64-msvc@15.4.2-canary.29': - optional: true - '@next/swc-win32-arm64-msvc@15.5.7': optional: true @@ -13114,9 +13019,6 @@ snapshots: '@next/swc-win32-x64-msvc@15.0.0-canary.174': optional: true - '@next/swc-win32-x64-msvc@15.4.2-canary.29': - optional: true - '@next/swc-win32-x64-msvc@15.5.7': optional: true @@ -13232,7 +13134,7 @@ snapshots: dependencies: '@octokit/openapi-types': 24.2.0 - '@opennextjs/aws@3.9.6(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': + '@opennextjs/aws@3.9.7(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': dependencies: '@ast-grep/napi': 0.40.0 '@aws-sdk/client-cloudfront': 3.398.0 @@ -18879,31 +18781,6 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.4.2-canary.29(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.3(react@19.0.3))(react@19.0.3): - dependencies: - '@next/env': 15.4.2-canary.29 - '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001717 - postcss: 8.4.31 - react: 19.0.3 - react-dom: 19.0.3(react@19.0.3) - styled-jsx: 5.1.6(react@19.0.3) - optionalDependencies: - '@next/swc-darwin-arm64': 15.4.2-canary.29 - '@next/swc-darwin-x64': 15.4.2-canary.29 - '@next/swc-linux-arm64-gnu': 15.4.2-canary.29 - '@next/swc-linux-arm64-musl': 15.4.2-canary.29 - '@next/swc-linux-x64-gnu': 15.4.2-canary.29 - '@next/swc-linux-x64-musl': 15.4.2-canary.29 - '@next/swc-win32-arm64-msvc': 15.4.2-canary.29 - '@next/swc-win32-x64-msvc': 15.4.2-canary.29 - '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.51.1 - sharp: 0.34.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 15.5.9