From a0ddf7305895e2920ef5d9208fc9ec767ebb11d5 Mon Sep 17 00:00:00 2001 From: Marvin Hagemeister Date: Tue, 28 May 2024 12:24:54 +0200 Subject: fix(ext/node): add `throwIfNoEntry` option in `fs.lstatSync` (#24006) We didn't support the `throwIfNoEntry` option for Node's `fs.lstatSync` method. Note that the async variant doesn't have this option. Fixes https://github.com/denoland/deno/issues/23996 --- ext/node/polyfills/_fs/_fs_lstat.ts | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'ext') diff --git a/ext/node/polyfills/_fs/_fs_lstat.ts b/ext/node/polyfills/_fs/_fs_lstat.ts index c8cdfc4e4..6ce401444 100644 --- a/ext/node/polyfills/_fs/_fs_lstat.ts +++ b/ext/node/polyfills/_fs/_fs_lstat.ts @@ -3,6 +3,7 @@ // TODO(petamoriken): enable prefer-primordials for node polyfills // deno-lint-ignore-file prefer-primordials +import { denoErrorToNodeError } from "ext:deno_node/internal/errors.ts"; import { BigIntStats, CFISBIS, @@ -56,16 +57,31 @@ export const lstatPromise = promisify(lstat) as ( export function lstatSync(path: string | URL): Stats; export function lstatSync( path: string | URL, - options: { bigint: false }, + options: { bigint: false; throwIfNoEntry?: boolean }, ): Stats; export function lstatSync( path: string | URL, - options: { bigint: true }, + options: { bigint: true; throwIfNoEntry?: boolean }, ): BigIntStats; export function lstatSync( path: string | URL, options?: statOptions, ): Stats | BigIntStats { - const origin = Deno.lstatSync(path); - return CFISBIS(origin, options?.bigint || false); + try { + const origin = Deno.lstatSync(path); + return CFISBIS(origin, options?.bigint || false); + } catch (err) { + if ( + options?.throwIfNoEntry === false && + err instanceof Deno.errors.NotFound + ) { + return; + } + + if (err instanceof Error) { + throw denoErrorToNodeError(err, { syscall: "stat" }); + } else { + throw err; + } + } } -- cgit v1.2.3