Skip to content

Conversation

@lukesandberg
Copy link
Contributor

@lukesandberg lukesandberg commented Oct 21, 2025

What

Change our server source map generation to generate source map relative file paths in production mode. In development we already generate absolute paths which is reasonable for development usecases, but in production we were using turbopack::/// schemed uris. This changes the file handling for files in the [project] filesystem to be relative.

Why

This enables node and other runtimes to automatically format file paths to be working directory relative when printing errors to the console which many teminal emulators

Example

Before:

image.png

after:

image.png

TIL

My initial approach for this was to set the sourceRoot option to avoid prepending the same string onto nearly every source uri. However, the spec on this sourcemap feature is garbage. Intuitively i thought it worked like <base href=...> where relative uris would 'resolve' against it, but no, it is just a string concatenation feature. sigh.

@ijjk ijjk added created-by: Turbopack team PRs by the Turbopack team. examples Issue was opened via the examples template. Turbopack Related to Turbopack with Next.js. labels Oct 21, 2025
Copy link
Contributor Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@lukesandberg lukesandberg changed the title Initial implementation of relative file paths for server source maps. Node has build in logic to resolve relative file uris out of source maps as relative to the project CWD [turbopack] in server source maps format project paths relative file paths. Oct 21, 2025
@ijjk
Copy link
Member

ijjk commented Oct 21, 2025

Stats from current PR

Default Build
General Overall increase ⚠️
vercel/next.js canary vercel/next.js relative_file_paths_in_node Change
buildDuration 32.5s 29.2s N/A
buildDurationCached 27.7s 21.8s N/A
nodeModulesSize 454 MB 454 MB ⚠️ +5.59 kB
nextStartRea..uration (ms) 969ms 970ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js relative_file_paths_in_node Change
1916.HASH.js gzip 169 B 169 B
4498-HASH.js gzip 54.7 kB 54.6 kB N/A
9225-HASH.js gzip 5.32 kB 5.32 kB N/A
c57d0559-HASH.js gzip 62.1 kB 62.1 kB N/A
framework-HASH.js gzip 59.8 kB 59.8 kB
main-app-HASH.js gzip 257 B 257 B
main-HASH.js gzip 39.8 kB 39.8 kB N/A
webpack-HASH.js gzip 1.69 kB 1.69 kB N/A
Overall change 60.2 kB 60.2 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js relative_file_paths_in_node Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary vercel/next.js relative_file_paths_in_node Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 182 B 182 B
css-HASH.js gzip 334 B 334 B
dynamic-HASH.js gzip 1.8 kB 1.8 kB N/A
edge-ssr-HASH.js gzip 256 B 255 B N/A
head-HASH.js gzip 350 B 352 B N/A
hooks-HASH.js gzip 384 B 381 B N/A
image-HASH.js gzip 4.79 kB 4.79 kB N/A
index-HASH.js gzip 259 B 260 B N/A
link-HASH.js gzip 2.5 kB 2.51 kB N/A
routerDirect..HASH.js gzip 318 B 317 B N/A
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 1.52 kB 1.52 kB
Client Build Manifests
vercel/next.js canary vercel/next.js relative_file_paths_in_node Change
_buildManifest.js gzip 716 B 719 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js relative_file_paths_in_node Change
index.html gzip 523 B 524 B N/A
link.html gzip 536 B 538 B N/A
withRouter.html gzip 518 B 520 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js relative_file_paths_in_node Change
edge-ssr.js gzip 128 kB 128 kB N/A
page.js gzip 260 kB 260 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js relative_file_paths_in_node Change
middleware-b..fest.js gzip 640 B 641 B N/A
middleware-r..fest.js gzip 156 B 157 B N/A
middleware.js gzip 32.9 kB 32.7 kB N/A
edge-runtime..pack.js gzip 846 B 846 B
Overall change 846 B 846 B
Next Runtimes
vercel/next.js canary vercel/next.js relative_file_paths_in_node Change
app-page-exp...dev.js gzip 295 kB 295 kB N/A
app-page-exp..prod.js gzip 162 kB 162 kB
app-page-tur...dev.js gzip 295 kB 295 kB N/A
app-page-tur..prod.js gzip 161 kB 161 kB
app-page-tur...dev.js gzip 291 kB 291 kB N/A
app-page-tur..prod.js gzip 159 kB 159 kB
app-page.run...dev.js gzip 292 kB 292 kB
app-page.run..prod.js gzip 159 kB 159 kB
app-route-ex...dev.js gzip 70.8 kB 70.8 kB
app-route-ex..prod.js gzip 49.4 kB 49.4 kB
app-route-tu...dev.js gzip 70.8 kB 70.8 kB
app-route-tu..prod.js gzip 49.4 kB 49.4 kB
app-route-tu...dev.js gzip 70.4 kB 70.4 kB
app-route-tu..prod.js gzip 49.2 kB 49.2 kB
app-route.ru...dev.js gzip 70.4 kB 70.4 kB
app-route.ru..prod.js gzip 49.1 kB 49.1 kB
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 328 B 328 B
dist_client_...dev.js gzip 320 B 320 B
dist_client_...dev.js gzip 318 B 318 B
pages-api-tu...dev.js gzip 43.3 kB 43.3 kB
pages-api-tu..prod.js gzip 33.1 kB 33.1 kB N/A
pages-api.ru...dev.js gzip 43.3 kB 43.3 kB
pages-api.ru..prod.js gzip 33.1 kB 33.1 kB
pages-turbo....dev.js gzip 52.8 kB 52.8 kB
pages-turbo...prod.js gzip 40.1 kB 40.1 kB N/A
pages.runtim...dev.js gzip 52.8 kB 52.8 kB
pages.runtim..prod.js gzip 40 kB 40 kB
server.runti..prod.js gzip 78.9 kB 78.9 kB N/A
Overall change 1.68 MB 1.68 MB
build cache
vercel/next.js canary vercel/next.js relative_file_paths_in_node Change
0.pack gzip 3.26 MB 3.25 MB N/A
index.pack gzip 95.4 kB 95.2 kB N/A
Overall change 0 B 0 B
Diff details
Diff for page.js

Diff too large to display

Diff for middleware.js

Diff too large to display

Diff for edge-ssr.js

Diff too large to display

Diff for css-HASH.js
@@ -1,7 +1,31 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [9813],
   {
-    /***/ 3593: /***/ (
+    /***/ 5832: /***/ (module) => {
+      // extracted by mini-css-extract-plugin
+      module.exports = { helloWorld: "css_helloWorld__aUdUq" };
+
+      /***/
+    },
+
+    /***/ 6471: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/css",
+        function () {
+          return __webpack_require__(7839);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 7839: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -15,7 +39,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7634);
+        __webpack_require__(5832);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           _css_module_css__WEBPACK_IMPORTED_MODULE_1__
@@ -34,37 +58,13 @@
 
       /***/
     },
-
-    /***/ 4569: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/css",
-        function () {
-          return __webpack_require__(3593);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 7634: /***/ (module) => {
-      // extracted by mini-css-extract-plugin
-      module.exports = { helloWorld: "css_helloWorld__aUdUq" };
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(4569)
+      __webpack_exec__(6471)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for dynamic-HASH.js
@@ -1,24 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2291],
   {
-    /***/ 1033: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/dynamic",
-        function () {
-          return __webpack_require__(2283);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 2283: /***/ (
+    /***/ 133: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -33,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(4939);
+        __webpack_require__(7514);
       /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_dynamic__WEBPACK_IMPORTED_MODULE_1__
@@ -42,12 +25,12 @@
       const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
         () =>
           __webpack_require__
-            .e(/* import() */ 1916)
-            .then(__webpack_require__.bind(__webpack_require__, 1916))
+            .e(/* import() */ 3862)
+            .then(__webpack_require__.bind(__webpack_require__, 3862))
             .then((mod) => mod.Hello),
         {
           loadableGenerated: {
-            webpack: () => [/*require.resolve*/ 1916],
+            webpack: () => [/*require.resolve*/ 3862],
           },
         }
       );
@@ -74,17 +57,24 @@
       /***/
     },
 
-    /***/ 4939: /***/ (
-      module,
+    /***/ 431: /***/ (
+      __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(5121);
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/dynamic",
+        function () {
+          return __webpack_require__(133);
+        },
+      ]);
+      if (false) {
+      }
 
       /***/
     },
 
-    /***/ 5121: /***/ (module, exports, __webpack_require__) => {
+    /***/ 1709: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -117,7 +107,7 @@
         __webpack_require__(2223)
       );
       const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(7622)
+        __webpack_require__(2522)
       );
       const isServerSide = "object" === "undefined";
       // Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -217,7 +207,7 @@
       /***/
     },
 
-    /***/ 5160: /***/ (
+    /***/ 2463: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -244,7 +234,7 @@
       /***/
     },
 
-    /***/ 7622: /***/ (
+    /***/ 2522: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -286,7 +276,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(2223)
       );
-      const _loadablecontextsharedruntime = __webpack_require__(5160);
+      const _loadablecontextsharedruntime = __webpack_require__(2463);
       function resolve(obj) {
         return obj && obj.default ? obj.default : obj;
       }
@@ -518,13 +508,23 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
 
       /***/
     },
+
+    /***/ 7514: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(1709);
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1033)
+      __webpack_exec__(431)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for hooks-HASH.js
@@ -1,24 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [9804],
   {
-    /***/ 1679: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/hooks",
-        function () {
-          return __webpack_require__(9198);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 9198: /***/ (
+    /***/ 2592: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -76,13 +59,30 @@
 
       /***/
     },
+
+    /***/ 3925: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/hooks",
+        function () {
+          return __webpack_require__(2592);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1679)
+      __webpack_exec__(3925)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for image-HASH.js

Diff too large to display

Diff for index-HASH.js
@@ -1,7 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3332],
   {
-    /***/ 3454: /***/ (
+    /***/ 8431: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/",
+        function () {
+          return __webpack_require__(8972);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 8972: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -19,30 +36,13 @@
 
       /***/
     },
-
-    /***/ 9241: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/",
-        function () {
-          return __webpack_require__(3454);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(9241)
+      __webpack_exec__(8431)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for link-HASH.js
@@ -1,26 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4672],
   {
-    /***/ 1970: /***/ (__unused_webpack_module, exports) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "errorOnce", {
-        enumerable: true,
-        get: function () {
-          return errorOnce;
+    /***/ 2025: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/link",
+        function () {
+          return __webpack_require__(3072);
         },
-      });
-      let errorOnce = (_) => {};
+      ]);
       if (false) {
-      } //# sourceMappingURL=error-once.js.map
+      }
 
       /***/
     },
 
-    /***/ 3262: /***/ (module, exports, __webpack_require__) => {
+    /***/ 3066: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -47,17 +45,17 @@
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
         __webpack_require__(2223)
       );
-      const _resolvehref = __webpack_require__(7868);
-      const _islocalurl = __webpack_require__(9350);
-      const _formaturl = __webpack_require__(6319);
-      const _utils = __webpack_require__(9889);
-      const _addlocale = __webpack_require__(9466);
-      const _routercontextsharedruntime = __webpack_require__(5691);
-      const _useintersection = __webpack_require__(3981);
-      const _getdomainlocale = __webpack_require__(4206);
-      const _addbasepath = __webpack_require__(9339);
-      const _usemergedref = __webpack_require__(6848);
-      const _erroronce = __webpack_require__(1970);
+      const _resolvehref = __webpack_require__(2776);
+      const _islocalurl = __webpack_require__(5770);
+      const _formaturl = __webpack_require__(8531);
+      const _utils = __webpack_require__(3565);
+      const _addlocale = __webpack_require__(8878);
+      const _routercontextsharedruntime = __webpack_require__(5111);
+      const _useintersection = __webpack_require__(6873);
+      const _getdomainlocale = __webpack_require__(4554);
+      const _addbasepath = __webpack_require__(9567);
+      const _usemergedref = __webpack_require__(4308);
+      const _erroronce = __webpack_require__(8910);
       const prefetched = new Set();
       function prefetch(router, href, as, options) {
         if (false) {
@@ -436,7 +434,167 @@
       /***/
     },
 
-    /***/ 3981: /***/ (module, exports, __webpack_require__) => {
+    /***/ 3072: /***/ (
+      __unused_webpack_module,
+      __webpack_exports__,
+      __webpack_require__
+    ) => {
+      "use strict";
+      __webpack_require__.r(__webpack_exports__);
+      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
+        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
+        /* harmony export */
+      });
+      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+        __webpack_require__(1503);
+      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
+        __webpack_require__(6929);
+      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
+        /*#__PURE__*/ __webpack_require__.n(
+          next_link__WEBPACK_IMPORTED_MODULE_1__
+        );
+
+      function aLink(props) {
+        return /*#__PURE__*/ (0,
+        react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
+          children: [
+            /*#__PURE__*/ (0,
+            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
+              children: "A Link page!",
+            }),
+            /*#__PURE__*/ (0,
+            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+              next_link__WEBPACK_IMPORTED_MODULE_1___default(),
+              {
+                href: "/",
+                children: "Go to /",
+              }
+            ),
+          ],
+        });
+      }
+      var __N_SSP = true;
+      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
+
+      /***/
+    },
+
+    /***/ 4308: /***/ (module, exports, __webpack_require__) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "useMergedRef", {
+        enumerable: true,
+        get: function () {
+          return useMergedRef;
+        },
+      });
+      const _react = __webpack_require__(2223);
+      function useMergedRef(refA, refB) {
+        const cleanupA = (0, _react.useRef)(null);
+        const cleanupB = (0, _react.useRef)(null);
+        // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
+        // (this happens often if the user doesn't pass a ref to Link/Form/Image)
+        // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
+        // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
+        // (because it hasn't been updated for React 19)
+        // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
+        // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
+        return (0, _react.useCallback)(
+          (current) => {
+            if (current === null) {
+              const cleanupFnA = cleanupA.current;
+              if (cleanupFnA) {
+                cleanupA.current = null;
+                cleanupFnA();
+              }
+              const cleanupFnB = cleanupB.current;
+              if (cleanupFnB) {
+                cleanupB.current = null;
+                cleanupFnB();
+              }
+            } else {
+              if (refA) {
+                cleanupA.current = applyRef(refA, current);
+              }
+              if (refB) {
+                cleanupB.current = applyRef(refB, current);
+              }
+            }
+          },
+          [refA, refB]
+        );
+      }
+      function applyRef(refA, current) {
+        if (typeof refA === "function") {
+          const cleanup = refA(current);
+          if (typeof cleanup === "function") {
+            return cleanup;
+          } else {
+            return () => refA(null);
+          }
+        } else {
+          refA.current = current;
+          return () => {
+            refA.current = null;
+          };
+        }
+      }
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=use-merged-ref.js.map
+
+      /***/
+    },
+
+    /***/ 4554: /***/ (module, exports, __webpack_require__) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "getDomainLocale", {
+        enumerable: true,
+        get: function () {
+          return getDomainLocale;
+        },
+      });
+      const _normalizetrailingslash = __webpack_require__(7740);
+      const basePath =
+        /* unused pure expression or super */ null && (false || "");
+      function getDomainLocale(path, locale, locales, domainLocales) {
+        if (false) {
+        } else {
+          return false;
+        }
+      }
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=get-domain-locale.js.map
+
+      /***/
+    },
+
+    /***/ 6873: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -449,7 +607,7 @@
         },
       });
       const _react = __webpack_require__(2223);
