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.
Files changed (238) hide show
  1. package/dist/codeSign/mac/macCodeSign.d.ts.map +1 -1
  2. package/dist/codeSign/mac/macCodeSign.js +3 -6
  3. package/dist/codeSign/mac/macCodeSign.js.map +1 -1
  4. package/dist/codeSign/win/signtoolBaseSignManager.d.ts.map +1 -1
  5. package/dist/codeSign/win/signtoolBaseSignManager.js +11 -3
  6. package/dist/codeSign/win/signtoolBaseSignManager.js.map +1 -1
  7. package/dist/codeSign/win/windowsSignAzureManager.d.ts.map +1 -1
  8. package/dist/codeSign/win/windowsSignAzureManager.js +31 -21
  9. package/dist/codeSign/win/windowsSignAzureManager.js.map +1 -1
  10. package/dist/configuration.d.ts +37 -44
  11. package/dist/configuration.d.ts.map +1 -1
  12. package/dist/configuration.js.map +1 -1
  13. package/dist/electron/ElectronFramework.js +2 -2
  14. package/dist/electron/ElectronFramework.js.map +1 -1
  15. package/dist/electron/electronVersion.d.ts.map +1 -1
  16. package/dist/electron/electronVersion.js +1 -11
  17. package/dist/electron/electronVersion.js.map +1 -1
  18. package/dist/fileMatcher.d.ts +27 -2
  19. package/dist/fileMatcher.d.ts.map +1 -1
  20. package/dist/fileMatcher.js +204 -16
  21. package/dist/fileMatcher.js.map +1 -1
  22. package/dist/indexInternal.d.ts +6 -5
  23. package/dist/indexInternal.d.ts.map +1 -1
  24. package/dist/indexInternal.js +6 -5
  25. package/dist/indexInternal.js.map +1 -1
  26. package/dist/macPackager.d.ts +5 -0
  27. package/dist/macPackager.d.ts.map +1 -1
  28. package/dist/macPackager.js +35 -0
  29. package/dist/macPackager.js.map +1 -1
  30. package/dist/node-module-collector/moduleManager.d.ts +3 -1
  31. package/dist/node-module-collector/moduleManager.d.ts.map +1 -1
  32. package/dist/node-module-collector/moduleManager.js +9 -1
  33. package/dist/node-module-collector/moduleManager.js.map +1 -1
  34. package/dist/node-module-collector/nodeModulesCollector.d.ts +13 -23
  35. package/dist/node-module-collector/nodeModulesCollector.d.ts.map +1 -1
  36. package/dist/node-module-collector/nodeModulesCollector.js +52 -122
  37. package/dist/node-module-collector/nodeModulesCollector.js.map +1 -1
  38. package/dist/node-module-collector/pnpmNodeModulesCollector.js +5 -5
  39. package/dist/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
  40. package/dist/node-module-collector/types.d.ts +2 -0
  41. package/dist/node-module-collector/types.d.ts.map +1 -1
  42. package/dist/node-module-collector/types.js.map +1 -1
  43. package/dist/options/PlatformSpecificBuildOptions.d.ts +0 -6
  44. package/dist/options/PlatformSpecificBuildOptions.d.ts.map +1 -1
  45. package/dist/options/PlatformSpecificBuildOptions.js.map +1 -1
  46. package/dist/options/SnapOptions.d.ts +15 -13
  47. package/dist/options/SnapOptions.d.ts.map +1 -1
  48. package/dist/options/SnapOptions.js.map +1 -1
  49. package/dist/options/linuxOptions.d.ts +0 -10
  50. package/dist/options/linuxOptions.d.ts.map +1 -1
  51. package/dist/options/linuxOptions.js.map +1 -1
  52. package/dist/options/winOptions.d.ts +164 -34
  53. package/dist/options/winOptions.d.ts.map +1 -1
  54. package/dist/options/winOptions.js.map +1 -1
  55. package/dist/packager.d.ts +2 -0
  56. package/dist/packager.d.ts.map +1 -1
  57. package/dist/packager.js +20 -22
  58. package/dist/packager.js.map +1 -1
  59. package/dist/platformPackager.d.ts +3 -0
  60. package/dist/platformPackager.d.ts.map +1 -1
  61. package/dist/platformPackager.js +11 -6
  62. package/dist/platformPackager.js.map +1 -1
  63. package/dist/publish/PublishManager.d.ts +1 -0
  64. package/dist/publish/PublishManager.d.ts.map +1 -1
  65. package/dist/publish/PublishManager.js +7 -2
  66. package/dist/publish/PublishManager.js.map +1 -1
  67. package/dist/targets/linux/FlatpakTarget.d.ts.map +1 -1
  68. package/dist/targets/linux/FlatpakTarget.js +4 -1
  69. package/dist/targets/linux/FlatpakTarget.js.map +1 -1
  70. package/dist/targets/linux/FpmTarget.d.ts +6 -0
  71. package/dist/targets/linux/FpmTarget.d.ts.map +1 -1
  72. package/dist/targets/linux/FpmTarget.js +28 -6
  73. package/dist/targets/linux/FpmTarget.js.map +1 -1
  74. package/dist/targets/linux/LinuxTargetHelper.d.ts +14 -0
  75. package/dist/targets/linux/LinuxTargetHelper.d.ts.map +1 -1
  76. package/dist/targets/linux/LinuxTargetHelper.js +38 -59
  77. package/dist/targets/linux/LinuxTargetHelper.js.map +1 -1
  78. package/dist/targets/linux/appimage/AppImageTarget.d.ts +1 -0
  79. package/dist/targets/linux/appimage/AppImageTarget.d.ts.map +1 -1
  80. package/dist/targets/linux/appimage/AppImageTarget.js +12 -14
  81. package/dist/targets/linux/appimage/AppImageTarget.js.map +1 -1
  82. package/dist/targets/linux/appimage/appImageUtil.d.ts +4 -0
  83. package/dist/targets/linux/appimage/appImageUtil.d.ts.map +1 -1
  84. package/dist/targets/linux/appimage/appImageUtil.js +11 -4
  85. package/dist/targets/linux/appimage/appImageUtil.js.map +1 -1
  86. package/dist/targets/linux/appimage/appLauncher.d.ts.map +1 -1
  87. package/dist/targets/linux/appimage/appLauncher.js +5 -11
  88. package/dist/targets/linux/appimage/appLauncher.js.map +1 -1
  89. package/dist/targets/linux/launcherScript.d.ts +32 -0
  90. package/dist/targets/linux/launcherScript.d.ts.map +1 -0
  91. package/dist/targets/linux/launcherScript.js +24 -0
  92. package/dist/targets/linux/launcherScript.js.map +1 -0
  93. package/dist/targets/linux/snap/SnapTarget.d.ts +1 -1
  94. package/dist/targets/linux/snap/SnapTarget.d.ts.map +1 -1
  95. package/dist/targets/linux/snap/SnapTarget.js +23 -1
  96. package/dist/targets/linux/snap/SnapTarget.js.map +1 -1
  97. package/dist/targets/linux/snap/core24.d.ts +1 -1
  98. package/dist/targets/linux/snap/core24.d.ts.map +1 -1
  99. package/dist/targets/linux/snap/core24.js +3 -2
  100. package/dist/targets/linux/snap/core24.js.map +1 -1
  101. package/dist/targets/linux/snap/coreCustom.d.ts +1 -1
  102. package/dist/targets/linux/snap/coreCustom.d.ts.map +1 -1
  103. package/dist/targets/linux/snap/coreCustom.js +2 -2
  104. package/dist/targets/linux/snap/coreCustom.js.map +1 -1
  105. package/dist/targets/linux/snap/coreLegacy.d.ts +1 -1
  106. package/dist/targets/linux/snap/coreLegacy.d.ts.map +1 -1
  107. package/dist/targets/linux/snap/coreLegacy.js +8 -7
  108. package/dist/targets/linux/snap/coreLegacy.js.map +1 -1
  109. package/dist/targets/linux/snap/snapCommand.d.ts +2 -2
  110. package/dist/targets/linux/snap/snapCommand.d.ts.map +1 -1
  111. package/dist/targets/linux/snap/snapCommand.js +4 -10
  112. package/dist/targets/linux/snap/snapCommand.js.map +1 -1
  113. package/dist/targets/linux/snap/snapcraftBuilder.d.ts +7 -1
  114. package/dist/targets/linux/snap/snapcraftBuilder.d.ts.map +1 -1
  115. package/dist/targets/linux/snap/snapcraftBuilder.js +57 -20
  116. package/dist/targets/linux/snap/snapcraftBuilder.js.map +1 -1
  117. package/dist/targets/targetFactory.d.ts +7 -0
  118. package/dist/targets/targetFactory.d.ts.map +1 -1
  119. package/dist/targets/targetFactory.js +28 -0
  120. package/dist/targets/targetFactory.js.map +1 -1
  121. package/dist/targets/win/AppxTarget.d.ts.map +1 -1
  122. package/dist/targets/win/AppxTarget.js +17 -9
  123. package/dist/targets/win/AppxTarget.js.map +1 -1
  124. package/dist/targets/win/MsiTarget.d.ts.map +1 -1
  125. package/dist/targets/win/MsiTarget.js +8 -11
  126. package/dist/targets/win/MsiTarget.js.map +1 -1
  127. package/dist/targets/win/nsis/NsisTarget.d.ts +3 -2
  128. package/dist/targets/win/nsis/NsisTarget.d.ts.map +1 -1
  129. package/dist/targets/win/nsis/NsisTarget.js +26 -49
  130. package/dist/targets/win/nsis/NsisTarget.js.map +1 -1
  131. package/dist/targets/win/nsis/nsisScriptGenerator.d.ts.map +1 -1
  132. package/dist/targets/win/nsis/nsisScriptGenerator.js +3 -2
  133. package/dist/targets/win/nsis/nsisScriptGenerator.js.map +1 -1
  134. package/dist/targets/win/nsis/nsisUtil.d.ts +5 -2
  135. package/dist/targets/win/nsis/nsisUtil.d.ts.map +1 -1
  136. package/dist/targets/win/nsis/nsisUtil.js +46 -22
  137. package/dist/targets/win/nsis/nsisUtil.js.map +1 -1
  138. package/dist/targets/win/nsis/progId.d.ts +21 -0
  139. package/dist/targets/win/nsis/progId.d.ts.map +1 -0
  140. package/dist/targets/win/nsis/progId.js +60 -0
  141. package/dist/targets/win/nsis/progId.js.map +1 -0
  142. package/dist/toolsets/7zip.d.ts.map +1 -1
  143. package/dist/toolsets/7zip.js +3 -1
  144. package/dist/toolsets/7zip.js.map +1 -1
  145. package/dist/toolsets/appimage.d.ts +3 -3
  146. package/dist/toolsets/appimage.d.ts.map +1 -1
  147. package/dist/toolsets/appimage.js +9 -6
  148. package/dist/toolsets/appimage.js.map +1 -1
  149. package/dist/toolsets/custom.d.ts +1 -3
  150. package/dist/toolsets/custom.d.ts.map +1 -1
  151. package/dist/toolsets/custom.js +4 -133
  152. package/dist/toolsets/custom.js.map +1 -1
  153. package/dist/toolsets/fpm.d.ts.map +1 -1
  154. package/dist/toolsets/fpm.js +11 -5
  155. package/dist/toolsets/fpm.js.map +1 -1
  156. package/dist/toolsets/icons.d.ts.map +1 -1
  157. package/dist/toolsets/icons.js +13 -2
  158. package/dist/toolsets/icons.js.map +1 -1
  159. package/dist/toolsets/linuxToolsMac.d.ts.map +1 -1
  160. package/dist/toolsets/linuxToolsMac.js +4 -1
  161. package/dist/toolsets/linuxToolsMac.js.map +1 -1
  162. package/dist/toolsets/nsis.d.ts.map +1 -1
  163. package/dist/toolsets/nsis.js +6 -3
  164. package/dist/toolsets/nsis.js.map +1 -1
  165. package/dist/toolsets/version.d.ts +12 -0
  166. package/dist/toolsets/version.d.ts.map +1 -0
  167. package/dist/toolsets/version.js +13 -0
  168. package/dist/toolsets/version.js.map +1 -0
  169. package/dist/toolsets/winCodeSign.d.ts +11 -3
  170. package/dist/toolsets/winCodeSign.d.ts.map +1 -1
  171. package/dist/toolsets/winCodeSign.js +45 -27
  172. package/dist/toolsets/winCodeSign.js.map +1 -1
  173. package/dist/toolsets/wine.d.ts +2 -1
  174. package/dist/toolsets/wine.d.ts.map +1 -1
  175. package/dist/toolsets/wine.js +15 -13
  176. package/dist/toolsets/wine.js.map +1 -1
  177. package/dist/util/NodeModuleCopyHelper.js +3 -3
  178. package/dist/util/NodeModuleCopyHelper.js.map +1 -1
  179. package/dist/util/appFileCopier.d.ts +39 -0
  180. package/dist/util/appFileCopier.d.ts.map +1 -1
  181. package/dist/util/appFileCopier.js +71 -20
  182. package/dist/util/appFileCopier.js.map +1 -1
  183. package/dist/util/archCompatibility.d.ts +42 -0
  184. package/dist/util/archCompatibility.d.ts.map +1 -0
  185. package/dist/util/archCompatibility.js +202 -0
  186. package/dist/util/archCompatibility.js.map +1 -0
  187. package/dist/util/config/config.d.ts +1 -0
  188. package/dist/util/config/config.d.ts.map +1 -1
  189. package/dist/util/config/config.js +4 -1
  190. package/dist/util/config/config.js.map +1 -1
  191. package/dist/util/config/load.d.ts +2 -2
  192. package/dist/util/config/load.d.ts.map +1 -1
  193. package/dist/util/config/load.js +3 -12
  194. package/dist/util/config/load.js.map +1 -1
  195. package/dist/util/config/schemaValidator.js +1 -1
  196. package/dist/util/config/schemaValidator.js.map +1 -1
  197. package/dist/util/electronGet.d.ts +6 -3
  198. package/dist/util/electronGet.d.ts.map +1 -1
  199. package/dist/util/electronGet.js +23 -9
  200. package/dist/util/electronGet.js.map +1 -1
  201. package/dist/util/flags.d.ts +0 -1
  202. package/dist/util/flags.d.ts.map +1 -1
  203. package/dist/util/flags.js +0 -3
  204. package/dist/util/flags.js.map +1 -1
  205. package/dist/util/hash.d.ts +1 -1
  206. package/dist/util/hash.d.ts.map +1 -1
  207. package/dist/util/hash.js +1 -15
  208. package/dist/util/hash.js.map +1 -1
  209. package/dist/util/installOrRebuild.d.ts +38 -0
  210. package/dist/util/installOrRebuild.d.ts.map +1 -0
  211. package/dist/util/{yarn.js → installOrRebuild.js} +65 -14
  212. package/dist/util/installOrRebuild.js.map +1 -0
  213. package/dist/util/langs.d.ts.map +1 -1
  214. package/dist/util/langs.js +1 -0
  215. package/dist/util/langs.js.map +1 -1
  216. package/dist/util/mac/macosIconComposer.d.ts +2 -1
  217. package/dist/util/mac/macosIconComposer.d.ts.map +1 -1
  218. package/dist/util/mac/macosIconComposer.js +40 -58
  219. package/dist/util/mac/macosIconComposer.js.map +1 -1
  220. package/dist/util/streamSpawnToFile.d.ts +47 -0
  221. package/dist/util/streamSpawnToFile.d.ts.map +1 -0
  222. package/dist/util/streamSpawnToFile.js +110 -0
  223. package/dist/util/streamSpawnToFile.js.map +1 -0
  224. package/dist/util/toolsetLock.d.ts +2 -0
  225. package/dist/util/toolsetLock.d.ts.map +1 -1
  226. package/dist/util/toolsetLock.js +31 -5
  227. package/dist/util/toolsetLock.js.map +1 -1
  228. package/dist/version.d.ts +1 -1
  229. package/dist/version.js +1 -1
  230. package/dist/version.js.map +1 -1
  231. package/package.json +8 -8
  232. package/scheme.json +94 -130
  233. package/templates/appx/appxmanifest.xml +1 -2
  234. package/templates/nsis/assistedMessages.yml +17 -0
  235. package/templates/nsis/messages.yml +5 -0
  236. package/dist/util/yarn.d.ts +0 -23
  237. package/dist/util/yarn.d.ts.map +0 -1
  238. package/dist/util/yarn.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FlatpakTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/FlatpakTarget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAA+B,MAAM,cAAc,CAAA;AAGhE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM1D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,MAAM;IAK7C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,MAAM;IACd,QAAQ,CAAC,MAAM,EAAE,MAAM;IANzB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAA+D;gBAG7F,IAAI,EAAE,MAAM,EACK,QAAQ,EAAE,aAAa,EAChC,MAAM,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM;IAKzB,IAAI,KAAK,IAAI,MAAM,CAElB;IAEK,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;YA2B1C,eAAe;YAQf,uBAAuB;YAOvB,iBAAiB;YAMjB,eAAe;YAQf,SAAS;IAiBvB,OAAO,CAAC,wBAAwB;CA8BjC"}
