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
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Shared launcher-entrypoint helpers for the Linux targets.
3
+ *
4
+ * Every Linux target (deb/rpm, AppImage, snap, flatpak) launches the app through a generated
5
+ * launcher script rather than inlining `executableArgs` into the freedesktop `.desktop` Exec key.
6
+ * Routing through a launcher keeps the Exec key a plain command (no fragile freedesktop quoting),
7
+ * injects the arguments in a single, consistent place, and lets `"$@"` forward the launch-time
8
+ * arguments (desktop field-code expansions) on to the app.
9
+ */
10
+ /** Single-quote a shell argument, escaping any embedded single quotes. */
11
+ export declare function shellQuote(arg: string): string;
12
+ export interface LauncherScriptOptions {
13
+ /**
14
+ * The already-safe exec target tokens, joined with a space to form the start of the `exec` line
15
+ * (e.g. `['"$SNAP/app/foo"']` or `['zypak-wrapper', '"foo"']`). Callers are responsible for
16
+ * quoting these tokens — they are emitted verbatim so that shell variables such as `$SNAP`
17
+ * remain expandable.
18
+ */
19
+ command: ReadonlyArray<string>;
20
+ /** User/derived arguments. Each is single-quoted so embedded characters are passed literally. */
21
+ args?: ReadonlyArray<string>;
22
+ /** Shebang line. Defaults to `#!/bin/sh`. */
23
+ shebang?: string;
24
+ /** Optional lines inserted between the shebang and the `exec` line (e.g. `export` statements). */
25
+ preamble?: string;
26
+ }
27
+ /**
28
+ * Build a launcher entrypoint script that execs `command` with `args` (single-quoted) and always
29
+ * forwards `"$@"`.
30
+ */
31
+ export declare function buildLauncherScript(opts: LauncherScriptOptions): string;
32
+ //# sourceMappingURL=launcherScript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcherScript.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/launcherScript.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC9B,iGAAiG;IACjG,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kGAAkG;IAClG,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAKvE"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Shared launcher-entrypoint helpers for the Linux targets.
3
+ *
4
+ * Every Linux target (deb/rpm, AppImage, snap, flatpak) launches the app through a generated
5
+ * launcher script rather than inlining `executableArgs` into the freedesktop `.desktop` Exec key.
6
+ * Routing through a launcher keeps the Exec key a plain command (no fragile freedesktop quoting),
7
+ * injects the arguments in a single, consistent place, and lets `"$@"` forward the launch-time
8
+ * arguments (desktop field-code expansions) on to the app.
9
+ */
10
+ /** Single-quote a shell argument, escaping any embedded single quotes. */
11
+ export function shellQuote(arg) {
12
+ return "'" + arg.replace(/'/g, "'\\''") + "'";
13
+ }
14
+ /**
15
+ * Build a launcher entrypoint script that execs `command` with `args` (single-quoted) and always
16
+ * forwards `"$@"`.
17
+ */
18
+ export function buildLauncherScript(opts) {
19
+ const shebang = opts.shebang ?? "#!/bin/sh";
20
+ const argsPart = opts.args && opts.args.length > 0 ? " " + opts.args.map(shellQuote).join(" ") : "";
21
+ const preamble = opts.preamble ? `\n${opts.preamble}\n` : "\n";
22
+ return `${shebang}${preamble}exec ${opts.command.join(" ")}${argsPart} "$@"\n`;
23
+ }
24
+ //# sourceMappingURL=launcherScript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcherScript.js","sourceRoot":"","sources":["../../../src/targets/linux/launcherScript.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,0EAA0E;AAC1E,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,GAAG,CAAA;AAC/C,CAAC;AAkBD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA2B;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,WAAW,CAAA;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACnG,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IAC9D,OAAO,GAAG,OAAO,GAAG,QAAQ,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,SAAS,CAAA;AAChF,CAAC","sourcesContent":["/**\n * Shared launcher-entrypoint helpers for the Linux targets.\n *\n * Every Linux target (deb/rpm, AppImage, snap, flatpak) launches the app through a generated\n * launcher script rather than inlining `executableArgs` into the freedesktop `.desktop` Exec key.\n * Routing through a launcher keeps the Exec key a plain command (no fragile freedesktop quoting),\n * injects the arguments in a single, consistent place, and lets `\"$@\"` forward the launch-time\n * arguments (desktop field-code expansions) on to the app.\n */\n\n/** Single-quote a shell argument, escaping any embedded single quotes. */\nexport function shellQuote(arg: string): string {\n return \"'\" + arg.replace(/'/g, \"'\\\\''\") + \"'\"\n}\n\nexport interface LauncherScriptOptions {\n /**\n * The already-safe exec target tokens, joined with a space to form the start of the `exec` line\n * (e.g. `['\"$SNAP/app/foo\"']` or `['zypak-wrapper', '\"foo\"']`). Callers are responsible for\n * quoting these tokens — they are emitted verbatim so that shell variables such as `$SNAP`\n * remain expandable.\n */\n command: ReadonlyArray<string>\n /** User/derived arguments. Each is single-quoted so embedded characters are passed literally. */\n args?: ReadonlyArray<string>\n /** Shebang line. Defaults to `#!/bin/sh`. */\n shebang?: string\n /** Optional lines inserted between the shebang and the `exec` line (e.g. `export` statements). */\n preamble?: string\n}\n\n/**\n * Build a launcher entrypoint script that execs `command` with `args` (single-quoted) and always\n * forwards `\"$@\"`.\n */\nexport function buildLauncherScript(opts: LauncherScriptOptions): string {\n const shebang = opts.shebang ?? \"#!/bin/sh\"\n const argsPart = opts.args && opts.args.length > 0 ? \" \" + opts.args.map(shellQuote).join(\" \") : \"\"\n const preamble = opts.preamble ? `\\n${opts.preamble}\\n` : \"\\n\"\n return `${shebang}${preamble}exec ${opts.command.join(\" \")}${argsPart} \"$@\"\\n`\n}\n"]}
@@ -20,7 +20,7 @@ export declare abstract class SnapCore<T> {
20
20
  stageDir: string;
21
21
  snapArch: Arch;
22
22
  artifactPath: string;
23
- }): Promise<void>;
23
+ }): Promise<string[]>;
24
24
  }
25
25
  /** Snap build target — reads `snapcraft` config and delegates to the appropriate `SnapCore` strategy. */
