From 01082a42c3256ca6054f9627911cce4dbfe00d92 Mon Sep 17 00:00:00 2001 From: pieh Date: Thu, 19 Mar 2026 18:08:44 +0100 Subject: [PATCH] fix: reject top promise on floating addFilesAsync rejections PR-URL: https://github.com/isaacs/node-tar/pull/455 Credit: @pieh Close: #455 Reviewed-by: @isaacs --- src/create.ts | 4 ++-- test/create.ts | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/create.ts b/src/create.ts index 2053a1ec..082fc26a 100644 --- a/src/create.ts +++ b/src/create.ts @@ -33,7 +33,7 @@ const createFile = (opt: TarOptionsFile, files: string[]) => { p.on('error', rej) }) - addFilesAsync(p, files) + addFilesAsync(p, files).catch(er => p.emit('error', er)) return promise } @@ -79,7 +79,7 @@ const createSync = (opt: TarOptionsSync, files: string[]) => { const createAsync = (opt: TarOptions, files: string[]) => { const p = new Pack(opt) - addFilesAsync(p, files) + addFilesAsync(p, files).catch(er => p.emit('error', er)) return p } diff --git a/test/create.ts b/test/create.ts index 7cdb17ca..4aa64db4 100644 --- a/test/create.ts +++ b/test/create.ts @@ -289,6 +289,37 @@ t.test('must specify some files', t => { t.end() }) +t.test('error from @ file entry should be catchable', t => { + t.test('async with file option', t => { + const file = path.resolve(dir, 'at-error-file.tar') + t.rejects( + c( + { + file: file, + cwd: __dirname, + }, + ['@nonexistent.tar'], + ), + ).then(() => t.end()) + }) + + t.test('async without file option', t => { + const stream = c( + { + cwd: __dirname, + }, + ['@nonexistent.tar'], + ) + stream.on('error', er => { + t.match(er, { code: 'ENOENT' }) + t.end() + }) + stream.resume() + }) + + t.end() +}) + t.test('transform a filename', async t => { const cwd = t.testdir({ 'README.md': 'hello, world',