1
+ {"version":3,"file":"FlatpakTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/FlatpakTarget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAA+B,MAAM,cAAc,CAAA;AAGhE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAO1D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,MAAM;IAK7C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,MAAM;IACd,QAAQ,CAAC,MAAM,EAAE,MAAM;IANzB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAA+D;gBAG7F,IAAI,EAAE,MAAM,EACK,QAAQ,EAAE,aAAa,EAChC,MAAM,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM;IAKzB,IAAI,KAAK,IAAI,MAAM,CAElB;IAEK,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;YA2B1C,eAAe;YAQf,uBAAuB;YAOvB,iBAAiB;YAMjB,eAAe;YAQf,SAAS;IAiBvB,OAAO,CAAC,wBAAwB;CA8BjC"}
@@ -3,6 +3,7 @@ import { copyFile, toLinuxArchString } from "builder-util";
3
3
  import * as path from "path";
4
4
  import { Target } from "../../core.js";
5
5
  import { getNotLocalizedLicenseFile } from "../../util/license.js";
6
+ import { shellQuote } from "./launcherScript.js";
6
7
  import { createStageDir } from "../targetUtil.js";
7
8
  import _fsExtra from "fs-extra";
8
9
  const { chmod, outputFile } = _fsExtra;
@@ -128,7 +129,9 @@ const flatpakBuilderDefaults = {
128
129
  ],
129
130
  };