-      const _requestidlecallback = __webpack_require__(1472);
+      const _requestidlecallback = __webpack_require__(6892);
       const hasIntersectionObserver =
         typeof IntersectionObserver === "function";
       const observers = new Map();
@@ -561,189 +719,31 @@
       /***/
     },
 
-    /***/ 4206: /***/ (module, exports, __webpack_require__) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "getDomainLocale", {
-        enumerable: true,
-        get: function () {
-          return getDomainLocale;
-        },
-      });
-      const _normalizetrailingslash = __webpack_require__(6704);
-      const basePath =
-        /* unused pure expression or super */ null && (false || "");
-      function getDomainLocale(path, locale, locales, domainLocales) {
-        if (false) {
-        } else {
-          return false;
-        }
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=get-domain-locale.js.map
-
-      /***/
-    },
-
-    /***/ 6691: /***/ (
+    /***/ 6929: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(3262);
+      module.exports = __webpack_require__(3066);
 
       /***/
     },
 
-    /***/ 6771: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/link",
-        function () {
-          return __webpack_require__(8178);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 6848: /***/ (module, exports, __webpack_require__) => {
+    /***/ 8910: /***/ (__unused_webpack_module, exports) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
-      Object.defineProperty(exports, "useMergedRef", {
+      Object.defineProperty(exports, "errorOnce", {
         enumerable: true,
         get: function () {
-          return useMergedRef;
+          return errorOnce;
         },
       });
-      const _react = __webpack_require__(2223);
-      function useMergedRef(refA, refB) {
-        const cleanupA = (0, _react.useRef)(null);
-        const cleanupB = (0, _react.useRef)(null);
-        // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
-        // (this happens often if the user doesn't pass a ref to Link/Form/Image)
-        // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
-        // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
-        // (because it hasn't been updated for React 19)
-        // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
-        // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
-        return (0, _react.useCallback)(
-          (current) => {
-            if (current === null) {
-              const cleanupFnA = cleanupA.current;
-              if (cleanupFnA) {
-                cleanupA.current = null;
-                cleanupFnA();
-              }
-              const cleanupFnB = cleanupB.current;
-              if (cleanupFnB) {
-                cleanupB.current = null;
-                cleanupFnB();
-              }
-            } else {
-              if (refA) {
-                cleanupA.current = applyRef(refA, current);
-              }
-              if (refB) {
-                cleanupB.current = applyRef(refB, current);
-              }
-            }
-          },
-          [refA, refB]
-        );
-      }
-      function applyRef(refA, current) {
-        if (typeof refA === "function") {
-          const cleanup = refA(current);
-          if (typeof cleanup === "function") {
-            return cleanup;
-          } else {
-            return () => refA(null);
-          }
-        } else {
-          refA.current = current;
-          return () => {
-            refA.current = null;
-          };
-        }
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=use-merged-ref.js.map
-
-      /***/
-    },
-
-    /***/ 8178: /***/ (
-      __unused_webpack_module,
-      __webpack_exports__,
-      __webpack_require__
-    ) => {
-      "use strict";
-      __webpack_require__.r(__webpack_exports__);
-      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
-        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
-        /* harmony export */
-      });
-      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
-        __webpack_require__(1503);
-      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(6691);
-      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
-        /*#__PURE__*/ __webpack_require__.n(
-          next_link__WEBPACK_IMPORTED_MODULE_1__
-        );
-
-      function aLink(props) {
-        return /*#__PURE__*/ (0,
-        react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
-          children: [
-            /*#__PURE__*/ (0,
-            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
-              children: "A Link page!",
-            }),
-            /*#__PURE__*/ (0,
-            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
-              next_link__WEBPACK_IMPORTED_MODULE_1___default(),
-              {
-                href: "/",
-                children: "Go to /",
-              }
-            ),
-          ],
-        });
-      }
-      var __N_SSP = true;
-      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
+      let errorOnce = (_) => {};
+      if (false) {
+      } //# sourceMappingURL=error-once.js.map
 
       /***/
     },
@@ -753,7 +753,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(6771)
+      __webpack_exec__(2025)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for routerDirect-HASH.js
@@ -1,7 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [188],
   {
-    /***/ 286: /***/ (
+    /***/ 417: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/routerDirect",
+        function () {
+          return __webpack_require__(504);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 504: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -16,7 +33,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7798);
+        __webpack_require__(1840);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -36,29 +53,12 @@
       /***/
     },
 
-    /***/ 4283: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/routerDirect",
-        function () {
-          return __webpack_require__(286);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 7798: /***/ (
+    /***/ 1840: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(9587);
+      module.exports = __webpack_require__(1903);
 
       /***/
     },
@@ -68,7 +68,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(4283)
+      __webpack_exec__(417)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for script-HASH.js
@@ -1,7 +1,34 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [1209],
   {
-    /***/ 661: /***/ (
+    /***/ 2398: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(2397);
+
+      /***/
+    },
+
+    /***/ 4305: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/script",
+        function () {
+          return __webpack_require__(8543);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 8543: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -16,7 +43,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(5964);
+        __webpack_require__(2398);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -48,40 +75,13 @@
 
       /***/
     },
-
-    /***/ 5964: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(297);
-
-      /***/
-    },
-
-    /***/ 8803: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/script",
-        function () {
-          return __webpack_require__(661);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(8803)
+      __webpack_exec__(4305)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for withRouter-HASH.js
@@ -1,24 +1,17 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3263],
   {
-    /***/ 3163: /***/ (
-      __unused_webpack_module,
+    /***/ 1840: /***/ (
+      module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/withRouter",
-        function () {
-          return __webpack_require__(3295);
-        },
-      ]);
-      if (false) {
-      }
+      module.exports = __webpack_require__(1903);
 
       /***/
     },
 
-    /***/ 3295: /***/ (
+    /***/ 2037: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -33,7 +26,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7798);
+        __webpack_require__(1840);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -52,12 +45,19 @@
       /***/
     },
 
-    /***/ 7798: /***/ (
-      module,
+    /***/ 4041: /***/ (
+      __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(9587);
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/withRouter",
+        function () {
+          return __webpack_require__(2037);
+        },
+      ]);
+      if (false) {
+      }
 
       /***/
     },
@@ -67,7 +67,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(3163)
+      __webpack_exec__(4041)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for 4498-HASH.js
failed to diff
Diff for 9225-HASH.js
@@ -1,32 +1,81 @@
 "use strict";
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
-  [9225],
+  [8439],
   {
-    /***/ 2: /***/ (__unused_webpack_module, exports, __webpack_require__) => {
+    /***/ 405: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
-      Object.defineProperty(exports, "ImageConfigContext", {
+      Object.defineProperty(exports, "default", {
         enumerable: true,
         get: function () {
-          return ImageConfigContext;
+          return SideEffect;
         },
       });
-      const _interop_require_default = __webpack_require__(9010);
-      const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(8879)
-      );
-      const _imageconfig = __webpack_require__(1686);
-      const ImageConfigContext = _react.default.createContext(
-        _imageconfig.imageConfigDefault
-      );
-      if (false) {
-      } //# sourceMappingURL=image-config-context.shared-runtime.js.map
+      const _react = __webpack_require__(1774);
+      const isServer = "object" === "undefined";
+      const useClientOnlyLayoutEffect = isServer
+        ? () => {}
+        : _react.useLayoutEffect;
+      const useClientOnlyEffect = isServer ? () => {} : _react.useEffect;
+      function SideEffect(props) {
+        const { headManager, reduceComponentsToState } = props;
+        function emitChange() {
+          if (headManager && headManager.mountedInstances) {
+            const headElements = _react.Children.toArray(
+              Array.from(headManager.mountedInstances).filter(Boolean)
+            );
+            headManager.updateHead(reduceComponentsToState(headElements));
+          }
+        }
+        if (isServer) {
+          headManager?.mountedInstances?.add(props.children);
+          emitChange();
+        }
+        useClientOnlyLayoutEffect(() => {
+          headManager?.mountedInstances?.add(props.children);
+          return () => {
+            headManager?.mountedInstances?.delete(props.children);
+          };
+        });
+        // We need to call `updateHead` method whenever the `SideEffect` is trigger in all
+        // life-cycles: mount, update, unmount. However, if there are multiple `SideEffect`s
+        // being rendered, we only trigger the method from the last one.
+        // This is ensured by keeping the last unflushed `updateHead` in the `_pendingUpdate`
+        // singleton in the layout effect pass, and actually trigger it in the effect pass.
+        useClientOnlyLayoutEffect(() => {
+          if (headManager) {
+            headManager._pendingUpdate = emitChange;
+          }
+          return () => {
+            if (headManager) {
+              headManager._pendingUpdate = emitChange;
+            }
+          };
+        });
+        useClientOnlyEffect(() => {
+          if (headManager && headManager._pendingUpdate) {
+            headManager._pendingUpdate();
+            headManager._pendingUpdate = null;
+          }
+          return () => {
+            if (headManager && headManager._pendingUpdate) {
+              headManager._pendingUpdate();
+              headManager._pendingUpdate = null;
+            }
+          };
+        });
+        return null;
+      } //# sourceMappingURL=side-effect.js.map
 
       /***/
     },
 
-    /***/ 1169: /***/ (
+    /***/ 1155: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -40,9 +89,9 @@
           return getImgProps;
         },
       });
-      const _warnonce = __webpack_require__(4352);
-      const _imageblursvg = __webpack_require__(2314);
-      const _imageconfig = __webpack_require__(1686);
+      const _warnonce = __webpack_require__(5358);
+      const _imageblursvg = __webpack_require__(6924);
+      const _imageconfig = __webpack_require__(9712);
       const VALID_LOADING_VALUES =
         /* unused pure expression or super */ null && [
           "lazy",
@@ -473,245 +522,60 @@
       /***/
     },
 
