app-builder-lib 27.0.0-alpha.3 → 27.0.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/codeSign/win/signtoolBaseSignManager.d.ts.map +1 -1
- package/dist/codeSign/win/signtoolBaseSignManager.js +9 -2
- package/dist/codeSign/win/signtoolBaseSignManager.js.map +1 -1
- package/dist/configuration.d.ts +3 -3
- package/dist/configuration.js.map +1 -1
- package/dist/indexInternal.d.ts +1 -1
- package/dist/indexInternal.d.ts.map +1 -1
- package/dist/indexInternal.js +1 -1
- package/dist/indexInternal.js.map +1 -1
- package/dist/macPackager.d.ts +5 -0
- package/dist/macPackager.d.ts.map +1 -1
- package/dist/macPackager.js +35 -0
- package/dist/macPackager.js.map +1 -1
- package/dist/node-module-collector/moduleManager.d.ts +2 -1
- package/dist/node-module-collector/moduleManager.d.ts.map +1 -1
- package/dist/node-module-collector/moduleManager.js +2 -0
- package/dist/node-module-collector/moduleManager.js.map +1 -1
- package/dist/node-module-collector/nodeModulesCollector.d.ts +13 -23
- package/dist/node-module-collector/nodeModulesCollector.d.ts.map +1 -1
- package/dist/node-module-collector/nodeModulesCollector.js +52 -122
- package/dist/node-module-collector/nodeModulesCollector.js.map +1 -1
- package/dist/node-module-collector/types.d.ts +2 -0
- package/dist/node-module-collector/types.d.ts.map +1 -1
- package/dist/node-module-collector/types.js.map +1 -1
- package/dist/options/linuxOptions.d.ts +0 -10
- package/dist/options/linuxOptions.d.ts.map +1 -1
- package/dist/options/linuxOptions.js.map +1 -1
- package/dist/packager.js +1 -1
- package/dist/packager.js.map +1 -1
- package/dist/platformPackager.d.ts +1 -0
- package/dist/platformPackager.d.ts.map +1 -1
- package/dist/platformPackager.js +5 -6
- package/dist/platformPackager.js.map +1 -1
- package/dist/targets/linux/FlatpakTarget.d.ts.map +1 -1
- package/dist/targets/linux/FlatpakTarget.js +4 -1
- package/dist/targets/linux/FlatpakTarget.js.map +1 -1
- package/dist/targets/linux/FpmTarget.d.ts +6 -0
- package/dist/targets/linux/FpmTarget.d.ts.map +1 -1
- package/dist/targets/linux/FpmTarget.js +25 -3
- package/dist/targets/linux/FpmTarget.js.map +1 -1
- package/dist/targets/linux/LinuxTargetHelper.d.ts +14 -0
- package/dist/targets/linux/LinuxTargetHelper.d.ts.map +1 -1
- package/dist/targets/linux/LinuxTargetHelper.js +38 -59
- package/dist/targets/linux/LinuxTargetHelper.js.map +1 -1
- package/dist/targets/linux/appimage/AppImageTarget.d.ts +1 -0
- package/dist/targets/linux/appimage/AppImageTarget.d.ts.map +1 -1
- package/dist/targets/linux/appimage/AppImageTarget.js +8 -9
- package/dist/targets/linux/appimage/AppImageTarget.js.map +1 -1
- package/dist/targets/linux/appimage/appImageUtil.d.ts +4 -0
- package/dist/targets/linux/appimage/appImageUtil.d.ts.map +1 -1
- package/dist/targets/linux/appimage/appImageUtil.js +11 -4
- package/dist/targets/linux/appimage/appImageUtil.js.map +1 -1
- package/dist/targets/linux/appimage/appLauncher.d.ts.map +1 -1
- package/dist/targets/linux/appimage/appLauncher.js +5 -11
- package/dist/targets/linux/appimage/appLauncher.js.map +1 -1
- package/dist/targets/linux/launcherScript.d.ts +32 -0
- package/dist/targets/linux/launcherScript.d.ts.map +1 -0
- package/dist/targets/linux/launcherScript.js +24 -0
- package/dist/targets/linux/launcherScript.js.map +1 -0
- package/dist/targets/linux/snap/coreLegacy.d.ts.map +1 -1
- package/dist/targets/linux/snap/coreLegacy.js +6 -6
- package/dist/targets/linux/snap/coreLegacy.js.map +1 -1
- package/dist/targets/linux/snap/snapCommand.d.ts +2 -2
- package/dist/targets/linux/snap/snapCommand.d.ts.map +1 -1
- package/dist/targets/linux/snap/snapCommand.js +4 -10
- package/dist/targets/linux/snap/snapCommand.js.map +1 -1
- package/dist/targets/win/AppxTarget.d.ts.map +1 -1
- package/dist/targets/win/AppxTarget.js +6 -6
- package/dist/targets/win/AppxTarget.js.map +1 -1
- package/dist/targets/win/MsiTarget.d.ts.map +1 -1
- package/dist/targets/win/MsiTarget.js +8 -11
- package/dist/targets/win/MsiTarget.js.map +1 -1
- package/dist/targets/win/nsis/NsisTarget.js +3 -3
- package/dist/targets/win/nsis/NsisTarget.js.map +1 -1
- package/dist/targets/win/nsis/nsisScriptGenerator.js +1 -1
- package/dist/targets/win/nsis/nsisScriptGenerator.js.map +1 -1
- package/dist/toolsets/icons.d.ts.map +1 -1
- package/dist/toolsets/icons.js +10 -2
- package/dist/toolsets/icons.js.map +1 -1
- package/dist/util/appFileCopier.d.ts.map +1 -1
- package/dist/util/appFileCopier.js +9 -4
- package/dist/util/appFileCopier.js.map +1 -1
- package/dist/util/archCompatibility.d.ts +42 -0
- package/dist/util/archCompatibility.d.ts.map +1 -0
- package/dist/util/archCompatibility.js +202 -0
- package/dist/util/archCompatibility.js.map +1 -0
- package/dist/util/installOrRebuild.d.ts +38 -0
- package/dist/util/installOrRebuild.d.ts.map +1 -0
- package/dist/util/{yarn.js → installOrRebuild.js} +65 -14
- package/dist/util/installOrRebuild.js.map +1 -0
- package/dist/util/langs.d.ts.map +1 -1
- package/dist/util/langs.js +1 -0
- package/dist/util/langs.js.map +1 -1
- package/dist/util/mac/macosIconComposer.d.ts +2 -1
- package/dist/util/mac/macosIconComposer.d.ts.map +1 -1
- package/dist/util/mac/macosIconComposer.js +40 -58
- package/dist/util/mac/macosIconComposer.js.map +1 -1
- package/dist/util/streamSpawnToFile.d.ts +47 -0
- package/dist/util/streamSpawnToFile.d.ts.map +1 -0
- package/dist/util/streamSpawnToFile.js +110 -0
- package/dist/util/streamSpawnToFile.js.map +1 -0
- package/dist/util/toolsetLock.d.ts +2 -0
- package/dist/util/toolsetLock.d.ts.map +1 -1
- package/dist/util/toolsetLock.js +31 -5
- package/dist/util/toolsetLock.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +8 -8
- package/scheme.json +3 -8
- package/templates/appx/appxmanifest.xml +1 -2
- package/templates/nsis/assistedMessages.yml +17 -0
- package/templates/nsis/messages.yml +5 -0
- package/dist/util/yarn.d.ts +0 -23
- package/dist/util/yarn.d.ts.map +0 -1
- package/dist/util/yarn.js.map +0 -1
|
@@ -7,6 +7,8 @@ interface Options {
|
|
|
7
7
|
productName: string;
|
|
8
8
|
productFilename: string;
|
|
9
9
|
executableName: string;
|
|
10
|
+
/** Arguments injected into the AppRun launcher (the .desktop Exec key stays `AppRun %U`). */
|
|
11
|
+
executableArgs?: ReadonlyArray<string>;
|
|
10
12
|
desktopEntry: string;
|
|
11
13
|
icons: IconInfo[];
|
|
12
14
|
license?: string | null;
|
|
@@ -46,6 +48,8 @@ export type AppRunScriptBase = {
|
|
|
46
48
|
ProductName: string;
|
|
47
49
|
ResourceName: string;
|
|
48
50
|
MimeTypeFile?: string;
|
|
51
|
+
/** Arguments injected into the launcher, so the .desktop Exec key stays `AppRun %U`. */
|
|
52
|
+
ExecutableArgs?: ReadonlyArray<string>;
|
|
49
53
|
};
|
|
50
54
|
export type AppRunScriptWithEula = AppRunScriptBase & {
|
|
51
55
|
EulaFile: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appImageUtil.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/appImageUtil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmE,MAAM,cAAc,CAAA;AAGpG,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"appImageUtil.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/appImageUtil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmE,MAAM,cAAc,CAAA;AAGpG,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAKrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AAEzD,UAAU,OAAO;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,6FAA6F;IAC7F,cAAc,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACtC,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACpC,sGAAsG;IACtG,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAsB,0BAA0B,CAAC,mBAAmB,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAyChL;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqC9H;AA4BD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAM/E;AAkED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,wFAAwF;IACxF,cAAc,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,oBAAoB,CAAA;AAMlE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAoKjE"}
|
|
@@ -3,6 +3,7 @@ import fs from "fs-extra";
|
|
|
3
3
|
import * as path from "path";
|
|
4
4
|
import { getAppImageTools } from "../../../toolsets/appimage.js";
|
|
5
5
|
import { copyIcons, copyMimeTypes } from "./appLauncher.js";
|
|
6
|
+
import { shellQuote } from "../launcherScript.js";
|
|
6
7
|
import { appendBlockmap } from "../../differentialUpdateInfoBuilder.js";
|
|
7
8
|
import { APP_RUN_ENTRYPOINT } from "./AppImageTarget.js";
|
|
8
9
|
export async function buildStaticRuntimeAppImage(appimageToolVersion, opts, resourcesDir) {
|
|
@@ -108,7 +109,7 @@ export function validateCriticalPathString(str, fieldName) {
|
|
|
108
109
|
}
|
|
109
110
|
}
|
|
110
111
|
async function writeAppLauncherAndRelatedFiles(opts) {
|
|
111
|
-
const { stageDir, options: { license, executableName, productFilename, productName, desktopEntry, desktopBaseName }, } = opts;
|
|
112
|
+
const { stageDir, options: { license, executableName, executableArgs, productFilename, productName, desktopEntry, desktopBaseName }, } = opts;
|
|
112
113
|
// executableName and productFilename are embedded directly into double-quoted bash strings
|
|
113
114
|
// and used as filesystem paths, so they must pass the whitelist.
|
|
114
115
|
// productName is not validated here because it is only ever passed through escapeShellString().
|
|
@@ -121,6 +122,7 @@ async function writeAppLauncherAndRelatedFiles(opts) {
|
|
|
121
122
|
const templateConfig = {
|
|
122
123
|
DesktopFileName: desktopFileName,
|
|
123
124
|
ExecutableName: executableName,
|
|
125
|
+
ExecutableArgs: executableArgs,
|
|
124
126
|
ProductName: productName,
|
|
125
127
|
ProductFilename: productFilename,
|
|
126
128
|
ResourceName: `appimagekit-${executableName}`,
|
|
@@ -159,6 +161,9 @@ function hasEula(config) {
|
|
|
159
161
|
}
|
|
160
162
|
export function generateAppRunScript(config) {
|
|
161
163
|
const eulaEnabled = hasEula(config);
|
|
164
|
+
// executableArgs are baked into the launcher (single-quoted) rather than the .desktop Exec key,
|
|
165
|
+
// consistent with the other Linux targets. "$@" still forwards launch-time arguments.
|
|
166
|
+
const executableArgsLiteral = (config.ExecutableArgs ?? []).map(shellQuote).join(" ");
|
|
162
167
|
return `#!/usr/bin/env bash
|
|
163
168
|
set -e
|
|
164
169
|
|
|
@@ -189,6 +194,8 @@ export LD_LIBRARY_PATH="\${APPDIR}/usr/lib\${LD_LIBRARY_PATH:+:\${LD_LIBRARY_PAT
|
|
|
189
194
|
export GSETTINGS_SCHEMA_DIR="\${APPDIR}/usr/share/glib-2.0/schemas\${GSETTINGS_SCHEMA_DIR:+:\${GSETTINGS_SCHEMA_DIR}}"
|
|
190
195
|
|
|
191
196
|
BIN="$APPDIR/${config.ExecutableName}"
|
|
197
|
+
# Configured executableArgs, applied ahead of any launch-time arguments.
|
|
198
|
+
EXECUTABLE_ARGS=(${executableArgsLiteral})
|
|
192
199
|
|
|
193
200
|
if [ -z "$APPIMAGE_EXIT_AFTER_INSTALL" ] ; then
|
|
194
201
|
trap atexit EXIT
|
|
@@ -197,7 +204,7 @@ fi
|
|
|
197
204
|
isEulaAccepted=1
|
|
198
205
|
|
|
199
206
|
HAVE_NO_SANDBOX=0
|
|
200
|
-
for arg in "\${args[@]}" ; do
|
|
207
|
+
for arg in "\${EXECUTABLE_ARGS[@]}" "\${args[@]}" ; do
|
|
201
208
|
if [ "$arg" = --no-sandbox ] ; then
|
|
202
209
|
HAVE_NO_SANDBOX=1
|
|
203
210
|
break
|
|
@@ -222,9 +229,9 @@ atexit()
|
|
|
222
229
|
{
|
|
223
230
|
if [ $isEulaAccepted == 1 ] ; then
|
|
224
231
|
if [ $NUMBER_OF_ARGS -eq 0 ] ; then
|
|
225
|
-
exec "$BIN" "\${NO_SANDBOX[@]}"
|
|
232
|
+
exec "$BIN" "\${NO_SANDBOX[@]}" "\${EXECUTABLE_ARGS[@]}"
|
|
226
233
|
else
|
|
227
|
-
exec "$BIN" "\${NO_SANDBOX[@]}" "\${args[@]}"
|
|
234
|
+
exec "$BIN" "\${NO_SANDBOX[@]}" "\${EXECUTABLE_ARGS[@]}" "\${args[@]}"
|
|
228
235
|
fi
|
|
229
236
|
fi
|
|
230
237
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appImageUtil.js","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/appImageUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, copyDir, copyFile, exec, exists, InvalidConfigurationError, log } from \"builder-util\"\nimport fs from \"fs-extra\"\nimport * as path from \"path\"\nimport { FileAssociation } from \"../../../options/FileAssociation.js\"\nimport { getAppImageTools } from \"../../../toolsets/appimage.js\"\nimport { copyIcons, copyMimeTypes } from \"./appLauncher.js\"\nimport { appendBlockmap } from \"../../differentialUpdateInfoBuilder.js\"\nimport { BlockMapDataHolder } from \"builder-util-runtime\"\nimport { APP_RUN_ENTRYPOINT } from \"./AppImageTarget.js\"\nimport { ToolsetConfig } from \"../../../configuration.js\"\nimport { IconInfo } from \"../../../util/iconConverter.js\"\n\ninterface Options {\n productName: string\n productFilename: string\n executableName: string\n desktopEntry: string\n icons: IconInfo[]\n license?: string | null\n fileAssociations: FileAssociation[]\n /**\n * The compression type available for static runtime is limited as it's only compiled with support for gzip and zstd.\n * \"xz\" is only valid for the legacy FUSE2 (0.0.0) toolset.\n *\n * [stderr] Squashfs image uses lzo compression, this version supports only zlib, zstd.\n * Failed to open squashfs image\n * Failed to extract AppImage\n *\n */\n compression?: \"gzip\" | \"zstd\" | \"xz\"\n /** Pre-computed desktop basename (already validated). When absent, falls back to `executableName`. */\n desktopBaseName?: string\n}\n\nexport interface AppImageBuilderOptions {\n appDir: string\n stageDir: string\n arch: Arch\n output: string\n options: Options\n}\n\nexport async function buildStaticRuntimeAppImage(appimageToolVersion: ToolsetConfig[\"appimage\"], opts: AppImageBuilderOptions, resourcesDir: string): Promise<BlockMapDataHolder> {\n const { stageDir, output, appDir, options, arch } = opts\n\n try {\n await fs.remove(output)\n\n // Write AppRun launcher and related files\n await writeAppLauncherAndRelatedFiles(opts)\n\n const { runtimeLibraries: libraries, runtime, mksquashfs } = await getAppImageTools(appimageToolVersion, arch, resourcesDir)\n await copyDir(libraries, path.join(stageDir, \"usr\", \"lib\"))\n\n // Copy app directory to stage\n // mksquashfs doesn't support merging, so we copy the entire app dir\n await copyDir(appDir, stageDir)\n\n const runtimeData = await fs.readFile(runtime)\n\n // Create squashfs with offset for runtime\n const args: string[] = [stageDir, output, \"-offset\", runtimeData.length.toString(), \"-all-root\", \"-noappend\", \"-no-progress\", \"-quiet\", \"-no-xattrs\", \"-no-fragments\"]\n if (options.compression) {\n args.push(\"-comp\", options.compression)\n }\n await exec(mksquashfs, args, {\n cwd: stageDir,\n })\n\n // Write runtime data at the beginning of the file\n await writeRuntimeData(output, runtimeData)\n\n // Make executable\n await fs.chmod(output, 0o755)\n\n // Append blockmap inside try block to ensure cleanup on failure\n const updateInfo = await appendBlockmap(output)\n return updateInfo\n } catch (error) {\n // Clean up partial build on failure\n await fs.remove(output).catch(() => {})\n throw error\n }\n}\n\nexport async function buildLegacyFuse2AppImage(opts: AppImageBuilderOptions, resourcesDir: string): Promise<BlockMapDataHolder> {\n const { stageDir, output, appDir, options, arch } = opts\n\n try {\n await fs.remove(output)\n\n await writeAppLauncherAndRelatedFiles(opts)\n\n const { runtime, mksquashfs, runtimeLibraries } = await getAppImageTools(\"0.0.0\", arch, resourcesDir)\n // Mirror the app-builder-lib Go implementation: bundle lib/<arch> into usr/lib for x64 and ia32.\n // arm targets don't have a dedicated lib dir in the FUSE2 toolset.\n if (arch === Arch.x64 || arch === Arch.ia32) {\n await copyDir(runtimeLibraries, path.join(stageDir, \"usr\", \"lib\"))\n }\n await copyDir(appDir, stageDir)\n\n const runtimeData = await fs.readFile(runtime)\n\n const args: string[] = [stageDir, output, \"-offset\", runtimeData.length.toString(), \"-all-root\", \"-noappend\", \"-no-progress\", \"-quiet\", \"-no-xattrs\", \"-no-fragments\"]\n if (options.compression) {\n args.push(\"-comp\", options.compression)\n if (options.compression === \"xz\") {\n // Match the dictionary/block-size settings used by the original app-builder Go implementation\n args.push(\"-Xdict-size\", \"100%\", \"-b\", \"1048576\")\n }\n }\n await exec(mksquashfs, args, { cwd: stageDir })\n\n await writeRuntimeData(output, runtimeData)\n await fs.chmod(output, 0o755)\n\n const updateInfo = await appendBlockmap(output)\n return updateInfo\n } catch (error) {\n await fs.remove(output).catch(() => {})\n throw error\n }\n}\n\nasync function writeRuntimeData(filePath: string, runtimeData: Buffer): Promise<void> {\n const fd = await fs.open(filePath, \"r+\")\n try {\n await fs.write(fd, runtimeData, 0, runtimeData.length, 0)\n } finally {\n try {\n await fs.close(fd)\n } catch (closeError: any) {\n // Log but don't throw - preserve original error if any\n log.warn({ message: closeError.message, file: filePath }, `failed to close file descriptor`)\n }\n }\n}\n\n/**\n * Escapes a string for safe use in shell scripts by wrapping in single quotes\n * and escaping any single quotes within the string.\n *\n * This allows strings with spaces, special characters, etc. to be safely used.\n */\nfunction escapeShellString(str: string): string {\n // Escape single quotes by replacing ' with '\\''\n // Then wrap the whole string in single quotes\n return `'${str.replace(/'/g, \"'\\\\''\")}'`\n}\n\n/**\n * Validates that critical path fields (executable name, product filename, license filename)\n * contain only characters that are safe for use in filesystem paths and embedded bash strings.\n * Allowed: Unicode letters, digits, dots, underscores, hyphens, and spaces.\n */\nexport function validateCriticalPathString(str: string, fieldName: string): void {\n if (!/^[\\p{L}\\p{N}._\\- ]+$/u.test(str)) {\n throw new InvalidConfigurationError(\n `${fieldName} contains characters that cannot be safely used in file paths: ${str}. Please use only letters, digits, hyphens, underscores, dots, and spaces.`\n )\n }\n}\n\nasync function writeAppLauncherAndRelatedFiles(opts: AppImageBuilderOptions): Promise<void> {\n const {\n stageDir,\n options: { license, executableName, productFilename, productName, desktopEntry, desktopBaseName },\n } = opts\n\n // executableName and productFilename are embedded directly into double-quoted bash strings\n // and used as filesystem paths, so they must pass the whitelist.\n // productName is not validated here because it is only ever passed through escapeShellString().\n validateCriticalPathString(executableName, \"executableName\")\n validateCriticalPathString(productFilename, \"productFilename\")\n\n // Write desktop file\n const desktopFileName = `${desktopBaseName ?? executableName}.desktop`\n await fs.writeFile(path.join(stageDir, desktopFileName), desktopEntry, { mode: 0o644 })\n await copyIcons(opts)\n\n const templateConfig: AppRunScriptBase = {\n DesktopFileName: desktopFileName,\n ExecutableName: executableName,\n ProductName: productName,\n ProductFilename: productFilename,\n ResourceName: `appimagekit-${executableName}`,\n }\n\n const mimeTypeFile = await copyMimeTypes(stageDir, opts.options)\n if (mimeTypeFile) {\n templateConfig.MimeTypeFile = mimeTypeFile\n }\n\n let finalConfig: AppRunScript = templateConfig\n\n // Copy license file if provided\n if (license) {\n // Validate license file exists\n if (!(await exists(license))) {\n throw new InvalidConfigurationError(`License file not found: ${license}`)\n }\n\n const licenseBaseName = path.basename(license)\n const ext = path.extname(license).toLowerCase()\n\n // Validate license filename for path safety\n validateCriticalPathString(licenseBaseName, \"licenseBaseName\")\n\n // Validate extension\n if (![\".txt\", \".html\"].includes(ext)) {\n log.warn({ license, expected: \".txt or .html\" }, `license file has unexpected extension`)\n }\n\n await copyFile(license, path.join(stageDir, licenseBaseName))\n\n finalConfig = {\n ...templateConfig,\n EulaFile: licenseBaseName,\n IsHtmlEula: ext === \".html\",\n }\n }\n\n const appRunContent = generateAppRunScript(finalConfig)\n await fs.writeFile(path.join(stageDir, APP_RUN_ENTRYPOINT), appRunContent, { mode: 0o755 })\n}\n\nexport type AppRunScriptBase = {\n ExecutableName: string\n DesktopFileName: string\n ProductFilename: string\n ProductName: string\n ResourceName: string\n MimeTypeFile?: string\n}\n\nexport type AppRunScriptWithEula = AppRunScriptBase & {\n EulaFile: string\n IsHtmlEula: boolean\n}\n\nexport type AppRunScript = AppRunScriptBase | AppRunScriptWithEula\n\nfunction hasEula(config: AppRunScript): config is AppRunScriptWithEula {\n return \"EulaFile\" in config && typeof config.EulaFile === \"string\"\n}\n\nexport function generateAppRunScript(config: AppRunScript): string {\n const eulaEnabled = hasEula(config)\n\n return `#!/usr/bin/env bash\nset -e\n\nTHIS=\"$0\"\n# http://stackoverflow.com/questions/3190818/\nargs=(\"$@\")\nNUMBER_OF_ARGS=\"$#\"\n\nif [ -z \"$APPDIR\" ] ; then\n # Find the AppDir. It is the directory that contains AppRun.\n # This assumes that this script resides inside the AppDir or a subdirectory.\n # If this script is run inside an AppImage, then the AppImage runtime likely has already set $APPDIR\n path=\"$(dirname \"$(readlink -f \"\\${THIS}\")\")\"\n while [[ \"$path\" != \"\" && ! -e \"$path/${APP_RUN_ENTRYPOINT}\" ]]; do\n path=\\${path%/*}\n done\n APPDIR=\"$path\"\nfi\n\nif [ -z \"$APPDIR\" ] ; then\n echo \"ERROR: could not locate the AppDir. Ensure this script is run from within a properly structured AppImage.\" >&2\n exit 1\nfi\n\nexport PATH=\"\\${APPDIR}:\\${APPDIR}/usr/sbin\\${PATH:+:\\${PATH}}\"\nexport XDG_DATA_DIRS=\"\\${APPDIR}/usr/share/\\${XDG_DATA_DIRS:+:\\${XDG_DATA_DIRS}}:/usr/share/gnome:/usr/local/share/:/usr/share/\"\nexport LD_LIBRARY_PATH=\"\\${APPDIR}/usr/lib\\${LD_LIBRARY_PATH:+:\\${LD_LIBRARY_PATH}}\"\nexport GSETTINGS_SCHEMA_DIR=\"\\${APPDIR}/usr/share/glib-2.0/schemas\\${GSETTINGS_SCHEMA_DIR:+:\\${GSETTINGS_SCHEMA_DIR}}\"\n\nBIN=\"$APPDIR/${config.ExecutableName}\"\n\nif [ -z \"$APPIMAGE_EXIT_AFTER_INSTALL\" ] ; then\n trap atexit EXIT\nfi\n\nisEulaAccepted=1\n\nHAVE_NO_SANDBOX=0\nfor arg in \"\\${args[@]}\" ; do\n if [ \"$arg\" = --no-sandbox ] ; then\n HAVE_NO_SANDBOX=1\n break\n fi\ndone\nNO_SANDBOX=()\n# Use 'unshare -Ur true' as a heuristic to detect whether user namespaces are available.\n# Notes:\n# - When running as root, this check will always succeed even if the sandbox configuration\n# actually relies on unprivileged user namespaces. In practice, Chrome/Electron usually\n# disables or adjusts the sandbox separately when running as root, so this probe is mostly\n# a no-op in that scenario.\n# - On minimal systems (e.g. Alpine or stripped-down containers) 'unshare' may not exist.\n# In that case the shell will return exit code 127 (\"command not found\"), which will cause\n# us to add '--no-sandbox'. This is an intentional fail-safe: we prefer the app to start\n# without sandboxing rather than crash on startup.\nif [ $HAVE_NO_SANDBOX -eq 0 ] && ! unshare -Ur true 2>/dev/null ; then\n NO_SANDBOX=(--no-sandbox)\nfi\n\natexit()\n{\n if [ $isEulaAccepted == 1 ] ; then\n if [ $NUMBER_OF_ARGS -eq 0 ] ; then\n exec \"$BIN\" \"\\${NO_SANDBOX[@]}\"\n else\n exec \"$BIN\" \"\\${NO_SANDBOX[@]}\" \"\\${args[@]}\"\n fi\n fi\n}\n\nerror()\n{\n if [ -x /usr/bin/zenity ] ; then\n LD_LIBRARY_PATH=\"\" zenity --error --text \"\\${1}\" 2>/dev/null\n elif [ -x /usr/bin/kdialog ] ; then\n LD_LIBRARY_PATH=\"\" kdialog --msgbox \"\\${1}\" 2>/dev/null\n elif [ -x /usr/bin/Xdialog ] ; then\n LD_LIBRARY_PATH=\"\" Xdialog --msgbox \"\\${1}\" 2>/dev/null\n else\n echo \"\\${1}\"\n fi\n exit 1\n}\n\nyesno()\n{\n TITLE=$1\n TEXT=$2\n if [ -x /usr/bin/zenity ] ; then\n LD_LIBRARY_PATH=\"\" zenity --question --title=\"$TITLE\" --text=\"$TEXT\" 2>/dev/null || exit 0\n elif [ -x /usr/bin/kdialog ] ; then\n LD_LIBRARY_PATH=\"\" kdialog --title \"$TITLE\" --yesno \"$TEXT\" || exit 0\n elif [ -x /usr/bin/Xdialog ] ; then\n LD_LIBRARY_PATH=\"\" Xdialog --title \"$TITLE\" --clear --yesno \"$TEXT\" 10 80 || exit 0\n else\n echo \"zenity, kdialog, Xdialog missing. Skipping \\${THIS}.\"\n exit 0\n fi\n}\n\ncheck_dep()\n{\n DEP=$1\n if ! command -v \"$DEP\" &>/dev/null ; then\n echo \"$DEP is missing. Skipping \\${THIS}.\"\n exit 0\n fi\n}\n\nif [ -z \"$APPIMAGE\" ] ; then\n APPIMAGE=\"$APPDIR/${APP_RUN_ENTRYPOINT}\"\n # not running from within an AppImage; hence using the AppRun for Exec=\nfi\n\n${\n eulaEnabled\n ? `if [ -z \"$APPIMAGE_SILENT_INSTALL\" ] ; then\n EULA_MARK_DIR=\"\\${XDG_CONFIG_HOME:-$HOME/.config}/${config.ProductFilename}\"\n EULA_MARK_FILE=\"$EULA_MARK_DIR/eulaAccepted\"\n # show EULA only if desktop file doesn't exist\n if [ ! -e \"$EULA_MARK_FILE\" ] ; then\n if [ -x /usr/bin/zenity ] ; then\n # on cancel simply exits and our trap handler launches app, so, $isEulaAccepted is set here to 0 and then to 1 if EULA accepted\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" zenity --text-info --title=${escapeShellString(config.ProductName)} --filename=\"$APPDIR/${config.EulaFile}\" --ok-label=Agree --cancel-label=Disagree ${config.IsHtmlEula ? \"--html\" : \"\"}\n elif [ -x /usr/bin/Xdialog ] ; then\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" Xdialog --title ${escapeShellString(config.ProductName)} --textbox \"$APPDIR/${config.EulaFile}\" 30 80 --ok-label Agree --cancel-label Disagree\n elif [ -x /usr/bin/kdialog ] ; then\n # cannot find any option to force Agree/Disagree buttons for kdialog. And official example exactly with OK button https://techbase.kde.org/Development/Tutorials/Shell_Scripting_with_KDE_Dialogs#Example_21._--textbox_dialog_box\n # in any case we pass labels text\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" kdialog --textbox \"$APPDIR/${config.EulaFile}\" --yes-label Agree --cancel-label \"Disagree\"\n fi\n\n case $? in\n 0)\n isEulaAccepted=1\n echo \"License accepted\"\n mkdir -p \"$EULA_MARK_DIR\"\n touch \"$EULA_MARK_FILE\"\n ;;\n 1)\n echo \"License not accepted\"\n exit 0\n ;;\n -1)\n echo \"An unexpected error has occurred.\"\n isEulaAccepted=1\n ;;\n esac\n fi\nfi`\n : \"\"\n}\n`\n}\n"]}
|
|
1
|
+
{"version":3,"file":"appImageUtil.js","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/appImageUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, copyDir, copyFile, exec, exists, InvalidConfigurationError, log } from \"builder-util\"\nimport fs from \"fs-extra\"\nimport * as path from \"path\"\nimport { FileAssociation } from \"../../../options/FileAssociation.js\"\nimport { getAppImageTools } from \"../../../toolsets/appimage.js\"\nimport { copyIcons, copyMimeTypes } from \"./appLauncher.js\"\nimport { shellQuote } from \"../launcherScript.js\"\nimport { appendBlockmap } from \"../../differentialUpdateInfoBuilder.js\"\nimport { BlockMapDataHolder } from \"builder-util-runtime\"\nimport { APP_RUN_ENTRYPOINT } from \"./AppImageTarget.js\"\nimport { ToolsetConfig } from \"../../../configuration.js\"\nimport { IconInfo } from \"../../../util/iconConverter.js\"\n\ninterface Options {\n productName: string\n productFilename: string\n executableName: string\n /** Arguments injected into the AppRun launcher (the .desktop Exec key stays `AppRun %U`). */\n executableArgs?: ReadonlyArray<string>\n desktopEntry: string\n icons: IconInfo[]\n license?: string | null\n fileAssociations: FileAssociation[]\n /**\n * The compression type available for static runtime is limited as it's only compiled with support for gzip and zstd.\n * \"xz\" is only valid for the legacy FUSE2 (0.0.0) toolset.\n *\n * [stderr] Squashfs image uses lzo compression, this version supports only zlib, zstd.\n * Failed to open squashfs image\n * Failed to extract AppImage\n *\n */\n compression?: \"gzip\" | \"zstd\" | \"xz\"\n /** Pre-computed desktop basename (already validated). When absent, falls back to `executableName`. */\n desktopBaseName?: string\n}\n\nexport interface AppImageBuilderOptions {\n appDir: string\n stageDir: string\n arch: Arch\n output: string\n options: Options\n}\n\nexport async function buildStaticRuntimeAppImage(appimageToolVersion: ToolsetConfig[\"appimage\"], opts: AppImageBuilderOptions, resourcesDir: string): Promise<BlockMapDataHolder> {\n const { stageDir, output, appDir, options, arch } = opts\n\n try {\n await fs.remove(output)\n\n // Write AppRun launcher and related files\n await writeAppLauncherAndRelatedFiles(opts)\n\n const { runtimeLibraries: libraries, runtime, mksquashfs } = await getAppImageTools(appimageToolVersion, arch, resourcesDir)\n await copyDir(libraries, path.join(stageDir, \"usr\", \"lib\"))\n\n // Copy app directory to stage\n // mksquashfs doesn't support merging, so we copy the entire app dir\n await copyDir(appDir, stageDir)\n\n const runtimeData = await fs.readFile(runtime)\n\n // Create squashfs with offset for runtime\n const args: string[] = [stageDir, output, \"-offset\", runtimeData.length.toString(), \"-all-root\", \"-noappend\", \"-no-progress\", \"-quiet\", \"-no-xattrs\", \"-no-fragments\"]\n if (options.compression) {\n args.push(\"-comp\", options.compression)\n }\n await exec(mksquashfs, args, {\n cwd: stageDir,\n })\n\n // Write runtime data at the beginning of the file\n await writeRuntimeData(output, runtimeData)\n\n // Make executable\n await fs.chmod(output, 0o755)\n\n // Append blockmap inside try block to ensure cleanup on failure\n const updateInfo = await appendBlockmap(output)\n return updateInfo\n } catch (error) {\n // Clean up partial build on failure\n await fs.remove(output).catch(() => {})\n throw error\n }\n}\n\nexport async function buildLegacyFuse2AppImage(opts: AppImageBuilderOptions, resourcesDir: string): Promise<BlockMapDataHolder> {\n const { stageDir, output, appDir, options, arch } = opts\n\n try {\n await fs.remove(output)\n\n await writeAppLauncherAndRelatedFiles(opts)\n\n const { runtime, mksquashfs, runtimeLibraries } = await getAppImageTools(\"0.0.0\", arch, resourcesDir)\n // Mirror the app-builder-lib Go implementation: bundle lib/<arch> into usr/lib for x64 and ia32.\n // arm targets don't have a dedicated lib dir in the FUSE2 toolset.\n if (arch === Arch.x64 || arch === Arch.ia32) {\n await copyDir(runtimeLibraries, path.join(stageDir, \"usr\", \"lib\"))\n }\n await copyDir(appDir, stageDir)\n\n const runtimeData = await fs.readFile(runtime)\n\n const args: string[] = [stageDir, output, \"-offset\", runtimeData.length.toString(), \"-all-root\", \"-noappend\", \"-no-progress\", \"-quiet\", \"-no-xattrs\", \"-no-fragments\"]\n if (options.compression) {\n args.push(\"-comp\", options.compression)\n if (options.compression === \"xz\") {\n // Match the dictionary/block-size settings used by the original app-builder Go implementation\n args.push(\"-Xdict-size\", \"100%\", \"-b\", \"1048576\")\n }\n }\n await exec(mksquashfs, args, { cwd: stageDir })\n\n await writeRuntimeData(output, runtimeData)\n await fs.chmod(output, 0o755)\n\n const updateInfo = await appendBlockmap(output)\n return updateInfo\n } catch (error) {\n await fs.remove(output).catch(() => {})\n throw error\n }\n}\n\nasync function writeRuntimeData(filePath: string, runtimeData: Buffer): Promise<void> {\n const fd = await fs.open(filePath, \"r+\")\n try {\n await fs.write(fd, runtimeData, 0, runtimeData.length, 0)\n } finally {\n try {\n await fs.close(fd)\n } catch (closeError: any) {\n // Log but don't throw - preserve original error if any\n log.warn({ message: closeError.message, file: filePath }, `failed to close file descriptor`)\n }\n }\n}\n\n/**\n * Escapes a string for safe use in shell scripts by wrapping in single quotes\n * and escaping any single quotes within the string.\n *\n * This allows strings with spaces, special characters, etc. to be safely used.\n */\nfunction escapeShellString(str: string): string {\n // Escape single quotes by replacing ' with '\\''\n // Then wrap the whole string in single quotes\n return `'${str.replace(/'/g, \"'\\\\''\")}'`\n}\n\n/**\n * Validates that critical path fields (executable name, product filename, license filename)\n * contain only characters that are safe for use in filesystem paths and embedded bash strings.\n * Allowed: Unicode letters, digits, dots, underscores, hyphens, and spaces.\n */\nexport function validateCriticalPathString(str: string, fieldName: string): void {\n if (!/^[\\p{L}\\p{N}._\\- ]+$/u.test(str)) {\n throw new InvalidConfigurationError(\n `${fieldName} contains characters that cannot be safely used in file paths: ${str}. Please use only letters, digits, hyphens, underscores, dots, and spaces.`\n )\n }\n}\n\nasync function writeAppLauncherAndRelatedFiles(opts: AppImageBuilderOptions): Promise<void> {\n const {\n stageDir,\n options: { license, executableName, executableArgs, productFilename, productName, desktopEntry, desktopBaseName },\n } = opts\n\n // executableName and productFilename are embedded directly into double-quoted bash strings\n // and used as filesystem paths, so they must pass the whitelist.\n // productName is not validated here because it is only ever passed through escapeShellString().\n validateCriticalPathString(executableName, \"executableName\")\n validateCriticalPathString(productFilename, \"productFilename\")\n\n // Write desktop file\n const desktopFileName = `${desktopBaseName ?? executableName}.desktop`\n await fs.writeFile(path.join(stageDir, desktopFileName), desktopEntry, { mode: 0o644 })\n await copyIcons(opts)\n\n const templateConfig: AppRunScriptBase = {\n DesktopFileName: desktopFileName,\n ExecutableName: executableName,\n ExecutableArgs: executableArgs,\n ProductName: productName,\n ProductFilename: productFilename,\n ResourceName: `appimagekit-${executableName}`,\n }\n\n const mimeTypeFile = await copyMimeTypes(stageDir, opts.options)\n if (mimeTypeFile) {\n templateConfig.MimeTypeFile = mimeTypeFile\n }\n\n let finalConfig: AppRunScript = templateConfig\n\n // Copy license file if provided\n if (license) {\n // Validate license file exists\n if (!(await exists(license))) {\n throw new InvalidConfigurationError(`License file not found: ${license}`)\n }\n\n const licenseBaseName = path.basename(license)\n const ext = path.extname(license).toLowerCase()\n\n // Validate license filename for path safety\n validateCriticalPathString(licenseBaseName, \"licenseBaseName\")\n\n // Validate extension\n if (![\".txt\", \".html\"].includes(ext)) {\n log.warn({ license, expected: \".txt or .html\" }, `license file has unexpected extension`)\n }\n\n await copyFile(license, path.join(stageDir, licenseBaseName))\n\n finalConfig = {\n ...templateConfig,\n EulaFile: licenseBaseName,\n IsHtmlEula: ext === \".html\",\n }\n }\n\n const appRunContent = generateAppRunScript(finalConfig)\n await fs.writeFile(path.join(stageDir, APP_RUN_ENTRYPOINT), appRunContent, { mode: 0o755 })\n}\n\nexport type AppRunScriptBase = {\n ExecutableName: string\n DesktopFileName: string\n ProductFilename: string\n ProductName: string\n ResourceName: string\n MimeTypeFile?: string\n /** Arguments injected into the launcher, so the .desktop Exec key stays `AppRun %U`. */\n ExecutableArgs?: ReadonlyArray<string>\n}\n\nexport type AppRunScriptWithEula = AppRunScriptBase & {\n EulaFile: string\n IsHtmlEula: boolean\n}\n\nexport type AppRunScript = AppRunScriptBase | AppRunScriptWithEula\n\nfunction hasEula(config: AppRunScript): config is AppRunScriptWithEula {\n return \"EulaFile\" in config && typeof config.EulaFile === \"string\"\n}\n\nexport function generateAppRunScript(config: AppRunScript): string {\n const eulaEnabled = hasEula(config)\n // executableArgs are baked into the launcher (single-quoted) rather than the .desktop Exec key,\n // consistent with the other Linux targets. \"$@\" still forwards launch-time arguments.\n const executableArgsLiteral = (config.ExecutableArgs ?? []).map(shellQuote).join(\" \")\n\n return `#!/usr/bin/env bash\nset -e\n\nTHIS=\"$0\"\n# http://stackoverflow.com/questions/3190818/\nargs=(\"$@\")\nNUMBER_OF_ARGS=\"$#\"\n\nif [ -z \"$APPDIR\" ] ; then\n # Find the AppDir. It is the directory that contains AppRun.\n # This assumes that this script resides inside the AppDir or a subdirectory.\n # If this script is run inside an AppImage, then the AppImage runtime likely has already set $APPDIR\n path=\"$(dirname \"$(readlink -f \"\\${THIS}\")\")\"\n while [[ \"$path\" != \"\" && ! -e \"$path/${APP_RUN_ENTRYPOINT}\" ]]; do\n path=\\${path%/*}\n done\n APPDIR=\"$path\"\nfi\n\nif [ -z \"$APPDIR\" ] ; then\n echo \"ERROR: could not locate the AppDir. Ensure this script is run from within a properly structured AppImage.\" >&2\n exit 1\nfi\n\nexport PATH=\"\\${APPDIR}:\\${APPDIR}/usr/sbin\\${PATH:+:\\${PATH}}\"\nexport XDG_DATA_DIRS=\"\\${APPDIR}/usr/share/\\${XDG_DATA_DIRS:+:\\${XDG_DATA_DIRS}}:/usr/share/gnome:/usr/local/share/:/usr/share/\"\nexport LD_LIBRARY_PATH=\"\\${APPDIR}/usr/lib\\${LD_LIBRARY_PATH:+:\\${LD_LIBRARY_PATH}}\"\nexport GSETTINGS_SCHEMA_DIR=\"\\${APPDIR}/usr/share/glib-2.0/schemas\\${GSETTINGS_SCHEMA_DIR:+:\\${GSETTINGS_SCHEMA_DIR}}\"\n\nBIN=\"$APPDIR/${config.ExecutableName}\"\n# Configured executableArgs, applied ahead of any launch-time arguments.\nEXECUTABLE_ARGS=(${executableArgsLiteral})\n\nif [ -z \"$APPIMAGE_EXIT_AFTER_INSTALL\" ] ; then\n trap atexit EXIT\nfi\n\nisEulaAccepted=1\n\nHAVE_NO_SANDBOX=0\nfor arg in \"\\${EXECUTABLE_ARGS[@]}\" \"\\${args[@]}\" ; do\n if [ \"$arg\" = --no-sandbox ] ; then\n HAVE_NO_SANDBOX=1\n break\n fi\ndone\nNO_SANDBOX=()\n# Use 'unshare -Ur true' as a heuristic to detect whether user namespaces are available.\n# Notes:\n# - When running as root, this check will always succeed even if the sandbox configuration\n# actually relies on unprivileged user namespaces. In practice, Chrome/Electron usually\n# disables or adjusts the sandbox separately when running as root, so this probe is mostly\n# a no-op in that scenario.\n# - On minimal systems (e.g. Alpine or stripped-down containers) 'unshare' may not exist.\n# In that case the shell will return exit code 127 (\"command not found\"), which will cause\n# us to add '--no-sandbox'. This is an intentional fail-safe: we prefer the app to start\n# without sandboxing rather than crash on startup.\nif [ $HAVE_NO_SANDBOX -eq 0 ] && ! unshare -Ur true 2>/dev/null ; then\n NO_SANDBOX=(--no-sandbox)\nfi\n\natexit()\n{\n if [ $isEulaAccepted == 1 ] ; then\n if [ $NUMBER_OF_ARGS -eq 0 ] ; then\n exec \"$BIN\" \"\\${NO_SANDBOX[@]}\" \"\\${EXECUTABLE_ARGS[@]}\"\n else\n exec \"$BIN\" \"\\${NO_SANDBOX[@]}\" \"\\${EXECUTABLE_ARGS[@]}\" \"\\${args[@]}\"\n fi\n fi\n}\n\nerror()\n{\n if [ -x /usr/bin/zenity ] ; then\n LD_LIBRARY_PATH=\"\" zenity --error --text \"\\${1}\" 2>/dev/null\n elif [ -x /usr/bin/kdialog ] ; then\n LD_LIBRARY_PATH=\"\" kdialog --msgbox \"\\${1}\" 2>/dev/null\n elif [ -x /usr/bin/Xdialog ] ; then\n LD_LIBRARY_PATH=\"\" Xdialog --msgbox \"\\${1}\" 2>/dev/null\n else\n echo \"\\${1}\"\n fi\n exit 1\n}\n\nyesno()\n{\n TITLE=$1\n TEXT=$2\n if [ -x /usr/bin/zenity ] ; then\n LD_LIBRARY_PATH=\"\" zenity --question --title=\"$TITLE\" --text=\"$TEXT\" 2>/dev/null || exit 0\n elif [ -x /usr/bin/kdialog ] ; then\n LD_LIBRARY_PATH=\"\" kdialog --title \"$TITLE\" --yesno \"$TEXT\" || exit 0\n elif [ -x /usr/bin/Xdialog ] ; then\n LD_LIBRARY_PATH=\"\" Xdialog --title \"$TITLE\" --clear --yesno \"$TEXT\" 10 80 || exit 0\n else\n echo \"zenity, kdialog, Xdialog missing. Skipping \\${THIS}.\"\n exit 0\n fi\n}\n\ncheck_dep()\n{\n DEP=$1\n if ! command -v \"$DEP\" &>/dev/null ; then\n echo \"$DEP is missing. Skipping \\${THIS}.\"\n exit 0\n fi\n}\n\nif [ -z \"$APPIMAGE\" ] ; then\n APPIMAGE=\"$APPDIR/${APP_RUN_ENTRYPOINT}\"\n # not running from within an AppImage; hence using the AppRun for Exec=\nfi\n\n${\n eulaEnabled\n ? `if [ -z \"$APPIMAGE_SILENT_INSTALL\" ] ; then\n EULA_MARK_DIR=\"\\${XDG_CONFIG_HOME:-$HOME/.config}/${config.ProductFilename}\"\n EULA_MARK_FILE=\"$EULA_MARK_DIR/eulaAccepted\"\n # show EULA only if desktop file doesn't exist\n if [ ! -e \"$EULA_MARK_FILE\" ] ; then\n if [ -x /usr/bin/zenity ] ; then\n # on cancel simply exits and our trap handler launches app, so, $isEulaAccepted is set here to 0 and then to 1 if EULA accepted\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" zenity --text-info --title=${escapeShellString(config.ProductName)} --filename=\"$APPDIR/${config.EulaFile}\" --ok-label=Agree --cancel-label=Disagree ${config.IsHtmlEula ? \"--html\" : \"\"}\n elif [ -x /usr/bin/Xdialog ] ; then\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" Xdialog --title ${escapeShellString(config.ProductName)} --textbox \"$APPDIR/${config.EulaFile}\" 30 80 --ok-label Agree --cancel-label Disagree\n elif [ -x /usr/bin/kdialog ] ; then\n # cannot find any option to force Agree/Disagree buttons for kdialog. And official example exactly with OK button https://techbase.kde.org/Development/Tutorials/Shell_Scripting_with_KDE_Dialogs#Example_21._--textbox_dialog_box\n # in any case we pass labels text\n isEulaAccepted=0\n LD_LIBRARY_PATH=\"\" kdialog --textbox \"$APPDIR/${config.EulaFile}\" --yes-label Agree --cancel-label \"Disagree\"\n fi\n\n case $? in\n 0)\n isEulaAccepted=1\n echo \"License accepted\"\n mkdir -p \"$EULA_MARK_DIR\"\n touch \"$EULA_MARK_FILE\"\n ;;\n 1)\n echo \"License not accepted\"\n exit 0\n ;;\n -1)\n echo \"An unexpected error has occurred.\"\n isEulaAccepted=1\n ;;\n esac\n fi\nfi`\n : \"\"\n}\n`\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appLauncher.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/appLauncher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"appLauncher.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/appLauncher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAK1D,wBAAsB,SAAS,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C9E;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,kBAAkB,GAAG,aAAa,GAAG,gBAAgB,CAAC,GACtG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuDxB"}
|
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import path from "path";
|
|
2
2
|
import fs from "fs-extra";
|
|
3
|
-
import { copyOrLinkFile, log } from "builder-util";
|
|
3
|
+
import { copyOrLinkFile, log, escapeForXml } from "builder-util";
|
|
4
4
|
const ICON_DIR_RELATIVE_PATH = "usr/share/icons/hicolor";
|
|
5
5
|
const MIME_TYPE_DIR_RELATIVE_PATH = "usr/share/mime/packages";
|
|
6
|
-
/**
|
|
7
|
-
* Escapes special XML characters to prevent injection
|
|
8
|
-
*/
|
|
9
|
-
function xmlEscape(str) {
|
|
10
|
-
return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
11
|
-
}
|
|
12
6
|
export async function copyIcons(options) {
|
|
13
7
|
const { stageDir, options: configuration } = options;
|
|
14
8
|
const iconCommonDir = path.join(stageDir, ICON_DIR_RELATIVE_PATH);
|
|
@@ -60,8 +54,8 @@ export async function copyMimeTypes(stageDir, options) {
|
|
|
60
54
|
continue;
|
|
61
55
|
}
|
|
62
56
|
// XML-escape to prevent injection
|
|
63
|
-
mimeTypeParts.push(`<mime-type type="${
|
|
64
|
-
mimeTypeParts.push(` <comment>${
|
|
57
|
+
mimeTypeParts.push(`<mime-type type="${escapeForXml(fileAssociation.mimeType)}">`);
|
|
58
|
+
mimeTypeParts.push(` <comment>${escapeForXml(productName)} document</comment>`);
|
|
65
59
|
// Handle extension(s)
|
|
66
60
|
const extensions = Array.isArray(fileAssociation.ext) ? fileAssociation.ext : [fileAssociation.ext];
|
|
67
61
|
for (const ext of extensions) {
|
|
@@ -70,7 +64,7 @@ export async function copyMimeTypes(stageDir, options) {
|
|
|
70
64
|
log.warn({ extension: ext }, `file extension contains unexpected characters and will be skipped`);
|
|
71
65
|
continue;
|
|
72
66
|
}
|
|
73
|
-
mimeTypeParts.push(` <glob pattern="*.${
|
|
67
|
+
mimeTypeParts.push(` <glob pattern="*.${escapeForXml(ext)}"/>`);
|
|
74
68
|
}
|
|
75
69
|
mimeTypeParts.push(' <generic-icon name="x-office-document"/>');
|
|
76
70
|
mimeTypeParts.push("</mime-type>");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appLauncher.js","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/appLauncher.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"appLauncher.js","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/appLauncher.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\"\nimport fs from \"fs-extra\"\nimport { copyOrLinkFile, log, escapeForXml } from \"builder-util\"\nimport { AppImageBuilderOptions } from \"./appImageUtil.js\"\n\nconst ICON_DIR_RELATIVE_PATH = \"usr/share/icons/hicolor\"\nconst MIME_TYPE_DIR_RELATIVE_PATH = \"usr/share/mime/packages\"\n\nexport async function copyIcons(options: AppImageBuilderOptions): Promise<void> {\n const { stageDir, options: configuration } = options\n const iconCommonDir = path.join(stageDir, ICON_DIR_RELATIVE_PATH)\n\n await fs.ensureDir(iconCommonDir)\n\n const icons = configuration.icons\n if (!icons || icons.length === 0) {\n throw new Error(\"At least one icon is required for AppImage\")\n }\n\n const iconExtWithDot = path.extname(icons[0].file)\n const iconFileName = `${configuration.executableName}${iconExtWithDot}`\n const maxIconIndex = icons.length - 1\n\n const iconInfoList = icons.map(icon => {\n if (path.extname(icon.file) !== iconExtWithDot) {\n throw new Error(`All icons must have the same extension: expected ${iconExtWithDot}, but got ${icon.file}`)\n }\n let iconSizeDir: string\n\n if (iconExtWithDot === \".svg\") {\n // SVG icons go in scalable/apps directory per freedesktop icon theme spec\n iconSizeDir = \"scalable/apps\"\n } else {\n iconSizeDir = `${icon.size}x${icon.size}/apps`\n }\n\n const iconRelativeToStageFile = path.join(ICON_DIR_RELATIVE_PATH, iconSizeDir, iconFileName)\n const iconDir = path.join(iconCommonDir, iconSizeDir)\n const iconFile = path.join(iconDir, iconFileName)\n return { icon, iconDir, iconFile, iconRelativeToStageFile }\n })\n await Promise.all(\n iconInfoList.map(async ({ icon, iconDir, iconFile }) => {\n await fs.ensureDir(iconDir)\n await copyOrLinkFile(icon.file, iconFile)\n })\n )\n // Create symlinks for the last (largest) icon\n const { iconRelativeToStageFile } = iconInfoList[maxIconIndex]\n await fs.symlink(iconRelativeToStageFile, path.join(stageDir, iconFileName))\n await fs.symlink(iconRelativeToStageFile, path.join(stageDir, \".DirIcon\"))\n}\n\nexport async function copyMimeTypes(\n stageDir: string,\n options: Pick<AppImageBuilderOptions[\"options\"], \"fileAssociations\" | \"productName\" | \"executableName\">\n): Promise<string | null> {\n const { fileAssociations, productName, executableName } = options\n\n if (!fileAssociations || fileAssociations.length === 0) {\n return null\n }\n\n if (!fileAssociations || fileAssociations.length === 0) {\n return null\n }\n\n const mimeTypeParts: string[] = []\n\n for (const fileAssociation of fileAssociations) {\n if (!fileAssociation.mimeType) {\n continue\n }\n\n // XML-escape to prevent injection\n mimeTypeParts.push(`<mime-type type=\"${escapeForXml(fileAssociation.mimeType)}\">`)\n mimeTypeParts.push(` <comment>${escapeForXml(productName)} document</comment>`)\n\n // Handle extension(s)\n const extensions = Array.isArray(fileAssociation.ext) ? fileAssociation.ext : [fileAssociation.ext]\n\n for (const ext of extensions) {\n // Validate extension doesn't contain dangerous characters\n if (!/^[a-zA-Z0-9_-]+$/.test(ext)) {\n log.warn({ extension: ext }, `file extension contains unexpected characters and will be skipped`)\n continue\n }\n mimeTypeParts.push(` <glob pattern=\"*.${escapeForXml(ext)}\"/>`)\n }\n\n mimeTypeParts.push(' <generic-icon name=\"x-office-document\"/>')\n mimeTypeParts.push(\"</mime-type>\")\n }\n\n // If no mime-types were generated, return null\n if (mimeTypeParts.length === 0) {\n return null\n }\n\n const mimeTypeDir = path.join(stageDir, MIME_TYPE_DIR_RELATIVE_PATH)\n const fileName = `${executableName}.xml`\n const mimeTypeFile = path.join(mimeTypeDir, fileName)\n\n await fs.ensureDir(mimeTypeDir)\n\n const xmlContent = ['<?xml version=\"1.0\"?>', '<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">', ...mimeTypeParts, \"</mime-info>\"].join(\"\\n\")\n\n // Use 0o644 (rw-r--r--) instead of 0o666 to avoid world-writable permissions\n await fs.writeFile(mimeTypeFile, xmlContent, { mode: 0o644 })\n\n return path.join(MIME_TYPE_DIR_RELATIVE_PATH, fileName)\n}\n"]}
|
|
@@ -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"]}
|
|
@@ -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;
|
|
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,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,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";
|
|
@@ -391,11 +392,10 @@ export function buildCommandShContent(opts) {
|
|
|
391
392
|
const { isTemplate, executableName, extraAppArgs } = opts;
|
|
392
393
|
validateShellEmbeddable(executableName, "executableName");
|
|
393
394
|
const appPrefix = isTemplate ? "" : "app/";
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
return content;
|
|
395
|
+
return buildLauncherScript({
|
|
396
|
+
shebang: "#!/bin/bash -e",
|
|
397
|
+
command: ['"$SNAP/desktop-init.sh"', '"$SNAP/desktop-common.sh"', '"$SNAP/desktop-gnome-specific.sh"', `"$SNAP/${appPrefix}${executableName}"`],
|
|
398
|
+
args: extraAppArgs,
|
|
399
|
+
});
|
|
400
400
|
}
|
|
401
401
|
//# sourceMappingURL=coreLegacy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coreLegacy.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/coreLegacy.ts"],"names":[],"mappings":"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","sourcesContent":["import { replaceDefault as _replaceDefault, Arch, copyDir, exec, log, serializeToYaml, toLinuxArchString, validateShellEmbeddable } from \"builder-util\"\nimport { asArray, deepAssign, isValidKey, Nullish } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport { chmod, copyFile, mkdir, readdir, rename, rm, writeFile } from \"fs/promises\"\nimport { load } from \"js-yaml\"\nimport * as path from \"path\"\nimport { PlugDescriptor, SnapOptionsLegacy } from \"../../../options/SnapOptions.js\"\nimport { getAppImageTools } from \"../../../toolsets/appimage.js\"\nimport { downloadBuilderToolset } from \"../../../util/electronGet.js\"\nimport { isSnapDestructiveMode } from \"../../../util/flags.js\"\nimport { getTemplatePath } from \"../../../util/pathManager.js\"\nimport { SnapCore } from \"./SnapTarget.js\"\nimport { shellQuote } from \"./snapCommand.js\"\nimport { SnapcraftYAML } from \"./snapcraft.js\"\nimport { DEFAULT_STAGE_PACKAGES } from \"./snapcraftBuilder.js\"\nconst { outputFile, readFile } = _fsExtra\n\n// Re-exported for backwards compatibility with existing imports/tests.\nexport { shellQuote }\n\n// Snap template release info from electron-userland/electron-builder-binaries\nconst SNAP_TEMPLATES = {\n amd64: {\n releaseName: \"snap-template-4.0-2\",\n filenameWithExt: \"snap-template-electron-4.0-2-amd64.tar.7z\",\n checksums: { \"snap-template-electron-4.0-2-amd64.tar.7z\": \"5e3ab4e09364ac06f0072b1c2dab9138318c933f6b2c7374f893b5ec44d19e6f\" },\n },\n armhf: {\n releaseName: \"snap-template-4.0-1\",\n filenameWithExt: \"snap-template-electron-4.0-1-armhf.tar.7z\",\n checksums: { \"snap-template-electron-4.0-1-armhf.tar.7z\": \"6f7553e904f4e043bc3019f0899d05e01a283b00b61fec22e932296490e3be6b\" },\n },\n} as const\n\n// Handles core18/core20/core22 snaps via mksquashfs (template) or snapcraft CLI (no-template).\n// See: https://github.com/develar/app-builder/blob/master/pkg/package-format/snap\nexport class SnapCoreLegacy extends SnapCore<SnapOptionsLegacy & { base: \"core18\" | \"core20\" | \"core22\" }> {\n private isUseTemplateApp = false\n\n defaultPlugs = [\"desktop\", \"desktop-legacy\", \"home\", \"x11\", \"wayland\", \"unity7\", \"browser-support\", \"network\", \"gsettings\", \"audio-playback\", \"pulseaudio\", \"opengl\"]\n\n private replaceDefault(inList: Array<string> | Nullish, defaultList: Array<string>) {\n const result = _replaceDefault(inList, defaultList)\n if (result !== defaultList) {\n this.isUseTemplateApp = false\n }\n return result\n }\n\n async createDescriptor(arch: Arch): Promise<SnapcraftYAML> {\n const appInfo = this.packager.appInfo\n const snapName = this.packager.executableName.toLowerCase()\n const options = this.options\n\n const plugs = this.normalizePlugConfiguration(this.options.plugs)\n\n const plugNames = this.replaceDefault(plugs == null ? null : Object.getOwnPropertyNames(plugs), this.defaultPlugs)\n\n const slots = this.normalizePlugConfiguration(this.options.slots)\n\n const buildPackages = asArray(options.buildPackages)\n const stagePackages = this.replaceDefault(options.stagePackages, DEFAULT_STAGE_PACKAGES)\n\n const stageSet = new Set(stagePackages)\n const stageMatchesDefaults = stagePackages.length === DEFAULT_STAGE_PACKAGES.length && DEFAULT_STAGE_PACKAGES.every((p: string) => stageSet.has(p))\n\n // Template app is only available for x64/armv7l, and only when no packages are customised.\n this.isUseTemplateApp = this.options.useTemplateApp !== false && (arch === Arch.x64 || arch === Arch.armv7l) && buildPackages.length === 0 && stageMatchesDefaults\n\n const appDescriptor: any = {\n command: \"command.sh\",\n plugs: plugNames,\n adapter: \"none\",\n }\n\n const snap: any = load(await readFile(path.join(getTemplatePath(\"snap\"), \"snapcraft.yaml\"), \"utf-8\"))\n if (this.isUseTemplateApp) {\n delete appDescriptor.adapter\n }\n if (options.base != null) {\n snap.base = options.base\n if (Number(snap.base.split(\"core\")[1]) >= 22) {\n delete appDescriptor.adapter\n }\n }\n if (options.grade != null) {\n snap.grade = options.grade\n }\n if (options.confinement != null) {\n snap.confinement = options.confinement\n }\n if (options.appPartStage != null) {\n snap.parts.app.stage = options.appPartStage\n }\n if (options.layout != null) {\n snap.layout = options.layout\n }\n if (slots != null) {\n appDescriptor.slots = Object.getOwnPropertyNames(slots)\n for (const slotName of appDescriptor.slots) {\n if (!isValidKey(slotName)) {\n throw new Error(`Invalid plug/slot name: ${slotName}`)\n }\n const slotOptions = slots[slotName]\n if (slotOptions == null) {\n continue\n }\n if (!snap.slots) {\n snap.slots = {}\n }\n snap.slots[slotName] = slotOptions\n }\n }\n\n deepAssign(snap, {\n name: snapName,\n version: appInfo.version,\n title: options.title || appInfo.productName,\n summary: options.summary || appInfo.productName,\n compression: options.compression,\n description: this.helper.getDescription(options),\n architectures: [toLinuxArchString(arch, \"snap\")],\n apps: {\n [snapName]: appDescriptor,\n },\n parts: {\n app: {\n \"stage-packages\": stagePackages,\n },\n },\n })\n\n if (options.autoStart) {\n appDescriptor.autostart = `${this.helper.getDesktopFileName(snap.name)}.desktop`\n }\n\n if (options.confinement === \"classic\") {\n delete appDescriptor.plugs\n delete snap.plugs\n } else {\n const archTriplet = this.archNameToTriplet(arch)\n const environment: Record<string, string> = {\n PATH: \"$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH\",\n SNAP_DESKTOP_RUNTIME: \"$SNAP/gnome-platform\",\n LD_LIBRARY_PATH: [\n \"$SNAP_LIBRARY_PATH\",\n \"$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/\" + archTriplet + \":$SNAP/usr/lib/\" + archTriplet,\n \"$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib\",\n \"$SNAP/lib/\" + archTriplet + \":$SNAP/usr/lib/\" + archTriplet,\n ].join(\":\"),\n ...options.environment,\n }\n const allow = options.allowNativeWayland\n const isOldElectron = !this.helper.isElectronVersionGreaterOrEqualThan(\"38.0.0\", \"7.0.0\")\n if ((allow == null && isOldElectron) || allow === false) {\n environment.DISABLE_WAYLAND = \"1\"\n }\n\n appDescriptor.environment = environment\n\n if (plugs != null) {\n for (const plugName of plugNames) {\n if (!isValidKey(plugName)) {\n throw new Error(`Invalid plug/slot name: ${plugName}`)\n }\n const plugOptions = plugs[plugName]\n if (plugOptions == null) {\n continue\n }\n if (!snap.plugs) {\n snap.plugs = {}\n }\n snap.plugs[plugName] = plugOptions\n }\n }\n }\n\n if (buildPackages.length > 0) {\n snap.parts.app[\"build-packages\"] = buildPackages\n }\n if (options.after != null) {\n snap.parts.app.after = options.after\n }\n\n if (options.assumes != null) {\n snap.assumes = asArray(options.assumes)\n }\n\n return snap\n }\n\n async buildSnap(props: { snap: any; appOutDir: string; stageDir: string; snapArch: Arch; artifactPath: string }): Promise<void> {\n const { snap, appOutDir, stageDir, snapArch, artifactPath } = props\n\n // Build the args array for effectiveOptionComputed compatibility — tests inspect this.\n const args = [\n \"snap\",\n \"--app\",\n appOutDir,\n \"--stage\",\n stageDir,\n \"--arch\",\n toLinuxArchString(snapArch, \"snap\"),\n \"--output\",\n artifactPath,\n \"--executable\",\n this.packager.executableName,\n ]\n\n await this.helper.icons\n if (this.helper.maxIconPath != null) {\n if (!this.isUseTemplateApp) {\n snap.icon = \"snap/gui/icon.png\"\n }\n args.push(\"--icon\", this.helper.maxIconPath)\n }\n\n const snapMetaDir = path.join(stageDir, this.isUseTemplateApp ? \"meta\" : \"snap\")\n const desktopFile = path.join(snapMetaDir, \"gui\", `${this.helper.getDesktopFileName(snap.name)}.desktop`)\n await this.helper.writeDesktopEntry(this.options, this.packager.executableName + \" %U\", desktopFile, {\n Icon: \"${SNAP}/meta/gui/icon.png\",\n })\n\n const extraAppArgs: Array<string> = this.options.executableArgs ?? []\n if (this.helper.isElectronVersionGreaterOrEqualThan(\"5.0.0\") && !this.isBrowserSandboxAllowed(snap)) {\n const noSandboxArg = \"--no-sandbox\"\n if (!extraAppArgs.includes(noSandboxArg)) {\n extraAppArgs.push(noSandboxArg)\n }\n if (this.isUseTemplateApp) {\n args.push(\"--exclude\", \"chrome-sandbox\")\n }\n }\n if (extraAppArgs.length > 0) {\n args.push(\"--extraAppArgs=\" + extraAppArgs.join(\" \"))\n }\n\n // Capture compression BEFORE it gets stripped from snap for template builds.\n const compression = this.options.compression ?? \"xz\"\n if (snap.compression != null) {\n args.push(\"--compression\", snap.compression)\n }\n\n if (this.isUseTemplateApp) {\n const fieldsToStrip = [\"compression\", \"contact\", \"donation\", \"issues\", \"parts\", \"source-code\", \"website\"]\n for (const field of fieldsToStrip) {\n delete snap[field]\n }\n }\n\n if (this.packager.packagerOptions.effectiveOptionComputed != null && (await this.packager.packagerOptions.effectiveOptionComputed({ snap, desktopFile, args }))) {\n return\n }\n\n await outputFile(path.join(snapMetaDir, this.isUseTemplateApp ? \"snap.yaml\" : \"snapcraft.yaml\"), serializeToYaml(snap))\n\n const hooksDir = await this.packager.getResource(this.options.hooks, \"snap-hooks\")\n if (hooksDir != null) {\n args.push(\"--hooks\", hooksDir)\n }\n\n if (this.isUseTemplateApp) {\n const templateArch = snapArch === Arch.x64 ? \"amd64\" : \"armhf\"\n args.push(\"--template-url\", `electron4:${templateArch}`)\n await this.buildWithTemplate({ appOutDir, stageDir, snapArch, artifactPath, compression, hooksDir, extraAppArgs })\n } else {\n await this.buildWithoutTemplate({ appOutDir, stageDir, artifactPath, hooksDir, extraAppArgs })\n }\n }\n\n private async buildWithTemplate(opts: {\n appOutDir: string\n stageDir: string\n snapArch: Arch\n artifactPath: string\n compression: string\n hooksDir: string | null\n extraAppArgs: string[]\n }): Promise<void> {\n const { appOutDir, stageDir, snapArch, artifactPath, compression, hooksDir, extraAppArgs } = opts\n const templateArch = snapArch === Arch.x64 ? \"amd64\" : \"armhf\"\n const { releaseName, filenameWithExt, checksums } = SNAP_TEMPLATES[templateArch]\n\n log.info({ releaseName }, \"downloading snap template\")\n const templateDir = await downloadBuilderToolset({ releaseName, filenameWithExt, checksums, githubOrgRepo: \"electron-userland/electron-builder-binaries\" })\n\n await this.stageSnapFiles({ stageDir, appOutDir, hooksDir, extraAppArgs, isTemplate: true })\n\n // Best-effort: remove chrome-sandbox from app dir before mksquashfs scans it.\n await rm(path.join(appOutDir, \"chrome-sandbox\"), { force: true })\n\n // chmod -R g-s to avoid setgid bits in final image\n for (const dir of [stageDir, appOutDir, templateDir]) {\n await exec(\"chmod\", [\"-R\", \"g-s\", dir]).catch(err => log.warn({ error: err.message }, \"chmod g-s failed\"))\n }\n\n const { mksquashfs } = await getAppImageTools(\"0.0.0\", snapArch, this.packager.buildResourcesDir)\n\n // Collect top-level entries from each dir as individual path args (mirrors Go ReadDirContentTo)\n const mksquashfsArgs: string[] = [\n ...(await readDirPaths(templateDir)),\n ...(await readDirPaths(stageDir)),\n ...(await readDirPaths(appOutDir, name => name !== \"LICENSES.chromium.html\" && name !== \"LICENSE.electron.txt\" && name !== \"chrome-sandbox\")),\n artifactPath,\n \"-no-progress\",\n \"-quiet\",\n \"-noappend\",\n \"-comp\",\n compression,\n \"-no-xattrs\",\n \"-no-fragments\",\n \"-all-root\",\n ]\n\n await exec(mksquashfs, mksquashfsArgs, { cwd: stageDir })\n }\n\n private async buildWithoutTemplate(opts: { appOutDir: string; stageDir: string; artifactPath: string; hooksDir: string | null; extraAppArgs: string[] }): Promise<void> {\n const { appOutDir, stageDir, artifactPath, hooksDir, extraAppArgs } = opts\n\n await this.stageSnapFiles({ stageDir, appOutDir, hooksDir, extraAppArgs, isTemplate: false })\n\n // Write desktop integration scripts (embedded in the Go binary, now in our templates)\n const snapTemplateDir = getTemplatePath(\"snap\")\n for (const script of [\"desktop-init.sh\", \"desktop-common.sh\", \"desktop-gnome-specific.sh\"]) {\n const src = path.join(snapTemplateDir, script)\n const dest = path.join(stageDir, \"scripts\", script)\n await copyFile(src, dest)\n // copyFile doesn't preserve mode; chmod 755 explicitly\n await chmod(dest, 0o755)\n }\n\n // Copy app dir into stage/app/ so snapcraft can pick it up\n await copyDir(appOutDir, path.join(stageDir, \"app\"))\n\n // Run snapcraft (legacy `snap` subcommand)\n const isDestructiveMode = isSnapDestructiveMode()\n const snapOutputName = \"out.snap\"\n const snapArgs = [\"snap\", \"--output\", isDestructiveMode ? artifactPath : snapOutputName]\n if (isDestructiveMode) {\n snapArgs.push(\"--destructive-mode\")\n }\n\n await exec(\"snapcraft\", snapArgs, {\n cwd: stageDir,\n env: { ...process.env, SNAPCRAFT_HAS_TTY: \"false\" },\n })\n\n if (!isDestructiveMode) {\n await rename(path.join(stageDir, snapOutputName), artifactPath)\n }\n }\n\n private async stageSnapFiles(opts: { stageDir: string; appOutDir: string; hooksDir: string | null; extraAppArgs: string[]; isTemplate: boolean }): Promise<void> {\n const { stageDir, hooksDir, extraAppArgs, isTemplate } = opts\n\n const snapMetaDir = path.join(stageDir, isTemplate ? \"meta\" : \"snap\")\n // No-template builds place command.sh + desktop scripts in scripts/ which snapcraft stages to snap root.\n // Template builds write command.sh to the stage root directly; no scripts/ dir is needed.\n const scriptDir = path.join(stageDir, \"scripts\")\n if (!isTemplate) {\n await mkdir(scriptDir, { recursive: true })\n }\n\n if (this.helper.maxIconPath != null) {\n const iconDest = path.join(snapMetaDir, \"gui\", `icon${path.extname(this.helper.maxIconPath)}`)\n await mkdir(path.dirname(iconDest), { recursive: true })\n await copyFile(this.helper.maxIconPath, iconDest)\n }\n\n if (hooksDir != null) {\n await copyDir(hooksDir, path.join(snapMetaDir, \"hooks\"))\n }\n\n // command.sh — template builds write to stage root; no-template writes to scripts/\n const commandWrapperPath = isTemplate ? path.join(stageDir, \"command.sh\") : path.join(scriptDir, \"command.sh\")\n const commandContent = buildCommandShContent({ isTemplate, executableName: this.packager.executableName, extraAppArgs })\n await writeFile(commandWrapperPath, commandContent, { mode: 0o755 })\n await chmod(commandWrapperPath, 0o755)\n }\n\n private normalizePlugConfiguration(raw: Array<string | PlugDescriptor> | PlugDescriptor | Nullish): Record<string, Record<string, any> | null> | null {\n if (raw == null) {\n return null\n }\n\n const result: any = {}\n for (const item of Array.isArray(raw) ? raw : [raw]) {\n if (typeof item === \"string\") {\n if (!isValidKey(item)) {\n throw new Error(`Invalid plug/slot name: ${item}`)\n }\n result[item] = null\n } else {\n deepAssign(result, item)\n }\n }\n return result\n }\n\n private isBrowserSandboxAllowed(snap: any): boolean {\n if (snap.plugs != null) {\n for (const plugName of Object.keys(snap.plugs)) {\n const plug = snap.plugs[plugName]\n if (plug.interface === \"browser-support\" && plug[\"allow-sandbox\"] === true) {\n return true\n }\n }\n }\n return false\n }\n\n private archNameToTriplet(arch: Arch): string {\n switch (arch) {\n case Arch.x64:\n return \"x86_64-linux-gnu\"\n case Arch.ia32:\n return \"i386-linux-gnu\"\n case Arch.armv7l:\n return \"arm-linux-gnueabihf\"\n case Arch.arm64:\n return \"aarch64-linux-gnu\"\n\n default:\n throw new Error(`Unsupported arch ${arch}`)\n }\n }\n}\n\nasync function readDirPaths(dir: string, filter?: (name: string) => boolean): Promise<string[]> {\n const entries = await readdir(dir)\n const result: string[] = []\n for (const name of entries) {\n if (!filter || filter(name)) {\n result.push(path.join(dir, name))\n }\n }\n return result\n}\n\n/**\n * Builds the content of command.sh for a snap package.\n *\n * For both template and no-template builds, the desktop-integration scripts are\n * sourced from the snap root ($SNAP):\n * - Template: scripts are embedded in the template tarball at the snap root.\n * - No-template: the snapcraft.yaml `launch-scripts` part uses `plugin: dump,\n * source: scripts`, which stages stageDir/scripts/ contents directly into the\n * snap root — so $SNAP/desktop-init.sh is correct in both cases.\n *\n * The only difference between template and no-template is the app executable prefix:\n * template apps are at $SNAP/<name>; no-template apps are at $SNAP/app/<name>.\n */\nexport function buildCommandShContent(opts: { isTemplate: boolean; executableName: string; extraAppArgs: string[] }): string {\n const { isTemplate, executableName, extraAppArgs } = opts\n validateShellEmbeddable(executableName, \"executableName\")\n const appPrefix = isTemplate ? \"\" : \"app/\"\n let content = `#!/bin/bash -e\\nexec \"$SNAP/desktop-init.sh\" \"$SNAP/desktop-common.sh\" \"$SNAP/desktop-gnome-specific.sh\" \"$SNAP/${appPrefix}${executableName}\"`\n if (extraAppArgs.length > 0) {\n content += \" \" + extraAppArgs.map(shellQuote).join(\" \")\n }\n content += ' \"$@\"'\n return content\n}\n"]}
|
|
1
|
+
{"version":3,"file":"coreLegacy.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/coreLegacy.ts"],"names":[],"mappings":"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","sourcesContent":["import { replaceDefault as _replaceDefault, Arch, copyDir, exec, log, serializeToYaml, toLinuxArchString, validateShellEmbeddable } from \"builder-util\"\nimport { asArray, deepAssign, isValidKey, Nullish } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport { chmod, copyFile, mkdir, readdir, rename, rm, writeFile } from \"fs/promises\"\nimport { load } from \"js-yaml\"\nimport * as path from \"path\"\nimport { PlugDescriptor, SnapOptionsLegacy } from \"../../../options/SnapOptions.js\"\nimport { getAppImageTools } from \"../../../toolsets/appimage.js\"\nimport { downloadBuilderToolset } from \"../../../util/electronGet.js\"\nimport { isSnapDestructiveMode } from \"../../../util/flags.js\"\nimport { getTemplatePath } from \"../../../util/pathManager.js\"\nimport { buildLauncherScript } from \"../launcherScript.js\"\nimport { SnapCore } from \"./SnapTarget.js\"\nimport { shellQuote } from \"./snapCommand.js\"\nimport { SnapcraftYAML } from \"./snapcraft.js\"\nimport { DEFAULT_STAGE_PACKAGES } from \"./snapcraftBuilder.js\"\nconst { outputFile, readFile } = _fsExtra\n\n// Re-exported for backwards compatibility with existing imports/tests.\nexport { shellQuote }\n\n// Snap template release info from electron-userland/electron-builder-binaries\nconst SNAP_TEMPLATES = {\n amd64: {\n releaseName: \"snap-template-4.0-2\",\n filenameWithExt: \"snap-template-electron-4.0-2-amd64.tar.7z\",\n checksums: { \"snap-template-electron-4.0-2-amd64.tar.7z\": \"5e3ab4e09364ac06f0072b1c2dab9138318c933f6b2c7374f893b5ec44d19e6f\" },\n },\n armhf: {\n releaseName: \"snap-template-4.0-1\",\n filenameWithExt: \"snap-template-electron-4.0-1-armhf.tar.7z\",\n checksums: { \"snap-template-electron-4.0-1-armhf.tar.7z\": \"6f7553e904f4e043bc3019f0899d05e01a283b00b61fec22e932296490e3be6b\" },\n },\n} as const\n\n// Handles core18/core20/core22 snaps via mksquashfs (template) or snapcraft CLI (no-template).\n// See: https://github.com/develar/app-builder/blob/master/pkg/package-format/snap\nexport class SnapCoreLegacy extends SnapCore<SnapOptionsLegacy & { base: \"core18\" | \"core20\" | \"core22\" }> {\n private isUseTemplateApp = false\n\n defaultPlugs = [\"desktop\", \"desktop-legacy\", \"home\", \"x11\", \"wayland\", \"unity7\", \"browser-support\", \"network\", \"gsettings\", \"audio-playback\", \"pulseaudio\", \"opengl\"]\n\n private replaceDefault(inList: Array<string> | Nullish, defaultList: Array<string>) {\n const result = _replaceDefault(inList, defaultList)\n if (result !== defaultList) {\n this.isUseTemplateApp = false\n }\n return result\n }\n\n async createDescriptor(arch: Arch): Promise<SnapcraftYAML> {\n const appInfo = this.packager.appInfo\n const snapName = this.packager.executableName.toLowerCase()\n const options = this.options\n\n const plugs = this.normalizePlugConfiguration(this.options.plugs)\n\n const plugNames = this.replaceDefault(plugs == null ? null : Object.getOwnPropertyNames(plugs), this.defaultPlugs)\n\n const slots = this.normalizePlugConfiguration(this.options.slots)\n\n const buildPackages = asArray(options.buildPackages)\n const stagePackages = this.replaceDefault(options.stagePackages, DEFAULT_STAGE_PACKAGES)\n\n const stageSet = new Set(stagePackages)\n const stageMatchesDefaults = stagePackages.length === DEFAULT_STAGE_PACKAGES.length && DEFAULT_STAGE_PACKAGES.every((p: string) => stageSet.has(p))\n\n // Template app is only available for x64/armv7l, and only when no packages are customised.\n this.isUseTemplateApp = this.options.useTemplateApp !== false && (arch === Arch.x64 || arch === Arch.armv7l) && buildPackages.length === 0 && stageMatchesDefaults\n\n const appDescriptor: any = {\n command: \"command.sh\",\n plugs: plugNames,\n adapter: \"none\",\n }\n\n const snap: any = load(await readFile(path.join(getTemplatePath(\"snap\"), \"snapcraft.yaml\"), \"utf-8\"))\n if (this.isUseTemplateApp) {\n delete appDescriptor.adapter\n }\n if (options.base != null) {\n snap.base = options.base\n if (Number(snap.base.split(\"core\")[1]) >= 22) {\n delete appDescriptor.adapter\n }\n }\n if (options.grade != null) {\n snap.grade = options.grade\n }\n if (options.confinement != null) {\n snap.confinement = options.confinement\n }\n if (options.appPartStage != null) {\n snap.parts.app.stage = options.appPartStage\n }\n if (options.layout != null) {\n snap.layout = options.layout\n }\n if (slots != null) {\n appDescriptor.slots = Object.getOwnPropertyNames(slots)\n for (const slotName of appDescriptor.slots) {\n if (!isValidKey(slotName)) {\n throw new Error(`Invalid plug/slot name: ${slotName}`)\n }\n const slotOptions = slots[slotName]\n if (slotOptions == null) {\n continue\n }\n if (!snap.slots) {\n snap.slots = {}\n }\n snap.slots[slotName] = slotOptions\n }\n }\n\n deepAssign(snap, {\n name: snapName,\n version: appInfo.version,\n title: options.title || appInfo.productName,\n summary: options.summary || appInfo.productName,\n compression: options.compression,\n description: this.helper.getDescription(options),\n architectures: [toLinuxArchString(arch, \"snap\")],\n apps: {\n [snapName]: appDescriptor,\n },\n parts: {\n app: {\n \"stage-packages\": stagePackages,\n },\n },\n })\n\n if (options.autoStart) {\n appDescriptor.autostart = `${this.helper.getDesktopFileName(snap.name)}.desktop`\n }\n\n if (options.confinement === \"classic\") {\n delete appDescriptor.plugs\n delete snap.plugs\n } else {\n const archTriplet = this.archNameToTriplet(arch)\n const environment: Record<string, string> = {\n PATH: \"$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH\",\n SNAP_DESKTOP_RUNTIME: \"$SNAP/gnome-platform\",\n LD_LIBRARY_PATH: [\n \"$SNAP_LIBRARY_PATH\",\n \"$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/\" + archTriplet + \":$SNAP/usr/lib/\" + archTriplet,\n \"$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib\",\n \"$SNAP/lib/\" + archTriplet + \":$SNAP/usr/lib/\" + archTriplet,\n ].join(\":\"),\n ...options.environment,\n }\n const allow = options.allowNativeWayland\n const isOldElectron = !this.helper.isElectronVersionGreaterOrEqualThan(\"38.0.0\", \"7.0.0\")\n if ((allow == null && isOldElectron) || allow === false) {\n environment.DISABLE_WAYLAND = \"1\"\n }\n\n appDescriptor.environment = environment\n\n if (plugs != null) {\n for (const plugName of plugNames) {\n if (!isValidKey(plugName)) {\n throw new Error(`Invalid plug/slot name: ${plugName}`)\n }\n const plugOptions = plugs[plugName]\n if (plugOptions == null) {\n continue\n }\n if (!snap.plugs) {\n snap.plugs = {}\n }\n snap.plugs[plugName] = plugOptions\n }\n }\n }\n\n if (buildPackages.length > 0) {\n snap.parts.app[\"build-packages\"] = buildPackages\n }\n if (options.after != null) {\n snap.parts.app.after = options.after\n }\n\n if (options.assumes != null) {\n snap.assumes = asArray(options.assumes)\n }\n\n return snap\n }\n\n async buildSnap(props: { snap: any; appOutDir: string; stageDir: string; snapArch: Arch; artifactPath: string }): Promise<void> {\n const { snap, appOutDir, stageDir, snapArch, artifactPath } = props\n\n // Build the args array for effectiveOptionComputed compatibility — tests inspect this.\n const args = [\n \"snap\",\n \"--app\",\n appOutDir,\n \"--stage\",\n stageDir,\n \"--arch\",\n toLinuxArchString(snapArch, \"snap\"),\n \"--output\",\n artifactPath,\n \"--executable\",\n this.packager.executableName,\n ]\n\n await this.helper.icons\n if (this.helper.maxIconPath != null) {\n if (!this.isUseTemplateApp) {\n snap.icon = \"snap/gui/icon.png\"\n }\n args.push(\"--icon\", this.helper.maxIconPath)\n }\n\n const snapMetaDir = path.join(stageDir, this.isUseTemplateApp ? \"meta\" : \"snap\")\n const desktopFile = path.join(snapMetaDir, \"gui\", `${this.helper.getDesktopFileName(snap.name)}.desktop`)\n await this.helper.writeDesktopEntry(this.options, this.packager.executableName + \" %U\", desktopFile, {\n Icon: \"${SNAP}/meta/gui/icon.png\",\n })\n\n const extraAppArgs: Array<string> = this.options.executableArgs ?? []\n if (this.helper.isElectronVersionGreaterOrEqualThan(\"5.0.0\") && !this.isBrowserSandboxAllowed(snap)) {\n const noSandboxArg = \"--no-sandbox\"\n if (!extraAppArgs.includes(noSandboxArg)) {\n extraAppArgs.push(noSandboxArg)\n }\n if (this.isUseTemplateApp) {\n args.push(\"--exclude\", \"chrome-sandbox\")\n }\n }\n if (extraAppArgs.length > 0) {\n args.push(\"--extraAppArgs=\" + extraAppArgs.join(\" \"))\n }\n\n // Capture compression BEFORE it gets stripped from snap for template builds.\n const compression = this.options.compression ?? \"xz\"\n if (snap.compression != null) {\n args.push(\"--compression\", snap.compression)\n }\n\n if (this.isUseTemplateApp) {\n const fieldsToStrip = [\"compression\", \"contact\", \"donation\", \"issues\", \"parts\", \"source-code\", \"website\"]\n for (const field of fieldsToStrip) {\n delete snap[field]\n }\n }\n\n if (this.packager.packagerOptions.effectiveOptionComputed != null && (await this.packager.packagerOptions.effectiveOptionComputed({ snap, desktopFile, args }))) {\n return\n }\n\n await outputFile(path.join(snapMetaDir, this.isUseTemplateApp ? \"snap.yaml\" : \"snapcraft.yaml\"), serializeToYaml(snap))\n\n const hooksDir = await this.packager.getResource(this.options.hooks, \"snap-hooks\")\n if (hooksDir != null) {\n args.push(\"--hooks\", hooksDir)\n }\n\n if (this.isUseTemplateApp) {\n const templateArch = snapArch === Arch.x64 ? \"amd64\" : \"armhf\"\n args.push(\"--template-url\", `electron4:${templateArch}`)\n await this.buildWithTemplate({ appOutDir, stageDir, snapArch, artifactPath, compression, hooksDir, extraAppArgs })\n } else {\n await this.buildWithoutTemplate({ appOutDir, stageDir, artifactPath, hooksDir, extraAppArgs })\n }\n }\n\n private async buildWithTemplate(opts: {\n appOutDir: string\n stageDir: string\n snapArch: Arch\n artifactPath: string\n compression: string\n hooksDir: string | null\n extraAppArgs: string[]\n }): Promise<void> {\n const { appOutDir, stageDir, snapArch, artifactPath, compression, hooksDir, extraAppArgs } = opts\n const templateArch = snapArch === Arch.x64 ? \"amd64\" : \"armhf\"\n const { releaseName, filenameWithExt, checksums } = SNAP_TEMPLATES[templateArch]\n\n log.info({ releaseName }, \"downloading snap template\")\n const templateDir = await downloadBuilderToolset({ releaseName, filenameWithExt, checksums, githubOrgRepo: \"electron-userland/electron-builder-binaries\" })\n\n await this.stageSnapFiles({ stageDir, appOutDir, hooksDir, extraAppArgs, isTemplate: true })\n\n // Best-effort: remove chrome-sandbox from app dir before mksquashfs scans it.\n await rm(path.join(appOutDir, \"chrome-sandbox\"), { force: true })\n\n // chmod -R g-s to avoid setgid bits in final image\n for (const dir of [stageDir, appOutDir, templateDir]) {\n await exec(\"chmod\", [\"-R\", \"g-s\", dir]).catch(err => log.warn({ error: err.message }, \"chmod g-s failed\"))\n }\n\n const { mksquashfs } = await getAppImageTools(\"0.0.0\", snapArch, this.packager.buildResourcesDir)\n\n // Collect top-level entries from each dir as individual path args (mirrors Go ReadDirContentTo)\n const mksquashfsArgs: string[] = [\n ...(await readDirPaths(templateDir)),\n ...(await readDirPaths(stageDir)),\n ...(await readDirPaths(appOutDir, name => name !== \"LICENSES.chromium.html\" && name !== \"LICENSE.electron.txt\" && name !== \"chrome-sandbox\")),\n artifactPath,\n \"-no-progress\",\n \"-quiet\",\n \"-noappend\",\n \"-comp\",\n compression,\n \"-no-xattrs\",\n \"-no-fragments\",\n \"-all-root\",\n ]\n\n await exec(mksquashfs, mksquashfsArgs, { cwd: stageDir })\n }\n\n private async buildWithoutTemplate(opts: { appOutDir: string; stageDir: string; artifactPath: string; hooksDir: string | null; extraAppArgs: string[] }): Promise<void> {\n const { appOutDir, stageDir, artifactPath, hooksDir, extraAppArgs } = opts\n\n await this.stageSnapFiles({ stageDir, appOutDir, hooksDir, extraAppArgs, isTemplate: false })\n\n // Write desktop integration scripts (embedded in the Go binary, now in our templates)\n const snapTemplateDir = getTemplatePath(\"snap\")\n for (const script of [\"desktop-init.sh\", \"desktop-common.sh\", \"desktop-gnome-specific.sh\"]) {\n const src = path.join(snapTemplateDir, script)\n const dest = path.join(stageDir, \"scripts\", script)\n await copyFile(src, dest)\n // copyFile doesn't preserve mode; chmod 755 explicitly\n await chmod(dest, 0o755)\n }\n\n // Copy app dir into stage/app/ so snapcraft can pick it up\n await copyDir(appOutDir, path.join(stageDir, \"app\"))\n\n // Run snapcraft (legacy `snap` subcommand)\n const isDestructiveMode = isSnapDestructiveMode()\n const snapOutputName = \"out.snap\"\n const snapArgs = [\"snap\", \"--output\", isDestructiveMode ? artifactPath : snapOutputName]\n if (isDestructiveMode) {\n snapArgs.push(\"--destructive-mode\")\n }\n\n await exec(\"snapcraft\", snapArgs, {\n cwd: stageDir,\n env: { ...process.env, SNAPCRAFT_HAS_TTY: \"false\" },\n })\n\n if (!isDestructiveMode) {\n await rename(path.join(stageDir, snapOutputName), artifactPath)\n }\n }\n\n private async stageSnapFiles(opts: { stageDir: string; appOutDir: string; hooksDir: string | null; extraAppArgs: string[]; isTemplate: boolean }): Promise<void> {\n const { stageDir, hooksDir, extraAppArgs, isTemplate } = opts\n\n const snapMetaDir = path.join(stageDir, isTemplate ? \"meta\" : \"snap\")\n // No-template builds place command.sh + desktop scripts in scripts/ which snapcraft stages to snap root.\n // Template builds write command.sh to the stage root directly; no scripts/ dir is needed.\n const scriptDir = path.join(stageDir, \"scripts\")\n if (!isTemplate) {\n await mkdir(scriptDir, { recursive: true })\n }\n\n if (this.helper.maxIconPath != null) {\n const iconDest = path.join(snapMetaDir, \"gui\", `icon${path.extname(this.helper.maxIconPath)}`)\n await mkdir(path.dirname(iconDest), { recursive: true })\n await copyFile(this.helper.maxIconPath, iconDest)\n }\n\n if (hooksDir != null) {\n await copyDir(hooksDir, path.join(snapMetaDir, \"hooks\"))\n }\n\n // command.sh — template builds write to stage root; no-template writes to scripts/\n const commandWrapperPath = isTemplate ? path.join(stageDir, \"command.sh\") : path.join(scriptDir, \"command.sh\")\n const commandContent = buildCommandShContent({ isTemplate, executableName: this.packager.executableName, extraAppArgs })\n await writeFile(commandWrapperPath, commandContent, { mode: 0o755 })\n await chmod(commandWrapperPath, 0o755)\n }\n\n private normalizePlugConfiguration(raw: Array<string | PlugDescriptor> | PlugDescriptor | Nullish): Record<string, Record<string, any> | null> | null {\n if (raw == null) {\n return null\n }\n\n const result: any = {}\n for (const item of Array.isArray(raw) ? raw : [raw]) {\n if (typeof item === \"string\") {\n if (!isValidKey(item)) {\n throw new Error(`Invalid plug/slot name: ${item}`)\n }\n result[item] = null\n } else {\n deepAssign(result, item)\n }\n }\n return result\n }\n\n private isBrowserSandboxAllowed(snap: any): boolean {\n if (snap.plugs != null) {\n for (const plugName of Object.keys(snap.plugs)) {\n const plug = snap.plugs[plugName]\n if (plug.interface === \"browser-support\" && plug[\"allow-sandbox\"] === true) {\n return true\n }\n }\n }\n return false\n }\n\n private archNameToTriplet(arch: Arch): string {\n switch (arch) {\n case Arch.x64:\n return \"x86_64-linux-gnu\"\n case Arch.ia32:\n return \"i386-linux-gnu\"\n case Arch.armv7l:\n return \"arm-linux-gnueabihf\"\n case Arch.arm64:\n return \"aarch64-linux-gnu\"\n\n default:\n throw new Error(`Unsupported arch ${arch}`)\n }\n }\n}\n\nasync function readDirPaths(dir: string, filter?: (name: string) => boolean): Promise<string[]> {\n const entries = await readdir(dir)\n const result: string[] = []\n for (const name of entries) {\n if (!filter || filter(name)) {\n result.push(path.join(dir, name))\n }\n }\n return result\n}\n\n/**\n * Builds the content of command.sh for a snap package.\n *\n * For both template and no-template builds, the desktop-integration scripts are\n * sourced from the snap root ($SNAP):\n * - Template: scripts are embedded in the template tarball at the snap root.\n * - No-template: the snapcraft.yaml `launch-scripts` part uses `plugin: dump,\n * source: scripts`, which stages stageDir/scripts/ contents directly into the\n * snap root — so $SNAP/desktop-init.sh is correct in both cases.\n *\n * The only difference between template and no-template is the app executable prefix:\n * template apps are at $SNAP/<name>; no-template apps are at $SNAP/app/<name>.\n */\nexport function buildCommandShContent(opts: { isTemplate: boolean; executableName: string; extraAppArgs: string[] }): string {\n const { isTemplate, executableName, extraAppArgs } = opts\n validateShellEmbeddable(executableName, \"executableName\")\n const appPrefix = isTemplate ? \"\" : \"app/\"\n return buildLauncherScript({\n shebang: \"#!/bin/bash -e\",\n command: ['\"$SNAP/desktop-init.sh\"', '\"$SNAP/desktop-common.sh\"', '\"$SNAP/desktop-gnome-specific.sh\"', `\"$SNAP/${appPrefix}${executableName}\"`],\n args: extraAppArgs,\n })\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
1
|
+
import { shellQuote } from "../launcherScript.js";
|
|
2
|
+
export { shellQuote };
|
|
3
3
|
/**
|
|
4
4
|
* Builds the contents of the launcher script that execs `$SNAP/app/<execName>` with the given args.
|
|
5
5
|
* `$@` is forwarded so launch-time arguments still reach the app. The executable name is validated
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapCommand.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/snapCommand.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"snapCommand.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/snapCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAStE,OAAO,EAAE,UAAU,EAAE,CAAA;AAErB;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,CAIjG"}
|