diff --git a/src/asar.ts b/src/asar.ts index 6b380d21..002af429 100644 --- a/src/asar.ts +++ b/src/asar.ts @@ -26,7 +26,10 @@ function isUnpackedDir(dirPath: string, pattern: string, unpackDirs: string[]) { } return true; } else { - return unpackDirs.some((unpackDir) => dirPath.startsWith(unpackDir)); + return unpackDirs.some( + (unpackDir) => + dirPath.startsWith(unpackDir) && !path.relative(unpackDir, dirPath).startsWith('..'), + ); } } diff --git a/test/cli-spec.js b/test/cli-spec.js index b91d27ab..ed0e0ccd 100644 --- a/test/cli-spec.js +++ b/test/cli-spec.js @@ -174,13 +174,18 @@ describe('command line interface', function () { 'test/expected/packthis-unpack-dir.asar', ); }); - it('should create archive from directory with unpacked subdirs and files', async () => { + it('should create archive from directory with unpacked subdirs and files using minimatch', async () => { await execAsar( - 'p test/input/packthis-subdir/ tmp/packthis-unpack-subdir-cli.asar --unpack *.txt --unpack-dir dir2/subdir --exclude-hidden', + 'p test/input/packthis-subdir/ tmp/packthis-unpack-subdir-cli.asar --unpack *.txt --unpack-dir "{dir2/subdir,dir2/subdir}" --exclude-hidden', ); assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/file0.txt')); assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir1/file1.txt')); assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir2/subdir/file2.png')); assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir2/subdir/file3.txt')); + assert.ok( + fs.existsSync( + 'tmp/packthis-unpack-subdir-cli.asar.unpacked/dir2/subdir-do-not-unpack/file2.png', + ) === false, + ); }); }); diff --git a/test/input/packthis-subdir/dir2/subdir-do-not-unpack/file2.png b/test/input/packthis-subdir/dir2/subdir-do-not-unpack/file2.png new file mode 100644 index 00000000..a3986deb Binary files /dev/null and b/test/input/packthis-subdir/dir2/subdir-do-not-unpack/file2.png differ