26
26
  export default class SnapTarget extends Target {
@@ -1 +1 @@
1
- {"version":3,"file":"SnapTarget.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/SnapTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAO,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAW,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE9C,sGAAsG;AACtG,8BAAsB,QAAQ,CAAC,CAAC;IAI5B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAC5C,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAL/B,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;gBAGzB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,CAAC;IAG/B,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAE7D,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAC9I;AAED,yGAAyG;AACzG,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,MAAM;IAK1C,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM;IANzB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAA;gBAGhC,IAAI,EAAE,MAAM,EACO,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,iBAAiB,EACnC,MAAM,EAAE,MAAM;IAOnB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;IAqCxD,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,gBAAgB,GAAG,IAAI;IA+BhF,OAAO,CAAC,kCAAkC;IAoB1C,OAAO,CAAC,kBAAkB;CAI3B"}
1
+ {"version":3,"file":"SnapTarget.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/SnapTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAO,MAAM,cAAc,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAW,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE9C,sGAAsG;AACtG,8BAAsB,QAAQ,CAAC,CAAC;IAI5B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAC5C,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAL/B,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;gBAGzB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,CAAC;IAG/B,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAE7D,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAClJ;AAED,yGAAyG;AACzG,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,MAAM;IAK1C,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM;IANzB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAA;gBAGhC,IAAI,EAAE,MAAM,EACO,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,iBAAiB,EACnC,MAAM,EAAE,MAAM;IAOnB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;IA4DxD,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,gBAAgB,GAAG,IAAI;IA+BhF,OAAO,CAAC,kCAAkC;IAoB1C,OAAO,CAAC,kBAAkB;CAI3B"}
@@ -1,4 +1,5 @@
1
1
  import { log } from "builder-util";
2
+ import { snapArchStringToArch } from "./snapcraftBuilder.js";
2
3
  import * as path from "path";
3
4
  import { Target } from "../../../core.js";
4
5
  import { createStageDirPath } from "../../targetUtil.js";
@@ -32,7 +33,7 @@ export default class SnapTarget extends Target {
32
33
  const core = this.helper.getSnapCore();
33
34
  const snap = await core.createDescriptor(arch);
34
35
  log.debug({ snap }, "snapcraft.yaml descriptor created");
35
- await core.buildSnap({
36
+ const allArtifactPaths = await core.buildSnap({
36
37
  snap,
37
38
  appOutDir,
38
39
  stageDir: await createStageDirPath(this, packager, arch),
@@ -48,6 +49,27 @@ export default class SnapTarget extends Target {
48
49
  packager,
49
50
  publishConfig,
50
51
  });
52
+ // Emit additional artifacts produced by a multi-arch remote-build invocation.
53
+ for (const extraPath of allArtifactPaths) {
54
+ if (extraPath === artifactPath) {
55
+ continue;
56
+ }
57
+ const snapArch = path
58
+ .basename(extraPath)
59
+ .replace(/\.snap$/, "")
60
+ .split("_")
61
+ .pop() ?? "amd64";
62
+ const extraArch = snapArchStringToArch(snapArch);
63
+ const extraArtifactName = path.basename(extraPath);
64
+ await packager.emitArtifactBuildCompleted({
65
+ file: extraPath,
66
+ safeArtifactName: packager.computeSafeArtifactName(extraArtifactName, "snap", extraArch, false),
67
+ target: this,
68
+ arch: extraArch,
69
+ packager,
70
+ publishConfig,
71
+ });
72
+ }
51
73
  }
52
74
  findSnapPublishConfig(config) {
53
75
  const fallback = { provider: "snapStore" };
@@ -1 +1 @@
1
- {"version":3,"file":"SnapTarget.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/SnapTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, log } from \"builder-util\"\nimport { SnapStoreOptions } from \"builder-util-runtime\"\nimport * as path from \"path\"\nimport { Configuration } from \"../../../configuration.js\"\nimport { Publish, Target } from \"../../../core.js\"\nimport { LinuxPackager } from \"../../../linuxPackager.js\"\nimport { SnapcraftOptions } from \"../../../options/SnapOptions.js\"\nimport { LinuxTargetHelper } from \"../LinuxTargetHelper.js\"\nimport { createStageDirPath } from \"../../targetUtil.js\"\nimport { SnapcraftYAML } from \"./snapcraft.js\"\n\n/** Abstract base for all snap build strategies (core24, legacy core18/20/22, custom pass-through). */\nexport abstract class SnapCore<T> {\n protected abstract defaultPlugs: Array<string>\n\n constructor(\n protected readonly packager: LinuxPackager,\n protected readonly helper: LinuxTargetHelper,\n protected readonly options: T\n ) {}\n\n abstract createDescriptor(arch: Arch): Promise<SnapcraftYAML>\n // snapArch is passed through to subclasses; SnapCoreLegacy forwards it to app-builder as --arch.\n abstract buildSnap(params: { snap: SnapcraftYAML; appOutDir: string; stageDir: string; snapArch: Arch; artifactPath: string }): Promise<void>\n}\n\n/** Snap build target — reads `snapcraft` config and delegates to the appropriate `SnapCore` strategy. */\nexport default class SnapTarget extends Target {\n readonly options: SnapcraftOptions\n\n constructor(\n name: string,\n protected readonly packager: LinuxPackager,\n protected readonly helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name)\n\n this.options = packager.getOptionsForTarget<SnapcraftOptions>(\"snapcraft\")\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const packager = this.packager\n // tslint:disable-next-line:no-invalid-template-strings\n const artifactName = packager.expandArtifactNamePattern(this.options, \"snap\", arch, \"${name}_${version}_${arch}.${ext}\", false)\n const artifactPath = path.join(this.outDir, artifactName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: \"snap\",\n file: artifactPath,\n arch,\n })\n\n const core = this.helper.getSnapCore()\n\n const snap = await core.createDescriptor(arch)\n log.debug({ snap }, \"snapcraft.yaml descriptor created\")\n\n await core.buildSnap({\n snap,\n appOutDir,\n stageDir: await createStageDirPath(this, packager, arch),\n snapArch: arch,\n artifactPath,\n })\n\n const publishConfig = this.findSnapPublishConfig(packager.config)\n\n await packager.emitArtifactBuildCompleted({\n file: artifactPath,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, \"snap\", arch, false),\n target: this,\n arch,\n packager,\n publishConfig,\n })\n }\n\n protected findSnapPublishConfig(config?: Configuration): SnapStoreOptions | null {\n const fallback: SnapStoreOptions = { provider: \"snapStore\" }\n\n if (!config) {\n return fallback\n }\n\n const snapConfig = config.snapcraft\n if (snapConfig?.publish) {\n return this.findSnapPublishConfigInPublishNode(snapConfig.publish)\n }\n\n if (config.linux?.publish) {\n const configCandidate = this.findSnapPublishConfigInPublishNode(config.linux.publish)\n\n if (configCandidate) {\n return configCandidate\n }\n }\n\n if (config.publish) {\n const configCandidate = this.findSnapPublishConfigInPublishNode(config.publish)\n\n if (configCandidate) {\n return configCandidate\n }\n }\n\n return fallback\n }\n\n private findSnapPublishConfigInPublishNode(configPublishNode: Publish): SnapStoreOptions | null {\n if (!configPublishNode) {\n return null\n }\n\n if (Array.isArray(configPublishNode)) {\n for (const configObj of configPublishNode) {\n if (this.isSnapStoreOptions(configObj)) {\n return configObj\n }\n }\n }\n\n if (typeof configPublishNode === `object` && this.isSnapStoreOptions(configPublishNode)) {\n return configPublishNode\n }\n\n return null\n }\n\n private isSnapStoreOptions(configPublishNode: Publish): configPublishNode is SnapStoreOptions {\n const snapStoreOptionsCandidate = configPublishNode as SnapStoreOptions\n return snapStoreOptionsCandidate?.provider === `snapStore`\n }\n}\n"]}
1
+ {"version":3,"file":"SnapTarget.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/SnapTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, log } from \"builder-util\"\nimport { snapArchStringToArch } from \"./snapcraftBuilder.js\"\nimport { SnapStoreOptions } from \"builder-util-runtime\"\nimport * as path from \"path\"\nimport { Configuration } from \"../../../configuration.js\"\nimport { Publish, Target } from \"../../../core.js\"\nimport { LinuxPackager } from \"../../../linuxPackager.js\"\nimport { SnapcraftOptions } from \"../../../options/SnapOptions.js\"\nimport { LinuxTargetHelper } from \"../LinuxTargetHelper.js\"\nimport { createStageDirPath } from \"../../targetUtil.js\"\nimport { SnapcraftYAML } from \"./snapcraft.js\"\n\n/** Abstract base for all snap build strategies (core24, legacy core18/20/22, custom pass-through). */\nexport abstract class SnapCore<T> {\n protected abstract defaultPlugs: Array<string>\n\n constructor(\n protected readonly packager: LinuxPackager,\n protected readonly helper: LinuxTargetHelper,\n protected readonly options: T\n ) {}\n\n abstract createDescriptor(arch: Arch): Promise<SnapcraftYAML>\n // snapArch is passed through to subclasses; SnapCoreLegacy forwards it to app-builder as --arch.\n abstract buildSnap(params: { snap: SnapcraftYAML; appOutDir: string; stageDir: string; snapArch: Arch; artifactPath: string }): Promise<string[]>\n}\n\n/** Snap build target — reads `snapcraft` config and delegates to the appropriate `SnapCore` strategy. */\nexport default class SnapTarget extends Target {\n readonly options: SnapcraftOptions\n\n constructor(\n name: string,\n protected readonly packager: LinuxPackager,\n protected readonly helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name)\n\n this.options = packager.getOptionsForTarget<SnapcraftOptions>(\"snapcraft\")\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const packager = this.packager\n // tslint:disable-next-line:no-invalid-template-strings\n const artifactName = packager.expandArtifactNamePattern(this.options, \"snap\", arch, \"${name}_${version}_${arch}.${ext}\", false)\n const artifactPath = path.join(this.outDir, artifactName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: \"snap\",\n file: artifactPath,\n arch,\n })\n\n const core = this.helper.getSnapCore()\n\n const snap = await core.createDescriptor(arch)\n log.debug({ snap }, \"snapcraft.yaml descriptor created\")\n\n const allArtifactPaths = await core.buildSnap({\n snap,\n appOutDir,\n stageDir: await createStageDirPath(this, packager, arch),\n snapArch: arch,\n artifactPath,\n })\n\n const publishConfig = this.findSnapPublishConfig(packager.config)\n\n await packager.emitArtifactBuildCompleted({\n file: artifactPath,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, \"snap\", arch, false),\n target: this,\n arch,\n packager,\n publishConfig,\n })\n\n // Emit additional artifacts produced by a multi-arch remote-build invocation.\n for (const extraPath of allArtifactPaths) {\n if (extraPath === artifactPath) {\n continue\n }\n const snapArch =\n path\n .basename(extraPath)\n .replace(/\\.snap$/, \"\")\n .split(\"_\")\n .pop() ?? \"amd64\"\n const extraArch = snapArchStringToArch(snapArch)\n const extraArtifactName = path.basename(extraPath)\n await packager.emitArtifactBuildCompleted({\n file: extraPath,\n safeArtifactName: packager.computeSafeArtifactName(extraArtifactName, \"snap\", extraArch, false),\n target: this,\n arch: extraArch,\n packager,\n publishConfig,\n })\n }\n }\n\n protected findSnapPublishConfig(config?: Configuration): SnapStoreOptions | null {\n const fallback: SnapStoreOptions = { provider: \"snapStore\" }\n\n if (!config) {\n return fallback\n }\n\n const snapConfig = config.snapcraft\n if (snapConfig?.publish) {\n return this.findSnapPublishConfigInPublishNode(snapConfig.publish)\n }\n\n if (config.linux?.publish) {\n const configCandidate = this.findSnapPublishConfigInPublishNode(config.linux.publish)\n\n if (configCandidate) {\n return configCandidate\n }\n }\n\n if (config.publish) {\n const configCandidate = this.findSnapPublishConfigInPublishNode(config.publish)\n\n if (configCandidate) {\n return configCandidate\n }\n }\n\n return fallback\n }\n\n private findSnapPublishConfigInPublishNode(configPublishNode: Publish): SnapStoreOptions | null {\n if (!configPublishNode) {\n return null\n }\n\n if (Array.isArray(configPublishNode)) {\n for (const configObj of configPublishNode) {\n if (this.isSnapStoreOptions(configObj)) {\n return configObj\n }\n }\n }\n\n if (typeof configPublishNode === `object` && this.isSnapStoreOptions(configPublishNode)) {\n return configPublishNode\n }\n\n return null\n }\n\n private isSnapStoreOptions(configPublishNode: Publish): configPublishNode is SnapStoreOptions {\n const snapStoreOptionsCandidate = configPublishNode as SnapStoreOptions\n return snapStoreOptionsCandidate?.provider === `snapStore`\n }\n}\n"]}
@@ -19,7 +19,7 @@ export declare class SnapCore24 extends SnapCore<SnapOptions24> {
19
19
  stageDir: string;
20
20
  snapArch: Arch;
21
21
  artifactPath: string;
22
- }): Promise<void>;
22
+ }): Promise<string[]>;
23
23
  /** Converts `SnapOptions24` into a fully resolved `SnapcraftYAML` descriptor for the given architecture. */
24
24
  mapSnapOptionsToSnapcraftYAML(arch: Arch): Promise<SnapcraftYAML>;
