-
Notifications
You must be signed in to change notification settings - Fork 30.2k
Turbopack: Create junction points instead of symlinks on Windows #87606
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Allow CI Workflow Run
Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer |
1 similar comment
|
Allow CI Workflow Run
Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer |
Stats from current PRDefault Build (Increase detected
|
| vercel/next.js canary | vercel/next.js bgw/junction-point | Change | |
|---|---|---|---|
| buildDuration | 17s | 14.8s | N/A |
| buildDurationCached | 13.8s | 10.8s | N/A |
| nodeModulesSize | 456 MB | 456 MB | |
| nextStartRea..uration (ms) | 713ms | 721ms | N/A |
Client Bundles (main, webpack) Overall increase ⚠️
| vercel/next.js canary | vercel/next.js bgw/junction-point | Change | |
|---|---|---|---|
| 2086.HASH.js gzip | 169 B | 169 B | ✓ |
| 2161-HASH.js gzip | 5.39 kB | 5.41 kB | N/A |
| 2747-HASH.js gzip | 4.48 kB | 4.46 kB | N/A |
| 4322-HASH.js gzip | 51.2 kB | 51 kB | N/A |
| ec793fe8-HASH.js gzip | 62.3 kB | 62.3 kB | N/A |
| framework-HASH.js gzip | 59.8 kB | 59.8 kB | N/A |
| main-app-HASH.js gzip | 251 B | 254 B | N/A |
| main-HASH.js gzip | 38.3 kB | 38.7 kB | |
| webpack-HASH.js gzip | 1.68 kB | 1.69 kB | N/A |
| Overall change | 38.5 kB | 38.9 kB |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | vercel/next.js bgw/junction-point | 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 bgw/junction-point | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 194 B | 193 B | N/A |
| _error-HASH.js gzip | 182 B | 182 B | ✓ |
| css-HASH.js gzip | 336 B | 335 B | N/A |
| dynamic-HASH.js gzip | 1.8 kB | 1.8 kB | N/A |
| edge-ssr-HASH.js gzip | 256 B | 256 B | ✓ |
| head-HASH.js gzip | 352 B | 349 B | N/A |
| hooks-HASH.js gzip | 385 B | 384 B | N/A |
| image-HASH.js gzip | 580 B | 580 B | ✓ |
| index-HASH.js gzip | 259 B | 258 B | N/A |
| link-HASH.js gzip | 2.5 kB | 2.51 kB | N/A |
| routerDirect..HASH.js gzip | 319 B | 317 B | N/A |
| script-HASH.js gzip | 385 B | 387 B | N/A |
| withRouter-HASH.js gzip | 316 B | 315 B | N/A |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Overall change | 1.12 kB | 1.12 kB | ✓ |
Client Build Manifests
| vercel/next.js canary | vercel/next.js bgw/junction-point | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 738 B | 738 B | ✓ |
| Overall change | 738 B | 738 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | vercel/next.js bgw/junction-point | Change | |
|---|---|---|---|
| index.html gzip | 523 B | 525 B | N/A |
| link.html gzip | 538 B | 538 B | ✓ |
| withRouter.html gzip | 520 B | 521 B | N/A |
| Overall change | 538 B | 538 B | ✓ |
Edge SSR bundle Size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js bgw/junction-point | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 124 kB | 124 kB | N/A |
| page.js gzip | 237 kB | 238 kB | |
| Overall change | 237 kB | 238 kB |
Middleware size
| vercel/next.js canary | vercel/next.js bgw/junction-point | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 654 B | 655 B | N/A |
| middleware-r..fest.js gzip | 155 B | 156 B | N/A |
| middleware.js gzip | 32.8 kB | 32.9 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 bgw/junction-point | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 301 kB | 301 kB | ✓ |
| app-page-exp..prod.js gzip | 156 kB | 156 kB | ✓ |
| app-page-tur...dev.js gzip | 301 kB | 301 kB | N/A |
| app-page-tur..prod.js gzip | 156 kB | 156 kB | ✓ |
| app-page-tur...dev.js gzip | 298 kB | 298 kB | ✓ |
| app-page-tur..prod.js gzip | 154 kB | 154 kB | ✓ |
| app-page.run...dev.js gzip | 298 kB | 298 kB | N/A |
| app-page.run..prod.js gzip | 154 kB | 154 kB | ✓ |
| app-route-ex...dev.js gzip | 68.6 kB | 68.6 kB | ✓ |
| app-route-ex..prod.js gzip | 47.4 kB | 47.4 kB | ✓ |
| app-route-tu...dev.js gzip | 68.6 kB | 68.6 kB | ✓ |
| app-route-tu..prod.js gzip | 47.5 kB | 47.5 kB | ✓ |
| app-route-tu...dev.js gzip | 68.2 kB | 68.2 kB | ✓ |
| app-route-tu..prod.js gzip | 47.2 kB | 47.2 kB | ✓ |
| app-route.ru...dev.js gzip | 68.2 kB | 68.2 kB | ✓ |
| app-route.ru..prod.js gzip | 47.2 kB | 47.2 kB | ✓ |
| dist_client_...dev.js gzip | 324 B | 324 B | ✓ |
| dist_client_...dev.js gzip | 326 B | 326 B | ✓ |
| dist_client_...dev.js gzip | 318 B | 318 B | ✓ |
| dist_client_...dev.js gzip | 317 B | 317 B | ✓ |
| pages-api-tu...dev.js gzip | 41 kB | 41 kB | ✓ |
| pages-api-tu..prod.js gzip | 31.1 kB | 31.1 kB | ✓ |
| pages-api.ru...dev.js gzip | 41 kB | 41 kB | ✓ |
| pages-api.ru..prod.js gzip | 31.1 kB | 31.1 kB | ✓ |
| pages-turbo....dev.js gzip | 50.6 kB | 50.6 kB | ✓ |
| pages-turbo...prod.js gzip | 38.1 kB | 38.1 kB | ✓ |
| pages.runtim...dev.js gzip | 50.6 kB | 50.6 kB | ✓ |
| pages.runtim..prod.js gzip | 38.1 kB | 38.1 kB | ✓ |
| server.runti..prod.js gzip | 59.8 kB | 59.8 kB | ✓ |
| Overall change | 2.07 MB | 2.07 MB | ✓ |
build cache Overall increase ⚠️
| vercel/next.js canary | vercel/next.js bgw/junction-point | Change | |
|---|---|---|---|
| 0.pack gzip | 3.61 MB | 3.61 MB | |
| index.pack gzip | 99.5 kB | 98.3 kB | N/A |
| Overall change | 3.61 MB | 3.61 MB |
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 _buildManifest.js
@@ -611,35 +611,35 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
numHashes: NaN,
bitArray: [],
},
- "/": ["static\u002Fchunks\u002Fpages\u002Findex-dda7d8b64d4ba15c.js"],
+ "/": ["static\u002Fchunks\u002Fpages\u002Findex-d95f7ec6af4d2644.js"],
"/_error": [
- "static\u002Fchunks\u002Fpages\u002F_error-6ef44d3954f25711.js",
+ "static\u002Fchunks\u002Fpages\u002F_error-209c0c82205a7c9f.js",
],
"/css": [
"static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
- "static\u002Fchunks\u002Fpages\u002Fcss-c8aaa7211416a045.js",
+ "static\u002Fchunks\u002Fpages\u002Fcss-62710339bc830ded.js",
],
"/dynamic": [
- "static\u002Fchunks\u002Fpages\u002Fdynamic-d53bb7f318f342c2.js",
+ "static\u002Fchunks\u002Fpages\u002Fdynamic-8ed3486bb68dd6c6.js",
],
"/edge-ssr": [
- "static\u002Fchunks\u002Fpages\u002Fedge-ssr-1383106d4a3e7d72.js",
+ "static\u002Fchunks\u002Fpages\u002Fedge-ssr-0db9f7bb610d3072.js",
],
- "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-1db1c4be1a45662f.js"],
- "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-e6deee5b72a5b112.js"],
+ "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-747416c4075e42aa.js"],
+ "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-8b10205be7505244.js"],
"/image": [
- "static\u002Fchunks\u002F2747-90c828280005c0c3.js",
- "static\u002Fchunks\u002Fpages\u002Fimage-868472cd5e84efc9.js",
+ "static\u002Fchunks\u002F6349-ee9aecde860d4832.js",
+ "static\u002Fchunks\u002Fpages\u002Fimage-f90ae17c3ad1d38b.js",
],
- "/link": ["static\u002Fchunks\u002Fpages\u002Flink-0ec374e48b2ce5d9.js"],
+ "/link": ["static\u002Fchunks\u002Fpages\u002Flink-6ab9a67b348df1bf.js"],
"/routerDirect": [
- "static\u002Fchunks\u002Fpages\u002FrouterDirect-1a34bfadbc088491.js",
+ "static\u002Fchunks\u002Fpages\u002FrouterDirect-f132fb471e65a8b9.js",
],
"/script": [
- "static\u002Fchunks\u002Fpages\u002Fscript-52320f59afbd096d.js",
+ "static\u002Fchunks\u002Fpages\u002Fscript-8e2028e44b8da2d9.js",
],
"/withRouter": [
- "static\u002Fchunks\u002Fpages\u002FwithRouter-3b1a16d3dfa21c16.js",
+ "static\u002Fchunks\u002Fpages\u002FwithRouter-a86d259faa012c1c.js",
],
sortedPages: [
"\u002F",Diff for dynamic-HASH.js
@@ -1,17 +1,24 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[2291],
{
- /***/ 1231: /***/ (
- module,
+ /***/ 2604: /***/ (
+ __unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(4464);
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/dynamic",
+ function () {
+ return __webpack_require__(3643);
+ },
+ ]);
+ if (false) {
+ }
/***/
},
- /***/ 2101: /***/ (
+ /***/ 3401: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -38,24 +45,63 @@
/***/
},
- /***/ 3458: /***/ (
+ /***/ 3643: /***/ (
__unused_webpack_module,
- __unused_webpack_exports,
+ __webpack_exports__,
__webpack_require__
) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/dynamic",
- function () {
- return __webpack_require__(9381);
- },
- ]);
- if (false) {
- }
+ "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__(3108);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+ __webpack_require__(3973);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
+ /*#__PURE__*/ __webpack_require__.n(
+ next_dynamic__WEBPACK_IMPORTED_MODULE_1__
+ );
+
+ const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
+ () =>
+ __webpack_require__
+ .e(/* import() */ 1596)
+ .then(__webpack_require__.bind(__webpack_require__, 1596))
+ .then((mod) => mod.Hello),
+ {
+ loadableGenerated: {
+ webpack: () => [/*require.resolve*/ 1596],
+ },
+ }
+ );
+ const Page = () =>
+ /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
+ {
+ children: [
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
+ children: "testing next/dynamic size",
+ }),
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+ DynamicHello,
+ {}
+ ),
+ ],
+ }
+ );
+ var __N_SSP = true;
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
/***/
},
- /***/ 4464: /***/ (module, exports, __webpack_require__) => {
+ /***/ 3660: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -88,7 +134,7 @@
__webpack_require__(4312)
);
const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(9799)
+ __webpack_require__(4539)
);
const isServerSide = "object" === "undefined";
// Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -188,63 +234,17 @@
/***/
},
- /***/ 9381: /***/ (
- __unused_webpack_module,
- __webpack_exports__,
+ /***/ 3973: /***/ (
+ module,
+ __unused_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__(3108);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1231);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
- /*#__PURE__*/ __webpack_require__.n(
- next_dynamic__WEBPACK_IMPORTED_MODULE_1__
- );
-
- const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
- () =>
- __webpack_require__
- .e(/* import() */ 2086)
- .then(__webpack_require__.bind(__webpack_require__, 2086))
- .then((mod) => mod.Hello),
- {
- loadableGenerated: {
- webpack: () => [/*require.resolve*/ 2086],
- },
- }
- );
- const Page = () =>
- /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
- {
- children: [
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
- children: "testing next/dynamic size",
- }),
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
- DynamicHello,
- {}
- ),
- ],
- }
- );
- var __N_SSP = true;
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
+ module.exports = __webpack_require__(3660);
/***/
},
- /***/ 9799: /***/ (
+ /***/ 4539: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -286,7 +286,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
const _react = /*#__PURE__*/ _interop_require_default._(
__webpack_require__(4312)
);
- const _loadablecontextsharedruntime = __webpack_require__(2101);
+ const _loadablecontextsharedruntime = __webpack_require__(3401);
function resolve(obj) {
return obj && obj.default ? obj.default : obj;
}
@@ -524,7 +524,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(3458)
+ __webpack_exec__(2604)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for edge-ssr-HASH.js
@@ -1,7 +1,24 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[676],
{
- /***/ 1564: /***/ (
+ /***/ 7046: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/edge-ssr",
+ function () {
+ return __webpack_require__(7142);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7142: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -20,30 +37,13 @@
/***/
},
-
- /***/ 4300: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/edge-ssr",
- function () {
- return __webpack_require__(1564);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4300)
+ __webpack_exec__(7046)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for head-HASH.js
@@ -1,34 +1,17 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[5350],
{
- /***/ 1548: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/head",
- function () {
- return __webpack_require__(4282);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 3952: /***/ (
+ /***/ 3770: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(1653);
+ module.exports = __webpack_require__(9025);
/***/
},
- /***/ 4282: /***/ (
+ /***/ 6236: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +26,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(3952);
+ __webpack_require__(3770);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -76,13 +59,30 @@
/***/
},
+
+ /***/ 6510: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/head",
+ function () {
+ return __webpack_require__(6236);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(1548)
+ __webpack_exec__(6510)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for index-HASH.js
@@ -1,24 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3332],
{
- /***/ 6376: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/",
- function () {
- return __webpack_require__(8460);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 8460: /***/ (
+ /***/ 830: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -36,13 +19,30 @@
/***/
},
+
+ /***/ 1938: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/",
+ function () {
+ return __webpack_require__(830);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6376)
+ __webpack_exec__(1938)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for link-HASH.js
@@ -1,7 +1,220 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[4672],
{
- /***/ 857: /***/ (module, exports, __webpack_require__) => {
+ /***/ 2774: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useIntersection", {
+ enumerable: true,
+ get: function () {
+ return useIntersection;
+ },
+ });
+ const _react = __webpack_require__(4312);
+ const _requestidlecallback = __webpack_require__(9413);
+ const hasIntersectionObserver =
+ typeof IntersectionObserver === "function";
+ const observers = new Map();
+ const idList = [];
+ function createObserver(options) {
+ const id = {
+ root: options.root || null,
+ margin: options.rootMargin || "",
+ };
+ const existing = idList.find(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ let instance;
+ if (existing) {
+ instance = observers.get(existing);
+ if (instance) {
+ return instance;
+ }
+ }
+ const elements = new Map();
+ const observer = new IntersectionObserver((entries) => {
+ entries.forEach((entry) => {
+ const callback = elements.get(entry.target);
+ const isVisible =
+ entry.isIntersecting || entry.intersectionRatio > 0;
+ if (callback && isVisible) {
+ callback(isVisible);
+ }
+ });
+ }, options);
+ instance = {
+ id,
+ observer,
+ elements,
+ };
+ idList.push(id);
+ observers.set(id, instance);
+ return instance;
+ }
+ function observe(element, callback, options) {
+ const { id, observer, elements } = createObserver(options);
+ elements.set(element, callback);
+ observer.observe(element);
+ return function unobserve() {
+ elements.delete(element);
+ observer.unobserve(element);
+ // Destroy observer when there's nothing left to watch:
+ if (elements.size === 0) {
+ observer.disconnect();
+ observers.delete(id);
+ const index = idList.findIndex(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ if (index > -1) {
+ idList.splice(index, 1);
+ }
+ }
+ };
+ }
+ function useIntersection({ rootRef, rootMargin, disabled }) {
+ const isDisabled = disabled || !hasIntersectionObserver;
+ const [visible, setVisible] = (0, _react.useState)(false);
+ const elementRef = (0, _react.useRef)(null);
+ const setElement = (0, _react.useCallback)((element) => {
+ elementRef.current = element;
+ }, []);
+ (0, _react.useEffect)(() => {
+ if (hasIntersectionObserver) {
+ if (isDisabled || visible) return;
+ const element = elementRef.current;
+ if (element && element.tagName) {
+ const unobserve = observe(
+ element,
+ (isVisible) => isVisible && setVisible(isVisible),
+ {
+ root: rootRef?.current,
+ rootMargin,
+ }
+ );
+ return unobserve;
+ }
+ } else {
+ if (!visible) {
+ const idleCallback = (0,
+ _requestidlecallback.requestIdleCallback)(() => setVisible(true));
+ return () =>
+ (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
+ const resetVisible = (0, _react.useCallback)(() => {
+ setVisible(false);
+ }, []);
+ return [setElement, visible, resetVisible];
+ }
+ 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-intersection.js.map
+
+ /***/
+ },
+
+ /***/ 3351: /***/ (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__(4312);
+ 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
+
+ /***/
+ },
+
+ /***/ 3440: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(4757);
+
+ /***/
+ },
+
+ /***/ 4757: /***/ (module, exports, __webpack_require__) => {
"use strict";
/* __next_internal_client_entry_do_not_use__ cjs */
Object.defineProperty(exports, "__esModule", {
@@ -23,22 +236,22 @@
return useLinkStatus;
},
});
- const _interop_require_wildcard = __webpack_require__(8781);
+ const _interop_require_wildcard = __webpack_require__(1162);
const _jsxruntime = __webpack_require__(3108);
const _react = /*#__PURE__*/ _interop_require_wildcard._(
__webpack_require__(4312)
);
- const _resolvehref = __webpack_require__(4055);
- const _islocalurl = __webpack_require__(7175);
- const _formaturl = __webpack_require__(9674);
- const _utils = __webpack_require__(7424);
- const _addlocale = __webpack_require__(589);
- const _routercontextsharedruntime = __webpack_require__(7010);
- const _useintersection = __webpack_require__(2330);
- const _getdomainlocale = __webpack_require__(7207);
- const _addbasepath = __webpack_require__(9942);
- const _usemergedref = __webpack_require__(8067);
- const _erroronce = __webpack_require__(1945);
+ const _resolvehref = __webpack_require__(4691);
+ const _islocalurl = __webpack_require__(4763);
+ const _formaturl = __webpack_require__(3246);
+ const _utils = __webpack_require__(7372);
+ const _addlocale = __webpack_require__(1809);
+ const _routercontextsharedruntime = __webpack_require__(2254);
+ const _useintersection = __webpack_require__(2774);
+ const _getdomainlocale = __webpack_require__(8803);
+ const _addbasepath = __webpack_require__(5834);
+ const _usemergedref = __webpack_require__(3351);
+ const _erroronce = __webpack_require__(6021);
const prefetched = new Set();
function prefetch(router, href, as, options) {
if (false) {
@@ -417,168 +630,43 @@
/***/
},
- /***/ 1945: /***/ (__unused_webpack_module, exports) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "errorOnce", {
- enumerable: true,
- get: function () {
- return errorOnce;
+ /***/ 5326: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/link",
+ function () {
+ return __webpack_require__(9058);
},
- });
- let errorOnce = (_) => {};
+ ]);
if (false) {
- } //# sourceMappingURL=error-once.js.map
+ }
/***/
},
- /***/ 2330: /***/ (module, exports, __webpack_require__) => {
+ /***/ 6021: /***/ (__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
- Object.defineProperty(exports, "useIntersection", {
+ Object.defineProperty(exports, "errorOnce", {
enumerable: true,
get: function () {
- return useIntersection;
+ return errorOnce;
},
});
- const _react = __webpack_require__(4312);
- const _requestidlecallback = __webpack_require__(601);
- const hasIntersectionObserver =
- typeof IntersectionObserver === "function";
- const observers = new Map();
- const idList = [];
- function createObserver(options) {
- const id = {
- root: options.root || null,
- margin: options.rootMargin || "",
- };
- const existing = idList.find(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- let instance;
- if (existing) {
- instance = observers.get(existing);
- if (instance) {
- return instance;
- }
- }
- const elements = new Map();
- const observer = new IntersectionObserver((entries) => {
- entries.forEach((entry) => {
- const callback = elements.get(entry.target);
- const isVisible =
- entry.isIntersecting || entry.intersectionRatio > 0;
- if (callback && isVisible) {
- callback(isVisible);
- }
- });
- }, options);
- instance = {
- id,
- observer,
- elements,
- };
- idList.push(id);
- observers.set(id, instance);
- return instance;
- }
- function observe(element, callback, options) {
- const { id, observer, elements } = createObserver(options);
- elements.set(element, callback);
- observer.observe(element);
- return function unobserve() {
- elements.delete(element);
- observer.unobserve(element);
- // Destroy observer when there's nothing left to watch:
- if (elements.size === 0) {
- observer.disconnect();
- observers.delete(id);
- const index = idList.findIndex(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- if (index > -1) {
- idList.splice(index, 1);
- }
- }
- };
- }
- function useIntersection({ rootRef, rootMargin, disabled }) {
- const isDisabled = disabled || !hasIntersectionObserver;
- const [visible, setVisible] = (0, _react.useState)(false);
- const elementRef = (0, _react.useRef)(null);
- const setElement = (0, _react.useCallback)((element) => {
- elementRef.current = element;
- }, []);
- (0, _react.useEffect)(() => {
- if (hasIntersectionObserver) {
- if (isDisabled || visible) return;
- const element = elementRef.current;
- if (element && element.tagName) {
- const unobserve = observe(
- element,
- (isVisible) => isVisible && setVisible(isVisible),
- {
- root: rootRef?.current,
- rootMargin,
- }
- );
- return unobserve;
- }
- } else {
- if (!visible) {
- const idleCallback = (0,
- _requestidlecallback.requestIdleCallback)(() => setVisible(true));
- return () =>
- (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
- }
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
- const resetVisible = (0, _react.useCallback)(() => {
- setVisible(false);
- }, []);
- return [setElement, visible, resetVisible];
- }
- 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-intersection.js.map
-
- /***/
- },
-
- /***/ 4972: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/link",
- function () {
- return __webpack_require__(7600);
- },
- ]);
+ let errorOnce = (_) => {};
if (false) {
- }
+ } //# sourceMappingURL=error-once.js.map
/***/
},
- /***/ 7207: /***/ (module, exports, __webpack_require__) => {
+ /***/ 8803: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -590,7 +678,7 @@
return getDomainLocale;
},
});
- const _normalizetrailingslash = __webpack_require__(151);
+ const _normalizetrailingslash = __webpack_require__(1315);
const basePath =
/* unused pure expression or super */ null && (false || "");
function getDomainLocale(path, locale, locales, domainLocales) {
@@ -614,7 +702,7 @@
/***/
},
- /***/ 7600: /***/ (
+ /***/ 9058: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -629,7 +717,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(7830);
+ __webpack_require__(3440);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -659,101 +747,13 @@
/***/
},
-
- /***/ 7830: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(857);
-
- /***/
- },
-
- /***/ 8067: /***/ (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__(4312);
- 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
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4972)
+ __webpack_exec__(5326)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for routerDirect-HASH.js
@@ -1,17 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[188],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 1640: /***/ (
+ /***/ 2014: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -46,7 +36,17 @@
/***/
},
- /***/ 2172: /***/ (
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
+
+ /***/ 4414: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -54,7 +54,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/routerDirect",
function () {
- return __webpack_require__(1640);
+ return __webpack_require__(2014);
},
]);
if (false) {
@@ -68,7 +68,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2172)
+ __webpack_exec__(4414)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for script-HASH.js
@@ -1,17 +1,34 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[1209],
{
- /***/ 4977: /***/ (
+ /***/ 2591: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(326);
+ module.exports = __webpack_require__(4634);
/***/
},
- /***/ 5887: /***/ (
+ /***/ 5030: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/script",
+ function () {
+ return __webpack_require__(7557);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7557: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +43,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(4977);
+ __webpack_require__(2591);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -58,30 +75,13 @@
/***/
},
-
- /***/ 6268: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/script",
- function () {
- return __webpack_require__(5887);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6268)
+ __webpack_exec__(5030)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for withRouter-HASH.js
@@ -1,34 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3263],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 2028: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/withRouter",
- function () {
- return __webpack_require__(4501);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 4501: /***/ (
+ /***/ 559: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
/***/
},
+
+ /***/ 726: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/withRouter",
+ function () {
+ return __webpack_require__(559);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2028)
+ __webpack_exec__(726)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for 2161-HASH.js
Diff too large to display
Diff for 2747-HASH.js
Diff too large to display
Diff for 4322-HASH.js
failed to diffDiff for main-HASH.js
Diff too large to display
| ) -> anyhow::Result<()> { | ||
| let write_file = |f| { | ||
| fs.write_link( | ||
| fs.write_symbolic_link_dir( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The test test_write_link_effect attempts to create a symbolic link to a file with LinkType::empty(), but the new validation code (lines 1059-1066) explicitly rejects all non-directory symlinks, causing this test to fail.
View Details
📝 Patch Details
diff --git a/turbopack/crates/turbo-tasks-fs/src/lib.rs b/turbopack/crates/turbo-tasks-fs/src/lib.rs
index 03ff6f0b75..ce7c87f91b 100644
--- a/turbopack/crates/turbo-tasks-fs/src/lib.rs
+++ b/turbopack/crates/turbo-tasks-fs/src/lib.rs
@@ -2945,20 +2945,6 @@ mod tests {
path: FileSystemPath,
target: RcStr,
) -> anyhow::Result<()> {
- let write_file = |f| {
- fs.write_symbolic_link_dir(
- f,
- LinkContent::Link {
- target: format!("{target}/data.txt").into(),
- link_type: LinkType::empty(),
- }
- .cell(),
- )
- };
- // Write it twice (same content)
- write_file(path.join("symlink-file")?).await?;
- write_file(path.join("symlink-file")?).await?;
-
let write_dir = |f| {
fs.write_symbolic_link_dir(
f,
@@ -3009,7 +2995,6 @@ mod tests {
write_result.read_strongly_consistent().await?;
apply_effects(write_result).await?;
- assert_eq!(read_to_string(path.join("symlink-file")).unwrap(), "foo");
assert_eq!(
read_to_string(path.join("symlink-dir/data.txt")).unwrap(),
"foo"
@@ -3020,7 +3005,6 @@ mod tests {
write_result.read_strongly_consistent().await?;
apply_effects(write_result).await?;
- assert_eq!(read_to_string(path.join("symlink-file")).unwrap(), "bar");
assert_eq!(
read_to_string(path.join("symlink-dir/data.txt")).unwrap(),
"bar"
Analysis
Test test_write_link_effect fails due to file symlink validation rejection
What fails: The test function test_write_link_effect() attempts to create file symlinks with LinkType::empty(), but the validation code in write_symbolic_link_dir() (lines 1059-1066) explicitly rejects all symlinks without the DIRECTORY flag.
How to reproduce:
cd turbopack/crates/turbo-tasks-fs
cargo test --lib test_write_linkResult: Test panics with error:
Only symbolic links to directories are supported, to ensure cross-platform compatibility with Windows junction points
Expected behavior: Test should pass, as only directory symlinks are now supported. The validation intentionally restricts symlinks to directories only, because Windows junction points (used for cross-platform compatibility) can only point to directories.
Fix implemented: Removed the file symlink test case from test_write_link_effect() function (lines 2942-2960) and corresponding assertions in the test (lines 3009 and 3019). The test now only creates and verifies directory symlinks, which aligns with the new validation constraints.
| throw e | ||
| } catch (err: any) { | ||
| // Windows doesn't support creating symlinks without elevated privileges, unless | ||
| // "Developer Mode" is turned on. If we failed to crate a symlink due to EPERM, try |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo in comment: "crate" should be "create". While this is just a comment, it should be fixed for clarity.
Fix:
// Windows doesn't support creating symlinks without elevated privileges, unless
// "Developer Mode" is turned on. If we failed to create a symlink due to EPERM, try| // "Developer Mode" is turned on. If we failed to crate a symlink due to EPERM, try | |
| // "Developer Mode" is turned on. If we failed to create a symlink due to EPERM, try |
Spotted by Graphite Agent
Is this helpful? React 👍 or 👎 to let us know.
| // TODO(bgw): Is this logic correct? This might give us `is_equal = false` when it | ||
| // shouldn't, and cause us to do extra work. | ||
| // - `old_content` may have windows path separators, but `LinkContent` normalizes | ||
| // them. | ||
| // - Windows junction points are always transformed to absolute before being stored. | ||
| // - `LinkContent`'s target field stores absolute paths as relative to the project | ||
| // root, but `old_target` is relative to the real filesystem's root. | ||
| // We should compute the final target `Path` first, and then it with that value, not | ||
| // the normalized format stored in |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, sounds like your concerns are valid here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll make a follow-up PR for that
CodSpeed Performance ReportMerging #87606 will not alter performanceComparing Summary
Footnotes
|
) Next 16.1 changed Turbopack's external packaging to use symlinks. Symlinks require elevated privileges on Windows if "Developer Mode" is not enabled. We can work around this by using junction points, which are mostly equivalent, but: - They only work with directories. - They can only point to absolute paths, not relative paths. Fixes #87334 Fixes #87607 Fixes #87603 Fixes #87605 Fixes #87559 Fixes #87604 Fixes #87601 Fixes #87599 Fixes #87598 Fixes #87596 Fixes #87595 Fixes #87592 Fixes #87590 Fixes #87589 Fixes #87473 Fixes #87586 Fixes #87585 Fixes #87584 Fixes #87583 Fixes #87582 Fixes #87576 Fixes #87575 Fixes #87574 Fixes #87573 Fixes #87572 Fixes #87571 Fixes #87568 ... and many more Also: Fixes #69858 (related issue about `output: 'standalone'` on Windows. ## Testing - Disable Developer Mode on Windows, reboot, and then verify that symlink creation fails. - Make a payload app with `pnpx create-payload-app` (just pick sqlite for the database when prompted), and then update the app with `pnpx @next/codemod upgrade 16.1.0`. - Add `output: 'standalone'` to the `next.config.js`. - Try running `pnpm build` --------- Co-authored-by: Tobias Koppers <[email protected]>
) Next 16.1 changed Turbopack's external packaging to use symlinks. Symlinks require elevated privileges on Windows if "Developer Mode" is not enabled. We can work around this by using junction points, which are mostly equivalent, but: - They only work with directories. - They can only point to absolute paths, not relative paths. Fixes #87334 Fixes #87607 Fixes #87603 Fixes #87605 Fixes #87559 Fixes #87604 Fixes #87601 Fixes #87599 Fixes #87598 Fixes #87596 Fixes #87595 Fixes #87592 Fixes #87590 Fixes #87589 Fixes #87473 Fixes #87586 Fixes #87585 Fixes #87584 Fixes #87583 Fixes #87582 Fixes #87576 Fixes #87575 Fixes #87574 Fixes #87573 Fixes #87572 Fixes #87571 Fixes #87568 ... and many more Also: Fixes #69858 (related issue about `output: 'standalone'` on Windows. ## Testing - Disable Developer Mode on Windows, reboot, and then verify that symlink creation fails. - Make a payload app with `pnpx create-payload-app` (just pick sqlite for the database when prompted), and then update the app with `pnpx @next/codemod upgrade 16.1.0`. - Add `output: 'standalone'` to the `next.config.js`. - Try running `pnpm build` --------- Co-authored-by: Tobias Koppers <[email protected]>
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [eslint-config-next](https://nextjs.org/docs/app/api-reference/config/eslint) ([source](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next)) | [`16.0.7` -> `16.1.1`](https://renovatebot.com/diffs/npm/eslint-config-next/16.0.7/16.1.1) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>vercel/next.js (eslint-config-next)</summary> ### [`v16.1.1`](https://github.com/vercel/next.js/releases/tag/v16.1.1) [Compare Source](https://github.com/vercel/next.js/compare/v16.1.0...v16.1.1) > \[!NOTE] > This release is backporting bug fixes. It does **not** include all pending features/changes on canary. ##### Core Changes - Turbopack: Create junction points instead of symlinks on Windows ([#​87606](https://github.com/vercel/next.js/issues/87606)) ##### Credits Huge thanks to [@​sokra](https://github.com/sokra) and [@​ztanner](https://github.com/ztanner) for helping! ### [`v16.1.0`](https://github.com/vercel/next.js/releases/tag/v16.1.0) [Compare Source](https://github.com/vercel/next.js/compare/v16.0.10...v16.1.0) > \[!TIP]\ > **Check out our Next v16.1 [Blog Post](https://nextjs.org/blog/next-16-1) to learn more about this release.** ##### Core Changes - fix: Rspack throw error when using ForceCompleteRuntimePlugin: [#​85221](https://github.com/vercel/next.js/issues/85221) - fix: build CLI output not displaying Proxy (Middleware) when nodejs runtime: [#​85403](https://github.com/vercel/next.js/issues/85403) - fix: staleTimes.static should consistently enforce a 30s minimum: [#​85479](https://github.com/vercel/next.js/issues/85479) - \[turbopack] fix build of empty entries of pages: [#​84873](https://github.com/vercel/next.js/issues/84873) - Cache the head separately from the route tree: [#​84724](https://github.com/vercel/next.js/issues/84724) - Allow inspecting dev server on default port with `next dev --inspect`: [#​85037](https://github.com/vercel/next.js/issues/85037) - Avoid proxying React modules through workUnitStore: [#​85486](https://github.com/vercel/next.js/issues/85486) - fix: redirect should always return updated router state: [#​85533](https://github.com/vercel/next.js/issues/85533) - Upgrade React from `b4455a6e-20251027` to `4f931700-20251029`: [#​85518](https://github.com/vercel/next.js/issues/85518) - \[turbopack] Move generation of `cacheLife` types out of the webpack plugin and into the dev bundler directly: [#​85539](https://github.com/vercel/next.js/issues/85539) - Ensure user-space stack frame for `'use cache'` in page/layout component: [#​85519](https://github.com/vercel/next.js/issues/85519) - Update parallel routes in build-complete: [#​85546](https://github.com/vercel/next.js/issues/85546) - fully remove clientSegmentCache flag: [#​85541](https://github.com/vercel/next.js/issues/85541) - \[turbopack] Support relative paths in turbopack source maps.: [#​85146](https://github.com/vercel/next.js/issues/85146) - Release unnecessary memory on hydration finish: [#​84967](https://github.com/vercel/next.js/issues/84967) - Preserve interception markers in parameter types: [#​85526](https://github.com/vercel/next.js/issues/85526) - move segment cache entries to top level segment-cache dir: [#​85542](https://github.com/vercel/next.js/issues/85542) - Upgrade React from `4f931700-20251029` to `561ee24d-20251101`: [#​85670](https://github.com/vercel/next.js/issues/85670) - \[devtools] Remove title from preferences: [#​85698](https://github.com/vercel/next.js/issues/85698) - Update font data: [#​85708](https://github.com/vercel/next.js/issues/85708) - Don't invalidate hot reloader excessively during dev server boot: [#​85732](https://github.com/vercel/next.js/issues/85732) - \[codemod] fix: next-lint-to-eslint-cli did not handle `'next'` plugin: [#​85749](https://github.com/vercel/next.js/issues/85749) - Upgrade React from `561ee24d-20251101` to `67f7d47a-20251103`: [#​85762](https://github.com/vercel/next.js/issues/85762) - Tracing: Fix memory leak in span map: [#​85529](https://github.com/vercel/next.js/issues/85529) - Fix documentation typo in refresh function: [#​85696](https://github.com/vercel/next.js/issues/85696) - fix: eslint-config-next types was exporting to dist/src: [#​85768](https://github.com/vercel/next.js/issues/85768) - Upgrade React from `67f7d47a-20251103` to `f646e8ff-20251104`: [#​85772](https://github.com/vercel/next.js/issues/85772) - remove unused RSC payload property: [#​85746](https://github.com/vercel/next.js/issues/85746) - \[runtime prefetching]: fix runtime prefetching when deployed: [#​85595](https://github.com/vercel/next.js/issues/85595) - Turbopack: next build --analyze: [#​85197](https://github.com/vercel/next.js/issues/85197) - Build: Log amount of workers during static generation: [#​85706](https://github.com/vercel/next.js/issues/85706) - Upgrade React from `f646e8ff-20251104` to `dd048c3b-20251105`: [#​85819](https://github.com/vercel/next.js/issues/85819) - Sync devFallbackParams when generateStaticParams change: [#​85741](https://github.com/vercel/next.js/issues/85741) - chore: upgrade rspack 1.6.0: [#​84210](https://github.com/vercel/next.js/issues/84210) - \[mcp] get\_routes mcp tool: [#​85773](https://github.com/vercel/next.js/issues/85773) - Split each path param into a separate cache key : [#​85758](https://github.com/vercel/next.js/issues/85758) - \[turbopack] change server source maps in production to use relative paths: [#​85576](https://github.com/vercel/next.js/issues/85576) - fix: skip collecting metadata for app-error in webpack: [#​85892](https://github.com/vercel/next.js/issues/85892) - fix: support root span attributes with a custom server: [#​85521](https://github.com/vercel/next.js/issues/85521) - fix isDynamicRSC condition when deployed: [#​85919](https://github.com/vercel/next.js/issues/85919) - \[turbopack] Make it possible to synchronously access native bindings: [#​85787](https://github.com/vercel/next.js/issues/85787) - Upgrade React from `dd048c3b-20251105` to `fa50caf5-20251107`: [#​85906](https://github.com/vercel/next.js/issues/85906) - Fix telemetry event loss on build failures and server shutdown: [#​85867](https://github.com/vercel/next.js/issues/85867) - Remove one stack frame from `'use cache'` call stacks: [#​85966](https://github.com/vercel/next.js/issues/85966) - Upgrade React from `fa50caf5-20251107` to `52684925-20251110`: [#​85980](https://github.com/vercel/next.js/issues/85980) - Deployment adapter: fix metadata for "/" route: [#​85820](https://github.com/vercel/next.js/issues/85820) - Enable React's default Transition indicator behind a flag: [#​86000](https://github.com/vercel/next.js/issues/86000) - update routes-manifest to include whether app has pages routes: [#​86051](https://github.com/vercel/next.js/issues/86051) - Fix 404 responses for interception routes with missing children slots: [#​85779](https://github.com/vercel/next.js/issues/85779) - Build: Share StaticWorker between static check and static generation: [#​85860](https://github.com/vercel/next.js/issues/85860) - \[devtool] highlight all link in error message: [#​86084](https://github.com/vercel/next.js/issues/86084) - fix(nodejs-middleware): await for body cloning to be properly finalized: [#​85418](https://github.com/vercel/next.js/issues/85418) - Add build-time validation to detect ambiguous app routes: [#​85834](https://github.com/vercel/next.js/issues/85834) - Don't use inspector frontend URLs from other processes: [#​86082](https://github.com/vercel/next.js/issues/86082) - Upgrade React from `52684925-20251110` to `93fc5740-20251113`: [#​86103](https://github.com/vercel/next.js/issues/86103) - \[next-upgrade] Force install of dev dependencies: [#​86119](https://github.com/vercel/next.js/issues/86119) - Fix telemetry event race condition in webpack worker for [@​vercel/og](https://github.com/vercel/og) detection: [#​86145](https://github.com/vercel/next.js/issues/86145) - Turbopack: Add bundle analyzer UI to next build --experimental-analyze: [#​85788](https://github.com/vercel/next.js/issues/85788) - Upgrade React from `93fc5740-20251113` to `fb2177c1-20251114`: [#​86155](https://github.com/vercel/next.js/issues/86155) - fix: cacheMaxMemorySize should not disable dev HMR cache: [#​86164](https://github.com/vercel/next.js/issues/86164) - Fix streaming server actions: [#​86148](https://github.com/vercel/next.js/issues/86148) - Allow attaching a debugger when `next dev` is already running: [#​86083](https://github.com/vercel/next.js/issues/86083) - Introduce `next analyze`: a built-in bundle analyzer for Turbopack: [#​85915](https://github.com/vercel/next.js/issues/85915) - Turbopack: add `experimental.turbopackClient/ServerSideNestedAsyncChunking`: [#​85827](https://github.com/vercel/next.js/issues/85827) - next analyze: annotate polyfill modules in UI: [#​86062](https://github.com/vercel/next.js/issues/86062) - Stop adding additional padding to Next.js logs: [#​86139](https://github.com/vercel/next.js/issues/86139) - \[next-upgrade] Add `next upgrade`: [#​86120](https://github.com/vercel/next.js/issues/86120) - Fix prerendering of interception routes with generateStaticParams: [#​85835](https://github.com/vercel/next.js/issues/85835) - \[Segment Cache] Re-implement refresh reducer: [#​84426](https://github.com/vercel/next.js/issues/84426) - Upgrade React from `fb2177c1-20251114` to `0972e239-20251118`: [#​86263](https://github.com/vercel/next.js/issues/86263) - `next analyze`: Make ipv6 server links valid and normalize localhost: [#​86219](https://github.com/vercel/next.js/issues/86219) - fix: prevent fetch abort errors propagating to user error boundaries: [#​86277](https://github.com/vercel/next.js/issues/86277) - chore(turbopack-node): remove some outdated codes: [#​86111](https://github.com/vercel/next.js/issues/86111) - \[devtools] Ensure Chrome DevTools workspace can connect with proxy rewrites: [#​86289](https://github.com/vercel/next.js/issues/86289) - Fix log log alignment in spinners: [#​86298](https://github.com/vercel/next.js/issues/86298) - fix: Rename proxy.js to middleware.js in NFT file: [#​86214](https://github.com/vercel/next.js/issues/86214) - Turbopack: allow trace level tracing: [#​86255](https://github.com/vercel/next.js/issues/86255) - Allow SSR to finish microtasky work before flushing: [#​86311](https://github.com/vercel/next.js/issues/86311) - Turbopack: fix passing project options from napi: [#​86256](https://github.com/vercel/next.js/issues/86256) - \[Cache Components] Atomic setTimeouts: [#​86093](https://github.com/vercel/next.js/issues/86093) - Turbopack: add experimental.turbopackInputSourceMaps and respect serverSourceMaps: [#​86340](https://github.com/vercel/next.js/issues/86340) - \[Cache Components] Discriminate static shell validation errors by type: [#​85747](https://github.com/vercel/next.js/issues/85747) - Turbopack: add NEXT\_TURBOPACK\_WRITE\_ROUTES\_HASHES\_MANIFEST to write hashes into manifest: [#​86257](https://github.com/vercel/next.js/issues/86257) - Add reasons for some server-external-packages: [#​86254](https://github.com/vercel/next.js/issues/86254) - Send dynamic validation errors to browser via WebSocket: [#​85818](https://github.com/vercel/next.js/issues/85818) - Delete un-used prefetch outputs with PPR: [#​86100](https://github.com/vercel/next.js/issues/86100) - Revert "Turbopack: add bundle-analyzer to versioning and add dependen…: [#​86394](https://github.com/vercel/next.js/issues/86394) - Turbopack: add bundle-analyzer to versioning and add dependency: [#​86355](https://github.com/vercel/next.js/issues/86355) - fix issue - [#​86365](https://github.com/vercel/next.js/issues/86365): [#​86366](https://github.com/vercel/next.js/issues/86366) - Turbopack: fix import chain by determining depth locally per route: [#​86350](https://github.com/vercel/next.js/issues/86350) - Use JSONC for default server-external-packages: [#​86252](https://github.com/vercel/next.js/issues/86252) - add debug logs to onSegmentPrerenderError: [#​86358](https://github.com/vercel/next.js/issues/86358) - Skip request if "full" prefetch is already pending: [#​86405](https://github.com/vercel/next.js/issues/86405) - fix: Rename proxy.js to middleware.js in NFT file ([#​86214](https://github.com/vercel/next.js/issues/86214)) - fix: prevent fetch abort errors propagating to user error boundaries ([#​86277](https://github.com/vercel/next.js/issues/86277)) - Turbopack: fix passing project options from napi ([#​86256](https://github.com/vercel/next.js/issues/86256)) - Eslint: Improve Google Tag manager third parties message: [#​51903](https://github.com/vercel/next.js/issues/51903) - \[ts-plugin] keep showing the types in the function body: [#​86273](https://github.com/vercel/next.js/issues/86273) - \[turbopack] Enable the filesystem cache for dev in canary builds: [#​85940](https://github.com/vercel/next.js/issues/85940) - docs: fix typos in packages: [#​82508](https://github.com/vercel/next.js/issues/82508) - Turbopack: Expose an environment variable for exposing the `detail` field of issues: [#​86518](https://github.com/vercel/next.js/issues/86518) - Turbopack: inner graph tree shaking: [#​85973](https://github.com/vercel/next.js/issues/85973) - \[next-upgrade] Fall back to `npx` if `yarn dlx` is not available: [#​86384](https://github.com/vercel/next.js/issues/86384) - Update font data: [#​86521](https://github.com/vercel/next.js/issues/86521) - Convert any export from a `'use cache'` module to a cache function: [#​86014](https://github.com/vercel/next.js/issues/86014) - fix(nodejs-middleware): await for body cloning to be properly finalized ([#​85418](https://github.com/vercel/next.js/issues/85418)) - Fix stale dev types causing build failure after route deletion: [#​86489](https://github.com/vercel/next.js/issues/86489) - bump the browserslist version to silence a warning in CI ([#​86625](https://github.com/vercel/next.js/issues/86625)) - add bundle analyzer as dev dependency to next: [#​86497](https://github.com/vercel/next.js/issues/86497) - Remove obsolete `setReferenceManifestsSingleton` call: [#​86574](https://github.com/vercel/next.js/issues/86574) - Add flag to show ignore listed frames: [#​86285](https://github.com/vercel/next.js/issues/86285) - Add alinea to server-external-packages.json: [#​55006](https://github.com/vercel/next.js/issues/55006) - Fix error logging for `'use cache'` runtime errors in production: [#​86500](https://github.com/vercel/next.js/issues/86500) - Upgrade React from `8ac5f4eb-20251119` to `fd524fe0-20251121`: [#​86473](https://github.com/vercel/next.js/issues/86473) - Add "[@​zenstackhq/runtime](https://github.com/zenstackhq/runtime)" to server-external-packages.json: [#​54829](https://github.com/vercel/next.js/issues/54829) - \[Cache Components] Ensure cache misses always cause a restart in dev: [#​86583](https://github.com/vercel/next.js/issues/86583) - bump the browserslist version to silence a warning in CI: [#​86625](https://github.com/vercel/next.js/issues/86625) - Turbopack: import to `char` not replaced: [#​86573](https://github.com/vercel/next.js/issues/86573) - Revert "add bundle analyzer as dev dependency to next ([#​86497](https://github.com/vercel/next.js/issues/86497))": [#​86672](https://github.com/vercel/next.js/issues/86672) - Handle cross-page client reference contamination in development: [#​86591](https://github.com/vercel/next.js/issues/86591) - Match behavior of baseline-browser-mapping with caniuse-lite: [#​86653](https://github.com/vercel/next.js/issues/86653) - Turbopack: don't generateBuildId in dev: [#​86581](https://github.com/vercel/next.js/issues/86581) - \[devtool] unify the bundler field: [#​86514](https://github.com/vercel/next.js/issues/86514) - Turbopack: normalize distDir separators: [#​86697](https://github.com/vercel/next.js/issues/86697) - Cover org package external in externals-transitive test: [#​86691](https://github.com/vercel/next.js/issues/86691) - \[turbopack] Enable filesystem cache by default for development: [#​85975](https://github.com/vercel/next.js/issues/85975) - Log generate params duration in dev: [#​86726](https://github.com/vercel/next.js/issues/86726) - \[CC] Fix hanging dynamic promise when abandoning render: [#​86690](https://github.com/vercel/next.js/issues/86690) - Convert Windows paths as well when reading sourcemap: [#​86723](https://github.com/vercel/next.js/issues/86723) - Deterministic functions-config-manifest.json: [#​86736](https://github.com/vercel/next.js/issues/86736) - Abstract deployment id access into module: [#​86727](https://github.com/vercel/next.js/issues/86727) - Deterministically order pages in the `MappedPages` structure: [#​86744](https://github.com/vercel/next.js/issues/86744) - \[turbopack] move edge entry wrapper to build template: [#​86699](https://github.com/vercel/next.js/issues/86699) - Properly type ComponentMod: [#​86765](https://github.com/vercel/next.js/issues/86765) - Properly type edge handler fn: [#​86766](https://github.com/vercel/next.js/issues/86766) - Remove unused Server.responseCache: [#​86768](https://github.com/vercel/next.js/issues/86768) - \[Cache Components] Fast setImmediate: [#​86018](https://github.com/vercel/next.js/issues/86018) - \[devtool] make the draggable content selective: [#​86816](https://github.com/vercel/next.js/issues/86816) - Create server module map proxy only once: [#​86750](https://github.com/vercel/next.js/issues/86750) - fix(next/image): add `?dpl` query string for local images (without static import): [#​86485](https://github.com/vercel/next.js/issues/86485) - fix(next/image): handle `?dpl` for src without protocol: [#​86836](https://github.com/vercel/next.js/issues/86836) - Upgrade React from `7dc903cd-20251203` to `66ae640b-20251204`: [#​86843](https://github.com/vercel/next.js/issues/86843) - Upgrade React from `66ae640b-20251204` to `378973b3-20251205`: [#​86852](https://github.com/vercel/next.js/issues/86852) - Turbopack: remove pages router double template: [#​86842](https://github.com/vercel/next.js/issues/86842) - Introduce NextConfigRuntime: [#​86812](https://github.com/vercel/next.js/issues/86812) - Generate required-server-files before prerendering: [#​86830](https://github.com/vercel/next.js/issues/86830) - Update react version in cna templates ([#​86950](https://github.com/vercel/next.js/issues/86950)) - Include nextConfig in edge runtime via separate manifest: [#​86769](https://github.com/vercel/next.js/issues/86769) - Fix required-server-files: [#​86875](https://github.com/vercel/next.js/issues/86875) - Add pino-related packages to server-external-packages: [#​86884](https://github.com/vercel/next.js/issues/86884) - Fix validateTurboNextConfig running for next start: [#​86886](https://github.com/vercel/next.js/issues/86886) - Add experimental.runtimeServerDeploymentId: [#​86865](https://github.com/vercel/next.js/issues/86865) - \[turbopack] Mark packages as side effect free when local analysis determines that they are.: [#​86398](https://github.com/vercel/next.js/issues/86398) - Fix: Missing null check in LRU cleanup: [#​87124](https://github.com/vercel/next.js/issues/87124) - improve segment cache lru typesafety: [#​87129](https://github.com/vercel/next.js/issues/87129) - \[Segment Cache] Detect third-party redirect + static export w/ HEAD request: [#​85910](https://github.com/vercel/next.js/issues/85910) - Fix: External redirect swallowed by Next.js: [#​87121](https://github.com/vercel/next.js/issues/87121) - Fix error propagation and teardown in Server Action request decoding: [#​87193](https://github.com/vercel/next.js/issues/87193) - Fix interception routes with trailing slash configuration: [#​86787](https://github.com/vercel/next.js/issues/86787) - \[ci] Stop building when creating release: [#​87178](https://github.com/vercel/next.js/issues/87178) - fix: otel error spans from streamed responses: [#​86955](https://github.com/vercel/next.js/issues/86955) - Refactor: Unify history traversal with other nav types: [#​87128](https://github.com/vercel/next.js/issues/87128) - Create initial tree using same function as navigations: [#​87147](https://github.com/vercel/next.js/issues/87147) - Re-implement hmr-refresh in terms of refresh: [#​87135](https://github.com/vercel/next.js/issues/87135) - Delete old navigation response handling implementation: [#​87149](https://github.com/vercel/next.js/issues/87149) - Reflect runtime type of `resHeaders` in static types: [#​87145](https://github.com/vercel/next.js/issues/87145) - \[turbopack] Flag `turbopackInferModuleSideEffects` so it is only enabled in canary builds: [#​87215](https://github.com/vercel/next.js/issues/87215) - \[turbopack] update warning message in the bundle analyzer: [#​87255](https://github.com/vercel/next.js/issues/87255) - chore: update rspack 1.6.5: [#​86853](https://github.com/vercel/next.js/issues/86853) - Update font data: [#​87259](https://github.com/vercel/next.js/issues/87259) - bundle-analyzer: make running the web server default: [#​87258](https://github.com/vercel/next.js/issues/87258) - bundle analyzer: remove custom output option: [#​87267](https://github.com/vercel/next.js/issues/87267) - Ensure constructor for `useSearchParams` can be imported for `instanceof` checks: [#​87269](https://github.com/vercel/next.js/issues/87269) - Upgrade React from `b45bb335-20251211` to `f93b9fd4-20251217`: [#​87281](https://github.com/vercel/next.js/issues/87281) - feat: use Rspack persistent cache by default: [#​81399](https://github.com/vercel/next.js/issues/81399) - Move next-env.d.ts to dist dir: [#​86752](https://github.com/vercel/next.js/issues/86752) - Revert "Move next-env.d.ts to dist dir": [#​87311](https://github.com/vercel/next.js/issues/87311) ##### Example Changes - Chore: Update with-supabase example to Next.js 16: [#​86105](https://github.com/vercel/next.js/issues/86105) - docs: add example for enabling both AVIF and WebP image formats for better image optimization: [#​86191](https://github.com/vercel/next.js/issues/86191) - examples: fix typos: [#​82506](https://github.com/vercel/next.js/issues/82506) - chore(examples): remove `with-windicss` example: [#​81846](https://github.com/vercel/next.js/issues/81846) - examples: fix typos in cms-agilitycms: [#​82504](https://github.com/vercel/next.js/issues/82504) - Turbopack: Improve the description on InvalidLoaderRuleConditionIssue: [#​87008](https://github.com/vercel/next.js/issues/87008) ##### Misc Changes - chore: Add `opt-level = s` for not frequently used crates: [#​85426](https://github.com/vercel/next.js/issues/85426) - \[test] Deflake cache-components-allow-otel-spans: [#​85466](https://github.com/vercel/next.js/issues/85466) - \[test] Move remaining `experimental.cacheLife`: [#​85467](https://github.com/vercel/next.js/issues/85467) - Turbopack: chore: Remove mopa dependency in turbo-tasks (2nd attempt): [#​85286](https://github.com/vercel/next.js/issues/85286) - Update Proxy docs: [#​85439](https://github.com/vercel/next.js/issues/85439) - \[CNA] Do not prompt for Turbopack: [#​85404](https://github.com/vercel/next.js/issues/85404) - Clean up new release process: [#​85458](https://github.com/vercel/next.js/issues/85458) - Update E2E tests workflow: [#​85485](https://github.com/vercel/next.js/issues/85485) - Update E2E deploy tests manifest: [#​85483](https://github.com/vercel/next.js/issues/85483) - docs: example are incorrect async function exports only: [#​85453](https://github.com/vercel/next.js/issues/85453) - \[test] Handle CLI assertions where no "Compiling..." log is present: [#​85499](https://github.com/vercel/next.js/issues/85499) - \[test] Speed up refresh test: [#​85505](https://github.com/vercel/next.js/issues/85505) - \[test] Add test cases for dynamic caches without suspense boundaries: [#​85500](https://github.com/vercel/next.js/issues/85500) - docs: Routes are wrapped w/ Activity in Cache Components: [#​85309](https://github.com/vercel/next.js/issues/85309) - docs: GET handler behavior under cache components: [#​85389](https://github.com/vercel/next.js/issues/85389) - \[test] Avoid needless start/stop from using `createSandbox`: [#​85507](https://github.com/vercel/next.js/issues/85507) - \[test] Use `--debug-build-paths` instead of `NEXT_PRIVATE_APP_PATHS`: [#​85504](https://github.com/vercel/next.js/issues/85504) - docs: revalidateTag requires second argument: [#​85284](https://github.com/vercel/next.js/issues/85284) - Refactor GTM implementation to support google tag gateway: [#​81011](https://github.com/vercel/next.js/issues/81011) - Update Rspack production test manifest: [#​85494](https://github.com/vercel/next.js/issues/85494) - Update Rspack development test manifest: [#​85495](https://github.com/vercel/next.js/issues/85495) - \[docs] Fix a typo: [#​85492](https://github.com/vercel/next.js/issues/85492) - \[test] Regenerate tsconfig.json files: [#​85515](https://github.com/vercel/next.js/issues/85515) - \[Turbopack] clean up `completion.rs` a bit: [#​84863](https://github.com/vercel/next.js/issues/84863) - \[test] Remove `maxRetries` and `hardError` parameters: [#​85536](https://github.com/vercel/next.js/issues/85536) - Turbopack: remove the .into() alias to .cell(): [#​85516](https://github.com/vercel/next.js/issues/85516) - \[test] Consolidate identical snapshots across different bundlers: [#​85532](https://github.com/vercel/next.js/issues/85532) - \[turbopack] Change where `cell`s are created in `resolve_raw` to make cell allocation order deterministic.: [#​85525](https://github.com/vercel/next.js/issues/85525) - Turbopack: Make tasks deterministic: [#​85524](https://github.com/vercel/next.js/issues/85524) - \[test] Separate act and assertions: [#​85508](https://github.com/vercel/next.js/issues/85508) - \[test] `assert*` -> `waitFor*` when the util is not instant: [#​85450](https://github.com/vercel/next.js/issues/85450) - Turbopack: move whole\_app\_module\_graphs to top level: [#​84897](https://github.com/vercel/next.js/issues/84897) - \[test] Bail on sending requests to Next.js instance if it's no longer available: [#​85557](https://github.com/vercel/next.js/issues/85557) - \[test] Deflake tests comparing two random numbers: [#​85571](https://github.com/vercel/next.js/issues/85571) - \[test] Disallow custom `RegExp`-like implementations in `check`: [#​85537](https://github.com/vercel/next.js/issues/85537) - \[test] Deflake prerender suite: [#​85563](https://github.com/vercel/next.js/issues/85563) - Turbopack: chore: Remove some dead MagicAny serialization code from turbo\_tasks::value: [#​85577](https://github.com/vercel/next.js/issues/85577) - \[test]: fix broken scroll restoration test: [#​85599](https://github.com/vercel/next.js/issues/85599) - \[test] Deflake nested `after()` tests: [#​85566](https://github.com/vercel/next.js/issues/85566) - \[test] Stop installing unused dependencies: [#​85569](https://github.com/vercel/next.js/issues/85569) - \[test] Consider `test/integration/` in flake detection tests: [#​85590](https://github.com/vercel/next.js/issues/85590) - Turbopack: more checks on verify\_serialization: [#​84952](https://github.com/vercel/next.js/issues/84952) - Turbopack: add track\_caller to improve panics: [#​85565](https://github.com/vercel/next.js/issues/85565) - Turbopack: add verify\_determinism feature to check if tasks are deterministic: [#​85559](https://github.com/vercel/next.js/issues/85559) - docs: cache life rework: [#​85224](https://github.com/vercel/next.js/issues/85224) - Turbopack: fix hanging dev server and builds with fs cache: [#​85606](https://github.com/vercel/next.js/issues/85606) - Turbopack: Fix compound assignment expression evaluation ([#​85478](https://github.com/vercel/next.js/issues/85478)): [#​85593](https://github.com/vercel/next.js/issues/85593) - Turbopack: fix Scope holding Arc too long: [#​85611](https://github.com/vercel/next.js/issues/85611) - \[ci] Improve change detection logic in `run-for-change` script: [#​85619](https://github.com/vercel/next.js/issues/85619) - \[test] Ignore in deploy tests if a child process isn't available: [#​85636](https://github.com/vercel/next.js/issues/85636) - Turbopack: add size\_hint and len for Chunk iterator: [#​85622](https://github.com/vercel/next.js/issues/85622) - \[test]: move resume-data-cache to e2e test: [#​85647](https://github.com/vercel/next.js/issues/85647) - Update Rspack development test manifest: [#​85662](https://github.com/vercel/next.js/issues/85662) - Update Rspack production test manifest: [#​85661](https://github.com/vercel/next.js/issues/85661) - Update Rspack production test manifest: [#​85688](https://github.com/vercel/next.js/issues/85688) - Update Rspack development test manifest: [#​85689](https://github.com/vercel/next.js/issues/85689) - \[test] Deflake root-optional-revalidate: [#​85584](https://github.com/vercel/next.js/issues/85584) - docs: fix generateImageMetadata example to use normal params object: [#​85658](https://github.com/vercel/next.js/issues/85658) - Turbopack: Upgrade image crate: [#​85084](https://github.com/vercel/next.js/issues/85084) - docs: update multi sitemap argumenmt type: [#​85701](https://github.com/vercel/next.js/issues/85701) - \[test] Move all files to .ts (6/6): [#​85641](https://github.com/vercel/next.js/issues/85641) - Turbopack: add a batch add method to the storage: [#​84270](https://github.com/vercel/next.js/issues/84270) - docs: recommend reverse-proxy when self-hosting: [#​85650](https://github.com/vercel/next.js/issues/85650) - \[test] Deflake prefetching.stale-times: [#​85733](https://github.com/vercel/next.js/issues/85733) - \[test] Deflake custom cache handler test: [#​85610](https://github.com/vercel/next.js/issues/85610) - \[test] Allow CLI integration test to be retryable: [#​85586](https://github.com/vercel/next.js/issues/85586) - docs: update docs to mention ESLint as default: [#​85740](https://github.com/vercel/next.js/issues/85740) - docs(next.config): this docs should remove ".mts" is not supported.: [#​85716](https://github.com/vercel/next.js/issues/85716) - Turbopack: cleanup StyleSheetLike: [#​85718](https://github.com/vercel/next.js/issues/85718) - Turbopack: disable tree shaking for tracing: [#​85722](https://github.com/vercel/next.js/issues/85722) - \[test] Move all files to .ts (3/6): [#​85638](https://github.com/vercel/next.js/issues/85638) - \[test] Move all files to .ts (2/6): [#​85637](https://github.com/vercel/next.js/issues/85637) - \[test] Move all files to .ts (1/6): [#​85634](https://github.com/vercel/next.js/issues/85634) - docs: generateSitemap passes id as promise: [#​85767](https://github.com/vercel/next.js/issues/85767) - \[test] Move all files to .ts (4/6): [#​85639](https://github.com/vercel/next.js/issues/85639) - docs: disclosure on path-to-regexp: [#​85629](https://github.com/vercel/next.js/issues/85629) - chore: update rspack binding to 1.6.0: [#​85717](https://github.com/vercel/next.js/issues/85717) - Turbopack: trace worker\_threads worker entry: [#​85734](https://github.com/vercel/next.js/issues/85734) - Update Rspack development test manifest: [#​85761](https://github.com/vercel/next.js/issues/85761) - Turbopack: chore: Remove `extern crate` and `macro_use` syntax: [#​85778](https://github.com/vercel/next.js/issues/85778) - \[turbopack] Drop duration and allocation tracking from CaptureFuture: [#​85534](https://github.com/vercel/next.js/issues/85534) - Turbopack: chore: Remove dead RouteMatcher stuff: [#​85784](https://github.com/vercel/next.js/issues/85784) - docs: fresh up getting started 00: [#​85736](https://github.com/vercel/next.js/issues/85736) - Turbopack: chore: Remove the serde\_regex dependency, which wasn't very heavily used: [#​85578](https://github.com/vercel/next.js/issues/85578) - Turbopack: use batch add in connect children: [#​85623](https://github.com/vercel/next.js/issues/85623) - \[test] Move all files to .ts (5/6): [#​85640](https://github.com/vercel/next.js/issues/85640) - \[test] Deflake legacy-link-behavior: [#​85805](https://github.com/vercel/next.js/issues/85805) - Resolve request ID confusion: [#​85809](https://github.com/vercel/next.js/issues/85809) - Turbopack: use batch add to add initial followers: [#​85624](https://github.com/vercel/next.js/issues/85624) - Turbopack: chore: Remove dead experimental.ppr struct field: [#​85792](https://github.com/vercel/next.js/issues/85792) - Turbopack: chore: Avoid string clones in Glob::parse by using RcStr: [#​85579](https://github.com/vercel/next.js/issues/85579) - Update Rspack production test manifest: [#​85795](https://github.com/vercel/next.js/issues/85795) - docs: getting started updates 01: [#​85750](https://github.com/vercel/next.js/issues/85750) - chore: Update patricia\_tree dependency, remove manual serde impls: [#​85785](https://github.com/vercel/next.js/issues/85785) - docs: keywords in system reqs and add browserslist: [#​85838](https://github.com/vercel/next.js/issues/85838) - Honour `NEXT_TEST_PREFER_OFFLINE` in `install-native.mjs`: [#​85850](https://github.com/vercel/next.js/issues/85850) - Turbopack: chore: Update anyhow, remove old backtrace feature: [#​85844](https://github.com/vercel/next.js/issues/85844) - Turbopack: Remove some dead (or useless) code from `next-core/src/next_client_reference/visit_client_reference.rs`: [#​85843](https://github.com/vercel/next.js/issues/85843) - sort dependencies for smaller diffs: [#​82291](https://github.com/vercel/next.js/issues/82291) - Update Rspack development test manifest: [#​85846](https://github.com/vercel/next.js/issues/85846) - Turbopack: Remove `non_operation_vc_strongly_consistent` feature usage from next-api: [#​85874](https://github.com/vercel/next.js/issues/85874) - Turbopack: remove the streaming hack for improved stability: [#​85858](https://github.com/vercel/next.js/issues/85858) - test: Port clean-distdir integration test to the modern e2e test framework: [#​85828](https://github.com/vercel/next.js/issues/85828) - Update font data: [#​85920](https://github.com/vercel/next.js/issues/85920) - Update deploy manifest: [#​85924](https://github.com/vercel/next.js/issues/85924) - Turbopack: chore: Merge `turbo-tasks-macros-shared` crate into `turbo-tasks-macros`: [#​85917](https://github.com/vercel/next.js/issues/85917) - Turbopack: Fix IO concurrency for MacOS: [#​85861](https://github.com/vercel/next.js/issues/85861) - Add Appwrite Sites to supported adapters: [#​85830](https://github.com/vercel/next.js/issues/85830) - \[turbopack] Remove LocalTaskType::Native, it is dead: [#​85480](https://github.com/vercel/next.js/issues/85480) - \[test] Increase response timeout in `next.browserWithResponse()`: [#​85911](https://github.com/vercel/next.js/issues/85911) - Hoist inner `'use cache'` functions to reduce function allocations: [#​85904](https://github.com/vercel/next.js/issues/85904) - docs: eslint config update: [#​85969](https://github.com/vercel/next.js/issues/85969) - Fix Turbopack local font `font-family` declaration: [#​85913](https://github.com/vercel/next.js/issues/85913) - switch to slice in createRuntimePrefetchTransformStream: [#​85822](https://github.com/vercel/next.js/issues/85822) - Update authentication.mdx: Fix `Auth0` Link: [#​85953](https://github.com/vercel/next.js/issues/85953) - Turbopack: remove unused function: [#​85974](https://github.com/vercel/next.js/issues/85974) - docs: cacheHandlers: [#​85311](https://github.com/vercel/next.js/issues/85311) - docs: Feedback item on proxy default: [#​86004](https://github.com/vercel/next.js/issues/86004) - \[test] Add missing test fixtures for `cacheLife` & `cacheTag` in client: [#​85872](https://github.com/vercel/next.js/issues/85872) - Fix false-positive build error for `cacheLife` & `cacheTag`: [#​85875](https://github.com/vercel/next.js/issues/85875) - \[cna] For pnpm ignore postinstall from `sharp` and `unrs-resolver`: [#​83168](https://github.com/vercel/next.js/issues/83168) - Turbopack: refactor `evaluate` to take module\_graph: [#​85971](https://github.com/vercel/next.js/issues/85971) - Turbopack: remove duplicate traversal implementations: [#​85853](https://github.com/vercel/next.js/issues/85853) - Omit unused `encryptActionBoundArgs`/`decryptActionBoundArgs` imports: [#​86015](https://github.com/vercel/next.js/issues/86015) - Turbopack: cleanup db log and add verbose option: [#​85965](https://github.com/vercel/next.js/issues/85965) - \[ci]: fix retry\_deploy\_test workflow: [#​85981](https://github.com/vercel/next.js/issues/85981) - Fix typo in documentation: [#​86054](https://github.com/vercel/next.js/issues/86054) - perf: revert to use the light safe stringify for is-error: [#​86053](https://github.com/vercel/next.js/issues/86053) - Turbopack: expose used export info in tests: [#​86037](https://github.com/vercel/next.js/issues/86037) - Docs: Mention npm link with Turbopack root: [#​86075](https://github.com/vercel/next.js/issues/86075) - script: align the commits group logic with the origin script: [#​86079](https://github.com/vercel/next.js/issues/86079) - Update cookies.mdx: [#​86094](https://github.com/vercel/next.js/issues/86094) - Remove redundant example code for cacheLife docs: [#​86043](https://github.com/vercel/next.js/issues/86043) - test: improve router prefetch test reliability: [#​86098](https://github.com/vercel/next.js/issues/86098) - Add postpone handling in app-page handler: [#​86101](https://github.com/vercel/next.js/issues/86101) - Turbopack: remove global\_information struct: [#​86089](https://github.com/vercel/next.js/issues/86089) - Turbopack: add task\_id\_details feature: [#​84970](https://github.com/vercel/next.js/issues/84970) - Turbopack: Refactor output assets to allow to lazy compute output assets: [#​85753](https://github.com/vercel/next.js/issues/85753) - Un-skip tests in prefetch-runtime.test.ts: [#​86097](https://github.com/vercel/next.js/issues/86097) - Turbopack: add flags to AvailabilityInfo: [#​85771](https://github.com/vercel/next.js/issues/85771) - Turbopack: apply side effects false removal on all module types: [#​86133](https://github.com/vercel/next.js/issues/86133) - \[build] Remove `layers` experiment flag from next-runtime webpack config: [#​86126](https://github.com/vercel/next.js/issues/86126) - Turbopack: only enable nested async availability in production: [#​85728](https://github.com/vercel/next.js/issues/85728) - \[turbopack] Remove `Clone` from `Effect`: [#​86110](https://github.com/vercel/next.js/issues/86110) - Turbopack: mark more modules as side effect free: [#​86136](https://github.com/vercel/next.js/issues/86136) - \[test] Use `next-data-api-endpoint` for Middleware HTTP method tests: [#​86157](https://github.com/vercel/next.js/issues/86157) - fix broken extend implementation on DynamicStorage: [#​86204](https://github.com/vercel/next.js/issues/86204) - Turbopack: avoid creating another async chunk loader where there is already one available: [#​85817](https://github.com/vercel/next.js/issues/85817) - Fix typo on 03-layouts-and-pages.mdx: [#​86186](https://github.com/vercel/next.js/issues/86186) - Update 14-metadata-and-og-images.mdx: [#​86198](https://github.com/vercel/next.js/issues/86198) - \[turbopack] Model `||`, `&&`, and `??` as control flow operators: [#​85837](https://github.com/vercel/next.js/issues/85837) - chore: remove empty docs folder: [#​86216](https://github.com/vercel/next.js/issues/86216) - docs: cacheHandlers use object instead of class: [#​86022](https://github.com/vercel/next.js/issues/86022) - docs: follow up to getting started CC and use-cache API ref: [#​85582](https://github.com/vercel/next.js/issues/85582) - Turbopack: use batch insert to make dependencies outdated: [#​85625](https://github.com/vercel/next.js/issues/85625) - Update Rspack production test manifest: [#​86233](https://github.com/vercel/next.js/issues/86233) - \[test] Update snapshots: [#​86288](https://github.com/vercel/next.js/issues/86288) - \[test] Add failing test for `useActionState` with `'use cache'`: [#​86292](https://github.com/vercel/next.js/issues/86292) - \[test] Disable flaky prefetching.stale-times test: [#​86299](https://github.com/vercel/next.js/issues/86299) - Update Rspack production test manifest: [#​86283](https://github.com/vercel/next.js/issues/86283) - Replace tuples with better suited data structures for server references: [#​86294](https://github.com/vercel/next.js/issues/86294) - create-next-app: Add `ignoreScripts` for `unrs-resolver` on bun: [#​86324](https://github.com/vercel/next.js/issues/86324) - Turbopack: bundle-analyzer need to avoid using the local next.js build: [#​86258](https://github.com/vercel/next.js/issues/86258) - Turbopack: remove unused method: [#​86259](https://github.com/vercel/next.js/issues/86259) - Turbopack: disable input source maps for analyze: [#​86341](https://github.com/vercel/next.js/issues/86341) - Turbopack: perf: Fix unused argument filtering optimization in turbo-tasks for `self` arguments: [#​86231](https://github.com/vercel/next.js/issues/86231) - Turbopack: Remove dead `turbo_tasks::persisted_graph` module: [#​86329](https://github.com/vercel/next.js/issues/86329) - \[turbopack] Refactor the analyzer to fix a few issues and prepare to split it up: [#​86265](https://github.com/vercel/next.js/issues/86265) - next-analyze: improve network error visuals: [#​86222](https://github.com/vercel/next.js/issues/86222) - Turbopack: test if unused self arguments are filtered: [#​86353](https://github.com/vercel/next.js/issues/86353) - Upgrade React from `0972e239-20251118` to `8ac5f4eb-20251119`: [#​86351](https://github.com/vercel/next.js/issues/86351) - Update Rspack development test manifest: [#​86332](https://github.com/vercel/next.js/issues/86332) - Turbopack: refactor tuple variant into struct: [#​86374](https://github.com/vercel/next.js/issues/86374) - Migrate to VisitMut: [#​86347](https://github.com/vercel/next.js/issues/86347) - Turbopack: decode url encoding and relative paths in source maps: [#​86342](https://github.com/vercel/next.js/issues/86342) - Turbopack: remove Asset supertrait from Module trait. Modules don't have content: [#​86339](https://github.com/vercel/next.js/issues/86339) - docs: csr-bailout debugging: [#​86359](https://github.com/vercel/next.js/issues/86359) - docs: serverless deploy feedback: [#​86357](https://github.com/vercel/next.js/issues/86357) - Bump swc to 48: [#​86240](https://github.com/vercel/next.js/issues/86240) - docs: cacheLife feedback: [#​86128](https://github.com/vercel/next.js/issues/86128) - Update Next.js auth docs examples: [#​86361](https://github.com/vercel/next.js/issues/86361) - Update Rspack production test manifest: [#​86369](https://github.com/vercel/next.js/issues/86369) - Revert "Turbopack: remove Asset supertrait from Module trait. Modules don't have content": [#​86415](https://github.com/vercel/next.js/issues/86415) - Revert "\[turbopack] Model `||`, `&&`, and `??` as control flow operators ([#​85837](https://github.com/vercel/next.js/issues/85837))": [#​86432](https://github.com/vercel/next.js/issues/86432) - Turbopack: avoid embedding deployment ID into the turbopack runtime: [#​86370](https://github.com/vercel/next.js/issues/86370) - Revert "Turbopack: JsAnalyzer parse AssignExpr ([#​83962](https://github.com/vercel/next.js/issues/83962))": [#​86420](https://github.com/vercel/next.js/issues/86420) - \[test] Let pending test finish on abort: [#​86307](https://github.com/vercel/next.js/issues/86307) - Fix compilation of exported server functions: [#​86296](https://github.com/vercel/next.js/issues/86296) - docs: fix getInitialProps execution behavior during navigation: [#​86387](https://github.com/vercel/next.js/issues/86387) - Turbopack: bail instead of panic: [#​86470](https://github.com/vercel/next.js/issues/86470) - Update Rspack production test manifest: [#​86457](https://github.com/vercel/next.js/issues/86457) - Fix typed routes test expectations: [#​86487](https://github.com/vercel/next.js/issues/86487) - Add test for external middleware rewrite with changed headers: [#​49606](https://github.com/vercel/next.js/issues/49606) - Fix grammar and typos in typescript doc: [#​86513](https://github.com/vercel/next.js/issues/86513) - Skip filesystem-cache.test.ts test with Webpack: [#​86506](https://github.com/vercel/next.js/issues/86506) - Migrate required-server-files-ssr-404 to be isolated: [#​86515](https://github.com/vercel/next.js/issues/86515) - Turbopack: fixup route hashes generation: [#​86502](https://github.com/vercel/next.js/issues/86502) - Bump swc: [#​86496](https://github.com/vercel/next.js/issues/86496) - Try to improve typed-routes test flakyness: [#​86512](https://github.com/vercel/next.js/issues/86512) - Use retry in tests instead of requesting page: [#​86535](https://github.com/vercel/next.js/issues/86535) - Turbopack: Use `Debug` instead of `Display` for `ValueDebugFormat` impl on `RcStr`: [#​86522](https://github.com/vercel/next.js/issues/86522) - \[test] Add test fixture for runtime error in `'use cache'`: [#​86499](https://github.com/vercel/next.js/issues/86499) - Migrate app-dir-export test to be isolated: [#​86534](https://github.com/vercel/next.js/issues/86534) - Turbopack: write symlinks to access transitive `serverExternalPackages` - Fix no-double-tailwind-execution flake: [#​86549](https://github.com/vercel/next.js/issues/86549) - Update Rspack development test manifest: [#​86531](https://github.com/vercel/next.js/issues/86531) - Turbopack: slightly fewer turbo tasks calls during resolving: [#​86542](https://github.com/vercel/next.js/issues/86542) - Turbopack: remove OptionStringifiedSourceMap: [#​86547](https://github.com/vercel/next.js/issues/86547) - Turbopack: Simplify the return type of `FileSystemPath::try_join`: [#​86523](https://github.com/vercel/next.js/issues/86523) - Turbopack: remove into() which cells internally: [#​86548](https://github.com/vercel/next.js/issues/86548) - docs: fix cache component doc grammar: [#​86563](https://github.com/vercel/next.js/issues/86563) - fix(turbopack): Disable ES3 transforms from preset-env: [#​86532](https://github.com/vercel/next.js/issues/86532) - Don't run bundle-analyzer dev script with turborepo: [#​86586](https://github.com/vercel/next.js/issues/86586) - \[turbopack] Support traversing the graph in reverse order: [#​86427](https://github.com/vercel/next.js/issues/86427) - Update Rspack development test manifest: [#​86657](https://github.com/vercel/next.js/issues/86657) - Update Rspack production test manifest: [#​86658](https://github.com/vercel/next.js/issues/86658) - \[test] Deflake `use-cache-router-handler-only` in deploy tests: [#​86678](https://github.com/vercel/next.js/issues/86678) - Allow exporting object and array literals in `'use cache'` files again: [#​86655](https://github.com/vercel/next.js/issues/86655) - Turbopack: use tracing context for config watching: [#​86576](https://github.com/vercel/next.js/issues/86576) - Turbopack: align chunk loading error name: [#​86593](https://github.com/vercel/next.js/issues/86593) - docs: update prefix two-digit number in routing section: [#​77758](https://github.com/vercel/next.js/issues/77758) - \[bundle-analyzer] Disable revalidateOnFocus and revalidateOnReconnect: [#​86688](https://github.com/vercel/next.js/issues/86688) - Turbopack: improve eventual consistency: [#​86682](https://github.com/vercel/next.js/issues/86682) - \[test] Enable Playwright traces in deploy tests: [#​86683](https://github.com/vercel/next.js/issues/86683) - \[test] Deflake `app-dir-prevent-304-caching`: [#​86693](https://github.com/vercel/next.js/issues/86693) - Bump to swc 49: [#​86689](https://github.com/vercel/next.js/issues/86689) - Turbopack: process.env.TURBOPACK should be a string: [#​86680](https://github.com/vercel/next.js/issues/86680) - Turbopack: arrange empty space in trace viewer correctly: [#​86612](https://github.com/vercel/next.js/issues/86612) - \[turbopack] Remove the docs on the bundle size gap: [#​86707](https://github.com/vercel/next.js/issues/86707) - \[test] Improve app-basepath assertion error: [#​86725](https://github.com/vercel/next.js/issues/86725) - fix(next-custom-transforms): preserve all declarators in multi-declarator export statements: [#​86552](https://github.com/vercel/next.js/issues/86552) - Turbopack: avoid snapshotting while continuously idle, fix spans : [#​86611](https://github.com/vercel/next.js/issues/86611) - Turbopack: fix fuzz command: [#​86732](https://github.com/vercel/next.js/issues/86732) - \[test] Ensure CI uses configured Node.js version: [#​86720](https://github.com/vercel/next.js/issues/86720) - Turbopack: improve eventual consistency: [#​86724](https://github.com/vercel/next.js/issues/86724) - Update Rspack development test manifest: [#​86715](https://github.com/vercel/next.js/issues/86715) - Update Rspack production test manifest: [#​86716](https://github.com/vercel/next.js/issues/86716) - Turbopack: don't read binding\_usage in dev: [#​86722](https://github.com/vercel/next.js/issues/86722) - \[test] app-basepath less agressive request reading: [#​86740](https://github.com/vercel/next.js/issues/86740) - Stop apps/bundle-analyzer/next-env.d.ts from changing: [#​86743](https://github.com/vercel/next.js/issues/86743) - \[turbopack] Move turbo-tasks-testing to dev-dependencies: [#​86745](https://github.com/vercel/next.js/issues/86745) - Turbopack: chore: Remove re-exports from turbopack crate: [#​85791](https://github.com/vercel/next.js/issues/85791) - Turbopack: Split Dirty into Dirtyness and CleanInSession: [#​86070](https://github.com/vercel/next.js/issues/86070) - Turbopack: remove DirtyContainerCount from dirty\_container\_update: [#​86071](https://github.com/vercel/next.js/issues/86071) - Turbopack: fix double deployment id in web workers: [#​86754](https://github.com/vercel/next.js/issues/86754) - Turbopack: Split AggregatedDirtyContainer: [#​86606](https://github.com/vercel/next.js/issues/86606) - Turbopack: Split AggregatedDirtyContainerCount: [#​86072](https://github.com/vercel/next.js/issues/86072) - Turbopack: Avoid that session-dependent tasks write to DB on every build: [#​86068](https://github.com/vercel/next.js/issues/86068) - Turbopack: Use TransientCellData for non-serializable cells: [#​86069](https://github.com/vercel/next.js/issues/86069) - Fix typo in fetching data documentation: [#​86758](https://github.com/vercel/next.js/issues/86758) - Upgrade React from `fd524fe0-20251121` to `7dc903cd-20251203`: [#​86771](https://github.com/vercel/next.js/issues/86771) - Turbopack: use match consistently in macro: [#​86767](https://github.com/vercel/next.js/issues/86767) - setup release branch - Revert "feat(breaking): Hard Deprecate PPR Configuration ([#​84280](https://github.com/vercel/next.js/issues/84280))" - Update React Version - update tag - update version script - docs: cookie clear and has alignment: [#​86788](https://github.com/vercel/next.js/issues/86788) - \[test] fix missing nft file: [#​86817](https://github.com/vercel/next.js/issues/86817) - Remove unused `vitest` from dependency tree: [#​86821](https://github.com/vercel/next.js/issues/86821) - Update installed Next.js: [#​86822](https://github.com/vercel/next.js/issues/86822) - Remove Vercel mention from Next.js docs: [#​86801](https://github.com/vercel/next.js/issues/86801) - Remove unused `vite` from dependency tree: [#​86824](https://github.com/vercel/next.js/issues/86824) - Update Rspack development test manifest: [#​86802](https://github.com/vercel/next.js/issues/86802) - Turbopack: bincode: Add crate with bincode serialization helpers: [#​85878](https://github.com/vercel/next.js/issues/85878) - Turbopack: perf: Avoid clones in RopeReader: [#​86708](https://github.com/vercel/next.js/issues/86708) - Add Firebase App Hosting to the deployment guide: [#​86832](https://github.com/vercel/next.js/issues/86832) - Turbopack: bincode: Add custom bincode reader/writer implementations: [#​86632](https://github.com/vercel/next.js/issues/86632) - Turbopack: bincode: Add traits for types that require `TurboBincodeEncoder` or `TurboBincodeDecoder`: [#​86633](https://github.com/vercel/next.js/issues/86633) - Turbopack: bincode: Implement bincode Encode/Decode traits on all turbo task values: [#​85580](https://github.com/vercel/next.js/issues/85580) - Turbopack: bincode: Add bincode encode/decode wrappers for `serde_json::Value` when stored in a cell: [#​86749](https://github.com/vercel/next.js/issues/86749) - Turbopack: bincode: Use bincode to store the contents of value cells: [#​86338](https://github.com/vercel/next.js/issues/86338) - \[test] Fix external rewrite target URL origin: [#​86863](https://github.com/vercel/next.js/issues/86863) - Turbopack: correctly overwrite existing symlinks: [#​86808](https://github.com/vercel/next.js/issues/86808) - Turbopack: fix race condition when invalidating: [#​86859](https://github.com/vercel/next.js/issues/86859) - Turbopack: handle non-serializable cell content for cell update operation: [#​86861](https://github.com/vercel/next.js/issues/86861) - Turbopack: bincode: Migrate TaskInput serialization to bincode: [#​86631](https://github.com/vercel/next.js/issues/86631) - Add gitignore note for next-env.d.ts: [#​86809](https://github.com/vercel/next.js/issues/86809) - docs: fix broken examples link: [#​86916](https://github.com/vercel/next.js/issues/86916) - chore: update rspack binding to 1.6.7: [#​87058](https://github.com/vercel/next.js/issues/87058) - Update Rspack production test manifest: [#​87051](https://github.com/vercel/next.js/issues/87051) - docs: dynamic routes w/ gsP: [#​86402](https://github.com/vercel/next.js/issues/86402) - Update self-hosting.mdx: [#​87109](https://github.com/vercel/next.js/issues/87109) - Turbopack: Add a custom serde\_self\_describing Serializer/Deserializer: [#​86885](https://github.com/vercel/next.js/issues/86885) - Turbopack: bincode: Remove automatic serde derives from `#[turbo_tasks::value]` macro: [#​86634](https://github.com/vercel/next.js/issues/86634) - Turbopack: Add `turbo-frozenmap` crate with `FrozenMap` and `FrozenSet` implementations: [#​87042](https://github.com/vercel/next.js/issues/87042) - \[turbopack] Rename is\_marked\_as\_side\_effect\_free to side\_effects and return ModuleSideEffects enum: [#​87102](https://github.com/vercel/next.js/issues/87102) - Turbopack: Switch RequestKey's `conditions` field from BTreeMap to FrozenMap: [#​87099](https://github.com/vercel/next.js/issues/87099) - Turbopack: Remove remaining dead implementations of serde traits: [#​86910](https://github.com/vercel/next.js/issues/86910) - \[turbopack\[ Use a frozenset in ImportUsage: [#​87118](https://github.com/vercel/next.js/issues/87118) - \[turbopack] Rename graph traversal algorithms: [#​87119](https://github.com/vercel/next.js/issues/87119) - Turbopack: Inline uses of the SliceMap type alias: [#​87122](https://github.com/vercel/next.js/issues/87122) - \[ci] Bump Lerna to 5.x: [#​87180](https://github.com/vercel/next.js/issues/87180) - \[ci] Downgrade Lerna to 4.0.0: [#​87187](https://github.com/vercel/next.js/issues/87187) - \[ci] Bump Lerna to latest: [#​87188](https://github.com/vercel/next.js/issues/87188) - \[ci] Ensure build-and-deploy runs on pushes: [#​87207](https://github.com/vercel/next.js/issues/87207) - \[ci] Fix build-and-deploy - \[ci] Stop running build\_and\_deploy on tag pushes: [#​87176](https://github.com/vercel/next.js/issues/87176) - \[ci] Ensure build-and-deploy run on path-like branches - \[ci] Cancel in-progress pull\_request\_stats with native concurrency features: [#​87190](https://github.com/vercel/next.js/issues/87190) - \[ci] Cancel in-progress build\_and\_deploy for PRs: [#​87191](https://github.com/vercel/next.js/issues/87191) - \[ci] Ensure runners use configured Node.js version: [#​87183](https://github.com/vercel/next.js/issues/87183) - chore: update next-rspack rust toolchain: [#​87220](https://github.com/vercel/next.js/issues/87220) - bundle-analyzer: Show compressed sizes: [#​87093](https://github.com/vercel/next.js/issues/87093) - chore: update [@​next/rspack-binding](https://github.com/next/rspack-binding) version: [#​87223](https://github.com/vercel/next.js/issues/87223) - \[ci] Stop running explicit build when creating release: [#​87212](https://github.com/vercel/next.js/issues/87212) - \[ci] Stop using restore-keys for package manager stores: [#​87209](https://github.com/vercel/next.js/issues/87209) - chore(turbo-tasks-fs): remove duplicated value\_to\_string of FileSystemPath: [#​87227](https://github.com/vercel/next.js/issues/87227) - \[ci] Fix releaseStats in build-and-deploy: [#​87235](https://github.com/vercel/next.js/issues/87235) - Update turbopack team members: [#​87231](https://github.com/vercel/next.js/issues/87231) - \[ci] Only install Playwright dependencies for used browser: [#​87002](https://github.com/vercel/next.js/issues/87002) - \[turbopack] Break ties using a counter instead of node index: [#​87252](https://github.com/vercel/next.js/issues/87252) - bundle-analyzer: use <Select> and multiselect for top bar: [#​87254](https://github.com/vercel/next.js/issues/87254) - \[test] Don't use `request.allHeaders()` in sync `page.on()` callbacks: [#​86751](https://github.com/vercel/next.js/issues/86751) - test: fix actions deployment tests: [#​87279](https://github.com/vercel/next.js/issues/87279) - bundle analyzer: prevent flashes and stuck empty canvases on resize: [#​87289](https://github.com/vercel/next.js/issues/87289) - Cross link to the demo from the bundle analyzer: [#​87290](https://github.com/vercel/next.js/issues/87290) - bundle analyzer: remove geist font in favor of system ui fonts: [#​87292](https://github.com/vercel/next.js/issues/87292) ##### Credits Huge thanks to [@​kdy1](https://github.com/kdy1), [@​eps1lon](https://github.com/eps1lon), [@​SyMind](https://github.com/SyMind), [@​bgw](https://github.com/bgw), [@​swarnava](https://github.com/swarnava), [@​devjiwonchoi](https://github.com/devjiwonchoi), [@​ztanner](https://github.com/ztanner), [@​ijjk](https://github.com/ijjk), [@​huozhi](https://github.com/huozhi), [@​icyJoseph](https://github.com/icyJoseph), [@​acdlite](https://github.com/acdlite), [@​unstubbable](https://github.com/unstubbable), [@​gnoff](https://github.com/gnoff), [@​gusfune](https://github.com/gusfune), [@​vercel-release-bot](https://github.com/vercel-release-bot), [@​lukesandberg](https://github.com/lukesandberg), [@​sokra](https://github.com/sokra), [@​hayes](https://github.com/hayes), [@​shuding](https://github.com/shuding), [@​wyattjoh](https://github.com/wyattjoh), [@​marjan-ahmed](https://github.com/marjan-ahmed), [@​timneutkens](https://github.com/timneutkens), [@​ajstrongdev](https://github.com/ajstrongdev), [@​zigang93](https://github.com/zigang93), [@​mischnic](https://github.com/mischnic), [@​Nayeem-XTREME](https://github.com/Nayeem-XTREME), [@​hamirmahal](https://github.com/hamirmahal), [@​eli0shin](https://github.com/eli0shin), [@​tessamero](https://github.com/tessamero), [@​gaojude](https://github.com/gaojude), [@​jamesdaniels](https://github.com/jamesdaniels), [@​georgesfarah](https://github.com/georgesfarah), [@​timeyoutakeit](https://github.com/timeyoutakeit), [@​sequencerr](https://github.com/sequencerr), [@​Strernd](https://github.com/Strernd), [@​lucasadrianof](https://github.com/lucasadrianof), [@​wbinnssmith](https://github.com/wbinnssmith), [@​hamidreza-nateghi](https://github.com/hamidreza-nateghi), [@​jokokoloko](https://github.com/jokokoloko), [@​dijonmusters](https://github.com/dijonmusters), [@​H01001000](https://github.com/H01001000), [@​xusd320](https://github.com/xusd320), [@​lubieowoce](https://github.com/lubieowoce), [@​KaziMahbuburRahman](https://github.com/KaziMahbuburRahman), [@​zhiyanzhaijie](https://github.com/zhiyanzhaijie), [@​feedthejim](https://github.com/feedthejim), [@​that-one-arab](https://github.com/that-one-arab), [@​JamBalaya56562](https://github.com/JamBalaya56562), [@​shrink](https://github.com/shrink), [@​florianliebig](https://github.com/florianliebig), [@​allenzhou101](https://github.com/allenzhou101), [@​benmerckx](https://github.com/benmerckx), [@​ymc9](https://github.com/ymc9), [@​Marukome0743](https://github.com/Marukome0743), [@​pyrytakala](https://github.com/pyrytakala), [@​danpeleg4](https://github.com/danpeleg4), [@​gaearon](https://github.com/gaearon), [@​styfle](https://github.com/styfle), [@​jhuleatt](https://github.com/jhuleatt), [@​muhammadsyaddad](https://github.com/muhammadsyaddad), [@​roelvan](https://github.com/roelvan), and [@​SukkaW](https://github.com/SukkaW) for helping! ### [`v16.0.10`](https://github.com/vercel/next.js/releases/tag/v16.0.10) [Compare Source](https://github.com/vercel/next.js/compare/v16.0.9...v16.0.10) Please see the [Next.js Security Update](https://nextjs.org/blog/security-update-2025-12-11) for information about this security patch. ### [`v16.0.9`](https://github.com/vercel/next.js/compare/v16.0.8...v16.0.9) [Compare Source](https://github.com/vercel/next.js/compare/v16.0.8...v16.0.9) ### [`v16.0.8`](https://github.com/vercel/next.js/releases/tag/v16.0.8) [Compare Source](https://github.com/vercel/next.js/compare/v16.0.7...v16.0.8) > \[!NOTE] > This release is backporting bug fixes. It does **not** include all pending features/changes on canary. ##### Core Changes - Update react version in cna templates ([#​86950](https://github.com/vercel/next.js/issues/86950)) ##### Credits Huge thanks to [@​huozhi](https://github.com/huozhi) for helping! </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), A…

Next 16.1 changed Turbopack's external packaging to use symlinks.
Symlinks require elevated privileges on Windows if "Developer Mode" is not enabled. We can work around this by using junction points, which are mostly equivalent, but:
Fixes #87334
Fixes #87607
Fixes #87603
Fixes #87605
Fixes #87559
Fixes #87604
Fixes #87601
Fixes #87599
Fixes #87598
Fixes #87596
Fixes #87595
Fixes #87592
Fixes #87590
Fixes #87589
Fixes #87473
Fixes #87586
Fixes #87585
Fixes #87584
Fixes #87583
Fixes #87582
Fixes #87576
Fixes #87575
Fixes #87574
Fixes #87573
Fixes #87572
Fixes #87571
Fixes #87568
... and many more
Also:
Fixes #69858 (related issue about
output: 'standalone'on Windows.Testing
pnpx create-payload-app(just pick sqlite for the database when prompted), and then update the app withpnpx @next/codemod upgrade 16.1.0.output: 'standalone'to thenext.config.js.pnpm build