diff --git a/.changeset/rude-sloths-march.md b/.changeset/rude-sloths-march.md new file mode 100644 index 00000000..e7b0bb86 --- /dev/null +++ b/.changeset/rude-sloths-march.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/cloudflare": patch +--- + +Update the patches to support Next.js 15.4" 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"); 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/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/bundle-server.ts b/packages/cloudflare/src/cli/build/bundle-server.ts index a00d250d..050cbb7d 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 @@ -147,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/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/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..2660495b --- /dev/null +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.spec.ts @@ -0,0 +1,430 @@ +import { expect, test } from "vitest"; + +import { computePatchDiff } from "../../utils/test-patch.js"; +import { forceTrustHostHeader, 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; + +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))); + } + " + `); +}); + +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 new file mode 100644 index 00000000..59957c74 --- /dev/null +++ b/packages/cloudflare/src/cli/build/patches/plugins/route-module.ts @@ -0,0 +1,85 @@ +/** + * Patch for `next/src/server/route-modules/route-module.ts` + * 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 + * + */ + +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)); + contents = patchCode(contents, forceTrustHostHeader); + 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 $CACHE_HANDLER, { cacheHandler: $HANDLER_PATH } = $C" + inside: + kind: method_definition + has: + field: name + regex: ^getIncrementalCache$ + stopBy: end +fix: |- + const $HANDLER_PATH = null; + 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 + } +`; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 33488a29..657e0e1d 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 @@ -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 @@ -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 @@ -1809,12 +1809,12 @@ 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==} + '@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' @@ -2924,8 +2924,8 @@ packages: cpu: [arm64] os: [darwin] - '@img/sharp-darwin-arm64@0.34.1': - resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} + '@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] @@ -2936,8 +2936,8 @@ packages: cpu: [x64] os: [darwin] - '@img/sharp-darwin-x64@0.34.1': - resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} + '@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] @@ -2947,8 +2947,8 @@ packages: cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.1.0': - resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + '@img/sharp-libvips-darwin-arm64@1.2.0': + resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} cpu: [arm64] os: [darwin] @@ -2957,8 +2957,8 @@ packages: cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.1.0': - resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + '@img/sharp-libvips-darwin-x64@1.2.0': + resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} cpu: [x64] os: [darwin] @@ -2967,8 +2967,8 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm64@1.1.0': - resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + '@img/sharp-libvips-linux-arm64@1.2.0': + resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} cpu: [arm64] os: [linux] @@ -2977,13 +2977,13 @@ packages: cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-arm@1.1.0': - resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + '@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==} + '@img/sharp-libvips-linux-ppc64@1.2.0': + resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} cpu: [ppc64] os: [linux] @@ -2992,8 +2992,8 @@ packages: cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-s390x@1.1.0': - resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + '@img/sharp-libvips-linux-s390x@1.2.0': + resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} cpu: [s390x] os: [linux] @@ -3002,8 +3002,8 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-libvips-linux-x64@1.1.0': - resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + '@img/sharp-libvips-linux-x64@1.2.0': + resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} cpu: [x64] os: [linux] @@ -3012,8 +3012,8 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': - resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} cpu: [arm64] os: [linux] @@ -3022,8 +3022,8 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.1.0': - resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} cpu: [x64] os: [linux] @@ -3033,8 +3033,8 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-linux-arm64@0.34.1': - resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} + '@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] @@ -3045,20 +3045,26 @@ packages: cpu: [arm] os: [linux] - '@img/sharp-linux-arm@0.34.1': - resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} + '@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} cpu: [s390x] os: [linux] - '@img/sharp-linux-s390x@0.34.1': - resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} + '@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] @@ -3069,8 +3075,8 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-x64@0.34.1': - resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} + '@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] @@ -3081,8 +3087,8 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.1': - resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} + '@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] @@ -3093,8 +3099,8 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.1': - resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} + '@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] @@ -3104,19 +3110,25 @@ packages: engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-wasm32@0.34.1': - resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} + '@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} cpu: [ia32] os: [win32] - '@img/sharp-win32-ia32@0.34.1': - resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} + '@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] @@ -3127,8 +3139,8 @@ packages: cpu: [x64] os: [win32] - '@img/sharp-win32-x64@0.34.1': - resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} + '@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] @@ -3259,11 +3271,11 @@ 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.2-canary.29': + resolution: {integrity: sha512-zmkSqVO16lUnanrgywv4SfgiLyMI2V/IxEgRTKcded5Lor0jXC73eqtjTL4vKpFKK771l7M0zILv8Hv5uHsR1A==} - '@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 +3325,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.2-canary.29': + resolution: {integrity: sha512-W0isQe+NuLgGEccJoqfuikN8irbHrq7qHYI+w2hdw0l6CzgvKa4GYEQV4FnblK9epa9rU+SRdTB428vzl5eesQ==} 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 +3373,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.2-canary.29': + resolution: {integrity: sha512-vPIml27iYFMqRNwYRO82leBuBs0Boach3thGfrUIzbDUambfQmKaylMBaEYkX2s7if+p+FmmCHY0XYrRHQf4yQ==} 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 +3421,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.2-canary.29': + resolution: {integrity: sha512-OfjJBsSqHCNzcyMkMD2zoMOe6/l1EIWkuWYGPmffImSvPelXwY42FL42VHvYvnX6cq8xeOOEj6WIj03mPiErIA==} 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 +3469,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.2-canary.29': + resolution: {integrity: sha512-U2Rp+q3Fs/1P6/UPEIhSJ4zOuEUnq1SSLjsLdra1ZJNrt/bOiulB8EtCaGzNCP+Fc/C3x0o7HswUL1PTGPCaqA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.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 +3517,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.2-canary.29': + resolution: {integrity: sha512-naAxNmS9fB4ayezHHWnoM2nHyxHge1V8rJnJ5sGFQDexsZI0B5u4ghvVrPvX+z7u3vyOhJrWQuXiAXHcbBP2xg==} 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 +3565,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.2-canary.29': + resolution: {integrity: sha512-4Id31wM5uep5jqwyvFlfzduPaXa6sbLdgQk+wWVMsSC9FqiIkevIB541OP/MnsoiQ6djTmd1NiRxeC0ffR7Llw==} 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 +3613,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.2-canary.29': + resolution: {integrity: sha512-6x5I4/MskJ9rXC8Co+U9sAXUqGfz+pzikNE5Bt6atwILP39GNLV1RxkcZUHx1/qK/Z5+NFsUmPNfjlH6auph+g==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.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 +3673,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.2-canary.29': + resolution: {integrity: sha512-yKyOuM2HH1Ryvd80q+5wYZrMIcn8+4sEJo5++Ywf0CFEnkSZdj6gl5BX2qU4OdryiR2E/29PFwv7qEYTFUaXiQ==} 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,13 +7875,13 @@ packages: sass: optional: true - next@15.3.5: - resolution: {integrity: sha512-RkazLBMMDJSJ4XZQ81kolSpwiCt907l0xcgcpF4xC2Vml6QVcPNXW0NQRwQ80FFtSn7UM52XN0anaw8TEJXaiw==} + 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 @@ -7884,13 +7896,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 +8758,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'} @@ -8779,8 +8796,8 @@ 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==} + 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: @@ -11423,12 +11440,12 @@ snapshots: dependencies: '@edge-runtime/primitives': 4.1.0 - '@emnapi/runtime@1.4.1': + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.3': + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true @@ -12372,9 +12389,9 @@ snapshots: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-arm64@0.34.1': + '@img/sharp-darwin-arm64@0.34.3': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-arm64': 1.2.0 optional: true '@img/sharp-darwin-x64@0.33.5': @@ -12382,60 +12399,60 @@ snapshots: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.34.1': + '@img/sharp-darwin-x64@0.34.3': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.1.0 + '@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': + '@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': + '@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': + '@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': + '@img/sharp-libvips-linux-arm@1.2.0': optional: true - '@img/sharp-libvips-linux-ppc64@1.1.0': + '@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': + '@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': + '@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': + '@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': + '@img/sharp-libvips-linuxmusl-x64@1.2.0': optional: true '@img/sharp-linux-arm64@0.33.5': @@ -12443,9 +12460,9 @@ snapshots: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm64@0.34.1': + '@img/sharp-linux-arm64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.2.0 optional: true '@img/sharp-linux-arm@0.33.5': @@ -12453,9 +12470,14 @@ snapshots: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-arm@0.34.1': + '@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-arm': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.2.0 optional: true '@img/sharp-linux-s390x@0.33.5': @@ -12463,9 +12485,9 @@ snapshots: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true - '@img/sharp-linux-s390x@0.34.1': + '@img/sharp-linux-s390x@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.2.0 optional: true '@img/sharp-linux-x64@0.33.5': @@ -12473,9 +12495,9 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linux-x64@0.34.1': + '@img/sharp-linux-x64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.2.0 optional: true '@img/sharp-linuxmusl-arm64@0.33.5': @@ -12483,9 +12505,9 @@ snapshots: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.1': + '@img/sharp-linuxmusl-arm64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 optional: true '@img/sharp-linuxmusl-x64@0.33.5': @@ -12493,9 +12515,9 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.1': + '@img/sharp-linuxmusl-x64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 optional: true '@img/sharp-wasm32@0.33.5': @@ -12503,21 +12525,24 @@ snapshots: '@emnapi/runtime': 1.4.3 optional: true - '@img/sharp-wasm32@0.34.1': + '@img/sharp-wasm32@0.34.3': dependencies: - '@emnapi/runtime': 1.4.1 + '@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': + '@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': + '@img/sharp-win32-x64@0.34.3': optional: true '@isaacs/cliui@8.0.2': @@ -12675,9 +12700,9 @@ snapshots: '@next/env@15.1.7': {} - '@next/env@15.3.5': {} + '@next/env@15.4.2-canary.29': {} - '@next/env@15.4.0-canary.14': {} + '@next/env@15.4.5': {} '@next/eslint-plugin-next@14.2.14': dependencies: @@ -12713,10 +12738,10 @@ snapshots: '@next/swc-darwin-arm64@15.1.7': optional: true - '@next/swc-darwin-arm64@15.3.5': + '@next/swc-darwin-arm64@15.4.2-canary.29': 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 +12762,10 @@ snapshots: '@next/swc-darwin-x64@15.1.7': optional: true - '@next/swc-darwin-x64@15.3.5': + '@next/swc-darwin-x64@15.4.2-canary.29': 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 +12786,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.2-canary.29': 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 +12810,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.2-canary.29': 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 +12834,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.2-canary.29': 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 +12858,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.2-canary.29': 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 +12882,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.2-canary.29': 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 +12912,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.2-canary.29': 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,55 +18736,52 @@ 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.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.3.5 - '@swc/counter': 0.1.3 + '@next/env': 15.4.2-canary.29 '@swc/helpers': 0.5.15 - busboy: 1.6.0 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.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.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 - 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 +19721,9 @@ snapshots: semver@7.7.1: {} + semver@7.7.2: + optional: true + send@1.2.0: dependencies: debug: 4.4.0 @@ -19778,32 +19803,34 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - sharp@0.34.1: + sharp@0.34.3: dependencies: color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.7.1 + detect-libc: 2.0.4 + semver: 7.7.2 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 + '@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: 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