-    /***/ 1666: /***/ (module, exports, __webpack_require__) => {
-      /* __next_internal_client_entry_do_not_use__  cjs */
+    /***/ 1417: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
-      0 && 0;
-      function _export(target, all) {
-        for (var name in all)
-          Object.defineProperty(target, name, {
-            enumerable: true,
-            get: all[name],
-          });
-      }
-      _export(exports, {
-        default: function () {
+      Object.defineProperty(exports, "default", {
+        enumerable: true,
+        get: function () {
           return _default;
         },
-        defaultHead: function () {
-          return defaultHead;
-        },
       });
-      const _interop_require_default = __webpack_require__(9010);
-      const _interop_require_wildcard = __webpack_require__(2275);
-      const _jsxruntime = __webpack_require__(1024);
-      const _react = /*#__PURE__*/ _interop_require_wildcard._(
-        __webpack_require__(8879)
-      );
-      const _sideeffect = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(2543)
-      );
-      const _headmanagercontextsharedruntime = __webpack_require__(5428);
-      const _warnonce = __webpack_require__(4352);
-      function defaultHead() {
-        const head = [
-          /*#__PURE__*/ (0, _jsxruntime.jsx)(
-            "meta",
-            {
-              charSet: "utf-8",
-            },
-            "charset"
-          ),
-          /*#__PURE__*/ (0, _jsxruntime.jsx)(
-            "meta",
+      const _findclosestquality = __webpack_require__(1639);
+      function defaultLoader({ config, src, width, quality }) {
+        if (
+          src.startsWith("/") &&
+          src.includes("?") &&
+          config.localPatterns?.length === 1 &&
+          config.localPatterns[0].pathname === "**" &&
+          config.localPatterns[0].search === ""
+        ) {
+          throw Object.defineProperty(
+            new Error(
+              `Image with src "${src}" is using a query string which is not configured in images.localPatterns.` +
+                `\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`
+            ),
+            "__NEXT_ERROR_CODE",
             {
-              name: "viewport",
-              content: "width=device-width",
-            },
-            "viewport"
-          ),
-        ];
-        return head;
-      }
-      function onlyReactElement(list, child) {
-        // React children can be "string" or "number" in this case we ignore them for backwards compat
-        if (typeof child === "string" || typeof child === "number") {
-          return list;
-        }
-        // Adds support for React.Fragment
-        if (child.type === _react.default.Fragment) {
-          return list.concat(
-            _react.default.Children.toArray(child.props.children).reduce(
-              (fragmentList, fragmentChild) => {
-                if (
-                  typeof fragmentChild === "string" ||
-                  typeof fragmentChild === "number"
-                ) {
-                  return fragmentList;
-                }
-                return fragmentList.concat(fragmentChild);
-              },
-              []
-            )
+              value: "E871",
+              enumerable: false,
+              configurable: true,
+            }
           );
         }
-        return list.concat(child);
-      }
-      const METATYPES = ["name", "httpEquiv", "charSet", "itemProp"];
-      /*
- returns a function for filtering head child elements
- which shouldn't be duplicated, like <title/>
- Also adds support for deduplicated `key` properties
-*/ function unique() {
-        const keys = new Set();
-        const tags = new Set();
-        const metaTypes = new Set();
-        const metaCategories = {};
-        return (h) => {
-          let isUnique = true;
-          let hasKey = false;
-          if (h.key && typeof h.key !== "number" && h.key.indexOf("$") > 0) {
-            hasKey = true;
-            const key = h.key.slice(h.key.indexOf("$") + 1);
-            if (keys.has(key)) {
-              isUnique = false;
-            } else {
-              keys.add(key);
-            }
-          }
-          // eslint-disable-next-line default-case
-          switch (h.type) {
-            case "title":
-            case "base":
-              if (tags.has(h.type)) {
-                isUnique = false;
-              } else {
-                tags.add(h.type);
-              }
-              break;
-            case "meta":
-              for (let i = 0, len = METATYPES.length; i < len; i++) {
-                const metatype = METATYPES[i];
-                if (!h.props.hasOwnProperty(metatype)) continue;
-                if (metatype === "charSet") {
-                  if (metaTypes.has(metatype)) {
-                    isUnique = false;
-                  } else {
-                    metaTypes.add(metatype);
-                  }
-                } else {
-                  const category = h.props[metatype];
-                  const categories = metaCategories[metatype] || new Set();
-                  if (
-                    (metatype !== "name" || !hasKey) &&
-                    categories.has(category)
-                  ) {
-                    isUnique = false;
-                  } else {
-                    categories.add(category);
-                    metaCategories[metatype] = categories;
-                  }
-                }
-              }
-              break;
-          }
-          return isUnique;
-        };
-      }
-      /**
-       *
-       * @param headChildrenElements List of children of <Head>
-       */ function reduceComponents(headChildrenElements) {
-        return headChildrenElements
-          .reduce(onlyReactElement, [])
-          .reverse()
-          .concat(defaultHead().reverse())
-          .filter(unique())
-          .reverse()
-          .map((c, i) => {
-            const key = c.key || i;
-            if (false) {
-            }
-            return /*#__PURE__*/ _react.default.cloneElement(c, {
-              key,
-            });
-          });
-      }
-      /**
-       * This component injects elements to `<head>` of your page.
-       * To avoid duplicated `tags` in `<head>` you can use the `key` property, which will make sure every tag is only rendered once.
-       */ function Head({ children }) {
-        const headManager = (0, _react.useContext)(
-          _headmanagercontextsharedruntime.HeadManagerContext
-        );
-        return /*#__PURE__*/ (0, _jsxruntime.jsx)(_sideeffect.default, {
-          reduceComponentsToState: reduceComponents,
-          headManager: headManager,
-          children: children,
-        });
-      }
-      const _default = Head;
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=head.js.map
-
-      /***/
-    },
-
-    /***/ 1686: /***/ (__unused_webpack_module, exports) => {
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      0 && 0;
-      function _export(target, all) {
-        for (var name in all)
-          Object.defineProperty(target, name, {
-            enumerable: true,
-            get: all[name],
-          });
+        if (false) {
+        }
+        const q = (0, _findclosestquality.findClosestQuality)(quality, config);
+        return `${config.path}?url=${encodeURIComponent(
+          src
+        )}&w=${width}&q=${q}${
+          src.startsWith("/_next/static/media/") && false ? 0 : ""
+        }`;
       }
-      _export(exports, {
-        VALID_LOADERS: function () {
-          return VALID_LOADERS;
-        },
-        imageConfigDefault: function () {
-          return imageConfigDefault;
-        },
-      });
-      const VALID_LOADERS = [
-        "default",
-        "imgix",
-        "cloudinary",
-        "akamai",
-        "custom",
-      ];
-      const imageConfigDefault = {
-        deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
-        imageSizes: [32, 48, 64, 96, 128, 256, 384],
-        path: "/_next/image",
-        loader: "default",
-        loaderFile: "",
-        /**
-         * @deprecated Use `remotePatterns` instead to protect your application from malicious users.
-         */ domains: [],
-        disableStaticImages: false,
-        minimumCacheTTL: 14400,
-        formats: ["image/webp"],
-        maximumRedirects: 3,
-        dangerouslyAllowLocalIP: false,
-        dangerouslyAllowSVG: false,
-        contentSecurityPolicy: `script-src 'none'; frame-src 'none'; sandbox;`,
-        contentDispositionType: "attachment",
-        localPatterns: undefined,
-        remotePatterns: [],
-        qualities: [75],
-        unoptimized: false,
-      }; //# sourceMappingURL=image-config.js.map
+      // We use this to determine if the import is the default loader
+      // or a custom loader defined by the user in next.config.js
+      defaultLoader.__next_img_default = true;
+      const _default = defaultLoader; //# sourceMappingURL=image-loader.js.map
 
       /***/
     },
 
-    /***/ 2285: /***/ (__unused_webpack_module, exports) => {
+    /***/ 1639: /***/ (__unused_webpack_module, exports) => {
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
@@ -735,7 +599,35 @@
       /***/
     },
 
-    /***/ 2314: /***/ (__unused_webpack_module, exports) => {
+    /***/ 2896: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "ImageConfigContext", {
+        enumerable: true,
+        get: function () {
+          return ImageConfigContext;
+        },
+      });
+      const _interop_require_default = __webpack_require__(2570);
+      const _react = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(1774)
+      );
+      const _imageconfig = __webpack_require__(9712);
+      const ImageConfigContext = _react.default.createContext(
+        _imageconfig.imageConfigDefault
+      );
+      if (false) {
+      } //# sourceMappingURL=image-config-context.shared-runtime.js.map
+
+      /***/
+    },
+
+    /***/ 6924: /***/ (__unused_webpack_module, exports) => {
       /**
        * A shared function, used on both client and server, to generate a SVG blur placeholder.
        */
@@ -774,133 +666,7 @@
       /***/
     },
 
-    /***/ 2543: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "default", {
-        enumerable: true,
-        get: function () {
-          return SideEffect;
-        },
-      });
-      const _react = __webpack_require__(8879);
-      const isServer = "object" === "undefined";
-      const useClientOnlyLayoutEffect = isServer
-        ? () => {}
-        : _react.useLayoutEffect;
-      const useClientOnlyEffect = isServer ? () => {} : _react.useEffect;
-      function SideEffect(props) {
-        const { headManager, reduceComponentsToState } = props;
-        function emitChange() {
-          if (headManager && headManager.mountedInstances) {
-            const headElements = _react.Children.toArray(
-              Array.from(headManager.mountedInstances).filter(Boolean)
-            );
-            headManager.updateHead(reduceComponentsToState(headElements));
-          }
-        }
-        if (isServer) {
-          headManager?.mountedInstances?.add(props.children);
-          emitChange();
-        }
-        useClientOnlyLayoutEffect(() => {
-          headManager?.mountedInstances?.add(props.children);
-          return () => {
-            headManager?.mountedInstances?.delete(props.children);
-          };
-        });
-        // We need to call `updateHead` method whenever the `SideEffect` is trigger in all
-        // life-cycles: mount, update, unmount. However, if there are multiple `SideEffect`s
-        // being rendered, we only trigger the method from the last one.
-        // This is ensured by keeping the last unflushed `updateHead` in the `_pendingUpdate`
-        // singleton in the layout effect pass, and actually trigger it in the effect pass.
-        useClientOnlyLayoutEffect(() => {
-          if (headManager) {
-            headManager._pendingUpdate = emitChange;
-          }
-          return () => {
-            if (headManager) {
-              headManager._pendingUpdate = emitChange;
-            }
-          };
-        });
-        useClientOnlyEffect(() => {
-          if (headManager && headManager._pendingUpdate) {
-            headManager._pendingUpdate();
-            headManager._pendingUpdate = null;
-          }
-          return () => {
-            if (headManager && headManager._pendingUpdate) {
-              headManager._pendingUpdate();
-              headManager._pendingUpdate = null;
-            }
-          };
-        });
-        return null;
-      } //# sourceMappingURL=side-effect.js.map
-
-      /***/
-    },
-
-    /***/ 8035: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "default", {
-        enumerable: true,
-        get: function () {
-          return _default;
-        },
-      });
-      const _findclosestquality = __webpack_require__(2285);
-      function defaultLoader({ config, src, width, quality }) {
-        if (
-          src.startsWith("/") &&
-          src.includes("?") &&
-          config.localPatterns?.length === 1 &&
-          config.localPatterns[0].pathname === "**" &&
-          config.localPatterns[0].search === ""
-        ) {
-          throw Object.defineProperty(
-            new Error(
-              `Image with src "${src}" is using a query string which is not configured in images.localPatterns.` +
-                `\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`
-            ),
-            "__NEXT_ERROR_CODE",
-            {
-              value: "E871",
-              enumerable: false,
-              configurable: true,
-            }
-          );
-        }
-        if (false) {
-        }
-        const q = (0, _findclosestquality.findClosestQuality)(quality, config);
-        return `${config.path}?url=${encodeURIComponent(
-          src
-        )}&w=${width}&q=${q}${
-          src.startsWith("/_next/static/media/") && false ? 0 : ""
-        }`;
-      }
-      // We use this to determine if the import is the default loader
-      // or a custom loader defined by the user in next.config.js
-      defaultLoader.__next_img_default = true;
-      const _default = defaultLoader; //# sourceMappingURL=image-loader.js.map
-
-      /***/
-    },
-
-    /***/ 8848: /***/ (module, exports, __webpack_require__) => {
+    /***/ 7614: /***/ (module, exports, __webpack_require__) => {
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
@@ -910,7 +676,7 @@
           return useMergedRef;
         },
       });
-      const _react = __webpack_require__(8879);
+      const _react = __webpack_require__(1774);
       function useMergedRef(refA, refB) {
         const cleanupA = (0, _react.useRef)(null);
         const cleanupB = (0, _react.useRef)(null);
@@ -976,32 +742,7 @@
       /***/
     },
 
-    /***/ 9059: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "RouterContext", {
-        enumerable: true,
-        get: function () {
-          return RouterContext;
-        },
-      });
-      const _interop_require_default = __webpack_require__(9010);
-      const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(8879)
-      );
-      const RouterContext = _react.default.createContext(null);
-      if (false) {
-      } //# sourceMappingURL=router-context.shared-runtime.js.map
-
-      /***/
-    },
-
-    /***/ 9225: /***/ (module, exports, __webpack_require__) => {
+    /***/ 8439: /***/ (module, exports, __webpack_require__) => {
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
         value: true,
@@ -1012,27 +753,27 @@
           return Image;
         },
       });
-      const _interop_require_default = __webpack_require__(9010);
-      const _interop_require_wildcard = __webpack_require__(2275);
-      const _jsxruntime = __webpack_require__(1024);
+      const _interop_require_default = __webpack_require__(2570);
+      const _interop_require_wildcard = __webpack_require__(5643);
+      const _jsxruntime = __webpack_require__(2014);
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
-        __webpack_require__(8879)
+        __webpack_require__(1774)
       );
       const _reactdom = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(3869)
+        __webpack_require__(7499)
       );
       const _head = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(1666)
+        __webpack_require__(9452)
       );
-      const _getimgprops = __webpack_require__(1169);
-      const _imageconfig = __webpack_require__(1686);
-      const _imageconfigcontextsharedruntime = __webpack_require__(2);
-      const _warnonce = __webpack_require__(4352);
-      const _routercontextsharedruntime = __webpack_require__(9059);
+      const _getimgprops = __webpack_require__(1155);
+      const _imageconfig = __webpack_require__(9712);
+      const _imageconfigcontextsharedruntime = __webpack_require__(2896);
+      const _warnonce = __webpack_require__(5358);
+      const _routercontextsharedruntime = __webpack_require__(9813);
       const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(8035)
+        __webpack_require__(1417)
       );
-      const _usemergedref = __webpack_require__(8848);
+      const _usemergedref = __webpack_require__(7614);
       // This is replaced by webpack define plugin
       const configEnv = {
         deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
@@ -1358,5 +1099,268 @@
 
       /***/
     },
+
+    /***/ 9452: /***/ (module, exports, __webpack_require__) => {
+      /* __next_internal_client_entry_do_not_use__  cjs */
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      0 && 0;
+      function _export(target, all) {
+        for (var name in all)
+          Object.defineProperty(target, name, {
+            enumerable: true,
+            get: all[name],
+          });
+      }
+      _export(exports, {
+        default: function () {
+          return _default;
+        },
+        defaultHead: function () {
+          return defaultHead;
+        },
+      });
+      const _interop_require_default = __webpack_require__(2570);
+      const _interop_require_wildcard = __webpack_require__(5643);
+      const _jsxruntime = __webpack_require__(2014);
+      const _react = /*#__PURE__*/ _interop_require_wildcard._(
+        __webpack_require__(1774)
+      );
+      const _sideeffect = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(405)
+      );
+      const _headmanagercontextsharedruntime = __webpack_require__(5326);
+      const _warnonce = __webpack_require__(5358);
+      function defaultHead() {
+        const head = [
+          /*#__PURE__*/ (0, _jsxruntime.jsx)(
+            "meta",
+            {
+              charSet: "utf-8",
+            },
+            "charset"
+          ),
+          /*#__PURE__*/ (0, _jsxruntime.jsx)(
+            "meta",
+            {
+              name: "viewport",
+              content: "width=device-width",
+            },
+            "viewport"
+          ),
+        ];
+        return head;
+      }
+      function onlyReactElement(list, child) {
+        // React children can be "string" or "number" in this case we ignore them for backwards compat
+        if (typeof child === "string" || typeof child === "number") {
+          return list;
+        }
+        // Adds support for React.Fragment
+        if (child.type === _react.default.Fragment) {
+          return list.concat(
+            _react.default.Children.toArray(child.props.children).reduce(
+              (fragmentList, fragmentChild) => {
+                if (
+                  typeof fragmentChild === "string" ||
+                  typeof fragmentChild === "number"
+                ) {
+                  return fragmentList;
+                }
+                return fragmentList.concat(fragmentChild);
+              },
+              []
+            )
+          );
+        }
+        return list.concat(child);
+      }
+      const METATYPES = ["name", "httpEquiv", "charSet", "itemProp"];
+      /*
+ returns a function for filtering head child elements
+ which shouldn't be duplicated, like <title/>
+ Also adds support for deduplicated `key` properties
+*/ function unique() {
+        const keys = new Set();
+        const tags = new Set();
+        const metaTypes = new Set();
+        const metaCategories = {};
+        return (h) => {
+          let isUnique = true;
+          let hasKey = false;
+          if (h.key && typeof h.key !== "number" && h.key.indexOf("$") > 0) {
+            hasKey = true;
+            const key = h.key.slice(h.key.indexOf("$") + 1);
+            if (keys.has(key)) {
+              isUnique = false;
+            } else {
+              keys.add(key);
+            }
+          }
+          // eslint-disable-next-line default-case
+          switch (h.type) {
+            case "title":
+            case "base":
+              if (tags.has(h.type)) {
+                isUnique = false;
+              } else {
+                tags.add(h.type);
+              }
+              break;
+            case "meta":
+              for (let i = 0, len = METATYPES.length; i < len; i++) {
+                const metatype = METATYPES[i];
+                if (!h.props.hasOwnProperty(metatype)) continue;
+                if (metatype === "charSet") {
+                  if (metaTypes.has(metatype)) {
+                    isUnique = false;
+                  } else {
+                    metaTypes.add(metatype);
+                  }
+                } else {
+                  const category = h.props[metatype];
+                  const categories = metaCategories[metatype] || new Set();
+                  if (
+                    (metatype !== "name" || !hasKey) &&
+                    categories.has(category)
+                  ) {
+                    isUnique = false;
+                  } else {
+                    categories.add(category);
+                    metaCategories[metatype] = categories;
+                  }
+                }
+              }
+              break;
+          }
+          return isUnique;
+        };
+      }
+      /**
+       *
+       * @param headChildrenElements List of children of <Head>
+       */ function reduceComponents(headChildrenElements) {
+        return headChildrenElements
+          .reduce(onlyReactElement, [])
+          .reverse()
+          .concat(defaultHead().reverse())
+          .filter(unique())
+          .reverse()
+          .map((c, i) => {
+            const key = c.key || i;
+            if (false) {
+            }
+            return /*#__PURE__*/ _react.default.cloneElement(c, {
+              key,
+            });
+          });
+      }
+      /**
+       * This component injects elements to `<head>` of your page.
+       * To avoid duplicated `tags` in `<head>` you can use the `key` property, which will make sure every tag is only rendered once.
+       */ function Head({ children }) {
+        const headManager = (0, _react.useContext)(
+          _headmanagercontextsharedruntime.HeadManagerContext
+        );
+        return /*#__PURE__*/ (0, _jsxruntime.jsx)(_sideeffect.default, {
+          reduceComponentsToState: reduceComponents,
+          headManager: headManager,
+          children: children,
+        });
+      }
+      const _default = Head;
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=head.js.map
+
+      /***/
+    },
+
+    /***/ 9712: /***/ (__unused_webpack_module, exports) => {
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      0 && 0;
+      function _export(target, all) {
+        for (var name in all)
+          Object.defineProperty(target, name, {
+            enumerable: true,
+            get: all[name],
+          });
+      }
+      _export(exports, {
+        VALID_LOADERS: function () {
+          return VALID_LOADERS;
+        },
+        imageConfigDefault: function () {
+          return imageConfigDefault;
+        },
+      });
+      const VALID_LOADERS = [
+        "default",
+        "imgix",
+        "cloudinary",
+        "akamai",
+        "custom",
+      ];
+      const imageConfigDefault = {
+        deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
+        imageSizes: [32, 48, 64, 96, 128, 256, 384],
+        path: "/_next/image",
+        loader: "default",
+        loaderFile: "",
+        /**
+         * @deprecated Use `remotePatterns` instead to protect your application from malicious users.
+         */ domains: [],
+        disableStaticImages: false,
+        minimumCacheTTL: 14400,
+        formats: ["image/webp"],
+        maximumRedirects: 3,
+        dangerouslyAllowLocalIP: false,
+        dangerouslyAllowSVG: false,
+        contentSecurityPolicy: `script-src 'none'; frame-src 'none'; sandbox;`,
+        contentDispositionType: "attachment",
+        localPatterns: undefined,
+        remotePatterns: [],
+        qualities: [75],
+        unoptimized: false,
+      }; //# sourceMappingURL=image-config.js.map
+
+      /***/
+    },
+
+    /***/ 9813: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "RouterContext", {
+        enumerable: true,
+        get: function () {
+          return RouterContext;
+        },
+      });
+      const _interop_require_default = __webpack_require__(2570);
+      const _react = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(1774)
+      );
+      const RouterContext = _react.default.createContext(null);
+      if (false) {
+      } //# sourceMappingURL=router-context.shared-runtime.js.map
+
+      /***/
+    },
   },
 ]);