25
25
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"core24.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/core24.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA6F,MAAM,cAAc,CAAA;AAE9H,OAAO,EAA0B,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAItE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAC/F,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,OAAO,EAAa,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAUzD,wGAAwG;AACxG,qBAAa,UAAW,SAAQ,QAAQ,CAAC,aAAa,CAAC;IAGrD,YAAY,WAAsI;IAKlJ,QAAQ,CAAC,kBAAkB,UAAS;IACpC,QAAQ,CAAC,eAAe,SAA4C;IAKpE,OAAO,CAAC,mBAAmB,CAAQ;IAEnC,OAAO,CAAC,WAAW,CAAe;IAE5B,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAI1D,OAAO,CAAC,UAAU;IAIlB,iHAAiH;IAC3G,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsH1I,4GAA4G;IACtG,6BAA6B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAkNvE;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;YACW,YAAY;IAgC1B;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS;IAUrF;;OAEG;IACH,kBAAkB,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,GAAG,cAAc,GAAG,cAAc,CAAC,GAAG,cAAc,GAAG,cAAc,GAAG,IAAI,EACnH,KAAK,EAAE,CAAC,GACP;QACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;QACzC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;KAC1B;IAwCD,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAW9B"}
1
+ {"version":3,"file":"core24.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/core24.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA6F,MAAM,cAAc,CAAA;AAE9H,OAAO,EAA0B,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAItE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAC/F,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,OAAO,EAAa,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAUzD,wGAAwG;AACxG,qBAAa,UAAW,SAAQ,QAAQ,CAAC,aAAa,CAAC;IAGrD,YAAY,WAAsI;IAKlJ,QAAQ,CAAC,kBAAkB,UAAS;IACpC,QAAQ,CAAC,eAAe,SAA4C;IAKpE,OAAO,CAAC,mBAAmB,CAAQ;IAEnC,OAAO,CAAC,WAAW,CAAe;IAE5B,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAI1D,OAAO,CAAC,UAAU;IAIlB,iHAAiH;IAC3G,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAuH9I,4GAA4G;IACtG,6BAA6B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAkNvE;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;YACW,YAAY;IAgC1B;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS;IAUrF;;OAEG;IACH,kBAAkB,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,GAAG,cAAc,GAAG,cAAc,CAAC,GAAG,cAAc,GAAG,cAAc,GAAG,IAAI,EACnH,KAAK,EAAE,CAAC,GACP;QACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;QACzC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;KAC1B;IAwCD,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAW9B"}
@@ -130,11 +130,11 @@ export class SnapCore24 extends SnapCore {
130
130
  if (this.packager.packagerOptions.effectiveOptionComputed != null) {
131
131
  const shouldSkip = await this.packager.packagerOptions.effectiveOptionComputed({ snap, ...buildMode });
132
132
  if (shouldSkip) {
133
- return;
133
+ return [artifactPath];
134
134
  }
135
135
  }
136
136
  const rootOptions = this.packager.config.snapcraft;
137
- await buildSnap({
137
+ const snaps = await buildSnap({
138
138
  snapcraftConfig: snap,
139
139
  artifactPath,
140
140
  stageDir,
@@ -142,6 +142,7 @@ export class SnapCore24 extends SnapCore {
142
142
  cscLink: rootOptions?.cscLink,
143
143
  ...buildMode,
144
144
  });
145
+ return snaps;
145
146
  }
146
147
  /** Converts `SnapOptions24` into a fully resolved `SnapcraftYAML` descriptor for the given architecture. */
147
148
  async mapSnapOptionsToSnapcraftYAML(arch) {
@@ -1 +1 @@
1
- {"version":3,"file":"core24.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/core24.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, archFromString, copyDir, InvalidConfigurationError, log, removeNullish, toLinuxArchString } from \"builder-util\"\n\nimport { deepAssign, isValidKey, Nullish } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport * as yaml from \"js-yaml\"\nimport * as path from \"path\"\nimport { PlugDescriptor, SlotDescriptor, SnapOptions24 } from \"../../../options/SnapOptions.js\"\nimport { SnapCore } from \"./SnapTarget.js\"\nimport { buildSnapCommandLauncherScript } from \"./snapCommand.js\"\nimport { App, Part, SnapcraftYAML } from \"./snapcraft.js\"\nimport { buildSnap, DEFAULT_STAGE_PACKAGES, SNAPCRAFT_YAML_OPTIONS } from \"./snapcraftBuilder.js\"\nconst { chmod, copy, mkdir, readdir, remove, writeFile } = _fsExtra\n\n// Electron's setuid sandbox helper. Removed from the staged app when the snap runs with\n// `--no-sandbox` (snap confinement supplies its own sandbox via the browser-support interface).\nconst CHROME_SANDBOX = \"chrome-sandbox\"\n// Launcher script name used when the app command cannot be expressed inline (see resolveSnapCommand).\nconst SNAP_COMMAND_LAUNCHER = \"command.sh\"\n\n/** Snap build strategy for core24 — generates a native snapcraft.yaml and invokes the snapcraft CLI. */\nexport class SnapCore24 extends SnapCore<SnapOptions24> {\n // browser-support is intentionally absent here; it is auto-injected in mapSnapOptionsToSnapcraftYAML\n // when the user has not provided custom plugs, so it always lands in both root plugs and app plugs.\n defaultPlugs = [\"desktop\", \"desktop-legacy\", \"home\", \"x11\", \"wayland\", \"unity7\", \"network\", \"gsettings\", \"audio-playback\", \"pulseaudio\", \"opengl\"]\n\n // Snap file hierarchy:\n // - snap/gui/ gets automatically copied to meta/gui/ in the final snap\n // - Desktop files in meta/gui/ are used for menu integration\n readonly configRelativePath = \"snap\"\n readonly guiRelativePath = path.join(this.configRelativePath, \"gui\")\n\n // Computed in createDescriptor (mapSnapOptionsToSnapcraftYAML) and consumed in buildSnap.\n // getSnapCore() returns a fresh SnapCore24 per arch build, so this per-instance state is\n // never shared across builds.\n private removeChromeSandbox = false\n // Args embedded into the generated launcher script (executableArgs + forceX11/no-sandbox flags).\n private commandArgs: string[] = []\n\n async createDescriptor(arch: Arch): Promise<SnapcraftYAML> {\n return await this.mapSnapOptionsToSnapcraftYAML(arch)\n }\n\n private isHostMode(): boolean {\n return this.options.useDestructiveMode === true\n }\n\n /** Writes the snapcraft.yaml, stages app files, then invokes `buildSnap()` to run the actual snapcraft build. */\n async buildSnap(params: { snap: SnapcraftYAML; appOutDir: string; stageDir: string; snapArch: Arch; artifactPath: string }): Promise<void> {\n const { snap, appOutDir, stageDir, artifactPath } = params\n\n const snapDirResolved = path.resolve(stageDir, this.configRelativePath)\n const snapcraftYamlPath = path.join(snapDirResolved, \"snapcraft.yaml\")\n\n // Create snap/gui directory for desktop files and icons\n // Snapcraft will automatically copy snap/gui/ contents to meta/gui/ in the final snap\n const guiOutput = path.resolve(stageDir, this.guiRelativePath)\n await mkdir(guiOutput, { recursive: true })\n\n const yamlContent = yaml.dump(snap, SNAPCRAFT_YAML_OPTIONS)\n await writeFile(snapcraftYamlPath, yamlContent, \"utf8\")\n log.debug(snap, \"generated snapcraft.yaml\")\n\n // Copy icon to snap/gui/ directory\n // Snapcraft will automatically copy this to meta/gui/ in the final snap\n const desktopExtraProps: Record<string, string> = {}\n const icon = this.helper.maxIconPath\n if (icon) {\n const iconFileName = `${snap.name}${path.extname(icon)}`\n await copy(icon, path.join(guiOutput, iconFileName))\n // Icon path will be available at ${SNAP}/meta/gui/<icon-file> after installation\n desktopExtraProps.Icon = `\\${SNAP}/meta/gui/${iconFileName}`\n }\n\n // Create desktop file in snap/gui/ directory\n // Snapcraft will automatically copy this to meta/gui/ in the final snap\n const desktopFilePath = path.join(guiOutput, `${this.helper.getDesktopFileName(snap.name)}.desktop`)\n await this.helper.writeDesktopEntry(this.options, this.packager.executableName + \" %U\", desktopFilePath, desktopExtraProps)\n\n // Copy app files to the project root `app` directory so `source: app`\n // in the generated `snapcraft.yaml` (which is under `snap/`) can be\n // resolved by snapcraft running in the build environment.\n const appDir = path.resolve(stageDir, \"app\")\n if (path.resolve(appDir) !== path.resolve(appOutDir)) {\n log.debug({ to: log.filePath(appDir), from: log.filePath(appOutDir) }, \"copying app files to project root app directory\")\n await copyDir(appOutDir, appDir)\n }\n\n // Drop the setuid chrome-sandbox helper before snapcraft stages the app — it is unusable under\n // strict confinement when launching with --no-sandbox (mirrors SnapCoreLegacy).\n if (this.removeChromeSandbox) {\n await remove(path.join(appDir, CHROME_SANDBOX))\n }\n\n // Write the launcher script the command always points at (see SNAP_COMMAND_LAUNCHER).\n // It lands at the snap root ($SNAP/command.sh) — it is intentionally not added to `organize`.\n const launcherPath = path.join(appDir, SNAP_COMMAND_LAUNCHER)\n await writeFile(launcherPath, buildSnapCommandLauncherScript({ execName: this.packager.executableName, args: this.commandArgs }), { mode: 0o755 })\n await chmod(launcherPath, 0o755)\n\n // Auto-generate `organize` mapping for the app part so top-level helper\n // binaries and resources are placed under `app/` inside the snap. Update\n // the already-written `snapcraft.yaml` so the build sees the mapping.\n try {\n const appPart = snap.parts[snap.name]\n if (appPart) {\n const entries = (await readdir(appOutDir)).sort()\n // Null-prototype map: entry names come from the filesystem, so a top-level file named\n // \"__proto__\" / \"constructor\" / \"toString\" must not read inherited keys (which would make\n // the membership check below skip it) or interact with Object.prototype on assignment.\n const organize: Record<string, string> = Object.assign(Object.create(null), appPart.organize)\n for (const entry of entries) {\n if (!entry) {\n continue\n }\n // Skip files no longer present in the staged app dir (e.g. removed chrome-sandbox) so\n // snapcraft doesn't fail trying to organize a missing source.\n if (this.removeChromeSandbox && entry === CHROME_SANDBOX) {\n continue\n }\n // Never organize the launcher under app/. It must stay at the snap root ($SNAP/command.sh)\n // to match apps.<name>.command. This matters when appOutDir === appDir, where readdir\n // would otherwise pick up the launcher we just wrote.\n if (entry === SNAP_COMMAND_LAUNCHER) {\n continue\n }\n if (organize[entry]) {\n continue\n }\n organize[entry] = `app/${entry}`\n }\n appPart.organize = organize\n\n const updatedYaml = yaml.dump(snap, SNAPCRAFT_YAML_OPTIONS)\n await writeFile(snapcraftYamlPath, updatedYaml, \"utf8\")\n log.debug({ organize }, \"updated snapcraft.yaml with organize mapping\")\n }\n } catch (e: any) {\n log.warn({ error: e.message }, \"failed to generate and update organize mapping\")\n }\n\n const buildMode = {\n useLXD: this.options.useLXD === true,\n useMultipass: this.options.useMultipass === true,\n useDestructiveMode: this.options.useDestructiveMode === true,\n remoteBuild: this.options.remoteBuild || undefined,\n }\n\n if (this.packager.packagerOptions.effectiveOptionComputed != null) {\n const shouldSkip = await this.packager.packagerOptions.effectiveOptionComputed({ snap, ...buildMode })\n if (shouldSkip) {\n return\n }\n }\n\n const rootOptions = this.packager.config.snapcraft\n await buildSnap({\n snapcraftConfig: snap,\n artifactPath,\n stageDir,\n packager: this.packager,\n cscLink: rootOptions?.cscLink,\n ...buildMode,\n })\n }\n\n /** Converts `SnapOptions24` into a fully resolved `SnapcraftYAML` descriptor for the given architecture. */\n async mapSnapOptionsToSnapcraftYAML(arch: Arch): Promise<SnapcraftYAML> {\n const appInfo = this.packager.appInfo\n const appName = this.packager.executableName.toLowerCase()\n const options = this.options\n\n // Default to [\"gnome\"] in normal builds; no extensions in host/destructive-mode (where the\n // gnome extension is incompatible). Throw if the user explicitly includes \"gnome\" in host mode.\n const hostMode = this.isHostMode()\n const extensionsList: string[] = options.extensions != null ? [...options.extensions] : hostMode ? [] : [\"gnome\"]\n if (hostMode && extensionsList.includes(\"gnome\")) {\n throw new InvalidConfigurationError(\n `The \"gnome\" snapcraft extension is incompatible with host/destructive-mode builds.\\n` +\n `In this mode snapcraft cannot resolve the extension's command-chain source ` +\n `(/usr/share/snapcraft/extensions/desktop/command-chain) and will fail.\\n\\n` +\n `To resolve this, choose one of:\\n` +\n ` 1. Remove \"gnome\" from snapcraft.core24.extensions (or set it to []) and add any\\n` +\n ` required stage-packages manually.\\n` +\n ` 2. Switch to an isolated build environment by setting snapcraft.core24.useLXD: true\\n` +\n ` or snapcraft.core24.useMultipass: true instead of useDestructiveMode.\\n\\n` +\n `See: https://snapcraft.io/docs/gnome-extension`\n )\n }\n const resolvedExtensions = extensionsList.length > 0 ? extensionsList : undefined\n const useGnomeExtension = extensionsList.includes(\"gnome\")\n\n // Create the app part\n const appPart: Part = {\n plugin: \"dump\",\n source: \"app\",\n \"build-packages\": options.buildPackages?.length ? options.buildPackages : undefined,\n \"stage-packages\": this.expandDefaultsInArray(options.stagePackages, DEFAULT_STAGE_PACKAGES),\n after: this.expandDefaultsInArray(options.after, []),\n stage: options.appPartStage?.length ? options.appPartStage : undefined,\n }\n\n // Process plugs and slots\n // When using GNOME extension, we don't need to manually configure content snaps\n // The extension will handle: gnome-46-2404, gtk-3-themes, icon-themes, sound-themes\n let rootPlugs: Record<string, any> | undefined\n let appPlugs: string[] | undefined\n\n if (useGnomeExtension) {\n // With GNOME extension, only process user-provided custom plugs\n const result = options.plugs ? this.processPlugOrSlots(options.plugs) : { root: undefined, app: undefined }\n rootPlugs = result.root\n // Extension automatically adds common plugs, so we only add custom ones\n appPlugs = result.app\n } else {\n // Without GNOME extension, we need manual content snaps\n const defaultRootPlugs: Record<string, any> = {\n \"gtk-3-themes\": {\n interface: \"content\",\n target: \"$SNAP/data-dir/themes\",\n \"default-provider\": \"gtk-common-themes\",\n },\n \"icon-themes\": {\n interface: \"content\",\n target: \"$SNAP/data-dir/icons\",\n \"default-provider\": \"gtk-common-themes\",\n },\n \"sound-themes\": {\n interface: \"content\",\n target: \"$SNAP/data-dir/sounds\",\n \"default-provider\": \"gtk-common-themes\",\n },\n \"gnome-46-2404\": {\n interface: \"content\",\n target: \"$SNAP/gnome-platform\",\n \"default-provider\": \"gnome-46-2404\",\n },\n \"gpu-2404\": {\n interface: \"content\",\n target: \"$SNAP/gpu-2404\",\n \"default-provider\": \"mesa-2404\",\n },\n }\n\n const result = options.plugs\n ? this.processPlugOrSlots(options.plugs)\n : hostMode\n ? { root: undefined, app: this.defaultPlugs }\n : {\n root: defaultRootPlugs,\n app: this.defaultPlugs,\n }\n rootPlugs = result.root\n appPlugs = result.app\n }\n\n // Always add browser-support with allow-sandbox so Chromium's internal sandbox\n // can create user namespaces under strict confinement. Without allow-sandbox: true\n // the app crashes immediately with \"FATAL: Permission denied (13)\" in credentials.cc.\n // Skip the injection only when the user has explicitly provided their own plugs\n // (they are responsible for including browser-support in that case).\n if (!options.plugs) {\n rootPlugs = { ...rootPlugs, \"browser-support\": { interface: \"browser-support\", \"allow-sandbox\": true } }\n if (!appPlugs?.includes(\"browser-support\")) {\n appPlugs = [...(appPlugs ?? []), \"browser-support\"]\n }\n }\n\n const { root: rootSlots, app: appSlots } = options.slots ? this.processPlugOrSlots(options.slots) : { root: undefined, app: undefined }\n\n // Build the effective arg list for the snap command.\n // Start with any user-supplied executableArgs, then conditionally add --no-sandbox\n // if browser-support with allow-sandbox:true is not present in the resolved plugs\n // (mirrors the same logic in SnapCoreLegacy.buildSnap).\n const extraArgs: string[] = [...(this.options.executableArgs ?? [])]\n if (this.options.forceX11 === true) {\n if (!extraArgs.includes(\"--ozone-platform=x11\")) {\n extraArgs.push(\"--ozone-platform=x11\")\n }\n }\n const noSandbox = this.helper.isElectronVersionGreaterOrEqualThan(\"5.0.0\") && !this.isBrowserSandboxAllowed(rootPlugs)\n if (noSandbox && !extraArgs.includes(\"--no-sandbox\")) {\n extraArgs.push(\"--no-sandbox\")\n }\n // With --no-sandbox the setuid chrome-sandbox helper is unused; strip it from the snap.\n this.removeChromeSandbox = noSandbox\n\n // The command always points at a generated launcher script (written in buildSnap). This keeps a\n // single uniform command path and sidesteps snapd's character/word-splitting rules for the\n // command field (e.g. --ozone-platform=x11, --js-flags=\"...\").\n this.commandArgs = extraArgs\n\n // Create the app configuration\n const desktopBaseName = this.helper.getDesktopFileName(appName)\n const app: App = {\n command: SNAP_COMMAND_LAUNCHER,\n \"command-chain\": undefined, // explicitly undefined so removeNullish strips it; extensions supply their own command-chain\n plugs: appPlugs,\n slots: appSlots,\n autostart: options.autoStart ? `${desktopBaseName}.desktop` : undefined,\n desktop: `meta/gui/${desktopBaseName}.desktop`,\n extensions: resolvedExtensions,\n }\n\n // Icon path — build-time relative path so snapcraft can find the file in snap/gui/\n await this.helper.icons\n const iconPath = this.helper.maxIconPath != null ? `snap/gui/${appName}${path.extname(this.helper.maxIconPath)}` : undefined\n\n // Process hooks if configured\n const hooksConfig = options.hooks\n const hooks = hooksConfig ? await this.processHooks(hooksConfig) : undefined\n\n // Parts configuration - the extension automatically adds a gnome/sdk part\n // Don't manually add desktop-launch when using the extension\n const parts: Record<string, Part> = {\n [appName]: appPart,\n }\n\n // Note: `organize` will be generated later in `buildSnap` based on the\n // actual contents of the built app directory so helper binaries and\n // resources are automatically moved under `app/` in the snap.\n\n // Build the snapcraft configuration\n const snapcraft: SnapcraftYAML = {\n // Required fields\n name: appName,\n base: \"core24\",\n confinement: options.confinement || \"strict\",\n parts: parts,\n\n // Architecture/Platform — only needed for cross-compilation; snapcraft 8\n // defaults to host arch and snapcraft 7 rejects this field entirely.\n ...(arch !== archFromString(process.arch)\n ? {\n platforms: {\n [toLinuxArchString(arch, \"snap\")]: {\n \"build-for\": toLinuxArchString(arch, \"snap\"),\n \"build-on\": toLinuxArchString(archFromString(process.arch), \"snap\"),\n },\n },\n }\n : {}),\n\n // Metadata - with fallbacks from appInfo\n version: appInfo.version,\n summary: options.summary || appInfo.productName,\n description: this.helper.getDescription(options),\n grade: options.grade || \"stable\",\n title: options.title || appInfo.productName,\n icon: iconPath,\n\n // Build configuration\n compression: options.compression || undefined,\n assumes: this.normalizeAssumesList(options.assumes),\n\n // Environment\n environment: this.buildEnvironment(options),\n\n // User-supplied layout always wins. Without gnome extension and not in host mode, fall back to content-snap defaults.\n layout: options.layout ?? (useGnomeExtension || hostMode ? undefined : this.buildDefaultLayout(options)),\n\n // Interfaces\n plugs: rootPlugs,\n slots: rootSlots,\n\n // Hooks\n hooks: hooks,\n\n // Apps\n apps: {\n [appName]: app,\n },\n }\n\n return removeNullish(snapcraft)\n }\n\n /**\n * Build environment variables with proper defaults\n */\n private buildEnvironment(options: SnapOptions24): Record<string, string | null> | undefined {\n const env: Record<string, string | null> = {}\n\n // Add default TMPDIR for Electron/Chromium apps\n if (!options.environment?.TMPDIR) {\n env.TMPDIR = \"$XDG_RUNTIME_DIR\"\n }\n\n if (options.environment) {\n deepAssign(env, options.environment)\n }\n\n return Object.keys(env).length > 0 ? env : undefined\n }\n\n /**\n * Build default layout for core24 with GNOME platform content snaps (non-extension mode)\n * This allows the app to access libraries from the gnome-46-2404 and mesa-2404 content snaps\n */\n private buildDefaultLayout(options: SnapOptions24): Record<string, any> | undefined {\n // If user provides custom layout, use that instead\n if (options.layout) {\n return options.layout\n }\n\n // Default layout for core24 Electron apps using GNOME content snaps WITHOUT extension\n return {\n \"/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.0\": {\n bind: \"$SNAP/gnome-platform/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.0\",\n },\n \"/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.1\": {\n bind: \"$SNAP/gnome-platform/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.1\",\n },\n \"/usr/share/xml/iso-codes\": {\n bind: \"$SNAP/gnome-platform/usr/share/xml/iso-codes\",\n },\n \"/usr/share/libdrm\": {\n bind: \"$SNAP/gpu-2404/libdrm\",\n },\n \"/usr/share/drirc.d\": {\n symlink: \"$SNAP/gpu-2404/drirc.d\",\n },\n }\n }\n\n /**\n * Process hooks directory into hook definitions\n */\n private async processHooks(hooksPath: string): Promise<Record<string, any> | undefined> {\n try {\n const buildResourcesDir = this.packager.buildResourcesDir\n const hooksDir = path.resolve(buildResourcesDir, hooksPath)\n if (!hooksDir.startsWith(buildResourcesDir + path.sep) && hooksDir !== buildResourcesDir) {\n throw new InvalidConfigurationError(`snapcraft.core24.hooks must resolve within the build resources directory (got \"${hooksDir}\")`)\n }\n const hookFiles = await readdir(hooksDir)\n\n if (hookFiles.length === 0) {\n return undefined\n }\n\n const hooks: Record<string, any> = {}\n for (const hookFile of hookFiles) {\n const hookName = path.basename(hookFile, path.extname(hookFile))\n if (!isValidKey(hookName)) {\n throw new InvalidConfigurationError(`Invalid hook name: ${hookName}`)\n }\n hooks[hookName] = {\n // Hook definitions will be populated by snapcraft from the files\n // Just register that these hooks exist\n }\n }\n\n return hooks\n } catch (e: any) {\n log.error({ message: e.message }, \"error processing Snap hooks directory\")\n throw e\n }\n }\n\n /**\n * Normalize assumes list (can be string or array)\n */\n normalizeAssumesList(assumes: Array<string> | string | Nullish): string[] | undefined {\n if (!assumes) {\n return undefined\n }\n if (typeof assumes === \"string\") {\n return [assumes]\n }\n return assumes.length > 0 ? assumes : undefined\n }\n\n /**\n * Process plugs or slots into root-level definitions and app-level references\n */\n processPlugOrSlots<T extends Array<string | SlotDescriptor | PlugDescriptor> | SlotDescriptor | PlugDescriptor | null>(\n items: T\n ): {\n root: Record<string, unknown> | undefined\n app: string[] | undefined\n } {\n if (!items || (Array.isArray(items) && items.length === 0)) {\n return { root: undefined, app: undefined }\n }\n const root: Record<string, unknown> = {}\n const app: string[] = []\n\n // Handle single descriptor object\n if (!Array.isArray(items)) {\n Object.entries(items).forEach(([name, config]) => {\n if (!isValidKey(name)) {\n throw new Error(`Invalid plug/slot name: ${name}`)\n }\n root[name] = config\n app.push(name)\n })\n return { root, app }\n }\n\n // Handle array - support \"default\" keyword\n const processedItems = this.expandDefaultsInArray(items, this.defaultPlugs)\n for (const item of processedItems ?? []) {\n if (typeof item === \"string\") {\n // Simple string reference\n app.push(item)\n } else {\n // Descriptor object with configuration\n Object.entries(item).forEach(([name, config]) => {\n if (!isValidKey(name)) {\n throw new Error(`Invalid plug/slot name: ${name}`)\n }\n root[name] = config\n app.push(name)\n })\n }\n }\n\n return { root: Object.keys(root).length > 0 ? root : undefined, app: app.length > 0 ? app : undefined }\n }\n\n private isBrowserSandboxAllowed(plugs: Record<string, any> | undefined): boolean {\n if (!plugs) {\n return false\n }\n for (const plug of Object.values(plugs)) {\n if (plug?.interface === \"browser-support\" && plug[\"allow-sandbox\"] === true) {\n return true\n }\n }\n return false\n }\n\n /**\n * Expand \"default\" keyword in arrays of anything\n */\n private expandDefaultsInArray<T>(items: T[] | Nullish, defaults: T[]): T[] | undefined {\n const result: Array<T> = []\n for (const item of items ?? []) {\n if (typeof item === \"string\" && item === \"default\") {\n result.push(...defaults)\n } else {\n result.push(item)\n }\n }\n return result.length > 0 ? result : undefined\n }\n}\n"]}
1
+ {"version":3,"file":"core24.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/core24.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,cAAc,EAAE,OAAO,EAAE,yBAAyB,EAAE,GAAG,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAE9H,OAAO,EAAE,UAAU,EAAE,UAAU,EAAW,MAAM,sBAAsB,CAAA;AACtE,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,IAAI,MAAM,SAAS,CAAA;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAA;AAEjE,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACjG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAA;AAEnE,wFAAwF;AACxF,gGAAgG;AAChG,MAAM,cAAc,GAAG,gBAAgB,CAAA;AACvC,sGAAsG;AACtG,MAAM,qBAAqB,GAAG,YAAY,CAAA;AAE1C,wGAAwG;AACxG,MAAM,OAAO,UAAW,SAAQ,QAAuB;IAAvD;;QACE,qGAAqG;QACrG,oGAAoG;QACpG,iBAAY,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAA;QAElJ,uBAAuB;QACvB,uEAAuE;QACvE,6DAA6D;QACpD,uBAAkB,GAAG,MAAM,CAAA;QAC3B,oBAAe,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;QAEpE,0FAA0F;QAC1F,yFAAyF;QACzF,8BAA8B;QACtB,wBAAmB,GAAG,KAAK,CAAA;QACnC,iGAAiG;QACzF,gBAAW,GAAa,EAAE,CAAA;IA+fpC,CAAC;IA7fC,KAAK,CAAC,gBAAgB,CAAC,IAAU;QAC/B,OAAO,MAAM,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAA;IACvD,CAAC;IAEO,UAAU;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAA;IACjD,CAAC;IAED,iHAAiH;IACjH,KAAK,CAAC,SAAS,CAAC,MAA0G;QACxH,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;QAE1D,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACvE,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAA;QAEtE,wDAAwD;QACxD,sFAAsF;QACtF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;QAC9D,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAE3C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAA;QAC3D,MAAM,SAAS,CAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QACvD,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAA;QAE3C,mCAAmC;QACnC,wEAAwE;QACxE,MAAM,iBAAiB,GAA2B,EAAE,CAAA;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAA;QACpC,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;YACxD,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;YACpD,iFAAiF;YACjF,iBAAiB,CAAC,IAAI,GAAG,qBAAqB,YAAY,EAAE,CAAA;QAC9D,CAAC;QAED,6CAA6C;QAC7C,wEAAwE;QACxE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACpG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,KAAK,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAA;QAE3H,sEAAsE;QACtE,oEAAoE;QACpE,0DAA0D;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC5C,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,iDAAiD,CAAC,CAAA;YACzH,MAAM,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAClC,CAAC;QAED,+FAA+F;QAC/F,gFAAgF;QAChF,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;QACjD,CAAC;QAED,sFAAsF;QACtF,8FAA8F;QAC9F,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAA;QAC7D,MAAM,SAAS,CAAC,YAAY,EAAE,8BAA8B,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAClJ,MAAM,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;QAEhC,wEAAwE;QACxE,yEAAyE;QACzE,sEAAsE;QACtE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBACjD,sFAAsF;gBACtF,0FAA0F;gBAC1F,uFAAuF;gBACvF,MAAM,QAAQ,GAA2B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;gBAC7F,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,SAAQ;oBACV,CAAC;oBACD,sFAAsF;oBACtF,8DAA8D;oBAC9D,IAAI,IAAI,CAAC,mBAAmB,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;wBACzD,SAAQ;oBACV,CAAC;oBACD,2FAA2F;oBAC3F,sFAAsF;oBACtF,sDAAsD;oBACtD,IAAI,KAAK,KAAK,qBAAqB,EAAE,CAAC;wBACpC,SAAQ;oBACV,CAAC;oBACD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBACpB,SAAQ;oBACV,CAAC;oBACD,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,KAAK,EAAE,CAAA;gBAClC,CAAC;gBACD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;gBAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAA;gBAC3D,MAAM,SAAS,CAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;gBACvD,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,8CAA8C,CAAC,CAAA;YACzE,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,gDAAgD,CAAC,CAAA;QAClF,CAAC;QAED,MAAM,SAAS,GAAG;YAChB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI;YACpC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,IAAI;YAChD,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,KAAK,IAAI;YAC5D,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,SAAS;SACnD,CAAA;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,IAAI,IAAI,EAAE,CAAC;YAClE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC,CAAA;YACtG,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,YAAY,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAA;QAClD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC;YAC5B,eAAe,EAAE,IAAI;YACrB,YAAY;YACZ,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,WAAW,EAAE,OAAO;YAC7B,GAAG,SAAS;SACb,CAAC,CAAA;QACF,OAAO,KAAK,CAAA;IACd,CAAC;IAED,4GAA4G;IAC5G,KAAK,CAAC,6BAA6B,CAAC,IAAU;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAA;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,CAAA;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,2FAA2F;QAC3F,gGAAgG;QAChG,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QAClC,MAAM,cAAc,GAAa,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QACjH,IAAI,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,yBAAyB,CACjC,sFAAsF;gBACpF,6EAA6E;gBAC7E,4EAA4E;gBAC5E,mCAAmC;gBACnC,sFAAsF;gBACtF,0CAA0C;gBAC1C,yFAAyF;gBACzF,gFAAgF;gBAChF,gDAAgD,CACnD,CAAA;QACH,CAAC;QACD,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;QACjF,MAAM,iBAAiB,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAE1D,sBAAsB;QACtB,MAAM,OAAO,GAAS;YACpB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,KAAK;YACb,gBAAgB,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;YACnF,gBAAgB,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,aAAa,EAAE,sBAAsB,CAAC;YAC3F,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YACpD,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;SACvE,CAAA;QAED,0BAA0B;QAC1B,gFAAgF;QAChF,oFAAoF;QACpF,IAAI,SAA0C,CAAA;QAC9C,IAAI,QAA8B,CAAA;QAElC,IAAI,iBAAiB,EAAE,CAAC;YACtB,gEAAgE;YAChE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAA;YAC3G,SAAS,GAAG,MAAM,CAAC,IAAI,CAAA;YACvB,wEAAwE;YACxE,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;QACvB,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,MAAM,gBAAgB,GAAwB;gBAC5C,cAAc,EAAE;oBACd,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,uBAAuB;oBAC/B,kBAAkB,EAAE,mBAAmB;iBACxC;gBACD,aAAa,EAAE;oBACb,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,sBAAsB;oBAC9B,kBAAkB,EAAE,mBAAmB;iBACxC;gBACD,cAAc,EAAE;oBACd,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,uBAAuB;oBAC/B,kBAAkB,EAAE,mBAAmB;iBACxC;gBACD,eAAe,EAAE;oBACf,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,sBAAsB;oBAC9B,kBAAkB,EAAE,eAAe;iBACpC;gBACD,UAAU,EAAE;oBACV,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,gBAAgB;oBACxB,kBAAkB,EAAE,WAAW;iBAChC;aACF,CAAA;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK;gBAC1B,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC;gBACxC,CAAC,CAAC,QAAQ;oBACR,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE;oBAC7C,CAAC,CAAC;wBACE,IAAI,EAAE,gBAAgB;wBACtB,GAAG,EAAE,IAAI,CAAC,YAAY;qBACvB,CAAA;YACP,SAAS,GAAG,MAAM,CAAC,IAAI,CAAA;YACvB,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;QACvB,CAAC;QAED,+EAA+E;QAC/E,oFAAoF;QACpF,sFAAsF;QACtF,gFAAgF;QAChF,qEAAqE;QACrE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,SAAS,GAAG,EAAE,GAAG,SAAS,EAAE,iBAAiB,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,CAAA;YACxG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC3C,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAA;QAEvI,qDAAqD;QACrD,mFAAmF;QACnF,kFAAkF;QAClF,wDAAwD;QACxD,MAAM,SAAS,GAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAA;QACpE,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBAChD,SAAS,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,mCAAmC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAA;QACtH,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACrD,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAChC,CAAC;QACD,wFAAwF;QACxF,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAA;QAEpC,gGAAgG;QAChG,2FAA2F;QAC3F,+DAA+D;QAC/D,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;QAE5B,+BAA+B;QAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAC/D,MAAM,GAAG,GAAQ;YACf,OAAO,EAAE,qBAAqB;YAC9B,eAAe,EAAE,SAAS,EAAE,6FAA6F;YACzH,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,eAAe,UAAU,CAAC,CAAC,CAAC,SAAS;YACvE,OAAO,EAAE,YAAY,eAAe,UAAU;YAC9C,UAAU,EAAE,kBAAkB;SAC/B,CAAA;QAED,mFAAmF;QACnF,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QAE5H,8BAA8B;QAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAA;QACjC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAE5E,0EAA0E;QAC1E,6DAA6D;QAC7D,MAAM,KAAK,GAAyB;YAClC,CAAC,OAAO,CAAC,EAAE,OAAO;SACnB,CAAA;QAED,uEAAuE;QACvE,oEAAoE;QACpE,8DAA8D;QAE9D,oCAAoC;QACpC,MAAM,SAAS,GAAkB;YAC/B,kBAAkB;YAClB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,QAAQ;YAC5C,KAAK,EAAE,KAAK;YAEZ,yEAAyE;YACzE,qEAAqE;YACrE,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;gBACvC,CAAC,CAAC;oBACE,SAAS,EAAE;wBACT,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE;4BACjC,WAAW,EAAE,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC;4BAC5C,UAAU,EAAE,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;yBACpE;qBACF;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YAEP,yCAAyC;YACzC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,WAAW;YAC/C,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC;YAChD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW;YAC3C,IAAI,EAAE,QAAQ;YAEd,sBAAsB;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,SAAS;YAC7C,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC;YAEnD,cAAc;YACd,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAE3C,sHAAsH;YACtH,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,iBAAiB,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAExG,aAAa;YACb,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAEhB,QAAQ;YACR,KAAK,EAAE,KAAK;YAEZ,OAAO;YACP,IAAI,EAAE;gBACJ,CAAC,OAAO,CAAC,EAAE,GAAG;aACf;SACF,CAAA;QAED,OAAO,aAAa,CAAC,SAAS,CAAC,CAAA;IACjC,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAAsB;QAC7C,MAAM,GAAG,GAAkC,EAAE,CAAA;QAE7C,gDAAgD;QAChD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;YACjC,GAAG,CAAC,MAAM,GAAG,kBAAkB,CAAA;QACjC,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;QACtC,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;IACtD,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,OAAsB;QAC/C,mDAAmD;QACnD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,OAAO,CAAC,MAAM,CAAA;QACvB,CAAC;QAED,sFAAsF;QACtF,OAAO;YACL,uDAAuD,EAAE;gBACvD,IAAI,EAAE,2EAA2E;aAClF;YACD,uDAAuD,EAAE;gBACvD,IAAI,EAAE,2EAA2E;aAClF;YACD,0BAA0B,EAAE;gBAC1B,IAAI,EAAE,8CAA8C;aACrD;YACD,mBAAmB,EAAE;gBACnB,IAAI,EAAE,uBAAuB;aAC9B;YACD,oBAAoB,EAAE;gBACpB,OAAO,EAAE,wBAAwB;aAClC;SACF,CAAA;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,SAAiB;QAC1C,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAA;YACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAA;YAC3D,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;gBACzF,MAAM,IAAI,yBAAyB,CAAC,kFAAkF,QAAQ,IAAI,CAAC,CAAA;YACrI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAA;YAEzC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,SAAS,CAAA;YAClB,CAAC;YAED,MAAM,KAAK,GAAwB,EAAE,CAAA;YACrC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;gBAChE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,yBAAyB,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAA;gBACvE,CAAC;gBACD,KAAK,CAAC,QAAQ,CAAC,GAAG;gBAChB,iEAAiE;gBACjE,uCAAuC;iBACxC,CAAA;YACH,CAAC;YAED,OAAO,KAAK,CAAA;QACd,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,uCAAuC,CAAC,CAAA;YAC1E,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,OAAyC;QAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,OAAO,CAAC,CAAA;QAClB,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IACjD,CAAC;IAED;;OAEG;IACH,kBAAkB,CAChB,KAAQ;QAKR,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAA;QAC5C,CAAC;QACD,MAAM,IAAI,GAA4B,EAAE,CAAA;QACxC,MAAM,GAAG,GAAa,EAAE,CAAA;QAExB,kCAAkC;QAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;gBAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA;gBACpD,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAA;gBACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC,CAAC,CAAA;YACF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;QACtB,CAAC;QAED,2CAA2C;QAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QAC3E,KAAK,MAAM,IAAI,IAAI,cAAc,IAAI,EAAE,EAAE,CAAC;YACxC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,0BAA0B;gBAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;iBAAM,CAAC;gBACN,uCAAuC;gBACvC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;oBAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;wBACtB,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA;oBACpD,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAA;oBACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAChB,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IACzG,CAAC;IAEO,uBAAuB,CAAC,KAAsC;QACpE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAA;QACd,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,IAAI,IAAI,EAAE,SAAS,KAAK,iBAAiB,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5E,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAI,KAAoB,EAAE,QAAa;QAClE,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;YAC1B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IAC/C,CAAC;CACF","sourcesContent":["import { Arch, archFromString, copyDir, InvalidConfigurationError, log, removeNullish, toLinuxArchString } from \"builder-util\"\n\nimport { deepAssign, isValidKey, Nullish } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport * as yaml from \"js-yaml\"\nimport * as path from \"path\"\nimport { PlugDescriptor, SlotDescriptor, SnapOptions24 } from \"../../../options/SnapOptions.js\"\nimport { SnapCore } from \"./SnapTarget.js\"\nimport { buildSnapCommandLauncherScript } from \"./snapCommand.js\"\nimport { App, Part, SnapcraftYAML } from \"./snapcraft.js\"\nimport { buildSnap, DEFAULT_STAGE_PACKAGES, SNAPCRAFT_YAML_OPTIONS } from \"./snapcraftBuilder.js\"\nconst { chmod, copy, mkdir, readdir, remove, writeFile } = _fsExtra\n\n// Electron's setuid sandbox helper. Removed from the staged app when the snap runs with\n// `--no-sandbox` (snap confinement supplies its own sandbox via the browser-support interface).\nconst CHROME_SANDBOX = \"chrome-sandbox\"\n// Launcher script name used when the app command cannot be expressed inline (see resolveSnapCommand).\nconst SNAP_COMMAND_LAUNCHER = \"command.sh\"\n\n/** Snap build strategy for core24 — generates a native snapcraft.yaml and invokes the snapcraft CLI. */\nexport class SnapCore24 extends SnapCore<SnapOptions24> {\n // browser-support is intentionally absent here; it is auto-injected in mapSnapOptionsToSnapcraftYAML\n // when the user has not provided custom plugs, so it always lands in both root plugs and app plugs.\n defaultPlugs = [\"desktop\", \"desktop-legacy\", \"home\", \"x11\", \"wayland\", \"unity7\", \"network\", \"gsettings\", \"audio-playback\", \"pulseaudio\", \"opengl\"]\n\n // Snap file hierarchy:\n // - snap/gui/ gets automatically copied to meta/gui/ in the final snap\n // - Desktop files in meta/gui/ are used for menu integration\n readonly configRelativePath = \"snap\"\n readonly guiRelativePath = path.join(this.configRelativePath, \"gui\")\n\n // Computed in createDescriptor (mapSnapOptionsToSnapcraftYAML) and consumed in buildSnap.\n // getSnapCore() returns a fresh SnapCore24 per arch build, so this per-instance state is\n // never shared across builds.\n private removeChromeSandbox = false\n // Args embedded into the generated launcher script (executableArgs + forceX11/no-sandbox flags).\n private commandArgs: string[] = []\n\n async createDescriptor(arch: Arch): Promise<SnapcraftYAML> {\n return await this.mapSnapOptionsToSnapcraftYAML(arch)\n }\n\n private isHostMode(): boolean {\n return this.options.useDestructiveMode === true\n }\n\n /** Writes the snapcraft.yaml, stages app files, then invokes `buildSnap()` to run the actual snapcraft build. */\n async buildSnap(params: { snap: SnapcraftYAML; appOutDir: string; stageDir: string; snapArch: Arch; artifactPath: string }): Promise<string[]> {\n const { snap, appOutDir, stageDir, artifactPath } = params\n\n const snapDirResolved = path.resolve(stageDir, this.configRelativePath)\n const snapcraftYamlPath = path.join(snapDirResolved, \"snapcraft.yaml\")\n\n // Create snap/gui directory for desktop files and icons\n // Snapcraft will automatically copy snap/gui/ contents to meta/gui/ in the final snap\n const guiOutput = path.resolve(stageDir, this.guiRelativePath)\n await mkdir(guiOutput, { recursive: true })\n\n const yamlContent = yaml.dump(snap, SNAPCRAFT_YAML_OPTIONS)\n await writeFile(snapcraftYamlPath, yamlContent, \"utf8\")\n log.debug(snap, \"generated snapcraft.yaml\")\n\n // Copy icon to snap/gui/ directory\n // Snapcraft will automatically copy this to meta/gui/ in the final snap\n const desktopExtraProps: Record<string, string> = {}\n const icon = this.helper.maxIconPath\n if (icon) {\n const iconFileName = `${snap.name}${path.extname(icon)}`\n await copy(icon, path.join(guiOutput, iconFileName))\n // Icon path will be available at ${SNAP}/meta/gui/<icon-file> after installation\n desktopExtraProps.Icon = `\\${SNAP}/meta/gui/${iconFileName}`\n }\n\n // Create desktop file in snap/gui/ directory\n // Snapcraft will automatically copy this to meta/gui/ in the final snap\n const desktopFilePath = path.join(guiOutput, `${this.helper.getDesktopFileName(snap.name)}.desktop`)\n await this.helper.writeDesktopEntry(this.options, this.packager.executableName + \" %U\", desktopFilePath, desktopExtraProps)\n\n // Copy app files to the project root `app` directory so `source: app`\n // in the generated `snapcraft.yaml` (which is under `snap/`) can be\n // resolved by snapcraft running in the build environment.\n const appDir = path.resolve(stageDir, \"app\")\n if (path.resolve(appDir) !== path.resolve(appOutDir)) {\n log.debug({ to: log.filePath(appDir), from: log.filePath(appOutDir) }, \"copying app files to project root app directory\")\n await copyDir(appOutDir, appDir)\n }\n\n // Drop the setuid chrome-sandbox helper before snapcraft stages the app — it is unusable under\n // strict confinement when launching with --no-sandbox (mirrors SnapCoreLegacy).\n if (this.removeChromeSandbox) {\n await remove(path.join(appDir, CHROME_SANDBOX))\n }\n\n // Write the launcher script the command always points at (see SNAP_COMMAND_LAUNCHER).\n // It lands at the snap root ($SNAP/command.sh) — it is intentionally not added to `organize`.\n const launcherPath = path.join(appDir, SNAP_COMMAND_LAUNCHER)\n await writeFile(launcherPath, buildSnapCommandLauncherScript({ execName: this.packager.executableName, args: this.commandArgs }), { mode: 0o755 })\n await chmod(launcherPath, 0o755)\n\n // Auto-generate `organize` mapping for the app part so top-level helper\n // binaries and resources are placed under `app/` inside the snap. Update\n // the already-written `snapcraft.yaml` so the build sees the mapping.\n try {\n const appPart = snap.parts[snap.name]\n if (appPart) {\n const entries = (await readdir(appOutDir)).sort()\n // Null-prototype map: entry names come from the filesystem, so a top-level file named\n // \"__proto__\" / \"constructor\" / \"toString\" must not read inherited keys (which would make\n // the membership check below skip it) or interact with Object.prototype on assignment.\n const organize: Record<string, string> = Object.assign(Object.create(null), appPart.organize)\n for (const entry of entries) {\n if (!entry) {\n continue\n }\n // Skip files no longer present in the staged app dir (e.g. removed chrome-sandbox) so\n // snapcraft doesn't fail trying to organize a missing source.\n if (this.removeChromeSandbox && entry === CHROME_SANDBOX) {\n continue\n }\n // Never organize the launcher under app/. It must stay at the snap root ($SNAP/command.sh)\n // to match apps.<name>.command. This matters when appOutDir === appDir, where readdir\n // would otherwise pick up the launcher we just wrote.\n if (entry === SNAP_COMMAND_LAUNCHER) {\n continue\n }\n if (organize[entry]) {\n continue\n }\n organize[entry] = `app/${entry}`\n }\n appPart.organize = organize\n\n const updatedYaml = yaml.dump(snap, SNAPCRAFT_YAML_OPTIONS)\n await writeFile(snapcraftYamlPath, updatedYaml, \"utf8\")\n log.debug({ organize }, \"updated snapcraft.yaml with organize mapping\")\n }\n } catch (e: any) {\n log.warn({ error: e.message }, \"failed to generate and update organize mapping\")\n }\n\n const buildMode = {\n useLXD: this.options.useLXD === true,\n useMultipass: this.options.useMultipass === true,\n useDestructiveMode: this.options.useDestructiveMode === true,\n remoteBuild: this.options.remoteBuild || undefined,\n }\n\n if (this.packager.packagerOptions.effectiveOptionComputed != null) {\n const shouldSkip = await this.packager.packagerOptions.effectiveOptionComputed({ snap, ...buildMode })\n if (shouldSkip) {\n return [artifactPath]\n }\n }\n\n const rootOptions = this.packager.config.snapcraft\n const snaps = await buildSnap({\n snapcraftConfig: snap,\n artifactPath,\n stageDir,\n packager: this.packager,\n cscLink: rootOptions?.cscLink,\n ...buildMode,\n })\n return snaps\n }\n\n /** Converts `SnapOptions24` into a fully resolved `SnapcraftYAML` descriptor for the given architecture. */\n async mapSnapOptionsToSnapcraftYAML(arch: Arch): Promise<SnapcraftYAML> {\n const appInfo = this.packager.appInfo\n const appName = this.packager.executableName.toLowerCase()\n const options = this.options\n\n // Default to [\"gnome\"] in normal builds; no extensions in host/destructive-mode (where the\n // gnome extension is incompatible). Throw if the user explicitly includes \"gnome\" in host mode.\n const hostMode = this.isHostMode()\n const extensionsList: string[] = options.extensions != null ? [...options.extensions] : hostMode ? [] : [\"gnome\"]\n if (hostMode && extensionsList.includes(\"gnome\")) {\n throw new InvalidConfigurationError(\n `The \"gnome\" snapcraft extension is incompatible with host/destructive-mode builds.\\n` +\n `In this mode snapcraft cannot resolve the extension's command-chain source ` +\n `(/usr/share/snapcraft/extensions/desktop/command-chain) and will fail.\\n\\n` +\n `To resolve this, choose one of:\\n` +\n ` 1. Remove \"gnome\" from snapcraft.core24.extensions (or set it to []) and add any\\n` +\n ` required stage-packages manually.\\n` +\n ` 2. Switch to an isolated build environment by setting snapcraft.core24.useLXD: true\\n` +\n ` or snapcraft.core24.useMultipass: true instead of useDestructiveMode.\\n\\n` +\n `See: https://snapcraft.io/docs/gnome-extension`\n )\n }\n const resolvedExtensions = extensionsList.length > 0 ? extensionsList : undefined\n const useGnomeExtension = extensionsList.includes(\"gnome\")\n\n // Create the app part\n const appPart: Part = {\n plugin: \"dump\",\n source: \"app\",\n \"build-packages\": options.buildPackages?.length ? options.buildPackages : undefined,\n \"stage-packages\": this.expandDefaultsInArray(options.stagePackages, DEFAULT_STAGE_PACKAGES),\n after: this.expandDefaultsInArray(options.after, []),\n stage: options.appPartStage?.length ? options.appPartStage : undefined,\n }\n\n // Process plugs and slots\n // When using GNOME extension, we don't need to manually configure content snaps\n // The extension will handle: gnome-46-2404, gtk-3-themes, icon-themes, sound-themes\n let rootPlugs: Record<string, any> | undefined\n let appPlugs: string[] | undefined\n\n if (useGnomeExtension) {\n // With GNOME extension, only process user-provided custom plugs\n const result = options.plugs ? this.processPlugOrSlots(options.plugs) : { root: undefined, app: undefined }\n rootPlugs = result.root\n // Extension automatically adds common plugs, so we only add custom ones\n appPlugs = result.app\n } else {\n // Without GNOME extension, we need manual content snaps\n const defaultRootPlugs: Record<string, any> = {\n \"gtk-3-themes\": {\n interface: \"content\",\n target: \"$SNAP/data-dir/themes\",\n \"default-provider\": \"gtk-common-themes\",\n },\n \"icon-themes\": {\n interface: \"content\",\n target: \"$SNAP/data-dir/icons\",\n \"default-provider\": \"gtk-common-themes\",\n },\n \"sound-themes\": {\n interface: \"content\",\n target: \"$SNAP/data-dir/sounds\",\n \"default-provider\": \"gtk-common-themes\",\n },\n \"gnome-46-2404\": {\n interface: \"content\",\n target: \"$SNAP/gnome-platform\",\n \"default-provider\": \"gnome-46-2404\",\n },\n \"gpu-2404\": {\n interface: \"content\",\n target: \"$SNAP/gpu-2404\",\n \"default-provider\": \"mesa-2404\",\n },\n }\n\n const result = options.plugs\n ? this.processPlugOrSlots(options.plugs)\n : hostMode\n ? { root: undefined, app: this.defaultPlugs }\n : {\n root: defaultRootPlugs,\n app: this.defaultPlugs,\n }\n rootPlugs = result.root\n appPlugs = result.app\n }\n\n // Always add browser-support with allow-sandbox so Chromium's internal sandbox\n // can create user namespaces under strict confinement. Without allow-sandbox: true\n // the app crashes immediately with \"FATAL: Permission denied (13)\" in credentials.cc.\n // Skip the injection only when the user has explicitly provided their own plugs\n // (they are responsible for including browser-support in that case).\n if (!options.plugs) {\n rootPlugs = { ...rootPlugs, \"browser-support\": { interface: \"browser-support\", \"allow-sandbox\": true } }\n if (!appPlugs?.includes(\"browser-support\")) {\n appPlugs = [...(appPlugs ?? []), \"browser-support\"]\n }\n }\n\n const { root: rootSlots, app: appSlots } = options.slots ? this.processPlugOrSlots(options.slots) : { root: undefined, app: undefined }\n\n // Build the effective arg list for the snap command.\n // Start with any user-supplied executableArgs, then conditionally add --no-sandbox\n // if browser-support with allow-sandbox:true is not present in the resolved plugs\n // (mirrors the same logic in SnapCoreLegacy.buildSnap).\n const extraArgs: string[] = [...(this.options.executableArgs ?? [])]\n if (this.options.forceX11 === true) {\n if (!extraArgs.includes(\"--ozone-platform=x11\")) {\n extraArgs.push(\"--ozone-platform=x11\")\n }\n }\n const noSandbox = this.helper.isElectronVersionGreaterOrEqualThan(\"5.0.0\") && !this.isBrowserSandboxAllowed(rootPlugs)\n if (noSandbox && !extraArgs.includes(\"--no-sandbox\")) {\n extraArgs.push(\"--no-sandbox\")\n }\n // With --no-sandbox the setuid chrome-sandbox helper is unused; strip it from the snap.\n this.removeChromeSandbox = noSandbox\n\n // The command always points at a generated launcher script (written in buildSnap). This keeps a\n // single uniform command path and sidesteps snapd's character/word-splitting rules for the\n // command field (e.g. --ozone-platform=x11, --js-flags=\"...\").\n this.commandArgs = extraArgs\n\n // Create the app configuration\n const desktopBaseName = this.helper.getDesktopFileName(appName)\n const app: App = {\n command: SNAP_COMMAND_LAUNCHER,\n \"command-chain\": undefined, // explicitly undefined so removeNullish strips it; extensions supply their own command-chain\n plugs: appPlugs,\n slots: appSlots,\n autostart: options.autoStart ? `${desktopBaseName}.desktop` : undefined,\n desktop: `meta/gui/${desktopBaseName}.desktop`,\n extensions: resolvedExtensions,\n }\n\n // Icon path — build-time relative path so snapcraft can find the file in snap/gui/\n await this.helper.icons\n const iconPath = this.helper.maxIconPath != null ? `snap/gui/${appName}${path.extname(this.helper.maxIconPath)}` : undefined\n\n // Process hooks if configured\n const hooksConfig = options.hooks\n const hooks = hooksConfig ? await this.processHooks(hooksConfig) : undefined\n\n // Parts configuration - the extension automatically adds a gnome/sdk part\n // Don't manually add desktop-launch when using the extension\n const parts: Record<string, Part> = {\n [appName]: appPart,\n }\n\n // Note: `organize` will be generated later in `buildSnap` based on the\n // actual contents of the built app directory so helper binaries and\n // resources are automatically moved under `app/` in the snap.\n\n // Build the snapcraft configuration\n const snapcraft: SnapcraftYAML = {\n // Required fields\n name: appName,\n base: \"core24\",\n confinement: options.confinement || \"strict\",\n parts: parts,\n\n // Architecture/Platform — only needed for cross-compilation; snapcraft 8\n // defaults to host arch and snapcraft 7 rejects this field entirely.\n ...(arch !== archFromString(process.arch)\n ? {\n platforms: {\n [toLinuxArchString(arch, \"snap\")]: {\n \"build-for\": toLinuxArchString(arch, \"snap\"),\n \"build-on\": toLinuxArchString(archFromString(process.arch), \"snap\"),\n },\n },\n }\n : {}),\n\n // Metadata - with fallbacks from appInfo\n version: appInfo.version,\n summary: options.summary || appInfo.productName,\n description: this.helper.getDescription(options),\n grade: options.grade || \"stable\",\n title: options.title || appInfo.productName,\n icon: iconPath,\n\n // Build configuration\n compression: options.compression || undefined,\n assumes: this.normalizeAssumesList(options.assumes),\n\n // Environment\n environment: this.buildEnvironment(options),\n\n // User-supplied layout always wins. Without gnome extension and not in host mode, fall back to content-snap defaults.\n layout: options.layout ?? (useGnomeExtension || hostMode ? undefined : this.buildDefaultLayout(options)),\n\n // Interfaces\n plugs: rootPlugs,\n slots: rootSlots,\n\n // Hooks\n hooks: hooks,\n\n // Apps\n apps: {\n [appName]: app,\n },\n }\n\n return removeNullish(snapcraft)\n }\n\n /**\n * Build environment variables with proper defaults\n */\n private buildEnvironment(options: SnapOptions24): Record<string, string | null> | undefined {\n const env: Record<string, string | null> = {}\n\n // Add default TMPDIR for Electron/Chromium apps\n if (!options.environment?.TMPDIR) {\n env.TMPDIR = \"$XDG_RUNTIME_DIR\"\n }\n\n if (options.environment) {\n deepAssign(env, options.environment)\n }\n\n return Object.keys(env).length > 0 ? env : undefined\n }\n\n /**\n * Build default layout for core24 with GNOME platform content snaps (non-extension mode)\n * This allows the app to access libraries from the gnome-46-2404 and mesa-2404 content snaps\n */\n private buildDefaultLayout(options: SnapOptions24): Record<string, any> | undefined {\n // If user provides custom layout, use that instead\n if (options.layout) {\n return options.layout\n }\n\n // Default layout for core24 Electron apps using GNOME content snaps WITHOUT extension\n return {\n \"/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.0\": {\n bind: \"$SNAP/gnome-platform/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.0\",\n },\n \"/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.1\": {\n bind: \"$SNAP/gnome-platform/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.1\",\n },\n \"/usr/share/xml/iso-codes\": {\n bind: \"$SNAP/gnome-platform/usr/share/xml/iso-codes\",\n },\n \"/usr/share/libdrm\": {\n bind: \"$SNAP/gpu-2404/libdrm\",\n },\n \"/usr/share/drirc.d\": {\n symlink: \"$SNAP/gpu-2404/drirc.d\",\n },\n }\n }\n\n /**\n * Process hooks directory into hook definitions\n */\n private async processHooks(hooksPath: string): Promise<Record<string, any> | undefined> {\n try {\n const buildResourcesDir = this.packager.buildResourcesDir\n const hooksDir = path.resolve(buildResourcesDir, hooksPath)\n if (!hooksDir.startsWith(buildResourcesDir + path.sep) && hooksDir !== buildResourcesDir) {\n throw new InvalidConfigurationError(`snapcraft.core24.hooks must resolve within the build resources directory (got \"${hooksDir}\")`)\n }\n const hookFiles = await readdir(hooksDir)\n\n if (hookFiles.length === 0) {\n return undefined\n }\n\n const hooks: Record<string, any> = {}\n for (const hookFile of hookFiles) {\n const hookName = path.basename(hookFile, path.extname(hookFile))\n if (!isValidKey(hookName)) {\n throw new InvalidConfigurationError(`Invalid hook name: ${hookName}`)\n }\n hooks[hookName] = {\n // Hook definitions will be populated by snapcraft from the files\n // Just register that these hooks exist\n }\n }\n\n return hooks\n } catch (e: any) {\n log.error({ message: e.message }, \"error processing Snap hooks directory\")\n throw e\n }\n }\n\n /**\n * Normalize assumes list (can be string or array)\n */\n normalizeAssumesList(assumes: Array<string> | string | Nullish): string[] | undefined {\n if (!assumes) {\n return undefined\n }\n if (typeof assumes === \"string\") {\n return [assumes]\n }\n return assumes.length > 0 ? assumes : undefined\n }\n\n /**\n * Process plugs or slots into root-level definitions and app-level references\n */\n processPlugOrSlots<T extends Array<string | SlotDescriptor | PlugDescriptor> | SlotDescriptor | PlugDescriptor | null>(\n items: T\n ): {\n root: Record<string, unknown> | undefined\n app: string[] | undefined\n } {\n if (!items || (Array.isArray(items) && items.length === 0)) {\n return { root: undefined, app: undefined }\n }\n const root: Record<string, unknown> = {}\n const app: string[] = []\n\n // Handle single descriptor object\n if (!Array.isArray(items)) {\n Object.entries(items).forEach(([name, config]) => {\n if (!isValidKey(name)) {\n throw new Error(`Invalid plug/slot name: ${name}`)\n }\n root[name] = config\n app.push(name)\n })\n return { root, app }\n }\n\n // Handle array - support \"default\" keyword\n const processedItems = this.expandDefaultsInArray(items, this.defaultPlugs)\n for (const item of processedItems ?? []) {\n if (typeof item === \"string\") {\n // Simple string reference\n app.push(item)\n } else {\n // Descriptor object with configuration\n Object.entries(item).forEach(([name, config]) => {\n if (!isValidKey(name)) {\n throw new Error(`Invalid plug/slot name: ${name}`)\n }\n root[name] = config\n app.push(name)\n })\n }\n }\n\n return { root: Object.keys(root).length > 0 ? root : undefined, app: app.length > 0 ? app : undefined }\n }\n\n private isBrowserSandboxAllowed(plugs: Record<string, any> | undefined): boolean {\n if (!plugs) {\n return false\n }\n for (const plug of Object.values(plugs)) {\n if (plug?.interface === \"browser-support\" && plug[\"allow-sandbox\"] === true) {\n return true\n }\n }\n return false\n }\n\n /**\n * Expand \"default\" keyword in arrays of anything\n */\n private expandDefaultsInArray<T>(items: T[] | Nullish, defaults: T[]): T[] | undefined {\n const result: Array<T> = []\n for (const item of items ?? []) {\n if (typeof item === \"string\" && item === \"default\") {\n result.push(...defaults)\n } else {\n result.push(item)\n }\n }\n return result.length > 0 ? result : undefined\n }\n}\n"]}
@@ -24,6 +24,6 @@ export declare class SnapCoreCustom extends SnapCore<SnapOptionsCustom> {
24
24
  stageDir: string;
25
25
  snapArch: Arch;
26
26
  artifactPath: string;
27
- }): Promise<void>;
27
+ }): Promise<string[]>;
28
28
  }
