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
This commit is contained in:
Marvin Hagemeister 2024-05-28 12:24:54 +02:00 committed by GitHub
parent 53606de634
commit a0ddf73058
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 29 additions and 4 deletions

View file

@ -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;
}
}
}

View file

@ -7,6 +7,7 @@ import {
constants,
createWriteStream,
existsSync,
lstatSync,
mkdtempSync,
promises,
readFileSync,
@ -156,3 +157,11 @@ Deno.test("[node/fs createWriteStream", async () => {
await Deno.remove(tempDir, { recursive: true });
}
});
Deno.test(
"[node/fs lstatSync] supports throwIfNoEntry option",
() => {
const result = lstatSync("non-existing-path", { throwIfNoEntry: false });
assertEquals(result, undefined);
},
);