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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FpmTarget.js","sourceRoot":"","sources":["../../../src/targets/linux/FpmTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, asArray, exec, getArchSuffix, log, serializeToYaml, stripSensitiveEnvVars, TmpDir, toLinuxArchString, unlinkIfExists, use } from \"builder-util\"\nimport { Nullish } from \"builder-util-runtime\"\n\nimport { objectToArgs } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport { mkdir, readFile } from \"fs/promises\"\nimport * as path from \"path\"\nimport { smarten } from \"../../appInfo.js\"\nimport { Target } from \"../../core.js\"\nimport * as errorMessages from \"../../errorMessages.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { DebOptions, LinuxTargetSpecificOptions } from \"../../options/linuxOptions.js\"\nimport { ArtifactCreated } from \"../../packagerApi.js\"\nimport { getAppUpdatePublishConfiguration } from \"../../publish/PublishManager.js\"\nimport { getFpmPath } from \"../../toolsets/fpm.js\"\nimport { getLinuxToolsPath } from \"../../toolsets/linuxToolsMac.js\"\nimport { computeEnv } from \"../../util/bundledTool.js\"\nimport { isFpmDebug } from \"../../util/flags.js\"\nimport { hashFile } from \"../../util/hash.js\"\nimport { isMacOsSierra } from \"../../util/mac/macosVersion.js\"\nimport { getTemplatePath } from \"../../util/pathManager.js\"\nimport { installPrefix, LinuxTargetHelper } from \"./LinuxTargetHelper.js\"\nconst { copyFile, outputFile, stat } = _fsExtra\n\ninterface FpmOptions {\n name: string\n maintainer: string | undefined\n vendor: string\n url: string\n}\n\ninterface ScriptFiles {\n afterRemove: string\n afterInstall: string\n appArmor: string\n}\n\nexport default class FpmTarget extends Target {\n readonly options: LinuxTargetSpecificOptions = this.packager.getOptionsForTarget<LinuxTargetSpecificOptions>(this.name)\n\n private readonly scriptFiles: Promise<ScriptFiles>\n\n constructor(\n name: string,\n private readonly packager: LinuxPackager,\n private readonly helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name, false)\n\n this.scriptFiles = this.createScripts()\n }\n\n private async createScripts(): Promise<ScriptFiles> {\n const defaultTemplatesDir = getTemplatePath(\"linux\")\n\n const packager = this.packager\n\n /** Escape a string value for safe interpolation inside a bash single-quoted\n * string (`'...'`). The only character that can break out of a POSIX\n * single-quoted context is a literal single-quote; we replace it with the\n * standard `'\\''` sequence (end quote → escaped quote → start quote).\n *\n * sanitize-filename removes characters that are illegal in filenames but\n * deliberately keeps `'` because it is valid on POSIX systems. Without\n * this extra step, an app named `O'Brien` would terminate the quoted path\n * inside the generated after-install / after-remove shell scripts, enabling\n * arbitrary command injection when the package is installed as root. */\n function bashSingleQuoteEscape(value: string): string {\n return value.replace(/'/g, \"'\\\\''\")\n }\n\n // Bash-script templates embed executable and sanitizedProductName inside\n // single-quoted shell paths — escape single quotes to prevent injection.\n const bashTemplateOptions = {\n // old API compatibility\n executable: bashSingleQuoteEscape(packager.executableName),\n sanitizedProductName: bashSingleQuoteEscape(packager.appInfo.sanitizedProductName),\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n // The AppArmor profile template uses these values inside double-quoted\n // AppArmor path patterns — no single-quote escaping needed or wanted.\n const appArmorTemplateOptions = {\n executable: packager.executableName,\n sanitizedProductName: packager.appInfo.sanitizedProductName,\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n function getResource(value: string | Nullish, defaultFile: string) {\n if (value == null) {\n return path.join(defaultTemplatesDir, defaultFile)\n }\n return path.resolve(packager.projectDir, value)\n }\n\n return {\n afterInstall: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterInstall, \"after-install.tpl\"), bashTemplateOptions),\n afterRemove: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterRemove, \"after-remove.tpl\"), bashTemplateOptions),\n appArmor: await writeConfigFile(packager.tempDirManager, getResource(this.options.appArmorProfile, \"apparmor-profile.tpl\"), appArmorTemplateOptions),\n }\n }\n\n checkOptions(): Promise<any> {\n return this.computeFpmMetaInfoOptions()\n }\n\n private async computeFpmMetaInfoOptions(): Promise<FpmOptions> {\n const packager = this.packager\n const projectUrl = await packager.appInfo.computePackageUrl()\n const errors: Array<string> = []\n if (projectUrl == null) {\n errors.push(\"Please specify project homepage, see https://www.electron.build/configuration#metadata\")\n }\n\n const options = this.options\n let author = options.maintainer\n if (author == null) {\n const a = packager.metadata.author\n if (a == null || a.email == null) {\n errors.push(errorMessages.authorEmailIsMissed)\n } else {\n author = `${a.name} <${a.email}>`\n }\n }\n\n if (errors.length > 0) {\n throw new Error(errors.join(\"\\n\\n\"))\n }\n\n return {\n name: options.packageName ?? this.packager.appInfo.linuxPackageName,\n maintainer: author!,\n url: projectUrl!,\n vendor: options.vendor || author!,\n }\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const target = this.name\n\n // tslint:disable:no-invalid-template-strings\n let nameFormat = \"${name}-${version}-${arch}.${ext}\"\n let isUseArchIfX64 = false\n if (target === \"deb\") {\n nameFormat = \"${name}_${version}_${arch}.${ext}\"\n isUseArchIfX64 = true\n } else if (target === \"rpm\") {\n nameFormat = \"${name}-${version}.${arch}.${ext}\"\n isUseArchIfX64 = true\n }\n\n const packager = this.packager\n const artifactName = packager.expandArtifactNamePattern(this.options, target, arch, nameFormat, !isUseArchIfX64)\n const artifactPath = path.join(this.outDir, artifactName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: target,\n file: artifactPath,\n arch,\n })\n\n await unlinkIfExists(artifactPath)\n if (packager.packagerOptions.prepackaged != null) {\n await mkdir(this.outDir, { recursive: true })\n }\n const linuxDistType = packager.packagerOptions.prepackaged || path.join(this.outDir, `linux${getArchSuffix(arch)}-unpacked`)\n const resourceDir = packager.getResourcesDir(linuxDistType)\n\n const publishConfig = this.supportsAutoUpdate(target)\n ? await getAppUpdatePublishConfiguration(packager, this.options, arch, false /* in any case validation will be done on publish step */)\n : null\n if (publishConfig != null) {\n log.info({ resourceDir: log.filePath(resourceDir) }, `adding autoupdate files for: ${target}`)\n await outputFile(path.join(resourceDir, \"app-update.yml\"), serializeToYaml(publishConfig))\n // Extra file needed for auto-updater to detect installation method\n await outputFile(path.join(resourceDir, \"package-type\"), target)\n }\n\n const scripts = await this.scriptFiles\n\n // Install AppArmor support for ubuntu 24+\n // https://github.com/electron-userland/electron-builder/issues/8635\n await copyFile(scripts.appArmor, path.join(resourceDir, \"apparmor-profile\"))\n\n const appInfo = packager.appInfo\n const options = this.options\n const synopsis = options.synopsis\n const args = [\n \"--architecture\",\n toLinuxArchString(arch, target),\n \"--after-install\",\n scripts.afterInstall,\n \"--after-remove\",\n scripts.afterRemove,\n \"--description\",\n smarten(target === \"rpm\" ? this.helper.getDescription(options) : `${synopsis || \"\"}\\n ${this.helper.getDescription(options)}`),\n \"--version\",\n this.helper.getSanitizedVersion(target),\n \"--package\",\n artifactPath,\n ]\n\n const meta = await this.computeFpmMetaInfoOptions()\n args.push(...objectToArgs({ name: meta.name, maintainer: meta.maintainer ?? null, vendor: meta.vendor, url: meta.url }))\n\n const packageCategory = options.packageCategory\n if (packageCategory != null) {\n args.push(\"--category\", packageCategory)\n }\n\n if (target === \"deb\") {\n args.push(\"--deb-priority\", (options as DebOptions).priority ?? \"optional\")\n } else if (target === \"rpm\") {\n if (synopsis != null) {\n args.push(\"--rpm-summary\", smarten(synopsis))\n }\n }\n\n const fpmConfiguration: FpmConfiguration = {\n args,\n target,\n }\n\n if (options.compression != null) {\n fpmConfiguration.compression = options.compression\n }\n\n // noinspection JSDeprecatedSymbols\n const depends = options.depends\n if (depends != null) {\n if (Array.isArray(depends)) {\n fpmConfiguration.customDepends = depends\n } else if (typeof depends === \"string\") {\n fpmConfiguration.customDepends = [depends as string]\n } else {\n throw new Error(`depends must be Array or String, but specified as: ${depends}`)\n }\n } else {\n fpmConfiguration.customDepends = this.getDefaultDepends(target)\n }\n\n if (target === \"deb\") {\n const recommends = (options as DebOptions).recommends\n if (recommends) {\n fpmConfiguration.customRecommends = asArray(recommends)\n } else {\n fpmConfiguration.customRecommends = this.getDefaultRecommends(target)\n }\n }\n\n use(packager.metadata.license, it => args.push(\"--license\", it))\n use(appInfo.buildNumber, it =>\n args.push(\n \"--iteration\",\n // dashes are not supported for iteration in older versions of fpm\n // https://github.com/jordansissel/fpm/issues/1833\n it.split(\"-\").join(\"_\")\n )\n )\n\n use(options.fpm, it => args.push(...it))\n\n args.push(`${appOutDir}/=${installPrefix}/${appInfo.sanitizedProductName}`)\n for (const icon of await this.helper.icons) {\n const extWithDot = path.extname(icon.file)\n const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n args.push(`${icon.file}=/usr/share/icons/hicolor/${sizeName}/apps/${packager.executableName}${extWithDot}`)\n }\n\n const mimeTypeFilePath = await this.helper.mimeTypeFiles\n if (mimeTypeFilePath != null) {\n args.push(`${mimeTypeFilePath}=/usr/share/mime/packages/${packager.executableName}.xml`)\n }\n\n const desktopFilePath = await this.helper.writeDesktopEntry(this.options)\n args.push(`${desktopFilePath}=/usr/share/applications/${this.helper.getDesktopFileName()}.desktop`)\n\n if (packager.packagerOptions.effectiveOptionComputed != null && (await packager.packagerOptions.effectiveOptionComputed([args, desktopFilePath]))) {\n return\n }\n\n const env = {\n ...stripSensitiveEnvVars(process.env),\n }\n\n // rpmbuild wants directory rpm with some default config files. Even if we can use dylibbundler, path to such config files are not changed (we need to replace in the binary)\n // so, for now, brew install rpm is still required.\n if (target !== \"rpm\" && (await isMacOsSierra())) {\n const linuxToolsPath = await getLinuxToolsPath(packager.config.toolsets?.linuxToolsMac, packager.buildResourcesDir)\n Object.assign(env, {\n PATH: computeEnv(process.env.PATH, [path.join(linuxToolsPath, \"bin\")]),\n DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, [path.join(linuxToolsPath, \"lib\")]),\n })\n }\n\n await this.executeFpm(target, fpmConfiguration, env)\n\n let info: ArtifactCreated = {\n file: artifactPath,\n target: this,\n arch,\n packager,\n }\n if (publishConfig != null) {\n info = {\n ...info,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, target, arch, !isUseArchIfX64),\n isWriteUpdateInfo: true,\n updateInfo: {\n sha512: await hashFile(artifactPath),\n size: (await stat(artifactPath)).size,\n },\n }\n }\n await packager.emitArtifactBuildCompleted(info)\n }\n\n private async executeFpm(target: string, fpmConfiguration: FpmConfiguration, env: any) {\n const fpmArgs = [\"-s\", \"dir\", \"--force\", \"-t\", target]\n const forceDebugLogging = isFpmDebug()\n if (forceDebugLogging) {\n fpmArgs.push(\"--debug\")\n }\n if (log.isDebugEnabled) {\n fpmArgs.push(\"--log\", \"debug\")\n }\n fpmConfiguration.customDepends?.forEach(it => fpmArgs.push(\"-d\", it))\n if (target === \"deb\") {\n fpmConfiguration.customRecommends?.forEach(it => fpmArgs.push(\"--deb-recommends\", it))\n }\n\n const defaultCompression = target === \"rpm\" ? \"xzmt\" : \"xz\"\n fpmArgs.push(...this.configureTargetSpecificOptions(target, fpmConfiguration.compression ?? defaultCompression))\n fpmArgs.push(...fpmConfiguration.args)\n\n const fpmPath = await getFpmPath(this.packager.config.toolsets?.fpm, this.packager.buildResourcesDir)\n\n await exec(fpmPath, fpmArgs, { env }).catch(e => {\n if (e.message.includes(\"Need executable 'rpmbuild' to convert dir to rpm\")) {\n const hint = \"to build rpm, executable rpmbuild is required, please install rpm package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install rpm)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install rpm)\")\n }\n }\n if (e.message.includes(\"xz: not found\")) {\n const hint = \"to build rpm, executable xz is required, please install xz package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install xz)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install xz-utils)\")\n }\n }\n if (e.message.includes(\"error: File not found\")) {\n log.error(\n { fpmArgs, ...fpmConfiguration },\n \"fpm failed to find the specified files. Please check your configuration and ensure all paths are correct. To see what files triggered this, set the environment variable FPM_DEBUG=true\"\n )\n if (forceDebugLogging) {\n log.error(null, e.message)\n }\n throw new Error(`FPM failed to find the specified files. Please check your configuration and ensure all paths are correct. Command: ${fpmPath} ${fpmArgs.join(\" \")}`)\n }\n throw e\n })\n }\n\n private supportsAutoUpdate(target: string) {\n return [\"deb\", \"rpm\", \"pacman\"].includes(target)\n }\n\n private getDefaultDepends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libgtk-3-0\", \"libnotify4\", \"libnss3\", \"libxss1\", \"libxtst6\", \"xdg-utils\", \"libatspi2.0-0\", \"libuuid1\", \"libsecret-1-0\"]\n\n case \"rpm\":\n return [\n \"gtk3\" /* for electron 2+ (electron 1 uses gtk2, but this old version is not supported anymore) */,\n \"libnotify\",\n \"nss\",\n \"libXScrnSaver\",\n \"(libXtst or libXtst6)\",\n \"xdg-utils\",\n \"at-spi2-core\" /* since 5.0.0 */,\n \"(libuuid or libuuid1)\" /* since 4.0.0 */,\n ]\n\n case \"pacman\":\n return [\"c-ares\", \"ffmpeg\", \"gtk3\", \"http-parser\", \"libevent\", \"libvpx\", \"libxslt\", \"libxss\", \"minizip\", \"nss\", \"re2\", \"snappy\", \"libnotify\", \"libappindicator-gtk3\"]\n\n default:\n return []\n }\n }\n\n private getDefaultRecommends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libappindicator3-1\"]\n default:\n return []\n }\n }\n\n private configureTargetSpecificOptions(target: string, compression: string): string[] {\n switch (target) {\n case \"rpm\":\n return [\"--rpm-os\", \"linux\", \"--rpm-compression\", compression === \"xz\" ? \"xzmt\" : compression]\n case \"deb\":\n return [\"--deb-compression\", compression]\n case \"pacman\":\n return [\"--pacman-compression\", compression]\n }\n return []\n }\n}\n\ninterface FpmConfiguration {\n target: string\n args: Array<string>\n customDepends?: Array<string>\n customRecommends?: Array<string>\n compression?: LinuxTargetSpecificOptions[\"compression\"]\n}\n\nasync function writeConfigFile(tmpDir: TmpDir, templatePath: string, options: any): Promise<string> {\n //noinspection JSUnusedLocalSymbols\n function replacer(match: string, p1: string) {\n if (p1 in options) {\n return options[p1]\n } else {\n throw new Error(`Macro ${p1} is not defined`)\n }\n }\n const config = (await readFile(templatePath, \"utf8\")).replace(/\\${([a-zA-Z]+)}/g, replacer)\n\n const outputPath = await tmpDir.getTempFile({ suffix: path.basename(templatePath, \".tpl\") })\n await outputFile(outputPath, config)\n return outputPath\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FpmTarget.js","sourceRoot":"","sources":["../../../src/targets/linux/FpmTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, asArray, exec, getArchSuffix, log, serializeToYaml, stripSensitiveEnvVars, TmpDir, toLinuxArchString, unlinkIfExists, use } from \"builder-util\"\nimport { Nullish } from \"builder-util-runtime\"\n\nimport { objectToArgs } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport { chmod, mkdir, readFile } from \"fs/promises\"\nimport * as path from \"path\"\nimport { smarten } from \"../../appInfo.js\"\nimport { Target } from \"../../core.js\"\nimport * as errorMessages from \"../../errorMessages.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { DebOptions, LinuxTargetSpecificOptions } from \"../../options/linuxOptions.js\"\nimport { ArtifactCreated } from \"../../packagerApi.js\"\nimport { getAppUpdatePublishConfiguration } from \"../../publish/PublishManager.js\"\nimport { getFpmPath } from \"../../toolsets/fpm.js\"\nimport { getLinuxToolsPath } from \"../../toolsets/linuxToolsMac.js\"\nimport { computeEnv } from \"../../util/bundledTool.js\"\nimport { isFpmDebug } from \"../../util/flags.js\"\nimport { hashFile } from \"../../util/hash.js\"\nimport { isMacOsSierra } from \"../../util/mac/macosVersion.js\"\nimport { getTemplatePath } from \"../../util/pathManager.js\"\nimport { buildLauncherScript, shellQuote } from \"./launcherScript.js\"\nimport { installPrefix, LinuxTargetHelper, quoteDesktopExecPath } from \"./LinuxTargetHelper.js\"\nconst { copyFile, outputFile, stat } = _fsExtra\n\ninterface FpmOptions {\n name: string\n maintainer: string | undefined\n vendor: string\n url: string\n}\n\ninterface ScriptFiles {\n afterRemove: string\n afterInstall: string\n appArmor: string\n}\n\nexport default class FpmTarget extends Target {\n readonly options: LinuxTargetSpecificOptions = this.packager.getOptionsForTarget<LinuxTargetSpecificOptions>(this.name)\n\n private readonly scriptFiles: Promise<ScriptFiles>\n\n constructor(\n name: string,\n private readonly packager: LinuxPackager,\n private readonly helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name, false)\n\n this.scriptFiles = this.createScripts()\n }\n\n private async createScripts(): Promise<ScriptFiles> {\n const defaultTemplatesDir = getTemplatePath(\"linux\")\n\n const packager = this.packager\n\n /** Escape a string value for safe interpolation inside a bash single-quoted\n * string (`'...'`). The only character that can break out of a POSIX\n * single-quoted context is a literal single-quote; we replace it with the\n * standard `'\\''` sequence (end quote → escaped quote → start quote).\n *\n * sanitize-filename removes characters that are illegal in filenames but\n * deliberately keeps `'` because it is valid on POSIX systems. Without\n * this extra step, an app named `O'Brien` would terminate the quoted path\n * inside the generated after-install / after-remove shell scripts, enabling\n * arbitrary command injection when the package is installed as root. */\n function bashSingleQuoteEscape(value: string): string {\n return value.replace(/'/g, \"'\\\\''\")\n }\n\n // Bash-script templates embed executable and sanitizedProductName inside\n // single-quoted shell paths — escape single quotes to prevent injection.\n const bashTemplateOptions = {\n // old API compatibility\n executable: bashSingleQuoteEscape(packager.executableName),\n sanitizedProductName: bashSingleQuoteEscape(packager.appInfo.sanitizedProductName),\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n // The AppArmor profile template uses these values inside double-quoted\n // AppArmor path patterns — no single-quote escaping needed or wanted.\n const appArmorTemplateOptions = {\n executable: packager.executableName,\n sanitizedProductName: packager.appInfo.sanitizedProductName,\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n function getResource(value: string | Nullish, defaultFile: string) {\n if (value == null) {\n return path.join(defaultTemplatesDir, defaultFile)\n }\n return path.resolve(packager.projectDir, value)\n }\n\n return {\n afterInstall: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterInstall, \"after-install.tpl\"), bashTemplateOptions),\n afterRemove: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterRemove, \"after-remove.tpl\"), bashTemplateOptions),\n appArmor: await writeConfigFile(packager.tempDirManager, getResource(this.options.appArmorProfile, \"apparmor-profile.tpl\"), appArmorTemplateOptions),\n }\n }\n\n checkOptions(): Promise<any> {\n return this.computeFpmMetaInfoOptions()\n }\n\n private async computeFpmMetaInfoOptions(): Promise<FpmOptions> {\n const packager = this.packager\n const projectUrl = await packager.appInfo.computePackageUrl()\n const errors: Array<string> = []\n if (projectUrl == null) {\n errors.push(\"Please specify project homepage, see https://www.electron.build/configuration#metadata\")\n }\n\n const options = this.options\n let author = options.maintainer\n if (author == null) {\n const a = packager.metadata.author\n if (a == null || a.email == null) {\n errors.push(errorMessages.authorEmailIsMissed)\n } else {\n author = `${a.name} <${a.email}>`\n }\n }\n\n if (errors.length > 0) {\n throw new Error(errors.join(\"\\n\\n\"))\n }\n\n return {\n name: options.packageName ?? this.packager.appInfo.linuxPackageName,\n maintainer: author!,\n url: projectUrl!,\n vendor: options.vendor || author!,\n }\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const target = this.name\n\n // tslint:disable:no-invalid-template-strings\n let nameFormat = \"${name}-${version}-${arch}.${ext}\"\n let isUseArchIfX64 = false\n if (target === \"deb\") {\n nameFormat = \"${name}_${version}_${arch}.${ext}\"\n isUseArchIfX64 = true\n } else if (target === \"rpm\") {\n nameFormat = \"${name}-${version}.${arch}.${ext}\"\n isUseArchIfX64 = true\n }\n\n const packager = this.packager\n const artifactName = packager.expandArtifactNamePattern(this.options, target, arch, nameFormat, !isUseArchIfX64)\n const artifactPath = path.join(this.outDir, artifactName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: target,\n file: artifactPath,\n arch,\n })\n\n await unlinkIfExists(artifactPath)\n if (packager.packagerOptions.prepackaged != null) {\n await mkdir(this.outDir, { recursive: true })\n }\n const linuxDistType = packager.packagerOptions.prepackaged || path.join(this.outDir, `linux${getArchSuffix(arch)}-unpacked`)\n const resourceDir = packager.getResourcesDir(linuxDistType)\n\n const publishConfig = this.supportsAutoUpdate(target)\n ? await getAppUpdatePublishConfiguration(packager, this.options, arch, false /* in any case validation will be done on publish step */)\n : null\n if (publishConfig != null) {\n log.info({ resourceDir: log.filePath(resourceDir) }, `adding autoupdate files for: ${target}`)\n await outputFile(path.join(resourceDir, \"app-update.yml\"), serializeToYaml(publishConfig))\n // Extra file needed for auto-updater to detect installation method\n await outputFile(path.join(resourceDir, \"package-type\"), target)\n }\n\n const scripts = await this.scriptFiles\n\n // Install AppArmor support for ubuntu 24+\n // https://github.com/electron-userland/electron-builder/issues/8635\n await copyFile(scripts.appArmor, path.join(resourceDir, \"apparmor-profile\"))\n\n const appInfo = packager.appInfo\n const options = this.options\n const synopsis = options.synopsis\n const args = [\n \"--architecture\",\n toLinuxArchString(arch, target),\n \"--after-install\",\n scripts.afterInstall,\n \"--after-remove\",\n scripts.afterRemove,\n \"--description\",\n smarten(target === \"rpm\" ? this.helper.getDescription(options) : `${synopsis || \"\"}\\n ${this.helper.getDescription(options)}`),\n \"--version\",\n this.helper.getSanitizedVersion(target),\n \"--package\",\n artifactPath,\n ]\n\n const meta = await this.computeFpmMetaInfoOptions()\n args.push(...objectToArgs({ name: meta.name, maintainer: meta.maintainer ?? null, vendor: meta.vendor, url: meta.url }))\n\n const packageCategory = options.packageCategory\n if (packageCategory != null) {\n args.push(\"--category\", packageCategory)\n }\n\n if (target === \"deb\") {\n args.push(\"--deb-priority\", (options as DebOptions).priority ?? \"optional\")\n } else if (target === \"rpm\") {\n if (synopsis != null) {\n args.push(\"--rpm-summary\", smarten(synopsis))\n }\n }\n\n const fpmConfiguration: FpmConfiguration = {\n args,\n target,\n }\n\n if (options.compression != null) {\n fpmConfiguration.compression = options.compression\n }\n\n // noinspection JSDeprecatedSymbols\n const depends = options.depends\n if (depends != null) {\n if (Array.isArray(depends)) {\n fpmConfiguration.customDepends = depends\n } else if (typeof depends === \"string\") {\n fpmConfiguration.customDepends = [depends as string]\n } else {\n throw new Error(`depends must be Array or String, but specified as: ${depends}`)\n }\n } else {\n fpmConfiguration.customDepends = this.getDefaultDepends(target)\n }\n\n if (target === \"deb\") {\n const recommends = (options as DebOptions).recommends\n if (recommends) {\n fpmConfiguration.customRecommends = asArray(recommends)\n } else {\n fpmConfiguration.customRecommends = this.getDefaultRecommends(target)\n }\n }\n\n use(packager.metadata.license, it => args.push(\"--license\", it))\n use(appInfo.buildNumber, it =>\n args.push(\n \"--iteration\",\n // dashes are not supported for iteration in older versions of fpm\n // https://github.com/jordansissel/fpm/issues/1833\n it.split(\"-\").join(\"_\")\n )\n )\n\n use(options.fpm, it => args.push(...it))\n\n args.push(`${appOutDir}/=${installPrefix}/${appInfo.sanitizedProductName}`)\n for (const icon of await this.helper.icons) {\n const extWithDot = path.extname(icon.file)\n const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n args.push(`${icon.file}=/usr/share/icons/hicolor/${sizeName}/apps/${packager.executableName}${extWithDot}`)\n }\n\n const mimeTypeFilePath = await this.helper.mimeTypeFiles\n if (mimeTypeFilePath != null) {\n args.push(`${mimeTypeFilePath}=/usr/share/mime/packages/${packager.executableName}.xml`)\n }\n\n // Launch through a launcher entrypoint so executableArgs are injected in one place and the\n // .desktop Exec key stays a plain command path (consistent with the other Linux targets).\n const launcher = await this.createLauncherScript()\n args.push(`${launcher.tempPath}=${launcher.installPath}`)\n\n const desktopFilePath = await this.helper.writeDesktopEntry(this.options, `${quoteDesktopExecPath(launcher.installPath)} %U`)\n args.push(`${desktopFilePath}=/usr/share/applications/${this.helper.getDesktopFileName()}.desktop`)\n\n if (packager.packagerOptions.effectiveOptionComputed != null && (await packager.packagerOptions.effectiveOptionComputed([args, desktopFilePath]))) {\n return\n }\n\n const env = {\n ...stripSensitiveEnvVars(process.env),\n }\n\n // rpmbuild wants directory rpm with some default config files. Even if we can use dylibbundler, path to such config files are not changed (we need to replace in the binary)\n // so, for now, brew install rpm is still required.\n if (target !== \"rpm\" && (await isMacOsSierra())) {\n const linuxToolsPath = await getLinuxToolsPath(packager.config.toolsets?.linuxToolsMac, packager.buildResourcesDir)\n Object.assign(env, {\n PATH: computeEnv(process.env.PATH, [path.join(linuxToolsPath, \"bin\")]),\n DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, [path.join(linuxToolsPath, \"lib\")]),\n })\n }\n\n await this.executeFpm(target, fpmConfiguration, env)\n\n let info: ArtifactCreated = {\n file: artifactPath,\n target: this,\n arch,\n packager,\n }\n if (publishConfig != null) {\n info = {\n ...info,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, target, arch, !isUseArchIfX64),\n isWriteUpdateInfo: true,\n updateInfo: {\n sha512: await hashFile(artifactPath),\n size: (await stat(artifactPath)).size,\n },\n }\n }\n await packager.emitArtifactBuildCompleted(info)\n }\n\n /**\n * Generate the launcher entrypoint script installed alongside the app binary. The launcher execs\n * the real binary with the configured `executableArgs` (single-quoted) and forwards `\"$@\"` so the\n * desktop launcher's field-code expansions (e.g. opened files/URLs) still reach the app.\n */\n private async createLauncherScript(): Promise<{ installPath: string; tempPath: string }> {\n const { appInfo, executableName } = this.packager\n const appDir = `${installPrefix}/${appInfo.sanitizedProductName}`\n // The launcher path is fully resolved (no shell variables to expand), so single-quote the whole\n // token. This passes any embedded character literally and avoids restricting otherwise-valid\n // executable/product names (e.g. those containing `$` or backtick).\n const content = buildLauncherScript({ command: [shellQuote(`${appDir}/${executableName}`)], args: this.options.executableArgs ?? [] })\n\n const tempPath = await this.packager.tempDirManager.getTempFile({ suffix: \"-launcher.sh\" })\n await outputFile(tempPath, content, { mode: 0o755 })\n await chmod(tempPath, 0o755)\n return { installPath: `${appDir}/${executableName}-launcher`, tempPath }\n }\n\n private async executeFpm(target: string, fpmConfiguration: FpmConfiguration, env: any) {\n const fpmArgs = [\"-s\", \"dir\", \"--force\", \"-t\", target]\n const forceDebugLogging = isFpmDebug()\n if (forceDebugLogging) {\n fpmArgs.push(\"--debug\")\n }\n if (log.isDebugEnabled) {\n fpmArgs.push(\"--log\", \"debug\")\n }\n fpmConfiguration.customDepends?.forEach(it => fpmArgs.push(\"-d\", it))\n if (target === \"deb\") {\n fpmConfiguration.customRecommends?.forEach(it => fpmArgs.push(\"--deb-recommends\", it))\n }\n\n const defaultCompression = target === \"rpm\" ? \"xzmt\" : \"xz\"\n fpmArgs.push(...this.configureTargetSpecificOptions(target, fpmConfiguration.compression ?? defaultCompression))\n fpmArgs.push(...fpmConfiguration.args)\n\n const fpmPath = await getFpmPath(this.packager.config.toolsets?.fpm, this.packager.buildResourcesDir)\n\n await exec(fpmPath, fpmArgs, { env }).catch(e => {\n if (e.message.includes(\"Need executable 'rpmbuild' to convert dir to rpm\")) {\n const hint = \"to build rpm, executable rpmbuild is required, please install rpm package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install rpm)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install rpm)\")\n }\n }\n if (e.message.includes(\"xz: not found\")) {\n const hint = \"to build rpm, executable xz is required, please install xz package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install xz)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install xz-utils)\")\n }\n }\n if (e.message.includes(\"error: File not found\")) {\n log.error(\n { fpmArgs, ...fpmConfiguration },\n \"fpm failed to find the specified files. Please check your configuration and ensure all paths are correct. To see what files triggered this, set the environment variable FPM_DEBUG=true\"\n )\n if (forceDebugLogging) {\n log.error(null, e.message)\n }\n throw new Error(`FPM failed to find the specified files. Please check your configuration and ensure all paths are correct. Command: ${fpmPath} ${fpmArgs.join(\" \")}`)\n }\n throw e\n })\n }\n\n private supportsAutoUpdate(target: string) {\n return [\"deb\", \"rpm\", \"pacman\"].includes(target)\n }\n\n private getDefaultDepends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libgtk-3-0\", \"libnotify4\", \"libnss3\", \"libxss1\", \"libxtst6\", \"xdg-utils\", \"libatspi2.0-0\", \"libuuid1\", \"libsecret-1-0\"]\n\n case \"rpm\":\n return [\n \"gtk3\" /* for electron 2+ (electron 1 uses gtk2, but this old version is not supported anymore) */,\n \"libnotify\",\n \"nss\",\n \"libXScrnSaver\",\n \"(libXtst or libXtst6)\",\n \"xdg-utils\",\n \"at-spi2-core\" /* since 5.0.0 */,\n \"(libuuid or libuuid1)\" /* since 4.0.0 */,\n ]\n\n case \"pacman\":\n return [\"c-ares\", \"ffmpeg\", \"gtk3\", \"http-parser\", \"libevent\", \"libvpx\", \"libxslt\", \"libxss\", \"minizip\", \"nss\", \"re2\", \"snappy\", \"libnotify\", \"libappindicator-gtk3\"]\n\n default:\n return []\n }\n }\n\n private getDefaultRecommends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libappindicator3-1\"]\n default:\n return []\n }\n }\n\n private configureTargetSpecificOptions(target: string, compression: string): string[] {\n switch (target) {\n case \"rpm\":\n return [\"--rpm-os\", \"linux\", \"--rpm-compression\", compression === \"xz\" ? \"xzmt\" : compression]\n case \"deb\":\n return [\"--deb-compression\", compression]\n case \"pacman\":\n return [\"--pacman-compression\", compression]\n }\n return []\n }\n}\n\ninterface FpmConfiguration {\n target: string\n args: Array<string>\n customDepends?: Array<string>\n customRecommends?: Array<string>\n compression?: LinuxTargetSpecificOptions[\"compression\"]\n}\n\nasync function writeConfigFile(tmpDir: TmpDir, templatePath: string, options: any): Promise<string> {\n //noinspection JSUnusedLocalSymbols\n function replacer(match: string, p1: string) {\n if (p1 in options) {\n return options[p1]\n } else {\n throw new Error(`Macro ${p1} is not defined`)\n }\n }\n const config = (await readFile(templatePath, \"utf8\")).replace(/\\${([a-zA-Z]+)}/g, replacer)\n\n const outputPath = await tmpDir.getTempFile({ suffix: path.basename(templatePath, \".tpl\") })\n await outputFile(outputPath, config)\n return outputPath\n}\n"]}
|
|
@@ -2,6 +2,18 @@ import { LinuxPackager } from "../../linuxPackager.js";
|
|
|
2
2
|
import { CommonLinuxOptions } from "../../options/linuxOptions.js";
|
|
3
3
|
import { SnapCore } from "./snap/SnapTarget.js";
|
|
4
4
|
import { IconInfo } from "../../util/iconConverter.js";
|
|
5
|
+
/**
|
|
6
|
+
* Quote a command / path token for the freedesktop Exec key.
|
|
7
|
+
*
|
|
8
|
+
* Every Linux target launches through a launcher entrypoint, so the Exec key only ever holds a
|
|
9
|
+
* single command (the launcher path) plus field codes — never user-supplied `executableArgs`.
|
|
10
|
+
* Plain paths made up of portable characters are emitted as-is; anything else is wrapped in
|
|
11
|
+
* double quotes. The spec requires the reserved characters `"`, backtick, `$` and `\` to be
|
|
12
|
+
* backslash-escaped inside the quotes, so they are escaped here to keep the Exec token valid.
|
|
13
|
+
*
|
|
14
|
+
* @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables
|
|
15
|
+
*/
|
|
16
|
+
export declare function quoteDesktopExecPath(value: string): string;
|
|
5
17
|
export declare const installPrefix = "/opt";
|
|
6
18
|
export declare class LinuxTargetHelper {
|
|
7
19
|
private packager;
|
|
@@ -18,6 +30,8 @@ export declare class LinuxTargetHelper {
|
|
|
18
30
|
getDescription(options: CommonLinuxOptions): string;
|
|
19
31
|
getSanitizedVersion(target: string): string;
|
|
20
32
|
writeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, destination?: string | null, extra?: Record<string, string>): Promise<string>;
|
|
33
|
+
private desktopNameWarningEmitted;
|
|
34
|
+
private resolveDesktopName;
|
|
21
35
|
getDesktopFileName(fallback?: string): string;
|
|
22
36
|
computeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, extra?: Record<string, string>): Promise<string>;
|
|
23
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinuxTargetHelper.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/LinuxTargetHelper.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAI/C,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"LinuxTargetHelper.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/LinuxTargetHelper.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAI/C,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAyBtD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK1D;AAYD,eAAO,MAAM,aAAa,SAAS,CAAA;AAEnC,qBAAa,iBAAiB;IAOhB,OAAO,CAAC,QAAQ;IAN5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6C;IAEzE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8C;IAEnF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAO;gBAEb,QAAQ,EAAE,aAAa;IAE3C,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAEpC;IAED,IAAI,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE1C;IAED,WAAW,IAAI,QAAQ,CAAC,GAAG,CAAC;IAyC5B,mCAAmC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;YAQlE,oBAAoB;YA4BpB,mBAAmB;IAsBjC,cAAc,CAAC,OAAO,EAAE,kBAAkB;IAI1C,mBAAmB,CAAC,MAAM,EAAE,MAAM;IAe5B,iBAAiB,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAS/J,OAAO,CAAC,yBAAyB,CAAQ;IAQzC,OAAO,CAAC,kBAAkB;IAwB1B,kBAAkB,CAAC,QAAQ,GAAE,MAAqC,GAAG,MAAM;IAI3E,mBAAmB,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CA8G/H"}
|
|
@@ -29,38 +29,21 @@ function desktopStringEscape(value) {
|
|
|
29
29
|
return value.replace(/\\/g, "\\\\").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t");
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
33
|
-
* freedesktop Desktop Entry Specification. Plain alphanumeric args and
|
|
34
|
-
* field codes must NOT be wrapped in quotes.
|
|
32
|
+
* Quote a command / path token for the freedesktop Exec key.
|
|
35
33
|
*
|
|
36
|
-
*
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* Field codes (`%f`, `%u`, `%F`, `%U`, etc.) MUST be left unquoted — the
|
|
43
|
-
* desktop launcher only expands them in unquoted token positions. Wrapping
|
|
44
|
-
* them in `"…"` causes the launcher to treat them as literal strings, which
|
|
45
|
-
* breaks file-association / drag-and-drop functionality.
|
|
46
|
-
*
|
|
47
|
-
* For all other arguments, double-quoting is used when the argument contains
|
|
48
|
-
* any character that would be misinterpreted by the launcher without quoting
|
|
49
|
-
* (spaces, shell metacharacters, etc.). Safe plain-word args are passed
|
|
50
|
-
* through unchanged to keep the Exec line readable.
|
|
34
|
+
* Every Linux target launches through a launcher entrypoint, so the Exec key only ever holds a
|
|
35
|
+
* single command (the launcher path) plus field codes — never user-supplied `executableArgs`.
|
|
36
|
+
* Plain paths made up of portable characters are emitted as-is; anything else is wrapped in
|
|
37
|
+
* double quotes. The spec requires the reserved characters `"`, backtick, `$` and `\` to be
|
|
38
|
+
* backslash-escaped inside the quotes, so they are escaped here to keep the Exec token valid.
|
|
51
39
|
*
|
|
52
40
|
* @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables
|
|
53
41
|
*/
|
|
54
|
-
function
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return arg;
|
|
42
|
+
export function quoteDesktopExecPath(value) {
|
|
43
|
+
if (/^[/0-9A-Za-z._-]+$/.test(value)) {
|
|
44
|
+
return value;
|
|
58
45
|
}
|
|
59
|
-
|
|
60
|
-
if (EXEC_RESERVED_RE.test(arg)) {
|
|
61
|
-
return `"${arg.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
62
|
-
}
|
|
63
|
-
return arg;
|
|
46
|
+
return '"' + value.replace(/["$`\\]/g, "\\$&") + '"';
|
|
64
47
|
}
|
|
65
48
|
function mapLinuxCompressionToSnap(level) {
|
|
66
49
|
if (level === "store") {
|
|
@@ -78,6 +61,9 @@ export class LinuxTargetHelper {
|
|
|
78
61
|
this.iconPromise = new Lazy(() => this.computeDesktopIcons());
|
|
79
62
|
this.mimeTypeFilesPromise = new Lazy(() => this.computeMimeTypeFiles());
|
|
80
63
|
this.maxIconPath = null;
|
|
64
|
+
// Emit the "desktopName not set" warning at most once per build, even though both
|
|
65
|
+
// getDesktopFileName() and computeDesktopEntry() resolve the desktop name.
|
|
66
|
+
this.desktopNameWarningEmitted = false;
|
|
81
67
|
}
|
|
82
68
|
get icons() {
|
|
83
69
|
return this.iconPromise.value;
|
|
@@ -189,13 +175,23 @@ export class LinuxTargetHelper {
|
|
|
189
175
|
await outputFile(file, data);
|
|
190
176
|
return file;
|
|
191
177
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
178
|
+
// https://github.com/electron-userland/electron-builder/issues/9103
|
|
179
|
+
// Electron derives app_id / WM_CLASS from desktopName in package.json; the installed
|
|
180
|
+
// .desktop filename and StartupWMClass must match it for window association to work.
|
|
181
|
+
// https://github.com/electron/electron/blob/9a7b73b5334f1d72c08e2d5e94106706ed751186/lib/browser/init.ts#L128-L133
|
|
182
|
+
// Returns the validated base name (desktopName minus the .desktop suffix), or null when
|
|
183
|
+
// desktopName is unset — callers apply their own fallback (filename vs WM_CLASS).
|
|
184
|
+
resolveDesktopName() {
|
|
196
185
|
const trimmedDesktopName = this.packager.metadata.desktopName?.trim();
|
|
197
186
|
if (isEmptyOrSpaces(trimmedDesktopName)) {
|
|
198
|
-
|
|
187
|
+
if (!this.desktopNameWarningEmitted) {
|
|
188
|
+
this.desktopNameWarningEmitted = true;
|
|
189
|
+
log.warn({
|
|
190
|
+
reason: "desktopName is not set in package.json",
|
|
191
|
+
docs: "https://www.electron.build/docs/linux/#window-association-desktopname",
|
|
192
|
+
}, 'Electron derives the app_id / WM_CLASS used for Linux window association from desktopName. Without it, desktop environments may not link the running window to its launcher entry (taskbar grouping, dock icon, etc.). Set desktopName to a reverse-DNS identifier in package.json, e.g. "com.myapp.MyApp".');
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
199
195
|
}
|
|
200
196
|
const basename = trimmedDesktopName.replace(/\.desktop$/, "");
|
|
201
197
|
// Guard against path traversal: desktopName flows into filesystem paths
|
|
@@ -205,6 +201,9 @@ export class LinuxTargetHelper {
|
|
|
205
201
|
}
|
|
206
202
|
return basename;
|
|
207
203
|
}
|
|
204
|
+
getDesktopFileName(fallback = this.packager.executableName) {
|
|
205
|
+
return this.resolveDesktopName() ?? fallback;
|
|
206
|
+
}
|
|
208
207
|
computeDesktopEntry(targetSpecificOptions, exec, extra) {
|
|
209
208
|
if (exec != null && exec.length === 0) {
|
|
210
209
|
throw new Error("Specified exec is empty");
|
|
@@ -215,35 +214,15 @@ export class LinuxTargetHelper {
|
|
|
215
214
|
}
|
|
216
215
|
const packager = this.packager;
|
|
217
216
|
const appInfo = packager.appInfo;
|
|
218
|
-
const executableArgs = targetSpecificOptions.executableArgs;
|
|
219
217
|
if (exec == null) {
|
|
220
|
-
exec
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
}
|
|
224
|
-
if (executableArgs) {
|
|
225
|
-
exec += " ";
|
|
226
|
-
// Each arg is double-quoted per the freedesktop Exec key spec so that
|
|
227
|
-
// spaces, $, ;, & and other reserved characters are not misinterpreted.
|
|
228
|
-
exec += executableArgs.map(desktopExecArgEscape).join(" ");
|
|
229
|
-
}
|
|
230
|
-
// https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables
|
|
231
|
-
const execCodes = ["%f", "%u", "%F", "%U"];
|
|
232
|
-
if (executableArgs == null || executableArgs.findIndex(arg => execCodes.includes(arg)) === -1) {
|
|
233
|
-
exec += " %U";
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
// https://github.com/electron-userland/electron-builder/issues/9103
|
|
237
|
-
// Electron derives app_id from desktopName in package.json; StartupWMClass must match.
|
|
238
|
-
// https://github.com/electron/electron/blob/9a7b73b5334f1d72c08e2d5e94106706ed751186/lib/browser/init.ts#L128-L133
|
|
239
|
-
const trimmedDesktopName = packager.metadata.desktopName?.trim();
|
|
240
|
-
if (isEmptyOrSpaces(trimmedDesktopName)) {
|
|
241
|
-
log.warn({
|
|
242
|
-
reason: "desktopName is not set in package.json",
|
|
243
|
-
docs: "https://www.electron.build/linux#window-association-desktopname--syncdesktopname",
|
|
244
|
-
}, "electron uses desktopName as app_id / WM_CLASS for window association. Without it desktop environments may not link running windows to this .desktop entry. Set desktopName in package.json and linux.syncDesktopName: true to fix.");
|
|
218
|
+
// Fallback only — targets pass an explicit launcher entrypoint as `exec`. `executableArgs`
|
|
219
|
+
// are injected into that launcher, never into the Exec key (see launcherScript.ts).
|
|
220
|
+
exec = `${quoteDesktopExecPath(`${installPrefix}/${appInfo.sanitizedProductName}/${packager.executableName}`)} %U`;
|
|
245
221
|
}
|
|
246
|
-
|
|
222
|
+
// StartupWMClass must match Electron's app_id (derived from desktopName) for window
|
|
223
|
+
// association; resolveDesktopName() handles the shared warning and validation.
|
|
224
|
+
// Falls back to productName for apps that don't set desktopName.
|
|
225
|
+
const wmClass = this.resolveDesktopName() ?? appInfo.productName;
|
|
247
226
|
const desktopMeta = deepAssign({
|
|
248
227
|
// String values are escaped per the freedesktop spec (\\, \n, \r, \t)
|
|
249
228
|
// so that a product name containing a newline cannot inject new key=value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinuxTargetHelper.js","sourceRoot":"","sources":["../../../src/targets/linux/LinuxTargetHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { asArray, exists, InvalidConfigurationError, isEmptyOrSpaces, log } from \"builder-util\"\nimport { deepAssign } from \"builder-util-runtime\"\n\nimport { Lazy } from \"lazy-val\"\nimport { join } from \"path\"\nimport * as semver from \"semver\"\nimport { CompressionLevel } from \"../../core.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { CommonLinuxOptions } from \"../../options/linuxOptions.js\"\nimport { SnapCore } from \"./snap/SnapTarget.js\"\nimport { SnapCore24 } from \"./snap/core24.js\"\nimport { SnapCoreCustom } from \"./snap/coreCustom.js\"\nimport { SnapCoreLegacy } from \"./snap/coreLegacy.js\"\nimport { IconInfo } from \"../../util/iconConverter.js\"\nimport _fsExtra from \"fs-extra\"\nconst { outputFile } = _fsExtra\n\n/**\n * Escape a string value for use in a freedesktop .desktop file string field\n * (Name, Comment, StartupWMClass, etc.).\n *\n * The freedesktop Desktop Entry Specification requires that the following\n * characters be escaped in string / localestring values:\n * \\n → \\\\n (newline — would inject new key=value lines otherwise)\n * \\r → \\\\r\n * \\t → \\\\t\n * \\\\ → \\\\\\\\\n *\n * Without escaping, a productName or description containing a literal newline\n * can inject arbitrary key=value pairs into the generated .desktop file,\n * potentially overriding the Exec key.\n *\n * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#value-types\n */\nfunction desktopStringEscape(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\\t/g, \"\\\\t\")\n}\n\n/**\n * Characters that require an Exec argument to be double-quoted per the\n * freedesktop Desktop Entry Specification. Plain alphanumeric args and\n * field codes must NOT be wrapped in quotes.\n *\n * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables\n */\nconst EXEC_RESERVED_RE = /[\\s\"'`\\\\<>~|&;$*?#()]/\n\n/**\n * Quote a single argument for use in a .desktop file Exec key.\n *\n * Field codes (`%f`, `%u`, `%F`, `%U`, etc.) MUST be left unquoted — the\n * desktop launcher only expands them in unquoted token positions. Wrapping\n * them in `\"…\"` causes the launcher to treat them as literal strings, which\n * breaks file-association / drag-and-drop functionality.\n *\n * For all other arguments, double-quoting is used when the argument contains\n * any character that would be misinterpreted by the launcher without quoting\n * (spaces, shell metacharacters, etc.). Safe plain-word args are passed\n * through unchanged to keep the Exec line readable.\n *\n * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables\n */\nfunction desktopExecArgEscape(arg: string): string {\n // Field codes (%f, %u, %F, %U, %i, %c, %k, …) must never be quoted.\n if (/^%[a-zA-Z]$/.test(arg)) {\n return arg\n }\n // Only quote when the arg actually contains characters that need it.\n if (EXEC_RESERVED_RE.test(arg)) {\n return `\"${arg.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`\n }\n return arg\n}\n\nfunction mapLinuxCompressionToSnap(level: CompressionLevel | null | undefined): \"xz\" | \"lzo\" | undefined {\n if (level === \"store\") {\n return \"lzo\"\n }\n if (level === \"maximum\") {\n return \"xz\"\n }\n return undefined\n}\n\nexport const installPrefix = \"/opt\"\n\nexport class LinuxTargetHelper {\n private readonly iconPromise = new Lazy(() => this.computeDesktopIcons())\n\n private readonly mimeTypeFilesPromise = new Lazy(() => this.computeMimeTypeFiles())\n\n maxIconPath: string | null = null\n\n constructor(private packager: LinuxPackager) {}\n\n get icons(): Promise<Array<IconInfo>> {\n return this.iconPromise.value\n }\n\n get mimeTypeFiles(): Promise<string | null> {\n return this.mimeTypeFilesPromise.value\n }\n\n getSnapCore(): SnapCore<any> {\n const { snapcraft } = this.packager.config\n\n // Merge linux-level options (category, description, mimeTypes, etc.) as the base so they\n // propagate into the generated snapcraft.yaml and .desktop file without requiring users to\n // duplicate them under core24/core18/etc. Per-core options always win for conflicts.\n // linux.compression is a CompressionLevel (\"store\"/\"normal\"/\"maximum\"); snap compression is an\n // algorithm (\"xz\"/\"lzo\"). Map the level to the nearest algorithm; per-core options override.\n const { compression: linuxCompression, ...linuxOptions } = this.packager.platformOptions\n const snapLinuxOptions = { ...linuxOptions, compression: mapLinuxCompressionToSnap(linuxCompression) }\n\n if (snapcraft != null) {\n const core = snapcraft.base\n const options = snapcraft[core] || {}\n switch (core) {\n case \"core18\":\n case \"core20\":\n case \"core22\":\n if (!this.isElectronVersionGreaterOrEqualThan(\"4.0.0\")) {\n if (!this.isElectronVersionGreaterOrEqualThan(\"2.0.0-beta.1\")) {\n throw new InvalidConfigurationError(\"Electron 2 and higher is required to build Snap with core18/core20/core22\")\n }\n log.warn(null, \"electron 4 and higher is highly recommended for Snap with core18/core20/core22\")\n }\n return new SnapCoreLegacy(this.packager, this, deepAssign({ base: core }, snapLinuxOptions, options))\n case \"core24\":\n if (!this.isElectronVersionGreaterOrEqualThan(\"28.0.0\")) {\n if (!this.isElectronVersionGreaterOrEqualThan(\"25.0.0\")) {\n throw new InvalidConfigurationError(\"Electron 25 and higher is required to build Snap with core24\")\n }\n log.warn(null, \"electron 28 and higher is highly recommended for Snap with core24\")\n }\n return new SnapCore24(this.packager, this, deepAssign({}, snapLinuxOptions, options))\n case \"custom\":\n // Pass-through: do not inject linux options into user-supplied yaml\n return new SnapCoreCustom(this.packager, this, snapcraft.custom || {})\n }\n }\n return new SnapCoreLegacy(this.packager, this, deepAssign({ base: \"core20\" as const }, snapLinuxOptions, {}))\n }\n\n isElectronVersionGreaterOrEqualThan(version: string, fallback?: string): boolean {\n const electronVersion = this.packager.config.electronVersion\n if (!electronVersion) {\n return fallback ? semver.gte(fallback, version) : true\n }\n return semver.gte(electronVersion, version)\n }\n\n private async computeMimeTypeFiles(): Promise<string | null> {\n const items: Array<string> = []\n for (const fileAssociation of this.packager.fileAssociations) {\n if (!fileAssociation.mimeType) {\n continue\n }\n\n const data = `<mime-type type=\"${fileAssociation.mimeType}\">\n <glob pattern=\"*.${fileAssociation.ext}\"/>\n ${fileAssociation.description ? `<comment>${fileAssociation.description}</comment>` : \"\"}\n <icon name=\"x-office-document\" />\n</mime-type>`\n items.push(data)\n }\n\n if (items.length === 0) {\n return null\n }\n\n const file = await this.packager.getTempFile(\".xml\")\n await outputFile(\n file,\n '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">\\n' + items.join(\"\\n\") + \"\\n</mime-info>\"\n )\n return file\n }\n\n // must be name without spaces and other special characters, but not product name used\n private async computeDesktopIcons(): Promise<Array<IconInfo>> {\n const packager = this.packager\n const { config } = packager\n const platformOptions = packager.platformOptions\n\n const sources = [platformOptions.icon, config.mac?.icon ?? config.icon].filter(str => !!str) as string[]\n\n // If no explicit sources are defined, fallback to buildResources directory, then default framework icon\n let fallbackSources = [...asArray(packager.getDefaultFrameworkIcon())]\n const buildResources = config.directories?.buildResources\n if (buildResources && (await exists(join(buildResources, \"icons\")))) {\n fallbackSources = [buildResources, ...fallbackSources]\n }\n\n // need to put here and not as default because need to resolve image size\n const result = await packager.resolveIcon(sources, fallbackSources, \"set\")\n this.maxIconPath = result[result.length - 1].file\n\n // Ignore .icon files for linux (they are exclusive for macOS)\n return result.filter(icon => !icon.file.endsWith(\".icon\"))\n }\n\n getDescription(options: CommonLinuxOptions) {\n return options.description || this.packager.appInfo.description\n }\n\n getSanitizedVersion(target: string) {\n const {\n appInfo: { version },\n } = this.packager\n switch (target) {\n case \"pacman\":\n return version.replace(/-/g, \"_\")\n case \"rpm\":\n case \"deb\":\n return version.replace(/-/g, \"~\")\n default:\n return version\n }\n }\n\n async writeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, destination?: string | null, extra?: Record<string, string>): Promise<string> {\n const data = await this.computeDesktopEntry(targetSpecificOptions, exec, extra)\n const file = destination || (await this.packager.getTempFile(`${this.packager.appInfo.productFilename}.desktop`))\n await outputFile(file, data)\n return file\n }\n\n getDesktopFileName(fallback: string = this.packager.executableName): string {\n if (!this.packager.platformOptions.syncDesktopName) {\n return fallback\n }\n const trimmedDesktopName = this.packager.metadata.desktopName?.trim()\n if (isEmptyOrSpaces(trimmedDesktopName)) {\n return fallback\n }\n const basename = trimmedDesktopName.replace(/\\.desktop$/, \"\")\n // Guard against path traversal: desktopName flows into filesystem paths\n // (snap/gui/<name>.desktop, /usr/share/applications/<name>.desktop, etc.).\n if (/[/\\\\]/.test(basename) || [...basename].some(c => c.charCodeAt(0) === 0)) {\n throw new InvalidConfigurationError(`desktopName \"${trimmedDesktopName}\" produces an invalid .desktop filename — remove any path separators or NUL characters`)\n }\n return basename\n }\n\n computeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, extra?: Record<string, string>): Promise<string> {\n if (exec != null && exec.length === 0) {\n throw new Error(\"Specified exec is empty\")\n }\n // https://github.com/electron-userland/electron-builder/issues/3418\n if (targetSpecificOptions.desktop?.entry?.Exec) {\n throw new Error(\"Please specify executable name as linux.executableName instead of linux.desktop.Exec\")\n }\n\n const packager = this.packager\n const appInfo = packager.appInfo\n\n const executableArgs = targetSpecificOptions.executableArgs\n if (exec == null) {\n exec = `${installPrefix}/${appInfo.sanitizedProductName}/${packager.executableName}`\n if (!/^[/0-9A-Za-z._-]+$/.test(exec)) {\n exec = `\"${exec}\"`\n }\n if (executableArgs) {\n exec += \" \"\n // Each arg is double-quoted per the freedesktop Exec key spec so that\n // spaces, $, ;, & and other reserved characters are not misinterpreted.\n exec += executableArgs.map(desktopExecArgEscape).join(\" \")\n }\n // https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables\n const execCodes = [\"%f\", \"%u\", \"%F\", \"%U\"]\n if (executableArgs == null || executableArgs.findIndex(arg => execCodes.includes(arg)) === -1) {\n exec += \" %U\"\n }\n }\n\n // https://github.com/electron-userland/electron-builder/issues/9103\n // Electron derives app_id from desktopName in package.json; StartupWMClass must match.\n // https://github.com/electron/electron/blob/9a7b73b5334f1d72c08e2d5e94106706ed751186/lib/browser/init.ts#L128-L133\n const trimmedDesktopName = packager.metadata.desktopName?.trim()\n if (isEmptyOrSpaces(trimmedDesktopName)) {\n log.warn(\n {\n reason: \"desktopName is not set in package.json\",\n docs: \"https://www.electron.build/linux#window-association-desktopname--syncdesktopname\",\n },\n \"electron uses desktopName as app_id / WM_CLASS for window association. Without it desktop environments may not link running windows to this .desktop entry. Set desktopName in package.json and linux.syncDesktopName: true to fix.\"\n )\n }\n const wmClass = !isEmptyOrSpaces(trimmedDesktopName) ? trimmedDesktopName.replace(/\\.desktop$/, \"\") : appInfo.productName\n\n const desktopMeta = deepAssign<any>(\n {\n // String values are escaped per the freedesktop spec (\\\\, \\n, \\r, \\t)\n // so that a product name containing a newline cannot inject new key=value\n // pairs into the .desktop file (e.g. overriding the Exec key).\n Name: desktopStringEscape(appInfo.productName),\n Exec: exec,\n Terminal: \"false\",\n Type: \"Application\",\n Icon: packager.executableName,\n // https://askubuntu.com/questions/367396/what-represent-the-startupwmclass-field-of-a-desktop-file\n // Set to desktopName (minus .desktop suffix) when provided, so it matches Electron's\n // app_id and desktop environments can associate running windows with this entry.\n // Falls back to productName for apps that don't set desktopName.\n // to get WM_CLASS of running window: xprop WM_CLASS\n // StartupWMClass doesn't work for unicode\n // https://github.com/electron/electron/blob/2-0-x/atom/browser/native_window_views.cc#L226\n StartupWMClass: desktopStringEscape(wmClass),\n },\n extra,\n targetSpecificOptions.desktop?.entry ?? {}\n )\n\n const description = this.getDescription(targetSpecificOptions)\n if (!isEmptyOrSpaces(description)) {\n desktopMeta.Comment = desktopStringEscape(description)\n }\n\n const mimeTypes: Array<string> = asArray(targetSpecificOptions.mimeTypes)\n for (const fileAssociation of packager.fileAssociations) {\n if (fileAssociation.mimeType != null) {\n mimeTypes.push(fileAssociation.mimeType)\n }\n }\n\n for (const protocol of asArray(packager.config.protocols).concat(asArray(packager.platformOptions.protocols))) {\n for (const scheme of asArray(protocol.schemes)) {\n mimeTypes.push(`x-scheme-handler/${scheme}`)\n }\n }\n\n if (mimeTypes.length !== 0) {\n desktopMeta.MimeType = mimeTypes.join(\";\") + \";\"\n }\n\n let category = targetSpecificOptions.category\n if (isEmptyOrSpaces(category)) {\n const macCategory = (packager.config.mac || {}).category\n if (macCategory != null) {\n category = macToLinuxCategory[macCategory]\n }\n\n if (category == null) {\n // https://github.com/develar/onshape-desktop-shell/issues/48\n if (macCategory != null) {\n log.warn({ macCategory }, \"cannot map macOS category to Linux. If possible mapping is known for you, please file issue to add it.\")\n }\n log.warn(\n {\n reason: \"linux.category is not set and cannot map from macOS\",\n docs: \"https://www.electron.build/linux\",\n },\n 'application Linux category is set to default \"Utility\"'\n )\n category = \"Utility\"\n }\n }\n desktopMeta.Categories = `${category}${category.endsWith(\";\") ? \"\" : \";\"}`\n\n let data = `[Desktop Entry]`\n for (const name of Object.keys(desktopMeta)) {\n data += `\\n${name}=${desktopMeta[name]}`\n }\n data += \"\\n\"\n const desktopActions = targetSpecificOptions.desktop?.desktopActions ?? {}\n for (const [actionName, config] of Object.entries(desktopActions)) {\n if (!Object.keys(config ?? {}).length) {\n continue\n }\n data += `\\n[Desktop Action ${actionName}]`\n for (const [key, value] of Object.entries(config ?? {})) {\n data += `\\n${key}=${value}`\n }\n data += \"\\n\"\n }\n return Promise.resolve(data)\n }\n}\n\nconst macToLinuxCategory: any = {\n \"public.app-category.graphics-design\": \"Graphics\",\n \"public.app-category.developer-tools\": \"Development\",\n \"public.app-category.education\": \"Education\",\n \"public.app-category.games\": \"Game\",\n \"public.app-category.video\": \"Video;AudioVideo\",\n \"public.app-category.utilities\": \"Utility\",\n \"public.app-category.social-networking\": \"Network;Chat\",\n \"public.app-category.finance\": \"Office;Finance\",\n \"public.app-category.music\": \"Audio;AudioVideo\",\n}\n"]}
|
|
1
|
+
{"version":3,"file":"LinuxTargetHelper.js","sourceRoot":"","sources":["../../../src/targets/linux/LinuxTargetHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { asArray, exists, InvalidConfigurationError, isEmptyOrSpaces, log } from \"builder-util\"\nimport { deepAssign } from \"builder-util-runtime\"\n\nimport { Lazy } from \"lazy-val\"\nimport { join } from \"path\"\nimport * as semver from \"semver\"\nimport { CompressionLevel } from \"../../core.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { CommonLinuxOptions } from \"../../options/linuxOptions.js\"\nimport { SnapCore } from \"./snap/SnapTarget.js\"\nimport { SnapCore24 } from \"./snap/core24.js\"\nimport { SnapCoreCustom } from \"./snap/coreCustom.js\"\nimport { SnapCoreLegacy } from \"./snap/coreLegacy.js\"\nimport { IconInfo } from \"../../util/iconConverter.js\"\nimport _fsExtra from \"fs-extra\"\nconst { outputFile } = _fsExtra\n\n/**\n * Escape a string value for use in a freedesktop .desktop file string field\n * (Name, Comment, StartupWMClass, etc.).\n *\n * The freedesktop Desktop Entry Specification requires that the following\n * characters be escaped in string / localestring values:\n * \\n → \\\\n (newline — would inject new key=value lines otherwise)\n * \\r → \\\\r\n * \\t → \\\\t\n * \\\\ → \\\\\\\\\n *\n * Without escaping, a productName or description containing a literal newline\n * can inject arbitrary key=value pairs into the generated .desktop file,\n * potentially overriding the Exec key.\n *\n * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#value-types\n */\nfunction desktopStringEscape(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\\t/g, \"\\\\t\")\n}\n\n/**\n * Quote a command / path token for the freedesktop Exec key.\n *\n * Every Linux target launches through a launcher entrypoint, so the Exec key only ever holds a\n * single command (the launcher path) plus field codes — never user-supplied `executableArgs`.\n * Plain paths made up of portable characters are emitted as-is; anything else is wrapped in\n * double quotes. The spec requires the reserved characters `\"`, backtick, `$` and `\\` to be\n * backslash-escaped inside the quotes, so they are escaped here to keep the Exec token valid.\n *\n * @see https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables\n */\nexport function quoteDesktopExecPath(value: string): string {\n if (/^[/0-9A-Za-z._-]+$/.test(value)) {\n return value\n }\n return '\"' + value.replace(/[\"$`\\\\]/g, \"\\\\$&\") + '\"'\n}\n\nfunction mapLinuxCompressionToSnap(level: CompressionLevel | null | undefined): \"xz\" | \"lzo\" | undefined {\n if (level === \"store\") {\n return \"lzo\"\n }\n if (level === \"maximum\") {\n return \"xz\"\n }\n return undefined\n}\n\nexport const installPrefix = \"/opt\"\n\nexport class LinuxTargetHelper {\n private readonly iconPromise = new Lazy(() => this.computeDesktopIcons())\n\n private readonly mimeTypeFilesPromise = new Lazy(() => this.computeMimeTypeFiles())\n\n maxIconPath: string | null = null\n\n constructor(private packager: LinuxPackager) {}\n\n get icons(): Promise<Array<IconInfo>> {\n return this.iconPromise.value\n }\n\n get mimeTypeFiles(): Promise<string | null> {\n return this.mimeTypeFilesPromise.value\n }\n\n getSnapCore(): SnapCore<any> {\n const { snapcraft } = this.packager.config\n\n // Merge linux-level options (category, description, mimeTypes, etc.) as the base so they\n // propagate into the generated snapcraft.yaml and .desktop file without requiring users to\n // duplicate them under core24/core18/etc. Per-core options always win for conflicts.\n // linux.compression is a CompressionLevel (\"store\"/\"normal\"/\"maximum\"); snap compression is an\n // algorithm (\"xz\"/\"lzo\"). Map the level to the nearest algorithm; per-core options override.\n const { compression: linuxCompression, ...linuxOptions } = this.packager.platformOptions\n const snapLinuxOptions = { ...linuxOptions, compression: mapLinuxCompressionToSnap(linuxCompression) }\n\n if (snapcraft != null) {\n const core = snapcraft.base\n const options = snapcraft[core] || {}\n switch (core) {\n case \"core18\":\n case \"core20\":\n case \"core22\":\n if (!this.isElectronVersionGreaterOrEqualThan(\"4.0.0\")) {\n if (!this.isElectronVersionGreaterOrEqualThan(\"2.0.0-beta.1\")) {\n throw new InvalidConfigurationError(\"Electron 2 and higher is required to build Snap with core18/core20/core22\")\n }\n log.warn(null, \"electron 4 and higher is highly recommended for Snap with core18/core20/core22\")\n }\n return new SnapCoreLegacy(this.packager, this, deepAssign({ base: core }, snapLinuxOptions, options))\n case \"core24\":\n if (!this.isElectronVersionGreaterOrEqualThan(\"28.0.0\")) {\n if (!this.isElectronVersionGreaterOrEqualThan(\"25.0.0\")) {\n throw new InvalidConfigurationError(\"Electron 25 and higher is required to build Snap with core24\")\n }\n log.warn(null, \"electron 28 and higher is highly recommended for Snap with core24\")\n }\n return new SnapCore24(this.packager, this, deepAssign({}, snapLinuxOptions, options))\n case \"custom\":\n // Pass-through: do not inject linux options into user-supplied yaml\n return new SnapCoreCustom(this.packager, this, snapcraft.custom || {})\n }\n }\n return new SnapCoreLegacy(this.packager, this, deepAssign({ base: \"core20\" as const }, snapLinuxOptions, {}))\n }\n\n isElectronVersionGreaterOrEqualThan(version: string, fallback?: string): boolean {\n const electronVersion = this.packager.config.electronVersion\n if (!electronVersion) {\n return fallback ? semver.gte(fallback, version) : true\n }\n return semver.gte(electronVersion, version)\n }\n\n private async computeMimeTypeFiles(): Promise<string | null> {\n const items: Array<string> = []\n for (const fileAssociation of this.packager.fileAssociations) {\n if (!fileAssociation.mimeType) {\n continue\n }\n\n const data = `<mime-type type=\"${fileAssociation.mimeType}\">\n <glob pattern=\"*.${fileAssociation.ext}\"/>\n ${fileAssociation.description ? `<comment>${fileAssociation.description}</comment>` : \"\"}\n <icon name=\"x-office-document\" />\n</mime-type>`\n items.push(data)\n }\n\n if (items.length === 0) {\n return null\n }\n\n const file = await this.packager.getTempFile(\".xml\")\n await outputFile(\n file,\n '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">\\n' + items.join(\"\\n\") + \"\\n</mime-info>\"\n )\n return file\n }\n\n // must be name without spaces and other special characters, but not product name used\n private async computeDesktopIcons(): Promise<Array<IconInfo>> {\n const packager = this.packager\n const { config } = packager\n const platformOptions = packager.platformOptions\n\n const sources = [platformOptions.icon, config.mac?.icon ?? config.icon].filter(str => !!str) as string[]\n\n // If no explicit sources are defined, fallback to buildResources directory, then default framework icon\n let fallbackSources = [...asArray(packager.getDefaultFrameworkIcon())]\n const buildResources = config.directories?.buildResources\n if (buildResources && (await exists(join(buildResources, \"icons\")))) {\n fallbackSources = [buildResources, ...fallbackSources]\n }\n\n // need to put here and not as default because need to resolve image size\n const result = await packager.resolveIcon(sources, fallbackSources, \"set\")\n this.maxIconPath = result[result.length - 1].file\n\n // Ignore .icon files for linux (they are exclusive for macOS)\n return result.filter(icon => !icon.file.endsWith(\".icon\"))\n }\n\n getDescription(options: CommonLinuxOptions) {\n return options.description || this.packager.appInfo.description\n }\n\n getSanitizedVersion(target: string) {\n const {\n appInfo: { version },\n } = this.packager\n switch (target) {\n case \"pacman\":\n return version.replace(/-/g, \"_\")\n case \"rpm\":\n case \"deb\":\n return version.replace(/-/g, \"~\")\n default:\n return version\n }\n }\n\n async writeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, destination?: string | null, extra?: Record<string, string>): Promise<string> {\n const data = await this.computeDesktopEntry(targetSpecificOptions, exec, extra)\n const file = destination || (await this.packager.getTempFile(`${this.packager.appInfo.productFilename}.desktop`))\n await outputFile(file, data)\n return file\n }\n\n // Emit the \"desktopName not set\" warning at most once per build, even though both\n // getDesktopFileName() and computeDesktopEntry() resolve the desktop name.\n private desktopNameWarningEmitted = false\n\n // https://github.com/electron-userland/electron-builder/issues/9103\n // Electron derives app_id / WM_CLASS from desktopName in package.json; the installed\n // .desktop filename and StartupWMClass must match it for window association to work.\n // https://github.com/electron/electron/blob/9a7b73b5334f1d72c08e2d5e94106706ed751186/lib/browser/init.ts#L128-L133\n // Returns the validated base name (desktopName minus the .desktop suffix), or null when\n // desktopName is unset — callers apply their own fallback (filename vs WM_CLASS).\n private resolveDesktopName(): string | null {\n const trimmedDesktopName = this.packager.metadata.desktopName?.trim()\n if (isEmptyOrSpaces(trimmedDesktopName)) {\n if (!this.desktopNameWarningEmitted) {\n this.desktopNameWarningEmitted = true\n log.warn(\n {\n reason: \"desktopName is not set in package.json\",\n docs: \"https://www.electron.build/docs/linux/#window-association-desktopname\",\n },\n 'Electron derives the app_id / WM_CLASS used for Linux window association from desktopName. Without it, desktop environments may not link the running window to its launcher entry (taskbar grouping, dock icon, etc.). Set desktopName to a reverse-DNS identifier in package.json, e.g. \"com.myapp.MyApp\".'\n )\n }\n return null\n }\n const basename = trimmedDesktopName.replace(/\\.desktop$/, \"\")\n // Guard against path traversal: desktopName flows into filesystem paths\n // (snap/gui/<name>.desktop, /usr/share/applications/<name>.desktop, etc.).\n if (/[/\\\\]/.test(basename) || [...basename].some(c => c.charCodeAt(0) === 0)) {\n throw new InvalidConfigurationError(`desktopName \"${trimmedDesktopName}\" produces an invalid .desktop filename — remove any path separators or NUL characters`)\n }\n return basename\n }\n\n getDesktopFileName(fallback: string = this.packager.executableName): string {\n return this.resolveDesktopName() ?? fallback\n }\n\n computeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, extra?: Record<string, string>): Promise<string> {\n if (exec != null && exec.length === 0) {\n throw new Error(\"Specified exec is empty\")\n }\n // https://github.com/electron-userland/electron-builder/issues/3418\n if (targetSpecificOptions.desktop?.entry?.Exec) {\n throw new Error(\"Please specify executable name as linux.executableName instead of linux.desktop.Exec\")\n }\n\n const packager = this.packager\n const appInfo = packager.appInfo\n\n if (exec == null) {\n // Fallback only — targets pass an explicit launcher entrypoint as `exec`. `executableArgs`\n // are injected into that launcher, never into the Exec key (see launcherScript.ts).\n exec = `${quoteDesktopExecPath(`${installPrefix}/${appInfo.sanitizedProductName}/${packager.executableName}`)} %U`\n }\n\n // StartupWMClass must match Electron's app_id (derived from desktopName) for window\n // association; resolveDesktopName() handles the shared warning and validation.\n // Falls back to productName for apps that don't set desktopName.\n const wmClass = this.resolveDesktopName() ?? appInfo.productName\n\n const desktopMeta = deepAssign<any>(\n {\n // String values are escaped per the freedesktop spec (\\\\, \\n, \\r, \\t)\n // so that a product name containing a newline cannot inject new key=value\n // pairs into the .desktop file (e.g. overriding the Exec key).\n Name: desktopStringEscape(appInfo.productName),\n Exec: exec,\n Terminal: \"false\",\n Type: \"Application\",\n Icon: packager.executableName,\n // https://askubuntu.com/questions/367396/what-represent-the-startupwmclass-field-of-a-desktop-file\n // Set to desktopName (minus .desktop suffix) when provided, so it matches Electron's\n // app_id and desktop environments can associate running windows with this entry.\n // Falls back to productName for apps that don't set desktopName.\n // to get WM_CLASS of running window: xprop WM_CLASS\n // StartupWMClass doesn't work for unicode\n // https://github.com/electron/electron/blob/2-0-x/atom/browser/native_window_views.cc#L226\n StartupWMClass: desktopStringEscape(wmClass),\n },\n extra,\n targetSpecificOptions.desktop?.entry ?? {}\n )\n\n const description = this.getDescription(targetSpecificOptions)\n if (!isEmptyOrSpaces(description)) {\n desktopMeta.Comment = desktopStringEscape(description)\n }\n\n const mimeTypes: Array<string> = asArray(targetSpecificOptions.mimeTypes)\n for (const fileAssociation of packager.fileAssociations) {\n if (fileAssociation.mimeType != null) {\n mimeTypes.push(fileAssociation.mimeType)\n }\n }\n\n for (const protocol of asArray(packager.config.protocols).concat(asArray(packager.platformOptions.protocols))) {\n for (const scheme of asArray(protocol.schemes)) {\n mimeTypes.push(`x-scheme-handler/${scheme}`)\n }\n }\n\n if (mimeTypes.length !== 0) {\n desktopMeta.MimeType = mimeTypes.join(\";\") + \";\"\n }\n\n let category = targetSpecificOptions.category\n if (isEmptyOrSpaces(category)) {\n const macCategory = (packager.config.mac || {}).category\n if (macCategory != null) {\n category = macToLinuxCategory[macCategory]\n }\n\n if (category == null) {\n // https://github.com/develar/onshape-desktop-shell/issues/48\n if (macCategory != null) {\n log.warn({ macCategory }, \"cannot map macOS category to Linux. If possible mapping is known for you, please file issue to add it.\")\n }\n log.warn(\n {\n reason: \"linux.category is not set and cannot map from macOS\",\n docs: \"https://www.electron.build/linux\",\n },\n 'application Linux category is set to default \"Utility\"'\n )\n category = \"Utility\"\n }\n }\n desktopMeta.Categories = `${category}${category.endsWith(\";\") ? \"\" : \";\"}`\n\n let data = `[Desktop Entry]`\n for (const name of Object.keys(desktopMeta)) {\n data += `\\n${name}=${desktopMeta[name]}`\n }\n data += \"\\n\"\n const desktopActions = targetSpecificOptions.desktop?.desktopActions ?? {}\n for (const [actionName, config] of Object.entries(desktopActions)) {\n if (!Object.keys(config ?? {}).length) {\n continue\n }\n data += `\\n[Desktop Action ${actionName}]`\n for (const [key, value] of Object.entries(config ?? {})) {\n data += `\\n${key}=${value}`\n }\n data += \"\\n\"\n }\n return Promise.resolve(data)\n }\n}\n\nconst macToLinuxCategory: any = {\n \"public.app-category.graphics-design\": \"Graphics\",\n \"public.app-category.developer-tools\": \"Development\",\n \"public.app-category.education\": \"Education\",\n \"public.app-category.games\": \"Game\",\n \"public.app-category.video\": \"Video;AudioVideo\",\n \"public.app-category.utilities\": \"Utility\",\n \"public.app-category.social-networking\": \"Network;Chat\",\n \"public.app-category.finance\": \"Office;Finance\",\n \"public.app-category.music\": \"Audio;AudioVideo\",\n}\n"]}
|
|
@@ -10,6 +10,7 @@ export default class AppImageTarget extends Target {
|
|
|
10
10
|
readonly outDir: string;
|
|
11
11
|
readonly options: AppImageOptions;
|
|
12
12
|
private readonly desktopEntry;
|
|
13
|
+
private readonly launcherArgs;
|
|
13
14
|
constructor(_ignored: string, packager: LinuxPackager, helper: LinuxTargetHelper, outDir: string);
|
|
14
15
|
build(appOutDir: string, arch: Arch): Promise<any>;
|
|
15
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppImageTarget.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/AppImageTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAwB,MAAM,cAAc,CAAA;AAIzD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAGlE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAS3D,eAAO,MAAM,kBAAkB,WAAW,CAAA;AAE1C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,MAAM;
|
|
1
|
+
{"version":3,"file":"AppImageTarget.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/AppImageTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAwB,MAAM,cAAc,CAAA;AAIzD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAGlE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAS3D,eAAO,MAAM,kBAAkB,WAAW,CAAA;AAE1C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,MAAM;IAY9C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAbzB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAgE;IAEjG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAK3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;gBAGrC,QAAQ,EAAE,MAAM,EACC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,iBAAiB,EACjC,MAAM,EAAE,MAAM;IAenB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;CA8HzD"}
|
|
@@ -17,15 +17,12 @@ export default class AppImageTarget extends Target {
|
|
|
17
17
|
this.helper = helper;
|
|
18
18
|
this.outDir = outDir;
|
|
19
19
|
this.options = this.packager.getOptionsForTarget(this.name);
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
"X-AppImage-Version": `${packager.appInfo.buildVersion}`,
|
|
27
|
-
});
|
|
28
|
-
});
|
|
20
|
+
const appimageTool = packager.config.toolsets?.appimage;
|
|
21
|
+
const defaultArgs = appimageTool == null || appimageTool === "0.0.0" ? ["--no-sandbox"] : [];
|
|
22
|
+
this.launcherArgs = this.options.executableArgs ?? defaultArgs;
|
|
23
|
+
this.desktopEntry = new Lazy(() => helper.computeDesktopEntry(this.options, `${APP_RUN_ENTRYPOINT} %U`, {
|
|
24
|
+
"X-AppImage-Version": `${packager.appInfo.buildVersion}`,
|
|
25
|
+
}));
|
|
29
26
|
}
|
|
30
27
|
async build(appOutDir, arch) {
|
|
31
28
|
const packager = this.packager;
|
|
@@ -70,6 +67,7 @@ export default class AppImageTarget extends Target {
|
|
|
70
67
|
productName: packager.appInfo.productName,
|
|
71
68
|
productFilename: packager.appInfo.productFilename,
|
|
72
69
|
executableName: packager.executableName,
|
|
70
|
+
executableArgs: this.launcherArgs,
|
|
73
71
|
license,
|
|
74
72
|
desktopEntry,
|
|
75
73
|
icons,
|
|
@@ -98,6 +96,7 @@ export default class AppImageTarget extends Target {
|
|
|
98
96
|
productName: packager.appInfo.productName,
|
|
99
97
|
productFilename: packager.appInfo.productFilename,
|
|
100
98
|
executableName: packager.executableName,
|
|
99
|
+
executableArgs: this.launcherArgs,
|
|
101
100
|
license,
|
|
102
101
|
desktopEntry,
|
|
103
102
|
icons,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppImageTarget.js","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/AppImageTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,GAAG,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAEzD,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAGzC,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAA;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAA;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAExF,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAA;AAE/B,+FAA+F;AAE/F,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAA;AAE1C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,MAAM;IAKhD,YACE,QAAgB,EACC,QAAuB,EACvB,MAAyB,EACjC,MAAc;QAEvB,KAAK,CAAC,UAAU,CAAC,CAAA;QAJA,aAAQ,GAAR,QAAQ,CAAe;QACvB,WAAM,GAAN,MAAM,CAAmB;QACjC,WAAM,GAAN,MAAM,CAAQ;QARhB,YAAO,GAAoB,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAkB,IAAI,CAAC,IAAI,CAAC,CAAA;QAY/F,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAAS,GAAG,EAAE;YACxC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAA;YACvD,MAAM,WAAW,GAAG,YAAY,IAAI,IAAI,IAAI,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAC5F,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,WAAW,CAAA;YACvD,MAAM,IAAI,GAAG,CAAC,kBAAkB,EAAE,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC1D,OAAO,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;gBACpD,oBAAoB,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE;aACzD,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,IAAU;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,mEAAmE;QACnE,oEAAoE;QACpE,MAAM,YAAY,GAAG,QAAQ,CAAC,yBAAyB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QAClF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;QAEzD,MAAM,QAAQ,CAAC,wBAAwB,CAAC;YACtC,qBAAqB,EAAE,UAAU;YACjC,IAAI,EAAE,YAAY;YAClB,IAAI;SACL,CAAC,CAAA;QAEF,2CAA2C;QAC3C,MAAM,CAAC,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAChF,gCAAgC,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC;YAChE,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,KAAK;YACvB,IAAI,CAAC,MAAM,CAAC,KAAK;YACjB,0BAA0B,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SAC5E,CAAC,CAAA;QAEF,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,CAAA;QACpH,CAAC;QAED,kFAAkF;QAClF,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAA;QAExD,IACE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,IAAI,IAAI;YAC7D,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,eAAe,UAAU,EAAE,CAAC,CAAC,EACvI,CAAC;YACD,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAA;YACxB,OAAM;QACR,CAAC;QAED,IAAI,UAA8B,CAAA;QAClC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAA;YAC5D,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;gBAC7B,UAAU,GAAG,MAAM,wBAAwB,CACzC;oBACE,MAAM,EAAE,SAAS;oBACjB,QAAQ,EAAE,QAAQ,CAAC,GAAG;oBACtB,IAAI;oBACJ,MAAM,EAAE,YAAY;oBACpB,OAAO,EAAE;wBACP,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW;wBACzC,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,eAAe;wBACjD,cAAc,EAAE,QAAQ,CAAC,cAAc;wBACvC,OAAO;wBACP,YAAY;wBACZ,KAAK;wBACL,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;wBAC3C,eAAe;wBACf,WAAW,EAAE,CAAC,GAAG,EAAE;4BACjB,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAA;4BAC7B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;gCAC/B,OAAO,CAAC,CAAA;4BACV,CAAC;4BACD,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gCACvC,OAAO,IAAI,CAAA;4BACb,CAAC;4BACD,OAAO,SAAS,CAAA,CAAC,wDAAwD;wBAC3E,CAAC,CAAC,EAAE;qBACL;iBACF,EACD,QAAQ,CAAC,iBAAiB,CAC3B,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,MAAM,0BAA0B,CAC3C,YAAY,EACZ;oBACE,MAAM,EAAE,SAAS;oBACjB,QAAQ,EAAE,QAAQ,CAAC,GAAG;oBACtB,IAAI;oBACJ,MAAM,EAAE,YAAY;oBACpB,OAAO,EAAE;wBACP,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW;wBACzC,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,eAAe;wBACjD,cAAc,EAAE,QAAQ,CAAC,cAAc;wBACvC,OAAO;wBACP,YAAY;wBACZ,KAAK;wBACL,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;wBAC3C,eAAe;wBACf,WAAW,EAAE,CAAC,GAAG,EAAE;4BACjB,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAA;4BAC7B,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;gCACjC,OAAO,CAAC,CAAA;4BACV,CAAC;4BACD,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gCACf,OAAO,MAAM,CAAA,CAAC,yDAAyD;4BACzE,CAAC;4BACD,IAAI,QAAQ,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;gCACrC,OAAO,MAAM,CAAA;4BACf,CAAC;4BACD,OAAO,MAAM,CAAA,CAAC,iDAAiD;wBACjE,CAAC,CAAC,EAAE;qBACL;iBACF,EACD,QAAQ,CAAC,iBAAiB,CAC3B,CAAA;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,0BAA0B,CAAC,CAAA;YAC/D,MAAM,KAAK,CAAA;QACb,CAAC;gBAAS,CAAC;YACT,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC1C,CAAC;QAED,MAAM,QAAQ,CAAC,0BAA0B,CAAC;YACxC,IAAI,EAAE,YAAY;YAClB,gBAAgB,EAAE,QAAQ,CAAC,uBAAuB,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC;YACzF,MAAM,EAAE,IAAI;YACZ,IAAI;YACJ,QAAQ;YACR,iBAAiB,EAAE,IAAI;YACvB,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;CACF","sourcesContent":["import { Arch, log, serializeToYaml } from \"builder-util\"\n\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Target } from \"../../../core.js\"\nimport { LinuxPackager } from \"../../../linuxPackager.js\"\nimport { AppImageOptions } from \"../../../options/linuxOptions.js\"\nimport { getAppUpdatePublishConfiguration } from \"../../../publish/PublishManager.js\"\nimport { getNotLocalizedLicenseFile } from \"../../../util/license.js\"\nimport { LinuxTargetHelper } from \"../LinuxTargetHelper.js\"\nimport { createStageDir } from \"../../targetUtil.js\"\nimport { buildLegacyFuse2AppImage, buildStaticRuntimeAppImage } from \"./appImageUtil.js\"\nimport { BlockMapDataHolder } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nconst { outputFile } = _fsExtra\n\n// https://unix.stackexchange.com/questions/375191/append-to-sub-directory-inside-squashfs-file\n\nexport const APP_RUN_ENTRYPOINT = \"AppRun\"\n\nexport default class AppImageTarget extends Target {\n readonly options: AppImageOptions = this.packager.getOptionsForTarget<AppImageOptions>(this.name)\n\n private readonly desktopEntry: Lazy<string>\n\n constructor(\n _ignored: string,\n private readonly packager: LinuxPackager,\n private readonly helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(\"appImage\")\n\n this.desktopEntry = new Lazy<string>(() => {\n const appimageTool = packager.config.toolsets?.appimage\n const defaultArgs = appimageTool == null || appimageTool === \"0.0.0\" ? [\"--no-sandbox\"] : []\n const args = this.options.executableArgs ?? defaultArgs\n const exec = [APP_RUN_ENTRYPOINT, ...args, \"%U\"].join(\" \")\n return helper.computeDesktopEntry(this.options, exec, {\n \"X-AppImage-Version\": `${packager.appInfo.buildVersion}`,\n })\n })\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const packager = this.packager\n\n const options = this.options\n // https://github.com/electron-userland/electron-builder/issues/775\n // https://github.com/electron-userland/electron-builder/issues/1726\n const artifactName = packager.expandArtifactNamePattern(options, \"AppImage\", arch)\n const artifactPath = path.join(this.outDir, artifactName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: \"AppImage\",\n file: artifactPath,\n arch,\n })\n\n // Parallelize independent async operations\n const [publishConfig, stageDir, desktopEntry, icons, license] = await Promise.all([\n getAppUpdatePublishConfiguration(packager, options, arch, false),\n createStageDir(this, packager, arch),\n this.desktopEntry.value,\n this.helper.icons,\n getNotLocalizedLicenseFile(options.license, this.packager, [\"txt\", \"html\"]),\n ])\n\n if (publishConfig != null) {\n await outputFile(path.join(packager.getResourcesDir(appOutDir), \"app-update.yml\"), serializeToYaml(publishConfig))\n }\n\n // Validated once here; throws InvalidConfigurationError for path traversal / NUL.\n const desktopBaseName = this.helper.getDesktopFileName()\n\n if (\n this.packager.packagerOptions.effectiveOptionComputed != null &&\n (await this.packager.packagerOptions.effectiveOptionComputed({ desktop: desktopEntry, desktopFileName: `${desktopBaseName}.desktop` }))\n ) {\n await stageDir.cleanup()\n return\n }\n\n let updateInfo: BlockMapDataHolder\n try {\n const appimageTool = this.packager.config.toolsets?.appimage\n if (appimageTool === \"0.0.0\") {\n updateInfo = await buildLegacyFuse2AppImage(\n {\n appDir: appOutDir,\n stageDir: stageDir.dir,\n arch,\n output: artifactPath,\n options: {\n productName: packager.appInfo.productName,\n productFilename: packager.appInfo.productFilename,\n executableName: packager.executableName,\n license,\n desktopEntry,\n icons,\n fileAssociations: packager.fileAssociations,\n desktopBaseName,\n compression: (() => {\n const c = options.compression\n if (c === \"xz\" || c === \"gzip\") {\n return c\n }\n if (packager.compression === \"maximum\") {\n return \"xz\"\n }\n return undefined // normal/store/unset/zstd → mksquashfs defaults to gzip\n })(),\n },\n },\n packager.buildResourcesDir\n )\n } else {\n updateInfo = await buildStaticRuntimeAppImage(\n appimageTool,\n {\n appDir: appOutDir,\n stageDir: stageDir.dir,\n arch,\n output: artifactPath,\n options: {\n productName: packager.appInfo.productName,\n productFilename: packager.appInfo.productFilename,\n executableName: packager.executableName,\n license,\n desktopEntry,\n icons,\n fileAssociations: packager.fileAssociations,\n desktopBaseName,\n compression: (() => {\n const c = options.compression\n if (c === \"gzip\" || c === \"zstd\") {\n return c\n }\n if (c === \"xz\") {\n return \"zstd\" // nearest equivalent; static runtime does not support xz\n }\n if (packager.compression === \"store\") {\n return \"gzip\"\n }\n return \"zstd\" // maximum/normal/unset → zstd for static runtime\n })(),\n },\n },\n packager.buildResourcesDir\n )\n }\n } catch (error: any) {\n log.error({ error: error.message }, \"failed to build AppImage\")\n throw error\n } finally {\n await stageDir.cleanup().catch(() => {})\n }\n\n await packager.emitArtifactBuildCompleted({\n file: artifactPath,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, \"AppImage\", arch, false),\n target: this,\n arch,\n packager,\n isWriteUpdateInfo: true,\n updateInfo,\n })\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AppImageTarget.js","sourceRoot":"","sources":["../../../../src/targets/linux/appimage/AppImageTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, log, serializeToYaml } from \"builder-util\"\n\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Target } from \"../../../core.js\"\nimport { LinuxPackager } from \"../../../linuxPackager.js\"\nimport { AppImageOptions } from \"../../../options/linuxOptions.js\"\nimport { getAppUpdatePublishConfiguration } from \"../../../publish/PublishManager.js\"\nimport { getNotLocalizedLicenseFile } from \"../../../util/license.js\"\nimport { LinuxTargetHelper } from \"../LinuxTargetHelper.js\"\nimport { createStageDir } from \"../../targetUtil.js\"\nimport { buildLegacyFuse2AppImage, buildStaticRuntimeAppImage } from \"./appImageUtil.js\"\nimport { BlockMapDataHolder } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nconst { outputFile } = _fsExtra\n\n// https://unix.stackexchange.com/questions/375191/append-to-sub-directory-inside-squashfs-file\n\nexport const APP_RUN_ENTRYPOINT = \"AppRun\"\n\nexport default class AppImageTarget extends Target {\n readonly options: AppImageOptions = this.packager.getOptionsForTarget<AppImageOptions>(this.name)\n\n private readonly desktopEntry: Lazy<string>\n\n // executableArgs are injected into the AppRun launcher, so the .desktop Exec key is just `AppRun %U`\n // (consistent with the other Linux targets). AppRun also auto-adds --no-sandbox when user namespaces\n // are unavailable, so it is only defaulted here for the legacy FUSE2 (0.0.0) runtime.\n private readonly launcherArgs: string[]\n\n constructor(\n _ignored: string,\n private readonly packager: LinuxPackager,\n private readonly helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(\"appImage\")\n\n const appimageTool = packager.config.toolsets?.appimage\n const defaultArgs = appimageTool == null || appimageTool === \"0.0.0\" ? [\"--no-sandbox\"] : []\n this.launcherArgs = this.options.executableArgs ?? defaultArgs\n\n this.desktopEntry = new Lazy<string>(() =>\n helper.computeDesktopEntry(this.options, `${APP_RUN_ENTRYPOINT} %U`, {\n \"X-AppImage-Version\": `${packager.appInfo.buildVersion}`,\n })\n )\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const packager = this.packager\n\n const options = this.options\n // https://github.com/electron-userland/electron-builder/issues/775\n // https://github.com/electron-userland/electron-builder/issues/1726\n const artifactName = packager.expandArtifactNamePattern(options, \"AppImage\", arch)\n const artifactPath = path.join(this.outDir, artifactName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: \"AppImage\",\n file: artifactPath,\n arch,\n })\n\n // Parallelize independent async operations\n const [publishConfig, stageDir, desktopEntry, icons, license] = await Promise.all([\n getAppUpdatePublishConfiguration(packager, options, arch, false),\n createStageDir(this, packager, arch),\n this.desktopEntry.value,\n this.helper.icons,\n getNotLocalizedLicenseFile(options.license, this.packager, [\"txt\", \"html\"]),\n ])\n\n if (publishConfig != null) {\n await outputFile(path.join(packager.getResourcesDir(appOutDir), \"app-update.yml\"), serializeToYaml(publishConfig))\n }\n\n // Validated once here; throws InvalidConfigurationError for path traversal / NUL.\n const desktopBaseName = this.helper.getDesktopFileName()\n\n if (\n this.packager.packagerOptions.effectiveOptionComputed != null &&\n (await this.packager.packagerOptions.effectiveOptionComputed({ desktop: desktopEntry, desktopFileName: `${desktopBaseName}.desktop` }))\n ) {\n await stageDir.cleanup()\n return\n }\n\n let updateInfo: BlockMapDataHolder\n try {\n const appimageTool = this.packager.config.toolsets?.appimage\n if (appimageTool === \"0.0.0\") {\n updateInfo = await buildLegacyFuse2AppImage(\n {\n appDir: appOutDir,\n stageDir: stageDir.dir,\n arch,\n output: artifactPath,\n options: {\n productName: packager.appInfo.productName,\n productFilename: packager.appInfo.productFilename,\n executableName: packager.executableName,\n executableArgs: this.launcherArgs,\n license,\n desktopEntry,\n icons,\n fileAssociations: packager.fileAssociations,\n desktopBaseName,\n compression: (() => {\n const c = options.compression\n if (c === \"xz\" || c === \"gzip\") {\n return c\n }\n if (packager.compression === \"maximum\") {\n return \"xz\"\n }\n return undefined // normal/store/unset/zstd → mksquashfs defaults to gzip\n })(),\n },\n },\n packager.buildResourcesDir\n )\n } else {\n updateInfo = await buildStaticRuntimeAppImage(\n appimageTool,\n {\n appDir: appOutDir,\n stageDir: stageDir.dir,\n arch,\n output: artifactPath,\n options: {\n productName: packager.appInfo.productName,\n productFilename: packager.appInfo.productFilename,\n executableName: packager.executableName,\n executableArgs: this.launcherArgs,\n license,\n desktopEntry,\n icons,\n fileAssociations: packager.fileAssociations,\n desktopBaseName,\n compression: (() => {\n const c = options.compression\n if (c === \"gzip\" || c === \"zstd\") {\n return c\n }\n if (c === \"xz\") {\n return \"zstd\" // nearest equivalent; static runtime does not support xz\n }\n if (packager.compression === \"store\") {\n return \"gzip\"\n }\n return \"zstd\" // maximum/normal/unset → zstd for static runtime\n })(),\n },\n },\n packager.buildResourcesDir\n )\n }\n } catch (error: any) {\n log.error({ error: error.message }, \"failed to build AppImage\")\n throw error\n } finally {\n await stageDir.cleanup().catch(() => {})\n }\n\n await packager.emitArtifactBuildCompleted({\n file: artifactPath,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, \"AppImage\", arch, false),\n target: this,\n arch,\n packager,\n isWriteUpdateInfo: true,\n updateInfo,\n })\n }\n}\n"]}
|