130
131
  function getElectronWrapperScript(executableName, executableArgs, useWaylandFlags) {
131
- const stringifiedExecutableArgs = executableArgs?.join(" ") || "";
132
+ // Single-quote each arg so embedded characters (spaces, =, quotes) are passed literally,
133
+ // consistent with the other Linux launcher entrypoints.
134
+ const stringifiedExecutableArgs = (executableArgs ?? []).map(shellQuote).join(" ");
132
135
  if (useWaylandFlags) {
133
136
  return `#!/bin/sh
134
137
 
@@ -1 +1 @@
1
- {"version":3,"file":"FlatpakTarget.js","sourceRoot":"","sources":["../../../src/targets/linux/FlatpakTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { bundle as bundleFlatpak, FlatpakBundlerBuildOptions, FlatpakManifest } from \"@malept/flatpak-bundler\"\nimport { Arch, copyFile, toLinuxArchString } from \"builder-util\"\n\nimport * as path from \"path\"\nimport { Target } from \"../../core.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { FlatpakOptions } from \"../../options/linuxOptions.js\"\nimport { getNotLocalizedLicenseFile } from \"../../util/license.js\"\nimport { LinuxTargetHelper } from \"./LinuxTargetHelper.js\"\nimport { createStageDir, StageDir } from \"../targetUtil.js\"\nimport { Nullish } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nconst { chmod, outputFile } = _fsExtra\n\nexport default class FlatpakTarget extends Target {\n readonly options: FlatpakOptions = this.packager.getOptionsForTarget<FlatpakOptions>(this.name)\n\n constructor(\n name: string,\n private readonly packager: LinuxPackager,\n private helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name)\n }\n\n get appId(): string {\n return filterFlatpakAppIdentifier(this.packager.appInfo.id)\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const { packager, options } = this\n const artifactName = packager.expandArtifactNamePattern(options, \"flatpak\", arch, undefined, false)\n const artifactPath = path.join(this.outDir, artifactName)\n await packager.emitArtifactBuildStarted({\n targetPresentableName: \"flatpak\",\n file: artifactPath,\n arch,\n })\n\n const stageDir = await this.prepareStageDir(arch)\n\n const { manifest, buildOptions } = this.getFlatpakBuilderOptions(appOutDir, stageDir.dir, artifactName, arch)\n await bundleFlatpak(manifest, buildOptions)\n\n await stageDir.cleanup()\n\n await packager.emitArtifactBuildCompleted({\n file: artifactPath,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, \"flatpak\", arch, false),\n target: this,\n arch,\n packager,\n isWriteUpdateInfo: false,\n })\n }\n\n private async prepareStageDir(arch: Arch): Promise<StageDir> {\n const stageDir = await createStageDir(this, this.packager, arch)\n\n await Promise.all([this.createSandboxBinWrapper(stageDir), this.createDesktopFile(stageDir), this.copyLicenseFile(stageDir), this.copyIcons(stageDir)])\n\n return stageDir\n }\n\n private async createSandboxBinWrapper(stageDir: StageDir) {\n const useWaylandFlags = !!this.options.useWaylandFlags\n const electronWrapperPath = stageDir.getTempFile(path.join(\"bin\", \"electron-wrapper\"))\n await outputFile(electronWrapperPath, getElectronWrapperScript(this.packager.executableName, this.options.executableArgs, useWaylandFlags))\n await chmod(electronWrapperPath, 0o755)\n }\n\n private async createDesktopFile(stageDir: StageDir) {\n const appIdentifier = this.appId\n const desktopFile = stageDir.getTempFile(path.join(\"share\", \"applications\", `${appIdentifier}.desktop`))\n await this.helper.writeDesktopEntry(this.options, \"electron-wrapper %U\", desktopFile, { Icon: appIdentifier })\n }\n\n private async copyLicenseFile(stageDir: StageDir) {\n const licenseSrc = await getNotLocalizedLicenseFile(this.options.license, this.packager, [\"txt\", \"html\"])\n if (licenseSrc) {\n const licenseDst = stageDir.getTempFile(path.join(\"share\", \"doc\", this.appId, \"copyright\"))\n await copyFile(licenseSrc, licenseDst)\n }\n }\n\n private async copyIcons(stageDir: StageDir) {\n const icons = await this.helper.icons\n const copyIcons = icons.map(async icon => {\n if (icon.size > 512) {\n // Flatpak does not allow icons larger than 512 pixels\n return Promise.resolve()\n }\n const extWithDot = path.extname(icon.file)\n const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n const iconDst = stageDir.getTempFile(path.join(\"share\", \"icons\", \"hicolor\", sizeName, \"apps\", `${this.appId}${extWithDot}`))\n\n return copyFile(icon.file, iconDst)\n })\n\n await Promise.all(copyIcons)\n }\n\n private getFlatpakBuilderOptions(appOutDir: string, stageDir: string, artifactName: string, arch: Arch): { manifest: FlatpakManifest; buildOptions: FlatpakBundlerBuildOptions } {\n const appIdentifier = this.appId\n const { executableName } = this.packager\n const flatpakArch = toLinuxArchString(arch, \"flatpak\")\n\n const manifest: FlatpakManifest = {\n id: appIdentifier,\n command: \"electron-wrapper\",\n runtime: this.options.runtime || flatpakBuilderDefaults.runtime,\n runtimeVersion: this.options.runtimeVersion || flatpakBuilderDefaults.runtimeVersion,\n sdk: this.options.sdk || flatpakBuilderDefaults.sdk,\n base: this.options.base || flatpakBuilderDefaults.base,\n baseVersion: this.options.baseVersion || flatpakBuilderDefaults.baseVersion,\n finishArgs: this.options.finishArgs || flatpakBuilderDefaults.finishArgs,\n branch: this.options.branch,\n modules: this.options.modules,\n }\n\n const buildOptions: FlatpakBundlerBuildOptions = {\n baseFlatpakref: `app/${manifest.base}/${flatpakArch}/${manifest.baseVersion}`,\n runtimeFlatpakref: `runtime/${manifest.runtime}/${flatpakArch}/${manifest.runtimeVersion}`,\n sdkFlatpakref: `runtime/${manifest.sdk}/${flatpakArch}/${manifest.runtimeVersion}`,\n arch: flatpakArch as any,\n bundlePath: path.join(this.outDir, artifactName),\n files: [[stageDir, \"/\"], [appOutDir, path.join(\"/lib\", appIdentifier)], ...(this.options.files || [])],\n symlinks: [[path.join(\"/lib\", appIdentifier, executableName), path.join(\"/bin\", executableName)], ...(this.options.symlinks || [])],\n }\n\n return { manifest, buildOptions }\n }\n}\n\nconst flatpakBuilderDefaults: Omit<FlatpakManifest, \"id\" | \"command\"> = {\n runtime: \"org.freedesktop.Platform\",\n runtimeVersion: \"20.08\",\n sdk: \"org.freedesktop.Sdk\",\n base: \"org.electronjs.Electron2.BaseApp\",\n baseVersion: \"20.08\",\n finishArgs: [\n // Wayland/X11 Rendering\n \"--socket=wayland\",\n \"--socket=x11\",\n \"--share=ipc\",\n // Open GL\n \"--device=dri\",\n // Audio output\n \"--socket=pulseaudio\",\n // Read/write home directory access\n \"--filesystem=home\",\n // Allow communication with network\n \"--share=network\",\n // System notifications with libnotify\n \"--talk-name=org.freedesktop.Notifications\",\n ],\n}\n\nfunction getElectronWrapperScript(executableName: string, executableArgs: string[] | Nullish, useWaylandFlags: boolean): string {\n const stringifiedExecutableArgs = executableArgs?.join(\" \") || \"\"\n if (useWaylandFlags) {\n return `#!/bin/sh\n\nexport TMPDIR=\"$XDG_RUNTIME_DIR/app/$FLATPAK_ID\"\n\nif [ \"\\${XDG_SESSION_TYPE}\" == \"wayland\" ]; then\n zypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} --enable-features=UseOzonePlatform --ozone-platform=wayland \"$@\"\nelse\n zypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} \"$@\"\nfi\n`\n }\n return `#!/bin/sh\n\nexport TMPDIR=\"$XDG_RUNTIME_DIR/app/$FLATPAK_ID\"\n\nzypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} \"$@\"\n`\n}\n\nfunction filterFlatpakAppIdentifier(identifier: string) {\n // Remove special characters and allow only alphanumeric (A-Z,a-z,0-9), underscore (_), and period (.)\n // Flatpak documentation: https://docs.flatpak.org/en/latest/conventions.html#application-ids\n return identifier.replace(/-/g, \"_\").replace(/[^a-zA-Z0-9._]/g, \"\")\n}\n"]}
1
+ {"version":3,"file":"FlatpakTarget.js","sourceRoot":"","sources":["../../../src/targets/linux/FlatpakTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { bundle as bundleFlatpak, FlatpakBundlerBuildOptions, FlatpakManifest } from \"@malept/flatpak-bundler\"\nimport { Arch, copyFile, toLinuxArchString } from \"builder-util\"\n\nimport * as path from \"path\"\nimport { Target } from \"../../core.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { FlatpakOptions } from \"../../options/linuxOptions.js\"\nimport { getNotLocalizedLicenseFile } from \"../../util/license.js\"\nimport { LinuxTargetHelper } from \"./LinuxTargetHelper.js\"\nimport { shellQuote } from \"./launcherScript.js\"\nimport { createStageDir, StageDir } from \"../targetUtil.js\"\nimport { Nullish } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nconst { chmod, outputFile } = _fsExtra\n\nexport default class FlatpakTarget extends Target {\n readonly options: FlatpakOptions = this.packager.getOptionsForTarget<FlatpakOptions>(this.name)\n\n constructor(\n name: string,\n private readonly packager: LinuxPackager,\n private helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name)\n }\n\n get appId(): string {\n return filterFlatpakAppIdentifier(this.packager.appInfo.id)\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const { packager, options } = this\n const artifactName = packager.expandArtifactNamePattern(options, \"flatpak\", arch, undefined, false)\n const artifactPath = path.join(this.outDir, artifactName)\n await packager.emitArtifactBuildStarted({\n targetPresentableName: \"flatpak\",\n file: artifactPath,\n arch,\n })\n\n const stageDir = await this.prepareStageDir(arch)\n\n const { manifest, buildOptions } = this.getFlatpakBuilderOptions(appOutDir, stageDir.dir, artifactName, arch)\n await bundleFlatpak(manifest, buildOptions)\n\n await stageDir.cleanup()\n\n await packager.emitArtifactBuildCompleted({\n file: artifactPath,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, \"flatpak\", arch, false),\n target: this,\n arch,\n packager,\n isWriteUpdateInfo: false,\n })\n }\n\n private async prepareStageDir(arch: Arch): Promise<StageDir> {\n const stageDir = await createStageDir(this, this.packager, arch)\n\n await Promise.all([this.createSandboxBinWrapper(stageDir), this.createDesktopFile(stageDir), this.copyLicenseFile(stageDir), this.copyIcons(stageDir)])\n\n return stageDir\n }\n\n private async createSandboxBinWrapper(stageDir: StageDir) {\n const useWaylandFlags = !!this.options.useWaylandFlags\n const electronWrapperPath = stageDir.getTempFile(path.join(\"bin\", \"electron-wrapper\"))\n await outputFile(electronWrapperPath, getElectronWrapperScript(this.packager.executableName, this.options.executableArgs, useWaylandFlags))\n await chmod(electronWrapperPath, 0o755)\n }\n\n private async createDesktopFile(stageDir: StageDir) {\n const appIdentifier = this.appId\n const desktopFile = stageDir.getTempFile(path.join(\"share\", \"applications\", `${appIdentifier}.desktop`))\n await this.helper.writeDesktopEntry(this.options, \"electron-wrapper %U\", desktopFile, { Icon: appIdentifier })\n }\n\n private async copyLicenseFile(stageDir: StageDir) {\n const licenseSrc = await getNotLocalizedLicenseFile(this.options.license, this.packager, [\"txt\", \"html\"])\n if (licenseSrc) {\n const licenseDst = stageDir.getTempFile(path.join(\"share\", \"doc\", this.appId, \"copyright\"))\n await copyFile(licenseSrc, licenseDst)\n }\n }\n\n private async copyIcons(stageDir: StageDir) {\n const icons = await this.helper.icons\n const copyIcons = icons.map(async icon => {\n if (icon.size > 512) {\n // Flatpak does not allow icons larger than 512 pixels\n return Promise.resolve()\n }\n const extWithDot = path.extname(icon.file)\n const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n const iconDst = stageDir.getTempFile(path.join(\"share\", \"icons\", \"hicolor\", sizeName, \"apps\", `${this.appId}${extWithDot}`))\n\n return copyFile(icon.file, iconDst)\n })\n\n await Promise.all(copyIcons)\n }\n\n private getFlatpakBuilderOptions(appOutDir: string, stageDir: string, artifactName: string, arch: Arch): { manifest: FlatpakManifest; buildOptions: FlatpakBundlerBuildOptions } {\n const appIdentifier = this.appId\n const { executableName } = this.packager\n const flatpakArch = toLinuxArchString(arch, \"flatpak\")\n\n const manifest: FlatpakManifest = {\n id: appIdentifier,\n command: \"electron-wrapper\",\n runtime: this.options.runtime || flatpakBuilderDefaults.runtime,\n runtimeVersion: this.options.runtimeVersion || flatpakBuilderDefaults.runtimeVersion,\n sdk: this.options.sdk || flatpakBuilderDefaults.sdk,\n base: this.options.base || flatpakBuilderDefaults.base,\n baseVersion: this.options.baseVersion || flatpakBuilderDefaults.baseVersion,\n finishArgs: this.options.finishArgs || flatpakBuilderDefaults.finishArgs,\n branch: this.options.branch,\n modules: this.options.modules,\n }\n\n const buildOptions: FlatpakBundlerBuildOptions = {\n baseFlatpakref: `app/${manifest.base}/${flatpakArch}/${manifest.baseVersion}`,\n runtimeFlatpakref: `runtime/${manifest.runtime}/${flatpakArch}/${manifest.runtimeVersion}`,\n sdkFlatpakref: `runtime/${manifest.sdk}/${flatpakArch}/${manifest.runtimeVersion}`,\n arch: flatpakArch as any,\n bundlePath: path.join(this.outDir, artifactName),\n files: [[stageDir, \"/\"], [appOutDir, path.join(\"/lib\", appIdentifier)], ...(this.options.files || [])],\n symlinks: [[path.join(\"/lib\", appIdentifier, executableName), path.join(\"/bin\", executableName)], ...(this.options.symlinks || [])],\n }\n\n return { manifest, buildOptions }\n }\n}\n\nconst flatpakBuilderDefaults: Omit<FlatpakManifest, \"id\" | \"command\"> = {\n runtime: \"org.freedesktop.Platform\",\n runtimeVersion: \"20.08\",\n sdk: \"org.freedesktop.Sdk\",\n base: \"org.electronjs.Electron2.BaseApp\",\n baseVersion: \"20.08\",\n finishArgs: [\n // Wayland/X11 Rendering\n \"--socket=wayland\",\n \"--socket=x11\",\n \"--share=ipc\",\n // Open GL\n \"--device=dri\",\n // Audio output\n \"--socket=pulseaudio\",\n // Read/write home directory access\n \"--filesystem=home\",\n // Allow communication with network\n \"--share=network\",\n // System notifications with libnotify\n \"--talk-name=org.freedesktop.Notifications\",\n ],\n}\n\nfunction getElectronWrapperScript(executableName: string, executableArgs: string[] | Nullish, useWaylandFlags: boolean): string {\n // Single-quote each arg so embedded characters (spaces, =, quotes) are passed literally,\n // consistent with the other Linux launcher entrypoints.\n const stringifiedExecutableArgs = (executableArgs ?? []).map(shellQuote).join(\" \")\n if (useWaylandFlags) {\n return `#!/bin/sh\n\nexport TMPDIR=\"$XDG_RUNTIME_DIR/app/$FLATPAK_ID\"\n\nif [ \"\\${XDG_SESSION_TYPE}\" == \"wayland\" ]; then\n zypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} --enable-features=UseOzonePlatform --ozone-platform=wayland \"$@\"\nelse\n zypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} \"$@\"\nfi\n`\n }\n return `#!/bin/sh\n\nexport TMPDIR=\"$XDG_RUNTIME_DIR/app/$FLATPAK_ID\"\n\nzypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} \"$@\"\n`\n}\n\nfunction filterFlatpakAppIdentifier(identifier: string) {\n // Remove special characters and allow only alphanumeric (A-Z,a-z,0-9), underscore (_), and period (.)\n // Flatpak documentation: https://docs.flatpak.org/en/latest/conventions.html#application-ids\n return identifier.replace(/-/g, \"_\").replace(/[^a-zA-Z0-9._]/g, \"\")\n}\n"]}
@@ -14,6 +14,12 @@ export default class FpmTarget extends Target {
14
14
  checkOptions(): Promise<any>;
15
15
  private computeFpmMetaInfoOptions;
16
16
  build(appOutDir: string, arch: Arch): Promise<any>;
17
+ /**
18
+ * Generate the launcher entrypoint script installed alongside the app binary. The launcher execs
19
+ * the real binary with the configured `executableArgs` (single-quoted) and forwards `"$@"` so the
20
+ * desktop launcher's field-code expansions (e.g. opened files/URLs) still reach the app.
21
+ */
22
+ private createLauncherScript;
17
23
  private executeFpm;
18
24
  private supportsAutoUpdate;
19
25
  private getDefaultDepends;
@@ -1 +1 @@
1
- {"version":3,"file":"FpmTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/FpmTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA6H,MAAM,cAAc,CAAA;AAQ9J,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAc,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAUtF,OAAO,EAAiB,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAgBzE,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,MAAM;IAOzC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM;IARzB,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAA2E;IAEvH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;gBAGhD,IAAI,EAAE,MAAM,EACK,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,iBAAiB,EACjC,MAAM,EAAE,MAAM;YAOX,aAAa;IAoD3B,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC;YAId,yBAAyB;IA+BjC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;YAoL1C,UAAU;IAmDxB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,8BAA8B;CAWvC"}
1
+ {"version":3,"file":"FpmTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/FpmTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA4G,MAAM,cAAc,CAAA;AAQ7I,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAc,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAWtF,OAAO,EAAiB,iBAAiB,EAAwB,MAAM,wBAAwB,CAAA;AAgB/F,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,MAAM;IAOzC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM;IARzB,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAA2E;IAEvH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;gBAGhD,IAAI,EAAE,MAAM,EACK,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,iBAAiB,EACjC,MAAM,EAAE,MAAM;YAOX,aAAa;IAoD3B,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC;YAId,yBAAyB;IA+BjC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;IAyLxD;;;;OAIG;YACW,oBAAoB;YAcpB,UAAU;IAmDxB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,8BAA8B;CAWvC"}
@@ -1,12 +1,12 @@
1
- import { asArray, exec, getArchSuffix, log, serializeToYaml, stripSensitiveEnvVars, toLinuxArchString, unlinkIfExists, use } from "builder-util";
1
+ import { asArray, exec, getArchSuffix, log, stripSensitiveEnvVars, toLinuxArchString, unlinkIfExists, use } from "builder-util";
2
2
  import { objectToArgs } from "builder-util-runtime";
3
3
  import _fsExtra from "fs-extra";
4
- import { mkdir, readFile } from "fs/promises";
4
+ import { chmod, mkdir, readFile } from "fs/promises";
5
5
  import * as path from "path";
6
6
  import { smarten } from "../../appInfo.js";
7
7
  import { Target } from "../../core.js";
8
8
  import * as errorMessages from "../../errorMessages.js";
9
- import { getAppUpdatePublishConfiguration } from "../../publish/PublishManager.js";
9
+ import { getAppUpdatePublishConfiguration, writeAppUpdateYaml } from "../../publish/PublishManager.js";
10
10
  import { getFpmPath } from "../../toolsets/fpm.js";
11
11
  import { getLinuxToolsPath } from "../../toolsets/linuxToolsMac.js";
12
12
  import { computeEnv } from "../../util/bundledTool.js";
@@ -14,7 +14,8 @@ import { isFpmDebug } from "../../util/flags.js";
14
14
  import { hashFile } from "../../util/hash.js";
15
15
  import { isMacOsSierra } from "../../util/mac/macosVersion.js";
16
16
  import { getTemplatePath } from "../../util/pathManager.js";
17
- import { installPrefix } from "./LinuxTargetHelper.js";
17
+ import { buildLauncherScript, shellQuote } from "./launcherScript.js";
18
+ import { installPrefix, quoteDesktopExecPath } from "./LinuxTargetHelper.js";
18
19
  const { copyFile, outputFile, stat } = _fsExtra;
19
20
  export default class FpmTarget extends Target {
20
21
  constructor(name, packager, helper, outDir) {
@@ -133,7 +134,7 @@ export default class FpmTarget extends Target {
133
134
  : null;
134
135
  if (publishConfig != null) {
135
136
  log.info({ resourceDir: log.filePath(resourceDir) }, `adding autoupdate files for: ${target}`);
136
- await outputFile(path.join(resourceDir, "app-update.yml"), serializeToYaml(publishConfig));
137
+ await writeAppUpdateYaml(resourceDir, publishConfig);
137
138
  // Extra file needed for auto-updater to detect installation method
138
139
  await outputFile(path.join(resourceDir, "package-type"), target);
139
140
  }
@@ -220,7 +221,11 @@ export default class FpmTarget extends Target {
220
221
  if (mimeTypeFilePath != null) {
221
222
  args.push(`${mimeTypeFilePath}=/usr/share/mime/packages/${packager.executableName}.xml`);
222
223
  }
223
- const desktopFilePath = await this.helper.writeDesktopEntry(this.options);
224
+ // Launch through a launcher entrypoint so executableArgs are injected in one place and the
225
+ // .desktop Exec key stays a plain command path (consistent with the other Linux targets).
226
+ const launcher = await this.createLauncherScript();
227
+ args.push(`${launcher.tempPath}=${launcher.installPath}`);
228
+ const desktopFilePath = await this.helper.writeDesktopEntry(this.options, `${quoteDesktopExecPath(launcher.installPath)} %U`);
224
229
  args.push(`${desktopFilePath}=/usr/share/applications/${this.helper.getDesktopFileName()}.desktop`);
225
230
  if (packager.packagerOptions.effectiveOptionComputed != null && (await packager.packagerOptions.effectiveOptionComputed([args, desktopFilePath]))) {
226
231
  return;
@@ -257,6 +262,23 @@ export default class FpmTarget extends Target {
257
262
  }
258
263
  await packager.emitArtifactBuildCompleted(info);
259
264
  }
265
+ /**
266
+ * Generate the launcher entrypoint script installed alongside the app binary. The launcher execs
267
+ * the real binary with the configured `executableArgs` (single-quoted) and forwards `"$@"` so the
268
+ * desktop launcher's field-code expansions (e.g. opened files/URLs) still reach the app.
269
+ */
270
+ async createLauncherScript() {
271
+ const { appInfo, executableName } = this.packager;
272
+ const appDir = `${installPrefix}/${appInfo.sanitizedProductName}`;
273
+ // The launcher path is fully resolved (no shell variables to expand), so single-quote the whole
274
+ // token. This passes any embedded character literally and avoids restricting otherwise-valid
275
+ // executable/product names (e.g. those containing `$` or backtick).
276
+ const content = buildLauncherScript({ command: [shellQuote(`${appDir}/${executableName}`)], args: this.options.executableArgs ?? [] });
277
+ const tempPath = await this.packager.tempDirManager.getTempFile({ suffix: "-launcher.sh" });
278
+ await outputFile(tempPath, content, { mode: 0o755 });
279
+ await chmod(tempPath, 0o755);
280
+ return { installPath: `${appDir}/${executableName}-launcher`, tempPath };
281
+ }
260
282
  async executeFpm(target, fpmConfiguration, env) {
261
283
  const fpmArgs = ["-s", "dir", "--force", "-t", target];
262
284
  const forceDebugLogging = isFpmDebug();
@@ -1 +1 @@
1
- {"version":3,"file":"FpmTarget.js","sourceRoot":"","sources":["../../../src/targets/linux/FpmTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, asArray, exec, getArchSuffix, log, serializeToYaml, stripSensitiveEnvVars, TmpDir, toLinuxArchString, unlinkIfExists, use } from \"builder-util\"\nimport { Nullish } from \"builder-util-runtime\"\n\nimport { objectToArgs } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport { mkdir, readFile } from \"fs/promises\"\nimport * as path from \"path\"\nimport { smarten } from \"../../appInfo.js\"\nimport { Target } from \"../../core.js\"\nimport * as errorMessages from \"../../errorMessages.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { DebOptions, LinuxTargetSpecificOptions } from \"../../options/linuxOptions.js\"\nimport { ArtifactCreated } from \"../../packagerApi.js\"\nimport { getAppUpdatePublishConfiguration } from \"../../publish/PublishManager.js\"\nimport { getFpmPath } from \"../../toolsets/fpm.js\"\nimport { getLinuxToolsPath } from \"../../toolsets/linuxToolsMac.js\"\nimport { computeEnv } from \"../../util/bundledTool.js\"\nimport { isFpmDebug } from \"../../util/flags.js\"\nimport { hashFile } from \"../../util/hash.js\"\nimport { isMacOsSierra } from \"../../util/mac/macosVersion.js\"\nimport { getTemplatePath } from \"../../util/pathManager.js\"\nimport { installPrefix, LinuxTargetHelper } from \"./LinuxTargetHelper.js\"\nconst { copyFile, outputFile, stat } = _fsExtra\n\ninterface FpmOptions {\n name: string\n maintainer: string | undefined\n vendor: string\n url: string\n}\n\ninterface ScriptFiles {\n afterRemove: string\n afterInstall: string\n appArmor: string\n}\n\nexport default class FpmTarget extends Target {\n readonly options: LinuxTargetSpecificOptions = this.packager.getOptionsForTarget<LinuxTargetSpecificOptions>(this.name)\n\n private readonly scriptFiles: Promise<ScriptFiles>\n\n constructor(\n name: string,\n private readonly packager: LinuxPackager,\n private readonly helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name, false)\n\n this.scriptFiles = this.createScripts()\n }\n\n private async createScripts(): Promise<ScriptFiles> {\n const defaultTemplatesDir = getTemplatePath(\"linux\")\n\n const packager = this.packager\n\n /** Escape a string value for safe interpolation inside a bash single-quoted\n * string (`'...'`). The only character that can break out of a POSIX\n * single-quoted context is a literal single-quote; we replace it with the\n * standard `'\\''` sequence (end quote → escaped quote → start quote).\n *\n * sanitize-filename removes characters that are illegal in filenames but\n * deliberately keeps `'` because it is valid on POSIX systems. Without\n * this extra step, an app named `O'Brien` would terminate the quoted path\n * inside the generated after-install / after-remove shell scripts, enabling\n * arbitrary command injection when the package is installed as root. */\n function bashSingleQuoteEscape(value: string): string {\n return value.replace(/'/g, \"'\\\\''\")\n }\n\n // Bash-script templates embed executable and sanitizedProductName inside\n // single-quoted shell paths — escape single quotes to prevent injection.\n const bashTemplateOptions = {\n // old API compatibility\n executable: bashSingleQuoteEscape(packager.executableName),\n sanitizedProductName: bashSingleQuoteEscape(packager.appInfo.sanitizedProductName),\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n // The AppArmor profile template uses these values inside double-quoted\n // AppArmor path patterns — no single-quote escaping needed or wanted.\n const appArmorTemplateOptions = {\n executable: packager.executableName,\n sanitizedProductName: packager.appInfo.sanitizedProductName,\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n function getResource(value: string | Nullish, defaultFile: string) {\n if (value == null) {\n return path.join(defaultTemplatesDir, defaultFile)\n }\n return path.resolve(packager.projectDir, value)\n }\n\n return {\n afterInstall: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterInstall, \"after-install.tpl\"), bashTemplateOptions),\n afterRemove: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterRemove, \"after-remove.tpl\"), bashTemplateOptions),\n appArmor: await writeConfigFile(packager.tempDirManager, getResource(this.options.appArmorProfile, \"apparmor-profile.tpl\"), appArmorTemplateOptions),\n }\n }\n\n checkOptions(): Promise<any> {\n return this.computeFpmMetaInfoOptions()\n }\n\n private async computeFpmMetaInfoOptions(): Promise<FpmOptions> {\n const packager = this.packager\n const projectUrl = await packager.appInfo.computePackageUrl()\n const errors: Array<string> = []\n if (projectUrl == null) {\n errors.push(\"Please specify project homepage, see https://www.electron.build/configuration#metadata\")\n }\n\n const options = this.options\n let author = options.maintainer\n if (author == null) {\n const a = packager.metadata.author\n if (a == null || a.email == null) {\n errors.push(errorMessages.authorEmailIsMissed)\n } else {\n author = `${a.name} <${a.email}>`\n }\n }\n\n if (errors.length > 0) {\n throw new Error(errors.join(\"\\n\\n\"))\n }\n\n return {\n name: options.packageName ?? this.packager.appInfo.linuxPackageName,\n maintainer: author!,\n url: projectUrl!,\n vendor: options.vendor || author!,\n }\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const target = this.name\n\n // tslint:disable:no-invalid-template-strings\n let nameFormat = \"${name}-${version}-${arch}.${ext}\"\n let isUseArchIfX64 = false\n if (target === \"deb\") {\n nameFormat = \"${name}_${version}_${arch}.${ext}\"\n isUseArchIfX64 = true\n } else if (target === \"rpm\") {\n nameFormat = \"${name}-${version}.${arch}.${ext}\"\n isUseArchIfX64 = true\n }\n\n const packager = this.packager\n const artifactName = packager.expandArtifactNamePattern(this.options, target, arch, nameFormat, !isUseArchIfX64)\n const artifactPath = path.join(this.outDir, artifactName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: target,\n file: artifactPath,\n arch,\n })\n\n await unlinkIfExists(artifactPath)\n if (packager.packagerOptions.prepackaged != null) {\n await mkdir(this.outDir, { recursive: true })\n }\n const linuxDistType = packager.packagerOptions.prepackaged || path.join(this.outDir, `linux${getArchSuffix(arch)}-unpacked`)\n const resourceDir = packager.getResourcesDir(linuxDistType)\n\n const publishConfig = this.supportsAutoUpdate(target)\n ? await getAppUpdatePublishConfiguration(packager, this.options, arch, false /* in any case validation will be done on publish step */)\n : null\n if (publishConfig != null) {\n log.info({ resourceDir: log.filePath(resourceDir) }, `adding autoupdate files for: ${target}`)\n await outputFile(path.join(resourceDir, \"app-update.yml\"), serializeToYaml(publishConfig))\n // Extra file needed for auto-updater to detect installation method\n await outputFile(path.join(resourceDir, \"package-type\"), target)\n }\n\n const scripts = await this.scriptFiles\n\n // Install AppArmor support for ubuntu 24+\n // https://github.com/electron-userland/electron-builder/issues/8635\n await copyFile(scripts.appArmor, path.join(resourceDir, \"apparmor-profile\"))\n\n const appInfo = packager.appInfo\n const options = this.options\n const synopsis = options.synopsis\n const args = [\n \"--architecture\",\n toLinuxArchString(arch, target),\n \"--after-install\",\n scripts.afterInstall,\n \"--after-remove\",\n scripts.afterRemove,\n \"--description\",\n smarten(target === \"rpm\" ? this.helper.getDescription(options) : `${synopsis || \"\"}\\n ${this.helper.getDescription(options)}`),\n \"--version\",\n this.helper.getSanitizedVersion(target),\n \"--package\",\n artifactPath,\n ]\n\n const meta = await this.computeFpmMetaInfoOptions()\n args.push(...objectToArgs({ name: meta.name, maintainer: meta.maintainer ?? null, vendor: meta.vendor, url: meta.url }))\n\n const packageCategory = options.packageCategory\n if (packageCategory != null) {\n args.push(\"--category\", packageCategory)\n }\n\n if (target === \"deb\") {\n args.push(\"--deb-priority\", (options as DebOptions).priority ?? \"optional\")\n } else if (target === \"rpm\") {\n if (synopsis != null) {\n args.push(\"--rpm-summary\", smarten(synopsis))\n }\n }\n\n const fpmConfiguration: FpmConfiguration = {\n args,\n target,\n }\n\n if (options.compression != null) {\n fpmConfiguration.compression = options.compression\n }\n\n // noinspection JSDeprecatedSymbols\n const depends = options.depends\n if (depends != null) {\n if (Array.isArray(depends)) {\n fpmConfiguration.customDepends = depends\n } else if (typeof depends === \"string\") {\n fpmConfiguration.customDepends = [depends as string]\n } else {\n throw new Error(`depends must be Array or String, but specified as: ${depends}`)\n }\n } else {\n fpmConfiguration.customDepends = this.getDefaultDepends(target)\n }\n\n if (target === \"deb\") {\n const recommends = (options as DebOptions).recommends\n if (recommends) {\n fpmConfiguration.customRecommends = asArray(recommends)\n } else {\n fpmConfiguration.customRecommends = this.getDefaultRecommends(target)\n }\n }\n\n use(packager.metadata.license, it => args.push(\"--license\", it))\n use(appInfo.buildNumber, it =>\n args.push(\n \"--iteration\",\n // dashes are not supported for iteration in older versions of fpm\n // https://github.com/jordansissel/fpm/issues/1833\n it.split(\"-\").join(\"_\")\n )\n )\n\n use(options.fpm, it => args.push(...it))\n\n args.push(`${appOutDir}/=${installPrefix}/${appInfo.sanitizedProductName}`)\n for (const icon of await this.helper.icons) {\n const extWithDot = path.extname(icon.file)\n const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n args.push(`${icon.file}=/usr/share/icons/hicolor/${sizeName}/apps/${packager.executableName}${extWithDot}`)\n }\n\n const mimeTypeFilePath = await this.helper.mimeTypeFiles\n if (mimeTypeFilePath != null) {\n args.push(`${mimeTypeFilePath}=/usr/share/mime/packages/${packager.executableName}.xml`)\n }\n\n const desktopFilePath = await this.helper.writeDesktopEntry(this.options)\n args.push(`${desktopFilePath}=/usr/share/applications/${this.helper.getDesktopFileName()}.desktop`)\n\n if (packager.packagerOptions.effectiveOptionComputed != null && (await packager.packagerOptions.effectiveOptionComputed([args, desktopFilePath]))) {\n return\n }\n\n const env = {\n ...stripSensitiveEnvVars(process.env),\n }\n\n // rpmbuild wants directory rpm with some default config files. Even if we can use dylibbundler, path to such config files are not changed (we need to replace in the binary)\n // so, for now, brew install rpm is still required.\n if (target !== \"rpm\" && (await isMacOsSierra())) {\n const linuxToolsPath = await getLinuxToolsPath(packager.config.toolsets?.linuxToolsMac, packager.buildResourcesDir)\n Object.assign(env, {\n PATH: computeEnv(process.env.PATH, [path.join(linuxToolsPath, \"bin\")]),\n DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, [path.join(linuxToolsPath, \"lib\")]),\n })\n }\n\n await this.executeFpm(target, fpmConfiguration, env)\n\n let info: ArtifactCreated = {\n file: artifactPath,\n target: this,\n arch,\n packager,\n }\n if (publishConfig != null) {\n info = {\n ...info,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, target, arch, !isUseArchIfX64),\n isWriteUpdateInfo: true,\n updateInfo: {\n sha512: await hashFile(artifactPath),\n size: (await stat(artifactPath)).size,\n },\n }\n }\n await packager.emitArtifactBuildCompleted(info)\n }\n\n private async executeFpm(target: string, fpmConfiguration: FpmConfiguration, env: any) {\n const fpmArgs = [\"-s\", \"dir\", \"--force\", \"-t\", target]\n const forceDebugLogging = isFpmDebug()\n if (forceDebugLogging) {\n fpmArgs.push(\"--debug\")\n }\n if (log.isDebugEnabled) {\n fpmArgs.push(\"--log\", \"debug\")\n }\n fpmConfiguration.customDepends?.forEach(it => fpmArgs.push(\"-d\", it))\n if (target === \"deb\") {\n fpmConfiguration.customRecommends?.forEach(it => fpmArgs.push(\"--deb-recommends\", it))\n }\n\n const defaultCompression = target === \"rpm\" ? \"xzmt\" : \"xz\"\n fpmArgs.push(...this.configureTargetSpecificOptions(target, fpmConfiguration.compression ?? defaultCompression))\n fpmArgs.push(...fpmConfiguration.args)\n\n const fpmPath = await getFpmPath(this.packager.config.toolsets?.fpm, this.packager.buildResourcesDir)\n\n await exec(fpmPath, fpmArgs, { env }).catch(e => {\n if (e.message.includes(\"Need executable 'rpmbuild' to convert dir to rpm\")) {\n const hint = \"to build rpm, executable rpmbuild is required, please install rpm package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install rpm)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install rpm)\")\n }\n }\n if (e.message.includes(\"xz: not found\")) {\n const hint = \"to build rpm, executable xz is required, please install xz package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install xz)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install xz-utils)\")\n }\n }\n if (e.message.includes(\"error: File not found\")) {\n log.error(\n { fpmArgs, ...fpmConfiguration },\n \"fpm failed to find the specified files. Please check your configuration and ensure all paths are correct. To see what files triggered this, set the environment variable FPM_DEBUG=true\"\n )\n if (forceDebugLogging) {\n log.error(null, e.message)\n }\n throw new Error(`FPM failed to find the specified files. Please check your configuration and ensure all paths are correct. Command: ${fpmPath} ${fpmArgs.join(\" \")}`)\n }\n throw e\n })\n }\n\n private supportsAutoUpdate(target: string) {\n return [\"deb\", \"rpm\", \"pacman\"].includes(target)\n }\n\n private getDefaultDepends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libgtk-3-0\", \"libnotify4\", \"libnss3\", \"libxss1\", \"libxtst6\", \"xdg-utils\", \"libatspi2.0-0\", \"libuuid1\", \"libsecret-1-0\"]\n\n case \"rpm\":\n return [\n \"gtk3\" /* for electron 2+ (electron 1 uses gtk2, but this old version is not supported anymore) */,\n \"libnotify\",\n \"nss\",\n \"libXScrnSaver\",\n \"(libXtst or libXtst6)\",\n \"xdg-utils\",\n \"at-spi2-core\" /* since 5.0.0 */,\n \"(libuuid or libuuid1)\" /* since 4.0.0 */,\n ]\n\n case \"pacman\":\n return [\"c-ares\", \"ffmpeg\", \"gtk3\", \"http-parser\", \"libevent\", \"libvpx\", \"libxslt\", \"libxss\", \"minizip\", \"nss\", \"re2\", \"snappy\", \"libnotify\", \"libappindicator-gtk3\"]\n\n default:\n return []\n }\n }\n\n private getDefaultRecommends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libappindicator3-1\"]\n default:\n return []\n }\n }\n\n private configureTargetSpecificOptions(target: string, compression: string): string[] {\n switch (target) {\n case \"rpm\":\n return [\"--rpm-os\", \"linux\", \"--rpm-compression\", compression === \"xz\" ? \"xzmt\" : compression]\n case \"deb\":\n return [\"--deb-compression\", compression]\n case \"pacman\":\n return [\"--pacman-compression\", compression]\n }\n return []\n }\n}\n\ninterface FpmConfiguration {\n target: string\n args: Array<string>\n customDepends?: Array<string>\n customRecommends?: Array<string>\n compression?: LinuxTargetSpecificOptions[\"compression\"]\n}\n\nasync function writeConfigFile(tmpDir: TmpDir, templatePath: string, options: any): Promise<string> {\n //noinspection JSUnusedLocalSymbols\n function replacer(match: string, p1: string) {\n if (p1 in options) {\n return options[p1]\n } else {\n throw new Error(`Macro ${p1} is not defined`)\n }\n }\n const config = (await readFile(templatePath, \"utf8\")).replace(/\\${([a-zA-Z]+)}/g, replacer)\n\n const outputPath = await tmpDir.getTempFile({ suffix: path.basename(templatePath, \".tpl\") })\n await outputFile(outputPath, config)\n return outputPath\n}\n"]}
1
+ {"version":3,"file":"FpmTarget.js","sourceRoot":"","sources":["../../../src/targets/linux/FpmTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, asArray, exec, getArchSuffix, log, stripSensitiveEnvVars, TmpDir, toLinuxArchString, unlinkIfExists, use } from \"builder-util\"\nimport { Nullish } from \"builder-util-runtime\"\n\nimport { objectToArgs } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport { chmod, mkdir, readFile } from \"fs/promises\"\nimport * as path from \"path\"\nimport { smarten } from \"../../appInfo.js\"\nimport { Target } from \"../../core.js\"\nimport * as errorMessages from \"../../errorMessages.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { DebOptions, LinuxTargetSpecificOptions } from \"../../options/linuxOptions.js\"\nimport { ArtifactCreated } from \"../../packagerApi.js\"\nimport { getAppUpdatePublishConfiguration, writeAppUpdateYaml } from \"../../publish/PublishManager.js\"\nimport { getFpmPath } from \"../../toolsets/fpm.js\"\nimport { getLinuxToolsPath } from \"../../toolsets/linuxToolsMac.js\"\nimport { computeEnv } from \"../../util/bundledTool.js\"\nimport { isFpmDebug } from \"../../util/flags.js\"\nimport { hashFile } from \"../../util/hash.js\"\nimport { isMacOsSierra } from \"../../util/mac/macosVersion.js\"\nimport { getTemplatePath } from \"../../util/pathManager.js\"\nimport { buildLauncherScript, shellQuote } from \"./launcherScript.js\"\nimport { installPrefix, LinuxTargetHelper, quoteDesktopExecPath } from \"./LinuxTargetHelper.js\"\nconst { copyFile, outputFile, stat } = _fsExtra\n\ninterface FpmOptions {\n name: string\n maintainer: string | undefined\n vendor: string\n url: string\n}\n\ninterface ScriptFiles {\n afterRemove: string\n afterInstall: string\n appArmor: string\n}\n\nexport default class FpmTarget extends Target {\n readonly options: LinuxTargetSpecificOptions = this.packager.getOptionsForTarget<LinuxTargetSpecificOptions>(this.name)\n\n private readonly scriptFiles: Promise<ScriptFiles>\n\n constructor(\n name: string,\n private readonly packager: LinuxPackager,\n private readonly helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name, false)\n\n this.scriptFiles = this.createScripts()\n }\n\n private async createScripts(): Promise<ScriptFiles> {\n const defaultTemplatesDir = getTemplatePath(\"linux\")\n\n const packager = this.packager\n\n /** Escape a string value for safe interpolation inside a bash single-quoted\n * string (`'...'`). The only character that can break out of a POSIX\n * single-quoted context is a literal single-quote; we replace it with the\n * standard `'\\''` sequence (end quote → escaped quote → start quote).\n *\n * sanitize-filename removes characters that are illegal in filenames but\n * deliberately keeps `'` because it is valid on POSIX systems. Without\n * this extra step, an app named `O'Brien` would terminate the quoted path\n * inside the generated after-install / after-remove shell scripts, enabling\n * arbitrary command injection when the package is installed as root. */\n function bashSingleQuoteEscape(value: string): string {\n return value.replace(/'/g, \"'\\\\''\")\n }\n\n // Bash-script templates embed executable and sanitizedProductName inside\n // single-quoted shell paths — escape single quotes to prevent injection.\n const bashTemplateOptions = {\n // old API compatibility\n executable: bashSingleQuoteEscape(packager.executableName),\n sanitizedProductName: bashSingleQuoteEscape(packager.appInfo.sanitizedProductName),\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n // The AppArmor profile template uses these values inside double-quoted\n // AppArmor path patterns — no single-quote escaping needed or wanted.\n const appArmorTemplateOptions = {\n executable: packager.executableName,\n sanitizedProductName: packager.appInfo.sanitizedProductName,\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n function getResource(value: string | Nullish, defaultFile: string) {\n if (value == null) {\n return path.join(defaultTemplatesDir, defaultFile)\n }\n return path.resolve(packager.projectDir, value)\n }\n\n return {\n afterInstall: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterInstall, \"after-install.tpl\"), bashTemplateOptions),\n afterRemove: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterRemove, \"after-remove.tpl\"), bashTemplateOptions),\n appArmor: await writeConfigFile(packager.tempDirManager, getResource(this.options.appArmorProfile, \"apparmor-profile.tpl\"), appArmorTemplateOptions),\n }\n }\n\n checkOptions(): Promise<any> {\n return this.computeFpmMetaInfoOptions()\n }\n\n private async computeFpmMetaInfoOptions(): Promise<FpmOptions> {\n const packager = this.packager\n const projectUrl = await packager.appInfo.computePackageUrl()\n const errors: Array<string> = []\n if (projectUrl == null) {\n errors.push(\"Please specify project homepage, see https://www.electron.build/configuration#metadata\")\n }\n\n const options = this.options\n let author = options.maintainer\n if (author == null) {\n const a = packager.metadata.author\n if (a == null || a.email == null) {\n errors.push(errorMessages.authorEmailIsMissed)\n } else {\n author = `${a.name} <${a.email}>`\n }\n }\n\n if (errors.length > 0) {\n throw new Error(errors.join(\"\\n\\n\"))\n }\n\n return {\n name: options.packageName ?? this.packager.appInfo.linuxPackageName,\n maintainer: author!,\n url: projectUrl!,\n vendor: options.vendor || author!,\n }\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const target = this.name\n\n // tslint:disable:no-invalid-template-strings\n let nameFormat = \"${name}-${version}-${arch}.${ext}\"\n let isUseArchIfX64 = false\n if (target === \"deb\") {\n nameFormat = \"${name}_${version}_${arch}.${ext}\"\n isUseArchIfX64 = true\n } else if (target === \"rpm\") {\n nameFormat = \"${name}-${version}.${arch}.${ext}\"\n isUseArchIfX64 = true\n }\n\n const packager = this.packager\n const artifactName = packager.expandArtifactNamePattern(this.options, target, arch, nameFormat, !isUseArchIfX64)\n const artifactPath = path.join(this.outDir, artifactName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: target,\n file: artifactPath,\n arch,\n })\n\n await unlinkIfExists(artifactPath)\n if (packager.packagerOptions.prepackaged != null) {\n await mkdir(this.outDir, { recursive: true })\n }\n const linuxDistType = packager.packagerOptions.prepackaged || path.join(this.outDir, `linux${getArchSuffix(arch)}-unpacked`)\n const resourceDir = packager.getResourcesDir(linuxDistType)\n\n const publishConfig = this.supportsAutoUpdate(target)\n ? await getAppUpdatePublishConfiguration(packager, this.options, arch, false /* in any case validation will be done on publish step */)\n : null\n if (publishConfig != null) {\n log.info({ resourceDir: log.filePath(resourceDir) }, `adding autoupdate files for: ${target}`)\n await writeAppUpdateYaml(resourceDir, publishConfig)\n // Extra file needed for auto-updater to detect installation method\n await outputFile(path.join(resourceDir, \"package-type\"), target)\n }\n\n const scripts = await this.scriptFiles\n\n // Install AppArmor support for ubuntu 24+\n // https://github.com/electron-userland/electron-builder/issues/8635\n await copyFile(scripts.appArmor, path.join(resourceDir, \"apparmor-profile\"))\n\n const appInfo = packager.appInfo\n const options = this.options\n const synopsis = options.synopsis\n const args = [\n \"--architecture\",\n toLinuxArchString(arch, target),\n \"--after-install\",\n scripts.afterInstall,\n \"--after-remove\",\n scripts.afterRemove,\n \"--description\",\n smarten(target === \"rpm\" ? this.helper.getDescription(options) : `${synopsis || \"\"}\\n ${this.helper.getDescription(options)}`),\n \"--version\",\n this.helper.getSanitizedVersion(target),\n \"--package\",\n artifactPath,\n ]\n\n const meta = await this.computeFpmMetaInfoOptions()\n args.push(...objectToArgs({ name: meta.name, maintainer: meta.maintainer ?? null, vendor: meta.vendor, url: meta.url }))\n\n const packageCategory = options.packageCategory\n if (packageCategory != null) {\n args.push(\"--category\", packageCategory)\n }\n\n if (target === \"deb\") {\n args.push(\"--deb-priority\", (options as DebOptions).priority ?? \"optional\")\n } else if (target === \"rpm\") {\n if (synopsis != null) {\n args.push(\"--rpm-summary\", smarten(synopsis))\n }\n }\n\n const fpmConfiguration: FpmConfiguration = {\n args,\n target,\n }\n\n if (options.compression != null) {\n fpmConfiguration.compression = options.compression\n }\n\n // noinspection JSDeprecatedSymbols\n const depends = options.depends\n if (depends != null) {\n if (Array.isArray(depends)) {\n fpmConfiguration.customDepends = depends\n } else if (typeof depends === \"string\") {\n fpmConfiguration.customDepends = [depends as string]\n } else {\n throw new Error(`depends must be Array or String, but specified as: ${depends}`)\n }\n } else {\n fpmConfiguration.customDepends = this.getDefaultDepends(target)\n }\n\n if (target === \"deb\") {\n const recommends = (options as DebOptions).recommends\n if (recommends) {\n fpmConfiguration.customRecommends = asArray(recommends)\n } else {\n fpmConfiguration.customRecommends = this.getDefaultRecommends(target)\n }\n }\n\n use(packager.metadata.license, it => args.push(\"--license\", it))\n use(appInfo.buildNumber, it =>\n args.push(\n \"--iteration\",\n // dashes are not supported for iteration in older versions of fpm\n // https://github.com/jordansissel/fpm/issues/1833\n it.split(\"-\").join(\"_\")\n )\n )\n\n use(options.fpm, it => args.push(...it))\n\n args.push(`${appOutDir}/=${installPrefix}/${appInfo.sanitizedProductName}`)\n for (const icon of await this.helper.icons) {\n const extWithDot = path.extname(icon.file)\n const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n args.push(`${icon.file}=/usr/share/icons/hicolor/${sizeName}/apps/${packager.executableName}${extWithDot}`)\n }\n\n const mimeTypeFilePath = await this.helper.mimeTypeFiles\n if (mimeTypeFilePath != null) {\n args.push(`${mimeTypeFilePath}=/usr/share/mime/packages/${packager.executableName}.xml`)\n }\n\n // Launch through a launcher entrypoint so executableArgs are injected in one place and the\n // .desktop Exec key stays a plain command path (consistent with the other Linux targets).\n const launcher = await this.createLauncherScript()\n args.push(`${launcher.tempPath}=${launcher.installPath}`)\n\n const desktopFilePath = await this.helper.writeDesktopEntry(this.options, `${quoteDesktopExecPath(launcher.installPath)} %U`)\n args.push(`${desktopFilePath}=/usr/share/applications/${this.helper.getDesktopFileName()}.desktop`)\n\n if (packager.packagerOptions.effectiveOptionComputed != null && (await packager.packagerOptions.effectiveOptionComputed([args, desktopFilePath]))) {\n return\n }\n\n const env = {\n ...stripSensitiveEnvVars(process.env),\n }\n\n // rpmbuild wants directory rpm with some default config files. Even if we can use dylibbundler, path to such config files are not changed (we need to replace in the binary)\n // so, for now, brew install rpm is still required.\n if (target !== \"rpm\" && (await isMacOsSierra())) {\n const linuxToolsPath = await getLinuxToolsPath(packager.config.toolsets?.linuxToolsMac, packager.buildResourcesDir)\n Object.assign(env, {\n PATH: computeEnv(process.env.PATH, [path.join(linuxToolsPath, \"bin\")]),\n DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, [path.join(linuxToolsPath, \"lib\")]),\n })\n }\n\n await this.executeFpm(target, fpmConfiguration, env)\n\n let info: ArtifactCreated = {\n file: artifactPath,\n target: this,\n arch,\n packager,\n }\n if (publishConfig != null) {\n info = {\n ...info,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, target, arch, !isUseArchIfX64),\n isWriteUpdateInfo: true,\n updateInfo: {\n sha512: await hashFile(artifactPath),\n size: (await stat(artifactPath)).size,\n },\n }\n }\n await packager.emitArtifactBuildCompleted(info)\n }\n\n /**\n * Generate the launcher entrypoint script installed alongside the app binary. The launcher execs\n * the real binary with the configured `executableArgs` (single-quoted) and forwards `\"$@\"` so the\n * desktop launcher's field-code expansions (e.g. opened files/URLs) still reach the app.\n */\n private async createLauncherScript(): Promise<{ installPath: string; tempPath: string }> {\n const { appInfo, executableName } = this.packager\n const appDir = `${installPrefix}/${appInfo.sanitizedProductName}`\n // The launcher path is fully resolved (no shell variables to expand), so single-quote the whole\n // token. This passes any embedded character literally and avoids restricting otherwise-valid\n // executable/product names (e.g. those containing `$` or backtick).\n const content = buildLauncherScript({ command: [shellQuote(`${appDir}/${executableName}`)], args: this.options.executableArgs ?? [] })\n\n const tempPath = await this.packager.tempDirManager.getTempFile({ suffix: \"-launcher.sh\" })\n await outputFile(tempPath, content, { mode: 0o755 })\n await chmod(tempPath, 0o755)\n return { installPath: `${appDir}/${executableName}-launcher`, tempPath }\n }\n\n private async executeFpm(target: string, fpmConfiguration: FpmConfiguration, env: any) {\n const fpmArgs = [\"-s\", \"dir\", \"--force\", \"-t\", target]\n const forceDebugLogging = isFpmDebug()\n if (forceDebugLogging) {\n fpmArgs.push(\"--debug\")\n }\n if (log.isDebugEnabled) {\n fpmArgs.push(\"--log\", \"debug\")\n }\n fpmConfiguration.customDepends?.forEach(it => fpmArgs.push(\"-d\", it))\n if (target === \"deb\") {\n fpmConfiguration.customRecommends?.forEach(it => fpmArgs.push(\"--deb-recommends\", it))\n }\n\n const defaultCompression = target === \"rpm\" ? \"xzmt\" : \"xz\"\n fpmArgs.push(...this.configureTargetSpecificOptions(target, fpmConfiguration.compression ?? defaultCompression))\n fpmArgs.push(...fpmConfiguration.args)\n\n const fpmPath = await getFpmPath(this.packager.config.toolsets?.fpm, this.packager.buildResourcesDir)\n\n await exec(fpmPath, fpmArgs, { env }).catch(e => {\n if (e.message.includes(\"Need executable 'rpmbuild' to convert dir to rpm\")) {\n const hint = \"to build rpm, executable rpmbuild is required, please install rpm package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install rpm)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install rpm)\")\n }\n }\n if (e.message.includes(\"xz: not found\")) {\n const hint = \"to build rpm, executable xz is required, please install xz package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install xz)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install xz-utils)\")\n }\n }\n if (e.message.includes(\"error: File not found\")) {\n log.error(\n { fpmArgs, ...fpmConfiguration },\n \"fpm failed to find the specified files. Please check your configuration and ensure all paths are correct. To see what files triggered this, set the environment variable FPM_DEBUG=true\"\n )\n if (forceDebugLogging) {\n log.error(null, e.message)\n }\n throw new Error(`FPM failed to find the specified files. Please check your configuration and ensure all paths are correct. Command: ${fpmPath} ${fpmArgs.join(\" \")}`)\n }\n throw e\n })\n }\n\n private supportsAutoUpdate(target: string) {\n return [\"deb\", \"rpm\", \"pacman\"].includes(target)\n }\n\n private getDefaultDepends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libgtk-3-0\", \"libnotify4\", \"libnss3\", \"libxss1\", \"libxtst6\", \"xdg-utils\", \"libatspi2.0-0\", \"libuuid1\", \"libsecret-1-0\"]\n\n case \"rpm\":\n return [\n \"gtk3\" /* for electron 2+ (electron 1 uses gtk2, but this old version is not supported anymore) */,\n \"libnotify\",\n \"nss\",\n \"libXScrnSaver\",\n \"(libXtst or libXtst6)\",\n \"xdg-utils\",\n \"at-spi2-core\" /* since 5.0.0 */,\n \"(libuuid or libuuid1)\" /* since 4.0.0 */,\n ]\n\n case \"pacman\":\n return [\"c-ares\", \"ffmpeg\", \"gtk3\", \"http-parser\", \"libevent\", \"libvpx\", \"libxslt\", \"libxss\", \"minizip\", \"nss\", \"re2\", \"snappy\", \"libnotify\", \"libappindicator-gtk3\"]\n\n default:\n return []\n }\n }\n\n private getDefaultRecommends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libappindicator3-1\"]\n default:\n return []\n }\n }\n\n private configureTargetSpecificOptions(target: string, compression: string): string[] {\n switch (target) {\n case \"rpm\":\n return [\"--rpm-os\", \"linux\", \"--rpm-compression\", compression === \"xz\" ? \"xzmt\" : compression]\n case \"deb\":\n return [\"--deb-compression\", compression]\n case \"pacman\":\n return [\"--pacman-compression\", compression]\n }\n return []\n }\n}\n\ninterface FpmConfiguration {\n target: string\n args: Array<string>\n customDepends?: Array<string>\n customRecommends?: Array<string>\n compression?: LinuxTargetSpecificOptions[\"compression\"]\n}\n\nasync function writeConfigFile(tmpDir: TmpDir, templatePath: string, options: any): Promise<string> {\n //noinspection JSUnusedLocalSymbols\n function replacer(match: string, p1: string) {\n if (p1 in options) {\n return options[p1]\n } else {\n throw new Error(`Macro ${p1} is not defined`)\n }\n }\n const config = (await readFile(templatePath, \"utf8\")).replace(/\\${([a-zA-Z]+)}/g, replacer)\n\n const outputPath = await tmpDir.getTempFile({ suffix: path.basename(templatePath, \".tpl\") })\n await outputFile(outputPath, config)\n return outputPath\n}\n"]}
@@ -2,6 +2,18 @@ import { LinuxPackager } from "../../linuxPackager.js";
2
2
  import { CommonLinuxOptions } from "../../options/linuxOptions.js";
3
3
  import { SnapCore } from "./snap/SnapTarget.js";
4
4
  import { IconInfo } from "../../util/iconConverter.js";
5
+ /**
6
+ * Quote a command / path token for the freedesktop Exec key.
7
+ *
8
+ * Every Linux target launches through a launcher entrypoint, so the Exec key only ever holds a
9
+ * single command (the launcher path) plus field codes — never user-supplied `executableArgs`.
10
+ * Plain paths made up of portable characters are emitted as-is; anything else is wrapped in
11
+ * double quotes. The spec requires the reserved characters `"`, backtick, `$` and `\` to be
12
+ * backslash-escaped inside the quotes, so they are escaped here to keep the Exec token valid.
13
+ *
14
+ * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables
15
+ */
16
+ export declare function quoteDesktopExecPath(value: string): string;
5
17
  export declare const installPrefix = "/opt";
6
18
  export declare class LinuxTargetHelper {
7
19
  private packager;
@@ -18,6 +30,8 @@ export declare class LinuxTargetHelper {
18
30
  getDescription(options: CommonLinuxOptions): string;
19
31
  getSanitizedVersion(target: string): string;
20
32
  writeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, destination?: string | null, extra?: Record<string, string>): Promise<string>;
33
+ private desktopNameWarningEmitted;
34
+ private resolveDesktopName;
21
35
  getDesktopFileName(fallback?: string): string;
22
36
  computeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, extra?: Record<string, string>): Promise<string>;
23
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LinuxTargetHelper.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/LinuxTargetHelper.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAI/C,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAuEtD,eAAO,MAAM,aAAa,SAAS,CAAA;AAEnC,qBAAa,iBAAiB;IAOhB,OAAO,CAAC,QAAQ;IAN5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6C;IAEzE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8C;IAEnF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAO;gBAEb,QAAQ,EAAE,aAAa;IAE3C,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAEpC;IAED,IAAI,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE1C;IAED,WAAW,IAAI,QAAQ,CAAC,GAAG,CAAC;IAyC5B,mCAAmC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;YAQlE,oBAAoB;YA4BpB,mBAAmB;IAsBjC,cAAc,CAAC,OAAO,EAAE,kBAAkB;IAI1C,mBAAmB,CAAC,MAAM,EAAE,MAAM;IAe5B,iBAAiB,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAO/J,kBAAkB,CAAC,QAAQ,GAAE,MAAqC,GAAG,MAAM;IAiB3E,mBAAmB,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAqI/H"}
1
+ {"version":3,"file":"LinuxTargetHelper.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/LinuxTargetHelper.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAI/C,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAyBtD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK1D;AAYD,eAAO,MAAM,aAAa,SAAS,CAAA;AAEnC,qBAAa,iBAAiB;IAOhB,OAAO,CAAC,QAAQ;IAN5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6C;IAEzE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8C;IAEnF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAO;gBAEb,QAAQ,EAAE,aAAa;IAE3C,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAEpC;IAED,IAAI,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE1C;IAED,WAAW,IAAI,QAAQ,CAAC,GAAG,CAAC;IAyC5B,mCAAmC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;YAQlE,oBAAoB;YA4BpB,mBAAmB;IAsBjC,cAAc,CAAC,OAAO,EAAE,kBAAkB;IAI1C,mBAAmB,CAAC,MAAM,EAAE,MAAM;IAe5B,iBAAiB,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAS/J,OAAO,CAAC,yBAAyB,CAAQ;IAQzC,OAAO,CAAC,kBAAkB;IAwB1B,kBAAkB,CAAC,QAAQ,GAAE,MAAqC,GAAG,MAAM;IAI3E,mBAAmB,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CA8G/H"}
@@ -29,38 +29,21 @@ function desktopStringEscape(value) {
29
29
  return value.replace(/\\/g, "\\\\").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t");
30
30
  }
31
31
  /**
32
- * Characters that require an Exec argument to be double-quoted per the
33
- * freedesktop Desktop Entry Specification. Plain alphanumeric args and
34
- * field codes must NOT be wrapped in quotes.
32
+ * Quote a command / path token for the freedesktop Exec key.
35
33
  *
36
- * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables
37
- */
38
- const EXEC_RESERVED_RE = /[\s"'`\\<>~|&;$*?#()]/;
39
- /**
40
- * Quote a single argument for use in a .desktop file Exec key.
41
- *
42
- * Field codes (`%f`, `%u`, `%F`, `%U`, etc.) MUST be left unquoted — the
43
- * desktop launcher only expands them in unquoted token positions. Wrapping
44
- * them in `"…"` causes the launcher to treat them as literal strings, which
45
- * breaks file-association / drag-and-drop functionality.
46
- *
47
- * For all other arguments, double-quoting is used when the argument contains
48
- * any character that would be misinterpreted by the launcher without quoting
49
- * (spaces, shell metacharacters, etc.). Safe plain-word args are passed
50
- * through unchanged to keep the Exec line readable.
34
+ * Every Linux target launches through a launcher entrypoint, so the Exec key only ever holds a
35
+ * single command (the launcher path) plus field codes — never user-supplied `executableArgs`.
36
+ * Plain paths made up of portable characters are emitted as-is; anything else is wrapped in
37
+ * double quotes. The spec requires the reserved characters `"`, backtick, `$` and `\` to be
38
+ * backslash-escaped inside the quotes, so they are escaped here to keep the Exec token valid.
51
39
  *
52
40
  * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables
53
41
  */
54
- function desktopExecArgEscape(arg) {
55
- // Field codes (%f, %u, %F, %U, %i, %c, %k, …) must never be quoted.
56
- if (/^%[a-zA-Z]$/.test(arg)) {
57
- return arg;
42
+ export function quoteDesktopExecPath(value) {
43
+ if (/^[/0-9A-Za-z._-]+$/.test(value)) {
44
+ return value;
58
45
  }
59
- // Only quote when the arg actually contains characters that need it.
60
- if (EXEC_RESERVED_RE.test(arg)) {
61
- return `"${arg.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
62
- }
63
- return arg;
46
+ return '"' + value.replace(/["$`\\]/g, "\\$&") + '"';
64
47
  }
65
48
  function mapLinuxCompressionToSnap(level) {
66
49
  if (level === "store") {
@@ -78,6 +61,9 @@ export class LinuxTargetHelper {
78
61
  this.iconPromise = new Lazy(() => this.computeDesktopIcons());
79
62
  this.mimeTypeFilesPromise = new Lazy(() => this.computeMimeTypeFiles());
80
63
  this.maxIconPath = null;
64
+ // Emit the "desktopName not set" warning at most once per build, even though both
65
+ // getDesktopFileName() and computeDesktopEntry() resolve the desktop name.
66
+ this.desktopNameWarningEmitted = false;
81
67
  }
82
68
  get icons() {
83
69
  return this.iconPromise.value;
@@ -189,13 +175,23 @@ export class LinuxTargetHelper {
189
175
  await outputFile(file, data);
190
176
  return file;
191
177
  }
192
- getDesktopFileName(fallback = this.packager.executableName) {
193
- if (!this.packager.platformOptions.syncDesktopName) {
194
- return fallback;
195
- }
178
+ // https://github.com/electron-userland/electron-builder/issues/9103
179
+ // Electron derives app_id / WM_CLASS from desktopName in package.json; the installed
180
+ // .desktop filename and StartupWMClass must match it for window association to work.
181
+ // https://github.com/electron/electron/blob/9a7b73b5334f1d72c08e2d5e94106706ed751186/lib/browser/init.ts#L128-L133
182
+ // Returns the validated base name (desktopName minus the .desktop suffix), or null when
183
+ // desktopName is unset — callers apply their own fallback (filename vs WM_CLASS).
184
+ resolveDesktopName() {
196
185
  const trimmedDesktopName = this.packager.metadata.desktopName?.trim();
197
186
  if (isEmptyOrSpaces(trimmedDesktopName)) {
198
- return fallback;
187
+ if (!this.desktopNameWarningEmitted) {
188
+ this.desktopNameWarningEmitted = true;
189
+ log.warn({
190
+ reason: "desktopName is not set in package.json",
191
+ docs: "https://www.electron.build/docs/linux/#window-association-desktopname",
192
+ }, 'Electron derives the app_id / WM_CLASS used for Linux window association from desktopName. Without it, desktop environments may not link the running window to its launcher entry (taskbar grouping, dock icon, etc.). Set desktopName to a reverse-DNS identifier in package.json, e.g. "com.myapp.MyApp".');
193
+ }
194
+ return null;
199
195
  }
200
196
  const basename = trimmedDesktopName.replace(/\.desktop$/, "");
201
197
  // Guard against path traversal: desktopName flows into filesystem paths
@@ -205,6 +201,9 @@ export class LinuxTargetHelper {
205
201
  }
206
202
  return basename;
207
203
  }
204
+ getDesktopFileName(fallback = this.packager.executableName) {
205
+ return this.resolveDesktopName() ?? fallback;
206
+ }
208
207
  computeDesktopEntry(targetSpecificOptions, exec, extra) {
209
208
  if (exec != null && exec.length === 0) {
210
209
  throw new Error("Specified exec is empty");
@@ -215,35 +214,15 @@ export class LinuxTargetHelper {
215
214
  }
216
215
  const packager = this.packager;
217
216
  const appInfo = packager.appInfo;
218
- const executableArgs = targetSpecificOptions.executableArgs;
219
217
  if (exec == null) {
220
- exec = `${installPrefix}/${appInfo.sanitizedProductName}/${packager.executableName}`;
221
- if (!/^[/0-9A-Za-z._-]+$/.test(exec)) {
222
- exec = `"${exec}"`;
223
- }
224
- if (executableArgs) {
225
- exec += " ";
226
- // Each arg is double-quoted per the freedesktop Exec key spec so that
227
- // spaces, $, ;, & and other reserved characters are not misinterpreted.
228
- exec += executableArgs.map(desktopExecArgEscape).join(" ");
229
- }
230
- // https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables
231
- const execCodes = ["%f", "%u", "%F", "%U"];
232
- if (executableArgs == null || executableArgs.findIndex(arg => execCodes.includes(arg)) === -1) {
233
- exec += " %U";
234
- }
235
- }
236
- // https://github.com/electron-userland/electron-builder/issues/9103
237
- // Electron derives app_id from desktopName in package.json; StartupWMClass must match.
238
- // https://github.com/electron/electron/blob/9a7b73b5334f1d72c08e2d5e94106706ed751186/lib/browser/init.ts#L128-L133
239
- const trimmedDesktopName = packager.metadata.desktopName?.trim();
240
- if (isEmptyOrSpaces(trimmedDesktopName)) {
241
- log.warn({
242
- reason: "desktopName is not set in package.json",
243
- docs: "https://www.electron.build/linux#window-association-desktopname--syncdesktopname",
244
- }, "electron uses desktopName as app_id / WM_CLASS for window association. Without it desktop environments may not link running windows to this .desktop entry. Set desktopName in package.json and linux.syncDesktopName: true to fix.");
218
+ // Fallback only — targets pass an explicit launcher entrypoint as `exec`. `executableArgs`
219
+ // are injected into that launcher, never into the Exec key (see launcherScript.ts).
220
+ exec = `${quoteDesktopExecPath(`${installPrefix}/${appInfo.sanitizedProductName}/${packager.executableName}`)} %U`;
245
221
  }
246
- const wmClass = !isEmptyOrSpaces(trimmedDesktopName) ? trimmedDesktopName.replace(/\.desktop$/, "") : appInfo.productName;
222
+ // StartupWMClass must match Electron's app_id (derived from desktopName) for window
223
+ // association; resolveDesktopName() handles the shared warning and validation.
224
+ // Falls back to productName for apps that don't set desktopName.
225
+ const wmClass = this.resolveDesktopName() ?? appInfo.productName;
247
226
  const desktopMeta = deepAssign({
248
227
  // String values are escaped per the freedesktop spec (\\, \n, \r, \t)
249
228
  // so that a product name containing a newline cannot inject new key=value