summaryrefslogtreecommitdiff
path: root/std/node/_fs/promises
diff options
context:
space:
mode:
authorMarcos Casagrande <marcoscvp90@gmail.com>2020-05-05 00:59:37 +0200
committerGitHub <noreply@github.com>2020-05-04 18:59:37 -0400
commitf0aea98c85e18b297593ed6483b620945483fa37 (patch)
tree4176b47a2162e2713169a1d7858fdb6aec3a4ed5 /std/node/_fs/promises
parent5f67a202ff59f25ea183c261f664a6db06407e17 (diff)
feat(std/node): fs.writefile / fs.promises.writeFile (#5054)
Diffstat (limited to 'std/node/_fs/promises')
-rw-r--r--std/node/_fs/promises/_fs_writeFile.ts17
-rw-r--r--std/node/_fs/promises/_fs_writeFile_test.ts119
-rw-r--r--std/node/_fs/promises/mod.ts1
3 files changed, 137 insertions, 0 deletions
diff --git a/std/node/_fs/promises/_fs_writeFile.ts b/std/node/_fs/promises/_fs_writeFile.ts
new file mode 100644
index 000000000..a8f9586a2
--- /dev/null
+++ b/std/node/_fs/promises/_fs_writeFile.ts
@@ -0,0 +1,17 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+import { WriteFileOptions } from "../_fs_common.ts";
+
+import { writeFile as writeFileCallback } from "../_fs_writeFile.ts";
+
+export function writeFile(
+ pathOrRid: string | number,
+ data: string | Uint8Array,
+ options?: string | WriteFileOptions
+): Promise<void> {
+ return new Promise((resolve, reject) => {
+ writeFileCallback(pathOrRid, data, options, (err?: Error | null) => {
+ if (err) return reject(err);
+ resolve();
+ });
+ });
+}
diff --git a/std/node/_fs/promises/_fs_writeFile_test.ts b/std/node/_fs/promises/_fs_writeFile_test.ts
new file mode 100644
index 000000000..c67a7947a
--- /dev/null
+++ b/std/node/_fs/promises/_fs_writeFile_test.ts
@@ -0,0 +1,119 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+const { test } = Deno;
+
+import {
+ assert,
+ assertEquals,
+ assertNotEquals,
+ assertThrowsAsync,
+} from "../../../testing/asserts.ts";
+import { writeFile } from "./_fs_writeFile.ts";
+
+const decoder = new TextDecoder("utf-8");
+
+test("Invalid encoding results in error()", function testEncodingErrors() {
+ assertThrowsAsync(
+ async () => {
+ await writeFile("some/path", "some data", "made-up-encoding");
+ },
+ Error,
+ `The value "made-up-encoding" is invalid for option "encoding"`
+ );
+ assertThrowsAsync(
+ async () => {
+ await writeFile("some/path", "some data", {
+ encoding: "made-up-encoding",
+ });
+ },
+ Error,
+ `The value "made-up-encoding" is invalid for option "encoding"`
+ );
+});
+
+test("Unsupported encoding results in error()", function testUnsupportedEncoding() {
+ assertThrowsAsync(
+ async () => {
+ await writeFile("some/path", "some data", "hex");
+ },
+ Error,
+ `Not implemented: "hex" encoding`
+ );
+ assertThrowsAsync(
+ async () => {
+ await writeFile("some/path", "some data", {
+ encoding: "base64",
+ });
+ },
+ Error,
+ `Not implemented: "base64" encoding`
+ );
+});
+
+test("Data is written to correct rid", async function testCorrectWriteUsingRid() {
+ const tempFile: string = await Deno.makeTempFile();
+ const file: Deno.File = await Deno.open(tempFile, {
+ create: true,
+ write: true,
+ read: true,
+ });
+
+ await writeFile(file.rid, "hello world");
+ Deno.close(file.rid);
+
+ const data = await Deno.readFile(tempFile);
+ await Deno.remove(tempFile);
+ assertEquals(decoder.decode(data), "hello world");
+});
+
+test("Data is written to correct file", async function testCorrectWriteUsingPath() {
+ const openResourcesBeforeWrite: Deno.ResourceMap = Deno.resources();
+
+ await writeFile("_fs_writeFile_test_file.txt", "hello world");
+
+ assertEquals(Deno.resources(), openResourcesBeforeWrite);
+ const data = await Deno.readFile("_fs_writeFile_test_file.txt");
+ await Deno.remove("_fs_writeFile_test_file.txt");
+ assertEquals(decoder.decode(data), "hello world");
+});
+
+test("Mode is correctly set", async function testCorrectFileMode() {
+ if (Deno.build.os === "windows") return;
+ const filename = "_fs_writeFile_test_file.txt";
+ await writeFile(filename, "hello world", { mode: 0o777 });
+
+ const fileInfo = await Deno.stat(filename);
+ await Deno.remove(filename);
+ assert(fileInfo && fileInfo.mode);
+ assertEquals(fileInfo.mode & 0o777, 0o777);
+});
+
+test("Mode is not set when rid is passed", async function testCorrectFileModeRid() {
+ if (Deno.build.os === "windows") return;
+
+ const filename: string = await Deno.makeTempFile();
+ const file: Deno.File = await Deno.open(filename, {
+ create: true,
+ write: true,
+ read: true,
+ });
+
+ await writeFile(file.rid, "hello world", { mode: 0o777 });
+ Deno.close(file.rid);
+
+ const fileInfo = await Deno.stat(filename);
+ await Deno.remove(filename);
+ assert(fileInfo.mode);
+ assertNotEquals(fileInfo.mode & 0o777, 0o777);
+});
+
+test("Mode is not implemented on windows", function testModeNotImplementedWindows(): void {
+ if (Deno.build.os !== "windows") return;
+
+ assertThrowsAsync(
+ async () => {
+ await writeFile("fail.txt", "some data", { mode: 0o777 });
+ },
+ Error,
+ `Not implemented: "mode" on Windows`
+ );
+});
diff --git a/std/node/_fs/promises/mod.ts b/std/node/_fs/promises/mod.ts
new file mode 100644
index 000000000..3cb81a422
--- /dev/null
+++ b/std/node/_fs/promises/mod.ts
@@ -0,0 +1 @@
+export { writeFile } from "./_fs_writeFile.ts";