From 14566bb554125ee0d2afdeaa750e6ae362ec231f Mon Sep 17 00:00:00 2001 From: Magnus Dahl Eide Date: Fri, 1 Aug 2025 10:59:23 +0200 Subject: [PATCH 01/12] add(patch): Make ISR work for Next 15.4 by adding a patch for route-module --- packages/cloudflare/src/cli/build/build.ts | 14 +- .../cloudflare/src/cli/build/bundle-server.ts | 2 + .../patches/plugins/route-module.spec.ts | 382 ++++++++++++++++++ .../cli/build/patches/plugins/route-module.ts | 61 +++ 4 files changed, 452 insertions(+), 7 deletions(-) create mode 100644 packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts create mode 100644 packages/cloudflare/src/cli/build/patches/plugins/route-module.ts diff --git a/packages/cloudflare/src/cli/build/build.ts b/packages/cloudflare/src/cli/build/build.ts index da6e3bbf..6f3868f8 100644 --- a/packages/cloudflare/src/cli/build/build.ts +++ b/packages/cloudflare/src/cli/build/build.ts @@ -99,11 +99,11 @@ function ensureNextjsVersionSupported(options: buildHelper.BuildOptions) { } // TODO: remove when 15.4 is supported // Note: `e2e/experimental` is on 15.4.0-canary.14 which works - if ( - !options.appPath.endsWith("opennextjs-cloudflare/examples/e2e/experimental") && - buildHelper.compareSemver(options.nextVersion, ">=", "15.4.0") - ) { - logger.error("Next.js version unsupported, the latest supported version is 15.3"); - process.exit(1); - } + // if ( + // !options.appPath.endsWith("opennextjs-cloudflare/examples/e2e/experimental") && + // buildHelper.compareSemver(options.nextVersion, ">=", "15.4.0") + // ) { + // logger.error("Next.js version unsupported, the latest supported version is 15.3"); + // process.exit(1); + // } } diff --git a/packages/cloudflare/src/cli/build/bundle-server.ts b/packages/cloudflare/src/cli/build/bundle-server.ts index a00d250d..12d30faf 100644 --- a/packages/cloudflare/src/cli/build/bundle-server.ts +++ b/packages/cloudflare/src/cli/build/bundle-server.ts @@ -22,6 +22,7 @@ import { patchPagesRouterContext } from "./patches/plugins/pages-router-context. import { patchDepdDeprecations } from "./patches/plugins/patch-depd-deprecations.js"; import { fixRequire } from "./patches/plugins/require.js"; import { shimRequireHook } from "./patches/plugins/require-hook.js"; +import { patchRouteModules } from "./patches/plugins/route-module.js"; import { setWranglerExternal } from "./patches/plugins/wrangler-external.js"; import { copyPackageCliFiles, needsExperimentalReact, normalizePath } from "./utils/index.js"; @@ -103,6 +104,7 @@ export async function bundleServer(buildOpts: BuildOptions, projectOpts: Project inlineFindDir(updater, buildOpts), inlineLoadManifest(updater, buildOpts), patchNextServer(updater, buildOpts), + patchRouteModules(updater, buildOpts), patchDepdDeprecations(updater), patchResolveCache(updater, buildOpts), // Apply updater updates, must be the last plugin diff --git a/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts b/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts new file mode 100644 index 00000000..a802aa1c --- /dev/null +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts @@ -0,0 +1,382 @@ +import { expect, test } from "vitest"; + +import { computePatchDiff } from "../../utils/test-patch.js"; +import { getIncrementalCacheRule } from "./route-module.js"; + +const code = `class n9 { + constructor({ userland: e10, definition: t10, distDir: r10, projectDir: n10 }) { + this.userland = e10, this.definition = t10, this.isDev = false, this.distDir = r10, this.projectDir = n10; + } + async getIncrementalCache(e10, t10, n10) { + { + let i2, { cacheHandler: a2 } = t10; + if (a2) { + let { formatDynamicImportPath: e11 } = r("./dist/esm/lib/format-dynamic-import-path.js"); + i2 = rn(await n5(e11(this.distDir, a2))); + } + let { join: s2 } = r("node:path"), o2 = B(e10, "projectDir") || s2(process.cwd(), this.projectDir); + return await this.loadCustomCacheHandlers(e10, t10), new n3({ fs: r("./dist/esm/server/lib/node-fs-methods.js").V, dev: this.isDev, requestHeaders: e10.headers, allowedRevalidateHeaderKeys: t10.experimental.allowedRevalidateHeaderKeys, minimalMode: B(e10, "minimalMode"), serverDistDir: \`\${o2}/\${this.distDir}/server\`, fetchCacheKeyPrefix: t10.experimental.fetchCacheKeyPrefix, maxMemoryCacheSize: t10.cacheMaxMemorySize, flushToDisk: t10.experimental.isrFlushToDisk, getPrerenderManifest: () => n10, CurCacheHandler: i2 }); + } + } + async onRequestError(e10, t10, r10, n10) { + (null == n10 ? void 0 : n10.logErrorWithOriginalStack) ? n10.logErrorWithOriginalStack(t10, "app-dir") : console.error(t10), await this.instrumentationOnRequestError(e10, t10, { path: e10.url || "/", headers: e10.headers, method: e10.method || "GET" }, r10); + } + async prepare(e10, t10, { srcPage: n10, multiZoneDraftMode: i2 }) { + var a2; + let s2, o2, l2, u2; + { + let { join: t11, relative: n11 } = r("node:path"); + s2 = B(e10, "projectDir") || t11(process.cwd(), this.projectDir); + let i3 = B(e10, "distDir"); + i3 && (this.distDir = n11(s2, i3)); + let { ensureInstrumentationRegistered: a3 } = await Promise.resolve().then(r.t.bind(r, "../lib/router-utils/instrumentation-globals.external", 23)); + a3(s2, this.distDir); + } + let c2 = await this.loadManifests(n10, s2), { routesManifest: d2, prerenderManifest: f2, serverFilesManifest: h2 } = c2, { basePath: p2, i18n: m2, rewrites: g2 } = d2; + p2 && (e10.url = ee(e10.url || "/", p2)); + let y2 = ng(e10.url || "/"); + if (!y2) return; + let v2 = false; + (0, J.Y)(y2.pathname || "/", "/_next/data") && (v2 = true, y2.pathname = nG(y2.pathname || "/")); + let b2 = y2.pathname || "/", _2 = { ...y2.query }, w2 = nz(n10); + m2 && (o2 = Z(y2.pathname || "/", m2.locales)).detectedLocale && (e10.url = \`\${o2.pathname}\${y2.search}\`, b2 = o2.pathname, l2 || (l2 = o2.detectedLocale)); + let S2 = function({ page: e11, i18n: t11, basePath: n11, rewrites: i3, pageIsDynamic: a3, trailingSlash: s3, caseSensitive: o3 }) { + let l3, u3, c3; + return a3 && (c3 = (u3 = nf(l3 = function(e12, t12) { + var r10, n12, i4; + let a4 = function(e13, t13, r11, n13, i5) { + let a5, s5 = (a5 = 0, () => { + let e14 = "", t14 = ++a5; + for (; t14 > 0; ) e14 += String.fromCharCode(97 + (t14 - 1) % 26), t14 = Math.floor((t14 - 1) / 26); + return e14; + }), o4 = {}, l4 = []; + for (let a6 of (0, X.Q)(e13).slice(1).split("/")) { + let e14 = tp.Wz.some((e15) => a6.startsWith(e15)), u4 = a6.match(rq); + if (e14 && u4 && u4[2]) l4.push(rG({ getSafeRouteKey: s5, interceptionMarker: u4[1], segment: u4[2], routeKeys: o4, keyPrefix: t13 ? q.u7 : void 0, backreferenceDuplicateKeys: i5 })); + else if (u4 && u4[2]) { + n13 && u4[1] && l4.push("/" + rB(u4[1])); + let e15 = rG({ getSafeRouteKey: s5, segment: u4[2], routeKeys: o4, keyPrefix: t13 ? q.dN : void 0, backreferenceDuplicateKeys: i5 }); + n13 && u4[1] && (e15 = e15.substring(1)), l4.push(e15); + } else l4.push("/" + rB(a6)); + r11 && u4 && u4[3] && l4.push(rB(u4[3])); + } + return { namedParameterizedRoute: l4.join(""), routeKeys: o4 }; + }(e12, t12.prefixRouteKeys, null != (r10 = t12.includeSuffix) && r10, null != (n12 = t12.includePrefix) && n12, null != (i4 = t12.backreferenceDuplicateKeys) && i4), s4 = a4.namedParameterizedRoute; + return t12.excludeOptionalTrailingSlash || (s4 += "(?:/)?"), { ...function(e13, t13) { + let { includeSuffix: r11 = false, includePrefix: n13 = false, excludeOptionalTrailingSlash: i5 = false } = void 0 === t13 ? {} : t13, { parameterizedRoute: a5, groups: s5 } = function(e14, t14, r12) { + let n14 = {}, i6 = 1, a6 = []; + for (let s6 of (0, X.Q)(e14).slice(1).split("/")) { + let e15 = tp.Wz.find((e16) => s6.startsWith(e16)), o5 = s6.match(rq); + if (e15 && o5 && o5[2]) { + let { key: t15, optional: r13, repeat: s7 } = rz(o5[2]); + n14[t15] = { pos: i6++, repeat: s7, optional: r13 }, a6.push("/" + rB(e15) + "([^/]+?)"); + } else if (o5 && o5[2]) { + let { key: e16, repeat: t15, optional: s7 } = rz(o5[2]); + n14[e16] = { pos: i6++, repeat: t15, optional: s7 }, r12 && o5[1] && a6.push("/" + rB(o5[1])); + let l4 = t15 ? s7 ? "(?:/(.+?))?" : "/(.+?)" : "/([^/]+?)"; + r12 && o5[1] && (l4 = l4.substring(1)), a6.push(l4); + } else a6.push("/" + rB(s6)); + t14 && o5 && o5[3] && a6.push(rB(o5[3])); + } + return { parameterizedRoute: a6.join(""), groups: n14 }; + }(e13, r11, n13), o4 = a5; + return i5 || (o4 += "(?:/)?"), { re: RegExp("^" + o4 + "$"), groups: s5 }; + }(e12, t12), namedRegex: "^" + s4 + "$", routeKeys: a4.routeKeys }; + }(e11, { prefixRouteKeys: false })))(e11)), { handleRewrites: function(l4, c4) { + let d3 = {}, f3 = c4.pathname, h3 = (i4) => { + let h4 = function(e12, t12) { + let r10 = [], n12 = (0, nd.pathToRegexp)(e12, r10, { delimiter: "/", sensitive: "boolean" == typeof (null == t12 ? void 0 : t12.sensitive) && t12.sensitive, strict: null == t12 ? void 0 : t12.strict }), i5 = (0, nd.regexpToFunction)((null == t12 ? void 0 : t12.regexModifier) ? new RegExp(t12.regexModifier(n12.source), n12.flags) : n12, r10); + return (e13, n13) => { + if ("string" != typeof e13) return false; + let a4 = i5(e13); + if (!a4) return false; + if (null == t12 ? void 0 : t12.removeUnnamedParams) for (let e14 of r10) "number" == typeof e14.name && delete a4.params[e14.name]; + return { ...n13, ...a4.params }; + }; + }(i4.source + (s3 ? "(/)?" : ""), { removeUnnamedParams: true, strict: true, sensitive: !!o3 }); + if (!c4.pathname) return false; + let p3 = h4(c4.pathname); + if ((i4.has || i4.missing) && p3) { + let e12 = function(e13, t12, n12, i5) { + void 0 === n12 && (n12 = []), void 0 === i5 && (i5 = []); + let a4 = {}, s4 = (n13) => { + let i6, s5 = n13.key; + switch (n13.type) { + case "header": + s5 = s5.toLowerCase(), i6 = e13.headers[s5]; + break; + case "cookie": + if ("cookies" in e13) i6 = e13.cookies[n13.key]; + else { + var o4; + i6 = (o4 = e13.headers, function() { + let { cookie: e14 } = o4; + if (!e14) return {}; + let { parse: t13 } = r("./dist/compiled/cookie/index.js"); + return t13(Array.isArray(e14) ? e14.join("; ") : e14); + })()[n13.key]; + } + break; + case "query": + i6 = t12[s5]; + break; + case "host": { + let { host: t13 } = (null == e13 ? void 0 : e13.headers) || {}; + i6 = null == t13 ? void 0 : t13.split(":", 1)[0].toLowerCase(); + } + } + if (!n13.value && i6) return a4[function(e14) { + let t13 = ""; + for (let r10 = 0; r10 < e14.length; r10++) { + let n14 = e14.charCodeAt(r10); + (n14 > 64 && n14 < 91 || n14 > 96 && n14 < 123) && (t13 += e14[r10]); + } + return t13; + }(s5)] = i6, true; + if (i6) { + let e14 = RegExp("^" + n13.value + "$"), t13 = Array.isArray(i6) ? i6.slice(-1)[0].match(e14) : i6.match(e14); + if (t13) return Array.isArray(t13) && (t13.groups ? Object.keys(t13.groups).forEach((e15) => { + a4[e15] = t13.groups[e15]; + }) : "host" === n13.type && t13[0] && (a4.host = t13[0])), true; + } + return false; + }; + return !(!n12.every((e14) => s4(e14)) || i5.some((e14) => s4(e14))) && a4; + }(l4, c4.query, i4.has, i4.missing); + e12 ? Object.assign(p3, e12) : p3 = false; + } + if (p3) { + try { + var m3, g3; + if ((null == (g3 = i4.has) || null == (m3 = g3[0]) ? void 0 : m3.key) === em.TP) { + let e12 = l4.headers[em.Tk.toLowerCase()]; + e12 && (p3 = { ...(0, r1.Fb)(tw(e12)), ...p3 }); + } + } catch (e12) { + } + let { parsedDestination: r10, destQuery: s4 } = function(e12) { + let t12, r11, n12 = function(e13) { + let t13 = e13.destination; + for (let r13 of Object.keys({ ...e13.params, ...e13.query })) r13 && (t13 = t13.replace(RegExp(":" + rB(r13), "g"), "__ESC_COLON_" + r13)); + let r12 = function(e14) { + if (e14.startsWith("/")) return rJ(e14); + let t14 = new URL(e14); + return { hash: t14.hash, hostname: t14.hostname, href: t14.href, pathname: t14.pathname, port: t14.port, protocol: t14.protocol, query: rV(t14.searchParams), search: t14.search, slashes: "//" === t14.href.slice(t14.protocol.length, t14.protocol.length + 2) }; + }(t13), n13 = r12.pathname; + n13 && (n13 = nh(n13)); + let i6 = r12.href; + i6 && (i6 = nh(i6)); + let a5 = r12.hostname; + a5 && (a5 = nh(a5)); + let s6 = r12.hash; + return s6 && (s6 = nh(s6)), { ...r12, pathname: n13, hostname: a5, href: i6, hash: s6 }; + }(e12), { hostname: i5, query: a4 } = n12, s5 = n12.pathname; + n12.hash && (s5 = "" + s5 + n12.hash); + let o4 = [], l5 = []; + for (let e13 of ((0, nd.pathToRegexp)(s5, l5), l5)) o4.push(e13.name); + if (i5) { + let e13 = []; + for (let t13 of ((0, nd.pathToRegexp)(i5, e13), e13)) o4.push(t13.name); + } + let u4 = (0, nd.compile)(s5, { validate: false }); + for (let [r12, n13] of (i5 && (t12 = (0, nd.compile)(i5, { validate: false })), Object.entries(a4))) Array.isArray(n13) ? a4[r12] = n13.map((t13) => np(nh(t13), e12.params)) : "string" == typeof n13 && (a4[r12] = np(nh(n13), e12.params)); + let c5 = Object.keys(e12.params).filter((e13) => "nextInternalLocale" !== e13); + if (e12.appendParamsToQuery && !c5.some((e13) => o4.includes(e13))) for (let t13 of c5) t13 in a4 || (a4[t13] = e12.params[t13]); + if ((0, tp.Ag)(s5)) for (let t13 of s5.split("/")) { + let r12 = tp.Wz.find((e13) => t13.startsWith(e13)); + if (r12) { + "(..)(..)" === r12 ? (e12.params["0"] = "(..)", e12.params["1"] = "(..)") : e12.params["0"] = r12; + break; + } + } + try { + let [i6, a5] = (r11 = u4(e12.params)).split("#", 2); + t12 && (n12.hostname = t12(e12.params)), n12.pathname = i6, n12.hash = (a5 ? "#" : "") + (a5 || ""), delete n12.search; + } catch (e13) { + if (e13.message.match(/Expected .*? to not repeat, but got an array/)) throw Object.defineProperty(Error("To use a multi-match in the destination you must add \`*\` at the end of the param name to signify it should repeat. https://nextjs.org/docs/messages/invalid-multi-match"), "__NEXT_ERROR_CODE", { value: "E329", enumerable: false, configurable: true }); + throw e13; + } + return n12.query = { ...e12.query, ...n12.query }, { newUrl: r11, destQuery: a4, parsedDestination: n12 }; + }({ appendParamsToQuery: true, destination: i4.destination, params: p3, query: c4.query }); + if (r10.protocol) return true; + if (Object.assign(d3, s4, p3), Object.assign(c4.query, r10.query), delete r10.query, Object.entries(c4.query).forEach(([e12, t12]) => { + if (t12 && "string" == typeof t12 && t12.startsWith(":")) { + let r11 = d3[t12.slice(1)]; + r11 && (c4.query[e12] = r11); + } + }), Object.assign(c4, r10), !(f3 = c4.pathname)) return false; + if (n11 && (f3 = f3.replace(RegExp(\`^\${n11}\`), "") || "/"), t11) { + let e12 = Z(f3, t11.locales); + f3 = e12.pathname, c4.query.nextInternalLocale = e12.detectedLocale || p3.nextInternalLocale; + } + if (f3 === e11) return true; + if (a3 && u3) { + let e12 = u3(f3); + if (e12) return c4.query = { ...c4.query, ...e12 }, true; + } + } + return false; + }; + for (let e12 of i3.beforeFiles || []) h3(e12); + if (f3 !== e11) { + let t12 = false; + for (let e12 of i3.afterFiles || []) if (t12 = h3(e12)) break; + if (!t12 && !(() => { + let t13 = (0, X.Q)(f3 || ""); + return t13 === (0, X.Q)(e11) || (null == u3 ? void 0 : u3(t13)); + })()) { + for (let e12 of i3.fallback || []) if (t12 = h3(e12)) break; + } + } + return d3; + }, defaultRouteRegex: l3, dynamicRouteMatcher: u3, defaultRouteMatches: c3, normalizeQueryParams: function(e12, t12) { + for (let [r10, n12] of (delete e12.nextInternalLocale, Object.entries(e12))) { + let i4 = z(r10); + i4 && (delete e12[r10], t12.add(i4), void 0 !== n12 && (e12[i4] = Array.isArray(n12) ? n12.map((e13) => nm(e13)) : nm(n12))); + } + }, getParamsFromRouteMatches: function(e12) { + if (!l3) return null; + let { groups: t12, routeKeys: r10 } = l3, n12 = nf({ re: { exec: (e13) => { + let n13 = Object.fromEntries(new URLSearchParams(e13)); + for (let [e14, t13] of Object.entries(n13)) { + let r11 = z(e14); + r11 && (n13[r11] = t13, delete n13[e14]); + } + let i4 = {}; + for (let e14 of Object.keys(r10)) { + let a4 = r10[e14]; + if (!a4) continue; + let s4 = t12[a4], o4 = n13[e14]; + if (!s4.optional && !o4) return null; + i4[s4.pos] = o4; + } + return i4; + } }, groups: t12 })(e12); + return n12 || null; + }, normalizeDynamicRouteParams: (e12, t12) => { + if (!l3 || !c3) return { params: {}, hasValidParams: false }; + var r10 = l3, n12 = c3; + let i4 = {}; + for (let a4 of Object.keys(r10.groups)) { + let s4 = e12[a4]; + "string" == typeof s4 ? s4 = (0, eQ.b)(s4) : Array.isArray(s4) && (s4 = s4.map(eQ.b)); + let o4 = n12[a4], l4 = r10.groups[a4].optional; + if ((Array.isArray(o4) ? o4.some((e13) => Array.isArray(s4) ? s4.some((t13) => t13.includes(e13)) : null == s4 ? void 0 : s4.includes(e13)) : null == s4 ? void 0 : s4.includes(o4)) || void 0 === s4 && !(l4 && t12)) return { params: {}, hasValidParams: false }; + l4 && (!s4 || Array.isArray(s4) && 1 === s4.length && ("index" === s4[0] || s4[0] === \`[[...\${a4}]]\`)) && (s4 = void 0, delete e12[a4]), s4 && "string" == typeof s4 && r10.groups[a4].repeat && (s4 = s4.split("/")), s4 && (i4[a4] = s4); + } + return { params: i4, hasValidParams: true }; + }, normalizeCdnUrl: (e12, t12) => function(e13, t13) { + let r10 = ng(e13.url); + if (!r10) return e13.url; + delete r10.search, nv(r10.query, t13), e13.url = function(e14) { + let { auth: t14, hostname: r11 } = e14, n12 = e14.protocol || "", i4 = e14.pathname || "", a4 = e14.hash || "", s4 = e14.query || "", o4 = false; + t14 = t14 ? encodeURIComponent(t14).replace(/%3A/i, ":") + "@" : "", e14.host ? o4 = t14 + e14.host : r11 && (o4 = t14 + (~r11.indexOf(":") ? "[" + r11 + "]" : r11), e14.port && (o4 += ":" + e14.port)), s4 && "object" == typeof s4 && (s4 = String(function(e15) { + let t15 = new URLSearchParams(); + for (let [r12, n13] of Object.entries(e15)) if (Array.isArray(n13)) for (let e16 of n13) t15.append(r12, rK(e16)); + else t15.set(r12, rK(n13)); + return t15; + }(s4))); + let l4 = e14.search || s4 && "?" + s4 || ""; + return n12 && !n12.endsWith(":") && (n12 += ":"), e14.slashes || (!n12 || ny.test(n12)) && false !== o4 ? (o4 = "//" + (o4 || ""), i4 && "/" !== i4[0] && (i4 = "/" + i4)) : o4 || (o4 = ""), a4 && "#" !== a4[0] && (a4 = "#" + a4), l4 && "?" !== l4[0] && (l4 = "?" + l4), "" + n12 + o4 + (i4 = i4.replace(/[?#]/g, encodeURIComponent)) + (l4 = l4.replace("#", "%23")) + a4; + }(r10); + }(e12, t12), interpolateDynamicPath: (e12, t12) => function(e13, t13, r10) { + if (!r10) return e13; + for (let n12 of Object.keys(r10.groups)) { + let i4, { optional: a4, repeat: s4 } = r10.groups[n12], o4 = \`[\${s4 ? "..." : ""}\${n12}]\`; + a4 && (o4 = \`[\${o4}]\`); + let l4 = t13[n12]; + ((i4 = Array.isArray(l4) ? l4.map((e14) => e14 && encodeURIComponent(e14)).join("/") : l4 ? encodeURIComponent(l4) : "") || a4) && (e13 = e13.replaceAll(o4, i4)); + } + return e13; + }(e12, t12, l3), filterInternalQuery: (e12, t12) => nv(e12, t12) }; + }({ page: n10, i18n: m2, basePath: p2, rewrites: g2, pageIsDynamic: w2, trailingSlash: process.env.__NEXT_TRAILING_SLASH, caseSensitive: !!d2.caseSensitive }), k2 = G(null == m2 ? void 0 : m2.domains, Y(y2, e10.headers), l2); + !function(e11, t11, r10) { + let n11 = B(e11); + n11[t11] = r10, e11[H] = n11; + }(e10, "isLocaleDomain", !!k2); + let E2 = (null == k2 ? void 0 : k2.defaultLocale) || (null == m2 ? void 0 : m2.defaultLocale); + E2 && !l2 && (y2.pathname = \`/\${E2}\${"/" === y2.pathname ? "" : y2.pathname}\`); + let R2 = B(e10, "locale") || l2 || E2, x2 = Object.keys(S2.handleRewrites(e10, y2)); + m2 && (y2.pathname = Z(y2.pathname || "/", m2.locales).pathname); + let C2 = B(e10, "params"); + if (!C2 && S2.dynamicRouteMatcher) { + let e11 = S2.dynamicRouteMatcher(nG((null == o2 ? void 0 : o2.pathname) || y2.pathname || "/")), t11 = S2.normalizeDynamicRouteParams(e11 || {}, true); + t11.hasValidParams && (C2 = t11.params); + } + let T2 = B(e10, "query") || { ...y2.query }, P2 = /* @__PURE__ */ new Set(), j2 = []; + if (!this.isAppRouter) for (let e11 of [...x2, ...Object.keys(S2.defaultRouteMatches || {})]) { + let t11 = Array.isArray(_2[e11]) ? _2[e11].join("") : _2[e11], r10 = Array.isArray(T2[e11]) ? T2[e11].join("") : T2[e11]; + e11 in _2 && t11 !== r10 || j2.push(e11); + } + if (S2.normalizeCdnUrl(e10, j2), S2.normalizeQueryParams(T2, P2), S2.filterInternalQuery(_2, j2), w2) { + let t11 = S2.normalizeDynamicRouteParams(T2, true), r10 = S2.normalizeDynamicRouteParams(C2 || {}, true).hasValidParams && C2 ? C2 : t11.hasValidParams ? T2 : {}; + if (e10.url = S2.interpolateDynamicPath(e10.url || "/", r10), y2.pathname = S2.interpolateDynamicPath(y2.pathname || "/", r10), b2 = S2.interpolateDynamicPath(b2, r10), !C2) if (t11.hasValidParams) for (let e11 in C2 = Object.assign({}, t11.params), S2.defaultRouteMatches) delete T2[e11]; + else { + let e11 = null == S2.dynamicRouteMatcher ? void 0 : S2.dynamicRouteMatcher.call(S2, nG((null == o2 ? void 0 : o2.pathname) || y2.pathname || "/")); + e11 && (C2 = Object.assign({}, e11)); + } + } + for (let e11 of P2) e11 in _2 || delete T2[e11]; + let { isOnDemandRevalidate: O2, revalidateOnlyGenerated: A2 } = (0, eC.checkIsOnDemandRevalidate)(e10, f2.preview), D2 = false; + if (t10) { + let { tryGetPreviewData: n11 } = r("./dist/esm/server/api-utils/node/try-get-preview-data.js"); + D2 = false !== (u2 = n11(e10, t10, f2.preview, !!i2)); + } + let N2 = null == (a2 = n6[n8]) ? void 0 : a2[this.projectDir], I2 = (null == N2 ? void 0 : N2.nextConfig) || h2.config, M2 = (0, eQ.w)(n10), $2 = B(e10, "rewroteURL") || M2; + nz($2) && C2 && ($2 = S2.interpolateDynamicPath($2, C2)), "/index" === $2 && ($2 = "/"); + try { + $2 = $2.split("/").map((e11) => { + try { + var t11; + t11 = decodeURIComponent(e11), e11 = t11.replace(RegExp("([/#?]|%(2f|23|3f|5c))", "gi"), (e12) => encodeURIComponent(e12)); + } catch (e12) { + throw Object.defineProperty(new rX("Failed to decode path param(s)."), "__NEXT_ERROR_CODE", { value: "E539", enumerable: false, configurable: true }); + } + return e11; + }).join("/"); + } catch (e11) { + } + return $2 = (0, X.Q)($2), { query: T2, originalQuery: _2, originalPathname: b2, params: C2, parsedUrl: y2, locale: R2, isNextDataRequest: v2, locales: null == m2 ? void 0 : m2.locales, defaultLocale: E2, isDraftMode: D2, previewData: u2, pageIsDynamic: w2, resolvedPathname: $2, isOnDemandRevalidate: O2, revalidateOnlyGenerated: A2, ...c2, serverActionsManifest: c2.serverActionsManifest, clientReferenceManifest: c2.clientReferenceManifest, nextConfig: I2, routerServerContext: N2 }; + } + getResponseCache(e10) { + if (!this.responseCache) { + let t10 = B(e10, "minimalMode") ?? false; + this.responseCache = new rp(t10); + } + return this.responseCache; + } + async handleResponse({ req: e10, nextConfig: t10, cacheKey: r10, routeKind: n10, isFallback: i2, prerenderManifest: a2, isRoutePPREnabled: s2, isOnDemandRevalidate: o2, revalidateOnlyGenerated: l2, responseGenerator: u2, waitUntil: c2 }) { + let d2 = this.getResponseCache(e10), f2 = await d2.get(r10, u2, { routeKind: n10, isFallback: i2, isRoutePPREnabled: s2, isOnDemandRevalidate: o2, isPrefetch: "prefetch" === e10.headers.purpose, incrementalCache: await this.getIncrementalCache(e10, t10, a2), waitUntil: c2 }); + if (!f2 && r10 && !(o2 && l2)) throw Object.defineProperty(Error("invariant: cache entry required but not generated"), "__NEXT_ERROR_CODE", { value: "E62", enumerable: false, configurable: true }); + return f2; + } +} +`; + +test("patch the createSnapshot function", () => { + expect( + computePatchDiff( + "app-page.runtime.prod.js", + code, + getIncrementalCacheRule(".open-next/server-functions/default/cache.cjs") + ) + ).toMatchInlineSnapshot(` + "Index: app-page.runtime.prod.js + =================================================================== + --- app-page.runtime.prod.js + +++ app-page.runtime.prod.js + @@ -3,9 +3,10 @@ + this.userland = e10, this.definition = t10, this.isDev = false, this.distDir = r10, this.projectDir = n10; + } + async getIncrementalCache(e10, t10, n10) { + { + - let i2, { cacheHandler: a2 } = t10; + + const a2 = null; + +i2 = require('.open-next/server-functions/default/cache.cjs').default; + if (a2) { + let { formatDynamicImportPath: e11 } = r("./dist/esm/lib/format-dynamic-import-path.js"); + i2 = rn(await n5(e11(this.distDir, a2))); + } + " + `); +}); diff --git a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts new file mode 100644 index 00000000..9bc8e955 --- /dev/null +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts @@ -0,0 +1,61 @@ +/** + * Patch for `next/src/server/route-modules/route-module.ts` + * https://github.com/vercel/next.js/blob/c8c9bef3a1dd1a95434c1865dbd7f69985ea7d54/packages/next/src/server/route-modules/route-module.ts#L389-L437 + * + * Patch getIncrementalCache to use a string literal for the cache handler path + * + */ + +import path from "node:path"; + +import { BuildOptions, getPackagePath } from "@opennextjs/aws/build/helper.js"; +import { patchCode } from "@opennextjs/aws/build/patch/astCodePatcher.js"; +import type { ContentUpdater, Plugin } from "@opennextjs/aws/plugins/content-updater.js"; +import { getCrossPlatformPathRegex } from "@opennextjs/aws/utils/regex.js"; + +import { normalizePath } from "../../utils/index.js"; + +export function patchRouteModules(updater: ContentUpdater, buildOpts: BuildOptions): Plugin { + return updater.updateContent("route-module", [ + { + filter: getCrossPlatformPathRegex(String.raw`/next/dist/compiled/next-server/.*\.runtime\.prod\.js$`, { + escape: false, + }), + versions: ">=15.4.0", + contentFilter: /getIncrementalCache\(/, + callback: async ({ contents }) => { + const { outputDir } = buildOpts; + + const outputPath = path.join(outputDir, "server-functions/default"); + const cacheHandler = path.join(outputPath, getPackagePath(buildOpts), "cache.cjs"); + contents = patchCode(contents, getIncrementalCacheRule(cacheHandler)); + return contents; + }, + }, + ]); +} + +/** + * The cache handler used by Next.js is normally defined in the config file as a path. At runtime, + * Next.js would then do a dynamic require on a transformed version of the path to retrieve the + * cache handler and create a new instance of it. + * + * This is problematic in workerd due to the dynamic import of the file that is not known from + * build-time. Therefore, we have to manually override the default way that the cache handler is + * instantiated with a dynamic require that uses a string literal for the path. + */ +export function getIncrementalCacheRule(handlerPath: string) { + return ` +rule: + pattern: "let $A, { cacheHandler: $B } = $C" + inside: + kind: method_definition + has: + field: name + regex: ^getIncrementalCache$ + stopBy: end +fix: |- + const $B = null; + $A = require('${normalizePath(handlerPath)}').default; +`; +} From 411c3d02409db480cbfe59f3d58e64fadf900706 Mon Sep 17 00:00:00 2001 From: Magnus Dahl Eide Date: Fri, 1 Aug 2025 11:17:32 +0200 Subject: [PATCH 02/12] changeset --- .changeset/rude-sloths-march.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/rude-sloths-march.md diff --git a/.changeset/rude-sloths-march.md b/.changeset/rude-sloths-march.md new file mode 100644 index 00000000..28436645 --- /dev/null +++ b/.changeset/rude-sloths-march.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/cloudflare": patch +--- + +add(patch): Patch getIncrementalCache in route-module.ts for ISR support in Next.js 15.4" From dc89bf0201ffd5fc7706429afb8b63430dee6901 Mon Sep 17 00:00:00 2001 From: Magnus Date: Fri, 1 Aug 2025 12:28:47 +0200 Subject: [PATCH 03/12] Update packages/cloudflare/src/cli/build/patches/plugins/route-module.ts Co-authored-by: Victor Berchet --- .../cloudflare/src/cli/build/patches/plugins/route-module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts index 9bc8e955..7e627f47 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts @@ -1,6 +1,6 @@ /** * Patch for `next/src/server/route-modules/route-module.ts` - * https://github.com/vercel/next.js/blob/c8c9bef3a1dd1a95434c1865dbd7f69985ea7d54/packages/next/src/server/route-modules/route-module.ts#L389-L437 + * https://github.com/vercel/next.js/blob/c8c9bef/packages/next/src/server/route-modules/route-module.ts#L389-L437 * * Patch getIncrementalCache to use a string literal for the cache handler path * From 647f4c9a97840069814c148de6f039f129b0b3ff Mon Sep 17 00:00:00 2001 From: Magnus Dahl Eide Date: Fri, 1 Aug 2025 12:34:52 +0200 Subject: [PATCH 04/12] review --- packages/cloudflare/src/cli/build/build.ts | 14 +++++++------- pnpm-workspace.yaml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/cloudflare/src/cli/build/build.ts b/packages/cloudflare/src/cli/build/build.ts index 6f3868f8..da6e3bbf 100644 --- a/packages/cloudflare/src/cli/build/build.ts +++ b/packages/cloudflare/src/cli/build/build.ts @@ -99,11 +99,11 @@ function ensureNextjsVersionSupported(options: buildHelper.BuildOptions) { } // TODO: remove when 15.4 is supported // Note: `e2e/experimental` is on 15.4.0-canary.14 which works - // if ( - // !options.appPath.endsWith("opennextjs-cloudflare/examples/e2e/experimental") && - // buildHelper.compareSemver(options.nextVersion, ">=", "15.4.0") - // ) { - // logger.error("Next.js version unsupported, the latest supported version is 15.3"); - // process.exit(1); - // } + if ( + !options.appPath.endsWith("opennextjs-cloudflare/examples/e2e/experimental") && + buildHelper.compareSemver(options.nextVersion, ">=", "15.4.0") + ) { + logger.error("Next.js version unsupported, the latest supported version is 15.3"); + process.exit(1); + } } diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 786ed532..b5b2fd23 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -45,7 +45,7 @@ catalogs: "@types/react-dom": 19.0.0 "@types/react": 19.0.0 autoprefixer: 10.4.15 - next: ~15.3.5 + next: ~15.4.5 postcss: 8.4.27 react-dom: 19.0.0 react: 19.0.0 From 3e1b86cbfcea53559fbabfe4d9ae67917897ac44 Mon Sep 17 00:00:00 2001 From: Magnus Dahl Eide Date: Fri, 1 Aug 2025 12:37:43 +0200 Subject: [PATCH 05/12] fix rule --- .../cloudflare/src/cli/build/patches/plugins/route-module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts index 7e627f47..9a12b6b0 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts @@ -52,7 +52,7 @@ rule: kind: method_definition has: field: name - regex: ^getIncrementalCache$ + regex: getIncrementalCache stopBy: end fix: |- const $B = null; From ebc7af252b480551d470bab892cecbbc8281abd5 Mon Sep 17 00:00:00 2001 From: Magnus Dahl Eide Date: Fri, 1 Aug 2025 13:08:04 +0200 Subject: [PATCH 06/12] anchor the regex --- .../src/cli/build/patches/plugins/route-module.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts index 9a12b6b0..6de14f51 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts @@ -47,15 +47,15 @@ export function patchRouteModules(updater: ContentUpdater, buildOpts: BuildOptio export function getIncrementalCacheRule(handlerPath: string) { return ` rule: - pattern: "let $A, { cacheHandler: $B } = $C" + pattern: "let $CACHE_HANDLER, { cacheHandler: $HANDLER_PATH } = $C" inside: kind: method_definition has: field: name - regex: getIncrementalCache + regex: ^getIncrementalCache$ stopBy: end fix: |- - const $B = null; - $A = require('${normalizePath(handlerPath)}').default; + const $HANDLER_PATH = null; + $CACHE_HANDLER = require('${normalizePath(handlerPath)}').default; `; } From cafa77fe25123f14ef086afba8607c8589333bb3 Mon Sep 17 00:00:00 2001 From: Magnus Date: Mon, 4 Aug 2025 13:26:49 +0200 Subject: [PATCH 07/12] Update packages/cloudflare/src/cli/build/patches/plugins/route-module.ts Co-authored-by: Victor Berchet --- .../cloudflare/src/cli/build/patches/plugins/route-module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts index 6de14f51..749c6b92 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts @@ -18,7 +18,7 @@ import { normalizePath } from "../../utils/index.js"; export function patchRouteModules(updater: ContentUpdater, buildOpts: BuildOptions): Plugin { return updater.updateContent("route-module", [ { - filter: getCrossPlatformPathRegex(String.raw`/next/dist/compiled/next-server/.*\.runtime\.prod\.js$`, { + filter: getCrossPlatformPathRegex(String.raw`/next/dist/compiled/next-server/.*?\.runtime\.prod\.js$`, { escape: false, }), versions: ">=15.4.0", From 4e78411c37133ebb31652a1e9f2d588b78b9fef3 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Mon, 4 Aug 2025 14:57:23 +0200 Subject: [PATCH 08/12] fixup! let me fix the patch --- examples/playground15/package.json | 2 +- packages/cloudflare/src/cli/build/build.ts | 9 - .../patches/plugins/route-module.spec.ts | 2 +- .../cli/build/patches/plugins/route-module.ts | 2 +- pnpm-lock.yaml | 448 ++++++++++++++---- 5 files changed, 355 insertions(+), 108 deletions(-) diff --git a/examples/playground15/package.json b/examples/playground15/package.json index 8b44473b..1df62aef 100644 --- a/examples/playground15/package.json +++ b/examples/playground15/package.json @@ -16,7 +16,7 @@ "cf-typegen": "wrangler types --env-interface CloudflareEnv" }, "dependencies": { - "next": "^15.3.5", + "next": "^15.4.5", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/packages/cloudflare/src/cli/build/build.ts b/packages/cloudflare/src/cli/build/build.ts index da6e3bbf..05e5b12b 100644 --- a/packages/cloudflare/src/cli/build/build.ts +++ b/packages/cloudflare/src/cli/build/build.ts @@ -97,13 +97,4 @@ function ensureNextjsVersionSupported(options: buildHelper.BuildOptions) { logger.error("Next.js version unsupported, please upgrade to version 14.2 or greater."); process.exit(1); } - // TODO: remove when 15.4 is supported - // Note: `e2e/experimental` is on 15.4.0-canary.14 which works - if ( - !options.appPath.endsWith("opennextjs-cloudflare/examples/e2e/experimental") && - buildHelper.compareSemver(options.nextVersion, ">=", "15.4.0") - ) { - logger.error("Next.js version unsupported, the latest supported version is 15.3"); - process.exit(1); - } } diff --git a/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts b/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts index a802aa1c..dbf919af 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts @@ -372,7 +372,7 @@ test("patch the createSnapshot function", () => { { - let i2, { cacheHandler: a2 } = t10; + const a2 = null; - +i2 = require('.open-next/server-functions/default/cache.cjs').default; + +let i2 = require('.open-next/server-functions/default/cache.cjs').default; if (a2) { let { formatDynamicImportPath: e11 } = r("./dist/esm/lib/format-dynamic-import-path.js"); i2 = rn(await n5(e11(this.distDir, a2))); diff --git a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts index 749c6b92..adf201ef 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts @@ -56,6 +56,6 @@ rule: stopBy: end fix: |- const $HANDLER_PATH = null; - $CACHE_HANDLER = require('${normalizePath(handlerPath)}').default; + let $CACHE_HANDLER = require('${normalizePath(handlerPath)}').default; `; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 33488a29..a78ab389 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -104,8 +104,8 @@ catalogs: specifier: 10.4.15 version: 10.4.15 next: - specifier: ~15.3.5 - version: 15.3.5 + specifier: ~15.4.5 + version: 15.4.5 postcss: specifier: 8.4.27 version: 8.4.27 @@ -438,7 +438,7 @@ importers: version: link:../../../packages/cloudflare next: specifier: catalog:e2e - version: 15.3.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.4.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: catalog:e2e version: 19.0.0 @@ -484,7 +484,7 @@ importers: version: link:../../../packages/cloudflare next: specifier: catalog:e2e - version: 15.3.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.4.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: catalog:e2e version: 19.0.0 @@ -564,7 +564,7 @@ importers: version: link:../../../packages/cloudflare next: specifier: catalog:e2e - version: 15.3.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.4.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: catalog:e2e version: 19.0.0 @@ -604,7 +604,7 @@ importers: dependencies: next: specifier: catalog:e2e - version: 15.3.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.4.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: catalog:e2e version: 19.0.0 @@ -724,7 +724,7 @@ importers: dependencies: next: specifier: catalog:e2e - version: 15.3.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.4.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: catalog:e2e version: 19.0.0 @@ -758,7 +758,7 @@ importers: dependencies: next: specifier: catalog:e2e - version: 15.3.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.4.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: catalog:e2e version: 19.0.0 @@ -792,7 +792,7 @@ importers: dependencies: next: specifier: catalog:e2e - version: 15.3.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.4.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: catalog:e2e version: 19.0.0 @@ -826,7 +826,7 @@ importers: dependencies: next: specifier: catalog:e2e - version: 15.3.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.4.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: catalog:e2e version: 19.0.0 @@ -884,8 +884,8 @@ importers: examples/playground15: dependencies: next: - specifier: ^15.3.5 - version: 15.3.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^15.4.5 + version: 15.4.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: ^19.0.0 version: 19.0.0 @@ -919,7 +919,7 @@ importers: version: 6.7.0(prisma@6.7.0(typescript@5.7.3))(typescript@5.7.3) next: specifier: catalog:e2e - version: 15.3.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.4.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: catalog:e2e version: 19.0.0 @@ -1815,6 +1815,9 @@ packages: '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} deprecated: 'Merged into tsx: https://tsx.is' @@ -2930,6 +2933,12 @@ packages: cpu: [arm64] os: [darwin] + '@img/sharp-darwin-arm64@0.34.3': + resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2942,6 +2951,12 @@ packages: cpu: [x64] os: [darwin] + '@img/sharp-darwin-x64@0.34.3': + resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] @@ -2952,6 +2967,11 @@ packages: cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.0': + resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] @@ -2962,6 +2982,11 @@ packages: cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.0': + resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] @@ -2972,6 +2997,11 @@ packages: cpu: [arm64] os: [linux] + '@img/sharp-libvips-linux-arm64@1.2.0': + resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] @@ -2982,11 +3012,21 @@ packages: cpu: [arm] os: [linux] + '@img/sharp-libvips-linux-arm@1.2.0': + resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} + cpu: [arm] + os: [linux] + '@img/sharp-libvips-linux-ppc64@1.1.0': resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} cpu: [ppc64] os: [linux] + '@img/sharp-libvips-linux-ppc64@1.2.0': + resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} + cpu: [ppc64] + os: [linux] + '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] @@ -2997,6 +3037,11 @@ packages: cpu: [s390x] os: [linux] + '@img/sharp-libvips-linux-s390x@1.2.0': + resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} + cpu: [s390x] + os: [linux] + '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] @@ -3007,6 +3052,11 @@ packages: cpu: [x64] os: [linux] + '@img/sharp-libvips-linux-x64@1.2.0': + resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] @@ -3017,6 +3067,11 @@ packages: cpu: [arm64] os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] @@ -3027,6 +3082,11 @@ packages: cpu: [x64] os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} + cpu: [x64] + os: [linux] + '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3039,6 +3099,12 @@ packages: cpu: [arm64] os: [linux] + '@img/sharp-linux-arm64@0.34.3': + resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3051,6 +3117,18 @@ packages: cpu: [arm] os: [linux] + '@img/sharp-linux-arm@0.34.3': + resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.3': + resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3063,6 +3141,12 @@ packages: cpu: [s390x] os: [linux] + '@img/sharp-linux-s390x@0.34.3': + resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3075,6 +3159,12 @@ packages: cpu: [x64] os: [linux] + '@img/sharp-linux-x64@0.34.3': + resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3087,6 +3177,12 @@ packages: cpu: [arm64] os: [linux] + '@img/sharp-linuxmusl-arm64@0.34.3': + resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3099,6 +3195,12 @@ packages: cpu: [x64] os: [linux] + '@img/sharp-linuxmusl-x64@0.34.3': + resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3109,6 +3211,17 @@ packages: engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-wasm32@0.34.3': + resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.3': + resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + '@img/sharp-win32-ia32@0.33.5': resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3121,6 +3234,12 @@ packages: cpu: [ia32] os: [win32] + '@img/sharp-win32-ia32@0.34.3': + resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-x64@0.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3133,6 +3252,12 @@ packages: cpu: [x64] os: [win32] + '@img/sharp-win32-x64@0.34.3': + resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -3259,12 +3384,12 @@ packages: '@next/env@15.1.7': resolution: {integrity: sha512-d9jnRrkuOH7Mhi+LHav2XW91HOgTAWHxjMPkXMGBc9B2b7614P7kjt8tAplRvJpbSt4nbO1lugcT/kAaWzjlLQ==} - '@next/env@15.3.5': - resolution: {integrity: sha512-7g06v8BUVtN2njAX/r8gheoVffhiKFVt4nx74Tt6G4Hqw9HCLYQVx/GkH2qHvPtAHZaUNZ0VXAa0pQP6v1wk7g==} - '@next/env@15.4.0-canary.14': resolution: {integrity: sha512-ynXM3n0AEcB1mwoOLgar27s/WoFyX0C8kpbfpc6bylq2rfS+q+KNla1WAVX3QdHyV82KyrqdMQAFOIyTZg4K9A==} + '@next/env@15.4.5': + resolution: {integrity: sha512-ruM+q2SCOVCepUiERoxOmZY9ZVoecR3gcXNwCYZRvQQWRjhOiPJGmQ2fAiLR6YKWXcSAh7G79KEFxN3rwhs4LQ==} + '@next/eslint-plugin-next@14.2.14': resolution: {integrity: sha512-kV+OsZ56xhj0rnTn6HegyTGkoa16Mxjrpk7pjWumyB2P8JVQb8S9qtkjy/ye0GnTr4JWtWG4x/2qN40lKZ3iVQ==} @@ -3313,14 +3438,14 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.3.5': - resolution: {integrity: sha512-lM/8tilIsqBq+2nq9kbTW19vfwFve0NR7MxfkuSUbRSgXlMQoJYg+31+++XwKVSXk4uT23G2eF/7BRIKdn8t8w==} + '@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.4.0-canary.14': - resolution: {integrity: sha512-p62YaNcigaJlZ6IIubZPT+S4N0CXXkjqdIbC2Otr6LLxWsvdkHRgWaPLHauCxWw0zS7jczKY1w4ZfyX9l26sIQ==} + '@next/swc-darwin-arm64@15.4.5': + resolution: {integrity: sha512-84dAN4fkfdC7nX6udDLz9GzQlMUwEMKD7zsseXrl7FTeIItF8vpk1lhLEnsotiiDt+QFu3O1FVWnqwcRD2U3KA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -3361,14 +3486,14 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.3.5': - resolution: {integrity: sha512-WhwegPQJ5IfoUNZUVsI9TRAlKpjGVK0tpJTL6KeiC4cux9774NYE9Wu/iCfIkL/5J8rPAkqZpG7n+EfiAfidXA==} + '@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.4.0-canary.14': - resolution: {integrity: sha512-PQ4z01gYCeYzP4NpFKBvg0slDu/CZ+vrpin6+O5XfzGOOdBCUqlJWK78ZTlfs8eTjVWnvVEi2FsTnbW5BZ0yiA==} + '@next/swc-darwin-x64@15.4.5': + resolution: {integrity: sha512-CL6mfGsKuFSyQjx36p2ftwMNSb8PQog8y0HO/ONLdQqDql7x3aJb/wB+LA651r4we2pp/Ck+qoRVUeZZEvSurA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -3409,14 +3534,14 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.3.5': - resolution: {integrity: sha512-LVD6uMOZ7XePg3KWYdGuzuvVboxujGjbcuP2jsPAN3MnLdLoZUXKRc6ixxfs03RH7qBdEHCZjyLP/jBdCJVRJQ==} + '@next/swc-linux-arm64-gnu@15.4.0-canary.14': + resolution: {integrity: sha512-u/eeGK9okYiJ24aLcrq2jOCyOnjhzOM/MkcOOMkzE4/Rp7EKIepnGUhnIcLeLmcQw4RCDAjh3QZBqt5rQEm4fA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.4.0-canary.14': - resolution: {integrity: sha512-u/eeGK9okYiJ24aLcrq2jOCyOnjhzOM/MkcOOMkzE4/Rp7EKIepnGUhnIcLeLmcQw4RCDAjh3QZBqt5rQEm4fA==} + '@next/swc-linux-arm64-gnu@15.4.5': + resolution: {integrity: sha512-1hTVd9n6jpM/thnDc5kYHD1OjjWYpUJrJxY4DlEacT7L5SEOXIifIdTye6SQNNn8JDZrcN+n8AWOmeJ8u3KlvQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3457,14 +3582,14 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.5': - resolution: {integrity: sha512-k8aVScYZ++BnS2P69ClK7v4nOu702jcF9AIHKu6llhHEtBSmM2zkPGl9yoqbSU/657IIIb0QHpdxEr0iW9z53A==} + '@next/swc-linux-arm64-musl@15.4.0-canary.14': + resolution: {integrity: sha512-6eODbSA592cYMYtBU9Vm2D8ApXn6dBh/cN7GQlsTiDBIlCId9Z8DlkGCDj/9thr0JEluUlkt379+B19BGxsCEg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.4.0-canary.14': - resolution: {integrity: sha512-6eODbSA592cYMYtBU9Vm2D8ApXn6dBh/cN7GQlsTiDBIlCId9Z8DlkGCDj/9thr0JEluUlkt379+B19BGxsCEg==} + '@next/swc-linux-arm64-musl@15.4.5': + resolution: {integrity: sha512-4W+D/nw3RpIwGrqpFi7greZ0hjrCaioGErI7XHgkcTeWdZd146NNu1s4HnaHonLeNTguKnL2Urqvj28UJj6Gqw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3505,14 +3630,14 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.5': - resolution: {integrity: sha512-2xYU0DI9DGN/bAHzVwADid22ba5d/xrbrQlr2U+/Q5WkFUzeL0TDR963BdrtLS/4bMmKZGptLeg6282H/S2i8A==} + '@next/swc-linux-x64-gnu@15.4.0-canary.14': + resolution: {integrity: sha512-FwOtQDbMLJmGPCg8p1ZilCBjfjBZGBRwXnWmxLmpO4lcWTWMFTCfAxkqCUi62zXBZUJztqT8TgXQ9VBk4BKukQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.4.0-canary.14': - resolution: {integrity: sha512-FwOtQDbMLJmGPCg8p1ZilCBjfjBZGBRwXnWmxLmpO4lcWTWMFTCfAxkqCUi62zXBZUJztqT8TgXQ9VBk4BKukQ==} + '@next/swc-linux-x64-gnu@15.4.5': + resolution: {integrity: sha512-N6Mgdxe/Cn2K1yMHge6pclffkxzbSGOydXVKYOjYqQXZYjLCfN/CuFkaYDeDHY2VBwSHyM2fUjYBiQCIlxIKDA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3553,14 +3678,14 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.5': - resolution: {integrity: sha512-TRYIqAGf1KCbuAB0gjhdn5Ytd8fV+wJSM2Nh2is/xEqR8PZHxfQuaiNhoF50XfY90sNpaRMaGhF6E+qjV1b9Tg==} + '@next/swc-linux-x64-musl@15.4.0-canary.14': + resolution: {integrity: sha512-0k8lkaryoYsB4wksRm/5SlWWtJjuq6vOzQ/zqKRlNdpNvsvzZ61sEaCLZn1zdcFcUVH6wSzK/GMclcpn2w0VAg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.4.0-canary.14': - resolution: {integrity: sha512-0k8lkaryoYsB4wksRm/5SlWWtJjuq6vOzQ/zqKRlNdpNvsvzZ61sEaCLZn1zdcFcUVH6wSzK/GMclcpn2w0VAg==} + '@next/swc-linux-x64-musl@15.4.5': + resolution: {integrity: sha512-YZ3bNDrS8v5KiqgWE0xZQgtXgCTUacgFtnEgI4ccotAASwSvcMPDLua7BWLuTfucoRv6mPidXkITJLd8IdJplQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3601,14 +3726,14 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.3.5': - resolution: {integrity: sha512-h04/7iMEUSMY6fDGCvdanKqlO1qYvzNxntZlCzfE8i5P0uqzVQWQquU1TIhlz0VqGQGXLrFDuTJVONpqGqjGKQ==} + '@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.4.0-canary.14': - resolution: {integrity: sha512-Kih/2CNMpegubEJT8xoigF+hMihetcFEwWXINfPoO534GQax4o1HU56aai6YgFYCvcrb9fAmW2vVagCQx3GS2g==} + '@next/swc-win32-arm64-msvc@15.4.5': + resolution: {integrity: sha512-9Wr4t9GkZmMNcTVvSloFtjzbH4vtT4a8+UHqDoVnxA5QyfWe6c5flTH1BIWPGNWSUlofc8dVJAE7j84FQgskvQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -3661,14 +3786,14 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.5': - resolution: {integrity: sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw==} + '@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.4.0-canary.14': - resolution: {integrity: sha512-iOTIfyhrUDDIFH0BA0ZAek8XEK2Wgtbg1QOiqzTU7QPasn28lK/b2bHI+stFrGfz6u1NZw9V/B+/D+o9lzSWKQ==} + '@next/swc-win32-x64-msvc@15.4.5': + resolution: {integrity: sha512-voWk7XtGvlsP+w8VBz7lqp8Y+dYw/MTI4KeS0gTVtfdhdJ5QwhXLmNrndFOin/MDoCvUaLWMkYKATaCoUkt2/A==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -7863,8 +7988,8 @@ packages: sass: optional: true - next@15.3.5: - resolution: {integrity: sha512-RkazLBMMDJSJ4XZQ81kolSpwiCt907l0xcgcpF4xC2Vml6QVcPNXW0NQRwQ80FFtSn7UM52XN0anaw8TEJXaiw==} + next@15.4.0-canary.14: + resolution: {integrity: sha512-4/WNK9Uw/Js1QruZhZfUJWTLrXtL7cvVWLDi1PoCcGdVY91b/1U5jNDOt/Vebr/aJ6Xr5aF+PNHUTtcvBFPInw==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -7884,13 +8009,13 @@ packages: sass: optional: true - next@15.4.0-canary.14: - resolution: {integrity: sha512-4/WNK9Uw/Js1QruZhZfUJWTLrXtL7cvVWLDi1PoCcGdVY91b/1U5jNDOt/Vebr/aJ6Xr5aF+PNHUTtcvBFPInw==} + next@15.4.5: + resolution: {integrity: sha512-nJ4v+IO9CPmbmcvsPebIoX3Q+S7f6Fu08/dEWu0Ttfa+wVwQRh9epcmsyCPjmL2b8MxC+CkBR97jgDhUUztI3g==} 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 @@ -8746,6 +8871,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + send@1.2.0: resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} @@ -8783,6 +8913,10 @@ packages: resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.3: + resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -11433,6 +11567,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.4.5': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 @@ -12377,6 +12516,11 @@ snapshots: '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true + '@img/sharp-darwin-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.0 + optional: true + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 @@ -12387,57 +12531,89 @@ snapshots: '@img/sharp-libvips-darwin-x64': 1.1.0 optional: true + '@img/sharp-darwin-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.0 + optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true '@img/sharp-libvips-darwin-arm64@1.1.0': optional: true + '@img/sharp-libvips-darwin-arm64@1.2.0': + optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true '@img/sharp-libvips-darwin-x64@1.1.0': optional: true + '@img/sharp-libvips-darwin-x64@1.2.0': + optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true '@img/sharp-libvips-linux-arm64@1.1.0': optional: true + '@img/sharp-libvips-linux-arm64@1.2.0': + optional: true + '@img/sharp-libvips-linux-arm@1.0.5': optional: true '@img/sharp-libvips-linux-arm@1.1.0': optional: true + '@img/sharp-libvips-linux-arm@1.2.0': + optional: true + '@img/sharp-libvips-linux-ppc64@1.1.0': optional: true + '@img/sharp-libvips-linux-ppc64@1.2.0': + optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true '@img/sharp-libvips-linux-s390x@1.1.0': optional: true + '@img/sharp-libvips-linux-s390x@1.2.0': + optional: true + '@img/sharp-libvips-linux-x64@1.0.4': optional: true '@img/sharp-libvips-linux-x64@1.1.0': optional: true + '@img/sharp-libvips-linux-x64@1.2.0': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true '@img/sharp-libvips-linuxmusl-arm64@1.1.0': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + optional: true + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 @@ -12448,6 +12624,11 @@ snapshots: '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true + '@img/sharp-linux-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.0 + optional: true + '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 @@ -12458,6 +12639,16 @@ snapshots: '@img/sharp-libvips-linux-arm': 1.1.0 optional: true + '@img/sharp-linux-arm@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.0 + optional: true + + '@img/sharp-linux-ppc64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.0 + optional: true + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.4 @@ -12468,6 +12659,11 @@ snapshots: '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true + '@img/sharp-linux-s390x@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.0 + optional: true + '@img/sharp-linux-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.4 @@ -12478,6 +12674,11 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.1.0 optional: true + '@img/sharp-linux-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.0 + optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 @@ -12488,6 +12689,11 @@ snapshots: '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true + '@img/sharp-linuxmusl-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + optional: true + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 @@ -12498,6 +12704,11 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true + '@img/sharp-linuxmusl-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + optional: true + '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.4.3 @@ -12508,18 +12719,32 @@ snapshots: '@emnapi/runtime': 1.4.1 optional: true + '@img/sharp-wasm32@0.34.3': + dependencies: + '@emnapi/runtime': 1.4.5 + optional: true + + '@img/sharp-win32-arm64@0.34.3': + optional: true + '@img/sharp-win32-ia32@0.33.5': optional: true '@img/sharp-win32-ia32@0.34.1': optional: true + '@img/sharp-win32-ia32@0.34.3': + optional: true + '@img/sharp-win32-x64@0.33.5': optional: true '@img/sharp-win32-x64@0.34.1': optional: true + '@img/sharp-win32-x64@0.34.3': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -12675,10 +12900,10 @@ snapshots: '@next/env@15.1.7': {} - '@next/env@15.3.5': {} - '@next/env@15.4.0-canary.14': {} + '@next/env@15.4.5': {} + '@next/eslint-plugin-next@14.2.14': dependencies: glob: 10.3.10 @@ -12713,10 +12938,10 @@ snapshots: '@next/swc-darwin-arm64@15.1.7': optional: true - '@next/swc-darwin-arm64@15.3.5': + '@next/swc-darwin-arm64@15.4.0-canary.14': optional: true - '@next/swc-darwin-arm64@15.4.0-canary.14': + '@next/swc-darwin-arm64@15.4.5': optional: true '@next/swc-darwin-x64@14.2.24': @@ -12737,10 +12962,10 @@ snapshots: '@next/swc-darwin-x64@15.1.7': optional: true - '@next/swc-darwin-x64@15.3.5': + '@next/swc-darwin-x64@15.4.0-canary.14': optional: true - '@next/swc-darwin-x64@15.4.0-canary.14': + '@next/swc-darwin-x64@15.4.5': optional: true '@next/swc-linux-arm64-gnu@14.2.24': @@ -12761,10 +12986,10 @@ snapshots: '@next/swc-linux-arm64-gnu@15.1.7': optional: true - '@next/swc-linux-arm64-gnu@15.3.5': + '@next/swc-linux-arm64-gnu@15.4.0-canary.14': optional: true - '@next/swc-linux-arm64-gnu@15.4.0-canary.14': + '@next/swc-linux-arm64-gnu@15.4.5': optional: true '@next/swc-linux-arm64-musl@14.2.24': @@ -12785,10 +13010,10 @@ snapshots: '@next/swc-linux-arm64-musl@15.1.7': optional: true - '@next/swc-linux-arm64-musl@15.3.5': + '@next/swc-linux-arm64-musl@15.4.0-canary.14': optional: true - '@next/swc-linux-arm64-musl@15.4.0-canary.14': + '@next/swc-linux-arm64-musl@15.4.5': optional: true '@next/swc-linux-x64-gnu@14.2.24': @@ -12809,10 +13034,10 @@ snapshots: '@next/swc-linux-x64-gnu@15.1.7': optional: true - '@next/swc-linux-x64-gnu@15.3.5': + '@next/swc-linux-x64-gnu@15.4.0-canary.14': optional: true - '@next/swc-linux-x64-gnu@15.4.0-canary.14': + '@next/swc-linux-x64-gnu@15.4.5': optional: true '@next/swc-linux-x64-musl@14.2.24': @@ -12833,10 +13058,10 @@ snapshots: '@next/swc-linux-x64-musl@15.1.7': optional: true - '@next/swc-linux-x64-musl@15.3.5': + '@next/swc-linux-x64-musl@15.4.0-canary.14': optional: true - '@next/swc-linux-x64-musl@15.4.0-canary.14': + '@next/swc-linux-x64-musl@15.4.5': optional: true '@next/swc-win32-arm64-msvc@14.2.24': @@ -12857,10 +13082,10 @@ snapshots: '@next/swc-win32-arm64-msvc@15.1.7': optional: true - '@next/swc-win32-arm64-msvc@15.3.5': + '@next/swc-win32-arm64-msvc@15.4.0-canary.14': optional: true - '@next/swc-win32-arm64-msvc@15.4.0-canary.14': + '@next/swc-win32-arm64-msvc@15.4.5': optional: true '@next/swc-win32-ia32-msvc@14.2.24': @@ -12887,10 +13112,10 @@ snapshots: '@next/swc-win32-x64-msvc@15.1.7': optional: true - '@next/swc-win32-x64-msvc@15.3.5': + '@next/swc-win32-x64-msvc@15.4.0-canary.14': optional: true - '@next/swc-win32-x64-msvc@15.4.0-canary.14': + '@next/swc-win32-x64-msvc@15.4.5': optional: true '@noble/ciphers@1.3.0': {} @@ -18711,26 +18936,25 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.3.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.4.0-canary.14(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.3.5 + '@next/env': 15.4.0-canary.14 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 - busboy: 1.6.0 - caniuse-lite: 1.0.30001717 + caniuse-lite: 1.0.30001664 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.5 - '@next/swc-darwin-x64': 15.3.5 - '@next/swc-linux-arm64-gnu': 15.3.5 - '@next/swc-linux-arm64-musl': 15.3.5 - '@next/swc-linux-x64-gnu': 15.3.5 - '@next/swc-linux-x64-musl': 15.3.5 - '@next/swc-win32-arm64-msvc': 15.3.5 - '@next/swc-win32-x64-msvc': 15.3.5 + '@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 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.51.1 sharp: 0.34.1 @@ -18738,28 +18962,27 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.4.0-canary.14(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.4.5(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.4.0-canary.14 - '@swc/counter': 0.1.3 + '@next/env': 15.4.5 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001664 + caniuse-lite: 1.0.30001717 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) 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.4.5 + '@next/swc-darwin-x64': 15.4.5 + '@next/swc-linux-arm64-gnu': 15.4.5 + '@next/swc-linux-arm64-musl': 15.4.5 + '@next/swc-linux-x64-gnu': 15.4.5 + '@next/swc-linux-x64-musl': 15.4.5 + '@next/swc-win32-arm64-msvc': 15.4.5 + '@next/swc-win32-x64-msvc': 15.4.5 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.51.1 - sharp: 0.34.1 + sharp: 0.34.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -19699,6 +19922,9 @@ snapshots: semver@7.7.1: {} + semver@7.7.2: + optional: true + send@1.2.0: dependencies: debug: 4.4.0 @@ -19806,6 +20032,36 @@ snapshots: '@img/sharp-win32-x64': 0.34.1 optional: true + sharp@0.34.3: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.3 + '@img/sharp-darwin-x64': 0.34.3 + '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-linux-arm': 0.34.3 + '@img/sharp-linux-arm64': 0.34.3 + '@img/sharp-linux-ppc64': 0.34.3 + '@img/sharp-linux-s390x': 0.34.3 + '@img/sharp-linux-x64': 0.34.3 + '@img/sharp-linuxmusl-arm64': 0.34.3 + '@img/sharp-linuxmusl-x64': 0.34.3 + '@img/sharp-wasm32': 0.34.3 + '@img/sharp-win32-arm64': 0.34.3 + '@img/sharp-win32-ia32': 0.34.3 + '@img/sharp-win32-x64': 0.34.3 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 From 3b847a9d5421b867ec1e342df77fc56e7b92e5b8 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Mon, 4 Aug 2025 15:46:10 +0200 Subject: [PATCH 09/12] fixup! update og checksum --- examples/e2e/app-router/e2e/og.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/e2e/app-router/e2e/og.test.ts b/examples/e2e/app-router/e2e/og.test.ts index deb896cb..7c430f6c 100644 --- a/examples/e2e/app-router/e2e/og.test.ts +++ b/examples/e2e/app-router/e2e/og.test.ts @@ -2,8 +2,8 @@ import { expect, test } from "@playwright/test"; import { validateMd5 } from "../../utils"; // This is the md5sums of the expected PNGs generated with `md5sum ` -const OG_MD5 = "6e5e794ac0c27598a331690f96f05d00"; -const API_OG_MD5 = "cac95fc3e2d4d52870c0536bb18ba85b"; +const OG_MD5 = "83cfda4e78b037aa3d9ab465292550ef"; +const API_OG_MD5 = "6a22b4ff74e0dd8c377e2640dafe3e40"; test("Open-graph image to be in metatags and present", async ({ page, request }) => { await page.goto("/og"); From 59bb6785d7fa0e89a60a0a80c45637a8f9e83f54 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Mon, 4 Aug 2025 16:31:13 +0200 Subject: [PATCH 10/12] fixup! fixes for latest canary --- examples/e2e/experimental/next.config.ts | 6 +- examples/e2e/experimental/package.json | 2 +- .../build/patches/plugins/load-manifest.ts | 4 +- .../build/patches/plugins/next-server.spec.ts | 65 +++- .../cli/build/patches/plugins/next-server.ts | 16 + pnpm-lock.yaml | 317 +++--------------- 6 files changed, 128 insertions(+), 282 deletions(-) diff --git a/examples/e2e/experimental/next.config.ts b/examples/e2e/experimental/next.config.ts index ee351d65..886ddd58 100644 --- a/examples/e2e/experimental/next.config.ts +++ b/examples/e2e/experimental/next.config.ts @@ -12,11 +12,7 @@ const nextConfig: NextConfig = { ignoreBuildErrors: true, }, experimental: { - ppr: "incremental", - // Node middleware is not supported yet in cloudflare - // See https://github.com/opennextjs/opennextjs-cloudflare/issues/617 - // nodeMiddleware: true, - dynamicIO: true, + cacheComponents: true, }, }; diff --git a/examples/e2e/experimental/package.json b/examples/e2e/experimental/package.json index 565d7141..6f5e09fe 100644 --- a/examples/e2e/experimental/package.json +++ b/examples/e2e/experimental/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@opennextjs/cloudflare": "workspace:*", - "next": "15.4.0-canary.14", + "next": "15.4.2-canary.29", "react": "catalog:e2e", "react-dom": "catalog:e2e" }, diff --git a/packages/cloudflare/src/cli/build/patches/plugins/load-manifest.ts b/packages/cloudflare/src/cli/build/patches/plugins/load-manifest.ts index d08f32c8..5c548b24 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/load-manifest.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/load-manifest.ts @@ -62,8 +62,8 @@ function loadManifest($PATH, $$$ARGS) { fix: ` function loadManifest($PATH, $$$ARGS) { $PATH = $PATH.replaceAll(${JSON.stringify(sep)}, ${JSON.stringify(posix.sep)}); - if ($PATH === "/.next/BUILD_ID") { - return process.env.NEXT_BUILD_ID; + if ($PATH.endsWith(".next/BUILD_ID")) { + return process.env.NEXT_BUILD_ID; } ${returnManifests} throw new Error(\`Unexpected loadManifest(\${$PATH}) call!\`); 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 faa5a8b1..426c99f4 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 @@ -1,7 +1,12 @@ import { describe, expect, test } from "vitest"; import { computePatchDiff } from "../../utils/test-patch.js"; -import { buildIdRule, createCacheHandlerRule, createComposableCacheHandlersRule } from "./next-server.js"; +import { + buildIdRule, + createCacheHandlerRule, + createComposableCacheHandlersRule, + disableNodeMiddlewareRule, +} from "./next-server.js"; describe("Next Server", () => { const nextServerCode = ` @@ -85,6 +90,22 @@ class NextNodeServer extends _baseserver.default { pages: (0, _findpagesdir.findDir)(dir, "pages") ? true : false }; } + async loadNodeMiddleware() { + if (!process.env.NEXT_MINIMAL) { + try { + var _functionsConfig_functions; + const functionsConfig = this.renderOpts.dev ? {} : require((0, _path.join)(this.distDir, 'server', _constants.FUNCTIONS_CONFIG_MANIFEST)); + if (this.renderOpts.dev || (functionsConfig == null ? void 0 : (_functionsConfig_functions = functionsConfig.functions) == null ? void 0 : _functionsConfig_functions['/_middleware'])) { + // if used with top level await, this will be a promise + return require((0, _path.join)(this.distDir, 'server', 'middleware.js')); + } + } catch (err) { + if ((0, _iserror.default)(err) && err.code !== 'ENOENT' && err.code !== 'MODULE_NOT_FOUND') { + throw err; + } + } + } + } // ... }`; @@ -187,4 +208,46 @@ class NextNodeServer extends _baseserver.default { " `); }); + + test("disable node middleware", () => { + expect(computePatchDiff("next-server.js", nextServerCode, disableNodeMiddlewareRule)) + .toMatchInlineSnapshot(` + "Index: next-server.js + =================================================================== + --- next-server.js + +++ next-server.js + @@ -1,5 +1,4 @@ + - + class NextNodeServer extends _baseserver.default { + constructor(options){ + // Initialize super class + super(options); + @@ -79,21 +78,8 @@ + pages: (0, _findpagesdir.findDir)(dir, "pages") ? true : false + }; + } + async loadNodeMiddleware() { + - if (!process.env.NEXT_MINIMAL) { + - try { + - var _functionsConfig_functions; + - const functionsConfig = this.renderOpts.dev ? {} : require((0, _path.join)(this.distDir, 'server', _constants.FUNCTIONS_CONFIG_MANIFEST)); + - if (this.renderOpts.dev || (functionsConfig == null ? void 0 : (_functionsConfig_functions = functionsConfig.functions) == null ? void 0 : _functionsConfig_functions['/_middleware'])) { + - // if used with top level await, this will be a promise + - return require((0, _path.join)(this.distDir, 'server', 'middleware.js')); + - } + - } catch (err) { + - if ((0, _iserror.default)(err) && err.code !== 'ENOENT' && err.code !== 'MODULE_NOT_FOUND') { + - throw err; + - } + - } + - } + - } + + // patched by open next + +} + // ... + } + \\ No newline at end of file + " + `); + }); }); 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 69539a98..ef2dcde6 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/next-server.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/next-server.ts @@ -38,12 +38,28 @@ export function patchNextServer(updater: ContentUpdater, buildOpts: BuildOptions "composable-cache.cjs" ); contents = patchCode(contents, createComposableCacheHandlersRule(composableCacheHandler)); + + // Node middleware are not supported on Cloudflare yet + contents = patchCode(contents, disableNodeMiddlewareRule); + return contents; }, }, ]); } +// Do not try to load Node middlewares +export const disableNodeMiddlewareRule = ` +rule: + pattern: + selector: method_definition + context: "class { async loadNodeMiddleware($$$PARAMS) { $$$_ } }" +fix: |- + async loadNodeMiddleware($$$PARAMS) { + // patched by open next + } +`; + export const buildIdRule = ` rule: pattern: diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a78ab389..657e0e1d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -526,8 +526,8 @@ importers: specifier: workspace:* version: link:../../../packages/cloudflare next: - specifier: 15.4.0-canary.14 - version: 15.4.0-canary.14(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + 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.0(react@19.0.0))(react@19.0.0) react: specifier: catalog:e2e version: 19.0.0 @@ -1809,9 +1809,6 @@ packages: resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} engines: {node: '>=16'} - '@emnapi/runtime@1.4.1': - resolution: {integrity: sha512-LMshMVP0ZhACNjQNYXiU1iZJ6QCcv0lUdPDPugqGvCGXt5xtRVBPdtA0qU12pEXZzpWAhWlZYptfdAFq10DOVQ==} - '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} @@ -2927,12 +2924,6 @@ packages: cpu: [arm64] os: [darwin] - '@img/sharp-darwin-arm64@0.34.1': - resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - '@img/sharp-darwin-arm64@0.34.3': resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2945,12 +2936,6 @@ packages: cpu: [x64] os: [darwin] - '@img/sharp-darwin-x64@0.34.1': - resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - '@img/sharp-darwin-x64@0.34.3': resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2962,11 +2947,6 @@ packages: cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.1.0': - resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} - cpu: [arm64] - os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.0': resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} cpu: [arm64] @@ -2977,11 +2957,6 @@ packages: cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.1.0': - resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} - cpu: [x64] - os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.0': resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} cpu: [x64] @@ -2992,11 +2967,6 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm64@1.1.0': - resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} - cpu: [arm64] - os: [linux] - '@img/sharp-libvips-linux-arm64@1.2.0': resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} cpu: [arm64] @@ -3007,21 +2977,11 @@ packages: cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-arm@1.1.0': - resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} - cpu: [arm] - os: [linux] - '@img/sharp-libvips-linux-arm@1.2.0': resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.1.0': - resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} - cpu: [ppc64] - os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.0': resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} cpu: [ppc64] @@ -3032,11 +2992,6 @@ packages: cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-s390x@1.1.0': - resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} - cpu: [s390x] - os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.0': resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} cpu: [s390x] @@ -3047,11 +3002,6 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-libvips-linux-x64@1.1.0': - resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} - cpu: [x64] - os: [linux] - '@img/sharp-libvips-linux-x64@1.2.0': resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} cpu: [x64] @@ -3062,11 +3012,6 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': - resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} - cpu: [arm64] - os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} cpu: [arm64] @@ -3077,11 +3022,6 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.1.0': - resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} - cpu: [x64] - os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.0': resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} cpu: [x64] @@ -3093,12 +3033,6 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-linux-arm64@0.34.1': - resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - '@img/sharp-linux-arm64@0.34.3': resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3111,12 +3045,6 @@ packages: cpu: [arm] os: [linux] - '@img/sharp-linux-arm@0.34.1': - resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - '@img/sharp-linux-arm@0.34.3': resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3135,12 +3063,6 @@ packages: cpu: [s390x] os: [linux] - '@img/sharp-linux-s390x@0.34.1': - resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - '@img/sharp-linux-s390x@0.34.3': resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3153,12 +3075,6 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-x64@0.34.1': - resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - '@img/sharp-linux-x64@0.34.3': resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3171,12 +3087,6 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.1': - resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.3': resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3189,12 +3099,6 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.1': - resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - '@img/sharp-linuxmusl-x64@0.34.3': resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3206,11 +3110,6 @@ packages: engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-wasm32@0.34.1': - resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - '@img/sharp-wasm32@0.34.3': resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3228,12 +3127,6 @@ packages: cpu: [ia32] os: [win32] - '@img/sharp-win32-ia32@0.34.1': - resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] - '@img/sharp-win32-ia32@0.34.3': resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3246,12 +3139,6 @@ packages: cpu: [x64] os: [win32] - '@img/sharp-win32-x64@0.34.1': - resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] - '@img/sharp-win32-x64@0.34.3': resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3384,8 +3271,8 @@ packages: '@next/env@15.1.7': resolution: {integrity: sha512-d9jnRrkuOH7Mhi+LHav2XW91HOgTAWHxjMPkXMGBc9B2b7614P7kjt8tAplRvJpbSt4nbO1lugcT/kAaWzjlLQ==} - '@next/env@15.4.0-canary.14': - resolution: {integrity: sha512-ynXM3n0AEcB1mwoOLgar27s/WoFyX0C8kpbfpc6bylq2rfS+q+KNla1WAVX3QdHyV82KyrqdMQAFOIyTZg4K9A==} + '@next/env@15.4.2-canary.29': + resolution: {integrity: sha512-zmkSqVO16lUnanrgywv4SfgiLyMI2V/IxEgRTKcded5Lor0jXC73eqtjTL4vKpFKK771l7M0zILv8Hv5uHsR1A==} '@next/env@15.4.5': resolution: {integrity: sha512-ruM+q2SCOVCepUiERoxOmZY9ZVoecR3gcXNwCYZRvQQWRjhOiPJGmQ2fAiLR6YKWXcSAh7G79KEFxN3rwhs4LQ==} @@ -3438,8 +3325,8 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.4.0-canary.14': - resolution: {integrity: sha512-p62YaNcigaJlZ6IIubZPT+S4N0CXXkjqdIbC2Otr6LLxWsvdkHRgWaPLHauCxWw0zS7jczKY1w4ZfyX9l26sIQ==} + '@next/swc-darwin-arm64@15.4.2-canary.29': + resolution: {integrity: sha512-W0isQe+NuLgGEccJoqfuikN8irbHrq7qHYI+w2hdw0l6CzgvKa4GYEQV4FnblK9epa9rU+SRdTB428vzl5eesQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -3486,8 +3373,8 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.4.0-canary.14': - resolution: {integrity: sha512-PQ4z01gYCeYzP4NpFKBvg0slDu/CZ+vrpin6+O5XfzGOOdBCUqlJWK78ZTlfs8eTjVWnvVEi2FsTnbW5BZ0yiA==} + '@next/swc-darwin-x64@15.4.2-canary.29': + resolution: {integrity: sha512-vPIml27iYFMqRNwYRO82leBuBs0Boach3thGfrUIzbDUambfQmKaylMBaEYkX2s7if+p+FmmCHY0XYrRHQf4yQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -3534,8 +3421,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.4.0-canary.14': - resolution: {integrity: sha512-u/eeGK9okYiJ24aLcrq2jOCyOnjhzOM/MkcOOMkzE4/Rp7EKIepnGUhnIcLeLmcQw4RCDAjh3QZBqt5rQEm4fA==} + '@next/swc-linux-arm64-gnu@15.4.2-canary.29': + resolution: {integrity: sha512-OfjJBsSqHCNzcyMkMD2zoMOe6/l1EIWkuWYGPmffImSvPelXwY42FL42VHvYvnX6cq8xeOOEj6WIj03mPiErIA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3582,8 +3469,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.4.0-canary.14': - resolution: {integrity: sha512-6eODbSA592cYMYtBU9Vm2D8ApXn6dBh/cN7GQlsTiDBIlCId9Z8DlkGCDj/9thr0JEluUlkt379+B19BGxsCEg==} + '@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] @@ -3630,8 +3517,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.4.0-canary.14': - resolution: {integrity: sha512-FwOtQDbMLJmGPCg8p1ZilCBjfjBZGBRwXnWmxLmpO4lcWTWMFTCfAxkqCUi62zXBZUJztqT8TgXQ9VBk4BKukQ==} + '@next/swc-linux-x64-gnu@15.4.2-canary.29': + resolution: {integrity: sha512-naAxNmS9fB4ayezHHWnoM2nHyxHge1V8rJnJ5sGFQDexsZI0B5u4ghvVrPvX+z7u3vyOhJrWQuXiAXHcbBP2xg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3678,8 +3565,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.4.0-canary.14': - resolution: {integrity: sha512-0k8lkaryoYsB4wksRm/5SlWWtJjuq6vOzQ/zqKRlNdpNvsvzZ61sEaCLZn1zdcFcUVH6wSzK/GMclcpn2w0VAg==} + '@next/swc-linux-x64-musl@15.4.2-canary.29': + resolution: {integrity: sha512-4Id31wM5uep5jqwyvFlfzduPaXa6sbLdgQk+wWVMsSC9FqiIkevIB541OP/MnsoiQ6djTmd1NiRxeC0ffR7Llw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3726,8 +3613,8 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.4.0-canary.14': - resolution: {integrity: sha512-Kih/2CNMpegubEJT8xoigF+hMihetcFEwWXINfPoO534GQax4o1HU56aai6YgFYCvcrb9fAmW2vVagCQx3GS2g==} + '@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] @@ -3786,8 +3673,8 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@15.4.0-canary.14': - resolution: {integrity: sha512-iOTIfyhrUDDIFH0BA0ZAek8XEK2Wgtbg1QOiqzTU7QPasn28lK/b2bHI+stFrGfz6u1NZw9V/B+/D+o9lzSWKQ==} + '@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] @@ -7988,13 +7875,13 @@ packages: sass: optional: true - next@15.4.0-canary.14: - resolution: {integrity: sha512-4/WNK9Uw/Js1QruZhZfUJWTLrXtL7cvVWLDi1PoCcGdVY91b/1U5jNDOt/Vebr/aJ6Xr5aF+PNHUTtcvBFPInw==} + 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.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 @@ -8909,10 +8796,6 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - sharp@0.34.1: - resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - sharp@0.34.3: resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -11557,11 +11440,6 @@ snapshots: dependencies: '@edge-runtime/primitives': 4.1.0 - '@emnapi/runtime@1.4.1': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 @@ -12511,11 +12389,6 @@ snapshots: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-arm64@0.34.1': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.1.0 - optional: true - '@img/sharp-darwin-arm64@0.34.3': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.2.0 @@ -12526,11 +12399,6 @@ snapshots: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.34.1': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.1.0 - optional: true - '@img/sharp-darwin-x64@0.34.3': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.2.0 @@ -12539,78 +12407,51 @@ snapshots: '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.1.0': - optional: true - '@img/sharp-libvips-darwin-arm64@1.2.0': optional: true '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.1.0': - optional: true - '@img/sharp-libvips-darwin-x64@1.2.0': optional: true '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.1.0': - optional: true - '@img/sharp-libvips-linux-arm64@1.2.0': optional: true '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-arm@1.1.0': - optional: true - '@img/sharp-libvips-linux-arm@1.2.0': optional: true - '@img/sharp-libvips-linux-ppc64@1.1.0': - optional: true - '@img/sharp-libvips-linux-ppc64@1.2.0': optional: true '@img/sharp-libvips-linux-s390x@1.0.4': optional: true - '@img/sharp-libvips-linux-s390x@1.1.0': - optional: true - '@img/sharp-libvips-linux-s390x@1.2.0': optional: true '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.1.0': - optional: true - '@img/sharp-libvips-linux-x64@1.2.0': optional: true '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': - optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': optional: true '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.1.0': - optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.0': optional: true @@ -12619,11 +12460,6 @@ snapshots: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm64@0.34.1': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.1.0 - optional: true - '@img/sharp-linux-arm64@0.34.3': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.2.0 @@ -12634,11 +12470,6 @@ snapshots: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-arm@0.34.1': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.1.0 - optional: true - '@img/sharp-linux-arm@0.34.3': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.2.0 @@ -12654,11 +12485,6 @@ snapshots: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true - '@img/sharp-linux-s390x@0.34.1': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.1.0 - optional: true - '@img/sharp-linux-s390x@0.34.3': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.2.0 @@ -12669,11 +12495,6 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linux-x64@0.34.1': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.1.0 - optional: true - '@img/sharp-linux-x64@0.34.3': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.2.0 @@ -12684,11 +12505,6 @@ snapshots: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.1': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 - optional: true - '@img/sharp-linuxmusl-arm64@0.34.3': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 @@ -12699,11 +12515,6 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.1': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.1.0 - optional: true - '@img/sharp-linuxmusl-x64@0.34.3': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.2.0 @@ -12714,11 +12525,6 @@ snapshots: '@emnapi/runtime': 1.4.3 optional: true - '@img/sharp-wasm32@0.34.1': - dependencies: - '@emnapi/runtime': 1.4.1 - optional: true - '@img/sharp-wasm32@0.34.3': dependencies: '@emnapi/runtime': 1.4.5 @@ -12730,18 +12536,12 @@ snapshots: '@img/sharp-win32-ia32@0.33.5': optional: true - '@img/sharp-win32-ia32@0.34.1': - optional: true - '@img/sharp-win32-ia32@0.34.3': optional: true '@img/sharp-win32-x64@0.33.5': optional: true - '@img/sharp-win32-x64@0.34.1': - optional: true - '@img/sharp-win32-x64@0.34.3': optional: true @@ -12900,7 +12700,7 @@ snapshots: '@next/env@15.1.7': {} - '@next/env@15.4.0-canary.14': {} + '@next/env@15.4.2-canary.29': {} '@next/env@15.4.5': {} @@ -12938,7 +12738,7 @@ snapshots: '@next/swc-darwin-arm64@15.1.7': optional: true - '@next/swc-darwin-arm64@15.4.0-canary.14': + '@next/swc-darwin-arm64@15.4.2-canary.29': optional: true '@next/swc-darwin-arm64@15.4.5': @@ -12962,7 +12762,7 @@ snapshots: '@next/swc-darwin-x64@15.1.7': optional: true - '@next/swc-darwin-x64@15.4.0-canary.14': + '@next/swc-darwin-x64@15.4.2-canary.29': optional: true '@next/swc-darwin-x64@15.4.5': @@ -12986,7 +12786,7 @@ snapshots: '@next/swc-linux-arm64-gnu@15.1.7': optional: true - '@next/swc-linux-arm64-gnu@15.4.0-canary.14': + '@next/swc-linux-arm64-gnu@15.4.2-canary.29': optional: true '@next/swc-linux-arm64-gnu@15.4.5': @@ -13010,7 +12810,7 @@ snapshots: '@next/swc-linux-arm64-musl@15.1.7': optional: true - '@next/swc-linux-arm64-musl@15.4.0-canary.14': + '@next/swc-linux-arm64-musl@15.4.2-canary.29': optional: true '@next/swc-linux-arm64-musl@15.4.5': @@ -13034,7 +12834,7 @@ snapshots: '@next/swc-linux-x64-gnu@15.1.7': optional: true - '@next/swc-linux-x64-gnu@15.4.0-canary.14': + '@next/swc-linux-x64-gnu@15.4.2-canary.29': optional: true '@next/swc-linux-x64-gnu@15.4.5': @@ -13058,7 +12858,7 @@ snapshots: '@next/swc-linux-x64-musl@15.1.7': optional: true - '@next/swc-linux-x64-musl@15.4.0-canary.14': + '@next/swc-linux-x64-musl@15.4.2-canary.29': optional: true '@next/swc-linux-x64-musl@15.4.5': @@ -13082,7 +12882,7 @@ snapshots: '@next/swc-win32-arm64-msvc@15.1.7': optional: true - '@next/swc-win32-arm64-msvc@15.4.0-canary.14': + '@next/swc-win32-arm64-msvc@15.4.2-canary.29': optional: true '@next/swc-win32-arm64-msvc@15.4.5': @@ -13112,7 +12912,7 @@ snapshots: '@next/swc-win32-x64-msvc@15.1.7': optional: true - '@next/swc-win32-x64-msvc@15.4.0-canary.14': + '@next/swc-win32-x64-msvc@15.4.2-canary.29': optional: true '@next/swc-win32-x64-msvc@15.4.5': @@ -18936,28 +18736,27 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.4.0-canary.14(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.4.2-canary.29(@opentelemetry/api@1.9.0)(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.4.0-canary.14 - '@swc/counter': 0.1.3 + '@next/env': 15.4.2-canary.29 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001664 + caniuse-lite: 1.0.30001717 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) 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.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.1 + sharp: 0.34.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -20004,34 +19803,6 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - sharp@0.34.1: - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.7.1 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.1 - '@img/sharp-darwin-x64': 0.34.1 - '@img/sharp-libvips-darwin-arm64': 1.1.0 - '@img/sharp-libvips-darwin-x64': 1.1.0 - '@img/sharp-libvips-linux-arm': 1.1.0 - '@img/sharp-libvips-linux-arm64': 1.1.0 - '@img/sharp-libvips-linux-ppc64': 1.1.0 - '@img/sharp-libvips-linux-s390x': 1.1.0 - '@img/sharp-libvips-linux-x64': 1.1.0 - '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 - '@img/sharp-libvips-linuxmusl-x64': 1.1.0 - '@img/sharp-linux-arm': 0.34.1 - '@img/sharp-linux-arm64': 0.34.1 - '@img/sharp-linux-s390x': 0.34.1 - '@img/sharp-linux-x64': 0.34.1 - '@img/sharp-linuxmusl-arm64': 0.34.1 - '@img/sharp-linuxmusl-x64': 0.34.1 - '@img/sharp-wasm32': 0.34.1 - '@img/sharp-win32-ia32': 0.34.1 - '@img/sharp-win32-x64': 0.34.1 - optional: true - sharp@0.34.3: dependencies: color: 4.2.3 From 727d714f06f8d8c71570f4f6a46eb94f99a31712 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Mon, 4 Aug 2025 18:17:45 +0200 Subject: [PATCH 11/12] fixup! force forceTrustHostHeader to true --- .../cloudflare/src/cli/build/bundle-server.ts | 2 + .../patches/plugins/route-module.spec.ts | 50 ++++++++++++++++++- .../cli/build/patches/plugins/route-module.ts | 24 +++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) diff --git a/packages/cloudflare/src/cli/build/bundle-server.ts b/packages/cloudflare/src/cli/build/bundle-server.ts index 12d30faf..050cbb7d 100644 --- a/packages/cloudflare/src/cli/build/bundle-server.ts +++ b/packages/cloudflare/src/cli/build/bundle-server.ts @@ -149,6 +149,8 @@ export async function bundleServer(buildOpts: BuildOptions, projectOpts: Project "process.env.TURBOPACK": "false", // This define should be safe to use for Next 14.2+, earlier versions (13.5 and less) will cause trouble "process.env.__NEXT_EXPERIMENTAL_REACT": `${needsExperimentalReact(nextConfig)}`, + // Fix `res.validate` in Next 15.4 (together with the `route-module` patch) + "process.env.__NEXT_TRUST_HOST_HEADER": "true", }, banner: { // We need to import them here, assigning them to `globalThis` does not work because node:timers use `globalThis` and thus create an infinite loop diff --git a/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts b/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts index dbf919af..2660495b 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from "vitest"; import { computePatchDiff } from "../../utils/test-patch.js"; -import { getIncrementalCacheRule } from "./route-module.js"; +import { forceTrustHostHeader, getIncrementalCacheRule } from "./route-module.js"; const code = `class n9 { constructor({ userland: e10, definition: t10, distDir: r10, projectDir: n10 }) { @@ -380,3 +380,51 @@ test("patch the createSnapshot function", () => { " `); }); + +test("force trustHostHeader to true", () => { + const code = ` +async function e9(e, t, r, n) { + o.push("x-vercel-protection-bypass"); + try { + if (n.trustHostHeader) { + let n = await fetch(\`https://\${r.headers.host}\${e}\`, { + method: "HEAD", + headers: s + }); + } else { + throw Object.defineProperty(Error("Invariant: missing internal router-server-methods this is an internal bug"), "__NEXT_ERROR_CODE", { + value: "E676", + enumerable: !1, + configurable: !0 + }) + } + } catch (t) { + throw Object.defineProperty(Error(\`Failed to revalidate \${e}: \${e4(t)?t.message:t}\`), "__NEXT_ERROR_CODE", { + value: "E240", + enumerable: !1, + configurable: !0 + }) + } +} +`; + + expect(computePatchDiff("pages-api.runtime.prod.js", code, forceTrustHostHeader)).toMatchInlineSnapshot(` + "Index: pages-api.runtime.prod.js + =================================================================== + --- pages-api.runtime.prod.js + +++ pages-api.runtime.prod.js + @@ -1,8 +1,7 @@ + - + -async function e9(e, t, r, n) { + - o.push("x-vercel-protection-bypass"); + - try { + +async function e9(e,t,r,n) { + + n.trustHostHeader = true; + + o.push("x-vercel-protection-bypass");try { + if (n.trustHostHeader) { + let n = await fetch(\`https://\${r.headers.host}\${e}\`, { + method: "HEAD", + headers: s + " + `); +}); diff --git a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts index adf201ef..59957c74 100644 --- a/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts @@ -29,6 +29,7 @@ export function patchRouteModules(updater: ContentUpdater, buildOpts: BuildOptio const outputPath = path.join(outputDir, "server-functions/default"); const cacheHandler = path.join(outputPath, getPackagePath(buildOpts), "cache.cjs"); contents = patchCode(contents, getIncrementalCacheRule(cacheHandler)); + contents = patchCode(contents, forceTrustHostHeader); return contents; }, }, @@ -59,3 +60,26 @@ fix: |- let $CACHE_HANDLER = require('${normalizePath(handlerPath)}').default; `; } + +/** + * Force trustHostHeader to be true for revalidation + */ +export const forceTrustHostHeader = ` +rule: + pattern: async function $FN($$$ARGS) { $$$BODY } + all: + - has: + pattern: if ($CONTEXT.trustHostHeader) { $$$_ } + stopBy: end + - has: + regex: "^x-vercel-protection-bypass$" + stopBy: end + - has: + regex: "Invariant: missing internal" + stopBy: end +fix: |- + async function $FN($$$ARGS) { + $CONTEXT.trustHostHeader = true; + $$$BODY + } +`; From 1b77fd651f859c88fe6dcc377295c97ab1ce4b44 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Mon, 4 Aug 2025 18:22:45 +0200 Subject: [PATCH 12/12] Update .changeset/rude-sloths-march.md --- .changeset/rude-sloths-march.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/rude-sloths-march.md b/.changeset/rude-sloths-march.md index 28436645..e7b0bb86 100644 --- a/.changeset/rude-sloths-march.md +++ b/.changeset/rude-sloths-march.md @@ -2,4 +2,4 @@ "@opennextjs/cloudflare": patch --- -add(patch): Patch getIncrementalCache in route-module.ts for ISR support in Next.js 15.4" +Update the patches to support Next.js 15.4"