Diff for main-HASH.js

Diff too large to display

Diff for pages-api-tu..time.prod.js

Diff too large to display

Diff for pages-turbo...time.prod.js

Diff too large to display

Diff for server.runtime.prod.js

Diff too large to display

Commit: a4fa113

@ijjk
Copy link
Member

ijjk commented Oct 21, 2025

Failing test suites

Commit: a4fa113 | About building and testing Next.js

pnpm test-start test/e2e/app-dir/server-source-maps/server-source-maps.test.ts

  • app-dir - server source maps > logged errors have a sourcemapped stack with a codeframe (DD)
  • app-dir - server source maps > stack frames are ignore-listed in rsc (DD)
  • app-dir - server source maps > sourcemaps errors during module evaluation (DD)
Expand output

● app-dir - server source maps › logged errors have a sourcemapped stack with a codeframe

expect(received).toContain(expected) // indexOf

Expected substring: "(../app/rsc-error-log/page.js:4:17)"
Received string:    "   ▲ Next.js 16.0.1-canary.1 (Turbopack, Cache Components)
   - Experiments (use with caution):
     · cpus: 1
     ✓ serverSourceMaps·
   Creating an optimized production build ...
 ✓ Compiled successfully in 1920.4ms
   Running TypeScript ...
   Collecting page data ...
   Generating static pages (0/12) ...
Error: bad-sourcemap

  at <mangled> (../app/bad-sourcemap/custom:/[badhost]/app/bad-sourcemap/page.js:6:17)
      at stringify (<anonymous>)·
  Error: rsc-error-log-cause
  at <mangled> (../app/rsc-error-log-cause/page.js:2:17)
      at stringify (<anonymous>)
    1 | function logError(cause) {
  > 2 |   const error = new Error('rsc-error-log-cause', { cause })
      |                 ^
    3 |   console.error(error)
    4 | }
    5 | {
    [cause]: Error: Boom
  at <mangled> (../app/rsc-error-log-cause/page.js:7:17)
        at stringify (<anonymous>)
       5 |
       6 | export default function Page() {
    >  7 |   const error = new Error('Boom')
         |                 ^
       8 |   logError(error)
       9 |   return null
      10 | }
  }
  Error: module-evaluation
  at module evaluation (../app/module-evaluation/module.js:1:22)
  > 1 | export const error = new Error('module-evaluation')
      |                      ^
    2 |
  Error: rsc-error-log-custom-name-Foo
  at <mangled> (../app/rsc-error-log-custom-name/page.js:7:17)
      at stringify (<anonymous>)
     5 |
     6 | export default function Page() {
  >  7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
       |                 ^
     8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
     9 |   return null
    10 | }
  Error [MyError]: rsc-error-log-custom-name-Bar
  at <mangled> (../app/rsc-error-log-custom-name/page.js:8:17)
      at stringify (<anonymous>)
     6 | export default function Page() {
     7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
  >  8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
       |                 ^
     9 |   return null
    10 | }
    11 |
  Error: rsc-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:5:3)
      at stringify (<anonymous>)
    3 |
    4 | export default function Page() {
  > 5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
      |   ^
    6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
    7 |
    8 |   return null
  Error: rsc-anonymous-stack-frame-sandwich: internal
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:6:3)
      at stringify (<anonymous>)
    4 | export default function Page() {
    5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
  > 6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
      |   ^
    7 |
    8 |   return null
    9 | }
  Error: rsc-error-log-ignore-listed
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:8:17)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:17:11)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:16:9)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:15:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:14:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/rsc-error-log-ignore-listed/page.js:13:3)
      at stringify (<anonymous>)
     6 |
     7 | function logError() {
  >  8 |   const error = new Error('rsc-error-log-ignore-listed')
       |                 ^
     9 |   console.error(error)
    10 | }
    11 |
  Error: bad-sourcemap
  at <mangled> (../app/bad-sourcemap/custom:/[badhost]/app/bad-sourcemap/page.js:6:17)
      at stringify (<anonymous>)·
  Error: rsc-error-log-cause
  at <mangled> (../app/rsc-error-log-cause/page.js:2:17)
      at stringify (<anonymous>)
    1 | function logError(cause) {
  > 2 |   const error = new Error('rsc-error-log-cause', { cause })
      |                 ^
    3 |   console.error(error)
    4 | }
    5 | {
    [cause]: Error: Boom
  at <mangled> (../app/rsc-error-log-cause/page.js:7:17)
        at stringify (<anonymous>)
       5 |
       6 | export default function Page() {
    >  7 |   const error = new Error('Boom')
         |                 ^
       8 |   logError(error)
       9 |   return null
      10 | }
  }
  Error: module-evaluation
  at module evaluation (../app/module-evaluation/module.js:1:22)
  > 1 | export const error = new Error('module-evaluation')
      |                      ^
    2 |
  Error: rsc-error-log-custom-name-Foo
  at <mangled> (../app/rsc-error-log-custom-name/page.js:7:17)
      at stringify (<anonymous>)
     5 |
     6 | export default function Page() {
  >  7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
       |                 ^
     8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
     9 |   return null
    10 | }
  Error [MyError]: rsc-error-log-custom-name-Bar
  at <mangled> (../app/rsc-error-log-custom-name/page.js:8:17)
      at stringify (<anonymous>)
     6 | export default function Page() {
     7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
  >  8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
       |                 ^
     9 |   return null
    10 | }
    11 |
  Error: rsc-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:5:3)
      at stringify (<anonymous>)
    3 |
    4 | export default function Page() {
  > 5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
      |   ^
    6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
    7 |
    8 |   return null
  Error: rsc-anonymous-stack-frame-sandwich: internal
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:6:3)
      at stringify (<anonymous>)
    4 | export default function Page() {
    5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
  > 6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
      |   ^
    7 |
    8 |   return null
    9 | }
  Error: rsc-error-log-ignore-listed
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:8:17)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:17:11)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:16:9)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:15:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:14:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/rsc-error-log-ignore-listed/page.js:13:3)
      at stringify (<anonymous>)
     6 |
     7 | function logError() {
  >  8 |   const error = new Error('rsc-error-log-ignore-listed')
       |                 ^
     9 |   console.error(error)
    10 | }
    11 |
     Generating static pages (3/12)··
     Generating static pages (6/12)··
  Error: rsc-error-log
  at <mangled> (../app/rsc-error-log/page.js:4:17)
      at stringify (<anonymous>)
    2 |
    3 | function logError() {
  > 4 |   const error = new Error('rsc-error-log')
      |                 ^
    5 |   console.error(error)
    6 | }
    7 |
  Error: ssr-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:6:3)
    4 |
    5 | export default function Page() {
  > 6 |   runHiddenSetOfSetsExternal('ssr-anonymous-stack-frame-sandwich: external')
      |   ^
    7 |   runHiddenSetOfSetsInternal('ssr-anonymous-stack-frame-sandwich: internal')
    8 |
    9 |   return null
  Error: ignore-listed frames
  at <unknown> (../internal-pkg/sourcemapped.ts:18:43)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:22)
      at Set.forEach (<anonymous>)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:9)
      at Set.forEach (<anonymous>)
  at <mangled> (../internal-pkg/sourcemapped.ts:9:13)
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:7:3)·
  Error: ssr-error-log-ignore-listed
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:9:17)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:18:11)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:17:9)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:16:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:15:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/ssr-error-log-ignore-listed/page.js:14:3)
     7 |
     8 | function logError() {
  >  9 |   const error = new Error('ssr-error-log-ignore-listed')
       |                 ^
    10 |   console.error(error)
    11 | }
    12 |
  Error: rsc-error-log
  at <mangled> (../app/rsc-error-log/page.js:4:17)
      at stringify (<anonymous>)
    2 |
    3 | function logError() {
  > 4 |   const error = new Error('rsc-error-log')
      |                 ^
    5 |   console.error(error)
    6 | }
    7 |
  Error: ssr-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:6:3)
    4 |
    5 | export default function Page() {
  > 6 |   runHiddenSetOfSetsExternal('ssr-anonymous-stack-frame-sandwich: external')
      |   ^
    7 |   runHiddenSetOfSetsInternal('ssr-anonymous-stack-frame-sandwich: internal')
    8 |
    9 |   return null
  Error: ignore-listed frames
  at <unknown> (../internal-pkg/sourcemapped.ts:18:43)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:22)
      at Set.forEach (<anonymous>)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:9)
      at Set.forEach (<anonymous>)
  at <mangled> (../internal-pkg/sourcemapped.ts:9:13)
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:7:3)·
  Error: ssr-error-log-ignore-listed
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:9:17)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:18:11)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:17:9)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:16:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:15:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/ssr-error-log-ignore-listed/page.js:14:3)
     7 |
     8 | function logError() {
  >  9 |   const error = new Error('ssr-error-log-ignore-listed')
       |                 ^
    10 |   console.error(error)
    11 | }
    12 |
     Generating static pages (9/12)··
   ✓ Generating static pages (12/12) in 4.0s
     Finalizing page optimization ...·
  Route (app)
  ┌ ○ /_not-found
  ├ ○ /bad-sourcemap
  ├ ○ /module-evaluation
  ├ ○ /rsc-anonymous-stack-frame-sandwich
  ├ ○ /rsc-error-log
  ├ ○ /rsc-error-log-cause
  ├ ○ /rsc-error-log-custom-name
  ├ ○ /rsc-error-log-ignore-listed
  ├ ○ /ssr-anonymous-stack-frame-sandwich
  ├ ○ /ssr-error-log-ignore-listed
  └ ◐ /ssr-throw··
  ○  (Static)             prerendered as static content
  ◐  (Partial Prerender)  prerendered as static HTML with dynamic server-streamed content·
     ▲ Next.js 16.0.1-canary.1
     - Local:        http://localhost:43433
     - Network:      http://65.109.106.250:43433·
   ✓ Starting...
   ✓ Ready in 150ms
  "
  at Object.toContain (e2e/app-dir/server-source-maps/server-source-maps.test.ts:59:52)

● app-dir - server source maps › stack frames are ignore-listed in rsc

expect(received).toContain(expected) // indexOf

Expected substring: "at <unknown> (../app/rsc-error-log-ignore-listed/page.js:8:17)"
Received string:    "   ▲ Next.js 16.0.1-canary.1 (Turbopack, Cache Components)
   - Experiments (use with caution):
     · cpus: 1
     ✓ serverSourceMaps·
   Creating an optimized production build ...
 ✓ Compiled successfully in 1920.4ms
   Running TypeScript ...
   Collecting page data ...
   Generating static pages (0/12) ...
