app-builder-lib 27.0.0-alpha.4 → 27.0.0-alpha.6

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.
Files changed (240) hide show
  1. package/dist/appInfo.d.ts +1 -1
  2. package/dist/appInfo.d.ts.map +1 -1
  3. package/dist/appInfo.js +3 -3
  4. package/dist/appInfo.js.map +1 -1
  5. package/dist/codeSign/mac/macCodeSign.d.ts.map +1 -1
  6. package/dist/codeSign/mac/macCodeSign.js +3 -6
  7. package/dist/codeSign/mac/macCodeSign.js.map +1 -1
  8. package/dist/codeSign/win/signtoolBaseSignManager.d.ts.map +1 -1
  9. package/dist/codeSign/win/signtoolBaseSignManager.js +6 -4
  10. package/dist/codeSign/win/signtoolBaseSignManager.js.map +1 -1
  11. package/dist/codeSign/win/windowsSignAzureManager.d.ts.map +1 -1
  12. package/dist/codeSign/win/windowsSignAzureManager.js +31 -21
  13. package/dist/codeSign/win/windowsSignAzureManager.js.map +1 -1
  14. package/dist/configuration.d.ts +84 -44
  15. package/dist/configuration.d.ts.map +1 -1
  16. package/dist/configuration.js +11 -1
  17. package/dist/configuration.js.map +1 -1
  18. package/dist/electron/ElectronFramework.d.ts +2 -1
  19. package/dist/electron/ElectronFramework.d.ts.map +1 -1
  20. package/dist/electron/ElectronFramework.js +32 -28
  21. package/dist/electron/ElectronFramework.js.map +1 -1
  22. package/dist/electron/electronArchSupport.d.ts +12 -0
  23. package/dist/electron/electronArchSupport.d.ts.map +1 -0
  24. package/dist/electron/electronArchSupport.js +58 -0
  25. package/dist/electron/electronArchSupport.js.map +1 -0
  26. package/dist/electron/electronVersion.d.ts.map +1 -1
  27. package/dist/electron/electronVersion.js +1 -11
  28. package/dist/electron/electronVersion.js.map +1 -1
  29. package/dist/electron/mac/electronMac.js +12 -21
  30. package/dist/electron/mac/electronMac.js.map +1 -1
  31. package/dist/electron/mac/electronMacUtils.d.ts +24 -0
  32. package/dist/electron/mac/electronMacUtils.d.ts.map +1 -0
  33. package/dist/electron/mac/electronMacUtils.js +42 -0
  34. package/dist/electron/mac/electronMacUtils.js.map +1 -0
  35. package/dist/fileMatcher.d.ts +27 -2
  36. package/dist/fileMatcher.d.ts.map +1 -1
  37. package/dist/fileMatcher.js +204 -16
  38. package/dist/fileMatcher.js.map +1 -1
  39. package/dist/index.d.ts +1 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/indexInternal.d.ts +8 -5
  43. package/dist/indexInternal.d.ts.map +1 -1
  44. package/dist/indexInternal.js +8 -4
  45. package/dist/indexInternal.js.map +1 -1
  46. package/dist/macPackager.d.ts.map +1 -1
  47. package/dist/macPackager.js +15 -3
  48. package/dist/macPackager.js.map +1 -1
  49. package/dist/node-module-collector/moduleManager.d.ts +3 -1
  50. package/dist/node-module-collector/moduleManager.d.ts.map +1 -1
  51. package/dist/node-module-collector/moduleManager.js +9 -1
  52. package/dist/node-module-collector/moduleManager.js.map +1 -1
  53. package/dist/node-module-collector/nodeModulesCollector.d.ts +17 -1
  54. package/dist/node-module-collector/nodeModulesCollector.d.ts.map +1 -1
  55. package/dist/node-module-collector/nodeModulesCollector.js +67 -1
  56. package/dist/node-module-collector/nodeModulesCollector.js.map +1 -1
  57. package/dist/node-module-collector/pnpmNodeModulesCollector.js +5 -5
  58. package/dist/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
  59. package/dist/node-module-collector/types.d.ts +2 -0
  60. package/dist/node-module-collector/types.d.ts.map +1 -1
  61. package/dist/node-module-collector/types.js.map +1 -1
  62. package/dist/options/MsixOptions.d.ts +126 -0
  63. package/dist/options/MsixOptions.d.ts.map +1 -0
  64. package/dist/options/MsixOptions.js +2 -0
  65. package/dist/options/MsixOptions.js.map +1 -0
  66. package/dist/options/PlatformSpecificBuildOptions.d.ts +0 -6
  67. package/dist/options/PlatformSpecificBuildOptions.d.ts.map +1 -1
  68. package/dist/options/PlatformSpecificBuildOptions.js.map +1 -1
  69. package/dist/options/SnapOptions.d.ts +15 -13
  70. package/dist/options/SnapOptions.d.ts.map +1 -1
  71. package/dist/options/SnapOptions.js.map +1 -1
  72. package/dist/options/macOptions.d.ts +4 -4
  73. package/dist/options/macOptions.d.ts.map +1 -1
  74. package/dist/options/macOptions.js.map +1 -1
  75. package/dist/options/winOptions.d.ts +166 -36
  76. package/dist/options/winOptions.d.ts.map +1 -1
  77. package/dist/options/winOptions.js.map +1 -1
  78. package/dist/packager.d.ts +2 -0
  79. package/dist/packager.d.ts.map +1 -1
  80. package/dist/packager.js +26 -21
  81. package/dist/packager.js.map +1 -1
  82. package/dist/platformPackager.d.ts +2 -0
  83. package/dist/platformPackager.d.ts.map +1 -1
  84. package/dist/platformPackager.js +6 -0
  85. package/dist/platformPackager.js.map +1 -1
  86. package/dist/publish/PublishManager.d.ts +1 -0
  87. package/dist/publish/PublishManager.d.ts.map +1 -1
  88. package/dist/publish/PublishManager.js +20 -6
  89. package/dist/publish/PublishManager.js.map +1 -1
  90. package/dist/publish/updateInfoBuilder.d.ts.map +1 -1
  91. package/dist/publish/updateInfoBuilder.js +20 -22
  92. package/dist/publish/updateInfoBuilder.js.map +1 -1
  93. package/dist/targets/archive.d.ts +11 -0
  94. package/dist/targets/archive.d.ts.map +1 -1
  95. package/dist/targets/archive.js +40 -22
  96. package/dist/targets/archive.js.map +1 -1
  97. package/dist/targets/linux/FpmTarget.d.ts.map +1 -1
  98. package/dist/targets/linux/FpmTarget.js +3 -3
  99. package/dist/targets/linux/FpmTarget.js.map +1 -1
  100. package/dist/targets/linux/appimage/AppImageTarget.d.ts.map +1 -1
  101. package/dist/targets/linux/appimage/AppImageTarget.js +5 -6
  102. package/dist/targets/linux/appimage/AppImageTarget.js.map +1 -1
  103. package/dist/targets/linux/snap/SnapTarget.d.ts +1 -1
  104. package/dist/targets/linux/snap/SnapTarget.d.ts.map +1 -1
  105. package/dist/targets/linux/snap/SnapTarget.js +23 -1
  106. package/dist/targets/linux/snap/SnapTarget.js.map +1 -1
  107. package/dist/targets/linux/snap/core24.d.ts +1 -1
  108. package/dist/targets/linux/snap/core24.d.ts.map +1 -1
  109. package/dist/targets/linux/snap/core24.js +3 -2
  110. package/dist/targets/linux/snap/core24.js.map +1 -1
  111. package/dist/targets/linux/snap/coreCustom.d.ts +1 -1
  112. package/dist/targets/linux/snap/coreCustom.d.ts.map +1 -1
  113. package/dist/targets/linux/snap/coreCustom.js +2 -2
  114. package/dist/targets/linux/snap/coreCustom.js.map +1 -1
  115. package/dist/targets/linux/snap/coreLegacy.d.ts +1 -1
  116. package/dist/targets/linux/snap/coreLegacy.d.ts.map +1 -1
  117. package/dist/targets/linux/snap/coreLegacy.js +2 -1
  118. package/dist/targets/linux/snap/coreLegacy.js.map +1 -1
  119. package/dist/targets/linux/snap/snapcraft.d.ts +190 -0
  120. package/dist/targets/linux/snap/snapcraft.d.ts.map +1 -0
  121. package/dist/targets/linux/snap/snapcraft.js +11 -0
  122. package/dist/targets/linux/snap/snapcraft.js.map +1 -0
  123. package/dist/targets/linux/snap/snapcraftBuilder.d.ts +7 -1
  124. package/dist/targets/linux/snap/snapcraftBuilder.d.ts.map +1 -1
  125. package/dist/targets/linux/snap/snapcraftBuilder.js +57 -20
  126. package/dist/targets/linux/snap/snapcraftBuilder.js.map +1 -1
  127. package/dist/targets/mac/MacTargetHelper.d.ts +6 -0
  128. package/dist/targets/mac/MacTargetHelper.d.ts.map +1 -1
  129. package/dist/targets/mac/MacTargetHelper.js +22 -1
  130. package/dist/targets/mac/MacTargetHelper.js.map +1 -1
  131. package/dist/targets/targetFactory.d.ts +7 -0
  132. package/dist/targets/targetFactory.d.ts.map +1 -1
  133. package/dist/targets/targetFactory.js +28 -0
  134. package/dist/targets/targetFactory.js.map +1 -1
  135. package/dist/targets/win/AppxTarget.d.ts +0 -2
  136. package/dist/targets/win/AppxTarget.d.ts.map +1 -1
  137. package/dist/targets/win/AppxTarget.js +37 -317
  138. package/dist/targets/win/AppxTarget.js.map +1 -1
  139. package/dist/targets/win/MsixTarget.d.ts +22 -0
  140. package/dist/targets/win/MsixTarget.d.ts.map +1 -0
  141. package/dist/targets/win/MsixTarget.js +214 -0
  142. package/dist/targets/win/MsixTarget.js.map +1 -0
  143. package/dist/targets/win/nsis/NsisTarget.d.ts +3 -2
  144. package/dist/targets/win/nsis/NsisTarget.d.ts.map +1 -1
  145. package/dist/targets/win/nsis/NsisTarget.js +28 -46
  146. package/dist/targets/win/nsis/NsisTarget.js.map +1 -1
  147. package/dist/targets/win/nsis/nsisScriptGenerator.d.ts.map +1 -1
  148. package/dist/targets/win/nsis/nsisScriptGenerator.js +2 -1
  149. package/dist/targets/win/nsis/nsisScriptGenerator.js.map +1 -1
  150. package/dist/targets/win/nsis/nsisUtil.d.ts +5 -2
  151. package/dist/targets/win/nsis/nsisUtil.d.ts.map +1 -1
  152. package/dist/targets/win/nsis/nsisUtil.js +46 -22
  153. package/dist/targets/win/nsis/nsisUtil.js.map +1 -1
  154. package/dist/targets/win/nsis/progId.d.ts +21 -0
  155. package/dist/targets/win/nsis/progId.d.ts.map +1 -0
  156. package/dist/targets/win/nsis/progId.js +60 -0
  157. package/dist/targets/win/nsis/progId.js.map +1 -0
  158. package/dist/targets/win/winAppUtil.d.ts +115 -0
  159. package/dist/targets/win/winAppUtil.d.ts.map +1 -0
  160. package/dist/targets/win/winAppUtil.js +407 -0
  161. package/dist/targets/win/winAppUtil.js.map +1 -0
  162. package/dist/toolsets/7zip.d.ts.map +1 -1
  163. package/dist/toolsets/7zip.js +3 -1
  164. package/dist/toolsets/7zip.js.map +1 -1
  165. package/dist/toolsets/appimage.d.ts +3 -3
  166. package/dist/toolsets/appimage.d.ts.map +1 -1
  167. package/dist/toolsets/appimage.js +9 -6
  168. package/dist/toolsets/appimage.js.map +1 -1
  169. package/dist/toolsets/custom.d.ts +1 -3
  170. package/dist/toolsets/custom.d.ts.map +1 -1
  171. package/dist/toolsets/custom.js +4 -133
  172. package/dist/toolsets/custom.js.map +1 -1
  173. package/dist/toolsets/fpm.d.ts.map +1 -1
  174. package/dist/toolsets/fpm.js +11 -5
  175. package/dist/toolsets/fpm.js.map +1 -1
  176. package/dist/toolsets/icons.d.ts.map +1 -1
  177. package/dist/toolsets/icons.js +4 -1
  178. package/dist/toolsets/icons.js.map +1 -1
  179. package/dist/toolsets/linuxToolsMac.d.ts.map +1 -1
  180. package/dist/toolsets/linuxToolsMac.js +4 -1
  181. package/dist/toolsets/linuxToolsMac.js.map +1 -1
  182. package/dist/toolsets/nsis.d.ts.map +1 -1
  183. package/dist/toolsets/nsis.js +6 -3
  184. package/dist/toolsets/nsis.js.map +1 -1
  185. package/dist/toolsets/version.d.ts +12 -0
  186. package/dist/toolsets/version.d.ts.map +1 -0
  187. package/dist/toolsets/version.js +13 -0
  188. package/dist/toolsets/version.js.map +1 -0
  189. package/dist/toolsets/winCodeSign.d.ts +20 -3
  190. package/dist/toolsets/winCodeSign.d.ts.map +1 -1
  191. package/dist/toolsets/winCodeSign.js +56 -27
  192. package/dist/toolsets/winCodeSign.js.map +1 -1
  193. package/dist/toolsets/wine.d.ts +2 -1
  194. package/dist/toolsets/wine.d.ts.map +1 -1
  195. package/dist/toolsets/wine.js +15 -13
  196. package/dist/toolsets/wine.js.map +1 -1
  197. package/dist/util/NodeModuleCopyHelper.js +3 -3
  198. package/dist/util/NodeModuleCopyHelper.js.map +1 -1
  199. package/dist/util/appFileCopier.d.ts +39 -0
  200. package/dist/util/appFileCopier.d.ts.map +1 -1
  201. package/dist/util/appFileCopier.js +88 -22
  202. package/dist/util/appFileCopier.js.map +1 -1
  203. package/dist/util/config/config.d.ts +1 -0
  204. package/dist/util/config/config.d.ts.map +1 -1
  205. package/dist/util/config/config.js +4 -1
  206. package/dist/util/config/config.js.map +1 -1
  207. package/dist/util/config/load.d.ts +2 -2
  208. package/dist/util/config/load.d.ts.map +1 -1
  209. package/dist/util/config/load.js +3 -12
  210. package/dist/util/config/load.js.map +1 -1
  211. package/dist/util/config/schemaValidator.js +1 -1
  212. package/dist/util/config/schemaValidator.js.map +1 -1
  213. package/dist/util/electronGet.d.ts +6 -3
  214. package/dist/util/electronGet.d.ts.map +1 -1
  215. package/dist/util/electronGet.js +40 -20
  216. package/dist/util/electronGet.js.map +1 -1
  217. package/dist/util/flags.d.ts +0 -2
  218. package/dist/util/flags.d.ts.map +1 -1
  219. package/dist/util/flags.js +0 -6
  220. package/dist/util/flags.js.map +1 -1
  221. package/dist/util/hash.d.ts +1 -1
  222. package/dist/util/hash.d.ts.map +1 -1
  223. package/dist/util/hash.js +1 -15
  224. package/dist/util/hash.js.map +1 -1
  225. package/dist/util/packageMetadata.js +0 -10
  226. package/dist/util/packageMetadata.js.map +1 -1
  227. package/dist/version.d.ts +1 -1
  228. package/dist/version.js +1 -1
  229. package/dist/version.js.map +1 -1
  230. package/dist/vm/ParallelsVm.d.ts.map +1 -1
  231. package/dist/vm/ParallelsVm.js +18 -5
  232. package/dist/vm/ParallelsVm.js.map +1 -1
  233. package/dist/winPackager.d.ts.map +1 -1
  234. package/dist/winPackager.js +3 -0
  235. package/dist/winPackager.js.map +1 -1
  236. package/package.json +8 -8
  237. package/scheme.json +556 -133
  238. package/templates/appx/appxmanifest.xml +1 -1
  239. package/templates/msix/appxmanifest.xml +45 -0
  240. package/templates/nsis/installSection.nsh +14 -0
