diff options
-rw-r--r-- | cli/js/lib.deno.ns.d.ts | 9 | ||||
-rw-r--r-- | cli/js/write_text_file.ts | 25 | ||||
-rw-r--r-- | cli/tests/unit/write_text_file_test.ts | 107 |
3 files changed, 125 insertions, 16 deletions
diff --git a/cli/js/lib.deno.ns.d.ts b/cli/js/lib.deno.ns.d.ts index 2137ce336..4a3417b5d 100644 --- a/cli/js/lib.deno.ns.d.ts +++ b/cli/js/lib.deno.ns.d.ts @@ -1524,7 +1524,11 @@ declare namespace Deno { * * Requires `allow-write` permission, and `allow-read` if `options.create` is `false`. */ - export function writeTextFileSync(path: string | URL, data: string): void; + export function writeTextFileSync( + path: string | URL, + data: string, + options?: WriteFileOptions + ): void; /** Asynchronously write string `data` to the given `path`, by default creating a new file if needed, * else overwriting. @@ -1537,7 +1541,8 @@ declare namespace Deno { */ export function writeTextFile( path: string | URL, - data: string + data: string, + options?: WriteFileOptions ): Promise<void>; /** Synchronously truncates or extends the specified file, to reach the diff --git a/cli/js/write_text_file.ts b/cli/js/write_text_file.ts index 615813460..ca7646c75 100644 --- a/cli/js/write_text_file.ts +++ b/cli/js/write_text_file.ts @@ -1,23 +1,20 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { writeFileSync, writeFile, WriteFileOptions } from "./write_file.ts"; -import { open, openSync } from "./files.ts"; -import { writeAll, writeAllSync } from "./buffer.ts"; - -export function writeTextFileSync(path: string | URL, data: string): void { - const file = openSync(path, { write: true, create: true, truncate: true }); +export function writeTextFileSync( + path: string | URL, + data: string, + options: WriteFileOptions = {} +): void { const encoder = new TextEncoder(); - const contents = encoder.encode(data); - writeAllSync(file, contents); - file.close(); + return writeFileSync(path, encoder.encode(data), options); } -export async function writeTextFile( +export function writeTextFile( path: string | URL, - data: string + data: string, + options: WriteFileOptions = {} ): Promise<void> { - const file = await open(path, { write: true, create: true, truncate: true }); const encoder = new TextEncoder(); - const contents = encoder.encode(data); - await writeAll(file, contents); - file.close(); + return writeFile(path, encoder.encode(data), options); } diff --git a/cli/tests/unit/write_text_file_test.ts b/cli/tests/unit/write_text_file_test.ts index fcc8ba728..57e78b860 100644 --- a/cli/tests/unit/write_text_file_test.ts +++ b/cli/tests/unit/write_text_file_test.ts @@ -1,5 +1,6 @@ import { unitTest, + assert, assertEquals, assertThrows, assertThrowsAsync, @@ -48,6 +49,59 @@ unitTest({ perms: { write: false } }, function writeTextFileSyncPerm(): void { unitTest( { perms: { read: true, write: true } }, + function writeTextFileSyncUpdateMode(): void { + if (Deno.build.os !== "windows") { + const data = "Hello"; + const filename = Deno.makeTempDirSync() + "/test.txt"; + Deno.writeTextFileSync(filename, data, { mode: 0o755 }); + assertEquals(Deno.statSync(filename).mode! & 0o777, 0o755); + Deno.writeTextFileSync(filename, data, { mode: 0o666 }); + assertEquals(Deno.statSync(filename).mode! & 0o777, 0o666); + } + } +); + +unitTest( + { perms: { read: true, write: true } }, + function writeTextFileSyncCreate(): void { + const data = "Hello"; + const filename = Deno.makeTempDirSync() + "/test.txt"; + let caughtError = false; + // if create turned off, the file won't be created + try { + Deno.writeTextFileSync(filename, data, { create: false }); + } catch (e) { + caughtError = true; + assert(e instanceof Deno.errors.NotFound); + } + assert(caughtError); + + // Turn on create, should have no error + Deno.writeTextFileSync(filename, data, { create: true }); + Deno.writeTextFileSync(filename, data, { create: false }); + assertEquals("Hello", Deno.readTextFileSync(filename)); + } +); + +unitTest( + { perms: { read: true, write: true } }, + function writeTextFileSyncAppend(): void { + const data = "Hello"; + const filename = Deno.makeTempDirSync() + "/test.txt"; + Deno.writeTextFileSync(filename, data); + Deno.writeTextFileSync(filename, data, { append: true }); + assertEquals("HelloHello", Deno.readTextFileSync(filename)); + // Now attempt overwrite + Deno.writeTextFileSync(filename, data, { append: false }); + assertEquals("Hello", Deno.readTextFileSync(filename)); + // append not set should also overwrite + Deno.writeTextFileSync(filename, data); + assertEquals("Hello", Deno.readTextFileSync(filename)); + } +); + +unitTest( + { perms: { read: true, write: true } }, async function writeTextFileSuccess(): Promise<void> { const filename = Deno.makeTempDirSync() + "/test.txt"; await Deno.writeTextFile(filename, "Hello"); @@ -92,3 +146,56 @@ unitTest( }, Deno.errors.PermissionDenied); } ); + +unitTest( + { perms: { read: true, write: true } }, + async function writeTextFileUpdateMode(): Promise<void> { + if (Deno.build.os !== "windows") { + const data = "Hello"; + const filename = Deno.makeTempDirSync() + "/test.txt"; + await Deno.writeTextFile(filename, data, { mode: 0o755 }); + assertEquals(Deno.statSync(filename).mode! & 0o777, 0o755); + await Deno.writeTextFile(filename, data, { mode: 0o666 }); + assertEquals(Deno.statSync(filename).mode! & 0o777, 0o666); + } + } +); + +unitTest( + { perms: { read: true, write: true } }, + async function writeTextFileCreate(): Promise<void> { + const data = "Hello"; + const filename = Deno.makeTempDirSync() + "/test.txt"; + let caughtError = false; + // if create turned off, the file won't be created + try { + await Deno.writeTextFile(filename, data, { create: false }); + } catch (e) { + caughtError = true; + assert(e instanceof Deno.errors.NotFound); + } + assert(caughtError); + + // Turn on create, should have no error + await Deno.writeTextFile(filename, data, { create: true }); + await Deno.writeTextFile(filename, data, { create: false }); + assertEquals("Hello", Deno.readTextFileSync(filename)); + } +); + +unitTest( + { perms: { read: true, write: true } }, + async function writeTextFileAppend(): Promise<void> { + const data = "Hello"; + const filename = Deno.makeTempDirSync() + "/test.txt"; + await Deno.writeTextFile(filename, data); + await Deno.writeTextFile(filename, data, { append: true }); + assertEquals("HelloHello", Deno.readTextFileSync(filename)); + // Now attempt overwrite + await Deno.writeTextFile(filename, data, { append: false }); + assertEquals("Hello", Deno.readTextFileSync(filename)); + // append not set should also overwrite + await Deno.writeTextFile(filename, data); + assertEquals("Hello", Deno.readTextFileSync(filename)); + } +); |