From 2ba954c1aff632ef59af44716c66c94645d418be Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Sun, 10 Nov 2024 17:47:49 -0800 Subject: [PATCH 1/3] fix: Respecting unpack configuration when considering symlinks within previously unpacked directories. This directly fixes unpacking static `.framework` modules on Mac, as otherwise codesigning will fail due to symlink files/directories not being reflected in the app.asar.unpacked directory. Added unit test with Hello.framework, generated from tutorial https://jano.dev/apple/mach-o/2024/06/28/Hello-Static-Framework.html Fixes: https://github.com/electron-userland/electron-builder/issues/8655 --- src/asar.ts | 49 +++++++---- src/disk.ts | 18 +++- src/filesystem.ts | 6 +- src/wrapped-fs.ts | 12 ++- test/cli-spec.js | 38 ++++++++ .../Hello.framework/Headers | 1 + .../Hello.framework/Hello | 1 + .../Hello.framework/Info.plist | 1 + .../Hello.framework/Modules | 1 + .../Versions/A/Headers/HelloFramework.h | 2 + .../Hello.framework/Versions/A/Hello | Bin 0 -> 16120 bytes .../Hello.framework/Versions/A/Info.plist | 24 +++++ .../Versions/A/Modules/Hello.abi.json | 82 ++++++++++++++++++ .../Versions/A/Modules/Hello.swiftdoc | Bin 0 -> 408 bytes .../arm64.private.swiftinterface | 12 +++ .../Hello.swiftmodule/arm64.swiftinterface | 12 +++ .../Hello.swiftmodule/arm64.swiftmodule | Bin 0 -> 17940 bytes .../x86_64.private.swiftinterface | 12 +++ .../Hello.swiftmodule/x86_64.swiftinterface | 12 +++ .../Hello.swiftmodule/x86_64.swiftmodule | Bin 0 -> 17944 bytes .../Versions/A/Modules/Hello.swiftsourceinfo | Bin 0 -> 1064 bytes .../Versions/A/Modules/module.modulemap | 4 + .../Hello.framework/Versions/Current | 1 + 23 files changed, 265 insertions(+), 23 deletions(-) create mode 120000 test/input/packthis-with-symlink/Hello.framework/Headers create mode 120000 test/input/packthis-with-symlink/Hello.framework/Hello create mode 120000 test/input/packthis-with-symlink/Hello.framework/Info.plist create mode 120000 test/input/packthis-with-symlink/Hello.framework/Modules create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Headers/HelloFramework.h create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Hello create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Info.plist create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.abi.json create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftdoc create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/arm64.private.swiftinterface create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/arm64.swiftinterface create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/arm64.swiftmodule create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.private.swiftinterface create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftinterface create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftmodule create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftsourceinfo create mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/module.modulemap create mode 120000 test/input/packthis-with-symlink/Hello.framework/Versions/Current diff --git a/src/asar.ts b/src/asar.ts index 9e30681a..a40c6f61 100644 --- a/src/asar.ts +++ b/src/asar.ts @@ -80,7 +80,8 @@ export async function createPackageFromFiles( }); const filesystem = new Filesystem(src); - const files: { filename: string; unpack: boolean }[] = []; + const files: disk.BasicFilesArray = []; + const links: disk.BasicFilesArray = []; const unpackDirs: string[] = []; let filenamesSorted: string[] = []; @@ -140,29 +141,43 @@ export async function createPackageFromFiles( } const file = metadata[filename]; + const shouldUnpackPath = function ( + relativeDirPath: string, + unpack: string | undefined, + unpackDir: string | undefined, + ) { + let shouldUnpack = false; + if (unpack) { + shouldUnpack = minimatch(filename, unpack, { matchBase: true }); + } + if (!shouldUnpack && unpackDir) { + shouldUnpack = isUnpackedDir(relativeDirPath, unpackDir, unpackDirs); + } + return shouldUnpack; + }; + let shouldUnpack: boolean; switch (file.type) { case 'directory': - if (options.unpackDir) { - shouldUnpack = isUnpackedDir(path.relative(src, filename), options.unpackDir, unpackDirs); - } else { - shouldUnpack = false; - } + shouldUnpack = shouldUnpackPath(path.relative(src, filename), undefined, options.unpackDir); filesystem.insertDirectory(filename, shouldUnpack); break; case 'file': - shouldUnpack = false; - if (options.unpack) { - shouldUnpack = minimatch(filename, options.unpack, { matchBase: true }); - } - if (!shouldUnpack && options.unpackDir) { - const dirName = path.relative(src, path.dirname(filename)); - shouldUnpack = isUnpackedDir(dirName, options.unpackDir, unpackDirs); - } - files.push({ filename: filename, unpack: shouldUnpack }); + shouldUnpack = shouldUnpackPath( + path.relative(src, path.dirname(filename)), + options.unpack, + options.unpackDir, + ); + files.push({ filename, unpack: shouldUnpack }); return filesystem.insertFile(filename, shouldUnpack, file, options); case 'link': - filesystem.insertLink(filename); + shouldUnpack = shouldUnpackPath( + path.relative(src, path.dirname(filename)), + options.unpack, + options.unpackDir, + ); + links.push({ filename, unpack: shouldUnpack }); + filesystem.insertLink(filename, shouldUnpack); break; } return Promise.resolve(); @@ -170,7 +185,7 @@ export async function createPackageFromFiles( const insertsDone = async function () { await fs.mkdirp(path.dirname(dest)); - return disk.writeFilesystem(dest, filesystem, files, metadata); + return disk.writeFilesystem(dest, filesystem, { files, links }, metadata); }; const names = filenamesSorted.slice(); diff --git a/src/disk.ts b/src/disk.ts index ecb7263d..344d1424 100644 --- a/src/disk.ts +++ b/src/disk.ts @@ -37,14 +37,17 @@ export type InputMetadata = { export type BasicFilesArray = { filename: string; unpack: boolean }[]; +export type FilesystemFilesAndLinks = { files: BasicFilesArray; links: BasicFilesArray }; + const writeFileListToStream = async function ( dest: string, filesystem: Filesystem, out: NodeJS.WritableStream, - fileList: BasicFilesArray, + lists: FilesystemFilesAndLinks, metadata: InputMetadata, ) { - for (const file of fileList) { + const { files, links } = lists; + for (const file of files) { if (file.unpack) { // the file should not be packed into archive const filename = path.relative(filesystem.getRootPath(), file.filename); @@ -53,13 +56,20 @@ const writeFileListToStream = async function ( await streamTransformedFile(file.filename, out, metadata[file.filename].transformed); } } + const unpackedSymlinks = links.filter((f) => f.unpack); + for (const file of unpackedSymlinks) { + // the symlink needs to be recreated outside in .unpacked + const filename = path.relative(filesystem.getRootPath(), file.filename); + const link = await fs.readlink(file.filename); + await fs.symlink(link, path.join(`${dest}.unpacked`, filename)); + } return out.end(); }; export async function writeFilesystem( dest: string, filesystem: Filesystem, - fileList: BasicFilesArray, + lists: FilesystemFilesAndLinks, metadata: InputMetadata, ) { const headerPickle = Pickle.createEmpty(); @@ -76,7 +86,7 @@ export async function writeFilesystem( out.write(sizeBuf); return out.write(headerBuf, () => resolve()); }); - return writeFileListToStream(dest, filesystem, out, fileList, metadata); + return writeFileListToStream(dest, filesystem, out, lists, metadata); } export interface FileRecord extends FilesystemFileEntry { diff --git a/src/filesystem.ts b/src/filesystem.ts index 4869f443..62d45bcc 100644 --- a/src/filesystem.ts +++ b/src/filesystem.ts @@ -156,7 +156,7 @@ export class Filesystem { this.offset += BigInt(size); } - insertLink(p: string) { + insertLink(p: string, shouldUnpack: boolean) { const symlink = fs.readlinkSync(p); // /var => /private/var const parentPath = fs.realpathSync(path.dirname(p)); @@ -165,6 +165,10 @@ export class Filesystem { throw new Error(`${p}: file "${link}" links out of the package`); } const node = this.searchNodeFromPath(p) as FilesystemLinkEntry; + const dirNode = this.searchNodeFromPath(path.dirname(p)) as FilesystemDirectoryEntry; + if (shouldUnpack || dirNode.unpacked) { + node.unpacked = true; + } node.link = link; return link; } diff --git a/src/wrapped-fs.ts b/src/wrapped-fs.ts index a8ed4299..104067c9 100644 --- a/src/wrapped-fs.ts +++ b/src/wrapped-fs.ts @@ -1,6 +1,14 @@ const fs = 'electron' in process.versions ? require('original-fs') : require('fs'); -const promisifiedMethods = ['lstat', 'mkdtemp', 'readFile', 'stat', 'writeFile']; +const promisifiedMethods = [ + 'lstat', + 'mkdtemp', + 'readFile', + 'stat', + 'writeFile', + 'symlink', + 'readlink', +]; type AsarFS = typeof import('fs') & { mkdirp(dir: string): Promise; @@ -10,6 +18,8 @@ type AsarFS = typeof import('fs') & { readFile: (typeof import('fs'))['promises']['readFile']; stat: (typeof import('fs'))['promises']['stat']; writeFile: (typeof import('fs'))['promises']['writeFile']; + symlink: (typeof import('fs'))['promises']['symlink']; + readlink: (typeof import('fs'))['promises']['readlink']; }; const promisified = {} as AsarFS; diff --git a/test/cli-spec.js b/test/cli-spec.js index ed0e0ccd..83678d69 100644 --- a/test/cli-spec.js +++ b/test/cli-spec.js @@ -188,4 +188,42 @@ describe('command line interface', function () { ) === false, ); }); + it('should unpack static framework with all underlying symlinks unpacked', async () => { + await execAsar( + 'p test/input/packthis-with-symlink/ tmp/packthis-with-symlink.asar --unpack *.txt --unpack-dir "{dir2/subdir,Hello.framework}" --exclude-hidden', + ); + // actual files + assert.ok(fs.existsSync('tmp/packthis-with-symlink.asar.unpacked/A/real.txt')); + assert.ok( + fs.existsSync('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Versions/A/Hello'), + ); + + // unpacked symlinks + assert.equal( + fs.readlinkSync('tmp/packthis-with-symlink.asar.unpacked/real.txt'), + 'Current/real.txt', + ); + + assert.equal( + fs.readlinkSync('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Hello'), + 'Versions/Current/Hello', + ); + assert.ok( + fs + .realpathSync( + 'tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Versions/Current/Hello', + ) + .endsWith('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Versions/A/Hello'), + ); + + assert.equal( + fs.readlinkSync('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Headers'), + 'Versions/Current/Headers', + ); + assert.ok( + fs + .realpathSync('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Headers') + .endsWith('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Versions/A/Headers'), + ); + }); }); diff --git a/test/input/packthis-with-symlink/Hello.framework/Headers b/test/input/packthis-with-symlink/Hello.framework/Headers new file mode 120000 index 00000000..a177d2a6 --- /dev/null +++ b/test/input/packthis-with-symlink/Hello.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/test/input/packthis-with-symlink/Hello.framework/Hello b/test/input/packthis-with-symlink/Hello.framework/Hello new file mode 120000 index 00000000..c1f0db26 --- /dev/null +++ b/test/input/packthis-with-symlink/Hello.framework/Hello @@ -0,0 +1 @@ +Versions/Current/Hello \ No newline at end of file diff --git a/test/input/packthis-with-symlink/Hello.framework/Info.plist b/test/input/packthis-with-symlink/Hello.framework/Info.plist new file mode 120000 index 00000000..ec889aa3 --- /dev/null +++ b/test/input/packthis-with-symlink/Hello.framework/Info.plist @@ -0,0 +1 @@ +Versions/Current/Info.plist \ No newline at end of file diff --git a/test/input/packthis-with-symlink/Hello.framework/Modules b/test/input/packthis-with-symlink/Hello.framework/Modules new file mode 120000 index 00000000..5736f318 --- /dev/null +++ b/test/input/packthis-with-symlink/Hello.framework/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Headers/HelloFramework.h b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Headers/HelloFramework.h new file mode 100755 index 00000000..1af71a0b --- /dev/null +++ b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Headers/HelloFramework.h @@ -0,0 +1,2 @@ +#import +void hello(void); diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Hello b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Hello new file mode 100755 index 0000000000000000000000000000000000000000..02ae196e4913053a03804ed1e3c8e80e28859c5e GIT binary patch literal 16120 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 literal 0 HcmV?d00001 diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Info.plist b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Info.plist new file mode 100755 index 00000000..59375bf5 --- /dev/null +++ b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + Hello + CFBundleIdentifier + com.example.Hello + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Hello + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSHumanReadableCopyright + Copyright © 2024 Hello Company. All rights reserved. + + diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.abi.json b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.abi.json new file mode 100755 index 00000000..54700d0a --- /dev/null +++ b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.abi.json @@ -0,0 +1,82 @@ +{ + "ABIRoot": { + "kind": "Root", + "name": "Hello", + "printedName": "Hello", + "children": [ + { + "kind": "TypeDecl", + "name": "Greeter", + "printedName": "Greeter", + "children": [ + { + "kind": "Constructor", + "name": "init", + "printedName": "init()", + "children": [ + { + "kind": "TypeNominal", + "name": "Greeter", + "printedName": "Hello.Greeter", + "usr": "s:5Hello7GreeterC" + } + ], + "declKind": "Constructor", + "usr": "s:5Hello7GreeterCACycfc", + "mangledName": "$s5Hello7GreeterCACycfc", + "moduleName": "Hello", + "declAttributes": [ + "AccessControl" + ], + "init_kind": "Designated" + }, + { + "kind": "Function", + "name": "hello", + "printedName": "hello()", + "children": [ + { + "kind": "TypeNominal", + "name": "Void", + "printedName": "()" + } + ], + "declKind": "Func", + "usr": "s:5Hello7GreeterC5helloyyF", + "mangledName": "$s5Hello7GreeterC5helloyyF", + "moduleName": "Hello", + "declAttributes": [ + "AccessControl" + ], + "funcSelfKind": "NonMutating" + } + ], + "declKind": "Class", + "usr": "s:5Hello7GreeterC", + "mangledName": "$s5Hello7GreeterC", + "moduleName": "Hello", + "declAttributes": [ + "AccessControl" + ], + "conformances": [ + { + "kind": "Conformance", + "name": "Copyable", + "printedName": "Copyable", + "usr": "s:s8CopyableP", + "mangledName": "$ss8CopyableP" + }, + { + "kind": "Conformance", + "name": "Escapable", + "printedName": "Escapable", + "usr": "s:s9EscapableP", + "mangledName": "$ss9EscapableP" + } + ] + } + ], + "json_format_version": 8 + }, + "ConstValues": [] +} \ No newline at end of file diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftdoc b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftdoc new file mode 100755 index 0000000000000000000000000000000000000000..5b333ebebe2736714b0569b511e36a301c387e87 GIT binary patch literal 408 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 G&;J8+5N|{P literal 0 HcmV?d00001 diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.private.swiftinterface b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.private.swiftinterface new file mode 100755 index 00000000..3b82bc74 --- /dev/null +++ b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.private.swiftinterface @@ -0,0 +1,12 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.2 effective-5.10 (swiftlang-6.0.2.1.2 clang-1600.0.26.4) +// swift-module-flags: -target x86_64-apple-macosx10.9.0 -enable-objc-interop -enable-library-evolution -module-name Hello +import Swift +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +public class Greeter { + public init() + public func hello() + @objc deinit +} diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftinterface b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftinterface new file mode 100755 index 00000000..3b82bc74 --- /dev/null +++ b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftinterface @@ -0,0 +1,12 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.0.2 effective-5.10 (swiftlang-6.0.2.1.2 clang-1600.0.26.4) +// swift-module-flags: -target x86_64-apple-macosx10.9.0 -enable-objc-interop -enable-library-evolution -module-name Hello +import Swift +import _Concurrency +import _StringProcessing +import _SwiftConcurrencyShims +public class Greeter { + public init() + public func hello() + @objc deinit +} diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftmodule b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftmodule new file mode 100755 index 0000000000000000000000000000000000000000..7e6a7ed96c57b7fa84a4bbc91e7bfc3790646745 GIT binary patch literal 17944 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 KQ6}6cfBqkxB5?!& literal 0 HcmV?d00001 diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftsourceinfo b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftsourceinfo new file mode 100755 index 0000000000000000000000000000000000000000..97c726d55b0a20e080cc98550d0261ec3f10f2eb GIT binary patch literal 1064 zcmaJ<%Wo245MLHrnx!^K8a2iPp*7iM-wQ0D9PGAHk0jQc2e-?&LWM$L)7qO74jvli zz)cfh^<=fR>5;_dGn$%U(k4y+0}~G(_yagN-%>~$8z-5a$8R3r>`eF7^Jkthipo$F z<@e-;dmp>ZdN#0;WxgnZ&1_&>Vcs{HPxqP4Zs6@Mv#Bs2D#7W%Pqtm>_v=EN=6iK^ z3-fC@nwg&ATeR4qxdwc(cWMXoO+(x=xL%!a7<>zVRrd{c4|5Q8#rNiOw`p)|P=My! znC)QssjF<@+4&CU59`7j$>i2)$dtE?XonUvH=eK!EUaU;M{_Lz z>HYRP>kEIEBW+1~d0E*1ObsK{vk08U~^=RorSPYgYMB?ZC{Ot6#j1SQxa@F+0BPZGff z6aj_I0V_B~B<6ou6mXI^c`B>lci}!42k4vOmKX$ zLZt>Xc_=R0@sJL+YYBIW$y-%~98{epc{CLgR=A62!85a~mTi$b%%7uom(L1G Date: Tue, 12 Nov 2024 11:13:50 -0800 Subject: [PATCH 2/3] adding unit test by programmatically create symlinks during test case (same approach as has been taken for filesystem UT already) --- package.json | 2 +- src/asar.ts | 6 +- src/disk.ts | 12 ++- test/cli-spec.js | 43 +++------ test/filesystem-spec.js | 24 +---- test/index.test-d.ts | 42 --------- .../Hello.framework/Headers | 1 - .../Hello.framework/Hello | 1 - .../Hello.framework/Info.plist | 1 - .../Hello.framework/Modules | 1 - .../Versions/A/Headers/HelloFramework.h | 2 - .../Hello.framework/Versions/A/Hello | Bin 16120 -> 0 bytes .../Hello.framework/Versions/A/Info.plist | 24 ----- .../Versions/A/Modules/Hello.abi.json | 82 ------------------ .../Versions/A/Modules/Hello.swiftdoc | Bin 408 -> 0 bytes .../arm64.private.swiftinterface | 12 --- .../Hello.swiftmodule/arm64.swiftinterface | 12 --- .../Hello.swiftmodule/arm64.swiftmodule | Bin 17940 -> 0 bytes .../x86_64.private.swiftinterface | 12 --- .../Hello.swiftmodule/x86_64.swiftinterface | 12 --- .../Hello.swiftmodule/x86_64.swiftmodule | Bin 17944 -> 0 bytes .../Versions/A/Modules/Hello.swiftsourceinfo | Bin 1064 -> 0 bytes .../Versions/A/Modules/module.modulemap | 4 - .../Hello.framework/Versions/Current | 1 - test/util/createSymlinkApp.js | 30 +++++++ 25 files changed, 59 insertions(+), 265 deletions(-) delete mode 100644 test/index.test-d.ts delete mode 120000 test/input/packthis-with-symlink/Hello.framework/Headers delete mode 120000 test/input/packthis-with-symlink/Hello.framework/Hello delete mode 120000 test/input/packthis-with-symlink/Hello.framework/Info.plist delete mode 120000 test/input/packthis-with-symlink/Hello.framework/Modules delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Headers/HelloFramework.h delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Hello delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Info.plist delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.abi.json delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftdoc delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/arm64.private.swiftinterface delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/arm64.swiftinterface delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/arm64.swiftmodule delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.private.swiftinterface delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftinterface delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftmodule delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftsourceinfo delete mode 100755 test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/module.modulemap delete mode 120000 test/input/packthis-with-symlink/Hello.framework/Versions/Current create mode 100644 test/util/createSymlinkApp.js diff --git a/package.json b/package.json index f1f0af26..3ca3ad53 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "mocha": "xvfb-maybe electron-mocha --reporter spec && mocha --reporter spec", "test": "yarn lint && yarn mocha", "lint": "yarn prettier:check", - "prettier": "prettier \"src/**/*.ts\" \"test/**/*.ts\" \"test/**/*.js\"", + "prettier": "prettier \"src/**/*.ts\" \"test/**/*.js\"", "prettier:check": "yarn prettier --check", "prettier:write": "yarn prettier --write", "prepare": "tsc" diff --git a/src/asar.ts b/src/asar.ts index a40c6f61..93c56d41 100644 --- a/src/asar.ts +++ b/src/asar.ts @@ -142,7 +142,7 @@ export async function createPackageFromFiles( const file = metadata[filename]; const shouldUnpackPath = function ( - relativeDirPath: string, + relativePath: string, unpack: string | undefined, unpackDir: string | undefined, ) { @@ -151,7 +151,7 @@ export async function createPackageFromFiles( shouldUnpack = minimatch(filename, unpack, { matchBase: true }); } if (!shouldUnpack && unpackDir) { - shouldUnpack = isUnpackedDir(relativeDirPath, unpackDir, unpackDirs); + shouldUnpack = isUnpackedDir(relativePath, unpackDir, unpackDirs); } return shouldUnpack; }; @@ -172,7 +172,7 @@ export async function createPackageFromFiles( return filesystem.insertFile(filename, shouldUnpack, file, options); case 'link': shouldUnpack = shouldUnpackPath( - path.relative(src, path.dirname(filename)), + path.relative(src, filename), options.unpack, options.unpackDir, ); diff --git a/src/disk.ts b/src/disk.ts index 344d1424..8555ff2d 100644 --- a/src/disk.ts +++ b/src/disk.ts @@ -61,7 +61,17 @@ const writeFileListToStream = async function ( // the symlink needs to be recreated outside in .unpacked const filename = path.relative(filesystem.getRootPath(), file.filename); const link = await fs.readlink(file.filename); - await fs.symlink(link, path.join(`${dest}.unpacked`, filename)); + // if symlink is within subdirectories, then we need to recreate dir structure + await fs.mkdirp(path.join(`${dest}.unpacked`, path.dirname(filename))); + // create symlink within unpacked dir + await fs.symlink(link, path.join(`${dest}.unpacked`, filename)).catch(async (error) => { + if (error.code === 'EPERM' && error.syscall === 'symlink') { + throw new Error( + 'Could not create symlinks for unpacked assets. On Windows, consider activating Developer Mode to allow non-admin users to create symlinks by following the instructions at https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development.', + ); + } + throw error; + }); } return out.end(); }; diff --git a/test/cli-spec.js b/test/cli-spec.js index 83678d69..296f27b7 100644 --- a/test/cli-spec.js +++ b/test/cli-spec.js @@ -11,6 +11,7 @@ const rimraf = require('rimraf'); const compDirs = require('./util/compareDirectories'); const compFileLists = require('./util/compareFileLists'); const compFiles = require('./util/compareFiles'); +const createSymlinkApp = require('./util/createSymlinkApp'); const exec = promisify(childProcess.exec); @@ -189,41 +190,21 @@ describe('command line interface', function () { ); }); it('should unpack static framework with all underlying symlinks unpacked', async () => { + const { tmpPath } = createSymlinkApp('app'); await execAsar( - 'p test/input/packthis-with-symlink/ tmp/packthis-with-symlink.asar --unpack *.txt --unpack-dir "{dir2/subdir,Hello.framework}" --exclude-hidden', - ); - // actual files - assert.ok(fs.existsSync('tmp/packthis-with-symlink.asar.unpacked/A/real.txt')); - assert.ok( - fs.existsSync('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Versions/A/Hello'), + `p ${tmpPath} tmp/packthis-with-symlink.asar --unpack *.txt --unpack-dir var --exclude-hidden`, ); - // unpacked symlinks - assert.equal( - fs.readlinkSync('tmp/packthis-with-symlink.asar.unpacked/real.txt'), - 'Current/real.txt', + assert.ok(fs.existsSync('tmp/packthis-with-symlink.asar.unpacked/private/var/file.txt')); + assert.ok(fs.existsSync('tmp/packthis-with-symlink.asar.unpacked/private/var/app/file.txt')); + assert.strictEqual( + fs.readlinkSync('tmp/packthis-with-symlink.asar.unpacked/private/var/app/file.txt'), + path.join('..', 'file.txt'), ); - - assert.equal( - fs.readlinkSync('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Hello'), - 'Versions/Current/Hello', - ); - assert.ok( - fs - .realpathSync( - 'tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Versions/Current/Hello', - ) - .endsWith('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Versions/A/Hello'), - ); - - assert.equal( - fs.readlinkSync('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Headers'), - 'Versions/Current/Headers', - ); - assert.ok( - fs - .realpathSync('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Headers') - .endsWith('tmp/packthis-with-symlink.asar.unpacked/Hello.framework/Versions/A/Headers'), + assert.strictEqual( + fs.readlinkSync('tmp/packthis-with-symlink.asar.unpacked/var'), + path.join('private', 'var'), ); + assert.ok(fs.existsSync('tmp/packthis-with-symlink.asar.unpacked/var/file.txt')); }); }); diff --git a/test/filesystem-spec.js b/test/filesystem-spec.js index cb33cf55..b8f9fbd6 100644 --- a/test/filesystem-spec.js +++ b/test/filesystem-spec.js @@ -4,6 +4,7 @@ const assert = require('assert'); const fs = require('../lib/wrapped-fs').default; const path = require('path'); const rimraf = require('rimraf'); +const createSymlinkedApp = require('./util/createSymlinkApp'); const Filesystem = require('../lib/filesystem').Filesystem; @@ -13,28 +14,7 @@ describe('filesystem', function () { }); it('should does not throw an error when the src path includes a symbol link', async () => { - /** - * Directory structure: - * tmp - * ├── private - * │ └── var - * │ ├── app - * │ │ └── file.txt -> ../file.txt - * │ └── file.txt - * └── var -> private/var - */ - const tmpPath = path.join(__dirname, '..', 'tmp'); - const privateVarPath = path.join(tmpPath, 'private', 'var'); - const varPath = path.join(tmpPath, 'var'); - fs.mkdirSync(privateVarPath, { recursive: true }); - fs.symlinkSync(path.relative(tmpPath, privateVarPath), varPath); - - const originFilePath = path.join(varPath, 'file.txt'); - fs.writeFileSync(originFilePath, 'hello world'); - const appPath = path.join(varPath, 'app'); - fs.mkdirpSync(appPath); - fs.symlinkSync('../file.txt', path.join(appPath, 'file.txt')); - + const { appPath, varPath } = createSymlinkedApp('filesystem'); const filesystem = new Filesystem(varPath); assert.doesNotThrow(() => { filesystem.insertLink(path.join(appPath, 'file.txt')); diff --git a/test/index.test-d.ts b/test/index.test-d.ts deleted file mode 100644 index 66465344..00000000 --- a/test/index.test-d.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as asar from '..'; -import * as fs from 'fs'; -import * as crypto from 'crypto'; -import { expectType } from 'tsd'; - -await asar.createPackage('bin', 'tmp/foo.asar'); -await asar.createPackageWithOptions('bin', 'tmp/foo.asar', { - dot: true, - globOptions: { - debug: true, - }, - transform: (filePath: string) => { - if (process.env.TRANSFORM_ASAR) { - return crypto - .createCipheriv('aes-256-cbc', crypto.randomBytes(32), crypto.randomBytes(16)) - .setAutoPadding(true) - .setEncoding('base64'); - } - }, -}); -await asar.createPackageFromFiles('bin', 'tmp/foo.asar', ['bin/asar.js']); -const stat = fs.statSync('bin/asar.js'); -await asar.createPackageFromFiles('bin', 'tmp/foo.asar', ['bin/asar.js'], { - 'bin/asar.js': { - type: 'file', - stat, - }, -}); - -expectType(asar.statFile('tmp/foo.asar', 'bin/asar.js')); -expectType(asar.statFile('tmp/foo.asar', 'bin/asar.js', false)); - -expectType(asar.listPackage('tmp/foo.asar')); -expectType(asar.listPackage('tmp/foo.asar', { isPack: true })); - -expectType(asar.extractFile('tmp/foo.asar', 'bin/asar.js')); - -asar.extractAll('tmp/foo.asar', 'tmp'); - -expectType(asar.uncache('tmp/foo.asar')); - -asar.uncacheAll(); diff --git a/test/input/packthis-with-symlink/Hello.framework/Headers b/test/input/packthis-with-symlink/Hello.framework/Headers deleted file mode 120000 index a177d2a6..00000000 --- a/test/input/packthis-with-symlink/Hello.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/test/input/packthis-with-symlink/Hello.framework/Hello b/test/input/packthis-with-symlink/Hello.framework/Hello deleted file mode 120000 index c1f0db26..00000000 --- a/test/input/packthis-with-symlink/Hello.framework/Hello +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Hello \ No newline at end of file diff --git a/test/input/packthis-with-symlink/Hello.framework/Info.plist b/test/input/packthis-with-symlink/Hello.framework/Info.plist deleted file mode 120000 index ec889aa3..00000000 --- a/test/input/packthis-with-symlink/Hello.framework/Info.plist +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Info.plist \ No newline at end of file diff --git a/test/input/packthis-with-symlink/Hello.framework/Modules b/test/input/packthis-with-symlink/Hello.framework/Modules deleted file mode 120000 index 5736f318..00000000 --- a/test/input/packthis-with-symlink/Hello.framework/Modules +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Modules \ No newline at end of file diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Headers/HelloFramework.h b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Headers/HelloFramework.h deleted file mode 100755 index 1af71a0b..00000000 --- a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Headers/HelloFramework.h +++ /dev/null @@ -1,2 +0,0 @@ -#import -void hello(void); diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Hello b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Hello deleted file mode 100755 index 02ae196e4913053a03804ed1e3c8e80e28859c5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16120 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 diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Info.plist b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Info.plist deleted file mode 100755 index 59375bf5..00000000 --- a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - Hello - CFBundleIdentifier - com.example.Hello - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Hello - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - NSHumanReadableCopyright - Copyright © 2024 Hello Company. All rights reserved. - - diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.abi.json b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.abi.json deleted file mode 100755 index 54700d0a..00000000 --- a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.abi.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "Hello", - "printedName": "Hello", - "children": [ - { - "kind": "TypeDecl", - "name": "Greeter", - "printedName": "Greeter", - "children": [ - { - "kind": "Constructor", - "name": "init", - "printedName": "init()", - "children": [ - { - "kind": "TypeNominal", - "name": "Greeter", - "printedName": "Hello.Greeter", - "usr": "s:5Hello7GreeterC" - } - ], - "declKind": "Constructor", - "usr": "s:5Hello7GreeterCACycfc", - "mangledName": "$s5Hello7GreeterCACycfc", - "moduleName": "Hello", - "declAttributes": [ - "AccessControl" - ], - "init_kind": "Designated" - }, - { - "kind": "Function", - "name": "hello", - "printedName": "hello()", - "children": [ - { - "kind": "TypeNominal", - "name": "Void", - "printedName": "()" - } - ], - "declKind": "Func", - "usr": "s:5Hello7GreeterC5helloyyF", - "mangledName": "$s5Hello7GreeterC5helloyyF", - "moduleName": "Hello", - "declAttributes": [ - "AccessControl" - ], - "funcSelfKind": "NonMutating" - } - ], - "declKind": "Class", - "usr": "s:5Hello7GreeterC", - "mangledName": "$s5Hello7GreeterC", - "moduleName": "Hello", - "declAttributes": [ - "AccessControl" - ], - "conformances": [ - { - "kind": "Conformance", - "name": "Copyable", - "printedName": "Copyable", - "usr": "s:s8CopyableP", - "mangledName": "$ss8CopyableP" - }, - { - "kind": "Conformance", - "name": "Escapable", - "printedName": "Escapable", - "usr": "s:s9EscapableP", - "mangledName": "$ss9EscapableP" - } - ] - } - ], - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftdoc b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftdoc deleted file mode 100755 index 5b333ebebe2736714b0569b511e36a301c387e87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 408 zcmaDfX9YVW2Lpp90|Ns)qlJ#c+7Dby0=U-%aP4>CT5rI$Ux91Q2d>2%xY!*xUFbQa zy@N^j#3Ahshx9v`wD%m+SaZl(Xp58P1t*OOP8vYc#=uE?50mBPYn*y|(md|a2-hzd4n?`+0@s)1_Cz?-JqfNyH0&0+-Ds0h{edLc?J@LuxZ@+- zZd^;Y75DSpkv8gODylMcN77fqQ;vAJ*TUSt^um*J;juHQ$KJe1%fVVdxfq@hPJ97%FV zaEph-oL@yxku!OIJ$@T()0?t~>4z_n`Sv8agAVQ(ZpBRw?q@jT<9Zz2Pdr?Ak}oK= z25Iu<5w>znvJOBqza3UYi%E2|wr;j!bmE+@j{}3X2Vr5!yo*3$3res~VA8QPZY0YH zYajI66S288h}y$F^#p4>8?$u#Z7@ftWFCr{yJBL@yWa-nbjQpHnNgrfcFB-r z?oW4GrL}YtyudArH*KAgEd)2Fd(02o1|>Mu2Kgy5@s)5bVhN+FgV_rz&a!qyS-Q*S zgj5lw09Ct;NtOs(;j9T+&LZ~MitdkcoYwb);P}OJEunl(%P}F}>k2lc6d{U}_hWTZ9jB-4E(dGNUVZnT%pb`ZXHl%E( zrh$SJ6uuQ8zCl`!32RT?GFm}f!;h|Ty9UQJMoubKoxNuWaz-;JiRXS zaLf*f!&yKjoUF=YRWU~kj*3Wk29RUwCjRgVGi(Ke4oMXt1DJJ8?e2c7;5E>2(g14R zgR0}%nJG4y8f5vt`ihh$j*L)+guDZ$KG>F4 ze`H8wABw?{w)U6}=2FL4wHed%a=TGBLF+a{uV{cFjw08KYQP zhX4T>UQRG6Gm7V2)&akzo2?v+5#J&5FcEOKIt%;b@DQ)4t$3^Jk_!P?(VyT324km@uY&tWMffKM2h*wQUN0ovYUde!osTkB_0}WGvcg&NnJPasc5xG6duAY>PPPP(u8Hk}&prkC%+lon{#Dhbeo!b_T5XB?0Oh6gA zX}tWS*<|1O*oQuH`(AjPV5Tw&42U`okRwa_NU>fS8m3$7)NxSI$T^Z~8kCYL3un&n z-;JoQVOU5aVj(Kxj(TV`g+9R`RBOWpKGd0F!IcaTPauLYcM#P*!V?8%7l9^SD+1!C z)}#@L-OJO10LoQ3b|0bzlfjr@e&;Pt#9}mt#}~`HfSc@U#7~OnWX}_CR3>8apee6? zROqa{D>H3^)^|}gR&f?Si3NI0nDSwdp%>l;Ayml{4{&qVc6}Zp!`{~ z>$wKY2!a+hiJYcBv-4iOPp5%~a*Hc^!! z_9nR_$U8`mC^SlzBOKdf)-lwbew)lbsF|rwbK0w_40y7^Gu7@ev2cH~>kZwP4?kB4 zO{Xyb49)pf=z%#e`MP@Av#^6ZhzNq8lotX5Jq9EFK~;*Q-+Vn)gnjui@o6JEmD$FV zI)E<29o&?vEwbn?{`_PV3z+!6RH0&8-8C6LgRx$d0RZwmuG9@FL@L#udb(5(+5P zos>Pn?1&77-xXirRm8=~faYEgK@)6337r{#od60l!4@QBq_eV#Qd(irdwMV4Aey2wQ1S`aUefCo&Ru^JKtqY7g4GE zx-L($j0Wn0?z--HO}kVR`62G7(c~a9LCRh z*0V2iL8QYBDxHeS2ST{{%8 zoDI~qYwNq?bptu_9+&}E-p!bjQR8KY@tiWdglzO|*bs4;t0$ryH+%u zYm+r$44;srOcw=Hs&bTzV!SUY`EIwrE&{9OBE-{MWq@bSjTk?JmmE2_{@|g6-x&nJMvR99<9|BR#d=EXch>Ke7LAZ3ThM*ipu0Y2Xzh}j@a9LDc79iS-aciA2JP-e zL2X@k;I14*1X^b*V;}GsKNgHI-KW_`ANlPm^Pn3OSp+x?DHBP{)8?SG>D)H%oWpcf zG<_nN;F+A5@pU|H560`mvAXs+3GR2-4ruFh4D-PX?gO|PD9!cBJC6_gYxc*@A-}U* zO9;yeJ?+!C0;OLKReZr^g(Lu}5n~^3{9_o!hVdNm*kw}jm}8XQ*X`hsgmw`H91N?i zjryH~+WNtG&7ig}dp65IbQvx>OkWUi;^Di^0Ozj27ucfdN(uLwV7MrnE(xYj+Hzgw zDfpzy@OjwyfoM9&6ORAjQ6Y82V?sn+26GDJl^ka<1y?s3&IzU~9>W#hbe$(GeGoQY z6pgzb#tRV&YS>0hMVT6jK3dCUthv|CM_*u48-+QlH`cTxworHL8eg1^d^mzyO zF=P4&aQ6^dCX8T9 zu+~Memh5l<+k>xGT2Z&8`KHuE?6`B=BEGN zXt>B5Ka6shN07>LlK{UhM2^L{IehP)9t>G9$B=tbIBxF@I8#=mln0yaB$B~xxqu4H zDcjE*KMiwN!h~_e=WD>LCl}P-=R&r@K;59f9^!{EPVNl0luO)=5hF?pE49505<&=?bXKOfbsEsF@I%U+_2i(vv6h%X17$yXZ9k$63LeAsP)OA>^6umuHv zzNF%Qx-74k4-wtxB&iiU+NFA+33Qt6t94e^a4l&}qVf<;H`)x>cw-XTKQ~AIc1KuR zG>ljd)MK(TD9L`2cwJDNg8;9+EER_WcRg(UNTl464Z-FFndXx&nZ^MVuK`ZG?lICy zS%=SZr}D#R2M`8sOBB@Vu7d)|T-kGKnJaOZy~YnPCpm~O=g)qT0*9Yi?*LJV2~hn# z@sa6r8>P$7pic&rK=t{OUsplZ^V}65P3|(t!a*4Vu#@$Jm}bB?1k~u4K~qX|AN3 zzXyjw8w46EaS+bCx#70TxrzHIX*>@*$ptJTBwL~He1DjAc7jS%B-+W|h2#P{&sR0Z zKfCQHxgLoD6p%B!lAZlh%}^YXm1Azt>QXtG5|fy&IC5_FdgmNNfy@)S;N45I89(!I z|K)+d5!c3R+4L~-$~{D(2xQb*32>UWZfD#a)Pj8LL1o$CeQaF@qR8J6DdP%={4X)b zE=@0YN;OnOyTNJoIaxOT)XYBIhtd_c1s{8nyXAbJi^O+chNHezn09*P9)+CD!@#P$ z4i6Edfr@U$2LTkh$QaJP+%k66!{;e7zRV>r{RpFXOLb9XdU#n|k8Brp-<55h#to2! zMw!`vC%ybCgdY#lhMU4|M!n=PPaBlr%!N&>OQ>w<|G!eP9T?X=_@_f+6135ZQU zJMKgQhY7}Pk3!pC$h?mG9M`YXE&zMmN^&J9$)9XV|Uc}Id8n-F!dleiKac6hu4UB`Ix79T*PCfh)hGzN$0ZX#9zEeej0`A za@6m?gBDzq+?8mqEqqstET~)065XQYp%~6%*ru)U%$E(HY+r`5F1HpBG*|(QFL-Pf zU)n)W0}-iaG+u{C&TMx!>|4npD!{+FPrSQ#P@39j33?+sIy$f;c&=eCbO>*YLl#5-?3#F!KYN2<%_IMaie=cPQL|FLVl z8p*yXLC>zB`jKp(x=+qPBE9G}UiRg%#>$7HF+8%?=esX(iYVjvyzxRY3 z8&8hwOX)2DmAI%Avxg5{oOux7OmNo;kaBv>7U2C89vuU9NCL&DRSxOt znt+hX^Q`#H-CrR?-G2d(@S+L)c@5bGLE^|Q>k}_NjbalZphtM_*{bGKe^cM8VWQ1x6qZ2dBkM#5u>E!^GkJIn?axv5N z6Qr&o33kR~V(x>k`vWW74;?N;q=z0%FN1t?#k@yiCcga0_o^`D>QmC>`vFTQ5jqtj z!%}@zi{~L2ByUaSzQaa*f}+?f*TNnny>~@Wg^juI#R@e?Jw15GC$H#XEkRzqvf!<2 zaD3yAc1m~t9|7pon# zt;z9My*P^%AiP<|8Xs1&GVkDBw1$jV{ykn=>s8qlqLy9dB6v}b7spsV!0%_V1-jty;oKNGmX_%pSk2Vam6gNU(}V^57vDxjNJ*`!PHt?hW*2>x$6Sh$+jC- z&ve8K3u#gQU>j6aHg;qV$1lJ-<{o*GLG`-gXw3H8x-Vav%M=s7CxUg+NSP7MK7sY+Asyv7&Umjb?s~0n~*1u$qe%K3q%B0v^N~46c1kIl|P{g`(6R zNL>52dd*8qMX>A_C`miFZBb1uHZo2ya3vSSlFI@0@Qzpj`Xt9%~rfItCsw2iMZoR$|n z{aDbkVKvP;|Ag{8bH|#t9ILWe@ChMGB*J!T&ro2Yasdl)*dBxx%7~=y6QbQhN{C<) zGUj$?_EQ$QoZ`>rk!Ur^l3sep5|gv#RK^8$*9q-CnkZBIXs*mLe+3p_u~7!wHJ{FN zIc9rbUe+CEt=%j_Jl)&ft@KXBu$wJYbGx(Vm$EisIN1h4))J-#reXOk-aBFi414HU zdz8hd3hmp9oNhnu{u%RwF*2pa&nuVTg)~?kOO*|8%5wZzKr_o5erYQyR zYZqw8Pix9B?@-J=RXK|Rx-kGYy-HS$r0_91IUC=S1;#3H8HOcROApra>zr#~Je9iA z1IL#rL%ffLJu*6W0V$rhV7LJmi{O>c^>61&Quj$sT7plJAMk^?;|$?%{^ z+qG%)2v&!&@dKO4uwK?Is9XBLUZ6iDnO@{ynX{06u;GAqfhP@nJ+x~Fc^I3HP47*c z0D0C1Xv+JnC+u8wc5BofdunK4DOt7#wp0L9Fr0$^3A-IrHh{&PL08uO`Nv7yjqV9= zn|KdJs~H0-J3|zpD%&lTtx9KsM@s(MM^!Umn=|+sv+P3>27Q9cfzYJ5TX97y`n$l3 zv>aa9@28!x&Q%X8CYOzUP~Hf%2gwRd59amAiTuSGiq+IT4A?=FRx4&fNIIJyQew4;){s$iQBH>=hdH+agjW(wE9% znR<9$S9k>*ifqU>5iqnry_X*wXom7#&J^HP(phG(rsxmRE&rzhyK~(ya@Z@~DN~s5 zM70t+e_^wv`X5hF#H@}gGsWz7O6Iey4OYnH(KO2s0{k)B_W`%4IRm*~Ntwux6O0_* zHcwR}I~qZnz$38Pma&BsdsI-GK$*44lrmO$8s(~*B{Kf2MW${UD!IfNhHp;@7TVJU zxBAs>KI(Q4zgevs%3YL4kQ+g3!B~9GaLjfVJJ&&kery?`%ngfRx7aQ)6KlstH|!si%iO7gRX}~ zzsA<}>o?%zybu=%kn2xXY3Gz`EVU*E1F4qg?i0VSzGDYnHrzO;rLtl%DwQ{D(D$4{+1aVg|f2HejLgl3+6rtM=J}4 z!h&l_lV|p%@MUz-Mkq`)Xz@m z$r>4*?_Kxc!<%stpIXSFdHJVkgN^)bx4*cgtR)l{0%2WI(|*1~aQSsbrR77WYk@Ig zG5tAhikZFF0&PZp>1>=R8!g;j&X+fAGCdq8R(k$feTlvIP`5cWpTG+e=W9vVFRVDvv6Z?1>*)lj; z3h9eVM++h1cJjw!{b+Cu)^@BUHN|f#vunSJCf$Cs+)ld|;Aao>%S;e{+9dr1_jCx- zQ}SGb`j^H;ALA<#7^Z~WJ@MnCpPpihIfi9?XuIwK9vEO2h}H{ez4#J7(y&4^9S}#Qz3ql zz?-yhnhNk&5k_a|h~(VPzP*7NSzd!frlN&mX5j*Rin-z1%6p$uECVC5znXFbpe<`C z*Vo)PTDT1^hXH*ZB3!QvO~PS9j6OzKW>>+3p)nca*8;`3%eT;lUZaJCc!VpU&n}$= zyZR2h0cY?1bWL*`Z12%e!{IiGc~1!n-x<15x05fGk;6=%y%=~AJ8`aaGTcNOya@D` zLFNq?oCBSOe}oDr;kKxroX>uD01(vAURmCVp`X%KH|& zFYEbvI4pa5Oz=)25Na-9O3?3~qSv zW~JyK6C0v6vPs?nM!PWn*03uGFR|-}$~>eGv49$O(5Y%(sU8{tJWQH-TFld@ z2zZ~am|5g*^Q8S=U9K0`=(wWNhJ<6A6t&)lS&~|q7Hr^a#Bcr~GEY0EwR9#_=N-R; z*|#&L;3_k&T>3r?7Yd6p9B=p@j+Kc6U#c-yeJy32SuOnR)$r+~cayO~x}s~^sV~gZ zy&sl;`*kJNEieYWipfl`Zt!%>3XvB-R*V6A%f?+cYnw!P@Xaj8ShLE9Ox61nq_Anu zV*Rw!urV(cP1`eCXk{BLz)8*Rgp&qa3A@w^v@(a60Y!gXu-{kmCRASY&zRUR>R}&3 z#kA|~?Y_fwzUN=Y#Gm8u11}X9m4?V(%&(Vk6{KKDr|EgXrz@J{65pG%7%F2Q`POIYZ4= zYD#L*R8g~nnvK*PrsfPaSE(tf6@$L2S}4iCqAl0+|3Xa$^utRci# z!TamJCb)c$Q8VpU!6i1{DtPCcfF8a6O|33;NmHr|T}Bi9PYrwWIs;1j15*^#g|6US z`zIP8Otbn4pHA~CH5brK72Yar3H14gABDSFsx1XeD={*`?mDvdX@pY~gRp-3QzO{_b>t^Ho zg5d3+LecxUg(zv(av1nt5>L%xYOYdK(u8IOHD{=~N=?aqXsW0wsYA1ojykA0OwAc; zu2NI-O*B<#d>hel{QuQ9=*5R7sW`H-C;twrHr$V92u*2|Z@>m0okp`2GxA-+fv?6c zxT1|{Cha`M!XJKrSf}~mFhZ*Vm0-!YXas7`ETjPmNmbNz5MWjSE6he}I;c4;ACbm~ zsX0TZ-xh68osj=h4WWK~Q5^X6MT!JpNtc#q^`d$) z{l|@?)X8ETr^YEH=_RBGeZJ=7#q=fR6vIqI7g;%+@Zy`Al(}Xeewp!YTZ_hvulPO4 z6$b1$q|eX_G`gE$$#F> zsNI-#@&k`j^1C;*J>I-}eJitM^P1*1`G{mMfSy0X-|Ft2V`3~?%rlP}^o*xK$NWLd z`kvQmd~5xTPg>C=Fpr^c%S=5Z8g6woW%y3U%%7U#cRkz2bdeVs4RiDd8y?Y9si$gOtDaZM! z9M7YMLw|W@b5)1XP4uOoG!Ji$9!Epr)z{(=i>GvcS4RPZM<4m4VQL2*`a)&~ezmkV z8l}6=a`c&s9#z3clhF$9n2FrC4V%`@BU_c0rhBYsd6m5(^1>nJa6s1mW8cr z7FI8;UbD9K&ep1CM^#N#mK-Zz{9~Ph5V||{DRD8(t@u%0z!xu@B11*Kq>Q7JbpgsI z=+vNLWZ-1>Azd@|&ewV@z z|M4uY2Vhdq{&0N?Y>eIn{7(!lW>NveidqM=x~lokHB}4d-C0{*RbA7(diA_!NA22{ z1q)iLYVW+$v1XF-EB1pqNZwyU2-KRSSGxYizLS8buPU=v>H3#t;>E*PmAU9E%7pvm G&;J8+5N|{P diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.private.swiftinterface b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.private.swiftinterface deleted file mode 100755 index 3b82bc74..00000000 --- a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.private.swiftinterface +++ /dev/null @@ -1,12 +0,0 @@ -// swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 6.0.2 effective-5.10 (swiftlang-6.0.2.1.2 clang-1600.0.26.4) -// swift-module-flags: -target x86_64-apple-macosx10.9.0 -enable-objc-interop -enable-library-evolution -module-name Hello -import Swift -import _Concurrency -import _StringProcessing -import _SwiftConcurrencyShims -public class Greeter { - public init() - public func hello() - @objc deinit -} diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftinterface b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftinterface deleted file mode 100755 index 3b82bc74..00000000 --- a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftinterface +++ /dev/null @@ -1,12 +0,0 @@ -// swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 6.0.2 effective-5.10 (swiftlang-6.0.2.1.2 clang-1600.0.26.4) -// swift-module-flags: -target x86_64-apple-macosx10.9.0 -enable-objc-interop -enable-library-evolution -module-name Hello -import Swift -import _Concurrency -import _StringProcessing -import _SwiftConcurrencyShims -public class Greeter { - public init() - public func hello() - @objc deinit -} diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftmodule b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftmodule/x86_64.swiftmodule deleted file mode 100755 index 7e6a7ed96c57b7fa84a4bbc91e7bfc3790646745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17944 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 KQ6}6cfBqkxB5?!& diff --git a/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftsourceinfo b/test/input/packthis-with-symlink/Hello.framework/Versions/A/Modules/Hello.swiftsourceinfo deleted file mode 100755 index 97c726d55b0a20e080cc98550d0261ec3f10f2eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1064 zcmaJ<%Wo245MLHrnx!^K8a2iPp*7iM-wQ0D9PGAHk0jQc2e-?&LWM$L)7qO74jvli zz)cfh^<=fR>5;_dGn$%U(k4y+0}~G(_yagN-%>~$8z-5a$8R3r>`eF7^Jkthipo$F z<@e-;dmp>ZdN#0;WxgnZ&1_&>Vcs{HPxqP4Zs6@Mv#Bs2D#7W%Pqtm>_v=EN=6iK^ z3-fC@nwg&ATeR4qxdwc(cWMXoO+(x=xL%!a7<>zVRrd{c4|5Q8#rNiOw`p)|P=My! znC)QssjF<@+4&CU59`7j$>i2)$dtE?XonUvH=eK!EUaU;M{_Lz z>HYRP>kEIEBW+1~d0E*1ObsK{vk08U~^=RorSPYgYMB?ZC{Ot6#j1SQxa@F+0BPZGff z6aj_I0V_B~B<6ou6mXI^c`B>lci}!42k4vOmKX$ zLZt>Xc_=R0@sJL+YYBIW$y-%~98{epc{CLgR=A62!85a~mTi$b%%7uom(L1G ../file.txt + * │ └── file.txt + * └── var -> private/var + */ +module.exports = (testName) => { + const tmpPath = path.join(__dirname, '../..', 'tmp', testName || 'app'); + const privateVarPath = path.join(tmpPath, 'private', 'var'); + const varPath = path.join(tmpPath, 'var'); + + rimraf.sync(tmpPath, fs); + + fs.mkdirSync(privateVarPath, { recursive: true }); + fs.symlinkSync(path.relative(tmpPath, privateVarPath), varPath); + + const originFilePath = path.join(varPath, 'file.txt'); + fs.writeFileSync(originFilePath, 'hello world'); + const appPath = path.join(varPath, 'app'); + fs.mkdirpSync(appPath); + fs.symlinkSync('../file.txt', path.join(appPath, 'file.txt')); + return { appPath, tmpPath, varPath }; +}; From b9b358faf198e8a6ac332e27a7f621bb46d94f36 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Wed, 25 Dec 2024 07:41:58 -0800 Subject: [PATCH 3/3] cleanup changes post-merging `main` --- package.json | 2 +- test/index.test-d.ts | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 test/index.test-d.ts diff --git a/package.json b/package.json index 3ca3ad53..f1f0af26 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "mocha": "xvfb-maybe electron-mocha --reporter spec && mocha --reporter spec", "test": "yarn lint && yarn mocha", "lint": "yarn prettier:check", - "prettier": "prettier \"src/**/*.ts\" \"test/**/*.js\"", + "prettier": "prettier \"src/**/*.ts\" \"test/**/*.ts\" \"test/**/*.js\"", "prettier:check": "yarn prettier --check", "prettier:write": "yarn prettier --write", "prepare": "tsc" diff --git a/test/index.test-d.ts b/test/index.test-d.ts new file mode 100644 index 00000000..66465344 --- /dev/null +++ b/test/index.test-d.ts @@ -0,0 +1,42 @@ +import * as asar from '..'; +import * as fs from 'fs'; +import * as crypto from 'crypto'; +import { expectType } from 'tsd'; + +await asar.createPackage('bin', 'tmp/foo.asar'); +await asar.createPackageWithOptions('bin', 'tmp/foo.asar', { + dot: true, + globOptions: { + debug: true, + }, + transform: (filePath: string) => { + if (process.env.TRANSFORM_ASAR) { + return crypto + .createCipheriv('aes-256-cbc', crypto.randomBytes(32), crypto.randomBytes(16)) + .setAutoPadding(true) + .setEncoding('base64'); + } + }, +}); +await asar.createPackageFromFiles('bin', 'tmp/foo.asar', ['bin/asar.js']); +const stat = fs.statSync('bin/asar.js'); +await asar.createPackageFromFiles('bin', 'tmp/foo.asar', ['bin/asar.js'], { + 'bin/asar.js': { + type: 'file', + stat, + }, +}); + +expectType(asar.statFile('tmp/foo.asar', 'bin/asar.js')); +expectType(asar.statFile('tmp/foo.asar', 'bin/asar.js', false)); + +expectType(asar.listPackage('tmp/foo.asar')); +expectType(asar.listPackage('tmp/foo.asar', { isPack: true })); + +expectType(asar.extractFile('tmp/foo.asar', 'bin/asar.js')); + +asar.extractAll('tmp/foo.asar', 'tmp'); + +expectType(asar.uncache('tmp/foo.asar')); + +asar.uncacheAll();