@@ -0,0 +1,214 @@
1
+ import { Arch, asArray, copyOrLinkFile, ensureNotBusy, exec, InvalidConfigurationError, log } from "builder-util";
2
+ import { getPath7za } from "../../toolsets/7zip.js";
3
+ import _fsExtra from "fs-extra";
4
+ const { mkdirs, readFile, remove, writeFile } = _fsExtra;
5
+ import * as path from "path";
6
+ import { isLegacyWinCodeSign, isOldWin6 } from "../../toolsets/winCodeSign.js";
7
+ import { Target } from "../../core.js";
8
+ import { getTemplatePath } from "../../util/pathManager.js";
9
+ import { buildAppxPackage, buildCapabilitiesXml, buildExtensionsXml, buildWindowsServicesXml, defaultTileTag, lockScreenTag, resolvePackageApplicationId, resolvePackageIdentityName, resourceLanguageTag, splashScreenTag, substituteManifestMacros, } from "./winAppUtil.js";
10
+ export default class MsixTarget extends Target {
11
+ constructor(packager, outDir) {
12
+ super("msix");
13
+ this.packager = packager;
14
+ this.outDir = outDir;
15
+ this.options = this.packager.getOptionsForTarget("msix");
16
+ this.isAsyncSupported = false;
17
+ this.builtPackages = new Map();
18
+ this.vendorPathKit = null;
19
+ this.vm = null;
20
+ if (process.platform !== "darwin" && (process.platform !== "win32" || isOldWin6())) {
21
+ throw new Error("MSIX is supported on Windows 10 or Windows Server 2012 R2 (version number 6.3+) and on macOS via Parallels Desktop");
22
+ }
23
+ }
24
+ build(appOutDir, arch) {
25
+ return buildAppxPackage(this, this.packager, this.options, appOutDir, arch, {
26
+ kind: "msix",
27
+ presentableName: "MSIX",
28
+ preflight: () => {
29
+ // unset / null / "latest" and any modern version pin resolve to a modern Windows Kits bundle (with
30
+ // the MSIX SDK); only the explicit legacy "0.0.0" (winCodeSign-2.6.0) pin lacks it. A custom { url }
31
+ // toolset is the user's responsibility.
32
+ if (isLegacyWinCodeSign(this.packager.config.toolsets?.winCodeSign)) {
33
+ throw new InvalidConfigurationError('MSIX packaging requires a modern Windows Kits toolset. The legacy "0.0.0" (winCodeSign-2.6.0) bundle does not include the Windows SDK version required for MSIX. ' +
34
+ 'Use the default toolset or pin "toolsets.winCodeSign" to a modern version (e.g. "1.0.0", "1.1.0", or "1.3.0").');
35
+ }
36
+ },
37
+ writeManifest: (manifestFile, a, publisher, userAssets) => this.writeManifest(manifestFile, a, publisher, userAssets),
38
+ // Record per-arch context so finishBuild can assemble the .msixbundle / .msixupload.
39
+ onBuilt: ({ arch: builtArch, artifactPath, vendorPathKit, vm }) => {
40
+ this.builtPackages.set(builtArch, artifactPath);
41
+ this.vendorPathKit = vendorPathKit;
42
+ this.vm = vm;
43
+ },
44
+ });
45
+ }
46
+ async finishBuild() {
47
+ await super.finishBuild();
48
+ const packagePaths = Array.from(this.builtPackages.values());
49
+ if (packagePaths.length === 0) {
50
+ return;
51
+ }
52
+ let bundlePath;
53
+ if (this.options.createMsixbundle !== false && packagePaths.length > 1) {
54
+ bundlePath = await this.createMsixBundle(packagePaths);
55
+ }
56
+ if (this.options.createMsixupload === true) {
57
+ await this.createMsixUpload(bundlePath ?? packagePaths[0]);
58
+ }
59
+ }
60
+ async createMsixBundle(packagePaths) {
61
+ const packager = this.packager;
62
+ const vm = this.vm;
63
+ const kitPath = this.vendorPathKit;
64
+ const bundleName = packager.expandArtifactBeautyNamePattern(this.options, "msixbundle", Arch.x64);
65
+ const bundlePath = path.join(this.outDir, bundleName);
66
+ await packager.emitArtifactBuildStarted({
67
+ targetPresentableName: "MSIX Bundle",
68
+ file: bundlePath,
69
+ arch: null,
70
+ });
71
+ const stagingDir = path.join(this.outDir, ".msixbundle-staging");
72
+ await mkdirs(stagingDir);
73
+ try {
74
+ await Promise.all(packagePaths.map(p => copyOrLinkFile(p, path.join(stagingDir, path.basename(p)))));
75
+ const makeAppxExe = path.join(kitPath, "makeappx.exe");
76
+ await ensureNotBusy(makeAppxExe);
77
+ await vm.exec(vm.toVmFile(makeAppxExe), ["bundle", "/o", "/d", vm.toVmFile(stagingDir), "/p", vm.toVmFile(bundlePath)]);
78
+ }
79
+ finally {
80
+ await remove(stagingDir);
81
+ }
82
+ await packager.signIf(bundlePath);
83
+ await packager.emitArtifactBuildCompleted({
84
+ file: bundlePath,
85
+ packager,
86
+ arch: null,
87
+ safeArtifactName: packager.computeSafeArtifactName(bundleName, "msixbundle"),
88
+ target: this,
89
+ isWriteUpdateInfo: false,
90
+ });
91
+ return bundlePath;
92
+ }
93
+ async createMsixUpload(sourcePath) {
94
+ const packager = this.packager;
95
+ const uploadName = packager.expandArtifactBeautyNamePattern(this.options, "msixupload", Arch.x64);
96
+ const uploadPath = path.join(this.outDir, uploadName);
97
+ await packager.emitArtifactBuildStarted({
98
+ targetPresentableName: "MSIX Upload",
99
+ file: uploadPath,
100
+ arch: null,
101
+ });
102
+ const sevenZa = await getPath7za();
103
+ await exec(sevenZa, ["a", "-tzip", uploadPath, sourcePath]);
104
+ await packager.emitArtifactBuildCompleted({
105
+ file: uploadPath,
106
+ packager,
107
+ arch: null,
108
+ safeArtifactName: packager.computeSafeArtifactName(uploadName, "msixupload"),
109
+ target: this,
110
+ isWriteUpdateInfo: false,
111
+ });
112
+ }
113
+ async writeManifest(outFile, arch, publisher, userAssets) {
114
+ const appInfo = this.packager.appInfo;
115
+ const options = this.options;
116
+ const executable = `app\\${appInfo.productFilename}.exe`;
117
+ const displayName = options.displayName || appInfo.productName;
118
+ const capabilities = this.getCapabilities();
119
+ const extensions = await this.getExtensions(executable, displayName);
120
+ const defaultMinVersion = "10.0.17763.0";
121
+ const customManifestPath = await this.packager.getResource(options.customManifestPath);
122
+ if (customManifestPath) {
123
+ log.info({ manifestPath: log.filePath(customManifestPath) }, "custom msix manifest found");
124
+ }
125
+ const manifestFileContent = await readFile(customManifestPath || path.join(getTemplatePath("msix"), "appxmanifest.xml"), "utf8");
126
+ const manifest = substituteManifestMacros(manifestFileContent, (p1) => {
127
+ switch (p1) {
128
+ case "publisher":
129
+ return publisher;
130
+ case "publisherDisplayName": {
131
+ const name = options.publisherDisplayName || appInfo.companyName;
132
+ if (name == null) {
133
+ throw new InvalidConfigurationError(`Please specify "author" in the application package.json — it is required because "msix.publisherDisplayName" is not set.`);
134
+ }
135
+ return name;
136
+ }
137
+ case "version":
138
+ return appInfo.getVersionInWeirdWindowsForm(options.setBuildNumber === true);
139
+ case "applicationId":
140
+ return resolvePackageApplicationId(options.applicationId, options.identityName, appInfo.name, "MSIX");
141
+ case "identityName":
142
+ return resolvePackageIdentityName(options.identityName, appInfo.name, "MSIX");
143
+ case "executable":
144
+ return executable;
145
+ case "displayName":
146
+ return displayName;
147
+ case "description":
148
+ return appInfo.description || appInfo.productName;
149
+ case "backgroundColor":
150
+ return options.backgroundColor || "#464646";
151
+ case "logo":
152
+ return "assets\\StoreLogo.png";
153
+ case "square150x150Logo":
154
+ return "assets\\Square150x150Logo.png";
155
+ case "square44x44Logo":
156
+ return "assets\\Square44x44Logo.png";
157
+ case "lockScreen":
158
+ return lockScreenTag(userAssets);
159
+ case "defaultTile":
160
+ return defaultTileTag(userAssets, options.showNameOnTiles || false);
161
+ case "splashScreen":
162
+ return splashScreenTag(userAssets);
163
+ case "arch":
164
+ return arch === Arch.ia32 ? "x86" : arch === Arch.arm64 ? "arm64" : "x64";
165
+ case "resourceLanguages":
166
+ return resourceLanguageTag(asArray(options.languages));
167
+ case "capabilities":
168
+ return capabilities;
169
+ case "extensions":
170
+ return extensions;
171
+ case "minVersion":
172
+ return options.minVersion || defaultMinVersion;
173
+ case "maxVersionTested":
174
+ return options.maxVersionTested || options.minVersion || defaultMinVersion;
175
+ case "packageIntegrity":
176
+ // uap10:PackageIntegrity belongs inside <Properties>, not <Capabilities>. It takes no
177
+ // attributes; a child <uap10:Content Enforcement="on" /> is required to actually enable
178
+ // runtime integrity checks (a bare/childless element is a no-op).
179
+ // https://learn.microsoft.com/uwp/schemas/appxpackage/uapmanifestschema/element-uap10-packageintegrity
180
+ return options.enforcePackageIntegrity === true ? '<uap10:PackageIntegrity><uap10:Content Enforcement="on" /></uap10:PackageIntegrity>' : "";
181
+ default:
182
+ throw new Error(`Macro ${p1} is not defined`);
183
+ }
184
+ });
185
+ await writeFile(outFile, manifest);
186
+ }
187
+ getCapabilities() {
188
+ const inner = buildCapabilitiesXml(this.options.capabilities);
189
+ return `<Capabilities>\n${inner}\n</Capabilities>`;
190
+ }
191
+ async getExtensions(executable, displayName) {
192
+ const packager = this.packager;
193
+ const options = this.options;
194
+ const baseExtensions = await buildExtensionsXml({
195
+ protocols: asArray(packager.config.protocols).concat(asArray(packager.platformOptions.protocols)),
196
+ fileAssociations: asArray(packager.config.fileAssociations).concat(asArray(packager.platformOptions.fileAssociations)),
197
+ addAutoLaunchExtension: options.addAutoLaunchExtension,
198
+ customExtensionsPath: options.customExtensionsPath,
199
+ appDir: packager.appDir,
200
+ executable,
201
+ displayName,
202
+ dependencyNames: packager.metadata.dependencies,
203
+ });
204
+ const servicesXml = buildWindowsServicesXml(options.windowsServices, executable);
205
+ if (!servicesXml) {
206
+ return baseExtensions;
207
+ }
208
+ if (baseExtensions === "") {
209
+ return `<Extensions>${servicesXml}</Extensions>`;
210
+ }
211
+ return baseExtensions.replace("</Extensions>", `${servicesXml}</Extensions>`);
212
+ }
213
+ }
214
+ //# sourceMappingURL=MsixTarget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MsixTarget.js","sourceRoot":"","sources":["../../../src/targets/win/MsixTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, asArray, copyOrLinkFile, ensureNotBusy, exec, InvalidConfigurationError, log } from \"builder-util\"\nimport { getPath7za } from \"../../toolsets/7zip.js\"\nimport _fsExtra from \"fs-extra\"\nconst { mkdirs, readFile, remove, writeFile } = _fsExtra\nimport * as path from \"path\"\nimport { MsixOptions } from \"../../options/MsixOptions.js\"\nimport { isLegacyWinCodeSign, isOldWin6 } from \"../../toolsets/winCodeSign.js\"\nimport { Target } from \"../../core.js\"\nimport { getTemplatePath } from \"../../util/pathManager.js\"\nimport type { VmManager } from \"../../vm/vm.js\"\nimport { WinPackager } from \"../../winPackager.js\"\nimport {\n buildAppxPackage,\n buildCapabilitiesXml,\n buildExtensionsXml,\n buildWindowsServicesXml,\n defaultTileTag,\n lockScreenTag,\n resolvePackageApplicationId,\n resolvePackageIdentityName,\n resourceLanguageTag,\n splashScreenTag,\n substituteManifestMacros,\n} from \"./winAppUtil.js\"\n\nexport default class MsixTarget extends Target {\n readonly options: MsixOptions = this.packager.getOptionsForTarget<MsixOptions>(\"msix\")\n\n isAsyncSupported = false\n\n private readonly builtPackages = new Map<Arch, string>()\n private vendorPathKit: string | null = null\n private vm: VmManager | null = null\n\n constructor(\n private readonly packager: WinPackager,\n readonly outDir: string\n ) {\n super(\"msix\")\n\n if (process.platform !== \"darwin\" && (process.platform !== \"win32\" || isOldWin6())) {\n throw new Error(\"MSIX is supported on Windows 10 or Windows Server 2012 R2 (version number 6.3+) and on macOS via Parallels Desktop\")\n }\n }\n\n build(appOutDir: string, arch: Arch): Promise<any> {\n return buildAppxPackage(this, this.packager, this.options, appOutDir, arch, {\n kind: \"msix\",\n presentableName: \"MSIX\",\n preflight: () => {\n // unset / null / \"latest\" and any modern version pin resolve to a modern Windows Kits bundle (with\n // the MSIX SDK); only the explicit legacy \"0.0.0\" (winCodeSign-2.6.0) pin lacks it. A custom { url }\n // toolset is the user's responsibility.\n if (isLegacyWinCodeSign(this.packager.config.toolsets?.winCodeSign)) {\n throw new InvalidConfigurationError(\n 'MSIX packaging requires a modern Windows Kits toolset. The legacy \"0.0.0\" (winCodeSign-2.6.0) bundle does not include the Windows SDK version required for MSIX. ' +\n 'Use the default toolset or pin \"toolsets.winCodeSign\" to a modern version (e.g. \"1.0.0\", \"1.1.0\", or \"1.3.0\").'\n )\n }\n },\n writeManifest: (manifestFile, a, publisher, userAssets) => this.writeManifest(manifestFile, a, publisher, userAssets),\n // Record per-arch context so finishBuild can assemble the .msixbundle / .msixupload.\n onBuilt: ({ arch: builtArch, artifactPath, vendorPathKit, vm }) => {\n this.builtPackages.set(builtArch, artifactPath)\n this.vendorPathKit = vendorPathKit\n this.vm = vm\n },\n })\n }\n\n async finishBuild(): Promise<void> {\n await super.finishBuild()\n\n const packagePaths = Array.from(this.builtPackages.values())\n if (packagePaths.length === 0) {\n return\n }\n\n let bundlePath: string | undefined\n if (this.options.createMsixbundle !== false && packagePaths.length > 1) {\n bundlePath = await this.createMsixBundle(packagePaths)\n }\n\n if (this.options.createMsixupload === true) {\n await this.createMsixUpload(bundlePath ?? packagePaths[0])\n }\n }\n\n private async createMsixBundle(packagePaths: ReadonlyArray<string>): Promise<string> {\n const packager = this.packager\n const vm = this.vm!\n const kitPath = this.vendorPathKit!\n\n const bundleName = packager.expandArtifactBeautyNamePattern(this.options, \"msixbundle\", Arch.x64)\n const bundlePath = path.join(this.outDir, bundleName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: \"MSIX Bundle\",\n file: bundlePath,\n arch: null,\n })\n\n const stagingDir = path.join(this.outDir, \".msixbundle-staging\")\n await mkdirs(stagingDir)\n try {\n await Promise.all(packagePaths.map(p => copyOrLinkFile(p, path.join(stagingDir, path.basename(p)))))\n const makeAppxExe = path.join(kitPath, \"makeappx.exe\")\n await ensureNotBusy(makeAppxExe)\n await vm.exec(vm.toVmFile(makeAppxExe), [\"bundle\", \"/o\", \"/d\", vm.toVmFile(stagingDir), \"/p\", vm.toVmFile(bundlePath)])\n } finally {\n await remove(stagingDir)\n }\n\n await packager.signIf(bundlePath)\n\n await packager.emitArtifactBuildCompleted({\n file: bundlePath,\n packager,\n arch: null,\n safeArtifactName: packager.computeSafeArtifactName(bundleName, \"msixbundle\"),\n target: this,\n isWriteUpdateInfo: false,\n })\n\n return bundlePath\n }\n\n private async createMsixUpload(sourcePath: string): Promise<void> {\n const packager = this.packager\n const uploadName = packager.expandArtifactBeautyNamePattern(this.options, \"msixupload\", Arch.x64)\n const uploadPath = path.join(this.outDir, uploadName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: \"MSIX Upload\",\n file: uploadPath,\n arch: null,\n })\n\n const sevenZa = await getPath7za()\n await exec(sevenZa, [\"a\", \"-tzip\", uploadPath, sourcePath])\n\n await packager.emitArtifactBuildCompleted({\n file: uploadPath,\n packager,\n arch: null,\n safeArtifactName: packager.computeSafeArtifactName(uploadName, \"msixupload\"),\n target: this,\n isWriteUpdateInfo: false,\n })\n }\n\n private async writeManifest(outFile: string, arch: Arch, publisher: string, userAssets: Array<string>) {\n const appInfo = this.packager.appInfo\n const options = this.options\n const executable = `app\\\\${appInfo.productFilename}.exe`\n const displayName = options.displayName || appInfo.productName\n const capabilities = this.getCapabilities()\n const extensions = await this.getExtensions(executable, displayName)\n const defaultMinVersion = \"10.0.17763.0\"\n\n const customManifestPath = await this.packager.getResource(options.customManifestPath)\n if (customManifestPath) {\n log.info({ manifestPath: log.filePath(customManifestPath) }, \"custom msix manifest found\")\n }\n const manifestFileContent = await readFile(customManifestPath || path.join(getTemplatePath(\"msix\"), \"appxmanifest.xml\"), \"utf8\")\n const manifest = substituteManifestMacros(manifestFileContent, (p1): string => {\n switch (p1) {\n case \"publisher\":\n return publisher\n\n case \"publisherDisplayName\": {\n const name = options.publisherDisplayName || appInfo.companyName\n if (name == null) {\n throw new InvalidConfigurationError(`Please specify \"author\" in the application package.json — it is required because \"msix.publisherDisplayName\" is not set.`)\n }\n return name\n }\n\n case \"version\":\n return appInfo.getVersionInWeirdWindowsForm(options.setBuildNumber === true)\n\n case \"applicationId\":\n return resolvePackageApplicationId(options.applicationId, options.identityName, appInfo.name, \"MSIX\")\n\n case \"identityName\":\n return resolvePackageIdentityName(options.identityName, appInfo.name, \"MSIX\")\n\n case \"executable\":\n return executable\n\n case \"displayName\":\n return displayName\n\n case \"description\":\n return appInfo.description || appInfo.productName\n\n case \"backgroundColor\":\n return options.backgroundColor || \"#464646\"\n\n case \"logo\":\n return \"assets\\\\StoreLogo.png\"\n\n case \"square150x150Logo\":\n return \"assets\\\\Square150x150Logo.png\"\n\n case \"square44x44Logo\":\n return \"assets\\\\Square44x44Logo.png\"\n\n case \"lockScreen\":\n return lockScreenTag(userAssets)\n\n case \"defaultTile\":\n return defaultTileTag(userAssets, options.showNameOnTiles || false)\n\n case \"splashScreen\":\n return splashScreenTag(userAssets)\n\n case \"arch\":\n return arch === Arch.ia32 ? \"x86\" : arch === Arch.arm64 ? \"arm64\" : \"x64\"\n\n case \"resourceLanguages\":\n return resourceLanguageTag(asArray(options.languages))\n\n case \"capabilities\":\n return capabilities\n\n case \"extensions\":\n return extensions\n\n case \"minVersion\":\n return options.minVersion || defaultMinVersion\n\n case \"maxVersionTested\":\n return options.maxVersionTested || options.minVersion || defaultMinVersion\n\n case \"packageIntegrity\":\n // uap10:PackageIntegrity belongs inside <Properties>, not <Capabilities>. It takes no\n // attributes; a child <uap10:Content Enforcement=\"on\" /> is required to actually enable\n // runtime integrity checks (a bare/childless element is a no-op).\n // https://learn.microsoft.com/uwp/schemas/appxpackage/uapmanifestschema/element-uap10-packageintegrity\n return options.enforcePackageIntegrity === true ? '<uap10:PackageIntegrity><uap10:Content Enforcement=\"on\" /></uap10:PackageIntegrity>' : \"\"\n\n default:\n throw new Error(`Macro ${p1} is not defined`)\n }\n })\n await writeFile(outFile, manifest)\n }\n\n private getCapabilities(): string {\n const inner = buildCapabilitiesXml(this.options.capabilities)\n return `<Capabilities>\\n${inner}\\n</Capabilities>`\n }\n\n private async getExtensions(executable: string, displayName: string): Promise<string> {\n const packager = this.packager\n const options = this.options\n\n const baseExtensions = await buildExtensionsXml({\n protocols: asArray(packager.config.protocols).concat(asArray(packager.platformOptions.protocols)),\n fileAssociations: asArray(packager.config.fileAssociations).concat(asArray(packager.platformOptions.fileAssociations)),\n addAutoLaunchExtension: options.addAutoLaunchExtension,\n customExtensionsPath: options.customExtensionsPath,\n appDir: packager.appDir,\n executable,\n displayName,\n dependencyNames: packager.metadata.dependencies,\n })\n\n const servicesXml = buildWindowsServicesXml(options.windowsServices, executable)\n\n if (!servicesXml) {\n return baseExtensions\n }\n\n if (baseExtensions === \"\") {\n return `<Extensions>${servicesXml}</Extensions>`\n }\n\n return baseExtensions.replace(\"</Extensions>\", `${servicesXml}</Extensions>`)\n }\n}\n"]}
@@ -4,7 +4,7 @@ import { Target } from "../../../core.js";
4
4
  import { WinPackager } from "../../../winPackager.js";
