From 944ede4d0937449c577c321b25b0a6b2660ee6f7 Mon Sep 17 00:00:00 2001 From: Salman Muin Kayser Chishti Date: Fri, 8 Aug 2025 03:46:42 +0100 Subject: [PATCH] custom readlink implementation for Windows compatibility with trailing backslashes --- packages/io/src/io-util.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/io/src/io-util.ts b/packages/io/src/io-util.ts index fd3a3e17..4207e07c 100644 --- a/packages/io/src/io-util.ts +++ b/packages/io/src/io-util.ts @@ -8,7 +8,6 @@ export const { mkdir, open, readdir, - readlink, rename, rm, rmdir, @@ -18,6 +17,28 @@ export const { } = fs.promises // export const {open} = 'fs' export const IS_WINDOWS = process.platform === 'win32' + +/** + * Custom implementation of readlink to ensure Windows directory symlinks + * maintain trailing backslash for backward compatibility with Node.js < 24 + */ +export async function readlink(fsPath: string): Promise { + const result = await fs.promises.readlink(fsPath); + + // Only on Windows, ensure directory symlinks end with a backslash + if (IS_WINDOWS) { + try { + const stats = await fs.promises.lstat(result); + if (stats.isDirectory() && !result.endsWith('\\')) { + return `${result}\\`; + } + } catch (err) { + // If we can't access the target, just return the original result + } + } + + return result; +} // See https://github.com/nodejs/node/blob/d0153aee367422d0858105abec186da4dff0a0c5/deps/uv/include/uv/win.h#L691 export const UV_FS_O_EXLOCK = 0x10000000 export const READONLY = fs.constants.O_RDONLY