Skip to content

Commit

Permalink
feat: add emptyDir for fs modules (denoland#263)
Browse files Browse the repository at this point in the history
  • Loading branch information
axetroy authored and ry committed Mar 11, 2019
1 parent 142a1c6 commit 64d6bfc
Show file tree
Hide file tree
Showing 3 changed files with 170 additions and 0 deletions.
52 changes: 52 additions & 0 deletions fs/empty_dir.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
/**
* Ensures that a directory is empty.
* Deletes directory contents if the directory is not empty.
* If the directory does not exist, it is created.
* The directory itself is not deleted.
* @export
* @param {string} dir
* @returns {Promise<void>}
*/
export async function emptyDir(dir: string): Promise<void> {
let items: Deno.FileInfo[] = [];
try {
items = await Deno.readDir(dir);
} catch {
// if not exist. then create it
await Deno.mkdir(dir, true);
return;
}
while (items.length) {
const item = items.shift();
if (item && item.path) {
await Deno.remove(item.path, { recursive: true });
}
}
}

/**
* Ensures that a directory is empty.
* Deletes directory contents if the directory is not empty.
* If the directory does not exist, it is created.
* The directory itself is not deleted.
* @export
* @param {string} dir
* @returns {void}
*/
export function emptyDirSync(dir: string): void {
let items: Deno.FileInfo[] = [];
try {
items = Deno.readDirSync(dir);
} catch {
// if not exist. then create it
Deno.mkdirSync(dir, true);
return;
}
while (items.length) {
const item = items.shift();
if (item && item.path) {
Deno.removeSync(item.path, { recursive: true });
}
}
}
117 changes: 117 additions & 0 deletions fs/empty_dir_test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import { test } from "../testing/mod.ts";
import { assertEquals, assertThrowsAsync } from "../testing/asserts.ts";
import { emptyDir, emptyDirSync } from "./empty_dir.ts";
import * as path from "./path/mod.ts";

const testdataDir = path.resolve("fs", "testdata");

test(async function emptyDirIfItNotExist() {
const testDir = path.join(testdataDir, "empty_dir_test_1");
const testNestDir = path.join(testDir, "nest");
// empty a dir which not exist. then it will create new one
await emptyDir(testNestDir);

try {
// check the dir
const stat = await Deno.stat(testNestDir);
assertEquals(stat.isDirectory(), true);
} finally {
// remove the test dir
Deno.remove(testDir, { recursive: true });
}
});

test(function emptyDirSyncIfItNotExist() {
const testDir = path.join(testdataDir, "empty_dir_test_2");
const testNestDir = path.join(testDir, "nest");
// empty a dir which not exist. then it will create new one
emptyDirSync(testNestDir);

try {
// check the dir
const stat = Deno.statSync(testNestDir);
assertEquals(stat.isDirectory(), true);
} finally {
// remove the test dir
Deno.remove(testDir, { recursive: true });
}
});

test(async function emptyDirIfItExist() {
const testDir = path.join(testdataDir, "empty_dir_test_3");
const testNestDir = path.join(testDir, "nest");
// create test dir
await emptyDir(testNestDir);
const testDirFile = path.join(testNestDir, "test.ts");
// create test file in test dir
await Deno.writeFile(testDirFile, new Uint8Array());

// before empty: make sure file/directory exist
const beforeFileStat = await Deno.stat(testDirFile);
assertEquals(beforeFileStat.isFile(), true);

const beforeDirStat = await Deno.stat(testNestDir);
assertEquals(beforeDirStat.isDirectory(), true);

await emptyDir(testDir);

// after empty: file/directory have already remove
try {
// test dir still there
const stat = await Deno.stat(testDir);
assertEquals(stat.isDirectory(), true);

// nest directory have been remove
assertThrowsAsync(async () => {
await Deno.stat(testNestDir);
});

// test file have been remove
assertThrowsAsync(async () => {
await Deno.stat(testDirFile);
});
} finally {
// remote test dir
await Deno.remove(testDir, { recursive: true });
}
});

test(function emptyDirSyncIfItExist() {
const testDir = path.join(testdataDir, "empty_dir_test_4");
const testNestDir = path.join(testDir, "nest");
// create test dir
emptyDirSync(testNestDir);
const testDirFile = path.join(testNestDir, "test.ts");
// create test file in test dir
Deno.writeFileSync(testDirFile, new Uint8Array());

// before empty: make sure file/directory exist
const beforeFileStat = Deno.statSync(testDirFile);
assertEquals(beforeFileStat.isFile(), true);

const beforeDirStat = Deno.statSync(testNestDir);
assertEquals(beforeDirStat.isDirectory(), true);

emptyDirSync(testDir);

// after empty: file/directory have already remove
try {
// test dir still there
const stat = Deno.statSync(testDir);
assertEquals(stat.isDirectory(), true);

// nest directory have been remove
assertThrowsAsync(async () => {
Deno.statSync(testNestDir);
});

// test file have been remove
assertThrowsAsync(async () => {
Deno.statSync(testDirFile);
});
} finally {
// remote test dir
Deno.removeSync(testDir, { recursive: true });
}
});
1 change: 1 addition & 0 deletions test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import "./fs/walk_test.ts";
import "./fs/globrex_test.ts";
import "./fs/glob_test.ts";
import "./fs/exists_test.ts";
import "./fs/empty_dir_test.ts";
import "./io/test.ts";
import "./http/server_test.ts";
import "./http/file_server_test.ts";
Expand Down

0 comments on commit 64d6bfc

Please sign in to comment.