From ed628238cce2d3538a7176d8ef454b803967b76d Mon Sep 17 00:00:00 2001 From: Benjamin Woodruff Date: Mon, 6 Oct 2025 16:48:02 -0700 Subject: [PATCH 1/2] chore: Remove useless symlink resolution logic in `recursive-delete.js` --- packages/next/src/lib/recursive-delete.ts | 27 +++++------------------ 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/packages/next/src/lib/recursive-delete.ts b/packages/next/src/lib/recursive-delete.ts index 78a96d197c42a..4aa55065ad783 100644 --- a/packages/next/src/lib/recursive-delete.ts +++ b/packages/next/src/lib/recursive-delete.ts @@ -1,6 +1,6 @@ import type { Dirent } from 'node:fs' import * as fs from 'node:fs' -import { join, isAbsolute, dirname } from 'node:path' +import { join } from 'node:path' import isError from './is-error' import { wait } from './wait' @@ -90,33 +90,16 @@ export async function recursiveDeleteSyncWithAsyncRetries( await Promise.all( result.map(async (part: Dirent) => { const absolutePath = join(dir, part.name) - - // readdir does not follow symbolic links - // if part is a symbolic link, follow it using stat - let isDirectory = part.isDirectory() - const isSymlink = part.isSymbolicLink() - - if (isSymlink) { - const linkPath = fs.readlinkSync(absolutePath) - - try { - const stats = fs.statSync( - isAbsolute(linkPath) - ? linkPath - : join(dirname(absolutePath), linkPath) - ) - isDirectory = stats.isDirectory() - } catch {} - } - const pp = join(previousPath, part.name) const isNotExcluded = !exclude || !exclude.test(pp) if (isNotExcluded) { - if (!isSymlink && isDirectory) { + // Note: readdir does not follow symbolic links, that's what we want + let isDirectory = part.isDirectory() + if (isDirectory) { await recursiveDeleteSyncWithAsyncRetries(absolutePath, exclude, pp) } - return unlinkPath(absolutePath, !isSymlink && isDirectory) + return unlinkPath(absolutePath, isDirectory) } }) ) From 484889dc4f26111b32e37dae6403af19516523b0 Mon Sep 17 00:00:00 2001 From: Benjamin Woodruff Date: Tue, 7 Oct 2025 10:45:01 -0700 Subject: [PATCH 2/2] update comment --- packages/next/src/lib/recursive-delete.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/next/src/lib/recursive-delete.ts b/packages/next/src/lib/recursive-delete.ts index 4aa55065ad783..8afb1c63c82ca 100644 --- a/packages/next/src/lib/recursive-delete.ts +++ b/packages/next/src/lib/recursive-delete.ts @@ -94,7 +94,8 @@ export async function recursiveDeleteSyncWithAsyncRetries( const isNotExcluded = !exclude || !exclude.test(pp) if (isNotExcluded) { - // Note: readdir does not follow symbolic links, that's what we want + // Note: readdir does not follow symbolic links, that's good: we want to + // delete the links and not the destination. let isDirectory = part.isDirectory() if (isDirectory) { await recursiveDeleteSyncWithAsyncRetries(absolutePath, exclude, pp)