29
29
  //# sourceMappingURL=coreCustom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"coreCustom.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/coreCustom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAkC,MAAM,cAAc,CAAA;AAInE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAK9C;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAe,SAAQ,QAAQ,CAAC,iBAAiB,CAAC;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAK;IAE9B,gBAAgB,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAmBrD,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAqB3I"}
1
+ {"version":3,"file":"coreCustom.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/coreCustom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAkC,MAAM,cAAc,CAAA;AAInE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAK9C;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAe,SAAQ,QAAQ,CAAC,iBAAiB,CAAC;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAK;IAE9B,gBAAgB,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAmBrD,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAqB/I"}
@@ -47,9 +47,9 @@ export class SnapCoreCustom extends SnapCore {
47
47
  await outputFile(snapcraftYamlPath, yamlContent, "utf8");
48
48
  log.debug(snap, "using custom snapcraft.yaml (pass-through, no injection)");
49
49
  if (this.packager.packagerOptions.effectiveOptionComputed != null && (await this.packager.packagerOptions.effectiveOptionComputed({ snap }))) {
50
- return;
50
+ return [artifactPath];
51
51
  }
52
- await buildSnap({
52
+ return buildSnap({
53
53
  snapcraftConfig: snap,
54
54
  artifactPath,
55
55
  stageDir,
@@ -1 +1 @@
1
- {"version":3,"file":"coreCustom.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/coreCustom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,yBAAyB,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAEnE,OAAO,KAAK,IAAI,MAAM,SAAS,CAAA;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACzE,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAA;AAEzC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,cAAe,SAAQ,QAA2B;IAA/D;;QACW,iBAAY,GAAa,EAAE,CAAA;IA0CtC,CAAC;IAxCC,KAAK,CAAC,gBAAgB,CAAC,KAAW;QAChC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,yBAAyB,CACjC,uKAAuK,CACxK,CAAA;QACH,CAAC;QACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAA,CAAC,mGAAmG;QACrH,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;QACxE,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAA;QACzD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;YACzF,MAAM,IAAI,yBAAyB,CAAC,iFAAiF,QAAQ,IAAI,CAAC,CAAA;QACpI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAkB,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAA0G;QACxH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;QAE/C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACtD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAA;QAEtE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAA;QAC3D,MAAM,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QACxD,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,0DAA0D,CAAC,CAAA;QAE3E,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC7I,OAAM;QACR,CAAC;QAED,MAAM,SAAS,CAAC;YACd,eAAe,EAAE,IAAI;YACrB,YAAY;YACZ,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAA;IACJ,CAAC;CACF","sourcesContent":["import { Arch, InvalidConfigurationError, log } from \"builder-util\"\n\nimport * as yaml from \"js-yaml\"\nimport * as path from \"path\"\nimport { SnapOptionsCustom } from \"../../../options/SnapOptions.js\"\nimport { SnapCore } from \"./SnapTarget.js\"\nimport { SnapcraftYAML } from \"./snapcraft.js\"\nimport { buildSnap, SNAPCRAFT_YAML_OPTIONS } from \"./snapcraftBuilder.js\"\nimport _fsExtra from \"fs-extra\"\nconst { outputFile, readFile } = _fsExtra\n\n/**\n * Pass-through snap builder for `base: \"custom\"`.\n *\n * electron-builder reads the file at `snapcraft.custom.yaml` (or the inline object),\n * writes it into the stage directory, and invokes snapcraft. **Nothing is injected or\n * modified in any way** — no plugs, extensions, organize mappings, desktop files,\n * environment variables, layout entries, or stage packages. `linux.*` configuration\n * is also not cascaded into the descriptor.\n *\n * Because electron-builder exerts no control over the descriptor's content, GitHub\n * issue support for snap runtime problems encountered with custom yaml files is limited.\n * Prefer a structured base (`core24`, `core22`, etc.) for a fully managed build.\n */\nexport class SnapCoreCustom extends SnapCore<SnapOptionsCustom> {\n readonly defaultPlugs: string[] = []\n\n async createDescriptor(_arch: Arch): Promise<SnapcraftYAML> {\n const { yaml: yamlPath } = this.options\n if (!yamlPath) {\n throw new InvalidConfigurationError(\n 'snapcraft.base = \"custom\" requires an entry in snapcraft.custom.yaml (either a path to a snapcraft.yaml file or a SnapcraftYAML object directly in the configuration)'\n )\n }\n if (typeof yamlPath !== \"string\") {\n return yamlPath // fully defined SnapcraftYAML object provided directly in configuration, no file reading necessary\n }\n const resolved = path.resolve(this.packager.buildResourcesDir, yamlPath)\n const buildResourcesDir = this.packager.buildResourcesDir\n if (!resolved.startsWith(buildResourcesDir + path.sep) && resolved !== buildResourcesDir) {\n throw new InvalidConfigurationError(`snapcraft.custom.yaml must resolve within the build resources directory (got \"${resolved}\")`)\n }\n const raw = await readFile(resolved, \"utf8\")\n return yaml.load(raw) as SnapcraftYAML\n }\n\n async buildSnap(params: { snap: SnapcraftYAML; appOutDir: string; stageDir: string; snapArch: Arch; artifactPath: string }): Promise<void> {\n const { snap, stageDir, artifactPath } = params\n\n const snapDirResolved = path.resolve(stageDir, \"snap\")\n const snapcraftYamlPath = path.join(snapDirResolved, \"snapcraft.yaml\")\n\n const yamlContent = yaml.dump(snap, SNAPCRAFT_YAML_OPTIONS)\n await outputFile(snapcraftYamlPath, yamlContent, \"utf8\")\n log.debug(snap, \"using custom snapcraft.yaml (pass-through, no injection)\")\n\n if (this.packager.packagerOptions.effectiveOptionComputed != null && (await this.packager.packagerOptions.effectiveOptionComputed({ snap }))) {\n return\n }\n\n await buildSnap({\n snapcraftConfig: snap,\n artifactPath,\n stageDir,\n packager: this.packager,\n })\n }\n}\n"]}
1
+ {"version":3,"file":"coreCustom.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/coreCustom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,yBAAyB,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAEnE,OAAO,KAAK,IAAI,MAAM,SAAS,CAAA;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACzE,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAA;AAEzC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,cAAe,SAAQ,QAA2B;IAA/D;;QACW,iBAAY,GAAa,EAAE,CAAA;IA0CtC,CAAC;IAxCC,KAAK,CAAC,gBAAgB,CAAC,KAAW;QAChC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,yBAAyB,CACjC,uKAAuK,CACxK,CAAA;QACH,CAAC;QACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAA,CAAC,mGAAmG;QACrH,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;QACxE,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAA;QACzD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;YACzF,MAAM,IAAI,yBAAyB,CAAC,iFAAiF,QAAQ,IAAI,CAAC,CAAA;QACpI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAkB,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAA0G;QACxH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;QAE/C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACtD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAA;QAEtE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAA;QAC3D,MAAM,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QACxD,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,0DAA0D,CAAC,CAAA;QAE3E,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC7I,OAAO,CAAC,YAAY,CAAC,CAAA;QACvB,CAAC;QAED,OAAO,SAAS,CAAC;YACf,eAAe,EAAE,IAAI;YACrB,YAAY;YACZ,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAA;IACJ,CAAC;CACF","sourcesContent":["import { Arch, InvalidConfigurationError, log } from \"builder-util\"\n\nimport * as yaml from \"js-yaml\"\nimport * as path from \"path\"\nimport { SnapOptionsCustom } from \"../../../options/SnapOptions.js\"\nimport { SnapCore } from \"./SnapTarget.js\"\nimport { SnapcraftYAML } from \"./snapcraft.js\"\nimport { buildSnap, SNAPCRAFT_YAML_OPTIONS } from \"./snapcraftBuilder.js\"\nimport _fsExtra from \"fs-extra\"\nconst { outputFile, readFile } = _fsExtra\n\n/**\n * Pass-through snap builder for `base: \"custom\"`.\n *\n * electron-builder reads the file at `snapcraft.custom.yaml` (or the inline object),\n * writes it into the stage directory, and invokes snapcraft. **Nothing is injected or\n * modified in any way** — no plugs, extensions, organize mappings, desktop files,\n * environment variables, layout entries, or stage packages. `linux.*` configuration\n * is also not cascaded into the descriptor.\n *\n * Because electron-builder exerts no control over the descriptor's content, GitHub\n * issue support for snap runtime problems encountered with custom yaml files is limited.\n * Prefer a structured base (`core24`, `core22`, etc.) for a fully managed build.\n */\nexport class SnapCoreCustom extends SnapCore<SnapOptionsCustom> {\n readonly defaultPlugs: string[] = []\n\n async createDescriptor(_arch: Arch): Promise<SnapcraftYAML> {\n const { yaml: yamlPath } = this.options\n if (!yamlPath) {\n throw new InvalidConfigurationError(\n 'snapcraft.base = \"custom\" requires an entry in snapcraft.custom.yaml (either a path to a snapcraft.yaml file or a SnapcraftYAML object directly in the configuration)'\n )\n }\n if (typeof yamlPath !== \"string\") {\n return yamlPath // fully defined SnapcraftYAML object provided directly in configuration, no file reading necessary\n }\n const resolved = path.resolve(this.packager.buildResourcesDir, yamlPath)\n const buildResourcesDir = this.packager.buildResourcesDir\n if (!resolved.startsWith(buildResourcesDir + path.sep) && resolved !== buildResourcesDir) {\n throw new InvalidConfigurationError(`snapcraft.custom.yaml must resolve within the build resources directory (got \"${resolved}\")`)\n }\n const raw = await readFile(resolved, \"utf8\")\n return yaml.load(raw) as SnapcraftYAML\n }\n\n async buildSnap(params: { snap: SnapcraftYAML; appOutDir: string; stageDir: string; snapArch: Arch; artifactPath: string }): Promise<string[]> {\n const { snap, stageDir, artifactPath } = params\n\n const snapDirResolved = path.resolve(stageDir, \"snap\")\n const snapcraftYamlPath = path.join(snapDirResolved, \"snapcraft.yaml\")\n\n const yamlContent = yaml.dump(snap, SNAPCRAFT_YAML_OPTIONS)\n await outputFile(snapcraftYamlPath, yamlContent, \"utf8\")\n log.debug(snap, \"using custom snapcraft.yaml (pass-through, no injection)\")\n\n if (this.packager.packagerOptions.effectiveOptionComputed != null && (await this.packager.packagerOptions.effectiveOptionComputed({ snap }))) {\n return [artifactPath]\n }\n\n return buildSnap({\n snapcraftConfig: snap,\n artifactPath,\n stageDir,\n packager: this.packager,\n })\n }\n}\n"]}
@@ -17,7 +17,7 @@ export declare class SnapCoreLegacy extends SnapCore<SnapOptionsLegacy & {
17
17
  stageDir: string;
18
18
  snapArch: Arch;
19
19
  artifactPath: string;
20
- }): Promise<void>;
20
+ }): Promise<string[]>;
21
21
  private buildWithTemplate;
22
22
  private buildWithoutTemplate;
23
23
  private stageSnapFiles;
@@ -1 +1 @@
1
- {"version":3,"file":"coreLegacy.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/coreLegacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,IAAI,EAAmF,MAAM,cAAc,CAAA;AAMvJ,OAAO,EAAkB,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAKnF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAK9C,OAAO,EAAE,UAAU,EAAE,CAAA;AAkBrB,qBAAa,cAAe,SAAQ,QAAQ,CAAC,iBAAiB,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,CAAC;IACxG,OAAO,CAAC,gBAAgB,CAAQ;IAEhC,YAAY,WAAyJ;IAErK,OAAO,CAAC,cAAc;IAQhB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IA8IpD,SAAS,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YA+EjH,iBAAiB;YA+CjB,oBAAoB;YAoCpB,cAAc;IA4B5B,OAAO,CAAC,0BAA0B;IAmBlC,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,iBAAiB;CAe1B;AAaD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,CAU3H"}
1
+ {"version":3,"file":"coreLegacy.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/coreLegacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,IAAI,EAAmF,MAAM,cAAc,CAAA;AAMvJ,OAAO,EAAkB,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAMnF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAK9C,OAAO,EAAE,UAAU,EAAE,CAAA;AAkBrB,qBAAa,cAAe,SAAQ,QAAQ,CAAC,iBAAiB,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,CAAC;IACxG,OAAO,CAAC,gBAAgB,CAAQ;IAEhC,YAAY,WAAyJ;IAErK,OAAO,CAAC,cAAc;IAQhB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IA8IpD,SAAS,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAgFrH,iBAAiB;YA+CjB,oBAAoB;YAoCpB,cAAc;IA4B5B,OAAO,CAAC,0BAA0B;IAmBlC,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,iBAAiB;CAe1B;AAaD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,CAS3H"}
@@ -8,6 +8,7 @@ import { getAppImageTools } from "../../../toolsets/appimage.js";
8
8
  import { downloadBuilderToolset } from "../../../util/electronGet.js";
9
9
  import { isSnapDestructiveMode } from "../../../util/flags.js";
10
10
  import { getTemplatePath } from "../../../util/pathManager.js";
11
+ import { buildLauncherScript } from "../launcherScript.js";
11
12
  import { SnapCore } from "./SnapTarget.js";
12
13
  import { shellQuote } from "./snapCommand.js";
13
14
  import { DEFAULT_STAGE_PACKAGES } from "./snapcraftBuilder.js";
@@ -221,7 +222,7 @@ export class SnapCoreLegacy extends SnapCore {
221
222
  }
222
223
  }
223
224
  if (this.packager.packagerOptions.effectiveOptionComputed != null && (await this.packager.packagerOptions.effectiveOptionComputed({ snap, desktopFile, args }))) {
224
- return;
225
+ return [artifactPath];
225
226
  }
226
227
  await outputFile(path.join(snapMetaDir, this.isUseTemplateApp ? "snap.yaml" : "snapcraft.yaml"), serializeToYaml(snap));
227
228
  const hooksDir = await this.packager.getResource(this.options.hooks, "snap-hooks");
@@ -236,6 +237,7 @@ export class SnapCoreLegacy extends SnapCore {
236
237
  else {
237
238
  await this.buildWithoutTemplate({ appOutDir, stageDir, artifactPath, hooksDir, extraAppArgs });
238
239
  }
240
+ return [artifactPath];
239
241
  }
240
242
  async buildWithTemplate(opts) {
241
243
  const { appOutDir, stageDir, snapArch, artifactPath, compression, hooksDir, extraAppArgs } = opts;
@@ -391,11 +393,10 @@ export function buildCommandShContent(opts) {
391
393
  const { isTemplate, executableName, extraAppArgs } = opts;
392
394
  validateShellEmbeddable(executableName, "executableName");
393
395
  const appPrefix = isTemplate ? "" : "app/";
394
- let content = `#!/bin/bash -e\nexec "$SNAP/desktop-init.sh" "$SNAP/desktop-common.sh" "$SNAP/desktop-gnome-specific.sh" "$SNAP/${appPrefix}${executableName}"`;
395
- if (extraAppArgs.length > 0) {
396
- content += " " + extraAppArgs.map(shellQuote).join(" ");
397
- }
398
- content += ' "$@"';
399
- return content;
396
+ return buildLauncherScript({
397
+ shebang: "#!/bin/bash -e",
398
+ command: ['"$SNAP/desktop-init.sh"', '"$SNAP/desktop-common.sh"', '"$SNAP/desktop-gnome-specific.sh"', `"$SNAP/${appPrefix}${executableName}"`],
399
+ args: extraAppArgs,
400
+ });
400
401
  }
401
402
  //# sourceMappingURL=coreLegacy.js.map