fix(ext/node): mkdir() parse file mode (#28609)

Fixes https://github.com/denoland/deno/issues/28604
This commit is contained in:
Divy Srivastava 2025-03-24 21:03:41 -07:00 committed by GitHub
parent d07b7ea6f6
commit 52d528d21d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 29 additions and 5 deletions

View file

@ -7,7 +7,10 @@ import type { CallbackWithError } from "ext:deno_node/_fs/_fs_common.ts";
import { promisify } from "ext:deno_node/internal/util.mjs";
import { denoErrorToNodeError } from "ext:deno_node/internal/errors.ts";
import { getValidatedPath } from "ext:deno_node/internal/fs/utils.mjs";
import { validateBoolean } from "ext:deno_node/internal/validators.mjs";
import {
parseFileMode,
validateBoolean,
} from "ext:deno_node/internal/validators.mjs";
/**
* TODO: Also accept 'path' parameter as a Node polyfill Buffer type once these
@ -31,12 +34,14 @@ export function mkdir(
if (typeof options == "function") {
callback = options;
} else if (typeof options === "number") {
mode = options;
mode = parseFileMode(options, "mode");
} else if (typeof options === "boolean") {
recursive = options;
} else if (options) {
if (options.recursive !== undefined) recursive = options.recursive;
if (options.mode !== undefined) mode = options.mode;
if (options.mode !== undefined) {
mode = parseFileMode(options.mode, "options.mode");
}
}
validateBoolean(recursive, "options.recursive");
@ -64,12 +69,14 @@ export function mkdirSync(path: string | URL, options?: MkdirOptions) {
let recursive = false;
if (typeof options === "number") {
mode = options;
mode = parseFileMode(options, "mode");
} else if (typeof options === "boolean") {
recursive = options;
} else if (options) {
if (options.recursive !== undefined) recursive = options.recursive;
if (options.mode !== undefined) mode = options.mode;
if (options.mode !== undefined) {
mode = parseFileMode(options.mode, "options.mode");
}
}
validateBoolean(recursive, "options.recursive");

View file

@ -29,6 +29,23 @@ Deno.test({
},
});
Deno.test({
name: "[node/fs] mkdir mode",
fn: () => {
mkdirSync(tmpDir, { mode: 0o777 });
assert(existsSync(tmpDir));
assert(Deno.statSync(tmpDir).mode! & 0o777);
Deno.removeSync(tmpDir);
mkdirSync(tmpDir, { mode: "0777" });
assert(existsSync(tmpDir));
assert(Deno.statSync(tmpDir).mode! & 0o777);
Deno.removeSync(tmpDir);
},
});
Deno.test("[std/node/fs] mkdir callback isn't called twice if error is thrown", async () => {
const tempDir = await Deno.makeTempDir();
const subdir = path.join(tempDir, "subdir");