app-builder-lib 27.0.0-alpha.3 → 27.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/codeSign/mac/macCodeSign.d.ts.map +1 -1
- package/dist/codeSign/mac/macCodeSign.js +3 -6
- package/dist/codeSign/mac/macCodeSign.js.map +1 -1
- package/dist/codeSign/win/signtoolBaseSignManager.d.ts.map +1 -1
- package/dist/codeSign/win/signtoolBaseSignManager.js +11 -3
- package/dist/codeSign/win/signtoolBaseSignManager.js.map +1 -1
- package/dist/codeSign/win/windowsSignAzureManager.d.ts.map +1 -1
- package/dist/codeSign/win/windowsSignAzureManager.js +31 -21
- package/dist/codeSign/win/windowsSignAzureManager.js.map +1 -1
- package/dist/configuration.d.ts +37 -44
- package/dist/configuration.d.ts.map +1 -1
- package/dist/configuration.js.map +1 -1
- package/dist/electron/ElectronFramework.js +2 -2
- package/dist/electron/ElectronFramework.js.map +1 -1
- package/dist/electron/electronVersion.d.ts.map +1 -1
- package/dist/electron/electronVersion.js +1 -11
- package/dist/electron/electronVersion.js.map +1 -1
- package/dist/fileMatcher.d.ts +27 -2
- package/dist/fileMatcher.d.ts.map +1 -1
- package/dist/fileMatcher.js +204 -16
- package/dist/fileMatcher.js.map +1 -1
- package/dist/indexInternal.d.ts +6 -5
- package/dist/indexInternal.d.ts.map +1 -1
- package/dist/indexInternal.js +6 -5
- package/dist/indexInternal.js.map +1 -1
- package/dist/macPackager.d.ts +5 -0
- package/dist/macPackager.d.ts.map +1 -1
- package/dist/macPackager.js +35 -0
- package/dist/macPackager.js.map +1 -1
- package/dist/node-module-collector/moduleManager.d.ts +3 -1
- package/dist/node-module-collector/moduleManager.d.ts.map +1 -1
- package/dist/node-module-collector/moduleManager.js +9 -1
- package/dist/node-module-collector/moduleManager.js.map +1 -1
- package/dist/node-module-collector/nodeModulesCollector.d.ts +13 -23
- package/dist/node-module-collector/nodeModulesCollector.d.ts.map +1 -1
- package/dist/node-module-collector/nodeModulesCollector.js +52 -122
- package/dist/node-module-collector/nodeModulesCollector.js.map +1 -1
- package/dist/node-module-collector/pnpmNodeModulesCollector.js +5 -5
- package/dist/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
- package/dist/node-module-collector/types.d.ts +2 -0
- package/dist/node-module-collector/types.d.ts.map +1 -1
- package/dist/node-module-collector/types.js.map +1 -1
- package/dist/options/PlatformSpecificBuildOptions.d.ts +0 -6
- package/dist/options/PlatformSpecificBuildOptions.d.ts.map +1 -1
- package/dist/options/PlatformSpecificBuildOptions.js.map +1 -1
- package/dist/options/SnapOptions.d.ts +15 -13
- package/dist/options/SnapOptions.d.ts.map +1 -1
- package/dist/options/SnapOptions.js.map +1 -1
- package/dist/options/linuxOptions.d.ts +0 -10
- package/dist/options/linuxOptions.d.ts.map +1 -1
- package/dist/options/linuxOptions.js.map +1 -1
- package/dist/options/winOptions.d.ts +164 -34
- package/dist/options/winOptions.d.ts.map +1 -1
- package/dist/options/winOptions.js.map +1 -1
- package/dist/packager.d.ts +2 -0
- package/dist/packager.d.ts.map +1 -1
- package/dist/packager.js +20 -22
- package/dist/packager.js.map +1 -1
- package/dist/platformPackager.d.ts +3 -0
- package/dist/platformPackager.d.ts.map +1 -1
- package/dist/platformPackager.js +11 -6
- package/dist/platformPackager.js.map +1 -1
- package/dist/publish/PublishManager.d.ts +1 -0
- package/dist/publish/PublishManager.d.ts.map +1 -1
- package/dist/publish/PublishManager.js +7 -2
- package/dist/publish/PublishManager.js.map +1 -1
- package/dist/targets/linux/FlatpakTarget.d.ts.map +1 -1
- package/dist/targets/linux/FlatpakTarget.js +4 -1
- package/dist/targets/linux/FlatpakTarget.js.map +1 -1
- package/dist/targets/linux/FpmTarget.d.ts +6 -0
- package/dist/targets/linux/FpmTarget.d.ts.map +1 -1
- package/dist/targets/linux/FpmTarget.js +28 -6
- package/dist/targets/linux/FpmTarget.js.map +1 -1
- package/dist/targets/linux/LinuxTargetHelper.d.ts +14 -0
- package/dist/targets/linux/LinuxTargetHelper.d.ts.map +1 -1
- package/dist/targets/linux/LinuxTargetHelper.js +38 -59
- package/dist/targets/linux/LinuxTargetHelper.js.map +1 -1
- package/dist/targets/linux/appimage/AppImageTarget.d.ts +1 -0
- package/dist/targets/linux/appimage/AppImageTarget.d.ts.map +1 -1
- package/dist/targets/linux/appimage/AppImageTarget.js +12 -14
- package/dist/targets/linux/appimage/AppImageTarget.js.map +1 -1
- package/dist/targets/linux/appimage/appImageUtil.d.ts +4 -0
- package/dist/targets/linux/appimage/appImageUtil.d.ts.map +1 -1
- package/dist/targets/linux/appimage/appImageUtil.js +11 -4
- package/dist/targets/linux/appimage/appImageUtil.js.map +1 -1
- package/dist/targets/linux/appimage/appLauncher.d.ts.map +1 -1
- package/dist/targets/linux/appimage/appLauncher.js +5 -11
- package/dist/targets/linux/appimage/appLauncher.js.map +1 -1
- package/dist/targets/linux/launcherScript.d.ts +32 -0
- package/dist/targets/linux/launcherScript.d.ts.map +1 -0
- package/dist/targets/linux/launcherScript.js +24 -0
- package/dist/targets/linux/launcherScript.js.map +1 -0
- package/dist/targets/linux/snap/SnapTarget.d.ts +1 -1
- package/dist/targets/linux/snap/SnapTarget.d.ts.map +1 -1
- package/dist/targets/linux/snap/SnapTarget.js +23 -1
- package/dist/targets/linux/snap/SnapTarget.js.map +1 -1
- package/dist/targets/linux/snap/core24.d.ts +1 -1
- package/dist/targets/linux/snap/core24.d.ts.map +1 -1
- package/dist/targets/linux/snap/core24.js +3 -2
- package/dist/targets/linux/snap/core24.js.map +1 -1
- package/dist/targets/linux/snap/coreCustom.d.ts +1 -1
- package/dist/targets/linux/snap/coreCustom.d.ts.map +1 -1
- package/dist/targets/linux/snap/coreCustom.js +2 -2
- package/dist/targets/linux/snap/coreCustom.js.map +1 -1
- package/dist/targets/linux/snap/coreLegacy.d.ts +1 -1
- package/dist/targets/linux/snap/coreLegacy.d.ts.map +1 -1
- package/dist/targets/linux/snap/coreLegacy.js +8 -7
- package/dist/targets/linux/snap/coreLegacy.js.map +1 -1
- package/dist/targets/linux/snap/snapCommand.d.ts +2 -2
- package/dist/targets/linux/snap/snapCommand.d.ts.map +1 -1
- package/dist/targets/linux/snap/snapCommand.js +4 -10
- package/dist/targets/linux/snap/snapCommand.js.map +1 -1
- package/dist/targets/linux/snap/snapcraftBuilder.d.ts +7 -1
- package/dist/targets/linux/snap/snapcraftBuilder.d.ts.map +1 -1
- package/dist/targets/linux/snap/snapcraftBuilder.js +57 -20
- package/dist/targets/linux/snap/snapcraftBuilder.js.map +1 -1
- package/dist/targets/targetFactory.d.ts +7 -0
- package/dist/targets/targetFactory.d.ts.map +1 -1
- package/dist/targets/targetFactory.js +28 -0
- package/dist/targets/targetFactory.js.map +1 -1
- package/dist/targets/win/AppxTarget.d.ts.map +1 -1
- package/dist/targets/win/AppxTarget.js +17 -9
- package/dist/targets/win/AppxTarget.js.map +1 -1
- package/dist/targets/win/MsiTarget.d.ts.map +1 -1
- package/dist/targets/win/MsiTarget.js +8 -11
- package/dist/targets/win/MsiTarget.js.map +1 -1
- package/dist/targets/win/nsis/NsisTarget.d.ts +3 -2
- package/dist/targets/win/nsis/NsisTarget.d.ts.map +1 -1
- package/dist/targets/win/nsis/NsisTarget.js +26 -49
- package/dist/targets/win/nsis/NsisTarget.js.map +1 -1
- package/dist/targets/win/nsis/nsisScriptGenerator.d.ts.map +1 -1
- package/dist/targets/win/nsis/nsisScriptGenerator.js +3 -2
- package/dist/targets/win/nsis/nsisScriptGenerator.js.map +1 -1
- package/dist/targets/win/nsis/nsisUtil.d.ts +5 -2
- package/dist/targets/win/nsis/nsisUtil.d.ts.map +1 -1
- package/dist/targets/win/nsis/nsisUtil.js +46 -22
- package/dist/targets/win/nsis/nsisUtil.js.map +1 -1
- package/dist/targets/win/nsis/progId.d.ts +21 -0
- package/dist/targets/win/nsis/progId.d.ts.map +1 -0
- package/dist/targets/win/nsis/progId.js +60 -0
- package/dist/targets/win/nsis/progId.js.map +1 -0
- package/dist/toolsets/7zip.d.ts.map +1 -1
- package/dist/toolsets/7zip.js +3 -1
- package/dist/toolsets/7zip.js.map +1 -1
- package/dist/toolsets/appimage.d.ts +3 -3
- package/dist/toolsets/appimage.d.ts.map +1 -1
- package/dist/toolsets/appimage.js +9 -6
- package/dist/toolsets/appimage.js.map +1 -1
- package/dist/toolsets/custom.d.ts +1 -3
- package/dist/toolsets/custom.d.ts.map +1 -1
- package/dist/toolsets/custom.js +4 -133
- package/dist/toolsets/custom.js.map +1 -1
- package/dist/toolsets/fpm.d.ts.map +1 -1
- package/dist/toolsets/fpm.js +11 -5
- package/dist/toolsets/fpm.js.map +1 -1
- package/dist/toolsets/icons.d.ts.map +1 -1
- package/dist/toolsets/icons.js +13 -2
- package/dist/toolsets/icons.js.map +1 -1
- package/dist/toolsets/linuxToolsMac.d.ts.map +1 -1
- package/dist/toolsets/linuxToolsMac.js +4 -1
- package/dist/toolsets/linuxToolsMac.js.map +1 -1
- package/dist/toolsets/nsis.d.ts.map +1 -1
- package/dist/toolsets/nsis.js +6 -3
- package/dist/toolsets/nsis.js.map +1 -1
- package/dist/toolsets/version.d.ts +12 -0
- package/dist/toolsets/version.d.ts.map +1 -0
- package/dist/toolsets/version.js +13 -0
- package/dist/toolsets/version.js.map +1 -0
- package/dist/toolsets/winCodeSign.d.ts +11 -3
- package/dist/toolsets/winCodeSign.d.ts.map +1 -1
- package/dist/toolsets/winCodeSign.js +45 -27
- package/dist/toolsets/winCodeSign.js.map +1 -1
- package/dist/toolsets/wine.d.ts +2 -1
- package/dist/toolsets/wine.d.ts.map +1 -1
- package/dist/toolsets/wine.js +15 -13
- package/dist/toolsets/wine.js.map +1 -1
- package/dist/util/NodeModuleCopyHelper.js +3 -3
- package/dist/util/NodeModuleCopyHelper.js.map +1 -1
- package/dist/util/appFileCopier.d.ts +39 -0
- package/dist/util/appFileCopier.d.ts.map +1 -1
- package/dist/util/appFileCopier.js +71 -20
- package/dist/util/appFileCopier.js.map +1 -1
- package/dist/util/archCompatibility.d.ts +42 -0
- package/dist/util/archCompatibility.d.ts.map +1 -0
- package/dist/util/archCompatibility.js +202 -0
- package/dist/util/archCompatibility.js.map +1 -0
- package/dist/util/config/config.d.ts +1 -0
- package/dist/util/config/config.d.ts.map +1 -1
- package/dist/util/config/config.js +4 -1
- package/dist/util/config/config.js.map +1 -1
- package/dist/util/config/load.d.ts +2 -2
- package/dist/util/config/load.d.ts.map +1 -1
- package/dist/util/config/load.js +3 -12
- package/dist/util/config/load.js.map +1 -1
- package/dist/util/config/schemaValidator.js +1 -1
- package/dist/util/config/schemaValidator.js.map +1 -1
- package/dist/util/electronGet.d.ts +6 -3
- package/dist/util/electronGet.d.ts.map +1 -1
- package/dist/util/electronGet.js +23 -9
- package/dist/util/electronGet.js.map +1 -1
- package/dist/util/flags.d.ts +0 -1
- package/dist/util/flags.d.ts.map +1 -1
- package/dist/util/flags.js +0 -3
- package/dist/util/flags.js.map +1 -1
- package/dist/util/hash.d.ts +1 -1
- package/dist/util/hash.d.ts.map +1 -1
- package/dist/util/hash.js +1 -15
- package/dist/util/hash.js.map +1 -1
- package/dist/util/installOrRebuild.d.ts +38 -0
- package/dist/util/installOrRebuild.d.ts.map +1 -0
- package/dist/util/{yarn.js → installOrRebuild.js} +65 -14
- package/dist/util/installOrRebuild.js.map +1 -0
- package/dist/util/langs.d.ts.map +1 -1
- package/dist/util/langs.js +1 -0
- package/dist/util/langs.js.map +1 -1
- package/dist/util/mac/macosIconComposer.d.ts +2 -1
- package/dist/util/mac/macosIconComposer.d.ts.map +1 -1
- package/dist/util/mac/macosIconComposer.js +40 -58
- package/dist/util/mac/macosIconComposer.js.map +1 -1
- package/dist/util/streamSpawnToFile.d.ts +47 -0
- package/dist/util/streamSpawnToFile.d.ts.map +1 -0
- package/dist/util/streamSpawnToFile.js +110 -0
- package/dist/util/streamSpawnToFile.js.map +1 -0
- package/dist/util/toolsetLock.d.ts +2 -0
- package/dist/util/toolsetLock.d.ts.map +1 -1
- package/dist/util/toolsetLock.js +31 -5
- package/dist/util/toolsetLock.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +8 -8
- package/scheme.json +94 -130
- package/templates/appx/appxmanifest.xml +1 -2
- package/templates/nsis/assistedMessages.yml +17 -0
- package/templates/nsis/messages.yml +5 -0
- package/dist/util/yarn.d.ts +0 -23
- package/dist/util/yarn.d.ts.map +0 -1
- package/dist/util/yarn.js.map +0 -1
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { copyFile, dirSize, log } from "builder-util";
|
|
1
|
+
import { copyFile, debug7z, dirSize, exec, log } from "builder-util";
|
|
2
2
|
import * as fs from "fs/promises";
|
|
3
3
|
import * as path from "path";
|
|
4
4
|
import * as zlib from "zlib";
|
|
5
5
|
import { isWindowsSigningDisabled } from "../../../options/winOptions.js";
|
|
6
6
|
import { getNsisElevatePath } from "../../../toolsets/nsis.js";
|
|
7
|
+
import { getPath7za } from "../../../toolsets/7zip.js";
|
|
7
8
|
import { getTemplatePath } from "../../../util/pathManager.js";
|
|
9
|
+
import { compute7zCompressArgs } from "../../archive.js";
|
|
8
10
|
export const nsisTemplatesDir = getTemplatePath("nsis");
|
|
9
11
|
export class AppPackageHelper {
|
|
10
12
|
constructor(elevateHelper) {
|
|
@@ -18,10 +20,7 @@ export class AppPackageHelper {
|
|
|
18
20
|
let resultPromise = this.archToResult.get(arch);
|
|
19
21
|
if (resultPromise == null) {
|
|
20
22
|
const appOutDir = target.archs.get(arch);
|
|
21
|
-
resultPromise = this.elevateHelper
|
|
22
|
-
.copy(appOutDir, target)
|
|
23
|
-
.then(() => target.buildAppPackage(appOutDir, arch))
|
|
24
|
-
.then(async (fileInfo) => ({
|
|
23
|
+
resultPromise = target.buildAppPackage(appOutDir, arch, this.elevateHelper).then(async (fileInfo) => ({
|
|
25
24
|
fileInfo,
|
|
26
25
|
unpackedSize: await dirSize(appOutDir),
|
|
27
26
|
}));
|
|
@@ -52,11 +51,15 @@ export class AppPackageHelper {
|
|
|
52
51
|
}
|
|
53
52
|
export class CopyElevateHelper {
|
|
54
53
|
constructor() {
|
|
55
|
-
|
|
54
|
+
// Cached path resolution — shared across all arches since the source never changes per build.
|
|
55
|
+
this.elevatePath = null;
|
|
56
|
+
// appOutDirs whose win-unpacked copy of elevate.exe has already been deferred, so the same
|
|
57
|
+
// directory isn't queued twice when multiple NSIS targets (e.g. nsis + nsis-web) share an arch.
|
|
58
|
+
this.stagedUnpackedCopies = new Set();
|
|
56
59
|
}
|
|
57
|
-
|
|
60
|
+
resolve(target) {
|
|
58
61
|
if (!target.packager.framework.isCopyElevateHelper) {
|
|
59
|
-
return Promise.resolve();
|
|
62
|
+
return Promise.resolve(null);
|
|
60
63
|
}
|
|
61
64
|
let isPackElevateHelper = target.options.packElevateHelper;
|
|
62
65
|
if (isPackElevateHelper === false && target.options.perMachine === true) {
|
|
@@ -64,22 +67,43 @@ export class CopyElevateHelper {
|
|
|
64
67
|
log.warn("`packElevateHelper = false` is ignored, because `perMachine` is set to `true`");
|
|
65
68
|
}
|
|
66
69
|
if (isPackElevateHelper === false) {
|
|
67
|
-
return Promise.resolve();
|
|
70
|
+
return Promise.resolve(null);
|
|
68
71
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
+
if (this.elevatePath == null) {
|
|
73
|
+
this.elevatePath = getNsisElevatePath(target.packager.config.toolsets?.nsis, target.packager.buildResourcesDir);
|
|
74
|
+
}
|
|
75
|
+
return this.elevatePath;
|
|
76
|
+
}
|
|
77
|
+
// Injects elevate.exe directly into the already-built NSIS archive via a temp staging dir, and
|
|
78
|
+
// defers copying it into win-unpacked until every target has finished reading the shared
|
|
79
|
+
// appOutDir. This keeps elevate.exe in the dir-target output while guaranteeing concurrent
|
|
80
|
+
// targets (Squirrel, ZIP, appx, …) never capture it mid-build (fixes the #9852 race).
|
|
81
|
+
async addToArchive(archiveFile, target, format, archiveOptions, appOutDir) {
|
|
82
|
+
const elevatePath = await this.resolve(target);
|
|
83
|
+
if (!elevatePath) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const stagingDir = await target.packager.tempDirManager.getTempDir({ prefix: "elevate-staging" });
|
|
87
|
+
const resourcesDir = path.join(stagingDir, "resources");
|
|
88
|
+
await fs.mkdir(resourcesDir, { recursive: true });
|
|
89
|
+
const stagedElevate = path.join(resourcesDir, "elevate.exe");
|
|
90
|
+
await copyFile(elevatePath, stagedElevate, false);
|
|
91
|
+
if (!isWindowsSigningDisabled(target.packager.platformOptions)) {
|
|
92
|
+
await target.packager.signIf(stagedElevate);
|
|
93
|
+
}
|
|
94
|
+
// Reuse the parent archive's compression args so the appended entry is consistent with the
|
|
95
|
+
// rest of the archive (notably `store` and differential-aware builds, where bare `7za a`
|
|
96
|
+
// defaults — solid on, -mx=9, NTFS timestamps — would diverge from the original entries).
|
|
97
|
+
const args = compute7zCompressArgs(format, archiveOptions);
|
|
98
|
+
args.push(archiveFile, "resources/elevate.exe");
|
|
99
|
+
await exec(await getPath7za(), args, { cwd: stagingDir }, debug7z.enabled);
|
|
100
|
+
// Defer the win-unpacked copy: it must land after every concurrent target has packaged
|
|
101
|
+
// appOutDir, so it is never captured by Squirrel/zip/etc. The staged (and possibly signed)
|
|
102
|
+
// binary lives in tempDirManager, which is cleaned up only after the build finishes.
|
|
103
|
+
if (!this.stagedUnpackedCopies.has(appOutDir)) {
|
|
104
|
+
this.stagedUnpackedCopies.add(appOutDir);
|
|
105
|
+
target.packager.addBuildFinalizeTask(() => copyFile(stagedElevate, path.join(appOutDir, "resources", "elevate.exe"), false));
|
|
72
106
|
}
|
|
73
|
-
promise = getNsisElevatePath(target.packager.config.toolsets?.nsis, target.packager.buildResourcesDir).then(elevatePath => {
|
|
74
|
-
const outFile = path.join(appOutDir, "resources", "elevate.exe");
|
|
75
|
-
const promise = copyFile(elevatePath, outFile, false);
|
|
76
|
-
if (!isWindowsSigningDisabled(target.packager.platformOptions)) {
|
|
77
|
-
return promise.then(() => target.packager.signIf(outFile));
|
|
78
|
-
}
|
|
79
|
-
return promise;
|
|
80
|
-
});
|
|
81
|
-
this.copied.set(appOutDir, promise);
|
|
82
|
-
return promise;
|
|
83
107
|
}
|
|
84
108
|
}
|
|
85
109
|
class BinaryReader {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nsisUtil.js","sourceRoot":"","sources":["../../../../src/targets/win/nsis/nsisUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, copyFile, dirSize, log } from \"builder-util\"\nimport { PackageFileInfo } from \"builder-util-runtime\"\nimport * as fs from \"fs/promises\"\nimport * as path from \"path\"\nimport * as zlib from \"zlib\"\nimport { isWindowsSigningDisabled } from \"../../../options/winOptions.js\"\nimport { getNsisElevatePath } from \"../../../toolsets/nsis.js\"\nimport { getTemplatePath } from \"../../../util/pathManager.js\"\nimport { NsisTarget } from \"./NsisTarget.js\"\n\nexport const nsisTemplatesDir = getTemplatePath(\"nsis\")\n\nexport interface PackArchResult {\n fileInfo: PackageFileInfo\n unpackedSize: number\n}\n\nexport class AppPackageHelper {\n private readonly archToResult = new Map<Arch, Promise<PackArchResult>>()\n private readonly infoToIsDelete = new Map<PackageFileInfo, boolean>()\n\n /** @private */\n refCount = 0\n\n constructor(private readonly elevateHelper: CopyElevateHelper) {}\n\n async packArch(arch: Arch, target: NsisTarget): Promise<PackArchResult> {\n let resultPromise = this.archToResult.get(arch)\n if (resultPromise == null) {\n const appOutDir = target.archs.get(arch)!\n resultPromise = this.elevateHelper\n .copy(appOutDir, target)\n .then(() => target.buildAppPackage(appOutDir, arch))\n .then(async fileInfo => ({\n fileInfo,\n unpackedSize: await dirSize(appOutDir),\n }))\n this.archToResult.set(arch, resultPromise)\n }\n\n const result = await resultPromise\n const { fileInfo: info } = result\n if (target.isWebInstaller) {\n this.infoToIsDelete.set(info, false)\n } else if (!this.infoToIsDelete.has(info)) {\n this.infoToIsDelete.set(info, true)\n }\n return result\n }\n\n async finishBuild(): Promise<any> {\n if (--this.refCount > 0) {\n return\n }\n\n const filesToDelete: Array<string> = []\n for (const [info, isDelete] of this.infoToIsDelete.entries()) {\n if (isDelete) {\n filesToDelete.push(info.path)\n }\n }\n\n await Promise.all(filesToDelete.map(it => fs.unlink(it)))\n }\n}\n\nexport class CopyElevateHelper {\n private readonly copied = new Map<string, Promise<any>>()\n\n copy(appOutDir: string, target: NsisTarget): Promise<any> {\n if (!target.packager.framework.isCopyElevateHelper) {\n return Promise.resolve()\n }\n\n let isPackElevateHelper = target.options.packElevateHelper\n if (isPackElevateHelper === false && target.options.perMachine === true) {\n isPackElevateHelper = true\n log.warn(\"`packElevateHelper = false` is ignored, because `perMachine` is set to `true`\")\n }\n\n if (isPackElevateHelper === false) {\n return Promise.resolve()\n }\n\n let promise = this.copied.get(appOutDir)\n if (promise != null) {\n return promise\n }\n\n promise = getNsisElevatePath(target.packager.config.toolsets?.nsis, target.packager.buildResourcesDir).then(elevatePath => {\n const outFile = path.join(appOutDir, \"resources\", \"elevate.exe\")\n const promise = copyFile(elevatePath, outFile, false)\n if (!isWindowsSigningDisabled(target.packager.platformOptions)) {\n return promise.then(() => target.packager.signIf(outFile))\n }\n return promise\n })\n this.copied.set(appOutDir, promise)\n return promise\n }\n}\n\nclass BinaryReader {\n private readonly _buffer: Buffer\n private _position: number\n\n constructor(buffer: Buffer) {\n this._buffer = buffer\n this._position = 0\n }\n\n get length(): number {\n return this._buffer.length\n }\n\n get position(): number {\n return this._position\n }\n\n match(signature: Array<number>): boolean {\n if (signature.every((v, i) => this._buffer[this._position + i] === v)) {\n this._position += signature.length\n return true\n }\n return false\n }\n\n skip(offset: number) {\n this._position += offset\n }\n\n bytes(size: number): Buffer {\n const value = this._buffer.subarray(this._position, this._position + size)\n this._position += size\n return value\n }\n\n uint16(): number {\n const value = this._buffer[this._position] | (this._buffer[this._position + 1] << 8)\n this._position += 2\n return value\n }\n\n uint32(): number {\n return this.uint16() | (this.uint16() << 16)\n }\n\n string(length: number): string {\n let value = \"\"\n for (let i = 0; i < length; i++) {\n const c = this._buffer[this._position + i]\n if (c === 0x00) {\n break\n }\n value += String.fromCharCode(c)\n }\n this._position += length\n return value\n }\n}\n\nexport class UninstallerReader {\n // noinspection SpellCheckingInspection\n static async exec(installerPath: string, uninstallerPath: string) {\n const buffer = await fs.readFile(installerPath)\n const reader = new BinaryReader(buffer)\n // IMAGE_DOS_HEADER\n if (!reader.match([0x4d, 0x5a])) {\n throw new Error(\"Invalid 'MZ' signature.\")\n }\n reader.skip(58)\n // e_lfanew\n reader.skip(reader.uint32() - reader.position)\n // IMAGE_FILE_HEADER\n if (!reader.match([0x50, 0x45, 0x00, 0x00])) {\n throw new Error(\"Invalid 'PE' signature.\")\n }\n reader.skip(2)\n const numberOfSections = reader.uint16()\n reader.skip(12)\n const sizeOfOptionalHeader = reader.uint16()\n reader.skip(2)\n reader.skip(sizeOfOptionalHeader)\n // IMAGE_SECTION_HEADER\n let nsisOffset = 0\n for (let i = 0; i < numberOfSections; i++) {\n const name = reader.string(8)\n reader.skip(8)\n const rawSize = reader.uint32()\n const rawPointer = reader.uint32()\n reader.skip(16)\n switch (name) {\n case \".text\":\n case \".rdata\":\n case \".data\":\n case \".rsrc\": {\n nsisOffset = Math.max(rawPointer + rawSize, nsisOffset)\n break\n }\n default: {\n if (rawPointer !== 0 && rawSize !== 0) {\n throw new Error(\"Unsupported section '\" + name + \"'.\")\n }\n break\n }\n }\n }\n const executable = buffer.subarray(0, nsisOffset)\n const nsisSize = buffer.length - nsisOffset\n const nsisReader = new BinaryReader(buffer.subarray(nsisOffset, nsisOffset + nsisSize))\n const nsisSignature = [0xef, 0xbe, 0xad, 0xde, 0x4e, 0x75, 0x6c, 0x6c, 0x73, 0x6f, 0x66, 0x74, 0x49, 0x6e, 0x73, 0x74]\n nsisReader.uint32() // ?\n if (!nsisReader.match(nsisSignature)) {\n throw new Error(\"Invalid signature.\")\n }\n nsisReader.uint32() // ?\n if (nsisSize !== nsisReader.uint32()) {\n throw new Error(\"Size mismatch.\")\n }\n\n let innerBuffer = null\n while (true) {\n let size = nsisReader.uint32()\n const compressed = (size & 0x80000000) !== 0\n size = size & 0x7fffffff\n if (size === 0 || nsisReader.position + size > nsisReader.length || nsisReader.position >= nsisReader.length) {\n break\n }\n let buffer = nsisReader.bytes(size)\n if (compressed) {\n buffer = zlib.inflateRawSync(buffer)\n }\n const innerReader = new BinaryReader(buffer)\n innerReader.uint32() // ?\n if (innerReader.match(nsisSignature)) {\n if (innerBuffer) {\n throw new Error(\"Multiple inner blocks.\")\n }\n innerBuffer = buffer\n }\n }\n if (!innerBuffer) {\n throw new Error(\"Inner block not found.\")\n }\n await fs.writeFile(uninstallerPath, executable)\n await fs.appendFile(uninstallerPath, innerBuffer)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"nsisUtil.js","sourceRoot":"","sources":["../../../../src/targets/win/nsis/nsisUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, copyFile, debug7z, dirSize, exec, log } from \"builder-util\"\nimport { PackageFileInfo } from \"builder-util-runtime\"\nimport * as fs from \"fs/promises\"\nimport * as path from \"path\"\nimport * as zlib from \"zlib\"\nimport { isWindowsSigningDisabled } from \"../../../options/winOptions.js\"\nimport { getNsisElevatePath } from \"../../../toolsets/nsis.js\"\nimport { getPath7za } from \"../../../toolsets/7zip.js\"\nimport { getTemplatePath } from \"../../../util/pathManager.js\"\nimport { ArchiveOptions, compute7zCompressArgs } from \"../../archive.js\"\nimport { NsisTarget } from \"./NsisTarget.js\"\n\nexport const nsisTemplatesDir = getTemplatePath(\"nsis\")\n\nexport interface PackArchResult {\n fileInfo: PackageFileInfo\n unpackedSize: number\n}\n\nexport class AppPackageHelper {\n private readonly archToResult = new Map<Arch, Promise<PackArchResult>>()\n private readonly infoToIsDelete = new Map<PackageFileInfo, boolean>()\n\n /** @private */\n refCount = 0\n\n constructor(private readonly elevateHelper: CopyElevateHelper) {}\n\n async packArch(arch: Arch, target: NsisTarget): Promise<PackArchResult> {\n let resultPromise = this.archToResult.get(arch)\n if (resultPromise == null) {\n const appOutDir = target.archs.get(arch)!\n resultPromise = target.buildAppPackage(appOutDir, arch, this.elevateHelper).then(async fileInfo => ({\n fileInfo,\n unpackedSize: await dirSize(appOutDir),\n }))\n this.archToResult.set(arch, resultPromise)\n }\n\n const result = await resultPromise\n const { fileInfo: info } = result\n if (target.isWebInstaller) {\n this.infoToIsDelete.set(info, false)\n } else if (!this.infoToIsDelete.has(info)) {\n this.infoToIsDelete.set(info, true)\n }\n return result\n }\n\n async finishBuild(): Promise<any> {\n if (--this.refCount > 0) {\n return\n }\n\n const filesToDelete: Array<string> = []\n for (const [info, isDelete] of this.infoToIsDelete.entries()) {\n if (isDelete) {\n filesToDelete.push(info.path)\n }\n }\n\n await Promise.all(filesToDelete.map(it => fs.unlink(it)))\n }\n}\n\nexport class CopyElevateHelper {\n // Cached path resolution — shared across all arches since the source never changes per build.\n private elevatePath: Promise<string | null> | null = null\n\n // appOutDirs whose win-unpacked copy of elevate.exe has already been deferred, so the same\n // directory isn't queued twice when multiple NSIS targets (e.g. nsis + nsis-web) share an arch.\n private readonly stagedUnpackedCopies = new Set<string>()\n\n private resolve(target: NsisTarget): Promise<string | null> {\n if (!target.packager.framework.isCopyElevateHelper) {\n return Promise.resolve(null)\n }\n\n let isPackElevateHelper = target.options.packElevateHelper\n if (isPackElevateHelper === false && target.options.perMachine === true) {\n isPackElevateHelper = true\n log.warn(\"`packElevateHelper = false` is ignored, because `perMachine` is set to `true`\")\n }\n\n if (isPackElevateHelper === false) {\n return Promise.resolve(null)\n }\n\n if (this.elevatePath == null) {\n this.elevatePath = getNsisElevatePath(target.packager.config.toolsets?.nsis, target.packager.buildResourcesDir)\n }\n\n return this.elevatePath\n }\n\n // Injects elevate.exe directly into the already-built NSIS archive via a temp staging dir, and\n // defers copying it into win-unpacked until every target has finished reading the shared\n // appOutDir. This keeps elevate.exe in the dir-target output while guaranteeing concurrent\n // targets (Squirrel, ZIP, appx, …) never capture it mid-build (fixes the #9852 race).\n async addToArchive(archiveFile: string, target: NsisTarget, format: string, archiveOptions: ArchiveOptions, appOutDir: string): Promise<void> {\n const elevatePath = await this.resolve(target)\n if (!elevatePath) {\n return\n }\n\n const stagingDir = await target.packager.tempDirManager.getTempDir({ prefix: \"elevate-staging\" })\n const resourcesDir = path.join(stagingDir, \"resources\")\n await fs.mkdir(resourcesDir, { recursive: true })\n const stagedElevate = path.join(resourcesDir, \"elevate.exe\")\n await copyFile(elevatePath, stagedElevate, false)\n\n if (!isWindowsSigningDisabled(target.packager.platformOptions)) {\n await target.packager.signIf(stagedElevate)\n }\n\n // Reuse the parent archive's compression args so the appended entry is consistent with the\n // rest of the archive (notably `store` and differential-aware builds, where bare `7za a`\n // defaults — solid on, -mx=9, NTFS timestamps — would diverge from the original entries).\n const args = compute7zCompressArgs(format, archiveOptions)\n args.push(archiveFile, \"resources/elevate.exe\")\n await exec(await getPath7za(), args, { cwd: stagingDir }, debug7z.enabled)\n\n // Defer the win-unpacked copy: it must land after every concurrent target has packaged\n // appOutDir, so it is never captured by Squirrel/zip/etc. The staged (and possibly signed)\n // binary lives in tempDirManager, which is cleaned up only after the build finishes.\n if (!this.stagedUnpackedCopies.has(appOutDir)) {\n this.stagedUnpackedCopies.add(appOutDir)\n target.packager.addBuildFinalizeTask(() => copyFile(stagedElevate, path.join(appOutDir, \"resources\", \"elevate.exe\"), false))\n }\n }\n}\n\nclass BinaryReader {\n private readonly _buffer: Buffer\n private _position: number\n\n constructor(buffer: Buffer) {\n this._buffer = buffer\n this._position = 0\n }\n\n get length(): number {\n return this._buffer.length\n }\n\n get position(): number {\n return this._position\n }\n\n match(signature: Array<number>): boolean {\n if (signature.every((v, i) => this._buffer[this._position + i] === v)) {\n this._position += signature.length\n return true\n }\n return false\n }\n\n skip(offset: number) {\n this._position += offset\n }\n\n bytes(size: number): Buffer {\n const value = this._buffer.subarray(this._position, this._position + size)\n this._position += size\n return value\n }\n\n uint16(): number {\n const value = this._buffer[this._position] | (this._buffer[this._position + 1] << 8)\n this._position += 2\n return value\n }\n\n uint32(): number {\n return this.uint16() | (this.uint16() << 16)\n }\n\n string(length: number): string {\n let value = \"\"\n for (let i = 0; i < length; i++) {\n const c = this._buffer[this._position + i]\n if (c === 0x00) {\n break\n }\n value += String.fromCharCode(c)\n }\n this._position += length\n return value\n }\n}\n\nexport class UninstallerReader {\n // noinspection SpellCheckingInspection\n static async exec(installerPath: string, uninstallerPath: string) {\n const buffer = await fs.readFile(installerPath)\n const reader = new BinaryReader(buffer)\n // IMAGE_DOS_HEADER\n if (!reader.match([0x4d, 0x5a])) {\n throw new Error(\"Invalid 'MZ' signature.\")\n }\n reader.skip(58)\n // e_lfanew\n reader.skip(reader.uint32() - reader.position)\n // IMAGE_FILE_HEADER\n if (!reader.match([0x50, 0x45, 0x00, 0x00])) {\n throw new Error(\"Invalid 'PE' signature.\")\n }\n reader.skip(2)\n const numberOfSections = reader.uint16()\n reader.skip(12)\n const sizeOfOptionalHeader = reader.uint16()\n reader.skip(2)\n reader.skip(sizeOfOptionalHeader)\n // IMAGE_SECTION_HEADER\n let nsisOffset = 0\n for (let i = 0; i < numberOfSections; i++) {\n const name = reader.string(8)\n reader.skip(8)\n const rawSize = reader.uint32()\n const rawPointer = reader.uint32()\n reader.skip(16)\n switch (name) {\n case \".text\":\n case \".rdata\":\n case \".data\":\n case \".rsrc\": {\n nsisOffset = Math.max(rawPointer + rawSize, nsisOffset)\n break\n }\n default: {\n if (rawPointer !== 0 && rawSize !== 0) {\n throw new Error(\"Unsupported section '\" + name + \"'.\")\n }\n break\n }\n }\n }\n const executable = buffer.subarray(0, nsisOffset)\n const nsisSize = buffer.length - nsisOffset\n const nsisReader = new BinaryReader(buffer.subarray(nsisOffset, nsisOffset + nsisSize))\n const nsisSignature = [0xef, 0xbe, 0xad, 0xde, 0x4e, 0x75, 0x6c, 0x6c, 0x73, 0x6f, 0x66, 0x74, 0x49, 0x6e, 0x73, 0x74]\n nsisReader.uint32() // ?\n if (!nsisReader.match(nsisSignature)) {\n throw new Error(\"Invalid signature.\")\n }\n nsisReader.uint32() // ?\n if (nsisSize !== nsisReader.uint32()) {\n throw new Error(\"Size mismatch.\")\n }\n\n let innerBuffer = null\n while (true) {\n let size = nsisReader.uint32()\n const compressed = (size & 0x80000000) !== 0\n size = size & 0x7fffffff\n if (size === 0 || nsisReader.position + size > nsisReader.length || nsisReader.position >= nsisReader.length) {\n break\n }\n let buffer = nsisReader.bytes(size)\n if (compressed) {\n buffer = zlib.inflateRawSync(buffer)\n }\n const innerReader = new BinaryReader(buffer)\n innerReader.uint32() // ?\n if (innerReader.match(nsisSignature)) {\n if (innerBuffer) {\n throw new Error(\"Multiple inner blocks.\")\n }\n innerBuffer = buffer\n }\n }\n if (!innerBuffer) {\n throw new Error(\"Inner block not found.\")\n }\n await fs.writeFile(uninstallerPath, executable)\n await fs.appendFile(uninstallerPath, innerBuffer)\n }\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const ELECTRON_BUILDER_NS_UUID: Buffer<ArrayBufferLike>;
|
|
2
|
+
/**
|
|
3
|
+
* Builds Windows file-association ProgIDs that follow Microsoft's recommendations
|
|
4
|
+
* (https://learn.microsoft.com/windows/win32/com/-progid--key):
|
|
5
|
+
* - at most 39 characters,
|
|
6
|
+
* - only alphanumeric characters plus a single separating period,
|
|
7
|
+
* - must not start with a digit.
|
|
8
|
+
*
|
|
9
|
+
* The result has the form `<program>.<component>`, where `<program>` is derived from the product
|
|
10
|
+
* filename (so it stays human-readable in the registry) and `<component>` mixes a readable prefix
|
|
11
|
+
* with a UUIDv5 derived from the app GUID. This keeps the ProgID unique across applications and
|
|
12
|
+
* stable for a given input, so the installer (register) and uninstaller (unregister) always agree.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ProgIdMaker {
|
|
15
|
+
private readonly program;
|
|
16
|
+
private readonly namespace;
|
|
17
|
+
constructor(guid: string, productFilename: string);
|
|
18
|
+
progId(nameOrExt: string): string;
|
|
19
|
+
private static resolveProgram;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=progId.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progId.d.ts","sourceRoot":"","sources":["../../../../src/targets/win/nsis/progId.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,yBAAqD,CAAA;AAiB1F;;;;;;;;;;;GAWG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;IASjD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAQjC,OAAO,CAAC,MAAM,CAAC,cAAc;CAa9B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { UUID } from "builder-util-runtime";
|
|
2
|
+
// noinspection SpellCheckingInspection
|
|
3
|
+
export const ELECTRON_BUILDER_NS_UUID = UUID.parse("50e065bc-3134-11e6-9bab-38c9862bdaf3");
|
|
4
|
+
// Microsoft caps a ProgID at 39 characters.
|
|
5
|
+
const MAX_PROG_ID_LENGTH = 39;
|
|
6
|
+
// Budget for the human-readable head (program + "." + component prefix); the rest is reserved for the
|
|
7
|
+
// UUID tail so that some entropy always survives the final truncation.
|
|
8
|
+
const MAX_READABLE_LENGTH = 31;
|
|
9
|
+
// Cap on the readable program segment, leaving room for the component to carry entropy.
|
|
10
|
+
const MAX_PROGRAM_LENGTH = 19;
|
|
11
|
+
// A product filename that sanitizes shorter than this is too short to be a useful program segment.
|
|
12
|
+
const MIN_PROGRAM_LENGTH = 6;
|
|
13
|
+
// ProgIDs may only contain alphanumerics plus a single separating period, so drop everything else.
|
|
14
|
+
function sanitize(value) {
|
|
15
|
+
return value.replace(/[^A-Za-z0-9]/g, "");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Builds Windows file-association ProgIDs that follow Microsoft's recommendations
|
|
19
|
+
* (https://learn.microsoft.com/windows/win32/com/-progid--key):
|
|
20
|
+
* - at most 39 characters,
|
|
21
|
+
* - only alphanumeric characters plus a single separating period,
|
|
22
|
+
* - must not start with a digit.
|
|
23
|
+
*
|
|
24
|
+
* The result has the form `<program>.<component>`, where `<program>` is derived from the product
|
|
25
|
+
* filename (so it stays human-readable in the registry) and `<component>` mixes a readable prefix
|
|
26
|
+
* with a UUIDv5 derived from the app GUID. This keeps the ProgID unique across applications and
|
|
27
|
+
* stable for a given input, so the installer (register) and uninstaller (unregister) always agree.
|
|
28
|
+
*/
|
|
29
|
+
export class ProgIdMaker {
|
|
30
|
+
constructor(guid, productFilename) {
|
|
31
|
+
// `guid` may be any user-supplied string (including a non-UUID), so normalize it to a real UUID.
|
|
32
|
+
// It is lowercased because UUID.parse only understands lowercase hex; an uppercase GUID would
|
|
33
|
+
// otherwise be parsed into a corrupt namespace and collide across applications.
|
|
34
|
+
const uuidString = (UUID.check(guid) ? guid : UUID.v5(guid, ELECTRON_BUILDER_NS_UUID)).toLowerCase();
|
|
35
|
+
this.namespace = UUID.parse(uuidString);
|
|
36
|
+
this.program = ProgIdMaker.resolveProgram(guid, productFilename, uuidString);
|
|
37
|
+
}
|
|
38
|
+
progId(nameOrExt) {
|
|
39
|
+
const componentPrefix = sanitize(nameOrExt).slice(0, MAX_READABLE_LENGTH - this.program.length);
|
|
40
|
+
const componentUuid = sanitize(UUID.v5(nameOrExt, this.namespace));
|
|
41
|
+
return `${this.program}.${componentPrefix}${componentUuid}`.slice(0, MAX_PROG_ID_LENGTH);
|
|
42
|
+
}
|
|
43
|
+
// Resolves the readable program segment, preferring the product filename and falling back to the
|
|
44
|
+
// GUID so the result is always non-empty and never starts with a digit (both Microsoft requirements).
|
|
45
|
+
static resolveProgram(guid, productFilename, uuidString) {
|
|
46
|
+
let program = sanitize(productFilename);
|
|
47
|
+
if (program.length < MIN_PROGRAM_LENGTH) {
|
|
48
|
+
program = sanitize(guid);
|
|
49
|
+
}
|
|
50
|
+
if (program.length < MIN_PROGRAM_LENGTH) {
|
|
51
|
+
// `App<uuid>` is guaranteed long enough and starts with a letter.
|
|
52
|
+
program = sanitize(`App${uuidString}`);
|
|
53
|
+
}
|
|
54
|
+
else if (/^\d/.test(program)) {
|
|
55
|
+
program = `App${program}`;
|
|
56
|
+
}
|
|
57
|
+
return program.slice(0, MAX_PROGRAM_LENGTH);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=progId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progId.js","sourceRoot":"","sources":["../../../../src/targets/win/nsis/progId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAE3C,uCAAuC;AACvC,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;AAE1F,4CAA4C;AAC5C,MAAM,kBAAkB,GAAG,EAAE,CAAA;AAC7B,sGAAsG;AACtG,uEAAuE;AACvE,MAAM,mBAAmB,GAAG,EAAE,CAAA;AAC9B,wFAAwF;AACxF,MAAM,kBAAkB,GAAG,EAAE,CAAA;AAC7B,mGAAmG;AACnG,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAE5B,mGAAmG;AACnG,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,WAAW;IAItB,YAAY,IAAY,EAAE,eAAuB;QAC/C,iGAAiG;QACjG,8FAA8F;QAC9F,gFAAgF;QAChF,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QACpG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACvC,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,UAAU,CAAC,CAAA;IAC9E,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,MAAM,eAAe,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC/F,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAClE,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,eAAe,GAAG,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAA;IAC1F,CAAC;IAED,iGAAiG;IACjG,sGAAsG;IAC9F,MAAM,CAAC,cAAc,CAAC,IAAY,EAAE,eAAuB,EAAE,UAAkB;QACrF,IAAI,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAA;QACvC,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;YACxC,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC1B,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;YACxC,kEAAkE;YAClE,OAAO,GAAG,QAAQ,CAAC,MAAM,UAAU,EAAE,CAAC,CAAA;QACxC,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,OAAO,GAAG,MAAM,OAAO,EAAE,CAAA;QAC3B,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAA;IAC7C,CAAC;CACF","sourcesContent":["import { UUID } from \"builder-util-runtime\"\n\n// noinspection SpellCheckingInspection\nexport const ELECTRON_BUILDER_NS_UUID = UUID.parse(\"50e065bc-3134-11e6-9bab-38c9862bdaf3\")\n\n// Microsoft caps a ProgID at 39 characters.\nconst MAX_PROG_ID_LENGTH = 39\n// Budget for the human-readable head (program + \".\" + component prefix); the rest is reserved for the\n// UUID tail so that some entropy always survives the final truncation.\nconst MAX_READABLE_LENGTH = 31\n// Cap on the readable program segment, leaving room for the component to carry entropy.\nconst MAX_PROGRAM_LENGTH = 19\n// A product filename that sanitizes shorter than this is too short to be a useful program segment.\nconst MIN_PROGRAM_LENGTH = 6\n\n// ProgIDs may only contain alphanumerics plus a single separating period, so drop everything else.\nfunction sanitize(value: string): string {\n return value.replace(/[^A-Za-z0-9]/g, \"\")\n}\n\n/**\n * Builds Windows file-association ProgIDs that follow Microsoft's recommendations\n * (https://learn.microsoft.com/windows/win32/com/-progid--key):\n * - at most 39 characters,\n * - only alphanumeric characters plus a single separating period,\n * - must not start with a digit.\n *\n * The result has the form `<program>.<component>`, where `<program>` is derived from the product\n * filename (so it stays human-readable in the registry) and `<component>` mixes a readable prefix\n * with a UUIDv5 derived from the app GUID. This keeps the ProgID unique across applications and\n * stable for a given input, so the installer (register) and uninstaller (unregister) always agree.\n */\nexport class ProgIdMaker {\n private readonly program: string\n private readonly namespace: Buffer\n\n constructor(guid: string, productFilename: string) {\n // `guid` may be any user-supplied string (including a non-UUID), so normalize it to a real UUID.\n // It is lowercased because UUID.parse only understands lowercase hex; an uppercase GUID would\n // otherwise be parsed into a corrupt namespace and collide across applications.\n const uuidString = (UUID.check(guid) ? guid : UUID.v5(guid, ELECTRON_BUILDER_NS_UUID)).toLowerCase()\n this.namespace = UUID.parse(uuidString)\n this.program = ProgIdMaker.resolveProgram(guid, productFilename, uuidString)\n }\n\n progId(nameOrExt: string): string {\n const componentPrefix = sanitize(nameOrExt).slice(0, MAX_READABLE_LENGTH - this.program.length)\n const componentUuid = sanitize(UUID.v5(nameOrExt, this.namespace))\n return `${this.program}.${componentPrefix}${componentUuid}`.slice(0, MAX_PROG_ID_LENGTH)\n }\n\n // Resolves the readable program segment, preferring the product filename and falling back to the\n // GUID so the result is always non-empty and never starts with a digit (both Microsoft requirements).\n private static resolveProgram(guid: string, productFilename: string, uuidString: string): string {\n let program = sanitize(productFilename)\n if (program.length < MIN_PROGRAM_LENGTH) {\n program = sanitize(guid)\n }\n if (program.length < MIN_PROGRAM_LENGTH) {\n // `App<uuid>` is guaranteed long enough and starts with a letter.\n program = sanitize(`App${uuidString}`)\n } else if (/^\\d/.test(program)) {\n program = `App${program}`\n }\n return program.slice(0, MAX_PROGRAM_LENGTH)\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"7zip.d.ts","sourceRoot":"","sources":["../../src/toolsets/7zip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"7zip.d.ts","sourceRoot":"","sources":["../../src/toolsets/7zip.ts"],"names":[],"mappings":"AA+CA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAGxD;AAED,oHAAoH;AACpH,wBAAgB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAQ5C"}
|
package/dist/toolsets/7zip.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { chmod } from "node:fs/promises";
|
|
2
2
|
import * as path from "path";
|
|
3
3
|
import { downloadBuilderToolset } from "../util/electronGet.js";
|
|
4
|
+
// Newest 7-Zip bundle — the only version published; no legacy/null-state fallback.
|
|
5
|
+
const SEVEN_ZIP_LATEST = "1.0.0";
|
|
4
6
|
const checksums = {
|
|
5
7
|
"7zip-linux-ia32.tar.gz": "24a5d5bfe81506d0bfe21a812588119ae3deb757e8ba084b2339d8e899543686",
|
|
6
8
|
"7zip-darwin-arm64.tar.gz": "496a341abe210aae1a25bc202ee97f6de6c76a3dc80f91d96616be05502d72c1",
|
|
@@ -66,7 +68,7 @@ async function resolve() {
|
|
|
66
68
|
}
|
|
67
69
|
const filename = getFilename();
|
|
68
70
|
const toolDir = await downloadBuilderToolset({
|
|
69
|
-
releaseName: `7zip
|
|
71
|
+
releaseName: `7zip@${SEVEN_ZIP_LATEST}`,
|
|
70
72
|
filenameWithExt: filename,
|
|
71
73
|
checksums: checksums,
|
|
72
74
|
githubOrgRepo: "electron-userland/electron-builder-binaries",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"7zip.js","sourceRoot":"","sources":["../../src/toolsets/7zip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,MAAM,SAAS,GAAG;IAChB,wBAAwB,EAAE,kEAAkE;IAC5F,0BAA0B,EAAE,kEAAkE;IAC9F,2BAA2B,EAAE,kEAAkE;IAC/F,yBAAyB,EAAE,kEAAkE;IAC7F,uBAAuB,EAAE,kEAAkE;IAC3F,sBAAsB,EAAE,kEAAkE;IAC1F,qBAAqB,EAAE,kEAAkE;IACzF,uBAAuB,EAAE,kEAAkE;CACnF,CAAA;AAEV,SAAS,WAAW;IAClB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IAClC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,2BAA2B,CAAA;IACpF,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,yBAAyB,CAAA;QAClC,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,wBAAwB,CAAA;QACjC,CAAC;QACD,OAAO,uBAAuB,CAAA;IAChC,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,uBAAuB,CAAA;QAChC,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,sBAAsB,CAAA;QAC/B,CAAC;QACD,OAAO,qBAAqB,CAAA;IAC9B,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0CAA0C,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED,IAAI,WAAW,GAAkB,IAAI,CAAA;AACrC,IAAI,aAAa,GAA2B,IAAI,CAAA;AAEhD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,WAAW,GAAG,UAAU,CAAA;IACxB,aAAa,GAAG,IAAI,CAAA;AACtB,CAAC;AAED,oHAAoH;AACpH,MAAM,UAAU,UAAU;IACxB,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QAC1B,aAAa,GAAG,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACpC,aAAa,GAAG,IAAI,CAAA;YACpB,MAAM,GAAG,CAAA;QACX,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC;QAC3C,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"7zip.js","sourceRoot":"","sources":["../../src/toolsets/7zip.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmod } from \"node:fs/promises\"\nimport * as path from \"path\"\nimport { downloadBuilderToolset } from \"../util/electronGet.js\"\n\n// Newest 7-Zip bundle — the only version published; no legacy/null-state fallback.\nconst SEVEN_ZIP_LATEST = \"1.0.0\"\n\nconst checksums = {\n \"7zip-linux-ia32.tar.gz\": \"24a5d5bfe81506d0bfe21a812588119ae3deb757e8ba084b2339d8e899543686\",\n \"7zip-darwin-arm64.tar.gz\": \"496a341abe210aae1a25bc202ee97f6de6c76a3dc80f91d96616be05502d72c1\",\n \"7zip-darwin-x86_64.tar.gz\": \"496a341abe210aae1a25bc202ee97f6de6c76a3dc80f91d96616be05502d72c1\",\n \"7zip-linux-arm64.tar.gz\": \"5aff5034206b78f8261249ceb922b5c7e04c9bdb733784d8f5b6df9732cf1f79\",\n \"7zip-win-arm64.tar.gz\": \"ac3f38f96ce7498096a123bb0862dd6db863a7353c9e9e1c15f73c183adf6620\",\n \"7zip-win-ia32.tar.gz\": \"ac3f38f96ce7498096a123bb0862dd6db863a7353c9e9e1c15f73c183adf6620\",\n \"7zip-win-x64.tar.gz\": \"be071f15bd6da2f78fe81c6ddef2009b0c4d8a51f36b780cb806c7e6df95e1b3\",\n \"7zip-linux-x64.tar.gz\": \"d151bb44b2a9d9bfc52813ce4cac042916394a0ab8a56bd5d221a5dc9ef8d5d7\",\n} as const\n\nfunction getFilename(): keyof typeof checksums {\n const { platform, arch } = process\n if (platform === \"darwin\") {\n return arch === \"arm64\" ? \"7zip-darwin-arm64.tar.gz\" : \"7zip-darwin-x86_64.tar.gz\"\n }\n if (platform === \"linux\") {\n if (arch === \"arm64\") {\n return \"7zip-linux-arm64.tar.gz\"\n }\n if (arch === \"ia32\") {\n return \"7zip-linux-ia32.tar.gz\"\n }\n return \"7zip-linux-x64.tar.gz\"\n }\n if (platform === \"win32\") {\n if (arch === \"arm64\") {\n return \"7zip-win-arm64.tar.gz\"\n }\n if (arch === \"ia32\") {\n return \"7zip-win-ia32.tar.gz\"\n }\n return \"7zip-win-x64.tar.gz\"\n }\n throw new Error(`Unsupported platform for 7zip toolset: ${platform}/${arch}`)\n}\n\nlet _customPath: string | null = null\nlet _resolvedPath: Promise<string> | null = null\n\n/**\n * Override the 7za binary path with a pre-resolved absolute path.\n * Called by the packager when `toolsets.sevenZip` is a `ToolsetCustom` config.\n * Resets the resolution cache so the next `getPath7za()` call uses this path.\n */\nexport function setSevenZipPath(customPath: string): void {\n _customPath = customPath\n _resolvedPath = null\n}\n\n/** Returns the path to the 7za executable, downloading it on first call. Resets on failure so callers can retry. */\nexport function getPath7za(): Promise<string> {\n if (_resolvedPath == null) {\n _resolvedPath = resolve().catch(err => {\n _resolvedPath = null\n throw err\n })\n }\n return _resolvedPath\n}\n\nasync function resolve(): Promise<string> {\n if (_customPath != null) {\n if (process.platform !== \"win32\") {\n await chmod(_customPath, 0o755)\n }\n return _customPath\n }\n\n const filename = getFilename()\n const toolDir = await downloadBuilderToolset({\n releaseName: `7zip@${SEVEN_ZIP_LATEST}`,\n filenameWithExt: filename,\n checksums: checksums,\n githubOrgRepo: \"electron-userland/electron-builder-binaries\",\n })\n\n const bin = path.join(toolDir, \"bin\", process.platform === \"win32\" ? \"7za.exe\" : \"7za\")\n if (process.platform !== \"win32\") {\n await chmod(bin, 0o755)\n }\n return bin\n}\n"]}
|
|
@@ -4,12 +4,12 @@ export declare const appimageChecksums: {
|
|
|
4
4
|
readonly "0.0.0": {
|
|
5
5
|
readonly "appimage-12.0.1.7z": "d12ff7eb8f1d1ec4652ca5237a7fbdca33acc0c758045636feca62dc6ecb8ec4";
|
|
6
6
|
};
|
|
7
|
-
readonly "1.0.2": {
|
|
8
|
-
readonly "appimage-tools-runtime-20251108.tar.gz": "a784a8c26331ec2e945c23d6bdb14af5c9df27f5939825d84b8709c61dc81eb0";
|
|
9
|
-
};
|
|
10
7
|
readonly "1.0.3": {
|
|
11
8
|
readonly "appimage-tools-runtime-20251108.tar.gz": "84021a78ee214ae6fd33a2d62a92ba25542dd10bc86bf117a9b2d0bba44e7665";
|
|
12
9
|
};
|
|
10
|
+
readonly "1.1.0": {
|
|
11
|
+
readonly "appimage-tools-runtime-20251108.tar.gz": "098182ab8d3bb93db8a23691671f665ff92316249ace850aec63b9d010ec7fe0";
|
|
12
|
+
};
|
|
13
13
|
};
|
|
14
14
|
export declare function getAppImageTools(toolset: ToolsetConfig["appimage"], targetArch: Arch, resourcesDir: string): Promise<{
|
|
15
15
|
mksquashfs: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appimage.d.ts","sourceRoot":"","sources":["../../src/toolsets/appimage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"appimage.d.ts","sourceRoot":"","sources":["../../src/toolsets/appimage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAOnD,eAAO,MAAM,iBAAiB;;;;;;;;;;CAUpB,CAAA;AAEV,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM;;;;;GAyDhH"}
|
|
@@ -2,16 +2,18 @@ import { Arch } from "builder-util";
|
|
|
2
2
|
import * as path from "path";
|
|
3
3
|
import { downloadBuilderToolset } from "../util/electronGet.js";
|
|
4
4
|
import { getCustomToolsetPath } from "./custom.js";
|
|
5
|
+
// Newest AppImage bundle — selected when the config is unset / null / "latest".
|
|
6
|
+
const APPIMAGE_LATEST = "1.1.0";
|
|
5
7
|
export const appimageChecksums = {
|
|
6
8
|
"0.0.0": {
|
|
7
9
|
"appimage-12.0.1.7z": "d12ff7eb8f1d1ec4652ca5237a7fbdca33acc0c758045636feca62dc6ecb8ec4",
|
|
8
10
|
},
|
|
9
|
-
"1.0.2": {
|
|
10
|
-
"appimage-tools-runtime-20251108.tar.gz": "a784a8c26331ec2e945c23d6bdb14af5c9df27f5939825d84b8709c61dc81eb0",
|
|
11
|
-
},
|
|
12
11
|
"1.0.3": {
|
|
13
12
|
"appimage-tools-runtime-20251108.tar.gz": "84021a78ee214ae6fd33a2d62a92ba25542dd10bc86bf117a9b2d0bba44e7665",
|
|
14
13
|
},
|
|
14
|
+
"1.1.0": {
|
|
15
|
+
"appimage-tools-runtime-20251108.tar.gz": "098182ab8d3bb93db8a23691671f665ff92316249ace850aec63b9d010ec7fe0",
|
|
16
|
+
},
|
|
15
17
|
};
|
|
16
18
|
export async function getAppImageTools(toolset, targetArch, resourcesDir) {
|
|
17
19
|
const runtimeArch = targetArch === Arch.armv7l ? "arm32" : targetArch === Arch.arm64 ? "arm64" : targetArch === Arch.ia32 ? "ia32" : "x64";
|
|
@@ -38,8 +40,8 @@ export async function getAppImageTools(toolset, targetArch, resourcesDir) {
|
|
|
38
40
|
runtimeLibraries: path.resolve(artifactPath, "lib", libArch),
|
|
39
41
|
};
|
|
40
42
|
};
|
|
41
|
-
// null
|
|
42
|
-
const isFuse2 =
|
|
43
|
+
// Only the explicit legacy pin selects the FUSE2 runtime; unset / null / "latest" → newest.
|
|
44
|
+
const isFuse2 = toolset === "0.0.0";
|
|
43
45
|
if (isFuse2) {
|
|
44
46
|
const filenameWithExt = "appimage-12.0.1.7z";
|
|
45
47
|
const artifactPath = await downloadBuilderToolset({
|
|
@@ -54,7 +56,8 @@ export async function getAppImageTools(toolset, targetArch, resourcesDir) {
|
|
|
54
56
|
const vendorPath = await getCustomToolsetPath(toolset, resourcesDir);
|
|
55
57
|
return getPaths(vendorPath);
|
|
56
58
|
}
|
|
57
|
-
|
|
59
|
+
// Unset / null / "latest" → newest ("1.1.0"); only an explicit "1.0.3" pin stays on 1.0.3.
|
|
60
|
+
const effectiveVersion = toolset === "1.0.3" ? "1.0.3" : APPIMAGE_LATEST;
|
|
58
61
|
const filenameWithExt = "appimage-tools-runtime-20251108.tar.gz";
|
|
59
62
|
const artifactPath = await downloadBuilderToolset({
|
|
60
63
|
releaseName: `appimage@${effectiveVersion}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appimage.js","sourceRoot":"","sources":["../../src/toolsets/appimage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO,EAAE;QACP,oBAAoB,EAAE,kEAAkE;KACzF;IACD,OAAO,EAAE;QACP,wCAAwC,EAAE,kEAAkE;KAC7G;IACD,OAAO,EAAE;QACP,wCAAwC,EAAE,kEAAkE;KAC7G;CACO,CAAA;AAEV,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAkC,EAAE,UAAgB,EAAE,YAAoB;IAC/G,MAAM,WAAW,GAAG,UAAU,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;IAE1I,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,CAAC,YAAoB,EAAE,EAAE,CAAC,CAAC;QAC1C,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,YAAY,CAAC;QACpD,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,uBAAuB,CAAC;QACxE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,WAAW,EAAE,CAAC;QACzE,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,WAAW,CAAC;KACjE,CAAC,CAAA;IAEF,kGAAkG;IAClG,MAAM,aAAa,GAAG,CAAC,YAAoB,EAAE,EAAE;QAC7C,wFAAwF;QACxF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;QACjI,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC9E,mGAAmG;QACnG,MAAM,aAAa,GAAG,UAAU,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAA;QACzE,gFAAgF;QAChF,MAAM,OAAO,GAAG,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;QACzD,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC;YAC9D,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,EAAE,uBAAuB,CAAC;YAClF,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,aAAa,EAAE,CAAC;YAC/D,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC;SAC7D,CAAA;IACH,CAAC,CAAA;IAED,
|
|
1
|
+
{"version":3,"file":"appimage.js","sourceRoot":"","sources":["../../src/toolsets/appimage.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch } from \"builder-util\"\nimport * as path from \"path\"\nimport { ToolsetConfig } from \"../configuration.js\"\nimport { downloadBuilderToolset } from \"../util/electronGet.js\"\nimport { getCustomToolsetPath } from \"./custom.js\"\n\n// Newest AppImage bundle — selected when the config is unset / null / \"latest\".\nconst APPIMAGE_LATEST = \"1.1.0\"\n\nexport const appimageChecksums = {\n \"0.0.0\": {\n \"appimage-12.0.1.7z\": \"d12ff7eb8f1d1ec4652ca5237a7fbdca33acc0c758045636feca62dc6ecb8ec4\",\n },\n \"1.0.3\": {\n \"appimage-tools-runtime-20251108.tar.gz\": \"84021a78ee214ae6fd33a2d62a92ba25542dd10bc86bf117a9b2d0bba44e7665\",\n },\n \"1.1.0\": {\n \"appimage-tools-runtime-20251108.tar.gz\": \"098182ab8d3bb93db8a23691671f665ff92316249ace850aec63b9d010ec7fe0\",\n },\n} as const\n\nexport async function getAppImageTools(toolset: ToolsetConfig[\"appimage\"], targetArch: Arch, resourcesDir: string) {\n const runtimeArch = targetArch === Arch.armv7l ? \"arm32\" : targetArch === Arch.arm64 ? \"arm64\" : targetArch === Arch.ia32 ? \"ia32\" : \"x64\"\n\n // Static-runtime layout: tools at root, runtimes/ subdir, lib/{arch}/ subdir\n const getPaths = (artifactPath: string) => ({\n mksquashfs: path.resolve(artifactPath, \"mksquashfs\"),\n desktopFileValidate: path.resolve(artifactPath, \"desktop-file-validate\"),\n runtime: path.resolve(artifactPath, \"runtimes\", `runtime-${runtimeArch}`),\n runtimeLibraries: path.resolve(artifactPath, \"lib\", runtimeArch),\n })\n\n // FUSE2 layout: tools under a host-platform subdir; runtime files at root with target-arch suffix\n const getFuse2Paths = (artifactPath: string) => {\n // mksquashfs/desktop-file-validate are HOST binaries — use process.arch, not targetArch\n const hostArch = process.arch === \"arm\" ? \"arm32\" : process.arch === \"arm64\" ? \"arm64\" : process.arch === \"ia32\" ? \"ia32\" : \"x64\"\n const toolRoot = process.platform === \"linux\" ? `linux-${hostArch}` : \"darwin\"\n // Runtime files live at root; armv7l target uses \"armv7l\" filename, not the internal \"arm32\" alias\n const runtimeSuffix = targetArch === Arch.armv7l ? \"armv7l\" : runtimeArch\n // FUSE2 tree only ships lib/ia32 and lib/x64; arm targets fall back to x64 here\n const libArch = targetArch === Arch.ia32 ? \"ia32\" : \"x64\"\n return {\n mksquashfs: path.resolve(artifactPath, toolRoot, \"mksquashfs\"),\n desktopFileValidate: path.resolve(artifactPath, toolRoot, \"desktop-file-validate\"),\n runtime: path.resolve(artifactPath, `runtime-${runtimeSuffix}`),\n runtimeLibraries: path.resolve(artifactPath, \"lib\", libArch),\n }\n }\n\n // Only the explicit legacy pin selects the FUSE2 runtime; unset / null / \"latest\" → newest.\n const isFuse2 = toolset === \"0.0.0\"\n\n if (isFuse2) {\n const filenameWithExt = \"appimage-12.0.1.7z\"\n const artifactPath = await downloadBuilderToolset({\n releaseName: \"appimage-12.0.1\",\n filenameWithExt,\n checksums: { [filenameWithExt]: appimageChecksums[\"0.0.0\"][filenameWithExt] },\n githubOrgRepo: \"electron-userland/electron-builder-binaries\",\n })\n return getFuse2Paths(artifactPath)\n }\n\n if (typeof toolset === \"object\" && toolset != null) {\n const vendorPath = await getCustomToolsetPath(toolset, resourcesDir)\n return getPaths(vendorPath)\n }\n\n // Unset / null / \"latest\" → newest (\"1.1.0\"); only an explicit \"1.0.3\" pin stays on 1.0.3.\n const effectiveVersion: \"1.0.3\" | typeof APPIMAGE_LATEST = toolset === \"1.0.3\" ? \"1.0.3\" : APPIMAGE_LATEST\n const filenameWithExt = \"appimage-tools-runtime-20251108.tar.gz\"\n const artifactPath = await downloadBuilderToolset({\n releaseName: `appimage@${effectiveVersion}`,\n filenameWithExt,\n checksums: { [filenameWithExt]: appimageChecksums[effectiveVersion][filenameWithExt] },\n githubOrgRepo: \"electron-userland/electron-builder-binaries\",\n })\n return getPaths(artifactPath)\n}\n"]}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { ToolsetCustom } from "../configuration.js";
|
|
2
2
|
export declare function clearCustomToolsetCache(): void;
|
|
3
|
-
export declare function getCustomToolsetPath(custom: ToolsetCustom, resourcesDir
|
|
4
|
-
export declare function hashUrlSafe(input: string, length?: number): string;
|
|
5
|
-
export declare function extractArchive(file: string, dir: string): Promise<void>;
|
|
3
|
+
export declare function getCustomToolsetPath(custom: ToolsetCustom, resourcesDir?: string): Promise<string>;
|
|
6
4
|
//# sourceMappingURL=custom.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/toolsets/custom.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/toolsets/custom.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAuCnD,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlG"}
|
package/dist/toolsets/custom.js
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createReadStream, createWriteStream } from "fs";
|
|
3
|
-
import * as fs from "fs/promises";
|
|
1
|
+
import { exists, sanitizeDirPath, validateSecuredUrl } from "builder-util";
|
|
4
2
|
import { mkdir, rmdir, stat } from "fs/promises";
|
|
5
3
|
import * as path from "path";
|
|
6
|
-
import
|
|
7
|
-
import { pipeline } from "stream/promises";
|
|
8
|
-
import * as tar from "tar";
|
|
9
|
-
import * as unzipper from "unzipper";
|
|
10
|
-
import { downloadBuilderToolset, getCacheDirectory } from "../util/electronGet.js";
|
|
11
|
-
import { getPath7za } from "./7zip.js";
|
|
4
|
+
import { cacheDirectoryOverrideAllowed, downloadBuilderToolset, extractArchive, hashUrlSafe } from "../util/electronGet.js";
|
|
12
5
|
async function validateCustomToolset(custom, resourcesDir) {
|
|
13
6
|
const url = custom.url.trim();
|
|
14
7
|
try {
|
|
@@ -23,7 +16,7 @@ async function validateCustomToolset(custom, resourcesDir) {
|
|
|
23
16
|
}
|
|
24
17
|
if (url.startsWith("file://")) {
|
|
25
18
|
const p = url.slice("file://".length);
|
|
26
|
-
const isWithinResources = path.normalize(p).startsWith(path.normalize(resourcesDir + path.sep));
|
|
19
|
+
const isWithinResources = resourcesDir ? path.normalize(p).startsWith(path.normalize(resourcesDir + path.sep)) : false;
|
|
27
20
|
const isValid = path.isAbsolute(p) || isWithinResources;
|
|
28
21
|
const type = isValid &&
|
|
29
22
|
(await exists(p)) &&
|
|
@@ -73,7 +66,7 @@ async function _resolveCustomToolsetPath(custom, resourcesDir) {
|
|
|
73
66
|
});
|
|
74
67
|
}
|
|
75
68
|
else if (type === "file") {
|
|
76
|
-
const cacheDir =
|
|
69
|
+
const cacheDir = await cacheDirectoryOverrideAllowed.value;
|
|
77
70
|
const customToolsetDir = path.join(cacheDir, "custom-toolsets");
|
|
78
71
|
await mkdir(customToolsetDir, { recursive: true });
|
|
79
72
|
// wipe first to ensure idempotent extraction if the source file changed since last extraction
|
|
@@ -86,126 +79,4 @@ async function _resolveCustomToolsetPath(custom, resourcesDir) {
|
|
|
86
79
|
}
|
|
87
80
|
throw new Error(`Unsupported custom toolset type: ${type}`);
|
|
88
81
|
}
|
|
89
|
-
export function hashUrlSafe(input, length = 6) {
|
|
90
|
-
let hash = 5381;
|
|
91
|
-
for (let i = 0; i < input.length; i++) {
|
|
92
|
-
hash = ((hash << 5) + hash) ^ input.charCodeAt(i);
|
|
93
|
-
}
|
|
94
|
-
hash >>>= 0;
|
|
95
|
-
const out = hash.toString(36);
|
|
96
|
-
return out.length >= length ? out.slice(0, length) : out.padStart(length, "0");
|
|
97
|
-
}
|
|
98
|
-
async function extractZipStreaming(file, dir) {
|
|
99
|
-
// Pass 1: read central directory once to collect Unix modes (one seek to EOF)
|
|
100
|
-
const zipDir = await unzipper.Open.file(file);
|
|
101
|
-
const entryModes = new Map();
|
|
102
|
-
for (const entry of zipDir.files) {
|
|
103
|
-
const mode = (entry.externalFileAttributes >> 16) & 0xffff;
|
|
104
|
-
if (mode > 0) {
|
|
105
|
-
entryModes.set(entry.path, mode);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
const isSymlink = (mode) => (mode & 0o170000) === 0o120000;
|
|
109
|
-
// Pass 2: stream from byte 0 — no per-entry seeks, no Docker hang
|
|
110
|
-
const entries = createReadStream(file).pipe(unzipper.Parse({ forceStream: true }));
|
|
111
|
-
for await (const entry of entries) {
|
|
112
|
-
const destPath = path.resolve(dir, entry.path);
|
|
113
|
-
if (!destPath.startsWith(dir + path.sep) && destPath !== dir) {
|
|
114
|
-
throw new Error(`Path traversal blocked: ${entry.path}`);
|
|
115
|
-
}
|
|
116
|
-
const mode = entryModes.get(entry.path) ?? 0;
|
|
117
|
-
if (mode > 0 && isSymlink(mode)) {
|
|
118
|
-
const target = (await entry.buffer()).toString();
|
|
119
|
-
if (path.isAbsolute(target)) {
|
|
120
|
-
throw new Error(`Absolute symlink target blocked: ${target}`);
|
|
121
|
-
}
|
|
122
|
-
const resolvedTarget = path.resolve(path.dirname(destPath), target);
|
|
123
|
-
if (!resolvedTarget.startsWith(dir + path.sep) && resolvedTarget !== dir) {
|
|
124
|
-
throw new Error(`Symlink target escapes extraction dir: ${target}`);
|
|
125
|
-
}
|
|
126
|
-
await fs.mkdir(path.dirname(destPath), { recursive: true });
|
|
127
|
-
await fs.symlink(target, destPath);
|
|
128
|
-
}
|
|
129
|
-
else if (entry.type === "Directory") {
|
|
130
|
-
await fs.mkdir(destPath, { recursive: true });
|
|
131
|
-
entry.autodrain();
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
await fs.mkdir(path.dirname(destPath), { recursive: true });
|
|
135
|
-
await pipeline(entry, createWriteStream(destPath));
|
|
136
|
-
if (mode > 0) {
|
|
137
|
-
await fs.chmod(destPath, mode & 0o7777);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
export async function extractArchive(file, dir) {
|
|
143
|
-
const tmpDir = `${dir}.tmp`;
|
|
144
|
-
await fs.mkdir(tmpDir, { recursive: true });
|
|
145
|
-
const release = await lockfile.lock(tmpDir, {
|
|
146
|
-
retries: { retries: 100, minTimeout: 1000, maxTimeout: 5000 },
|
|
147
|
-
stale: 120000,
|
|
148
|
-
});
|
|
149
|
-
try {
|
|
150
|
-
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
151
|
-
await fs.mkdir(tmpDir, { recursive: true });
|
|
152
|
-
// Guard against transient window in @electron/get's non-atomic putFileInCache (remove → move).
|
|
153
|
-
for (let i = 0; !(await exists(file)); i++) {
|
|
154
|
-
if (i >= 4) {
|
|
155
|
-
throw Object.assign(new Error(`Source archive not found after retries: ${file}`), { code: "ENOENT", path: file });
|
|
156
|
-
}
|
|
157
|
-
log.warn({ file, attempt: i + 1 }, "source archive transiently missing, retrying");
|
|
158
|
-
await new Promise(r => setTimeout(r, 300 * (i + 1)));
|
|
159
|
-
}
|
|
160
|
-
if (file.endsWith(".tar.gz") || file.endsWith(".tgz")) {
|
|
161
|
-
await tar.extract({ file, cwd: tmpDir, strip: 1 });
|
|
162
|
-
}
|
|
163
|
-
else if (file.endsWith(".tar.xz") || file.endsWith(".txz")) {
|
|
164
|
-
const cmd7za = await getPath7za();
|
|
165
|
-
const xzOutDir = `${tmpDir}.xz`;
|
|
166
|
-
await fs.rm(xzOutDir, { recursive: true, force: true });
|
|
167
|
-
await fs.mkdir(xzOutDir, { recursive: true });
|
|
168
|
-
try {
|
|
169
|
-
await exec(cmd7za, ["x", "-bd", file, to7zaOutputSwitch(sanitizeDirPath(xzOutDir)), "-y"]);
|
|
170
|
-
const innerTar = (await fs.readdir(xzOutDir)).find(f => f.endsWith(".tar"));
|
|
171
|
-
if (innerTar == null) {
|
|
172
|
-
throw new Error(`xz decompression of ${path.basename(file)} produced no .tar archive`);
|
|
173
|
-
}
|
|
174
|
-
await tar.extract({ file: path.join(xzOutDir, innerTar), cwd: tmpDir, strip: 1 });
|
|
175
|
-
}
|
|
176
|
-
finally {
|
|
177
|
-
await fs.rm(xzOutDir, { recursive: true, force: true });
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
else if (file.endsWith(".zip")) {
|
|
181
|
-
await extractZipStreaming(file, tmpDir);
|
|
182
|
-
}
|
|
183
|
-
else if (file.endsWith(".7z")) {
|
|
184
|
-
const cmd7za = await getPath7za();
|
|
185
|
-
try {
|
|
186
|
-
await exec(cmd7za, ["x", "-bd", file, to7zaOutputSwitch(sanitizeDirPath(tmpDir)), "-y"]);
|
|
187
|
-
}
|
|
188
|
-
catch (e) {
|
|
189
|
-
const files = await fs.readdir(tmpDir);
|
|
190
|
-
if (files.length === 0) {
|
|
191
|
-
log.warn({ file, tmpDir, error: e.message }, "7z extraction produced no output");
|
|
192
|
-
throw new Error(`7z extraction failed for ${file}: ${e.message}`);
|
|
193
|
-
}
|
|
194
|
-
log.warn({ error: e.message, filesExtracted: files.length }, "7z reported error but extracted files");
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
throw new Error(`Unsupported archive format: ${path.basename(file)}`);
|
|
199
|
-
}
|
|
200
|
-
const extractedFiles = await fs.readdir(tmpDir);
|
|
201
|
-
if (extractedFiles.length === 0) {
|
|
202
|
-
throw new Error(`Extraction of ${path.basename(file)} produced no files`);
|
|
203
|
-
}
|
|
204
|
-
await fs.rm(dir, { recursive: true, force: true });
|
|
205
|
-
await fs.rename(tmpDir, dir);
|
|
206
|
-
}
|
|
207
|
-
finally {
|
|
208
|
-
await release().catch(err => log.warn({ err }, "failed to release lockfile"));
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
82
|
//# sourceMappingURL=custom.js.map
|