summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2024-03-09 09:07:29 +0530
committerGitHub <noreply@github.com>2024-03-09 09:07:29 +0530
commit0bed4d3e5153aaf2e06fb6579ac6f24acf63567f (patch)
treed64bdb9ba3b4b0b1b16a5ab6ff5bad23b55dd76d
parent26cee4eb0d041786f1d70cb2d9f3a6b6d82bd93d (diff)
fix(ext/node): support junction symlinks on Windows (#22762)
Fixes https://github.com/denoland/deno/issues/20609 Vitepress support! `vitepress dev` and `vitepress build` via BYONM
-rw-r--r--Cargo.lock1
-rw-r--r--Cargo.toml1
-rw-r--r--cli/Cargo.toml2
-rw-r--r--ext/fs/Cargo.toml1
-rw-r--r--ext/fs/interface.rs2
-rw-r--r--ext/fs/std_fs.rs3
-rw-r--r--ext/node/polyfills/_fs/_fs_symlink.ts2
-rw-r--r--tests/unit_node/_fs/_fs_symlink_test.ts17
8 files changed, 27 insertions, 2 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 7a68504db..14916df05 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1425,6 +1425,7 @@ dependencies = [
"deno_io",
"filetime",
"fs3",
+ "junction",
"libc",
"log",
"nix 0.26.2",
diff --git a/Cargo.toml b/Cargo.toml
index ed863abdd..dc7bda38b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -194,6 +194,7 @@ nix = "=0.26.2"
# windows deps
fwdansi = "=1.1.0"
+junction = "=0.2.0"
winapi = "=0.3.9"
windows-sys = { version = "0.48.0", features = ["Win32_Media"] }
winres = "=0.1.12"
diff --git a/cli/Cargo.toml b/cli/Cargo.toml
index cb1255d7f..9a6a8ee57 100644
--- a/cli/Cargo.toml
+++ b/cli/Cargo.toml
@@ -154,7 +154,7 @@ zstd.workspace = true
[target.'cfg(windows)'.dependencies]
fwdansi.workspace = true
-junction = "=0.2.0"
+junction.workspace = true
winapi = { workspace = true, features = ["knownfolders", "mswsock", "objbase", "shlobj", "tlhelp32", "winbase", "winerror", "winsock2"] }
[target.'cfg(unix)'.dependencies]
diff --git a/ext/fs/Cargo.toml b/ext/fs/Cargo.toml
index f6f64010e..b8cccde28 100644
--- a/ext/fs/Cargo.toml
+++ b/ext/fs/Cargo.toml
@@ -35,3 +35,4 @@ nix.workspace = true
[target.'cfg(windows)'.dependencies]
winapi = { workspace = true, features = ["winbase"] }
+junction.workspace = true
diff --git a/ext/fs/interface.rs b/ext/fs/interface.rs
index 8ffa61481..c5a348eb1 100644
--- a/ext/fs/interface.rs
+++ b/ext/fs/interface.rs
@@ -64,6 +64,8 @@ pub enum FsFileType {
File,
#[serde(rename = "dir")]
Directory,
+ #[serde(rename = "junction")]
+ Junction,
}
#[derive(Serialize)]
diff --git a/ext/fs/std_fs.rs b/ext/fs/std_fs.rs
index c1c9200cb..332866e45 100644
--- a/ext/fs/std_fs.rs
+++ b/ext/fs/std_fs.rs
@@ -810,6 +810,9 @@ fn symlink(
FsFileType::Directory => {
std::os::windows::fs::symlink_dir(oldpath, newpath)?;
}
+ FsFileType::Junction => {
+ junction::create(oldpath, newpath)?;
+ }
};
Ok(())
diff --git a/ext/node/polyfills/_fs/_fs_symlink.ts b/ext/node/polyfills/_fs/_fs_symlink.ts
index 5cb121755..350263423 100644
--- a/ext/node/polyfills/_fs/_fs_symlink.ts
+++ b/ext/node/polyfills/_fs/_fs_symlink.ts
@@ -7,7 +7,7 @@ import { CallbackWithError } from "ext:deno_node/_fs/_fs_common.ts";
import { pathFromURL } from "ext:deno_web/00_infra.js";
import { promisify } from "ext:deno_node/internal/util.mjs";
-type SymlinkType = "file" | "dir";
+type SymlinkType = "file" | "dir" | "junction";
export function symlink(
target: string | URL,
diff --git a/tests/unit_node/_fs/_fs_symlink_test.ts b/tests/unit_node/_fs/_fs_symlink_test.ts
index 68ed1014a..98cf51460 100644
--- a/tests/unit_node/_fs/_fs_symlink_test.ts
+++ b/tests/unit_node/_fs/_fs_symlink_test.ts
@@ -105,3 +105,20 @@ Deno.test({
}
},
});
+
+Deno.test({
+ name: "SYNC: symlink junction",
+ fn() {
+ const dir: string = Deno.makeTempDirSync();
+ const linkedDir: string = dir + "-junction";
+
+ try {
+ symlinkSync(dir, linkedDir, "junction");
+ const stat = Deno.lstatSync(linkedDir);
+ assert(stat.isSymlink);
+ } finally {
+ Deno.removeSync(dir);
+ Deno.removeSync(linkedDir);
+ }
+ },
+});