diff --git a/cli/js/lib.deno_runtime.d.ts b/cli/js/lib.deno_runtime.d.ts index 85052dd16c..619efed55f 100644 --- a/cli/js/lib.deno_runtime.d.ts +++ b/cli/js/lib.deno_runtime.d.ts @@ -517,6 +517,11 @@ declare namespace Deno { // @url js/mkdir.d.ts + export interface MkdirOption { + recursive?: boolean; + mode?: number; + } + /** Creates a new directory with the specified path synchronously. * If `recursive` is set to true, nested directories will be created (also known * as "mkdir -p"). @@ -524,13 +529,17 @@ declare namespace Deno { * Windows. * * Deno.mkdirSync("new_dir"); - * Deno.mkdirSync("nested/directories", true); + * Deno.mkdirSync("nested/directories", { recursive: true }); */ + export function mkdirSync(path: string, options?: MkdirOption): void; + + /** Deprecated */ export function mkdirSync( path: string, recursive?: boolean, mode?: number ): void; + /** Creates a new directory with the specified path. * If `recursive` is set to true, nested directories will be created (also known * as "mkdir -p"). @@ -538,8 +547,11 @@ declare namespace Deno { * Windows. * * await Deno.mkdir("new_dir"); - * await Deno.mkdir("nested/directories", true); + * await Deno.mkdir("nested/directories", { recursive: true }); */ + export function mkdir(path: string, options?: MkdirOption): Promise; + + /** Deprecated */ export function mkdir( path: string, recursive?: boolean, diff --git a/cli/js/mkdir.ts b/cli/js/mkdir.ts index c97778ffb6..836b785cfe 100644 --- a/cli/js/mkdir.ts +++ b/cli/js/mkdir.ts @@ -2,6 +2,35 @@ import { sendSync, sendAsync } from "./dispatch_json.ts"; import * as dispatch from "./dispatch.ts"; +// TODO(ry) The complexity in argument parsing is to support deprecated forms of +// mkdir and mkdirSync. +function mkdirArgs( + path: string, + optionsOrRecursive?: MkdirOption | boolean, + mode?: number +): { path: string; recursive: boolean; mode: number } { + const args = { path, recursive: false, mode: 0o777 }; + if (typeof optionsOrRecursive == "boolean") { + args.recursive = optionsOrRecursive; + if (mode) { + args.mode = mode; + } + } else if (optionsOrRecursive) { + if (typeof optionsOrRecursive.recursive == "boolean") { + args.recursive = optionsOrRecursive.recursive; + } + if (optionsOrRecursive.mode) { + args.mode = optionsOrRecursive.mode; + } + } + return args; +} + +export interface MkdirOption { + recursive?: boolean; + mode?: number; +} + /** Creates a new directory with the specified path synchronously. * If `recursive` is set to true, nested directories will be created (also known * as "mkdir -p"). @@ -9,10 +38,14 @@ import * as dispatch from "./dispatch.ts"; * Windows. * * Deno.mkdirSync("new_dir"); - * Deno.mkdirSync("nested/directories", true); + * Deno.mkdirSync("nested/directories", { recursive: true }); */ -export function mkdirSync(path: string, recursive = false, mode = 0o777): void { - sendSync(dispatch.OP_MKDIR, { path, recursive, mode }); +export function mkdirSync( + path: string, + optionsOrRecursive?: MkdirOption | boolean, + mode?: number +): void { + sendSync(dispatch.OP_MKDIR, mkdirArgs(path, optionsOrRecursive, mode)); } /** Creates a new directory with the specified path. @@ -22,12 +55,12 @@ export function mkdirSync(path: string, recursive = false, mode = 0o777): void { * Windows. * * await Deno.mkdir("new_dir"); - * await Deno.mkdir("nested/directories", true); + * await Deno.mkdir("nested/directories", { recursive: true }); */ export async function mkdir( path: string, - recursive = false, - mode = 0o777 + optionsOrRecursive?: MkdirOption | boolean, + mode?: number ): Promise { - await sendAsync(dispatch.OP_MKDIR, { path, recursive, mode }); + await sendAsync(dispatch.OP_MKDIR, mkdirArgs(path, optionsOrRecursive, mode)); } diff --git a/cli/js/mkdir_test.ts b/cli/js/mkdir_test.ts index c6fa6326c2..dad61c1a47 100644 --- a/cli/js/mkdir_test.ts +++ b/cli/js/mkdir_test.ts @@ -10,7 +10,7 @@ testPerm({ read: true, write: true }, function mkdirSyncSuccess(): void { testPerm({ read: true, write: true }, function mkdirSyncMode(): void { const path = Deno.makeTempDirSync() + "/dir"; - Deno.mkdirSync(path, false, 0o755); // no perm for x + Deno.mkdirSync(path, { mode: 0o755 }); // no perm for x const pathInfo = Deno.statSync(path); if (pathInfo.mode !== null) { // Skip windows @@ -51,7 +51,7 @@ testPerm({ write: true }, function mkdirErrIfExists(): void { testPerm({ read: true, write: true }, function mkdirSyncRecursive(): void { const path = Deno.makeTempDirSync() + "/nested/directory"; - Deno.mkdirSync(path, true); + Deno.mkdirSync(path, { recursive: true }); const pathInfo = Deno.statSync(path); assert(pathInfo.isDirectory()); }); @@ -60,7 +60,7 @@ testPerm({ read: true, write: true }, async function mkdirRecursive(): Promise< void > { const path = Deno.makeTempDirSync() + "/nested/directory"; - await Deno.mkdir(path, true); + await Deno.mkdir(path, { recursive: true }); const pathInfo = Deno.statSync(path); assert(pathInfo.isDirectory()); }); diff --git a/std/fs/empty_dir.ts b/std/fs/empty_dir.ts index a838de3b88..e3d08ef70a 100644 --- a/std/fs/empty_dir.ts +++ b/std/fs/empty_dir.ts @@ -33,7 +33,7 @@ export async function emptyDir(dir: string): Promise { } // if not exist. then create it - await mkdir(dir, true); + await mkdir(dir, { recursive: true }); } } @@ -61,7 +61,7 @@ export function emptyDirSync(dir: string): void { throw err; } // if not exist. then create it - mkdirSync(dir, true); + mkdirSync(dir, { recursive: true }); return; } } diff --git a/std/fs/ensure_dir.ts b/std/fs/ensure_dir.ts index 92db873b3e..d4b30dd2d9 100644 --- a/std/fs/ensure_dir.ts +++ b/std/fs/ensure_dir.ts @@ -18,7 +18,7 @@ export async function ensureDir(dir: string): Promise { } catch (err) { if (err instanceof Deno.DenoError && err.kind === ErrorKind.NotFound) { // if dir not exists. then create it. - await mkdir(dir, true); + await mkdir(dir, { recursive: true }); return; } throw err; @@ -41,7 +41,7 @@ export function ensureDirSync(dir: string): void { } catch (err) { if (err instanceof Deno.DenoError && err.kind == ErrorKind.NotFound) { // if dir not exists. then create it. - mkdirSync(dir, true); + mkdirSync(dir, { recursive: true }); return; } throw err; diff --git a/std/fs/ensure_dir_test.ts b/std/fs/ensure_dir_test.ts index 998b74e2de..231196ae9d 100644 --- a/std/fs/ensure_dir_test.ts +++ b/std/fs/ensure_dir_test.ts @@ -40,7 +40,7 @@ test(async function ensureDirIfItExist(): Promise { const testDir = path.join(baseDir, "test"); // create test directory - await Deno.mkdir(testDir, true); + await Deno.mkdir(testDir, { recursive: true }); await ensureDir(testDir); @@ -60,7 +60,7 @@ test(function ensureDirSyncIfItExist(): void { const testDir = path.join(baseDir, "test"); // create test directory - Deno.mkdirSync(testDir, true); + Deno.mkdirSync(testDir, { recursive: true }); ensureDirSync(testDir); diff --git a/std/fs/ensure_file_test.ts b/std/fs/ensure_file_test.ts index 855ad4f50d..a5d237e5f4 100644 --- a/std/fs/ensure_file_test.ts +++ b/std/fs/ensure_file_test.ts @@ -41,7 +41,7 @@ test(async function ensureFileIfItExist(): Promise { const testDir = path.join(testdataDir, "ensure_file_3"); const testFile = path.join(testDir, "test.txt"); - await Deno.mkdir(testDir, true); + await Deno.mkdir(testDir, { recursive: true }); await Deno.writeFile(testFile, new Uint8Array()); await ensureFile(testFile); @@ -61,7 +61,7 @@ test(function ensureFileSyncIfItExist(): void { const testDir = path.join(testdataDir, "ensure_file_4"); const testFile = path.join(testDir, "test.txt"); - Deno.mkdirSync(testDir, true); + Deno.mkdirSync(testDir, { recursive: true }); Deno.writeFileSync(testFile, new Uint8Array()); ensureFileSync(testFile); @@ -77,7 +77,7 @@ test(function ensureFileSyncIfItExist(): void { test(async function ensureFileIfItExistAsDir(): Promise { const testDir = path.join(testdataDir, "ensure_file_5"); - await Deno.mkdir(testDir, true); + await Deno.mkdir(testDir, { recursive: true }); await assertThrowsAsync( async (): Promise => { @@ -93,7 +93,7 @@ test(async function ensureFileIfItExistAsDir(): Promise { test(function ensureFileSyncIfItExistAsDir(): void { const testDir = path.join(testdataDir, "ensure_file_6"); - Deno.mkdirSync(testDir, true); + Deno.mkdirSync(testDir, { recursive: true }); assertThrows( (): void => { diff --git a/std/fs/ensure_link_test.ts b/std/fs/ensure_link_test.ts index e438bf0e3f..daf216c492 100644 --- a/std/fs/ensure_link_test.ts +++ b/std/fs/ensure_link_test.ts @@ -43,7 +43,7 @@ test(async function ensureLinkIfItExist(): Promise { const testFile = path.join(testDir, "test.txt"); const linkFile = path.join(testDir, "link.txt"); - await Deno.mkdir(testDir, true); + await Deno.mkdir(testDir, { recursive: true }); await Deno.writeFile(testFile, new Uint8Array()); await ensureLink(testFile, linkFile); @@ -90,7 +90,7 @@ test(function ensureLinkSyncIfItExist(): void { const testFile = path.join(testDir, "test.txt"); const linkFile = path.join(testDir, "link.txt"); - Deno.mkdirSync(testDir, true); + Deno.mkdirSync(testDir, { recursive: true }); Deno.writeFileSync(testFile, new Uint8Array()); ensureLinkSync(testFile, linkFile); @@ -138,7 +138,7 @@ test(async function ensureLinkDirectoryIfItExist(): Promise { const linkDir = path.join(testdataDir, "ensure_link_link_3"); const testFile = path.join(testDir, "test.txt"); - await Deno.mkdir(testDir, true); + await Deno.mkdir(testDir, { recursive: true }); await Deno.writeFile(testFile, new Uint8Array()); await assertThrowsAsync( @@ -158,7 +158,7 @@ test(function ensureLinkSyncDirectoryIfItExist(): void { const linkDir = path.join(testdataDir, "ensure_link_link_3"); const testFile = path.join(testDir, "test.txt"); - Deno.mkdirSync(testDir, true); + Deno.mkdirSync(testDir, { recursive: true }); Deno.writeFileSync(testFile, new Uint8Array()); assertThrows( diff --git a/std/fs/ensure_symlink_test.ts b/std/fs/ensure_symlink_test.ts index ee32d48610..0470af57e9 100644 --- a/std/fs/ensure_symlink_test.ts +++ b/std/fs/ensure_symlink_test.ts @@ -50,7 +50,7 @@ test(async function ensureSymlinkIfItExist(): Promise { const testFile = path.join(testDir, "test.txt"); const linkFile = path.join(testDir, "link.txt"); - await Deno.mkdir(testDir, true); + await Deno.mkdir(testDir, { recursive: true }); await Deno.writeFile(testFile, new Uint8Array()); if (isWindows) { @@ -79,7 +79,7 @@ test(function ensureSymlinkSyncIfItExist(): void { const testFile = path.join(testDir, "test.txt"); const linkFile = path.join(testDir, "link.txt"); - Deno.mkdirSync(testDir, true); + Deno.mkdirSync(testDir, { recursive: true }); Deno.writeFileSync(testFile, new Uint8Array()); if (isWindows) { @@ -109,7 +109,7 @@ test(async function ensureSymlinkDirectoryIfItExist(): Promise { const linkDir = path.join(testdataDir, "link_file_link_3"); const testFile = path.join(testDir, "test.txt"); - await Deno.mkdir(testDir, true); + await Deno.mkdir(testDir, { recursive: true }); await Deno.writeFile(testFile, new Uint8Array()); if (isWindows) { @@ -141,7 +141,7 @@ test(function ensureSymlinkSyncDirectoryIfItExist(): void { const linkDir = path.join(testdataDir, "link_file_link_3"); const testFile = path.join(testDir, "test.txt"); - Deno.mkdirSync(testDir, true); + Deno.mkdirSync(testDir, { recursive: true }); Deno.writeFileSync(testFile, new Uint8Array()); if (isWindows) { diff --git a/std/fs/move_test.ts b/std/fs/move_test.ts index 27f66f7de8..7958935091 100644 --- a/std/fs/move_test.ts +++ b/std/fs/move_test.ts @@ -28,7 +28,7 @@ test(async function moveDirectoryIfDestNotExists(): Promise { const srcDir = path.join(testdataDir, "move_test_src_2"); const destDir = path.join(testdataDir, "move_test_dest_2"); - await Deno.mkdir(srcDir, true); + await Deno.mkdir(srcDir, { recursive: true }); // if dest directory not exist await assertThrowsAsync( @@ -112,7 +112,7 @@ test(async function moveDirectory(): Promise { const destFile = path.join(destDir, "test.txt"); const srcContent = new TextEncoder().encode("src"); - await Deno.mkdir(srcDir, true); + await Deno.mkdir(srcDir, { recursive: true }); assertEquals(await exists(srcDir), true); await Deno.writeFile(srcFile, srcContent); @@ -140,7 +140,10 @@ test(async function moveIfSrcAndDestDirectoryExistsAndOverwrite(): Promise< const srcContent = new TextEncoder().encode("src"); const destContent = new TextEncoder().encode("dest"); - await Promise.all([Deno.mkdir(srcDir, true), Deno.mkdir(destDir, true)]); + await Promise.all([ + Deno.mkdir(srcDir, { recursive: true }), + Deno.mkdir(destDir, { recursive: true }) + ]); assertEquals(await exists(srcDir), true); assertEquals(await exists(destDir), true); await Promise.all([ @@ -191,7 +194,7 @@ test(function moveSyncDirectoryIfDestNotExists(): void { const srcDir = path.join(testdataDir, "move_sync_test_src_2"); const destDir = path.join(testdataDir, "move_sync_test_dest_2"); - Deno.mkdirSync(srcDir, true); + Deno.mkdirSync(srcDir, { recursive: true }); // if dest directory not exist assertThrows( @@ -270,7 +273,7 @@ test(function moveSyncDirectory(): void { const destFile = path.join(destDir, "test.txt"); const srcContent = new TextEncoder().encode("src"); - Deno.mkdirSync(srcDir, true); + Deno.mkdirSync(srcDir, { recursive: true }); assertEquals(existsSync(srcDir), true); Deno.writeFileSync(srcFile, srcContent); @@ -294,8 +297,8 @@ test(function moveSyncIfSrcAndDestDirectoryExistsAndOverwrite(): void { const srcContent = new TextEncoder().encode("src"); const destContent = new TextEncoder().encode("dest"); - Deno.mkdirSync(srcDir, true); - Deno.mkdirSync(destDir, true); + Deno.mkdirSync(srcDir, { recursive: true }); + Deno.mkdirSync(destDir, { recursive: true }); assertEquals(existsSync(srcDir), true); assertEquals(existsSync(destDir), true); Deno.writeFileSync(srcFile, srcContent); diff --git a/std/fs/walk_test.ts b/std/fs/walk_test.ts index c0884175f6..8f218eca6c 100644 --- a/std/fs/walk_test.ts +++ b/std/fs/walk_test.ts @@ -105,7 +105,7 @@ testWalk( testWalk( async (d: string): Promise => { - await mkdir(d + "/a/b/c/d", true); + await mkdir(d + "/a/b/c/d", { recursive: true }); await touch(d + "/a/b/c/d/x"); }, async function depth(): Promise { diff --git a/std/io/util.ts b/std/io/util.ts index 1226640bd4..4bcf7d2e9d 100644 --- a/std/io/util.ts +++ b/std/io/util.ts @@ -40,7 +40,7 @@ export async function tempFile( const filepath = path.resolve( `${dir}/${opts.prefix || ""}${r}${opts.postfix || ""}` ); - await mkdir(path.dirname(filepath), true); + await mkdir(path.dirname(filepath), { recursive: true }); const file = await open(filepath, "a"); return { file, filepath }; }