Repository: denoland/deno
Pull request: fix: Add missing `"junction"` type for `SymlinkOptions.types`

Junction symlink support is added in #22762, but `SymlinkOptions` and its documents are not updated.

<!--
Before submitting a PR, please read https://docs.deno.com/runtime/manual/references/contributing

1. Give the PR a descriptive title.

  Examples of good title:
    - fix(std/http): Fix race condition in server
    - docs(console): Update docstrings
    - feat(doc): Handle nested reexports

  Examples of bad title:
    - fix #7123
    - update docs
    - fix bugs

2. Ensure there is a related issue and it is referenced in the PR text.
3. Ensure there are tests that cover the changes.
4. Ensure `cargo test` passes.
5. Ensure `./tools/format.js` passes without changing files.
6. Ensure `./tools/lint.js` passes.
7. Open as a draft PR if your work is still in progress. The CI won't run
   all steps, but you can add '[ci]' to a commit message to force it to.
8. If you would like to run the benchmarks on the CI, add the 'ci-bench' label.
-->


Changed files:
filename: cli/tsc/dts/lib.deno.ns.d.ts
patch: @@ -5344,16 +5344,16 @@ declare namespace Deno {
    *
    * @category File System */
   export interface SymlinkOptions {
-    /** If the symbolic link should be either a file or directory. This option
-     * only applies to Windows and is ignored on other operating systems. */
-    type: "file" | "dir";
+    /** Specify the symbolic link type as file, directory or NTFS junction. This
+     * option only applies to Windows and is ignored on other operating systems. */
+    type: "file" | "dir" | "junction";
   }
 
   /**
    * Creates `newpath` as a symbolic link to `oldpath`.
    *
-   * The `options.type` parameter can be set to `"file"` or `"dir"`. This
-   * argument is only available on Windows and ignored on other platforms.
+   * The `options.type` parameter can be set to `"file"`, `"dir"` or `"junction"`.
+   * This argument is only available on Windows and ignored on other platforms.
    *
    * ```ts
    * await Deno.symlink("old/name", "new/name");
@@ -5373,8 +5373,8 @@ declare namespace Deno {
   /**
    * Creates `newpath` as a symbolic link to `oldpath`.
    *
-   * The `options.type` parameter can be set to `"file"` or `"dir"`. This
-   * argument is only available on Windows and ignored on other platforms.
+   * The `options.type` parameter can be set to `"file"`, `"dir"` or `"junction"`.
+   * This argument is only available on Windows and ignored on other platforms.
    *
    * ```ts
    * Deno.symlinkSync("old/name", "new/name");

filename: tests/unit/symlink_test.ts
patch: @@ -39,6 +39,24 @@ Deno.test(
   },
 );
 
+Deno.test(
+  {
+    ignore: Deno.build.os !== "windows",
+    permissions: { read: true, write: true },
+  },
+  function symlinkSyncJunction() {
+    const testDir = Deno.makeTempDirSync();
+    const oldname = testDir + "/oldname";
+    const newname = testDir + "/newname";
+    Deno.mkdirSync(oldname);
+    Deno.symlinkSync(oldname, newname, { type: "junction" });
+    const newNameInfoLStat = Deno.lstatSync(newname);
+    const newNameInfoStat = Deno.statSync(newname);
+    assert(newNameInfoLStat.isSymlink);
+    assert(newNameInfoStat.isDirectory);
+  },
+);
+
 Deno.test(
   { permissions: { read: false, write: false } },
   function symlinkSyncPerm() {
@@ -96,6 +114,24 @@ Deno.test(
   },
 );
 
+Deno.test(
+  {
+    ignore: Deno.build.os !== "windows",
+    permissions: { read: true, write: true },
+  },
+  async function symlinkJunction() {
+    const testDir = Deno.makeTempDirSync();
+    const oldname = testDir + "/oldname";
+    const newname = testDir + "/newname";
+    Deno.mkdirSync(oldname);
+    await Deno.symlink(oldname, newname, { type: "junction" });
+    const newNameInfoLStat = Deno.lstatSync(newname);
+    const newNameInfoStat = Deno.statSync(newname);
+    assert(newNameInfoLStat.isSymlink, "NOT SYMLINK");
+    assert(newNameInfoStat.isDirectory, "NOT DIRECTORY");
+  },
+);
+
 Deno.test(
   { permissions: { read: true, write: true } },
   async function symlinkAlreadyExist() {