5
5
  import { Defines } from "./Defines.js";
6
6
  import { NsisOptions } from "./nsisOptions.js";
7
- import { AppPackageHelper } from "./nsisUtil.js";
7
+ import { AppPackageHelper, CopyElevateHelper } from "./nsisUtil.js";
8
8
  export declare class NsisTarget extends Target {
9
9
  readonly packager: WinPackager;
10
10
  readonly outDir: string;
@@ -19,10 +19,11 @@ export declare class NsisTarget extends Target {
19
19
  get isBuildDifferentialAware(): boolean;
20
20
  private getPreCompressedFileExtensions;
21
21
  /** @private */
22
- buildAppPackage(appOutDir: string, arch: Arch): Promise<PackageFileInfo>;
22
+ buildAppPackage(appOutDir: string, arch: Arch, elevateHelper?: CopyElevateHelper | null): Promise<PackageFileInfo>;
23
23
  protected installerFilenamePattern(primaryArch?: Arch | null, defaultArch?: string): string;
24
24
  private get isPortable();
25
25
  finishBuild(): Promise<any>;
26
+ get appGuid(): string;
26
27
  private buildInstaller;
27
28
  private resolveArchPackageFiles;
28
29
  protected generateGitHubInstallerName(primaryArch: Arch | null, defaultArch: string | undefined): string;
@@ -1 +1 @@
1
- {"version":3,"file":"NsisTarget.d.ts","sourceRoot":"","sources":["../../../../src/targets/win/nsis/NsisTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EAaL,MAAM,cAAc,CAAA;AACrB,OAAO,EAA8E,eAAe,EAAe,MAAM,sBAAsB,CAAA;AAK/I,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAOzC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAKrD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC,OAAO,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAA;AAG/D,OAAO,EAAE,gBAAgB,EAAuC,MAAM,eAAe,CAAA;AAYrF,qBAAa,UAAW,SAAQ,MAAM;IAQlC,QAAQ,CAAC,QAAQ,EAAE,WAAW;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM;IAEvB,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,gBAAgB;IAVpD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAE7B,eAAe;IACf,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY;IAC7C,QAAQ,CAAC,gBAAgB,SAAQ;gBAGtB,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EACC,aAAa,EAAE,gBAAgB;IAwBpD,IAAI,6BAA6B,YAGhC;IAED,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI;IAQnC,IAAI,wBAAwB,IAAI,OAAO,CAEtC;IAED,OAAO,CAAC,8BAA8B;IAKtC,eAAe;IACT,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC;IA6B9E,SAAS,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM;IAO3F,OAAO,KAAK,UAAU,GAErB;IAEK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;YAqBnB,cAAc;YAkLd,uBAAuB;IA+CrC,SAAS,CAAC,2BAA2B,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM;IAOxG,OAAO,KAAK,gBAAgB,GAE3B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;YAEa,+BAA+B;IAsD7C,OAAO,CAAC,iBAAiB;IAqBzB,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;YA8E/D,uBAAuB;YAOvB,mBAAmB;YASnB,oBAAoB;YAMpB,mBAAmB;IASjC,OAAO,CAAC,qCAAqC;YA4B/B,eAAe;YAgEf,kCAAkC;YAiDlC,kBAAkB;CAgEjC"}
1
+ {"version":3,"file":"NsisTarget.d.ts","sourceRoot":"","sources":["../../../../src/targets/win/nsis/NsisTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EAcL,MAAM,cAAc,CAAA;AACrB,OAAO,EAA8E,eAAe,EAAe,MAAM,sBAAsB,CAAA;AAI/I,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAOzC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAKrD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC,OAAO,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAA;AAI/D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAuC,MAAM,eAAe,CAAA;AASxG,qBAAa,UAAW,SAAQ,MAAM;IAQlC,QAAQ,CAAC,QAAQ,EAAE,WAAW;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM;IAEvB,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,gBAAgB;IAVpD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAE7B,eAAe;IACf,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY;IAC7C,QAAQ,CAAC,gBAAgB,SAAQ;gBAGtB,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EACC,aAAa,EAAE,gBAAgB;IAwBpD,IAAI,6BAA6B,YAGhC;IAED,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI;IAQnC,IAAI,wBAAwB,IAAI,OAAO,CAEtC;IAED,OAAO,CAAC,8BAA8B;IAKtC,eAAe;IACT,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC;IA2CxH,SAAS,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM;IAO3F,OAAO,KAAK,UAAU,GAErB;IAEK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;IAqBjC,IAAI,OAAO,IAAI,MAAM,CAEpB;YAEa,cAAc;YAiLd,uBAAuB;IA+CrC,SAAS,CAAC,2BAA2B,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM;IAOxG,OAAO,KAAK,gBAAgB,GAE3B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;YAEa,+BAA+B;IAsD7C,OAAO,CAAC,iBAAiB;IAqBzB,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;YA8E/D,uBAAuB;YAOvB,mBAAmB;YASnB,oBAAoB;YAMpB,mBAAmB;IASjC,OAAO,CAAC,qCAAqC;YA4B/B,eAAe;YAgEf,kCAAkC;YAiDlC,kBAAkB;CAkEjC"}
@@ -1,7 +1,6 @@
1
- import { Arch, asArray, AsyncTaskManager, exists, spawnAndWriteWithOutput, generateKsuid, getArchSuffix, getPlatformIconFileName, InvalidConfigurationError, log, statOrNull, use, walk, } from "builder-util";
1
+ import { Arch, asArray, AsyncTaskManager, ensureNotBusy, exists, spawnAndWriteWithOutput, generateKsuid, getArchSuffix, getPlatformIconFileName, InvalidConfigurationError, log, statOrNull, use, walk, } from "builder-util";
2
2
  import { CURRENT_APP_INSTALLER_FILE_NAME, CURRENT_APP_PACKAGE_FILE_NAME, deepAssign, sleep, UUID } from "builder-util-runtime";
3
3
  import _debug from "debug";
4
- import * as fs from "fs";
5
4
  import * as path from "path";
6
5
  import { Target } from "../../../core.js";
7
6
  import { DesktopShortcutCreationPolicy, getEffectiveOptions } from "../../../options/CommonWindowsInstallerConfiguration.js";
@@ -16,14 +15,13 @@ import { getWindowsInstallationAppPackageName, getWindowsInstallationDirName } f
16
15
  import { addCustomMessageFileInclude, createAddLangsMacro, LangConfigurator } from "./nsisLang.js";
17
16
  import { computeLicensePage } from "./nsisLicense.js";
18
17
  import { NsisScriptGenerator, nsisEscapeString } from "./nsisScriptGenerator.js";
18
+ import { ELECTRON_BUILDER_NS_UUID, ProgIdMaker } from "./progId.js";
19
19
  import { getMakeNsisPath, getNsisPluginsPath } from "../../../toolsets/nsis.js";
20
20
  import { nsisTemplatesDir, UninstallerReader } from "./nsisUtil.js";
21
21
  import { checkMakensisOutput, verifyInstallerSize } from "./nsisValidation.js";
22
22
  import _fsExtra from "fs-extra";
23
23
  const { readFile, stat, unlink } = _fsExtra;
24
24
  const debug = _debug("electron-builder:nsis");
25
- // noinspection SpellCheckingInspection
26
- const ELECTRON_BUILDER_NS_UUID = UUID.parse("50e065bc-3134-11e6-9bab-38c9862bdaf3");
27
25
  const USE_NSIS_BUILT_IN_COMPRESSOR = false;
28
26
  export class NsisTarget extends Target {
29
27
  constructor(packager, outDir, targetName, packageHelper) {
@@ -69,7 +67,7 @@ export class NsisTarget extends Target {
69
67
  return result == null ? null : asArray(result).map(it => (it.startsWith(".") ? it : `.${it}`));
70
68
  }
71
69
  /** @private */
72
- async buildAppPackage(appOutDir, arch) {
70
+ async buildAppPackage(appOutDir, arch, elevateHelper) {
73
71
  const options = this.options;
74
72
  const packager = this.packager;
75
73
  const isBuildDifferentialAware = this.isBuildDifferentialAware;
@@ -79,11 +77,24 @@ export class NsisTarget extends Target {
79
77
  const archiveOptions = {
80
78
  withoutDir: true,
81
79
  compression: packager.compression,
80
+ // The install-time Nsis7z extractor only decodes plain LZMA2/Copy and single-stream BCJ — not
81
+ // the CPU branch converters modern 7za applies to executables (BCJ2 on x86/x64, ARM64 on
82
+ // arm64), which it silently skips, dropping the main exe and every native binary from the
83
+ // install. Pin the payload to a filter it can decode. See #9983.
84
+ installTimeDecodable: true,
82
85
  excluded: preCompressedFileExtensions == null ? null : preCompressedFileExtensions.map(it => `*${it}`),
83
86
  };
84
87
  const timer = time(`nsis package, ${Arch[arch]}`);
85
88
  await archive(format, archiveFile, appOutDir, isBuildDifferentialAware ? configureDifferentialAwareArchiveOptions(archiveOptions) : archiveOptions);
86
89
  timer.end();
90
+ // Inject elevate.exe into the archive via a temp staging dir, never by mutating appOutDir
91
+ // during packaging. The copy into win-unpacked is deferred until all targets finish, so
92
+ // concurrent targets (Squirrel, ZIP, etc.) never pick up elevate.exe non-deterministically.
93
+ // `archiveOptions` was mutated in place by configureDifferentialAwareArchiveOptions above
94
+ // (when differential-aware), so it already reflects the effective compression settings.
95
+ if (elevateHelper) {
96
+ await elevateHelper.addToArchive(archiveFile, this, format, archiveOptions, appOutDir);
97
+ }
87
98
  if (isBuildDifferentialAware && this.isWebInstaller) {
88
99
  const data = await appendBlockmap(archiveFile);
89
100
  return {
@@ -125,6 +136,9 @@ export class NsisTarget extends Target {
125
136
  await this.packageHelper.finishBuild();
126
137
  }
127
138
  }
139
+ get appGuid() {
140
+ return this.options.guid || UUID.v5(this.packager.appInfo.id, ELECTRON_BUILDER_NS_UUID);
141
+ }
128
142
  async buildInstaller(archs) {
129
143
  const primaryArch = archs.size === 1 ? (archs.keys().next().value ?? null) : null;
130
144
  const packager = this.packager;
@@ -151,11 +165,10 @@ export class NsisTarget extends Target {
151
165
  file: installerPath,
152
166
  arch: primaryArch,
153
167
  }, logFields);
154
- const guid = options.guid || UUID.v5(appInfo.id, ELECTRON_BUILDER_NS_UUID);
155
- const uninstallAppKey = guid.replace(/\\/g, " - ");
168
+ const uninstallAppKey = this.appGuid.replace(/\\/g, " - ");
156
169
  const defines = {
157
170
  APP_ID: appInfo.id,
158
- APP_GUID: guid,
171
+ APP_GUID: this.appGuid,
159
172
  // Windows bug - entry in Software\Microsoft\Windows\CurrentVersion\Uninstall cannot have \ symbols (dir)
160
173
  UNINSTALL_APP_KEY: uninstallAppKey,
161
174
  PRODUCT_NAME: appInfo.productName,
@@ -170,8 +183,8 @@ export class NsisTarget extends Target {
170
183
  if (options.customNsisBinary?.debugLogging) {
171
184
  defines.ENABLE_LOGGING_ELECTRON_BUILDER = null;
172
185
  }
173
- if (uninstallAppKey !== guid) {
174
- defines.UNINSTALL_REGISTRY_KEY_2 = `Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${guid}`;
186
+ if (uninstallAppKey !== this.appGuid) {
187
+ defines.UNINSTALL_REGISTRY_KEY_2 = `Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${this.appGuid}`;
175
188
  }
176
189
  const { homepage } = this.packager.metadata;
177
190
  use(options.uninstallUrlHelp || homepage, it => (defines.UNINSTALL_URL_HELP = it));
@@ -628,6 +641,7 @@ export class NsisTarget extends Target {
628
641
  const fileAssociations = packager.fileAssociations;
629
642
  if (fileAssociations.length !== 0) {
630
643
  scriptGenerator.include(path.join(path.join(nsisTemplatesDir, "include"), "FileAssociation.nsh"));
644
+ const progIdMaker = new ProgIdMaker(this.appGuid, packager.appInfo.productFilename);
631
645
  if (isInstaller) {
632
646
  const registerFileAssociationsScript = new NsisScriptGenerator();
633
647
  for (const item of fileAssociations) {
@@ -639,10 +653,11 @@ export class NsisTarget extends Target {
639
653
  installedIconPath = `$INSTDIR\\resources\\${nsisEscapeString(path.basename(customIcon))}`;
640
654
  registerFileAssociationsScript.file(installedIconPath, customIcon);
641
655
  }
656
+ const progID = progIdMaker.progId(item.name || ext);
642
657
  const icon = `"${installedIconPath}"`;
643
658
  const commandText = `"Open with ${nsisEscapeString(packager.appInfo.productName)}"`;
644
659
  const command = '"$appExe $\\"%1$\\""';
645
- registerFileAssociationsScript.insertMacro("APP_ASSOCIATE", `"${nsisEscapeString(ext)}" "${nsisEscapeString(item.name || ext)}" "${nsisEscapeString(item.description || "")}" ${icon} ${commandText} ${command}`);
660
+ registerFileAssociationsScript.insertMacro("APP_ASSOCIATE", `"${nsisEscapeString(ext)}" "${progID}" "${nsisEscapeString(item.description || "")}" ${icon} ${commandText} ${command}`);
646
661
  }
647
662
  }
648
663
  scriptGenerator.macro("registerFileAssociations", registerFileAssociationsScript);
@@ -650,8 +665,8 @@ export class NsisTarget extends Target {
650
665
  else {
651
666
  const unregisterFileAssociationsScript = new NsisScriptGenerator();
652
667
  for (const item of fileAssociations) {
653
- for (const ext of asArray(item.ext)) {
654
- unregisterFileAssociationsScript.insertMacro("APP_UNASSOCIATE", `"${normalizeExt(ext)}" "${item.name || ext}"`);
668
+ for (const ext of asArray(item.ext).map(normalizeExt)) {
669
+ unregisterFileAssociationsScript.insertMacro("APP_UNASSOCIATE", `"${nsisEscapeString(ext)}" "${progIdMaker.progId(item.name || ext)}"`);
655
670
  }
656
671
  }
657
672
  scriptGenerator.macro("unregisterFileAssociations", unregisterFileAssociationsScript);
@@ -683,39 +698,6 @@ async function generateForPreCompressed(preCompressedFileExtensions, dir, arch,
683
698
  scriptGenerator.macro(`customFiles_${Arch[arch]}`, macro);
684
699
  }
685
700
  }
686
- async function ensureNotBusy(outFile) {
687
- function isBusy(wasBusyBefore) {
688
- return new Promise((resolve, reject) => {
689
- fs.open(outFile, "r+", (error, fd) => {
690
- try {
691
- if (error != null && error.code === "EBUSY") {
692
- if (!wasBusyBefore) {
693
- log.info({}, "output file is locked for writing (maybe by virus scanner) => waiting for unlock...");
694
- }
695
- resolve(false);
696
- }
697
- else if (fd == null) {
698
- resolve(true);
699
- }
700
- else {
701
- fs.close(fd, () => resolve(true));
702
- }
703
- }
704
- catch (error) {
705
- reject(error);
706
- }
707
- });
708
- }).then(result => {
709
- if (result) {
710
- return true;
711
- }
712
- else {
713
- return sleep(2000).then(() => isBusy(true));
714
- }
715
- });
716
- }
717
- await isBusy(false);
718
- }
719
701
  async function createPackageFileInfo(file) {
720
702
  return {
721
703
  path: file,