Error: bad-sourcemap

  at <mangled> (../app/bad-sourcemap/custom:/[badhost]/app/bad-sourcemap/page.js:6:17)
      at stringify (<anonymous>)·
  Error: rsc-error-log-cause
  at <mangled> (../app/rsc-error-log-cause/page.js:2:17)
      at stringify (<anonymous>)
    1 | function logError(cause) {
  > 2 |   const error = new Error('rsc-error-log-cause', { cause })
      |                 ^
    3 |   console.error(error)
    4 | }
    5 | {
    [cause]: Error: Boom
  at <mangled> (../app/rsc-error-log-cause/page.js:7:17)
        at stringify (<anonymous>)
       5 |
       6 | export default function Page() {
    >  7 |   const error = new Error('Boom')
         |                 ^
       8 |   logError(error)
       9 |   return null
      10 | }
  }
  Error: module-evaluation
  at module evaluation (../app/module-evaluation/module.js:1:22)
  > 1 | export const error = new Error('module-evaluation')
      |                      ^
    2 |
  Error: rsc-error-log-custom-name-Foo
  at <mangled> (../app/rsc-error-log-custom-name/page.js:7:17)
      at stringify (<anonymous>)
     5 |
     6 | export default function Page() {
  >  7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
       |                 ^
     8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
     9 |   return null
    10 | }
  Error [MyError]: rsc-error-log-custom-name-Bar
  at <mangled> (../app/rsc-error-log-custom-name/page.js:8:17)
      at stringify (<anonymous>)
     6 | export default function Page() {
     7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
  >  8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
       |                 ^
     9 |   return null
    10 | }
    11 |
  Error: rsc-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:5:3)
      at stringify (<anonymous>)
    3 |
    4 | export default function Page() {
  > 5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
      |   ^
    6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
    7 |
    8 |   return null
  Error: rsc-anonymous-stack-frame-sandwich: internal
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:6:3)
      at stringify (<anonymous>)
    4 | export default function Page() {
    5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
  > 6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
      |   ^
    7 |
    8 |   return null
    9 | }
  Error: rsc-error-log-ignore-listed
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:8:17)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:17:11)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:16:9)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:15:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:14:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/rsc-error-log-ignore-listed/page.js:13:3)
      at stringify (<anonymous>)
     6 |
     7 | function logError() {
  >  8 |   const error = new Error('rsc-error-log-ignore-listed')
       |                 ^
     9 |   console.error(error)
    10 | }
    11 |
  Error: bad-sourcemap
  at <mangled> (../app/bad-sourcemap/custom:/[badhost]/app/bad-sourcemap/page.js:6:17)
      at stringify (<anonymous>)·
  Error: rsc-error-log-cause
  at <mangled> (../app/rsc-error-log-cause/page.js:2:17)
      at stringify (<anonymous>)
    1 | function logError(cause) {
  > 2 |   const error = new Error('rsc-error-log-cause', { cause })
      |                 ^
    3 |   console.error(error)
    4 | }
    5 | {
    [cause]: Error: Boom
  at <mangled> (../app/rsc-error-log-cause/page.js:7:17)
        at stringify (<anonymous>)
       5 |
       6 | export default function Page() {
    >  7 |   const error = new Error('Boom')
         |                 ^
       8 |   logError(error)
       9 |   return null
      10 | }
  }
  Error: module-evaluation
  at module evaluation (../app/module-evaluation/module.js:1:22)
  > 1 | export const error = new Error('module-evaluation')
      |                      ^
    2 |
  Error: rsc-error-log-custom-name-Foo
  at <mangled> (../app/rsc-error-log-custom-name/page.js:7:17)
      at stringify (<anonymous>)
     5 |
     6 | export default function Page() {
  >  7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
       |                 ^
     8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
     9 |   return null
    10 | }
  Error [MyError]: rsc-error-log-custom-name-Bar
  at <mangled> (../app/rsc-error-log-custom-name/page.js:8:17)
      at stringify (<anonymous>)
     6 | export default function Page() {
     7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
  >  8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
       |                 ^
     9 |   return null
    10 | }
    11 |
  Error: rsc-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:5:3)
      at stringify (<anonymous>)
    3 |
    4 | export default function Page() {
  > 5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
      |   ^
    6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
    7 |
    8 |   return null
  Error: rsc-anonymous-stack-frame-sandwich: internal
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:6:3)
      at stringify (<anonymous>)
    4 | export default function Page() {
    5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
  > 6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
      |   ^
    7 |
    8 |   return null
    9 | }
  Error: rsc-error-log-ignore-listed
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:8:17)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:17:11)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:16:9)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:15:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:14:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/rsc-error-log-ignore-listed/page.js:13:3)
      at stringify (<anonymous>)
     6 |
     7 | function logError() {
  >  8 |   const error = new Error('rsc-error-log-ignore-listed')
       |                 ^
     9 |   console.error(error)
    10 | }
    11 |
     Generating static pages (3/12)··
     Generating static pages (6/12)··
  Error: rsc-error-log
  at <mangled> (../app/rsc-error-log/page.js:4:17)
      at stringify (<anonymous>)
    2 |
    3 | function logError() {
  > 4 |   const error = new Error('rsc-error-log')
      |                 ^
    5 |   console.error(error)
    6 | }
    7 |
  Error: ssr-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:6:3)
    4 |
    5 | export default function Page() {
  > 6 |   runHiddenSetOfSetsExternal('ssr-anonymous-stack-frame-sandwich: external')
      |   ^
    7 |   runHiddenSetOfSetsInternal('ssr-anonymous-stack-frame-sandwich: internal')
    8 |
    9 |   return null
  Error: ignore-listed frames
  at <unknown> (../internal-pkg/sourcemapped.ts:18:43)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:22)
      at Set.forEach (<anonymous>)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:9)
      at Set.forEach (<anonymous>)
  at <mangled> (../internal-pkg/sourcemapped.ts:9:13)
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:7:3)·
  Error: ssr-error-log-ignore-listed
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:9:17)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:18:11)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:17:9)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:16:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:15:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/ssr-error-log-ignore-listed/page.js:14:3)
     7 |
     8 | function logError() {
  >  9 |   const error = new Error('ssr-error-log-ignore-listed')
       |                 ^
    10 |   console.error(error)
    11 | }
    12 |
  Error: rsc-error-log
  at <mangled> (../app/rsc-error-log/page.js:4:17)
      at stringify (<anonymous>)
    2 |
    3 | function logError() {
  > 4 |   const error = new Error('rsc-error-log')
      |                 ^
    5 |   console.error(error)
    6 | }
    7 |
  Error: ssr-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:6:3)
    4 |
    5 | export default function Page() {
  > 6 |   runHiddenSetOfSetsExternal('ssr-anonymous-stack-frame-sandwich: external')
      |   ^
    7 |   runHiddenSetOfSetsInternal('ssr-anonymous-stack-frame-sandwich: internal')
    8 |
    9 |   return null
  Error: ignore-listed frames
  at <unknown> (../internal-pkg/sourcemapped.ts:18:43)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:22)
      at Set.forEach (<anonymous>)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:9)
      at Set.forEach (<anonymous>)
  at <mangled> (../internal-pkg/sourcemapped.ts:9:13)
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:7:3)·
  Error: ssr-error-log-ignore-listed
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:9:17)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:18:11)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:17:9)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:16:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:15:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/ssr-error-log-ignore-listed/page.js:14:3)
     7 |
     8 | function logError() {
  >  9 |   const error = new Error('ssr-error-log-ignore-listed')
       |                 ^
    10 |   console.error(error)
    11 | }
    12 |
     Generating static pages (9/12)··
   ✓ Generating static pages (12/12) in 4.0s
     Finalizing page optimization ...·
  Route (app)
  ┌ ○ /_not-found
  ├ ○ /bad-sourcemap
  ├ ○ /module-evaluation
  ├ ○ /rsc-anonymous-stack-frame-sandwich
  ├ ○ /rsc-error-log
  ├ ○ /rsc-error-log-cause
  ├ ○ /rsc-error-log-custom-name
  ├ ○ /rsc-error-log-ignore-listed
  ├ ○ /ssr-anonymous-stack-frame-sandwich
  ├ ○ /ssr-error-log-ignore-listed
  └ ◐ /ssr-throw··
  ○  (Static)             prerendered as static content
  ◐  (Partial Prerender)  prerendered as static HTML with dynamic server-streamed content·
     ▲ Next.js 16.0.1-canary.1
     - Local:        http://localhost:43433
     - Network:      http://65.109.106.250:43433·
   ✓ Starting...
   ✓ Ready in 150ms
  "
  at Object.toContain (e2e/app-dir/server-source-maps/server-source-maps.test.ts:297:52)

● app-dir - server source maps › sourcemaps errors during module evaluation

expect(received).toContain(expected) // indexOf

Expected substring: "
Error: module-evaluation

  at module evaluation (../../app/module-evaluation/module.js:1:22)"
  Received string:    "   ▲ Next.js 16.0.1-canary.1 (Turbopack, Cache Components)
     - Experiments (use with caution):
       · cpus: 1
       ✓ serverSourceMaps·
     Creating an optimized production build ...
   ✓ Compiled successfully in 1920.4ms
     Running TypeScript ...
     Collecting page data ...
     Generating static pages (0/12) ...
  Error: bad-sourcemap
  at <mangled> (../app/bad-sourcemap/custom:/[badhost]/app/bad-sourcemap/page.js:6:17)
      at stringify (<anonymous>)·
  Error: rsc-error-log-cause
  at <mangled> (../app/rsc-error-log-cause/page.js:2:17)
      at stringify (<anonymous>)
    1 | function logError(cause) {
  > 2 |   const error = new Error('rsc-error-log-cause', { cause })
      |                 ^
    3 |   console.error(error)
    4 | }
    5 | {
    [cause]: Error: Boom
  at <mangled> (../app/rsc-error-log-cause/page.js:7:17)
        at stringify (<anonymous>)
       5 |
       6 | export default function Page() {
    >  7 |   const error = new Error('Boom')
         |                 ^
       8 |   logError(error)
       9 |   return null
      10 | }
  }
  Error: module-evaluation
  at module evaluation (../app/module-evaluation/module.js:1:22)
  > 1 | export const error = new Error('module-evaluation')
      |                      ^
    2 |
  Error: rsc-error-log-custom-name-Foo
  at <mangled> (../app/rsc-error-log-custom-name/page.js:7:17)
      at stringify (<anonymous>)
     5 |
     6 | export default function Page() {
  >  7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
       |                 ^
     8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
     9 |   return null
    10 | }
  Error [MyError]: rsc-error-log-custom-name-Bar
  at <mangled> (../app/rsc-error-log-custom-name/page.js:8:17)
      at stringify (<anonymous>)
     6 | export default function Page() {
     7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
  >  8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
       |                 ^
     9 |   return null
    10 | }
    11 |
  Error: rsc-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:5:3)
      at stringify (<anonymous>)
    3 |
    4 | export default function Page() {
  > 5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
      |   ^
    6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
    7 |
    8 |   return null
  Error: rsc-anonymous-stack-frame-sandwich: internal
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:6:3)
      at stringify (<anonymous>)
    4 | export default function Page() {
    5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
  > 6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
      |   ^
    7 |
    8 |   return null
    9 | }
  Error: rsc-error-log-ignore-listed
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:8:17)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:17:11)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:16:9)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:15:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:14:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/rsc-error-log-ignore-listed/page.js:13:3)
      at stringify (<anonymous>)
     6 |
     7 | function logError() {
  >  8 |   const error = new Error('rsc-error-log-ignore-listed')
       |                 ^
     9 |   console.error(error)
    10 | }
    11 |
  Error: bad-sourcemap
  at <mangled> (../app/bad-sourcemap/custom:/[badhost]/app/bad-sourcemap/page.js:6:17)
      at stringify (<anonymous>)·
  Error: rsc-error-log-cause
  at <mangled> (../app/rsc-error-log-cause/page.js:2:17)
      at stringify (<anonymous>)
    1 | function logError(cause) {
  > 2 |   const error = new Error('rsc-error-log-cause', { cause })
      |                 ^
    3 |   console.error(error)
    4 | }
    5 | {
    [cause]: Error: Boom
  at <mangled> (../app/rsc-error-log-cause/page.js:7:17)
        at stringify (<anonymous>)
       5 |
       6 | export default function Page() {
    >  7 |   const error = new Error('Boom')
         |                 ^
       8 |   logError(error)
       9 |   return null
      10 | }
  }
  Error: module-evaluation
  at module evaluation (../app/module-evaluation/module.js:1:22)
  > 1 | export const error = new Error('module-evaluation')
      |                      ^
    2 |
  Error: rsc-error-log-custom-name-Foo
  at <mangled> (../app/rsc-error-log-custom-name/page.js:7:17)
      at stringify (<anonymous>)
     5 |
     6 | export default function Page() {
  >  7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
       |                 ^
     8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
     9 |   return null
    10 | }
  Error [MyError]: rsc-error-log-custom-name-Bar
  at <mangled> (../app/rsc-error-log-custom-name/page.js:8:17)
      at stringify (<anonymous>)
     6 | export default function Page() {
     7 |   console.error(new UnnamedError('rsc-error-log-custom-name-Foo'))
  >  8 |   console.error(new NamedError('rsc-error-log-custom-name-Bar'))
       |                 ^
     9 |   return null
    10 | }
    11 |
  Error: rsc-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:5:3)
      at stringify (<anonymous>)
    3 |
    4 | export default function Page() {
  > 5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
      |   ^
    6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
    7 |
    8 |   return null
  Error: rsc-anonymous-stack-frame-sandwich: internal
  at <mangled> (../app/rsc-anonymous-stack-frame-sandwich/page.js:6:3)
      at stringify (<anonymous>)
    4 | export default function Page() {
    5 |   runHiddenSetOfSetsExternal('rsc-anonymous-stack-frame-sandwich: external')
  > 6 |   runHiddenSetOfSetsInternal('rsc-anonymous-stack-frame-sandwich: internal')
      |   ^
    7 |
    8 |   return null
    9 | }
  Error: rsc-error-log-ignore-listed
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:8:17)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:17:11)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:16:9)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:15:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/rsc-error-log-ignore-listed/page.js:14:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/rsc-error-log-ignore-listed/page.js:13:3)
      at stringify (<anonymous>)
     6 |
     7 | function logError() {
  >  8 |   const error = new Error('rsc-error-log-ignore-listed')
       |                 ^
     9 |   console.error(error)
    10 | }
    11 |
     Generating static pages (3/12)··
     Generating static pages (6/12)··
  Error: rsc-error-log
  at <mangled> (../app/rsc-error-log/page.js:4:17)
      at stringify (<anonymous>)
    2 |
    3 | function logError() {
  > 4 |   const error = new Error('rsc-error-log')
      |                 ^
    5 |   console.error(error)
    6 | }
    7 |
  Error: ssr-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:6:3)
    4 |
    5 | export default function Page() {
  > 6 |   runHiddenSetOfSetsExternal('ssr-anonymous-stack-frame-sandwich: external')
      |   ^
    7 |   runHiddenSetOfSetsInternal('ssr-anonymous-stack-frame-sandwich: internal')
    8 |
    9 |   return null
  Error: ignore-listed frames
  at <unknown> (../internal-pkg/sourcemapped.ts:18:43)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:22)
      at Set.forEach (<anonymous>)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:9)
      at Set.forEach (<anonymous>)
  at <mangled> (../internal-pkg/sourcemapped.ts:9:13)
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:7:3)·
  Error: ssr-error-log-ignore-listed
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:9:17)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:18:11)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:17:9)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:16:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:15:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/ssr-error-log-ignore-listed/page.js:14:3)
     7 |
     8 | function logError() {
  >  9 |   const error = new Error('ssr-error-log-ignore-listed')
       |                 ^
    10 |   console.error(error)
    11 | }
    12 |
  Error: rsc-error-log
  at <mangled> (../app/rsc-error-log/page.js:4:17)
      at stringify (<anonymous>)
    2 |
    3 | function logError() {
  > 4 |   const error = new Error('rsc-error-log')
      |                 ^
    5 |   console.error(error)
    6 | }
    7 |
  Error: ssr-anonymous-stack-frame-sandwich: external
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:6:3)
    4 |
    5 | export default function Page() {
  > 6 |   runHiddenSetOfSetsExternal('ssr-anonymous-stack-frame-sandwich: external')
      |   ^
    7 |   runHiddenSetOfSetsInternal('ssr-anonymous-stack-frame-sandwich: internal')
    8 |
    9 |   return null
  Error: ignore-listed frames
  at <unknown> (../internal-pkg/sourcemapped.ts:18:43)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:22)
      at Set.forEach (<anonymous>)
  at <unknown> (../internal-pkg/sourcemapped.ts:10:9)
      at Set.forEach (<anonymous>)
  at <mangled> (../internal-pkg/sourcemapped.ts:9:13)
  at <mangled> (../app/ssr-anonymous-stack-frame-sandwich/page.js:7:3)·
  Error: ssr-error-log-ignore-listed
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:9:17)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:18:11)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:17:9)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:16:7)
  at <mangled> (../internal-pkg/sourcemapped.ts:5:10)
  at <unknown> (../app/ssr-error-log-ignore-listed/page.js:15:5)
  at <mangled> (../internal-pkg/index.js:2:10)
  at <mangled> (../app/ssr-error-log-ignore-listed/page.js:14:3)
     7 |
     8 | function logError() {
  >  9 |   const error = new Error('ssr-error-log-ignore-listed')
       |                 ^
    10 |   console.error(error)
    11 | }
    12 |
     Generating static pages (9/12)··
   ✓ Generating static pages (12/12) in 4.0s
     Finalizing page optimization ...·
  Route (app)
  ┌ ○ /_not-found
  ├ ○ /bad-sourcemap
  ├ ○ /module-evaluation
  ├ ○ /rsc-anonymous-stack-frame-sandwich
  ├ ○ /rsc-error-log
  ├ ○ /rsc-error-log-cause
  ├ ○ /rsc-error-log-custom-name
  ├ ○ /rsc-error-log-ignore-listed
  ├ ○ /ssr-anonymous-stack-frame-sandwich
  ├ ○ /ssr-error-log-ignore-listed
  └ ◐ /ssr-throw··
  ○  (Static)             prerendered as static content
  ◐  (Partial Prerender)  prerendered as static HTML with dynamic server-streamed content·
     ▲ Next.js 16.0.1-canary.1
     - Local:        http://localhost:43433
     - Network:      http://65.109.106.250:43433·
   ✓ Starting...
   ✓ Ready in 150ms
  "
  at Object.toContain (e2e/app-dir/server-source-maps/server-source-maps.test.ts:527:52)

