From 7e2a3d1b3ec1cf0b9a1f1a9aa1d6c81c621ff095 Mon Sep 17 00:00:00 2001 From: Charlotte Som Date: Thu, 11 Apr 2024 23:32:29 +0000 Subject: [PATCH 1/2] fix(ext/fs): truncate files when a ReadableStream is passed to writeFile Closes #19697 --- ext/fs/30_fs.js | 1 + tests/unit/write_file_test.ts | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/ext/fs/30_fs.js b/ext/fs/30_fs.js index b6cd2d1f136776..e99c9837a315ab 100644 --- a/ext/fs/30_fs.js +++ b/ext/fs/30_fs.js @@ -926,6 +926,7 @@ async function writeFile( append: options.append ?? false, create: options.create ?? true, createNew: options.createNew ?? false, + truncate: true, write: true, }); await data.pipeTo(file.writable, { diff --git a/tests/unit/write_file_test.ts b/tests/unit/write_file_test.ts index 6cd08e2d14db98..29780446cf63ea 100644 --- a/tests/unit/write_file_test.ts +++ b/tests/unit/write_file_test.ts @@ -425,3 +425,21 @@ Deno.test( assertEquals(Deno.readFileSync(filename), new Uint8Array([1, 2])); }, ); + +Deno.test( + { permissions: { read: true, write: true } }, + async function overwriteFileWithStream() { + const filename = Deno.makeTempDirSync() + "/test.txt"; + await Deno.writeFile(filename, new Uint8Array([1, 2, 3, 4])); + + const stream = new ReadableStream({ + pull(controller) { + controller.enqueue(new Uint8Array([1])); + controller.enqueue(new Uint8Array([2])); + controller.close(); + }, + }); + await Deno.writeFile(filename, stream); + assertEquals(Deno.readFileSync(filename), new Uint8Array([1, 2])); + }, +); From 281776512cd1f3c9a30a78c88e646b0ce0a947b5 Mon Sep 17 00:00:00 2001 From: Charlotte Som Date: Wed, 24 Apr 2024 19:14:43 +0000 Subject: [PATCH 2/2] writeFile with ReadableStream: truncate only when not appending Mirrors op_fs_write_file_async behavior --- ext/fs/30_fs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/fs/30_fs.js b/ext/fs/30_fs.js index e99c9837a315ab..31094fb8204516 100644 --- a/ext/fs/30_fs.js +++ b/ext/fs/30_fs.js @@ -926,7 +926,7 @@ async function writeFile( append: options.append ?? false, create: options.create ?? true, createNew: options.createNew ?? false, - truncate: true, + truncate: !(options.append ?? false), write: true, }); await data.pipeTo(file.writable, {