From 9fde5cb5e045551fe344b3f60370744eea30ccb4 Mon Sep 17 00:00:00 2001
From: Nathan Whitaker <17734409+nathanwhit@users.noreply.github.com>
Date: Thu, 17 Oct 2024 12:51:15 -0700
Subject: fix(node/fs): copyFile with `COPYFILE_EXCL` should not throw if the
destination doesn't exist (#26360)
Fixes #26313.
We were checking for the NotFound error, but still calling the callback
with the error / throwing.
---
tests/unit_node/fs_test.ts | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
(limited to 'tests/unit_node/fs_test.ts')
diff --git a/tests/unit_node/fs_test.ts b/tests/unit_node/fs_test.ts
index 2d1465aec..17da45dcf 100644
--- a/tests/unit_node/fs_test.ts
+++ b/tests/unit_node/fs_test.ts
@@ -1,11 +1,13 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import { assert, assertEquals, assertThrows } from "@std/assert";
+///
+import { assert, assertEquals, assertRejects, assertThrows } from "@std/assert";
import { join } from "node:path";
import { tmpdir } from "node:os";
import {
closeSync,
constants,
+ copyFileSync,
createWriteStream,
existsSync,
lstatSync,
@@ -20,6 +22,7 @@ import {
} from "node:fs";
import {
constants as fsPromiseConstants,
+ copyFile,
cp,
FileHandle,
open,
@@ -212,3 +215,19 @@ Deno.test("[node/fs] readSync works", () => {
assertEquals(bytesRead, 12);
closeSync(fd!);
});
+
+Deno.test("[node/fs] copyFile COPYFILE_EXCL works", async () => {
+ const dir = mkdtempSync(join(tmpdir(), "foo-"));
+ const src = join(dir, "src.txt");
+ const dest = join(dir, "dest.txt");
+ await writeFile(src, "");
+ await copyFile(src, dest, fsPromiseConstants.COPYFILE_EXCL);
+ assert(existsSync(dest));
+ assertRejects(() => copyFile(src, dest, fsPromiseConstants.COPYFILE_EXCL));
+ const dest2 = join(dir, "dest2.txt");
+ copyFileSync(src, dest2, fsPromiseConstants.COPYFILE_EXCL);
+ assert(existsSync(dest2));
+ assertThrows(() =>
+ copyFileSync(src, dest2, fsPromiseConstants.COPYFILE_EXCL)
+ );
+});
--
cgit v1.2.3
From 2435a361c64fc9bac4aee7b268b4c0a42eee4471 Mon Sep 17 00:00:00 2001
From: Nathan Whitaker <17734409+nathanwhit@users.noreply.github.com>
Date: Thu, 17 Oct 2024 15:19:37 -0700
Subject: chore: fix flaky COPYFILE_EXCL test (#26370)
It was missing an await
---
tests/unit_node/fs_test.ts | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
(limited to 'tests/unit_node/fs_test.ts')
diff --git a/tests/unit_node/fs_test.ts b/tests/unit_node/fs_test.ts
index 17da45dcf..ac9c4a53e 100644
--- a/tests/unit_node/fs_test.ts
+++ b/tests/unit_node/fs_test.ts
@@ -223,7 +223,9 @@ Deno.test("[node/fs] copyFile COPYFILE_EXCL works", async () => {
await writeFile(src, "");
await copyFile(src, dest, fsPromiseConstants.COPYFILE_EXCL);
assert(existsSync(dest));
- assertRejects(() => copyFile(src, dest, fsPromiseConstants.COPYFILE_EXCL));
+ await assertRejects(() =>
+ copyFile(src, dest, fsPromiseConstants.COPYFILE_EXCL)
+ );
const dest2 = join(dir, "dest2.txt");
copyFileSync(src, dest2, fsPromiseConstants.COPYFILE_EXCL);
assert(existsSync(dest2));
--
cgit v1.2.3
From 285635daa67274f961d29c1e7795222709dc9618 Mon Sep 17 00:00:00 2001
From: Yoshiya Hinosawa
Date: Wed, 23 Oct 2024 11:28:04 +0900
Subject: fix(ext/node): map `ERROR_INVALID_NAME` to `ENOENT` on windows
(#26475)
In libuv on windows, `ERROR_INVALID_NAME` is mapped to `ENOENT`, but it
is mapped to `EINVAL` in our compat implementation, which causes the
issue #24899.
ref:
https://github.com/libuv/libuv/blob/d4ab6fbba4669935a6bc23645372dfe4ac29ab39/src/win/error.c#L138
closes #24899
closes #26411
closes #23635
closes #21165
closes #19067
---
tests/unit_node/fs_test.ts | 11 +++++++++++
1 file changed, 11 insertions(+)
(limited to 'tests/unit_node/fs_test.ts')
diff --git a/tests/unit_node/fs_test.ts b/tests/unit_node/fs_test.ts
index ac9c4a53e..ef8f829cd 100644
--- a/tests/unit_node/fs_test.ts
+++ b/tests/unit_node/fs_test.ts
@@ -233,3 +233,14 @@ Deno.test("[node/fs] copyFile COPYFILE_EXCL works", async () => {
copyFileSync(src, dest2, fsPromiseConstants.COPYFILE_EXCL)
);
});
+
+Deno.test("[node/fs] statSync throws ENOENT for invalid path containing colon in it", () => {
+ // deno-lint-ignore no-explicit-any
+ const err: any = assertThrows(() => {
+ // Note: Deno.stat throws ERROR_INVALID_NAME (os error 123) instead of
+ // ERROR_FILE_NOT_FOUND (os error 2) on windows. This case checks that
+ // ERROR_INVALID_NAME is mapped to ENOENT correctly on node compat layer.
+ statSync("jsr:@std/assert");
+ });
+ assertEquals(err.code, "ENOENT");
+});
--
cgit v1.2.3
From c314b2d8577289078d6b00a0dd58f8f36ff6920a Mon Sep 17 00:00:00 2001
From: familyboat <84062528+familyboat@users.noreply.github.com>
Date: Sun, 27 Oct 2024 11:04:35 +0800
Subject: fix(ext/node): add path to `fs.stat` and `fs.statSync` error (#26037)
---
tests/unit_node/fs_test.ts | 43 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
(limited to 'tests/unit_node/fs_test.ts')
diff --git a/tests/unit_node/fs_test.ts b/tests/unit_node/fs_test.ts
index ef8f829cd..631608d7c 100644
--- a/tests/unit_node/fs_test.ts
+++ b/tests/unit_node/fs_test.ts
@@ -26,6 +26,7 @@ import {
cp,
FileHandle,
open,
+ stat,
writeFile,
} from "node:fs/promises";
import process from "node:process";
@@ -123,6 +124,48 @@ Deno.test(
},
);
+Deno.test(
+ "[node/fs statSync] throw error with path information",
+ () => {
+ const file = "non-exist-file";
+ const fileUrl = new URL(file, import.meta.url);
+
+ assertThrows(() => {
+ statSync(file);
+ }, "Error: ENOENT: no such file or directory, stat 'non-exist-file'");
+
+ assertThrows(() => {
+ statSync(fileUrl);
+ }, `Error: ENOENT: no such file or directory, stat '${fileUrl.pathname}'`);
+ },
+);
+
+Deno.test(
+ "[node/fs/promises stat] throw error with path information",
+ async () => {
+ const file = "non-exist-file";
+ const fileUrl = new URL(file, import.meta.url);
+
+ try {
+ await stat(file);
+ } catch (error: unknown) {
+ assertEquals(
+ `${error}`,
+ "Error: ENOENT: no such file or directory, stat 'non-exist-file'",
+ );
+ }
+
+ try {
+ await stat(fileUrl);
+ } catch (error: unknown) {
+ assertEquals(
+ `${error}`,
+ `Error: ENOENT: no such file or directory, stat '${fileUrl.pathname}'`,
+ );
+ }
+ },
+);
+
Deno.test(
"[node/fs/promises cp] copy file",
async () => {
--
cgit v1.2.3