pnpm test-start test/production/app-dir/build-output-prerender/build-output-prerender.test.ts

  • build-output-prerender > with a next config file > with --debug-prerender > shows all prerender errors with readable stacks and code frames (DD)
Expand output

● build-output-prerender › with a next config file › with --debug-prerender › shows all prerender errors with readable stacks and code frames

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `build-output-prerender with a next config file with --debug-prerender shows all prerender errors with readable stacks and code frames 1`

- Snapshot  - 2
+ Received  + 2

@@ -1,17 +1,17 @@
  "Error: Route "/client" used `new Date()` inside a Client Component without a Suspense boundary above it. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time-client
-     at Page (../../../../app/client/page.tsx:4:28)
+     at Page (app/client/page.tsx:4:28)
    2 |
    3 | export default function Page() {
  > 4 |   return <p>Current time: {new Date().toISOString()}</p>
      |                            ^
    5 | }
    6 |
  To get a more detailed stack trace and pinpoint the issue, start the app in development mode by running `next dev`, then open "/client" in your browser to investigate the error.
  Error occurred prerendering page "/client". Read more: https://nextjs.org/docs/messages/prerender-error
  Error: Route "/server" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at Page (../../../../app/server/page.tsx:13:27)
+     at Page (app/server/page.tsx:13:27)
    11 |   await cachedDelay()
    12 |
  > 13 |   return <p>Random: {Math.random()}</p>
       |                           ^
    14 | }

  184 |
  185 |       it('shows all prerender errors with readable stacks and code frames', async () => {
> 186 |         expect(getPrerenderOutput(next.cliOutput)).toMatchInlineSnapshot(`
      |                                                    ^
  187 |          "Error: Route "/client" used \`new Date()\` inside a Client Component without a Suspense boundary above it. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time-client
  188 |              at Page (../../../../app/client/page.tsx:4:28)
  189 |            2 |

  at Object.toMatchInlineSnapshot (production/app-dir/build-output-prerender/build-output-prerender.test.ts:186:52)

pnpm test-start test/e2e/app-dir/cache-components-errors/cache-components-errors.test.ts

  • Cache Components Errors > Build With --prerender-debug > Dynamic Root > should error the build if cache components happens in the root (outside a Suspense) (DD)
  • Cache Components Errors > Build With --prerender-debug > Error Attribution with Sync IO > Guarded RSC with unguarded Client sync IO > should error the build with a reason related to sync IO access (DD)
  • Cache Components Errors > Build With --prerender-debug > Error Attribution with Sync IO > unguarded RSC with unguarded Client sync IO > should error the build with a reason related to sync IO access (DD)
  • Cache Components Errors > Build With --prerender-debug > Inside use cache > cookies > should error the build (DD)
  • Cache Components Errors > Build With --prerender-debug > Inside use cache > draftMode > should error the build (DD)
  • Cache Components Errors > Build With --prerender-debug > Inside use cache > headers > should error the build (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync Dynamic Platform > With Fallback - Math.random() > should error the build if Math.random() happens before some component outside a Suspense boundary is complete (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync Dynamic Platform > Without Fallback - Math.random() > should error the build if Math.random() happens before some component outside a Suspense boundary is complete (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync Dynamic Request > cookies > should error the build with a runtime error (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync Dynamic Request > headers > should error the build with a runtime error (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Current Time - Date() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Current Time - Date.now() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Current Time - new Date() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Node Crypto - generateKeyPairSync() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Node Crypto - generateKeySync() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Node Crypto - generatePrimeSync() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Node Crypto - getRandomValues() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Node Crypto - random-bytes() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Node Crypto - random-fill-sync() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Node Crypto - random-int-between() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Node Crypto - random-int-up-to() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Node Crypto - random-uuid > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Random - Math.random() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Web Crypto - getRandomValue() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > Sync IO - Web Crypto - randomUUID() > should error the build if sync IO is used in a Server Component while prerendering (DD)
  • Cache Components Errors > Build With --prerender-debug > With use cache: private > in unstable_cache > should error the build (DD)
  • Cache Components Errors > Build With --prerender-debug > With use cache: private > in use cache > should error the build (DD)
Expand output

● Cache Components Errors › Build With --prerender-debug › Dynamic Root › should error the build if cache components happens in the root (outside a Suspense)

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Dynamic Root should error the build if cache components happens in the root (outside a Suspense) 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/dynamic-root": Uncached data was accessed outside of <Suspense>. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route
-     at IndirectionTwo (../../../../app/dynamic-root/indirection.tsx:7:34)
+     at IndirectionTwo (app/dynamic-root/indirection.tsx:7:34)
      at main (<anonymous>)
      at body (<anonymous>)
      at html (<anonymous>)
     5 | }
     6 |

  701 |           if (isTurbopack) {
  702 |             if (isDebugPrerender) {
> 703 |               expect(output).toMatchInlineSnapshot(`
      |                              ^
  704 |                "Error: Route "/dynamic-root": Uncached data was accessed outside of <Suspense>. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route
  705 |                    at IndirectionTwo (../../../../app/dynamic-root/indirection.tsx:7:34)
  706 |                    at main (<anonymous>)

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:703:30)

● Cache Components Errors › Build With --prerender-debug › Sync Dynamic Platform › With Fallback - Math.random() › should error the build if Math.random() happens before some component outside a Suspense boundary is complete

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync Dynamic Platform With Fallback - Math.random() should error the build if Math.random() happens before some component outside a Suspense boundary is complete 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-random-with-fallback" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at RandomReadingComponent (../../../../app/sync-random-with-fallback/page.tsx:37:23)
+     at RandomReadingComponent (app/sync-random-with-fallback/page.tsx:37:23)
    35 |     use(new Promise((r) => process.nextTick(r)))
    36 |   }
  > 37 |   const random = Math.random()
       |                       ^
    38 |   return (

  962 |             if (isTurbopack) {
  963 |               if (isDebugPrerender) {
> 964 |                 expect(output).toMatchInlineSnapshot(`
      |                                ^
  965 |                  "Error: Route "/sync-random-with-fallback" used \`Math.random()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
  966 |                      at RandomReadingComponent (../../../../app/sync-random-with-fallback/page.tsx:37:23)
  967 |                    35 |     use(new Promise((r) => process.nextTick(r)))

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:964:32)

● Cache Components Errors › Build With --prerender-debug › Sync Dynamic Platform › Without Fallback - Math.random() › should error the build if Math.random() happens before some component outside a Suspense boundary is complete

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync Dynamic Platform Without Fallback - Math.random() should error the build if Math.random() happens before some component outside a Suspense boundary is complete 1`

- Snapshot  - 2
+ Received  + 2

@@ -1,8 +1,8 @@
  "Error: Route "/sync-random-without-fallback" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at getRandomNumber (../../../../app/sync-random-without-fallback/page.tsx:32:15)
+     at getRandomNumber (app/sync-random-without-fallback/page.tsx:32:15)
-     at RandomReadingComponent (../../../../app/sync-random-without-fallback/page.tsx:40:18)
+     at RandomReadingComponent (app/sync-random-without-fallback/page.tsx:40:18)
    30 |
    31 | function getRandomNumber() {
  > 32 |   return Math.random()
       |               ^
    33 | }

  1073 |             if (isTurbopack) {
  1074 |               if (isDebugPrerender) {
> 1075 |                 expect(output).toMatchInlineSnapshot(`
       |                                ^
  1076 |                  "Error: Route "/sync-random-without-fallback" used \`Math.random()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
  1077 |                      at getRandomNumber (../../../../app/sync-random-without-fallback/page.tsx:32:15)
  1078 |                      at RandomReadingComponent (../../../../app/sync-random-without-fallback/page.tsx:40:18)

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:1075:32)

● Cache Components Errors › Build With --prerender-debug › Sync Dynamic Request › cookies › should error the build with a runtime error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync Dynamic Request cookies should error the build with a runtime error 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,8 +1,8 @@
  "Error occurred prerendering page "/sync-cookies". Read more: https://nextjs.org/docs/messages/prerender-error
  TypeError: <module-function>().get is not a function
-     at CookiesReadingComponent (../../../../app/sync-cookies/page.tsx:18:36)
+     at CookiesReadingComponent (app/sync-cookies/page.tsx:18:36)
      at stringify (<anonymous>)
    16 | async function CookiesReadingComponent() {
    17 |   // Cast to any as we removed UnsafeUnwrapped types, but still need to test with the sync access
  > 18 |   const token = (cookies() as any).get('token')
       |                                    ^

  1331 |             if (isTurbopack) {
  1332 |               if (isDebugPrerender) {
> 1333 |                 expect(output).toMatchInlineSnapshot(`
       |                                ^
  1334 |                  "Error occurred prerendering page "/sync-cookies". Read more: https://nextjs.org/docs/messages/prerender-error
  1335 |                  TypeError: <module-function>().get is not a function
  1336 |                      at CookiesReadingComponent (../../../../app/sync-cookies/page.tsx:18:36)

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:1333:32)

● Cache Components Errors › Build With --prerender-debug › Sync Dynamic Request › headers › should error the build with a runtime error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync Dynamic Request headers should error the build with a runtime error 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,8 +1,8 @@
  "Error occurred prerendering page "/sync-headers". Read more: https://nextjs.org/docs/messages/prerender-error
  TypeError: <module-function>().get is not a function
-     at HeadersReadingComponent (../../../../app/sync-headers/page.tsx:18:40)
+     at HeadersReadingComponent (app/sync-headers/page.tsx:18:40)
      at stringify (<anonymous>)
    16 | async function HeadersReadingComponent() {
    17 |   // Cast to any as we removed UnsafeUnwrapped types, but still need to test with the sync access
  > 18 |   const userAgent = (headers() as any).get('user-agent')
       |                                        ^

  1682 |             if (isTurbopack) {
  1683 |               if (isDebugPrerender) {
> 1684 |                 expect(output).toMatchInlineSnapshot(`
       |                                ^
  1685 |                  "Error occurred prerendering page "/sync-headers". Read more: https://nextjs.org/docs/messages/prerender-error
  1686 |                  TypeError: <module-function>().get is not a function
  1687 |                      at HeadersReadingComponent (../../../../app/sync-headers/page.tsx:18:40)

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:1684:32)

● Cache Components Errors › Build With --prerender-debug › Error Attribution with Sync IO › Guarded RSC with unguarded Client sync IO › should error the build with a reason related to sync IO access

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Error Attribution with Sync IO Guarded RSC with unguarded Client sync IO should error the build with a reason related to sync IO access 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-attribution/guarded-async-unguarded-clientsync" used `new Date()` inside a Client Component without a Suspense boundary above it. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time-client
-     at SyncIO (../../../../app/sync-attribution/guarded-async-unguarded-clientsync/client.tsx:5:16)
+     at SyncIO (app/sync-attribution/guarded-async-unguarded-clientsync/client.tsx:5:16)
    3 | export function SyncIO() {
    4 |   // This is a sync IO access that should not cause an error
  > 5 |   const data = new Date().toISOString()
      |                ^
    6 |

  2008 |             if (isTurbopack) {
  2009 |               if (isDebugPrerender) {
> 2010 |                 expect(output).toMatchInlineSnapshot(`
       |                                ^
  2011 |                  "Error: Route "/sync-attribution/guarded-async-unguarded-clientsync" used \`new Date()\` inside a Client Component without a Suspense boundary above it. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time-client
  2012 |                      at SyncIO (../../../../app/sync-attribution/guarded-async-unguarded-clientsync/client.tsx:5:16)
  2013 |                    3 | export function SyncIO() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:2010:32)

● Cache Components Errors › Build With --prerender-debug › Error Attribution with Sync IO › unguarded RSC with unguarded Client sync IO › should error the build with a reason related to sync IO access

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Error Attribution with Sync IO unguarded RSC with unguarded Client sync IO should error the build with a reason related to sync IO access 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-attribution/unguarded-async-unguarded-clientsync" used `new Date()` inside a Client Component without a Suspense boundary above it. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time-client
-     at SyncIO (../../../../app/sync-attribution/unguarded-async-unguarded-clientsync/client.tsx:5:16)
+     at SyncIO (app/sync-attribution/unguarded-async-unguarded-clientsync/client.tsx:5:16)
    3 | export function SyncIO() {
    4 |   // This is a sync IO access that should not cause an error
  > 5 |   const data = new Date().toISOString()
      |                ^
    6 |

  2344 |             if (isTurbopack) {
  2345 |               if (isDebugPrerender) {
> 2346 |                 expect(output).toMatchInlineSnapshot(`
       |                                ^
  2347 |                  "Error: Route "/sync-attribution/unguarded-async-unguarded-clientsync" used \`new Date()\` inside a Client Component without a Suspense boundary above it. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time-client
  2348 |                      at SyncIO (../../../../app/sync-attribution/unguarded-async-unguarded-clientsync/client.tsx:5:16)
  2349 |                    3 | export function SyncIO() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:2346:32)

● Cache Components Errors › Build With --prerender-debug › Inside use cache › cookies › should error the build

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Inside \`use cache\` cookies should error the build 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route /use-cache-cookies used `cookies()` inside "use cache". Accessing Dynamic data sources inside a cache scope is not supported. If you need this data inside a cached function use `cookies()` outside of the cached function and pass the required dynamic data in as an argument. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache
-     at CookiesReadingComponent (../../../../app/use-cache-cookies/page.tsx:22:18)
+     at CookiesReadingComponent (app/use-cache-cookies/page.tsx:22:18)
    20 |   // in userland.
    21 |   try {
  > 22 |     await cookies()
       |                  ^
    23 |   } catch {}

  2466 |             if (isTurbopack) {
  2467 |               if (isDebugPrerender) {
> 2468 |                 expect(output).toMatchInlineSnapshot(`
       |                                ^
  2469 |                  "Error: Route /use-cache-cookies used \`cookies()\` inside "use cache". Accessing Dynamic data sources inside a cache scope is not supported. If you need this data inside a cached function use \`cookies()\` outside of the cached function and pass the required dynamic data in as an argument. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache
  2470 |                      at CookiesReadingComponent (../../../../app/use-cache-cookies/page.tsx:22:18)
  2471 |                    20 |   // in userland.

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:2468:32)

● Cache Components Errors › Build With --prerender-debug › Inside use cache › draftMode › should error the build

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Inside \`use cache\` draftMode should error the build 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route /use-cache-draft-mode used "draftMode().enable()" inside "use cache". The enabled status of `draftMode()` can be read in caches but you must not enable or disable `draftMode()` inside a cache. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache
-     at DraftModeEnablingComponent (../../../../app/use-cache-draft-mode/page.tsx:20:26)
+     at DraftModeEnablingComponent (app/use-cache-draft-mode/page.tsx:20:26)
    18 |   // here to ensure that this error is shown even when it's caught in userland.
    19 |   try {
  > 20 |     ;(await draftMode()).enable()
       |                          ^
    21 |   } catch {}

  2589 |             if (isTurbopack) {
  2590 |               if (isDebugPrerender) {
> 2591 |                 expect(output).toMatchInlineSnapshot(`
       |                                ^
  2592 |                  "Error: Route /use-cache-draft-mode used "draftMode().enable()" inside "use cache". The enabled status of \`draftMode()\` can be read in caches but you must not enable or disable \`draftMode()\` inside a cache. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache
  2593 |                      at DraftModeEnablingComponent (../../../../app/use-cache-draft-mode/page.tsx:20:26)
  2594 |                    18 |   // here to ensure that this error is shown even when it's caught in userland.

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:2591:32)

● Cache Components Errors › Build With --prerender-debug › Inside use cache › headers › should error the build

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Inside \`use cache\` headers should error the build 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route /use-cache-headers used `headers()` inside "use cache". Accessing Dynamic data sources inside a cache scope is not supported. If you need this data inside a cached function use `headers()` outside of the cached function and pass the required dynamic data in as an argument. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache
-     at HeadersReadingComponent (../../../../app/use-cache-headers/page.tsx:21:18)
+     at HeadersReadingComponent (app/use-cache-headers/page.tsx:21:18)
    19 |   // to ensure that this error is shown even when it's caught in userland.
    20 |   try {
  > 21 |     await headers()
       |                  ^
    22 |   } catch {}

  2709 |             if (isTurbopack) {
  2710 |               if (isDebugPrerender) {
> 2711 |                 expect(output).toMatchInlineSnapshot(`
       |                                ^
  2712 |                  "Error: Route /use-cache-headers used \`headers()\` inside "use cache". Accessing Dynamic data sources inside a cache scope is not supported. If you need this data inside a cached function use \`headers()\` outside of the cached function and pass the required dynamic data in as an argument. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache
  2713 |                      at HeadersReadingComponent (../../../../app/use-cache-headers/page.tsx:21:18)
  2714 |                    19 |   // to ensure that this error is shown even when it's caught in userland.

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:2711:32)

● Cache Components Errors › Build With --prerender-debug › With use cache: private › in unstable_cache › should error the build

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug With \`use cache: private\` in \`unstable_cache\` should error the build 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: "use cache: private" must not be used within `unstable_cache()`.
-     at module evaluation (../../../../app/use-cache-private-in-unstable-cache/page.tsx:21:38)
+     at module evaluation (app/use-cache-private-in-unstable-cache/page.tsx:21:38)
      at a (<next-dist-dir>)
    19 | }
    20 |
  > 21 | const getCachedData = unstable_cache(async () => {
       |                                      ^

  2852 |             if (isTurbopack) {
  2853 |               if (isDebugPrerender) {
> 2854 |                 expect(output).toMatchInlineSnapshot(`
       |                                ^
  2855 |                  "Error: "use cache: private" must not be used within \`unstable_cache()\`.
  2856 |                      at module evaluation (../../../../app/use-cache-private-in-unstable-cache/page.tsx:21:38)
  2857 |                      at a (<next-dist-dir>)

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:2854:32)

● Cache Components Errors › Build With --prerender-debug › With use cache: private › in use cache › should error the build

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug With \`use cache: private\` in \`use cache\` should error the build 1`

- Snapshot  - 2
+ Received  + 2

@@ -1,17 +1,17 @@
  "Error: "use cache: private" must not be used within "use cache". It can only be nested inside of another "use cache: private".
-     at module evaluation (../../../../app/use-cache-private-in-use-cache/page.tsx:15:1)
+     at module evaluation (app/use-cache-private-in-use-cache/page.tsx:15:1)
      at a (<next-dist-dir>)
    13 | }
    14 |
  > 15 | async function Private() {
       | ^
    16 |   'use cache: private'
    17 |
    18 |   return <p>Private</p>
  Error: "use cache: private" must not be used within "use cache". It can only be nested inside of another "use cache: private".
-     at module evaluation (../../../../app/use-cache-private-in-use-cache/page.tsx:15:1)
+     at module evaluation (app/use-cache-private-in-use-cache/page.tsx:15:1)
      at b (<next-dist-dir>)
    13 | }
    14 |
  > 15 | async function Private() {
       | ^

  3024 |             if (isTurbopack) {
  3025 |               if (isDebugPrerender) {
> 3026 |                 expect(output).toMatchInlineSnapshot(`
       |                                ^
  3027 |                  "Error: "use cache: private" must not be used within "use cache". It can only be nested inside of another "use cache: private".
  3028 |                      at module evaluation (../../../../app/use-cache-private-in-use-cache/page.tsx:15:1)
  3029 |                      at a (<next-dist-dir>)

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3026:32)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Current Time - Date() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Current Time - Date() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-current-time/date" used `Date()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time
-     at DateReadingComponent (../../../../app/sync-io-current-time/date/page.tsx:19:16)
+     at DateReadingComponent (app/sync-io-current-time/date/page.tsx:19:16)
    17 | async function DateReadingComponent() {
    18 |   await new Promise((r) => process.nextTick(r))
  > 19 |   return <div>{Date()}</div>
       |                ^
    20 | }

  3406 |           if (isTurbopack) {
  3407 |             if (isDebugPrerender) {
> 3408 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  3409 |                "Error: Route "/sync-io-current-time/date" used \`Date()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time
  3410 |                    at DateReadingComponent (../../../../app/sync-io-current-time/date/page.tsx:19:16)
  3411 |                  17 | async function DateReadingComponent() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3408:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Current Time - Date.now() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Current Time - Date.now() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-current-time/date-now" used `Date.now()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time
-     at DateReadingComponent (../../../../app/sync-io-current-time/date-now/page.tsx:19:21)
+     at DateReadingComponent (app/sync-io-current-time/date-now/page.tsx:19:21)
    17 | async function DateReadingComponent() {
    18 |   await new Promise((r) => process.nextTick(r))
  > 19 |   return <div>{Date.now()}</div>
       |                     ^
    20 | }

  3509 |           if (isTurbopack) {
  3510 |             if (isDebugPrerender) {
> 3511 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  3512 |                "Error: Route "/sync-io-current-time/date-now" used \`Date.now()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time
  3513 |                    at DateReadingComponent (../../../../app/sync-io-current-time/date-now/page.tsx:19:21)
  3514 |                  17 | async function DateReadingComponent() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3511:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Current Time - new Date() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Current Time - new Date() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-current-time/new-date" used `new Date()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time
-     at DateReadingComponent (../../../../app/sync-io-current-time/new-date/page.tsx:19:16)
+     at DateReadingComponent (app/sync-io-current-time/new-date/page.tsx:19:16)
    17 | async function DateReadingComponent() {
    18 |   await new Promise((r) => process.nextTick(r))
  > 19 |   return <div>{new Date().toString()}</div>
       |                ^
    20 | }

  3612 |           if (isTurbopack) {
  3613 |             if (isDebugPrerender) {
> 3614 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  3615 |                "Error: Route "/sync-io-current-time/new-date" used \`new Date()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time
  3616 |                    at DateReadingComponent (../../../../app/sync-io-current-time/new-date/page.tsx:19:16)
  3617 |                  17 | async function DateReadingComponent() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3614:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Random - Math.random() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Random - Math.random() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-random/math-random" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at SyncIOComponent (../../../../app/sync-io-random/math-random/page.tsx:19:21)
+     at SyncIOComponent (app/sync-io-random/math-random/page.tsx:19:21)
    17 | async function SyncIOComponent() {
    18 |   await new Promise((r) => process.nextTick(r))
  > 19 |   return <div>{Math.random()}</div>
       |                     ^
    20 | }

  3715 |           if (isTurbopack) {
  3716 |             if (isDebugPrerender) {
> 3717 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  3718 |                "Error: Route "/sync-io-random/math-random" used \`Math.random()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
  3719 |                    at SyncIOComponent (../../../../app/sync-io-random/math-random/page.tsx:19:21)
  3720 |                  17 | async function SyncIOComponent() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3717:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Web Crypto - getRandomValue() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Web Crypto - getRandomValue() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-web-crypto/get-random-value" used `crypto.getRandomValues()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto
-     at SyncIOComponent (../../../../app/sync-io-web-crypto/get-random-value/page.tsx:20:10)
+     at SyncIOComponent (app/sync-io-web-crypto/get-random-value/page.tsx:20:10)
    18 |   await new Promise((r) => process.nextTick(r))
    19 |   const buffer = new Uint8Array(8)
  > 20 |   crypto.getRandomValues(buffer)
       |          ^
    21 |   return <div>{buffer.toString()}</div>

  3818 |           if (isTurbopack) {
  3819 |             if (isDebugPrerender) {
> 3820 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  3821 |                "Error: Route "/sync-io-web-crypto/get-random-value" used \`crypto.getRandomValues()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto
  3822 |                    at SyncIOComponent (../../../../app/sync-io-web-crypto/get-random-value/page.tsx:20:10)
  3823 |                  18 |   await new Promise((r) => process.nextTick(r))

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3820:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Web Crypto - randomUUID() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Web Crypto - randomUUID() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-web-crypto/random-uuid" used `crypto.randomUUID()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto
-     at SyncIOComponent (../../../../app/sync-io-web-crypto/random-uuid/page.tsx:19:23)
+     at SyncIOComponent (app/sync-io-web-crypto/random-uuid/page.tsx:19:23)
    17 | async function SyncIOComponent() {
    18 |   await new Promise((r) => process.nextTick(r))
  > 19 |   return <div>{crypto.randomUUID()}</div>
       |                       ^
    20 | }

  3924 |           if (isTurbopack) {
  3925 |             if (isDebugPrerender) {
> 3926 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  3927 |                "Error: Route "/sync-io-web-crypto/random-uuid" used \`crypto.randomUUID()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto
  3928 |                    at SyncIOComponent (../../../../app/sync-io-web-crypto/random-uuid/page.tsx:19:23)
  3929 |                  17 | async function SyncIOComponent() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3926:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Node Crypto - generateKeyPairSync() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Node Crypto - generateKeyPairSync() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-node-crypto/generate-key-pair-sync" used `require('node:crypto').generateKeyPairSync(...)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at SyncIOComponent (../../../../app/sync-io-node-crypto/generate-key-pair-sync/page.tsx:20:24)
+     at SyncIOComponent (app/sync-io-node-crypto/generate-key-pair-sync/page.tsx:20:24)
    18 | async function SyncIOComponent() {
    19 |   await new Promise((r) => process.nextTick(r))
  > 20 |   const first = crypto.generateKeyPairSync('rsa', keyGenOptions)
       |                        ^
    21 |   return <div>{first.publicKey}</div>

  4045 |           if (isTurbopack) {
  4046 |             if (isDebugPrerender) {
> 4047 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  4048 |                "Error: Route "/sync-io-node-crypto/generate-key-pair-sync" used \`require('node:crypto').generateKeyPairSync(...)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
  4049 |                    at SyncIOComponent (../../../../app/sync-io-node-crypto/generate-key-pair-sync/page.tsx:20:24)
  4050 |                  18 | async function SyncIOComponent() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4047:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Node Crypto - generateKeySync() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Node Crypto - generateKeySync() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-node-crypto/generate-key-sync" used `require('node:crypto').generateKeySync(...)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at SyncIOComponent (../../../../app/sync-io-node-crypto/generate-key-sync/page.tsx:21:6)
+     at SyncIOComponent (app/sync-io-node-crypto/generate-key-sync/page.tsx:21:6)
    19 |   await new Promise((r) => process.nextTick(r))
    20 |   const first = crypto
  > 21 |     .generateKeySync('hmac', {
       |      ^
    22 |       length: 512,

  4169 |           if (isTurbopack) {
  4170 |             if (isDebugPrerender) {
> 4171 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  4172 |                "Error: Route "/sync-io-node-crypto/generate-key-sync" used \`require('node:crypto').generateKeySync(...)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
  4173 |                    at SyncIOComponent (../../../../app/sync-io-node-crypto/generate-key-sync/page.tsx:21:6)
  4174 |                  19 |   await new Promise((r) => process.nextTick(r))

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4171:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Node Crypto - generatePrimeSync() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Node Crypto - generatePrimeSync() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-node-crypto/generate-prime-sync" used `require('node:crypto').generatePrimeSync(...)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at SyncIOComponent (../../../../app/sync-io-node-crypto/generate-prime-sync/page.tsx:20:39)
+     at SyncIOComponent (app/sync-io-node-crypto/generate-prime-sync/page.tsx:20:39)
    18 | async function SyncIOComponent() {
    19 |   await new Promise((r) => process.nextTick(r))
  > 20 |   const first = new Uint8Array(crypto.generatePrimeSync(128))
       |                                       ^
    21 |   return <div>{first.toString()}</div>

  4293 |           if (isTurbopack) {
  4294 |             if (isDebugPrerender) {
> 4295 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  4296 |                "Error: Route "/sync-io-node-crypto/generate-prime-sync" used \`require('node:crypto').generatePrimeSync(...)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
  4297 |                    at SyncIOComponent (../../../../app/sync-io-node-crypto/generate-prime-sync/page.tsx:20:39)
  4298 |                  18 | async function SyncIOComponent() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4295:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Node Crypto - getRandomValues() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Node Crypto - getRandomValues() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-node-crypto/get-random-values" used `crypto.getRandomValues()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto
-     at SyncIOComponent (../../../../app/sync-io-node-crypto/get-random-values/page.tsx:21:10)
+     at SyncIOComponent (app/sync-io-node-crypto/get-random-values/page.tsx:21:10)
    19 |   await new Promise((r) => process.nextTick(r))
    20 |   const first = new Uint8Array(8)
  > 21 |   crypto.getRandomValues(first)
       |          ^
    22 |   return <div>{first.toString()}</div>

  4417 |           if (isTurbopack) {
  4418 |             if (isDebugPrerender) {
> 4419 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  4420 |                "Error: Route "/sync-io-node-crypto/get-random-values" used \`crypto.getRandomValues()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto
  4421 |                    at SyncIOComponent (../../../../app/sync-io-node-crypto/get-random-values/page.tsx:21:10)
  4422 |                  19 |   await new Promise((r) => process.nextTick(r))

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4419:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Node Crypto - random-bytes() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Node Crypto - random-bytes() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-node-crypto/random-bytes" used `require('node:crypto').randomBytes(size)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at SyncIOComponent (../../../../app/sync-io-node-crypto/random-bytes/page.tsx:20:24)
+     at SyncIOComponent (app/sync-io-node-crypto/random-bytes/page.tsx:20:24)
    18 | async function SyncIOComponent() {
    19 |   await new Promise((r) => process.nextTick(r))
  > 20 |   const first = crypto.randomBytes(8)
       |                        ^
    21 |   return <div>{first.toString()}</div>

  4541 |           if (isTurbopack) {
  4542 |             if (isDebugPrerender) {
> 4543 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  4544 |                "Error: Route "/sync-io-node-crypto/random-bytes" used \`require('node:crypto').randomBytes(size)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
  4545 |                    at SyncIOComponent (../../../../app/sync-io-node-crypto/random-bytes/page.tsx:20:24)
  4546 |                  18 | async function SyncIOComponent() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4543:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Node Crypto - random-fill-sync() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Node Crypto - random-fill-sync() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-node-crypto/random-fill-sync" used `require('node:crypto').randomFillSync(...)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at SyncIOComponent (../../../../app/sync-io-node-crypto/random-fill-sync/page.tsx:21:10)
+     at SyncIOComponent (app/sync-io-node-crypto/random-fill-sync/page.tsx:21:10)
    19 |   await new Promise((r) => process.nextTick(r))
    20 |   const first = new Uint8Array(16)
  > 21 |   crypto.randomFillSync(first, 4, 8)
       |          ^
    22 |   return <div>{first.toString()}</div>

  4665 |           if (isTurbopack) {
  4666 |             if (isDebugPrerender) {
> 4667 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  4668 |                "Error: Route "/sync-io-node-crypto/random-fill-sync" used \`require('node:crypto').randomFillSync(...)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
  4669 |                    at SyncIOComponent (../../../../app/sync-io-node-crypto/random-fill-sync/page.tsx:21:10)
  4670 |                  19 |   await new Promise((r) => process.nextTick(r))

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4667:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Node Crypto - random-int-between() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Node Crypto - random-int-between() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-node-crypto/random-int-between" used `require('node:crypto').randomInt(min, max)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at SyncIOComponent (../../../../app/sync-io-node-crypto/random-int-between/page.tsx:20:24)
+     at SyncIOComponent (app/sync-io-node-crypto/random-int-between/page.tsx:20:24)
    18 | async function SyncIOComponent() {
    19 |   await new Promise((r) => process.nextTick(r))
  > 20 |   const first = crypto.randomInt(128, 256)
       |                        ^
    21 |   return <div>{first}</div>

  4789 |           if (isTurbopack) {
  4790 |             if (isDebugPrerender) {
> 4791 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  4792 |                "Error: Route "/sync-io-node-crypto/random-int-between" used \`require('node:crypto').randomInt(min, max)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
  4793 |                    at SyncIOComponent (../../../../app/sync-io-node-crypto/random-int-between/page.tsx:20:24)
  4794 |                  18 | async function SyncIOComponent() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4791:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Node Crypto - random-int-up-to() › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Node Crypto - random-int-up-to() should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-node-crypto/random-int-up-to" used `require('node:crypto').randomInt(min, max)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at SyncIOComponent (../../../../app/sync-io-node-crypto/random-int-up-to/page.tsx:20:24)
+     at SyncIOComponent (app/sync-io-node-crypto/random-int-up-to/page.tsx:20:24)
    18 | async function SyncIOComponent() {
    19 |   await new Promise((r) => process.nextTick(r))
  > 20 |   const first = crypto.randomInt(128)
       |                        ^
    21 |   return <div>{first}</div>

  4913 |           if (isTurbopack) {
  4914 |             if (isDebugPrerender) {
> 4915 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  4916 |                "Error: Route "/sync-io-node-crypto/random-int-up-to" used \`require('node:crypto').randomInt(min, max)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
  4917 |                    at SyncIOComponent (../../../../app/sync-io-node-crypto/random-int-up-to/page.tsx:20:24)
  4918 |                  18 | async function SyncIOComponent() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4915:30)

● Cache Components Errors › Build With --prerender-debug › Sync IO - Node Crypto - random-uuid › should error the build if sync IO is used in a Server Component while prerendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Build With --prerender-debug Sync IO - Node Crypto - random-uuid should error the build if sync IO is used in a Server Component while prerendering 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  "Error: Route "/sync-io-node-crypto/random-uuid" used `require('node:crypto').randomUUID()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
-     at SyncIOComponent (../../../../app/sync-io-node-crypto/random-uuid/page.tsx:20:24)
+     at SyncIOComponent (app/sync-io-node-crypto/random-uuid/page.tsx:20:24)
    18 | async function SyncIOComponent() {
    19 |   await new Promise((r) => process.nextTick(r))
  > 20 |   const first = crypto.randomUUID()
       |                        ^
    21 |   return <div>{first}</div>

  5037 |           if (isTurbopack) {
  5038 |             if (isDebugPrerender) {
> 5039 |               expect(output).toMatchInlineSnapshot(`
       |                              ^
  5040 |                "Error: Route "/sync-io-node-crypto/random-uuid" used \`require('node:crypto').randomUUID()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
  5041 |                    at SyncIOComponent (../../../../app/sync-io-node-crypto/random-uuid/page.tsx:20:24)
  5042 |                  18 | async function SyncIOComponent() {

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:5039:30)

pnpm test test/integration/required-server-files-ssr-404/test/index.test.js

  • Required Server Files > production mode > should output required-server-files manifest correctly (DD)
  • Required Server Files > production mode > should render SSR page correctly (DD)
  • Required Server Files > production mode > should render dynamic SSR page correctly (DD)
  • Required Server Files > production mode > should render fallback page correctly (DD)
  • Required Server Files > production mode > should render SSR page correctly with x-matched-path (DD)
  • Required Server Files > production mode > should render dynamic SSR page correctly with x-matched-path (DD)
  • Required Server Files > production mode > should render fallback page correctly with x-matched-path and routes-matches (DD)
  • Required Server Files > production mode > should return data correctly with x-matched-path (DD)
  • Required Server Files > production mode > should render fallback optional catch-all route correctly with x-matched-path and routes-matches (DD)
  • Required Server Files > production mode > should return data correctly with x-matched-path for optional catch-all route (DD)
  • Required Server Files > production mode > should not apply trailingSlash redirect (DD)
  • Required Server Files > production mode > should normalize catch-all rewrite query values correctly (DD)
  • Required Server Files > production mode > should bubble error correctly for gip page (DD)
  • Required Server Files > production mode > should bubble error correctly for gssp page (DD)
  • Required Server Files > production mode > should bubble error correctly for gsp page (DD)
  • Required Server Files > production mode > should normalize optional values correctly for SSP page (DD)
  • Required Server Files > production mode > should normalize optional values correctly for SSG page (DD)
  • Required Server Files > production mode > should normalize optional values correctly for API page (DD)
  • Required Server Files > production mode > should match the index page correctly (DD)
  • Required Server Files > production mode > should match the root dynamic page correctly (DD)
  • Required Server Files > production mode > should handle 404s properly (DD)
  • Required Server Files > production mode > partial optional catch-all route > should render /partial-catch-all/hello.com (DD)
  • Required Server Files > production mode > partial optional catch-all route > should render /partial-catch-all/hello.com/hello (DD)
  • Required Server Files > production mode > partial optional catch-all route > should render /partial-catch-all/hello.com/hello/world (DD)
Expand output

● Required Server Files › production mode › should output required-server-files manifest correctly

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should render SSR page correctly

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should render dynamic SSR page correctly

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should render fallback page correctly

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should render SSR page correctly with x-matched-path

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should render dynamic SSR page correctly with x-matched-path

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should render fallback page correctly with x-matched-path and routes-matches

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should return data correctly with x-matched-path

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should render fallback optional catch-all route correctly with x-matched-path and routes-matches

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › partial optional catch-all route › should render /partial-catch-all/hello.com

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › partial optional catch-all route › should render /partial-catch-all/hello.com/hello

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › partial optional catch-all route › should render /partial-catch-all/hello.com/hello/world

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should return data correctly with x-matched-path for optional catch-all route

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should not apply trailingSlash redirect

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should normalize catch-all rewrite query values correctly

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should bubble error correctly for gip page

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should bubble error correctly for gssp page

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should bubble error correctly for gsp page

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should normalize optional values correctly for SSP page

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should normalize optional values correctly for SSG page

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should normalize optional values correctly for API page

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should match the index page correctly

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should match the root dynamic page correctly

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Required Server Files › production mode › should handle 404s properly

thrown: "Exceeded timeout of 60000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  17 |     'production mode',
  18 |     () => {
> 19 |       beforeAll(async () => {
     |       ^
  20 |         await fs.remove(join(appDir, '.next'))
  21 |         await nextBuild(appDir, undefined, {
  22 |           env: {

  at beforeAll (integration/required-server-files-ssr-404/test/index.test.js:19:7)
  at integration/required-server-files-ssr-404/test/index.test.js:16:56
  at Object.describe (integration/required-server-files-ssr-404/test/index.test.js:15:1)

● Test suite failed to run

ENOENT: no such file or directory, rename '/root/actions-runner/_work/next.js/next.js/test/integration/required-server-files-ssr-404/pages-bak' -> '/root/actions-runner/_work/next.js/next.js/test/integration/required-server-files-ssr-404/pages'

pnpm test-dev test/e2e/app-dir/use-cache-custom-handler/use-cache-custom-handler.test.ts

  • use-cache-custom-handler > should use a modern custom cache handler if provided (DD)
Expand output

● use-cache-custom-handler › should use a modern custom cache handler if provided

expect(received).toEqual(expected) // deep equality

Expected: "2025-10-24T23:17:04.814Z"
Received: "2025-10-24T23:17:08.314Z"

  47 |     let data = await browser.elementById('data').text()
  48 |     expect(data).toMatch(isoDateRegExp)
> 49 |     expect(data).toEqual(initialData)
     |                  ^
  50 |
  51 |     // Now that a cache entry exists, we expect that getExpiration() is called
  52 |     // to compare the cache entries timestamp with the expiration of the

  at Object.toEqual (e2e/app-dir/use-cache-custom-handler/use-cache-custom-handler.test.ts:49:18)

pnpm test-start-turbo test/e2e/app-dir/app-prefetch/prefetching.stale-times.test.ts (turbopack)

  • app dir - prefetching (custom staleTime) > should not re-fetch cached data when navigating back to a route group (DD)
Expand output

● app dir - prefetching (custom staleTime) › should not re-fetch cached data when navigating back to a route group

thrown: "Exceeded timeout of 120000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  132 |   })
  133 |
> 134 |   it('should not re-fetch cached data when navigating back to a route group', async () => {
      |   ^
  135 |     let act: ReturnType<typeof createRouterAct>
  136 |     const browser = await next.browser('/prefetch-auto-route-groups', {
  137 |       beforePageLoad(page) {

  at it (e2e/app-dir/app-prefetch/prefetching.stale-times.test.ts:134:3)
  at Object.describe (e2e/app-dir/app-prefetch/prefetching.stale-times.test.ts:6:1)

pnpm test-start test/e2e/app-dir/app-prefetch/prefetching.test.ts

  • app dir - prefetching > should immediately render the loading state for a dynamic segment when fetched from higher up in the tree (DD)
Expand output

● app dir - prefetching › should immediately render the loading state for a dynamic segment when fetched from higher up in the tree

thrown: "Exceeded timeout of 120000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  302 |   })
  303 |
> 304 |   it('should immediately render the loading state for a dynamic segment when fetched from higher up in the tree', async () => {
      |   ^
  305 |     let act: ReturnType<typeof createRouterAct>
  306 |     const browser = await next.browser('/', {
  307 |       beforePageLoad(page) {

  at it (e2e/app-dir/app-prefetch/prefetching.test.ts:304:3)
  at Object.describe (e2e/app-dir/app-prefetch/prefetching.test.ts:11:1)

pnpm test-start test/e2e/app-dir/nx-handling/nx-handling.test.ts

  • nx-handling > should work for pages page (DD)
  • nx-handling > should work for pages API (DD)
  • nx-handling > should work with app page (DD)
  • nx-handling > should work with app route (DD)
Expand output

● nx-handling › should work for pages page

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work for pages API

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work with app page

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work with app route

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● Test suite failed to run

next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished

  134 |     if (nextInstance) {
  135 |       await nextInstance.destroy()
> 136 |       throw new Error(
      |             ^
  137 |         `next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished`
  138 |       )
  139 |     }

  at Object.<anonymous> (lib/e2e-utils/index.ts:136:13)

@codspeed-hq
Copy link

codspeed-hq bot commented Oct 21, 2025

CodSpeed Performance Report

Merging #85146 will improve performances by 8.4%

Comparing relative_file_paths_in_node (a4fa113) with canary (3cf4b17)

Summary

⚡ 1 improvement
✅ 7 untouched
⏩ 12 skipped1

Benchmarks breakdown

Mode Benchmark BASE HEAD Change
Simulation react-dom-client.development.js[full] 464.3 ms 428.3 ms +8.4%

Footnotes

  1. 12 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@lukesandberg lukesandberg force-pushed the relative_file_paths_in_node branch 2 times, most recently from 3a3b32b to daa9002 Compare October 21, 2025 05:01
@lukesandberg lukesandberg marked this pull request as ready for review October 21, 2025 05:02
@lukesandberg lukesandberg requested a review from a team October 21, 2025 05:02
Copy link
Member

@sokra sokra left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verify the url encoding

@mischnic mischnic force-pushed the relative_file_paths_in_node branch from fb49671 to 18dcf6d Compare October 21, 2025 16:22
@mischnic mischnic force-pushed the relative_file_paths_in_node branch from 18dcf6d to 76bce6e Compare October 21, 2025 16:28
@mischnic mischnic requested a review from sokra October 21, 2025 16:46
@mischnic mischnic force-pushed the relative_file_paths_in_node branch from be0db13 to 0728dc0 Compare October 21, 2025 17:40
@ijjk ijjk added the tests label Oct 21, 2025
@mischnic mischnic force-pushed the relative_file_paths_in_node branch from 0728dc0 to 44ce97f Compare October 21, 2025 17:41
@lukesandberg lukesandberg force-pushed the relative_file_paths_in_node branch from 44ce97f to 46f7eee Compare October 21, 2025 18:42
Copy link
Contributor Author

ok, 'verified' the uri encoding. tl;dr; things are bad, this doesn't make them worse
updating snapshots

Copy link
Contributor Author

there is a question about why the paths are different when you pass --debug-prerender. I ruled out it being something related to the working directory changing, so it must be something about the outputs changing. im guessing in this case we should just use absolute paths like we do in dev?

@lukesandberg lukesandberg force-pushed the relative_file_paths_in_node branch from bdd9dd2 to a4fa113 Compare October 24, 2025 23:05
Copy link
Contributor Author

ok. I am increasingly confused about this

however in a normal build with prerendering i get a nicely formatting error stack if i set NODE_OPTIONS=--enable-source-maps.

--debug-prerender does set that option on the child workers. But it also triggers the inspection patch which cannot correctly handle relative file paths because it does not know the location of the source map. If i do pass the source map location into the source-map library then it starts working

@eps1lon is the patch working as intended? should we instead be delegating to nodes normal deobfuscation logic instead of reimplementing it outselves?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

created-by: Turbopack team PRs by the Turbopack team. examples Issue was opened via the examples template. tests Turbopack Related to Turbopack with Next.js. type: next

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants