app-builder-lib 27.0.0-alpha.3 → 27.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/codeSign/mac/macCodeSign.d.ts.map +1 -1
- package/dist/codeSign/mac/macCodeSign.js +3 -6
- package/dist/codeSign/mac/macCodeSign.js.map +1 -1
- package/dist/codeSign/win/signtoolBaseSignManager.d.ts.map +1 -1
- package/dist/codeSign/win/signtoolBaseSignManager.js +11 -3
- package/dist/codeSign/win/signtoolBaseSignManager.js.map +1 -1
- package/dist/codeSign/win/windowsSignAzureManager.d.ts.map +1 -1
- package/dist/codeSign/win/windowsSignAzureManager.js +31 -21
- package/dist/codeSign/win/windowsSignAzureManager.js.map +1 -1
- package/dist/configuration.d.ts +37 -44
- package/dist/configuration.d.ts.map +1 -1
- package/dist/configuration.js.map +1 -1
- package/dist/electron/ElectronFramework.js +2 -2
- package/dist/electron/ElectronFramework.js.map +1 -1
- package/dist/electron/electronVersion.d.ts.map +1 -1
- package/dist/electron/electronVersion.js +1 -11
- package/dist/electron/electronVersion.js.map +1 -1
- package/dist/fileMatcher.d.ts +27 -2
- package/dist/fileMatcher.d.ts.map +1 -1
- package/dist/fileMatcher.js +204 -16
- package/dist/fileMatcher.js.map +1 -1
- package/dist/indexInternal.d.ts +6 -5
- package/dist/indexInternal.d.ts.map +1 -1
- package/dist/indexInternal.js +6 -5
- 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 +3 -1
- package/dist/node-module-collector/moduleManager.d.ts.map +1 -1
- package/dist/node-module-collector/moduleManager.js +9 -1
- 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/pnpmNodeModulesCollector.js +5 -5
- package/dist/node-module-collector/pnpmNodeModulesCollector.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/PlatformSpecificBuildOptions.d.ts +0 -6
- package/dist/options/PlatformSpecificBuildOptions.d.ts.map +1 -1
- package/dist/options/PlatformSpecificBuildOptions.js.map +1 -1
- package/dist/options/SnapOptions.d.ts +15 -13
- package/dist/options/SnapOptions.d.ts.map +1 -1
- package/dist/options/SnapOptions.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/options/winOptions.d.ts +164 -34
- package/dist/options/winOptions.d.ts.map +1 -1
- package/dist/options/winOptions.js.map +1 -1
- package/dist/packager.d.ts +2 -0
- package/dist/packager.d.ts.map +1 -1
- package/dist/packager.js +20 -22
- package/dist/packager.js.map +1 -1
- package/dist/platformPackager.d.ts +3 -0
- package/dist/platformPackager.d.ts.map +1 -1
- package/dist/platformPackager.js +11 -6
- package/dist/platformPackager.js.map +1 -1
- package/dist/publish/PublishManager.d.ts +1 -0
- package/dist/publish/PublishManager.d.ts.map +1 -1
- package/dist/publish/PublishManager.js +7 -2
- package/dist/publish/PublishManager.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 +28 -6
- 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 +12 -14
- 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/SnapTarget.d.ts +1 -1
- package/dist/targets/linux/snap/SnapTarget.d.ts.map +1 -1
- package/dist/targets/linux/snap/SnapTarget.js +23 -1
- package/dist/targets/linux/snap/SnapTarget.js.map +1 -1
- package/dist/targets/linux/snap/core24.d.ts +1 -1
- package/dist/targets/linux/snap/core24.d.ts.map +1 -1
- package/dist/targets/linux/snap/core24.js +3 -2
- package/dist/targets/linux/snap/core24.js.map +1 -1
- package/dist/targets/linux/snap/coreCustom.d.ts +1 -1
- package/dist/targets/linux/snap/coreCustom.d.ts.map +1 -1
- package/dist/targets/linux/snap/coreCustom.js +2 -2
- package/dist/targets/linux/snap/coreCustom.js.map +1 -1
- package/dist/targets/linux/snap/coreLegacy.d.ts +1 -1
- package/dist/targets/linux/snap/coreLegacy.d.ts.map +1 -1
- package/dist/targets/linux/snap/coreLegacy.js +8 -7
- 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/linux/snap/snapcraftBuilder.d.ts +7 -1
- package/dist/targets/linux/snap/snapcraftBuilder.d.ts.map +1 -1
- package/dist/targets/linux/snap/snapcraftBuilder.js +57 -20
- package/dist/targets/linux/snap/snapcraftBuilder.js.map +1 -1
- package/dist/targets/targetFactory.d.ts +7 -0
- package/dist/targets/targetFactory.d.ts.map +1 -1
- package/dist/targets/targetFactory.js +28 -0
- package/dist/targets/targetFactory.js.map +1 -1
- package/dist/targets/win/AppxTarget.d.ts.map +1 -1
- package/dist/targets/win/AppxTarget.js +17 -9
- 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.d.ts +3 -2
- package/dist/targets/win/nsis/NsisTarget.d.ts.map +1 -1
- package/dist/targets/win/nsis/NsisTarget.js +26 -49
- package/dist/targets/win/nsis/NsisTarget.js.map +1 -1
- package/dist/targets/win/nsis/nsisScriptGenerator.d.ts.map +1 -1
- package/dist/targets/win/nsis/nsisScriptGenerator.js +3 -2
- package/dist/targets/win/nsis/nsisScriptGenerator.js.map +1 -1
- package/dist/targets/win/nsis/nsisUtil.d.ts +5 -2
- package/dist/targets/win/nsis/nsisUtil.d.ts.map +1 -1
- package/dist/targets/win/nsis/nsisUtil.js +46 -22
- package/dist/targets/win/nsis/nsisUtil.js.map +1 -1
- package/dist/targets/win/nsis/progId.d.ts +21 -0
- package/dist/targets/win/nsis/progId.d.ts.map +1 -0
- package/dist/targets/win/nsis/progId.js +60 -0
- package/dist/targets/win/nsis/progId.js.map +1 -0
- package/dist/toolsets/7zip.d.ts.map +1 -1
- package/dist/toolsets/7zip.js +3 -1
- package/dist/toolsets/7zip.js.map +1 -1
- package/dist/toolsets/appimage.d.ts +3 -3
- package/dist/toolsets/appimage.d.ts.map +1 -1
- package/dist/toolsets/appimage.js +9 -6
- package/dist/toolsets/appimage.js.map +1 -1
- package/dist/toolsets/custom.d.ts +1 -3
- package/dist/toolsets/custom.d.ts.map +1 -1
- package/dist/toolsets/custom.js +4 -133
- package/dist/toolsets/custom.js.map +1 -1
- package/dist/toolsets/fpm.d.ts.map +1 -1
- package/dist/toolsets/fpm.js +11 -5
- package/dist/toolsets/fpm.js.map +1 -1
- package/dist/toolsets/icons.d.ts.map +1 -1
- package/dist/toolsets/icons.js +13 -2
- package/dist/toolsets/icons.js.map +1 -1
- package/dist/toolsets/linuxToolsMac.d.ts.map +1 -1
- package/dist/toolsets/linuxToolsMac.js +4 -1
- package/dist/toolsets/linuxToolsMac.js.map +1 -1
- package/dist/toolsets/nsis.d.ts.map +1 -1
- package/dist/toolsets/nsis.js +6 -3
- package/dist/toolsets/nsis.js.map +1 -1
- package/dist/toolsets/version.d.ts +12 -0
- package/dist/toolsets/version.d.ts.map +1 -0
- package/dist/toolsets/version.js +13 -0
- package/dist/toolsets/version.js.map +1 -0
- package/dist/toolsets/winCodeSign.d.ts +11 -3
- package/dist/toolsets/winCodeSign.d.ts.map +1 -1
- package/dist/toolsets/winCodeSign.js +45 -27
- package/dist/toolsets/winCodeSign.js.map +1 -1
- package/dist/toolsets/wine.d.ts +2 -1
- package/dist/toolsets/wine.d.ts.map +1 -1
- package/dist/toolsets/wine.js +15 -13
- package/dist/toolsets/wine.js.map +1 -1
- package/dist/util/NodeModuleCopyHelper.js +3 -3
- package/dist/util/NodeModuleCopyHelper.js.map +1 -1
- package/dist/util/appFileCopier.d.ts +39 -0
- package/dist/util/appFileCopier.d.ts.map +1 -1
- package/dist/util/appFileCopier.js +71 -20
- 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/config/config.d.ts +1 -0
- package/dist/util/config/config.d.ts.map +1 -1
- package/dist/util/config/config.js +4 -1
- package/dist/util/config/config.js.map +1 -1
- package/dist/util/config/load.d.ts +2 -2
- package/dist/util/config/load.d.ts.map +1 -1
- package/dist/util/config/load.js +3 -12
- package/dist/util/config/load.js.map +1 -1
- package/dist/util/config/schemaValidator.js +1 -1
- package/dist/util/config/schemaValidator.js.map +1 -1
- package/dist/util/electronGet.d.ts +6 -3
- package/dist/util/electronGet.d.ts.map +1 -1
- package/dist/util/electronGet.js +23 -9
- package/dist/util/electronGet.js.map +1 -1
- package/dist/util/flags.d.ts +0 -1
- package/dist/util/flags.d.ts.map +1 -1
- package/dist/util/flags.js +0 -3
- package/dist/util/flags.js.map +1 -1
- package/dist/util/hash.d.ts +1 -1
- package/dist/util/hash.d.ts.map +1 -1
- package/dist/util/hash.js +1 -15
- package/dist/util/hash.js.map +1 -1
- 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 +94 -130
- 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":"coreLegacy.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/coreLegacy.ts"],"names":[],"mappings":"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","sourcesContent":["import { replaceDefault as _replaceDefault, Arch, copyDir, exec, log, serializeToYaml, toLinuxArchString, validateShellEmbeddable } from \"builder-util\"\nimport { asArray, deepAssign, isValidKey, Nullish } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport { chmod, copyFile, mkdir, readdir, rename, rm, writeFile } from \"fs/promises\"\nimport { load } from \"js-yaml\"\nimport * as path from \"path\"\nimport { PlugDescriptor, SnapOptionsLegacy } from \"../../../options/SnapOptions.js\"\nimport { getAppImageTools } from \"../../../toolsets/appimage.js\"\nimport { downloadBuilderToolset } from \"../../../util/electronGet.js\"\nimport { isSnapDestructiveMode } from \"../../../util/flags.js\"\nimport { getTemplatePath } from \"../../../util/pathManager.js\"\nimport { SnapCore } from \"./SnapTarget.js\"\nimport { shellQuote } from \"./snapCommand.js\"\nimport { SnapcraftYAML } from \"./snapcraft.js\"\nimport { DEFAULT_STAGE_PACKAGES } from \"./snapcraftBuilder.js\"\nconst { outputFile, readFile } = _fsExtra\n\n// Re-exported for backwards compatibility with existing imports/tests.\nexport { shellQuote }\n\n// Snap template release info from electron-userland/electron-builder-binaries\nconst SNAP_TEMPLATES = {\n amd64: {\n releaseName: \"snap-template-4.0-2\",\n filenameWithExt: \"snap-template-electron-4.0-2-amd64.tar.7z\",\n checksums: { \"snap-template-electron-4.0-2-amd64.tar.7z\": \"5e3ab4e09364ac06f0072b1c2dab9138318c933f6b2c7374f893b5ec44d19e6f\" },\n },\n armhf: {\n releaseName: \"snap-template-4.0-1\",\n filenameWithExt: \"snap-template-electron-4.0-1-armhf.tar.7z\",\n checksums: { \"snap-template-electron-4.0-1-armhf.tar.7z\": \"6f7553e904f4e043bc3019f0899d05e01a283b00b61fec22e932296490e3be6b\" },\n },\n} as const\n\n// Handles core18/core20/core22 snaps via mksquashfs (template) or snapcraft CLI (no-template).\n// See: https://github.com/develar/app-builder/blob/master/pkg/package-format/snap\nexport class SnapCoreLegacy extends SnapCore<SnapOptionsLegacy & { base: \"core18\" | \"core20\" | \"core22\" }> {\n private isUseTemplateApp = false\n\n defaultPlugs = [\"desktop\", \"desktop-legacy\", \"home\", \"x11\", \"wayland\", \"unity7\", \"browser-support\", \"network\", \"gsettings\", \"audio-playback\", \"pulseaudio\", \"opengl\"]\n\n private replaceDefault(inList: Array<string> | Nullish, defaultList: Array<string>) {\n const result = _replaceDefault(inList, defaultList)\n if (result !== defaultList) {\n this.isUseTemplateApp = false\n }\n return result\n }\n\n async createDescriptor(arch: Arch): Promise<SnapcraftYAML> {\n const appInfo = this.packager.appInfo\n const snapName = this.packager.executableName.toLowerCase()\n const options = this.options\n\n const plugs = this.normalizePlugConfiguration(this.options.plugs)\n\n const plugNames = this.replaceDefault(plugs == null ? null : Object.getOwnPropertyNames(plugs), this.defaultPlugs)\n\n const slots = this.normalizePlugConfiguration(this.options.slots)\n\n const buildPackages = asArray(options.buildPackages)\n const stagePackages = this.replaceDefault(options.stagePackages, DEFAULT_STAGE_PACKAGES)\n\n const stageSet = new Set(stagePackages)\n const stageMatchesDefaults = stagePackages.length === DEFAULT_STAGE_PACKAGES.length && DEFAULT_STAGE_PACKAGES.every((p: string) => stageSet.has(p))\n\n // Template app is only available for x64/armv7l, and only when no packages are customised.\n this.isUseTemplateApp = this.options.useTemplateApp !== false && (arch === Arch.x64 || arch === Arch.armv7l) && buildPackages.length === 0 && stageMatchesDefaults\n\n const appDescriptor: any = {\n command: \"command.sh\",\n plugs: plugNames,\n adapter: \"none\",\n }\n\n const snap: any = load(await readFile(path.join(getTemplatePath(\"snap\"), \"snapcraft.yaml\"), \"utf-8\"))\n if (this.isUseTemplateApp) {\n delete appDescriptor.adapter\n }\n if (options.base != null) {\n snap.base = options.base\n if (Number(snap.base.split(\"core\")[1]) >= 22) {\n delete appDescriptor.adapter\n }\n }\n if (options.grade != null) {\n snap.grade = options.grade\n }\n if (options.confinement != null) {\n snap.confinement = options.confinement\n }\n if (options.appPartStage != null) {\n snap.parts.app.stage = options.appPartStage\n }\n if (options.layout != null) {\n snap.layout = options.layout\n }\n if (slots != null) {\n appDescriptor.slots = Object.getOwnPropertyNames(slots)\n for (const slotName of appDescriptor.slots) {\n if (!isValidKey(slotName)) {\n throw new Error(`Invalid plug/slot name: ${slotName}`)\n }\n const slotOptions = slots[slotName]\n if (slotOptions == null) {\n continue\n }\n if (!snap.slots) {\n snap.slots = {}\n }\n snap.slots[slotName] = slotOptions\n }\n }\n\n deepAssign(snap, {\n name: snapName,\n version: appInfo.version,\n title: options.title || appInfo.productName,\n summary: options.summary || appInfo.productName,\n compression: options.compression,\n description: this.helper.getDescription(options),\n architectures: [toLinuxArchString(arch, \"snap\")],\n apps: {\n [snapName]: appDescriptor,\n },\n parts: {\n app: {\n \"stage-packages\": stagePackages,\n },\n },\n })\n\n if (options.autoStart) {\n appDescriptor.autostart = `${this.helper.getDesktopFileName(snap.name)}.desktop`\n }\n\n if (options.confinement === \"classic\") {\n delete appDescriptor.plugs\n delete snap.plugs\n } else {\n const archTriplet = this.archNameToTriplet(arch)\n const environment: Record<string, string> = {\n PATH: \"$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH\",\n SNAP_DESKTOP_RUNTIME: \"$SNAP/gnome-platform\",\n LD_LIBRARY_PATH: [\n \"$SNAP_LIBRARY_PATH\",\n \"$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/\" + archTriplet + \":$SNAP/usr/lib/\" + archTriplet,\n \"$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib\",\n \"$SNAP/lib/\" + archTriplet + \":$SNAP/usr/lib/\" + archTriplet,\n ].join(\":\"),\n ...options.environment,\n }\n const allow = options.allowNativeWayland\n const isOldElectron = !this.helper.isElectronVersionGreaterOrEqualThan(\"38.0.0\", \"7.0.0\")\n if ((allow == null && isOldElectron) || allow === false) {\n environment.DISABLE_WAYLAND = \"1\"\n }\n\n appDescriptor.environment = environment\n\n if (plugs != null) {\n for (const plugName of plugNames) {\n if (!isValidKey(plugName)) {\n throw new Error(`Invalid plug/slot name: ${plugName}`)\n }\n const plugOptions = plugs[plugName]\n if (plugOptions == null) {\n continue\n }\n if (!snap.plugs) {\n snap.plugs = {}\n }\n snap.plugs[plugName] = plugOptions\n }\n }\n }\n\n if (buildPackages.length > 0) {\n snap.parts.app[\"build-packages\"] = buildPackages\n }\n if (options.after != null) {\n snap.parts.app.after = options.after\n }\n\n if (options.assumes != null) {\n snap.assumes = asArray(options.assumes)\n }\n\n return snap\n }\n\n async buildSnap(props: { snap: any; appOutDir: string; stageDir: string; snapArch: Arch; artifactPath: string }): Promise<void> {\n const { snap, appOutDir, stageDir, snapArch, artifactPath } = props\n\n // Build the args array for effectiveOptionComputed compatibility — tests inspect this.\n const args = [\n \"snap\",\n \"--app\",\n appOutDir,\n \"--stage\",\n stageDir,\n \"--arch\",\n toLinuxArchString(snapArch, \"snap\"),\n \"--output\",\n artifactPath,\n \"--executable\",\n this.packager.executableName,\n ]\n\n await this.helper.icons\n if (this.helper.maxIconPath != null) {\n if (!this.isUseTemplateApp) {\n snap.icon = \"snap/gui/icon.png\"\n }\n args.push(\"--icon\", this.helper.maxIconPath)\n }\n\n const snapMetaDir = path.join(stageDir, this.isUseTemplateApp ? \"meta\" : \"snap\")\n const desktopFile = path.join(snapMetaDir, \"gui\", `${this.helper.getDesktopFileName(snap.name)}.desktop`)\n await this.helper.writeDesktopEntry(this.options, this.packager.executableName + \" %U\", desktopFile, {\n Icon: \"${SNAP}/meta/gui/icon.png\",\n })\n\n const extraAppArgs: Array<string> = this.options.executableArgs ?? []\n if (this.helper.isElectronVersionGreaterOrEqualThan(\"5.0.0\") && !this.isBrowserSandboxAllowed(snap)) {\n const noSandboxArg = \"--no-sandbox\"\n if (!extraAppArgs.includes(noSandboxArg)) {\n extraAppArgs.push(noSandboxArg)\n }\n if (this.isUseTemplateApp) {\n args.push(\"--exclude\", \"chrome-sandbox\")\n }\n }\n if (extraAppArgs.length > 0) {\n args.push(\"--extraAppArgs=\" + extraAppArgs.join(\" \"))\n }\n\n // Capture compression BEFORE it gets stripped from snap for template builds.\n const compression = this.options.compression ?? \"xz\"\n if (snap.compression != null) {\n args.push(\"--compression\", snap.compression)\n }\n\n if (this.isUseTemplateApp) {\n const fieldsToStrip = [\"compression\", \"contact\", \"donation\", \"issues\", \"parts\", \"source-code\", \"website\"]\n for (const field of fieldsToStrip) {\n delete snap[field]\n }\n }\n\n if (this.packager.packagerOptions.effectiveOptionComputed != null && (await this.packager.packagerOptions.effectiveOptionComputed({ snap, desktopFile, args }))) {\n return\n }\n\n await outputFile(path.join(snapMetaDir, this.isUseTemplateApp ? \"snap.yaml\" : \"snapcraft.yaml\"), serializeToYaml(snap))\n\n const hooksDir = await this.packager.getResource(this.options.hooks, \"snap-hooks\")\n if (hooksDir != null) {\n args.push(\"--hooks\", hooksDir)\n }\n\n if (this.isUseTemplateApp) {\n const templateArch = snapArch === Arch.x64 ? \"amd64\" : \"armhf\"\n args.push(\"--template-url\", `electron4:${templateArch}`)\n await this.buildWithTemplate({ appOutDir, stageDir, snapArch, artifactPath, compression, hooksDir, extraAppArgs })\n } else {\n await this.buildWithoutTemplate({ appOutDir, stageDir, artifactPath, hooksDir, extraAppArgs })\n }\n }\n\n private async buildWithTemplate(opts: {\n appOutDir: string\n stageDir: string\n snapArch: Arch\n artifactPath: string\n compression: string\n hooksDir: string | null\n extraAppArgs: string[]\n }): Promise<void> {\n const { appOutDir, stageDir, snapArch, artifactPath, compression, hooksDir, extraAppArgs } = opts\n const templateArch = snapArch === Arch.x64 ? \"amd64\" : \"armhf\"\n const { releaseName, filenameWithExt, checksums } = SNAP_TEMPLATES[templateArch]\n\n log.info({ releaseName }, \"downloading snap template\")\n const templateDir = await downloadBuilderToolset({ releaseName, filenameWithExt, checksums, githubOrgRepo: \"electron-userland/electron-builder-binaries\" })\n\n await this.stageSnapFiles({ stageDir, appOutDir, hooksDir, extraAppArgs, isTemplate: true })\n\n // Best-effort: remove chrome-sandbox from app dir before mksquashfs scans it.\n await rm(path.join(appOutDir, \"chrome-sandbox\"), { force: true })\n\n // chmod -R g-s to avoid setgid bits in final image\n for (const dir of [stageDir, appOutDir, templateDir]) {\n await exec(\"chmod\", [\"-R\", \"g-s\", dir]).catch(err => log.warn({ error: err.message }, \"chmod g-s failed\"))\n }\n\n const { mksquashfs } = await getAppImageTools(\"0.0.0\", snapArch, this.packager.buildResourcesDir)\n\n // Collect top-level entries from each dir as individual path args (mirrors Go ReadDirContentTo)\n const mksquashfsArgs: string[] = [\n ...(await readDirPaths(templateDir)),\n ...(await readDirPaths(stageDir)),\n ...(await readDirPaths(appOutDir, name => name !== \"LICENSES.chromium.html\" && name !== \"LICENSE.electron.txt\" && name !== \"chrome-sandbox\")),\n artifactPath,\n \"-no-progress\",\n \"-quiet\",\n \"-noappend\",\n \"-comp\",\n compression,\n \"-no-xattrs\",\n \"-no-fragments\",\n \"-all-root\",\n ]\n\n await exec(mksquashfs, mksquashfsArgs, { cwd: stageDir })\n }\n\n private async buildWithoutTemplate(opts: { appOutDir: string; stageDir: string; artifactPath: string; hooksDir: string | null; extraAppArgs: string[] }): Promise<void> {\n const { appOutDir, stageDir, artifactPath, hooksDir, extraAppArgs } = opts\n\n await this.stageSnapFiles({ stageDir, appOutDir, hooksDir, extraAppArgs, isTemplate: false })\n\n // Write desktop integration scripts (embedded in the Go binary, now in our templates)\n const snapTemplateDir = getTemplatePath(\"snap\")\n for (const script of [\"desktop-init.sh\", \"desktop-common.sh\", \"desktop-gnome-specific.sh\"]) {\n const src = path.join(snapTemplateDir, script)\n const dest = path.join(stageDir, \"scripts\", script)\n await copyFile(src, dest)\n // copyFile doesn't preserve mode; chmod 755 explicitly\n await chmod(dest, 0o755)\n }\n\n // Copy app dir into stage/app/ so snapcraft can pick it up\n await copyDir(appOutDir, path.join(stageDir, \"app\"))\n\n // Run snapcraft (legacy `snap` subcommand)\n const isDestructiveMode = isSnapDestructiveMode()\n const snapOutputName = \"out.snap\"\n const snapArgs = [\"snap\", \"--output\", isDestructiveMode ? artifactPath : snapOutputName]\n if (isDestructiveMode) {\n snapArgs.push(\"--destructive-mode\")\n }\n\n await exec(\"snapcraft\", snapArgs, {\n cwd: stageDir,\n env: { ...process.env, SNAPCRAFT_HAS_TTY: \"false\" },\n })\n\n if (!isDestructiveMode) {\n await rename(path.join(stageDir, snapOutputName), artifactPath)\n }\n }\n\n private async stageSnapFiles(opts: { stageDir: string; appOutDir: string; hooksDir: string | null; extraAppArgs: string[]; isTemplate: boolean }): Promise<void> {\n const { stageDir, hooksDir, extraAppArgs, isTemplate } = opts\n\n const snapMetaDir = path.join(stageDir, isTemplate ? \"meta\" : \"snap\")\n // No-template builds place command.sh + desktop scripts in scripts/ which snapcraft stages to snap root.\n // Template builds write command.sh to the stage root directly; no scripts/ dir is needed.\n const scriptDir = path.join(stageDir, \"scripts\")\n if (!isTemplate) {\n await mkdir(scriptDir, { recursive: true })\n }\n\n if (this.helper.maxIconPath != null) {\n const iconDest = path.join(snapMetaDir, \"gui\", `icon${path.extname(this.helper.maxIconPath)}`)\n await mkdir(path.dirname(iconDest), { recursive: true })\n await copyFile(this.helper.maxIconPath, iconDest)\n }\n\n if (hooksDir != null) {\n await copyDir(hooksDir, path.join(snapMetaDir, \"hooks\"))\n }\n\n // command.sh — template builds write to stage root; no-template writes to scripts/\n const commandWrapperPath = isTemplate ? path.join(stageDir, \"command.sh\") : path.join(scriptDir, \"command.sh\")\n const commandContent = buildCommandShContent({ isTemplate, executableName: this.packager.executableName, extraAppArgs })\n await writeFile(commandWrapperPath, commandContent, { mode: 0o755 })\n await chmod(commandWrapperPath, 0o755)\n }\n\n private normalizePlugConfiguration(raw: Array<string | PlugDescriptor> | PlugDescriptor | Nullish): Record<string, Record<string, any> | null> | null {\n if (raw == null) {\n return null\n }\n\n const result: any = {}\n for (const item of Array.isArray(raw) ? raw : [raw]) {\n if (typeof item === \"string\") {\n if (!isValidKey(item)) {\n throw new Error(`Invalid plug/slot name: ${item}`)\n }\n result[item] = null\n } else {\n deepAssign(result, item)\n }\n }\n return result\n }\n\n private isBrowserSandboxAllowed(snap: any): boolean {\n if (snap.plugs != null) {\n for (const plugName of Object.keys(snap.plugs)) {\n const plug = snap.plugs[plugName]\n if (plug.interface === \"browser-support\" && plug[\"allow-sandbox\"] === true) {\n return true\n }\n }\n }\n return false\n }\n\n private archNameToTriplet(arch: Arch): string {\n switch (arch) {\n case Arch.x64:\n return \"x86_64-linux-gnu\"\n case Arch.ia32:\n return \"i386-linux-gnu\"\n case Arch.armv7l:\n return \"arm-linux-gnueabihf\"\n case Arch.arm64:\n return \"aarch64-linux-gnu\"\n\n default:\n throw new Error(`Unsupported arch ${arch}`)\n }\n }\n}\n\nasync function readDirPaths(dir: string, filter?: (name: string) => boolean): Promise<string[]> {\n const entries = await readdir(dir)\n const result: string[] = []\n for (const name of entries) {\n if (!filter || filter(name)) {\n result.push(path.join(dir, name))\n }\n }\n return result\n}\n\n/**\n * Builds the content of command.sh for a snap package.\n *\n * For both template and no-template builds, the desktop-integration scripts are\n * sourced from the snap root ($SNAP):\n * - Template: scripts are embedded in the template tarball at the snap root.\n * - No-template: the snapcraft.yaml `launch-scripts` part uses `plugin: dump,\n * source: scripts`, which stages stageDir/scripts/ contents directly into the\n * snap root — so $SNAP/desktop-init.sh is correct in both cases.\n *\n * The only difference between template and no-template is the app executable prefix:\n * template apps are at $SNAP/<name>; no-template apps are at $SNAP/app/<name>.\n */\nexport function buildCommandShContent(opts: { isTemplate: boolean; executableName: string; extraAppArgs: string[] }): string {\n const { isTemplate, executableName, extraAppArgs } = opts\n validateShellEmbeddable(executableName, \"executableName\")\n const appPrefix = isTemplate ? \"\" : \"app/\"\n let content = `#!/bin/bash -e\\nexec \"$SNAP/desktop-init.sh\" \"$SNAP/desktop-common.sh\" \"$SNAP/desktop-gnome-specific.sh\" \"$SNAP/${appPrefix}${executableName}\"`\n if (extraAppArgs.length > 0) {\n content += \" \" + extraAppArgs.map(shellQuote).join(\" \")\n }\n content += ' \"$@\"'\n return content\n}\n"]}
|
|
1
|
+
{"version":3,"file":"coreLegacy.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/coreLegacy.ts"],"names":[],"mappings":"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","sourcesContent":["import { replaceDefault as _replaceDefault, Arch, copyDir, exec, log, serializeToYaml, toLinuxArchString, validateShellEmbeddable } from \"builder-util\"\nimport { asArray, deepAssign, isValidKey, Nullish } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport { chmod, copyFile, mkdir, readdir, rename, rm, writeFile } from \"fs/promises\"\nimport { load } from \"js-yaml\"\nimport * as path from \"path\"\nimport { PlugDescriptor, SnapOptionsLegacy } from \"../../../options/SnapOptions.js\"\nimport { getAppImageTools } from \"../../../toolsets/appimage.js\"\nimport { downloadBuilderToolset } from \"../../../util/electronGet.js\"\nimport { isSnapDestructiveMode } from \"../../../util/flags.js\"\nimport { getTemplatePath } from \"../../../util/pathManager.js\"\nimport { buildLauncherScript } from \"../launcherScript.js\"\nimport { SnapCore } from \"./SnapTarget.js\"\nimport { shellQuote } from \"./snapCommand.js\"\nimport { SnapcraftYAML } from \"./snapcraft.js\"\nimport { DEFAULT_STAGE_PACKAGES } from \"./snapcraftBuilder.js\"\nconst { outputFile, readFile } = _fsExtra\n\n// Re-exported for backwards compatibility with existing imports/tests.\nexport { shellQuote }\n\n// Snap template release info from electron-userland/electron-builder-binaries\nconst SNAP_TEMPLATES = {\n amd64: {\n releaseName: \"snap-template-4.0-2\",\n filenameWithExt: \"snap-template-electron-4.0-2-amd64.tar.7z\",\n checksums: { \"snap-template-electron-4.0-2-amd64.tar.7z\": \"5e3ab4e09364ac06f0072b1c2dab9138318c933f6b2c7374f893b5ec44d19e6f\" },\n },\n armhf: {\n releaseName: \"snap-template-4.0-1\",\n filenameWithExt: \"snap-template-electron-4.0-1-armhf.tar.7z\",\n checksums: { \"snap-template-electron-4.0-1-armhf.tar.7z\": \"6f7553e904f4e043bc3019f0899d05e01a283b00b61fec22e932296490e3be6b\" },\n },\n} as const\n\n// Handles core18/core20/core22 snaps via mksquashfs (template) or snapcraft CLI (no-template).\n// See: https://github.com/develar/app-builder/blob/master/pkg/package-format/snap\nexport class SnapCoreLegacy extends SnapCore<SnapOptionsLegacy & { base: \"core18\" | \"core20\" | \"core22\" }> {\n private isUseTemplateApp = false\n\n defaultPlugs = [\"desktop\", \"desktop-legacy\", \"home\", \"x11\", \"wayland\", \"unity7\", \"browser-support\", \"network\", \"gsettings\", \"audio-playback\", \"pulseaudio\", \"opengl\"]\n\n private replaceDefault(inList: Array<string> | Nullish, defaultList: Array<string>) {\n const result = _replaceDefault(inList, defaultList)\n if (result !== defaultList) {\n this.isUseTemplateApp = false\n }\n return result\n }\n\n async createDescriptor(arch: Arch): Promise<SnapcraftYAML> {\n const appInfo = this.packager.appInfo\n const snapName = this.packager.executableName.toLowerCase()\n const options = this.options\n\n const plugs = this.normalizePlugConfiguration(this.options.plugs)\n\n const plugNames = this.replaceDefault(plugs == null ? null : Object.getOwnPropertyNames(plugs), this.defaultPlugs)\n\n const slots = this.normalizePlugConfiguration(this.options.slots)\n\n const buildPackages = asArray(options.buildPackages)\n const stagePackages = this.replaceDefault(options.stagePackages, DEFAULT_STAGE_PACKAGES)\n\n const stageSet = new Set(stagePackages)\n const stageMatchesDefaults = stagePackages.length === DEFAULT_STAGE_PACKAGES.length && DEFAULT_STAGE_PACKAGES.every((p: string) => stageSet.has(p))\n\n // Template app is only available for x64/armv7l, and only when no packages are customised.\n this.isUseTemplateApp = this.options.useTemplateApp !== false && (arch === Arch.x64 || arch === Arch.armv7l) && buildPackages.length === 0 && stageMatchesDefaults\n\n const appDescriptor: any = {\n command: \"command.sh\",\n plugs: plugNames,\n adapter: \"none\",\n }\n\n const snap: any = load(await readFile(path.join(getTemplatePath(\"snap\"), \"snapcraft.yaml\"), \"utf-8\"))\n if (this.isUseTemplateApp) {\n delete appDescriptor.adapter\n }\n if (options.base != null) {\n snap.base = options.base\n if (Number(snap.base.split(\"core\")[1]) >= 22) {\n delete appDescriptor.adapter\n }\n }\n if (options.grade != null) {\n snap.grade = options.grade\n }\n if (options.confinement != null) {\n snap.confinement = options.confinement\n }\n if (options.appPartStage != null) {\n snap.parts.app.stage = options.appPartStage\n }\n if (options.layout != null) {\n snap.layout = options.layout\n }\n if (slots != null) {\n appDescriptor.slots = Object.getOwnPropertyNames(slots)\n for (const slotName of appDescriptor.slots) {\n if (!isValidKey(slotName)) {\n throw new Error(`Invalid plug/slot name: ${slotName}`)\n }\n const slotOptions = slots[slotName]\n if (slotOptions == null) {\n continue\n }\n if (!snap.slots) {\n snap.slots = {}\n }\n snap.slots[slotName] = slotOptions\n }\n }\n\n deepAssign(snap, {\n name: snapName,\n version: appInfo.version,\n title: options.title || appInfo.productName,\n summary: options.summary || appInfo.productName,\n compression: options.compression,\n description: this.helper.getDescription(options),\n architectures: [toLinuxArchString(arch, \"snap\")],\n apps: {\n [snapName]: appDescriptor,\n },\n parts: {\n app: {\n \"stage-packages\": stagePackages,\n },\n },\n })\n\n if (options.autoStart) {\n appDescriptor.autostart = `${this.helper.getDesktopFileName(snap.name)}.desktop`\n }\n\n if (options.confinement === \"classic\") {\n delete appDescriptor.plugs\n delete snap.plugs\n } else {\n const archTriplet = this.archNameToTriplet(arch)\n const environment: Record<string, string> = {\n PATH: \"$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH\",\n SNAP_DESKTOP_RUNTIME: \"$SNAP/gnome-platform\",\n LD_LIBRARY_PATH: [\n \"$SNAP_LIBRARY_PATH\",\n \"$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/\" + archTriplet + \":$SNAP/usr/lib/\" + archTriplet,\n \"$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib\",\n \"$SNAP/lib/\" + archTriplet + \":$SNAP/usr/lib/\" + archTriplet,\n ].join(\":\"),\n ...options.environment,\n }\n const allow = options.allowNativeWayland\n const isOldElectron = !this.helper.isElectronVersionGreaterOrEqualThan(\"38.0.0\", \"7.0.0\")\n if ((allow == null && isOldElectron) || allow === false) {\n environment.DISABLE_WAYLAND = \"1\"\n }\n\n appDescriptor.environment = environment\n\n if (plugs != null) {\n for (const plugName of plugNames) {\n if (!isValidKey(plugName)) {\n throw new Error(`Invalid plug/slot name: ${plugName}`)\n }\n const plugOptions = plugs[plugName]\n if (plugOptions == null) {\n continue\n }\n if (!snap.plugs) {\n snap.plugs = {}\n }\n snap.plugs[plugName] = plugOptions\n }\n }\n }\n\n if (buildPackages.length > 0) {\n snap.parts.app[\"build-packages\"] = buildPackages\n }\n if (options.after != null) {\n snap.parts.app.after = options.after\n }\n\n if (options.assumes != null) {\n snap.assumes = asArray(options.assumes)\n }\n\n return snap\n }\n\n async buildSnap(props: { snap: any; appOutDir: string; stageDir: string; snapArch: Arch; artifactPath: string }): Promise<string[]> {\n const { snap, appOutDir, stageDir, snapArch, artifactPath } = props\n\n // Build the args array for effectiveOptionComputed compatibility — tests inspect this.\n const args = [\n \"snap\",\n \"--app\",\n appOutDir,\n \"--stage\",\n stageDir,\n \"--arch\",\n toLinuxArchString(snapArch, \"snap\"),\n \"--output\",\n artifactPath,\n \"--executable\",\n this.packager.executableName,\n ]\n\n await this.helper.icons\n if (this.helper.maxIconPath != null) {\n if (!this.isUseTemplateApp) {\n snap.icon = \"snap/gui/icon.png\"\n }\n args.push(\"--icon\", this.helper.maxIconPath)\n }\n\n const snapMetaDir = path.join(stageDir, this.isUseTemplateApp ? \"meta\" : \"snap\")\n const desktopFile = path.join(snapMetaDir, \"gui\", `${this.helper.getDesktopFileName(snap.name)}.desktop`)\n await this.helper.writeDesktopEntry(this.options, this.packager.executableName + \" %U\", desktopFile, {\n Icon: \"${SNAP}/meta/gui/icon.png\",\n })\n\n const extraAppArgs: Array<string> = this.options.executableArgs ?? []\n if (this.helper.isElectronVersionGreaterOrEqualThan(\"5.0.0\") && !this.isBrowserSandboxAllowed(snap)) {\n const noSandboxArg = \"--no-sandbox\"\n if (!extraAppArgs.includes(noSandboxArg)) {\n extraAppArgs.push(noSandboxArg)\n }\n if (this.isUseTemplateApp) {\n args.push(\"--exclude\", \"chrome-sandbox\")\n }\n }\n if (extraAppArgs.length > 0) {\n args.push(\"--extraAppArgs=\" + extraAppArgs.join(\" \"))\n }\n\n // Capture compression BEFORE it gets stripped from snap for template builds.\n const compression = this.options.compression ?? \"xz\"\n if (snap.compression != null) {\n args.push(\"--compression\", snap.compression)\n }\n\n if (this.isUseTemplateApp) {\n const fieldsToStrip = [\"compression\", \"contact\", \"donation\", \"issues\", \"parts\", \"source-code\", \"website\"]\n for (const field of fieldsToStrip) {\n delete snap[field]\n }\n }\n\n if (this.packager.packagerOptions.effectiveOptionComputed != null && (await this.packager.packagerOptions.effectiveOptionComputed({ snap, desktopFile, args }))) {\n return [artifactPath]\n }\n\n await outputFile(path.join(snapMetaDir, this.isUseTemplateApp ? \"snap.yaml\" : \"snapcraft.yaml\"), serializeToYaml(snap))\n\n const hooksDir = await this.packager.getResource(this.options.hooks, \"snap-hooks\")\n if (hooksDir != null) {\n args.push(\"--hooks\", hooksDir)\n }\n\n if (this.isUseTemplateApp) {\n const templateArch = snapArch === Arch.x64 ? \"amd64\" : \"armhf\"\n args.push(\"--template-url\", `electron4:${templateArch}`)\n await this.buildWithTemplate({ appOutDir, stageDir, snapArch, artifactPath, compression, hooksDir, extraAppArgs })\n } else {\n await this.buildWithoutTemplate({ appOutDir, stageDir, artifactPath, hooksDir, extraAppArgs })\n }\n return [artifactPath]\n }\n\n private async buildWithTemplate(opts: {\n appOutDir: string\n stageDir: string\n snapArch: Arch\n artifactPath: string\n compression: string\n hooksDir: string | null\n extraAppArgs: string[]\n }): Promise<void> {\n const { appOutDir, stageDir, snapArch, artifactPath, compression, hooksDir, extraAppArgs } = opts\n const templateArch = snapArch === Arch.x64 ? \"amd64\" : \"armhf\"\n const { releaseName, filenameWithExt, checksums } = SNAP_TEMPLATES[templateArch]\n\n log.info({ releaseName }, \"downloading snap template\")\n const templateDir = await downloadBuilderToolset({ releaseName, filenameWithExt, checksums, githubOrgRepo: \"electron-userland/electron-builder-binaries\" })\n\n await this.stageSnapFiles({ stageDir, appOutDir, hooksDir, extraAppArgs, isTemplate: true })\n\n // Best-effort: remove chrome-sandbox from app dir before mksquashfs scans it.\n await rm(path.join(appOutDir, \"chrome-sandbox\"), { force: true })\n\n // chmod -R g-s to avoid setgid bits in final image\n for (const dir of [stageDir, appOutDir, templateDir]) {\n await exec(\"chmod\", [\"-R\", \"g-s\", dir]).catch(err => log.warn({ error: err.message }, \"chmod g-s failed\"))\n }\n\n const { mksquashfs } = await getAppImageTools(\"0.0.0\", snapArch, this.packager.buildResourcesDir)\n\n // Collect top-level entries from each dir as individual path args (mirrors Go ReadDirContentTo)\n const mksquashfsArgs: string[] = [\n ...(await readDirPaths(templateDir)),\n ...(await readDirPaths(stageDir)),\n ...(await readDirPaths(appOutDir, name => name !== \"LICENSES.chromium.html\" && name !== \"LICENSE.electron.txt\" && name !== \"chrome-sandbox\")),\n artifactPath,\n \"-no-progress\",\n \"-quiet\",\n \"-noappend\",\n \"-comp\",\n compression,\n \"-no-xattrs\",\n \"-no-fragments\",\n \"-all-root\",\n ]\n\n await exec(mksquashfs, mksquashfsArgs, { cwd: stageDir })\n }\n\n private async buildWithoutTemplate(opts: { appOutDir: string; stageDir: string; artifactPath: string; hooksDir: string | null; extraAppArgs: string[] }): Promise<void> {\n const { appOutDir, stageDir, artifactPath, hooksDir, extraAppArgs } = opts\n\n await this.stageSnapFiles({ stageDir, appOutDir, hooksDir, extraAppArgs, isTemplate: false })\n\n // Write desktop integration scripts (embedded in the Go binary, now in our templates)\n const snapTemplateDir = getTemplatePath(\"snap\")\n for (const script of [\"desktop-init.sh\", \"desktop-common.sh\", \"desktop-gnome-specific.sh\"]) {\n const src = path.join(snapTemplateDir, script)\n const dest = path.join(stageDir, \"scripts\", script)\n await copyFile(src, dest)\n // copyFile doesn't preserve mode; chmod 755 explicitly\n await chmod(dest, 0o755)\n }\n\n // Copy app dir into stage/app/ so snapcraft can pick it up\n await copyDir(appOutDir, path.join(stageDir, \"app\"))\n\n // Run snapcraft (legacy `snap` subcommand)\n const isDestructiveMode = isSnapDestructiveMode()\n const snapOutputName = \"out.snap\"\n const snapArgs = [\"snap\", \"--output\", isDestructiveMode ? artifactPath : snapOutputName]\n if (isDestructiveMode) {\n snapArgs.push(\"--destructive-mode\")\n }\n\n await exec(\"snapcraft\", snapArgs, {\n cwd: stageDir,\n env: { ...process.env, SNAPCRAFT_HAS_TTY: \"false\" },\n })\n\n if (!isDestructiveMode) {\n await rename(path.join(stageDir, snapOutputName), artifactPath)\n }\n }\n\n private async stageSnapFiles(opts: { stageDir: string; appOutDir: string; hooksDir: string | null; extraAppArgs: string[]; isTemplate: boolean }): Promise<void> {\n const { stageDir, hooksDir, extraAppArgs, isTemplate } = opts\n\n const snapMetaDir = path.join(stageDir, isTemplate ? \"meta\" : \"snap\")\n // No-template builds place command.sh + desktop scripts in scripts/ which snapcraft stages to snap root.\n // Template builds write command.sh to the stage root directly; no scripts/ dir is needed.\n const scriptDir = path.join(stageDir, \"scripts\")\n if (!isTemplate) {\n await mkdir(scriptDir, { recursive: true })\n }\n\n if (this.helper.maxIconPath != null) {\n const iconDest = path.join(snapMetaDir, \"gui\", `icon${path.extname(this.helper.maxIconPath)}`)\n await mkdir(path.dirname(iconDest), { recursive: true })\n await copyFile(this.helper.maxIconPath, iconDest)\n }\n\n if (hooksDir != null) {\n await copyDir(hooksDir, path.join(snapMetaDir, \"hooks\"))\n }\n\n // command.sh — template builds write to stage root; no-template writes to scripts/\n const commandWrapperPath = isTemplate ? path.join(stageDir, \"command.sh\") : path.join(scriptDir, \"command.sh\")\n const commandContent = buildCommandShContent({ isTemplate, executableName: this.packager.executableName, extraAppArgs })\n await writeFile(commandWrapperPath, commandContent, { mode: 0o755 })\n await chmod(commandWrapperPath, 0o755)\n }\n\n private normalizePlugConfiguration(raw: Array<string | PlugDescriptor> | PlugDescriptor | Nullish): Record<string, Record<string, any> | null> | null {\n if (raw == null) {\n return null\n }\n\n const result: any = {}\n for (const item of Array.isArray(raw) ? raw : [raw]) {\n if (typeof item === \"string\") {\n if (!isValidKey(item)) {\n throw new Error(`Invalid plug/slot name: ${item}`)\n }\n result[item] = null\n } else {\n deepAssign(result, item)\n }\n }\n return result\n }\n\n private isBrowserSandboxAllowed(snap: any): boolean {\n if (snap.plugs != null) {\n for (const plugName of Object.keys(snap.plugs)) {\n const plug = snap.plugs[plugName]\n if (plug.interface === \"browser-support\" && plug[\"allow-sandbox\"] === true) {\n return true\n }\n }\n }\n return false\n }\n\n private archNameToTriplet(arch: Arch): string {\n switch (arch) {\n case Arch.x64:\n return \"x86_64-linux-gnu\"\n case Arch.ia32:\n return \"i386-linux-gnu\"\n case Arch.armv7l:\n return \"arm-linux-gnueabihf\"\n case Arch.arm64:\n return \"aarch64-linux-gnu\"\n\n default:\n throw new Error(`Unsupported arch ${arch}`)\n }\n }\n}\n\nasync function readDirPaths(dir: string, filter?: (name: string) => boolean): Promise<string[]> {\n const entries = await readdir(dir)\n const result: string[] = []\n for (const name of entries) {\n if (!filter || filter(name)) {\n result.push(path.join(dir, name))\n }\n }\n return result\n}\n\n/**\n * Builds the content of command.sh for a snap package.\n *\n * For both template and no-template builds, the desktop-integration scripts are\n * sourced from the snap root ($SNAP):\n * - Template: scripts are embedded in the template tarball at the snap root.\n * - No-template: the snapcraft.yaml `launch-scripts` part uses `plugin: dump,\n * source: scripts`, which stages stageDir/scripts/ contents directly into the\n * snap root — so $SNAP/desktop-init.sh is correct in both cases.\n *\n * The only difference between template and no-template is the app executable prefix:\n * template apps are at $SNAP/<name>; no-template apps are at $SNAP/app/<name>.\n */\nexport function buildCommandShContent(opts: { isTemplate: boolean; executableName: string; extraAppArgs: string[] }): string {\n const { isTemplate, executableName, extraAppArgs } = opts\n validateShellEmbeddable(executableName, \"executableName\")\n const appPrefix = isTemplate ? \"\" : \"app/\"\n return buildLauncherScript({\n shebang: \"#!/bin/bash -e\",\n command: ['\"$SNAP/desktop-init.sh\"', '\"$SNAP/desktop-common.sh\"', '\"$SNAP/desktop-gnome-specific.sh\"', `\"$SNAP/${appPrefix}${executableName}\"`],\n args: extraAppArgs,\n })\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
1
|
+
import { shellQuote } from "../launcherScript.js";
|
|
2
|
+
export { shellQuote };
|
|
3
3
|
/**
|
|
4
4
|
* Builds the contents of the launcher script that execs `$SNAP/app/<execName>` with the given args.
|
|
5
5
|
* `$@` is forwarded so launch-time arguments still reach the app. The executable name is validated
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapCommand.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/snapCommand.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"snapCommand.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/snapCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAStE,OAAO,EAAE,UAAU,EAAE,CAAA;AAErB;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,CAIjG"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { validateShellEmbeddable } from "builder-util";
|
|
2
|
+
import { buildLauncherScript, shellQuote } from "../launcherScript.js";
|
|
2
3
|
// snapd restricts the value of `apps.<app-name>.command` to alphanumeric characters, spaces, and
|
|
3
4
|
// `/ . _ # : $ -`, and splits it on whitespace. Rather than encode those rules per-arg, core24
|
|
4
5
|
// always routes the command through a launcher script (see buildSnapCommandLauncherScript), which
|
|
5
6
|
// sidesteps the character restrictions entirely and keeps a single, uniform command path.
|
|
6
7
|
// See: https://documentation.ubuntu.com/snapcraft/stable/reference/snapcraft-yaml/#apps.%3Capp-name%3E.command
|
|
7
|
-
|
|
8
|
-
export
|
|
9
|
-
return "'" + arg.replace(/'/g, "'\\''") + "'";
|
|
10
|
-
}
|
|
8
|
+
// Re-exported for backwards compatibility with existing imports/tests.
|
|
9
|
+
export { shellQuote };
|
|
11
10
|
/**
|
|
12
11
|
* Builds the contents of the launcher script that execs `$SNAP/app/<execName>` with the given args.
|
|
13
12
|
* `$@` is forwarded so launch-time arguments still reach the app. The executable name is validated
|
|
@@ -17,11 +16,6 @@ export function shellQuote(arg) {
|
|
|
17
16
|
export function buildSnapCommandLauncherScript(opts) {
|
|
18
17
|
const { execName, args } = opts;
|
|
19
18
|
validateShellEmbeddable(execName, "executableName");
|
|
20
|
-
|
|
21
|
-
if (args.length > 0) {
|
|
22
|
-
content += " " + args.map(shellQuote).join(" ");
|
|
23
|
-
}
|
|
24
|
-
content += ' "$@"\n';
|
|
25
|
-
return content;
|
|
19
|
+
return buildLauncherScript({ command: [`"$SNAP/app/${execName}"`], args });
|
|
26
20
|
}
|
|
27
21
|
//# sourceMappingURL=snapCommand.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapCommand.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/snapCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"snapCommand.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/snapCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEtE,iGAAiG;AACjG,+FAA+F;AAC/F,kGAAkG;AAClG,0FAA0F;AAC1F,+GAA+G;AAE/G,uEAAuE;AACvE,OAAO,EAAE,UAAU,EAAE,CAAA;AAErB;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B,CAAC,IAA0C;IACvF,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;IAC/B,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;IACnD,OAAO,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC,cAAc,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;AAC5E,CAAC","sourcesContent":["import { validateShellEmbeddable } from \"builder-util\"\nimport { buildLauncherScript, shellQuote } from \"../launcherScript.js\"\n\n// snapd restricts the value of `apps.<app-name>.command` to alphanumeric characters, spaces, and\n// `/ . _ # : $ -`, and splits it on whitespace. Rather than encode those rules per-arg, core24\n// always routes the command through a launcher script (see buildSnapCommandLauncherScript), which\n// sidesteps the character restrictions entirely and keeps a single, uniform command path.\n// See: https://documentation.ubuntu.com/snapcraft/stable/reference/snapcraft-yaml/#apps.%3Capp-name%3E.command\n\n// Re-exported for backwards compatibility with existing imports/tests.\nexport { shellQuote }\n\n/**\n * Builds the contents of the launcher script that execs `$SNAP/app/<execName>` with the given args.\n * `$@` is forwarded so launch-time arguments still reach the app. The executable name is validated\n * against shell metacharacters and each arg is single-quoted, so embedded characters (e.g. `=`, quotes)\n * are passed literally.\n */\nexport function buildSnapCommandLauncherScript(opts: { execName: string; args: string[] }): string {\n const { execName, args } = opts\n validateShellEmbeddable(execName, \"executableName\")\n return buildLauncherScript({ command: [`\"$SNAP/app/${execName}\"`], args })\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Arch } from "builder-util";
|
|
1
2
|
import { LinuxPackager } from "../../../linuxPackager.js";
|
|
2
3
|
import { RemoteBuildOptions } from "../../../options/SnapOptions.js";
|
|
3
4
|
import { SnapcraftYAML } from "./snapcraft.js";
|
|
@@ -27,6 +28,11 @@ interface BuildSnapOptions {
|
|
|
27
28
|
/** Snap Store credentials from SnapcraftOptions root — base64 string or file path */
|
|
28
29
|
cscLink?: string;
|
|
29
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Maps a snapcraft arch string (as found in snap filenames) back to an electron-builder Arch.
|
|
33
|
+
* Used to assign the correct Arch value to extra artifacts from multi-arch remote-builds.
|
|
34
|
+
*/
|
|
35
|
+
export declare function snapArchStringToArch(snapArch: string): Arch;
|
|
30
36
|
/**
|
|
31
37
|
* Builds a snap package from SnapcraftYAML configuration.
|
|
32
38
|
*
|
|
@@ -35,6 +41,6 @@ interface BuildSnapOptions {
|
|
|
35
41
|
* access to download stage-packages, the base image, and extensions.
|
|
36
42
|
* To opt into an offline build, set `SNAPCRAFT_NO_NETWORK=1` in your environment.
|
|
37
43
|
*/
|
|
38
|
-
export declare function buildSnap(options: BuildSnapOptions): Promise<string>;
|
|
44
|
+
export declare function buildSnap(options: BuildSnapOptions): Promise<string[]>;
|
|
39
45
|
export {};
|
|
40
46
|
//# sourceMappingURL=snapcraftBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapcraftBuilder.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/snapcraftBuilder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"snapcraftBuilder.d.ts","sourceRoot":"","sources":["../../../../src/targets/linux/snap/snapcraftBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuF,MAAM,cAAc,CAAA;AAKxH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAK9C,eAAO,MAAM,sBAAsB;;;;CAAsD,CAAA;AACzF,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAA8E,CAAA;AAEzH,UAAU,gBAAgB;IACxB,uCAAuC;IACvC,eAAe,EAAE,aAAa,CAAA;IAC9B,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAA;IAChB,wDAAwD;IACxD,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,gDAAgD;IAChD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,4FAA4F;IAC5F,QAAQ,EAAE,aAAa,CAAA;IACvB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAuJD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAe3D;AAYD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4E5E"}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import { InvalidConfigurationError, isEmptyOrSpaces, log, spawn, stripSensitiveEnvVars } from "builder-util";
|
|
2
|
-
import * as childProcess from "child_process";
|
|
1
|
+
import { Arch, exec, InvalidConfigurationError, isEmptyOrSpaces, log, spawn, stripSensitiveEnvVars } from "builder-util";
|
|
3
2
|
import { randomUUID } from "crypto";
|
|
4
3
|
import { resolveSnapCredentials } from "electron-publish";
|
|
5
4
|
import * as path from "path";
|
|
6
|
-
import * as util from "util";
|
|
7
5
|
import { deepAssign, sleep } from "builder-util-runtime";
|
|
8
6
|
import _fsExtra from "fs-extra";
|
|
9
7
|
const { copyFile, ensureDir, pathExists, readdir, remove } = _fsExtra;
|
|
10
|
-
const execAsync = util.promisify(childProcess.exec);
|
|
11
8
|
export const SNAPCRAFT_YAML_OPTIONS = { indent: 2, lineWidth: -1, noRefs: true };
|
|
12
9
|
export const DEFAULT_STAGE_PACKAGES = ["libnspr4", "libnss3", "libxss1", "libappindicator3-1", "libsecret-1-0"];
|
|
13
10
|
/**
|
|
@@ -16,17 +13,16 @@ export const DEFAULT_STAGE_PACKAGES = ["libnspr4", "libnss3", "libxss1", "libapp
|
|
|
16
13
|
*/
|
|
17
14
|
async function validateSnapcraftYamlWithCLI(workDir) {
|
|
18
15
|
try {
|
|
19
|
-
const
|
|
16
|
+
const stdout = await exec("snapcraft", ["expand-extensions"], {
|
|
20
17
|
cwd: workDir,
|
|
21
18
|
timeout: 30000,
|
|
22
19
|
});
|
|
23
20
|
log.debug({ expandedYaml: stdout }, "validated extended snapcraft.yaml");
|
|
24
21
|
}
|
|
25
22
|
catch (error) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
`Run 'snapcraft expand-extensions' in ${workDir} for more details`);
|
|
23
|
+
// builder-util's exec folds stdout/stderr into the ExecError message
|
|
24
|
+
log.error({ error: error.message }, "snapcraft.yaml validation failed");
|
|
25
|
+
throw new Error(`Invalid snapcraft.yaml: ${error.message}\n` + `Run 'snapcraft expand-extensions' in ${workDir} for more details`);
|
|
30
26
|
}
|
|
31
27
|
}
|
|
32
28
|
/**
|
|
@@ -141,6 +137,26 @@ async function cleanupBuildArtifacts(workDir) {
|
|
|
141
137
|
log.debug({ error: e.message }, "no snap files to clean");
|
|
142
138
|
}
|
|
143
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Maps a snapcraft arch string (as found in snap filenames) back to an electron-builder Arch.
|
|
142
|
+
* Used to assign the correct Arch value to extra artifacts from multi-arch remote-builds.
|
|
143
|
+
*/
|
|
144
|
+
export function snapArchStringToArch(snapArch) {
|
|
145
|
+
switch (snapArch) {
|
|
146
|
+
case "amd64":
|
|
147
|
+
return Arch.x64;
|
|
148
|
+
case "arm64":
|
|
149
|
+
return Arch.arm64;
|
|
150
|
+
case "armhf":
|
|
151
|
+
return Arch.armv7l;
|
|
152
|
+
case "i386":
|
|
153
|
+
case "i686":
|
|
154
|
+
return Arch.ia32;
|
|
155
|
+
default:
|
|
156
|
+
log.warn({ snapArch }, "unrecognised snap arch in output filename, defaulting to x64");
|
|
157
|
+
return Arch.x64;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
144
160
|
async function copySnapToArtifactPath(workDir, outputBasename, outputFileName) {
|
|
145
161
|
const snapInWorkDir = path.join(workDir, outputBasename);
|
|
146
162
|
if (snapInWorkDir !== outputFileName) {
|
|
@@ -224,7 +240,7 @@ export async function buildSnap(options) {
|
|
|
224
240
|
*/
|
|
225
241
|
async function ensureSnapcraftInstalled() {
|
|
226
242
|
try {
|
|
227
|
-
const
|
|
243
|
+
const stdout = await exec("snapcraft", ["--version"]);
|
|
228
244
|
log.info({ version: stdout.trim() }, "snapcraft found");
|
|
229
245
|
}
|
|
230
246
|
catch (error) {
|
|
@@ -266,7 +282,7 @@ async function ensureRemoteBuildAuthentication(cscLink, resourcesDir) {
|
|
|
266
282
|
}
|
|
267
283
|
// 3. Interactive snapcraft session.
|
|
268
284
|
try {
|
|
269
|
-
const
|
|
285
|
+
const stdout = await exec("snapcraft", ["whoami"]);
|
|
270
286
|
if (stdout.includes("email:")) {
|
|
271
287
|
log.debug({ account: stdout.trim() }, "already authenticated with snapcraft");
|
|
272
288
|
return {};
|
|
@@ -292,7 +308,7 @@ async function executeSnapcraftBuild(options) {
|
|
|
292
308
|
// depend on snapcraft's naming convention (which always uses underscores).
|
|
293
309
|
const tmpSnap = `eb-snap-${randomUUID().replace(/-/g, "")}.snap`;
|
|
294
310
|
if (useDestructiveMode && !remoteBuild?.enabled) {
|
|
295
|
-
return await runDestructiveBuild(workDir, processedEnv, tmpSnap, outputFileName);
|
|
311
|
+
return [await runDestructiveBuild(workDir, processedEnv, tmpSnap, outputFileName)];
|
|
296
312
|
}
|
|
297
313
|
const command = "snapcraft";
|
|
298
314
|
const args = [];
|
|
@@ -329,16 +345,36 @@ async function executeSnapcraftBuild(options) {
|
|
|
329
345
|
env: processedEnv,
|
|
330
346
|
});
|
|
331
347
|
if (remoteBuild?.enabled || useLXD || useMultipass) {
|
|
332
|
-
// snapcraft names
|
|
333
|
-
//
|
|
348
|
+
// snapcraft names output snaps itself (e.g. <name>_<version>_<arch>.snap).
|
|
349
|
+
// For multi-arch remote-builds (buildFor array), multiple snaps land in workDir.
|
|
334
350
|
const files = await readdir(workDir);
|
|
335
|
-
const
|
|
336
|
-
if (
|
|
351
|
+
const builtSnaps = files.filter(f => f.endsWith(".snap"));
|
|
352
|
+
if (builtSnaps.length === 0) {
|
|
337
353
|
throw new Error(`Build succeeded but no .snap file found in ${workDir}`);
|
|
338
354
|
}
|
|
339
|
-
|
|
355
|
+
const outDir = path.dirname(outputFileName);
|
|
356
|
+
// Extract the arch segment from the pre-computed artifact path so we can identify
|
|
357
|
+
// the primary snap by arch rather than by filename — snapcraft may name its output
|
|
358
|
+
// differently (e.g. underscores vs hyphens, different app name sanitization).
|
|
359
|
+
const primaryBase = path.basename(outputFileName);
|
|
360
|
+
const primaryArch = primaryBase
|
|
361
|
+
.replace(/\.snap$/, "")
|
|
362
|
+
.split("_")
|
|
363
|
+
.pop();
|
|
364
|
+
const results = [];
|
|
365
|
+
for (const snapFile of builtSnaps) {
|
|
366
|
+
const snapArch = snapFile
|
|
367
|
+
.replace(/\.snap$/, "")
|
|
368
|
+
.split("_")
|
|
369
|
+
.pop() ?? primaryArch;
|
|
370
|
+
// Primary arch: honour the pre-computed outputFileName (respects artifactName macro).
|
|
371
|
+
// Extra arches: substitute the arch segment in the primary basename to follow the same pattern.
|
|
372
|
+
const dest = snapArch === primaryArch ? outputFileName : path.join(outDir, primaryBase.replace(new RegExp(`_${primaryArch}\\.snap$`), `_${snapArch}.snap`));
|
|
373
|
+
results.push(await copySnapToArtifactPath(workDir, snapFile, dest));
|
|
374
|
+
}
|
|
375
|
+
return results;
|
|
340
376
|
}
|
|
341
|
-
return copySnapToArtifactPath(workDir, tmpSnap, outputFileName);
|
|
377
|
+
return [await copySnapToArtifactPath(workDir, tmpSnap, outputFileName)];
|
|
342
378
|
}
|
|
343
379
|
function generateRemoteBuildArgs(remoteBuild, workDir) {
|
|
344
380
|
const isolatedEnv = {};
|
|
@@ -359,8 +395,9 @@ function generateRemoteBuildArgs(remoteBuild, workDir) {
|
|
|
359
395
|
log.debug({ project: remoteBuild.privateProject }, "using private Launchpad project");
|
|
360
396
|
}
|
|
361
397
|
if (remoteBuild.buildFor) {
|
|
362
|
-
|
|
363
|
-
|
|
398
|
+
const buildForStr = Array.isArray(remoteBuild.buildFor) ? remoteBuild.buildFor.join(",") : remoteBuild.buildFor;
|
|
399
|
+
args.push("--build-for", buildForStr);
|
|
400
|
+
log.debug({ arch: buildForStr }, "building for architecture");
|
|
364
401
|
}
|
|
365
402
|
if (remoteBuild.recover) {
|
|
366
403
|
args.push("--recover");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapcraftBuilder.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/snapcraftBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,GAAG,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAC5G,OAAO,KAAK,YAAY,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAI5B,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAA;AAErE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;AAEnD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAW,CAAA;AACzF,MAAM,CAAC,MAAM,sBAAsB,GAAa,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,EAAE,eAAe,CAAC,CAAA;AAuBzH;;;GAGG;AACH,KAAK,UAAU,4BAA4B,CAAC,OAAe;IACzD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,6BAA6B,EAAE;YAChE,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE,KAAK;SACf,CAAC,CAAA;QACF,GAAG,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,mCAAmC,CAAC,CAAA;IAC1E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,kCAAkC,CAAC,CAAA;QAC7F,MAAM,IAAI,KAAK,CACb,2BAA2B,KAAK,CAAC,OAAO,IAAI;YAC1C,qBAAqB,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,WAAW,IAAI;YACpE,wCAAwC,OAAO,mBAAmB,CACrE,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAAC,MAAqB;IACpD,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,kBAAkB;IAClB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IACjC,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IACjC,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IACxC,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IAC9C,CAAC;IAED,kBAAkB;IAClB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;QAC/E,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;QACnD,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;QACxD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,SAAS,QAAQ,mCAAmC,CAAC,CAAA;QACnE,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,kBAAkB;IAClB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE;YACrD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,OAAO,oCAAoC,CAAC,CAAA;YAClE,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACjD,QAAQ,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,MAAM,uCAAuC,CAAC,CAAA;IAC3F,CAAC;IAED,cAAc;IACd,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,kCAAkC,CAAC,CAAA;QACzD,MAAM,IAAI,yBAAyB,CAAC,2BAA2B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACrF,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,oCAAoC,CAAC,CAAA;IAC9D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,EAAoB,EACpB,UAII,EAAE;IAEN,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,EAAE,eAAe,GAAG,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,CAAC,EAAE,GAAG,OAAO,CAAA;IAE3J,IAAI,SAA4B,CAAA;IAEhC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAA;QACnB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,SAAS,GAAG,KAAK,CAAA;YACjB,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;YACvD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;YAEnF,IAAI,OAAO,GAAG,UAAU,IAAI,WAAW,EAAE,CAAC;gBACxC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,gDAAgD,CAAC,CAAA;gBAC9H,MAAM,KAAK,CAAC,UAAU,CAAC,CAAA;YACzB,CAAC;iBAAM,CAAC;gBACN,MAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAU,CAAA;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAAC,OAAe;IAClD,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAEpD,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;YAC1B,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,wBAAwB,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,4BAA4B,CAAC,CAAA;QACzE,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;gBACtC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,mBAAmB,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,wBAAwB,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,OAAe,EAAE,cAAsB,EAAE,cAAsB;IACnG,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IACxD,IAAI,aAAa,KAAK,cAAc,EAAE,CAAC;QACrC,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAA;QAC7C,MAAM,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC,CAAA;QAC7C,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,6CAA6C,CAAC,CAAA;IACvG,CAAC;IACD,OAAO,cAAc,CAAA;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAA;IAC5C,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,YAAY,GAAG,KAAK,EAAE,kBAAkB,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAEnJ,MAAM,WAAW,GAA2B;QAC1C,GAAG,CAAC,oBAAoB,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAA;IACD,IAAI,kBAAkB,EAAE,CAAC;QACvB,WAAW,CAAC,2BAA2B,GAAG,MAAM,CAAA;IAClD,CAAC;IAED,IAAI,MAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC3C,MAAM,IAAI,yBAAyB,CAAC,yCAAyC,OAAO,CAAC,QAAQ,4CAA4C,CAAC,CAAA;IAC5I,CAAC;IACD,IAAI,kBAAkB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACvD,MAAM,IAAI,yBAAyB,CACjC,6FAA6F,OAAO,CAAC,QAAQ,4CAA4C,CAC1J,CAAA;IACH,CAAC;IAED,sFAAsF;IACtF,uBAAuB,CAAC,eAAe,CAAC,CAAA;IAExC,IAAI,CAAC;QACH,MAAM,4BAA4B,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC;IAAC,OAAO,eAAoB,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,EAAE,EAAE,mEAAmE,CAAC,CAAA;IACnH,CAAC;IAED,MAAM,wBAAwB,EAAE,CAAA;IAEhC,iFAAiF;IACjF,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;IACzF,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAEhC,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;QACzB,0FAA0F;QAC1F,kDAAkD;QAClD,MAAM,OAAO,GAAG,MAAM,+BAA+B,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;QAClG,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAClC,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAChD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,yBAAyB,CAAC,0DAA0D,aAAa,EAAE,CAAC,CAAA;IAChH,CAAC;IACD,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,oCAAoC,CAAC,CAAA;IAE1G,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,IAAI,CAAC,kBAAkB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC7G,MAAM,IAAI,yBAAyB,CACjC,2CAA2C,OAAO,CAAC,QAAQ,0GAA0G,CACtK,CAAA;IACH,CAAC;IAED,+EAA+E;IAC/E,IAAI,CAAC;QACH,OAAO,MAAM,gBAAgB,CAC3B,GAAG,EAAE,CACH,qBAAqB,CAAC;YACpB,OAAO,EAAE,QAAQ;YACjB,WAAW;YACX,UAAU,EAAE,YAAY;YACxB,MAAM;YACN,YAAY;YACZ,kBAAkB;YAClB,WAAW,EAAE,WAAW;SACzB,CAAC,EACJ,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAChE,CAAA;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,CAAA;QACxD,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,YAAiB,EAAE,EAAE;YAChE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE,EAAE,mCAAmC,CAAC,CAAA;QAChF,CAAC,CAAC,CAAA;QACF,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,wBAAwB;IACrC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC,CAAA;QACzD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,iBAAiB,CAAC,CAAA;IACzD,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,4BAA4B,CAAC,CAAA;QAEjE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QACjC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,qDAAqD,CAAC,CAAA;QACxE,CAAC;aAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,gDAAgD,CAAC,CAAA;YACjE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,qFAAqF,CAAC,CAAA;QACxG,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,gDAAgD,CAAC,CAAA;YACjE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,mDAAmD,CAAC,CAAA;QACtE,CAAC;QAED,MAAM,IAAI,yBAAyB,CAAC,4DAA4D,CAAC,CAAA;IACnG,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,+BAA+B,CAAC,OAA2B,EAAE,YAAgC;IAC1G,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,0CAA0C,CAAC,CAAA;IAE3D,+FAA+F;IAC/F,sFAAsF;IACtF,iGAAiG;IACjG,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IACnE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,yGAAyG;IACzG,MAAM,2BAA2B,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,EAAE,CAAA;IACnF,IAAI,CAAC,eAAe,CAAC,2BAA2B,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,8DAA8D,CAAC,CAAA;QAC/E,OAAO,EAAE,2BAA2B,EAAE,CAAA;IACxC,CAAC;IAED,oCAAoC;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC,CAAA;QACtD,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,sCAAsC,CAAC,CAAA;YAC7E,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IAED,MAAM,IAAI,yBAAyB,CACjC,uDAAuD;QACrD,iCAAiC;QACjC,0BAA0B;QAC1B,mDAAmD;QACnD,6BAA6B;QAC7B,oEAAoE,CACvE,CAAA;AACH,CAAC;AAYD;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAAC,OAAgC;IACnE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;IAC3H,IAAI,YAAY,GAAsB,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,WAAW,EAAE,CAAA;IAE/F,8EAA8E;IAC9E,2EAA2E;IAC3E,MAAM,OAAO,GAAG,WAAW,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAA;IAEhE,IAAI,kBAAkB,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;QAChD,OAAO,MAAM,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,CAAC,CAAA;IAClF,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAA;IAC3B,MAAM,IAAI,GAAa,EAAE,CAAA;IAEzB,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;QACzB,MAAM,eAAe,GAAG,uBAAuB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACrE,sDAAsD;QACtD,IAAI,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;QAClC,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,eAAe,CAAC,WAAW,EAAE,CAAA;IACpE,CAAC;SAAM,CAAC;QACN,kFAAkF;QAClF,8EAA8E;QAC9E,2EAA2E;QAC3E,oDAAoD;QACpD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACjB,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACtB,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAA;QACxC,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,YAAY,CAAC,2BAA2B,GAAG,WAAW,CAAA;YACtD,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,6DAA6D,CAAC,CAAA;QAChF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACxB,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAA;IAEnE,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QACzB,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,YAAY;KAClB,CAAC,CAAA;IAEF,IAAI,WAAW,EAAE,OAAO,IAAI,MAAM,IAAI,YAAY,EAAE,CAAC;QACnD,8EAA8E;QAC9E,oGAAoG;QACpG,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;QACtD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8CAA8C,OAAO,EAAE,CAAC,CAAA;QAC1E,CAAC;QACD,OAAO,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAA;IACnE,CAAC;IAED,OAAO,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,CAAA;AACjE,CAAC;AAED,SAAS,uBAAuB,CAAC,WAA+B,EAAE,OAAe;IAC/E,MAAM,WAAW,GAA2B,EAAE,CAAA;IAC9C,MAAM,IAAI,GAAa,CAAC,cAAc,CAAC,CAAA;IAEvC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAA;IAEjD,oCAAoC;IACpC,IAAI,WAAW,CAAC,iBAAiB,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAA;IACpD,CAAC;IAED,IAAI,WAAW,CAAC,kBAAkB,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;IAC/C,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,8GAA8G,CAAC,CAAA;IAChI,CAAC;IAED,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,cAAc,CAAC,CAAA;QAClD,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,cAAc,EAAE,EAAE,iCAAiC,CAAC,CAAA;IACvF,CAAC;IAED,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;QAC9C,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,2BAA2B,CAAC,CAAA;IACxE,CAAC;IAED,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACtB,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAA;IAC9C,CAAC;IAED,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;QACzB,WAAW,CAAC,+BAA+B,GAAG,WAAW,CAAC,QAAQ,CAAA;IACpE,CAAC;IAED,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;QACnD,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAA;IAC/E,CAAC;IAED,yDAAyD;IACzD,0EAA0E;IAC1E,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;IAElC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;AAC9B,CAAC;AAED,4EAA4E;AAC5E,yEAAyE;AACzE,6DAA6D;AAC7D,0EAA0E;AAC1E,8CAA8C;AAC9C,EAAE;AACF,qCAAqC;AACrC,4EAA4E;AAC5E,uDAAuD;AACvD,6EAA6E;AAC7E,4EAA4E;AAC5E,KAAK,UAAU,mBAAmB,CAAC,OAAe,EAAE,YAA+B,EAAE,OAAe,EAAE,cAAsB;IAC1H,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;IACjD,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;QACvB,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC7B,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAA;IAClH,MAAM,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE;QAClC,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,YAAY;KAClB,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC5C,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IACjE,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;QACvB,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACrC,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,gCAAgC,CAAC,CAAA;IACnI,MAAM,KAAK,CAAC,WAAW,EAAE,iBAAiB,EAAE;QAC1C,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,YAAY;KAClB,CAAC,CAAA;IAEF,OAAO,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,CAAA;AACjE,CAAC","sourcesContent":["import { InvalidConfigurationError, isEmptyOrSpaces, log, spawn, stripSensitiveEnvVars } from \"builder-util\"\nimport * as childProcess from \"child_process\"\nimport { randomUUID } from \"crypto\"\nimport { resolveSnapCredentials } from \"electron-publish\"\n\nimport * as path from \"path\"\nimport * as util from \"util\"\nimport { LinuxPackager } from \"../../../linuxPackager.js\"\nimport { RemoteBuildOptions } from \"../../../options/SnapOptions.js\"\nimport { SnapcraftYAML } from \"./snapcraft.js\"\nimport { deepAssign, sleep } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nconst { copyFile, ensureDir, pathExists, readdir, remove } = _fsExtra\n\nconst execAsync = util.promisify(childProcess.exec)\n\nexport const SNAPCRAFT_YAML_OPTIONS = { indent: 2, lineWidth: -1, noRefs: true } as const\nexport const DEFAULT_STAGE_PACKAGES: string[] = [\"libnspr4\", \"libnss3\", \"libxss1\", \"libappindicator3-1\", \"libsecret-1-0\"]\n\ninterface BuildSnapOptions {\n /** The snapcraft YAML configuration */\n snapcraftConfig: SnapcraftYAML\n /** Working directory where snapcraft.yaml is written and the build executes */\n stageDir: string\n /** Whether to use remote build (builds on Launchpad) */\n remoteBuild?: RemoteBuildOptions\n /** Whether to use LXD for local builds */\n useLXD?: boolean\n /** Whether to use Multipass for local builds */\n useMultipass?: boolean\n /** Whether to use destructive mode (builds directly on host, Linux only) */\n useDestructiveMode?: boolean\n /** The snap output path */\n artifactPath: string\n /** LinuxPackager instance, used to resolve workspace dir for remote build authentication */\n packager: LinuxPackager\n /** Snap Store credentials from SnapcraftOptions root — base64 string or file path */\n cscLink?: string\n}\n\n/**\n * Validates snapcraft.yaml using snapcraft's built-in `expand-extensions` command.\n * Throws on failure. The caller in `buildSnap` catches this and treats it as a non-fatal warning.\n */\nasync function validateSnapcraftYamlWithCLI(workDir: string): Promise<void> {\n try {\n const { stdout } = await execAsync(\"snapcraft expand-extensions\", {\n cwd: workDir,\n timeout: 30000,\n })\n log.debug({ expandedYaml: stdout }, \"validated extended snapcraft.yaml\")\n } catch (error: any) {\n log.error({ error: error.message, stderr: error.stderr }, \"snapcraft.yaml validation failed\")\n throw new Error(\n `Invalid snapcraft.yaml: ${error.message}\\n` +\n `Snapcraft output: ${error.stderr || error.stdout || \"No output\"}\\n` +\n `Run 'snapcraft expand-extensions' in ${workDir} for more details`\n )\n }\n}\n\n/**\n * Validates snapcraft.yaml configuration with basic client-side checks\n * This is a fast pre-check before running the full CLI validation\n */\nfunction validateSnapcraftConfig(config: SnapcraftYAML): void {\n const errors: string[] = []\n const warnings: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push(\"name is required\")\n }\n if (!config.base) {\n errors.push(\"base is required\")\n }\n if (!config.confinement) {\n errors.push(\"confinement is required\")\n }\n if (!config.parts || Object.keys(config.parts).length === 0) {\n errors.push(\"at least one part is required\")\n }\n\n // Name validation\n if (config.name) {\n if (!/^[a-z0-9-]*$/.test(config.name)) {\n errors.push(\"name must only contain lowercase letters, numbers, and hyphens\")\n }\n if (config.name.length > 40) {\n errors.push(\"name must be 40 characters or less\")\n }\n if (config.name.startsWith(\"-\") || config.name.endsWith(\"-\")) {\n errors.push(\"name cannot start or end with a hyphen\")\n }\n }\n\n // Parts validation\n Object.entries(config.parts).forEach(([partName, part]) => {\n if (!part.plugin) {\n errors.push(`part '${partName}' missing required 'plugin' field`)\n }\n })\n\n // Apps validation\n if (config.apps) {\n Object.entries(config.apps).forEach(([appName, app]) => {\n if (!app.command) {\n errors.push(`app '${appName}' missing required 'command' field`)\n }\n })\n }\n\n // Summary validation\n if (config.summary && config.summary.length > 78) {\n warnings.push(`summary is ${config.summary.length} characters (recommended: 78 or less)`)\n }\n\n // Log results\n if (errors.length > 0) {\n log.error({ errors }, \"snapcraft.yaml validation failed\")\n throw new InvalidConfigurationError(`Invalid snapcraft.yaml: ${errors.join(\", \")}`)\n }\n\n if (warnings.length > 0) {\n log.warn({ warnings }, \"snapcraft.yaml validation warnings\")\n }\n}\n\n/**\n * Retry wrapper for operations that may fail transiently\n */\nasync function executeWithRetry<T>(\n fn: () => Promise<T>,\n options: {\n maxRetries?: number\n retryDelay?: number\n retryableErrors?: string[]\n } = {}\n): Promise<T> {\n const { maxRetries = 3, retryDelay = 5000, retryableErrors = [\"network timeout\", \"connection refused\", \"temporary failure\", \"snap store error\"] } = options\n\n let lastError: Error | undefined\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await fn()\n } catch (error: any) {\n lastError = error\n const errorMessage = error.message?.toLowerCase() || \"\"\n const isRetryable = retryableErrors.some(pattern => errorMessage.includes(pattern))\n\n if (attempt < maxRetries && isRetryable) {\n log.warn({ attempt, maxRetries, error: error.message, retryIn: retryDelay }, \"build failed with retryable error, retrying...\")\n await sleep(retryDelay)\n } else {\n break\n }\n }\n }\n\n throw lastError!\n}\n\n/**\n * Cleans up build artifacts\n */\nasync function cleanupBuildArtifacts(workDir: string): Promise<void> {\n const artifactsToClean = [\"parts\", \"stage\", \"prime\"]\n\n for (const artifact of artifactsToClean) {\n const artifactPath = path.join(workDir, artifact)\n try {\n await remove(artifactPath)\n log.debug({ artifact }, \"cleaned build artifact\")\n } catch (e: any) {\n log.debug({ artifact, error: e.message }, \"no build artifact to clean\")\n }\n }\n\n try {\n const files = await readdir(workDir)\n for (const file of files) {\n if (file.endsWith(\".snap\")) {\n await remove(path.join(workDir, file))\n log.debug({ file }, \"cleaned snap file\")\n }\n }\n } catch (e: any) {\n log.debug({ error: e.message }, \"no snap files to clean\")\n }\n}\n\nasync function copySnapToArtifactPath(workDir: string, outputBasename: string, outputFileName: string): Promise<string> {\n const snapInWorkDir = path.join(workDir, outputBasename)\n if (snapInWorkDir !== outputFileName) {\n await ensureDir(path.dirname(outputFileName))\n await copyFile(snapInWorkDir, outputFileName)\n log.debug({ from: snapInWorkDir, to: outputFileName }, \"copied snap from build dir to artifact path\")\n }\n return outputFileName\n}\n\n/**\n * Builds a snap package from SnapcraftYAML configuration.\n *\n * `SNAPCRAFT_NO_NETWORK` is intentionally **not** forced to `\"1\"` here.\n * All build modes (destructive-mode, LXD, Multipass, remote) require network\n * access to download stage-packages, the base image, and extensions.\n * To opt into an offline build, set `SNAPCRAFT_NO_NETWORK=1` in your environment.\n */\nexport async function buildSnap(options: BuildSnapOptions): Promise<string> {\n const { SNAPCRAFT_NO_NETWORK } = process.env\n const { snapcraftConfig, artifactPath, remoteBuild, stageDir, useLXD = false, useMultipass = false, useDestructiveMode = false, cscLink } = options\n\n const isolatedEnv: Record<string, string> = {\n ...(SNAPCRAFT_NO_NETWORK != null ? { SNAPCRAFT_NO_NETWORK } : {}),\n }\n if (useDestructiveMode) {\n isolatedEnv.SNAPCRAFT_BUILD_ENVIRONMENT = \"host\"\n }\n\n if (useLXD && process.platform !== \"linux\") {\n throw new InvalidConfigurationError(`useLXD is only supported on Linux. On ${process.platform}, use useMultipass or remoteBuild instead.`)\n }\n if (useDestructiveMode && process.platform !== \"linux\") {\n throw new InvalidConfigurationError(\n `useDestructiveMode is only supported on Linux (requires Ubuntu 24.04 host for core24). On ${process.platform}, use useMultipass or remoteBuild instead.`\n )\n }\n\n // Config validation — throws InvalidConfigurationError, no build artifacts exist yet.\n validateSnapcraftConfig(snapcraftConfig)\n\n try {\n await validateSnapcraftYamlWithCLI(stageDir)\n } catch (validationError: any) {\n log.warn({ error: validationError.message }, \"snapcraft CLI pre-validation failed (non-fatal), continuing build\")\n }\n\n await ensureSnapcraftInstalled()\n\n // Inject credentials for all build modes from snapcraft.cscLink / SNAP_CSC_LINK.\n const credEnv = await resolveSnapCredentials(cscLink, options.packager.buildResourcesDir)\n deepAssign(isolatedEnv, credEnv)\n\n if (remoteBuild?.enabled) {\n // Remote-build auth does additional checks (interactive session, throws on missing creds)\n // and overrides any credential already set above.\n const authEnv = await ensureRemoteBuildAuthentication(cscLink, options.packager.buildResourcesDir)\n deepAssign(isolatedEnv, authEnv)\n }\n\n const projectAppDir = path.join(stageDir, \"app\")\n if (!(await pathExists(projectAppDir))) {\n throw new InvalidConfigurationError(`snap build failed: expected app directory not found at ${projectAppDir}`)\n }\n log.debug({ appFiles: (await readdir(projectAppDir)).slice(0, 20) }, \"app directory contents (truncated)\")\n\n if (!remoteBuild?.enabled && !useLXD && !useMultipass && !useDestructiveMode && process.platform !== \"linux\") {\n throw new InvalidConfigurationError(\n `No snap build environment specified for ${process.platform}. Set one of: useMultipass, useLXD (Linux only), useDestructiveMode (Linux only), or remoteBuild.enabled`\n )\n }\n\n // Actual build — only this step can leave partial artifacts that need cleanup.\n try {\n return await executeWithRetry(\n () =>\n executeSnapcraftBuild({\n workDir: stageDir,\n remoteBuild,\n outputSnap: artifactPath,\n useLXD,\n useMultipass,\n useDestructiveMode,\n isolatedEnv: isolatedEnv,\n }),\n { maxRetries: remoteBuild?.enabled ? 3 : 1, retryDelay: 10000 }\n )\n } catch (error: any) {\n log.error({ error: error.message }, \"snap build failed\")\n await cleanupBuildArtifacts(stageDir).catch((cleanupError: any) => {\n log.warn({ error: cleanupError.message }, \"failed to cleanup build artifacts\")\n })\n throw error\n }\n}\n\n/**\n * Ensures snapcraft is installed on the system\n */\nasync function ensureSnapcraftInstalled(): Promise<void> {\n try {\n const { stdout } = await execAsync(\"snapcraft --version\")\n log.info({ version: stdout.trim() }, \"snapcraft found\")\n } catch (error: any) {\n log.error({ error: error.message }, \"snapcraft is not installed\")\n\n const platform = process.platform\n if (platform === \"linux\") {\n log.error(null, \"Install with: sudo snap install snapcraft --classic\")\n } else if (platform === \"darwin\") {\n log.error(null, \"Install snapcraft with: pip3 install snapcraft\")\n log.error(null, \"On macOS, useMultipass or remoteBuild are the only supported build modes for core24\")\n } else if (platform === \"win32\") {\n log.error(null, \"Install snapcraft via WSL2 or use remote-build\")\n log.error(null, \"See: https://snapcraft.io/docs/snapcraft-overview\")\n }\n\n throw new InvalidConfigurationError(\"snapcraft not found - please install snapcraft to continue\")\n }\n}\n\n/**\n * Resolves Snapcraft Store authentication for remote builds and returns the credential\n * env entries to inject. Returns an empty map when snapcraft can authenticate itself\n * (interactive session). Throws when no credential source is found.\n */\nasync function ensureRemoteBuildAuthentication(cscLink: string | undefined, resourcesDir: string | undefined): Promise<Record<string, string>> {\n log.debug(null, \"resolving remote build authentication...\")\n\n // 1. snapcraft.cscLink / SNAP_CSC_LINK — config-level or env credential (base64 or file path).\n // resolveSnapCredentials already ran for all build modes; re-run here so remote-build\n // gets the same result and the interactive-session fallback is only reached when neither is set.\n const credEnv = await resolveSnapCredentials(cscLink, resourcesDir)\n if (Object.keys(credEnv).length > 0) {\n return credEnv\n }\n\n // 2. SNAPCRAFT_STORE_CREDENTIALS env var — directly provide the credentials string (not base64-encoded).\n const SNAPCRAFT_STORE_CREDENTIALS = process.env.SNAPCRAFT_STORE_CREDENTIALS?.trim()\n if (!isEmptyOrSpaces(SNAPCRAFT_STORE_CREDENTIALS)) {\n log.debug(null, \"using SNAPCRAFT_STORE_CREDENTIALS from environment, verbatim\")\n return { SNAPCRAFT_STORE_CREDENTIALS }\n }\n\n // 3. Interactive snapcraft session.\n try {\n const { stdout } = await execAsync(\"snapcraft whoami\")\n if (stdout.includes(\"email:\")) {\n log.debug({ account: stdout.trim() }, \"already authenticated with snapcraft\")\n return {}\n }\n } catch {\n // Not logged in, fall through to error.\n }\n\n throw new InvalidConfigurationError(\n \"Snapcraft authentication required for remote build.\\n\" +\n \"Authenticate with one of any:\\n\" +\n \" 1. Set SNAP_CSC_LINK\\n\" +\n \" 2. Set snapcraft.cscLink in your build config\\n\" +\n \" 3. Run: snapcraft login\\n\" +\n \" 4. Set SNAPCRAFT_STORE_CREDENTIALS environment variable directly\"\n )\n}\n\ninterface ExecuteSnapcraftOptions {\n workDir: string\n outputSnap: string\n remoteBuild?: RemoteBuildOptions\n useLXD: boolean\n useMultipass: boolean\n useDestructiveMode: boolean\n isolatedEnv: Record<string, string>\n}\n\n/**\n * Executes the snapcraft build command\n */\nasync function executeSnapcraftBuild(options: ExecuteSnapcraftOptions): Promise<string> {\n const { workDir, outputSnap: outputFileName, remoteBuild, useLXD, useMultipass, useDestructiveMode, isolatedEnv } = options\n let processedEnv: NodeJS.ProcessEnv = { ...stripSensitiveEnvVars(process.env), ...isolatedEnv }\n\n // Use a UUID-based temp name as the --output target so the copy below doesn't\n // depend on snapcraft's naming convention (which always uses underscores).\n const tmpSnap = `eb-snap-${randomUUID().replace(/-/g, \"\")}.snap`\n\n if (useDestructiveMode && !remoteBuild?.enabled) {\n return await runDestructiveBuild(workDir, processedEnv, tmpSnap, outputFileName)\n }\n\n const command = \"snapcraft\"\n const args: string[] = []\n\n if (remoteBuild?.enabled) {\n const remoteBuildArgs = generateRemoteBuildArgs(remoteBuild, workDir)\n // Remote build on Launchpad (works from any platform)\n args.push(...remoteBuildArgs.args)\n processedEnv = { ...processedEnv, ...remoteBuildArgs.isolatedEnv }\n } else {\n // `snapcraft pack` runs the full lifecycle (pull → build → stage → prime → pack).\n // snapcraft 8.x removed --use-multipass entirely; Multipass is now configured\n // via the SNAPCRAFT_BUILD_ENVIRONMENT env var (or auto-selected on macOS).\n // --use-lxd remains a supported CLI flag on `pack`.\n args.push(\"pack\")\n if (useLXD) {\n args.push(\"--use-lxd\")\n log.debug(null, \"using LXD for build\")\n } else if (useMultipass) {\n processedEnv.SNAPCRAFT_BUILD_ENVIRONMENT = \"multipass\"\n log.debug(null, \"using Multipass for build (via SNAPCRAFT_BUILD_ENVIRONMENT)\")\n } else {\n args.push(\"--output\", tmpSnap)\n }\n }\n\n if (log.isDebugEnabled) {\n args.push(\"--verbose\")\n }\n\n log.info({ workDir: log.filePath(workDir) }, \"executing snapcraft\")\n\n await spawn(command, args, {\n cwd: workDir,\n env: processedEnv,\n })\n\n if (remoteBuild?.enabled || useLXD || useMultipass) {\n // snapcraft names the output snap itself (e.g. <name>_<version>_<arch>.snap).\n // Each electron-builder build invocation targets exactly one arch, so exactly one snap is expected.\n const files = await readdir(workDir)\n const builtSnap = files.find(f => f.endsWith(\".snap\"))\n if (!builtSnap) {\n throw new Error(`Build succeeded but no .snap file found in ${workDir}`)\n }\n return copySnapToArtifactPath(workDir, builtSnap, outputFileName)\n }\n\n return copySnapToArtifactPath(workDir, tmpSnap, outputFileName)\n}\n\nfunction generateRemoteBuildArgs(remoteBuild: RemoteBuildOptions, workDir: string) {\n const isolatedEnv: Record<string, string> = {}\n const args: string[] = [\"remote-build\"]\n\n log.debug(null, \"using remote-build (Launchpad)\")\n\n // Add remote build specific options\n if (remoteBuild.launchpadUsername) {\n args.push(\"--user\", remoteBuild.launchpadUsername)\n }\n\n if (remoteBuild.acceptPublicUpload) {\n args.push(\"--launchpad-accept-public-upload\")\n } else {\n log.warn(null, \"your project will be publicly uploaded to Launchpad. Use `acceptPublicUpload: true` to suppress this warning\")\n }\n\n if (remoteBuild.privateProject) {\n args.push(\"--project\", remoteBuild.privateProject)\n log.debug({ project: remoteBuild.privateProject }, \"using private Launchpad project\")\n }\n\n if (remoteBuild.buildFor) {\n args.push(\"--build-for\", remoteBuild.buildFor)\n log.debug({ arch: remoteBuild.buildFor }, \"building for architecture\")\n }\n\n if (remoteBuild.recover) {\n args.push(\"--recover\")\n log.debug(null, \"recovering previous build\")\n }\n\n if (remoteBuild.strategy) {\n isolatedEnv.SNAPCRAFT_REMOTE_BUILD_STRATEGY = remoteBuild.strategy\n }\n\n if (remoteBuild.timeout) {\n args.push(\"--timeout\", String(remoteBuild.timeout))\n log.debug({ timeout: `${remoteBuild.timeout}s` }, \"build timeout configured\")\n }\n\n // Remote-build downloads the finished snap into workDir.\n // --output-dir (not --output <file>) lets snapcraft name the file itself.\n args.push(\"--output-dir\", workDir)\n\n return { args, isolatedEnv }\n}\n\n// Snapcraft 8 (craft-application) hangs after a successful destructive-mode\n// build in containerised environments (Docker/CI without snapd running).\n// craft-application's PackageService teardown tries to reach\n// /run/snapd-snap.socket (snapctl IPC) which doesn't exist without a live\n// snapd daemon — causing an indefinite block.\n//\n// Work-around: split into two steps:\n// 1. `snapcraft prime --destructive-mode` — runs pull/build/stage/prime,\n// exits cleanly (no post-pack teardown executed).\n// 2. `snapcraft pack <primeDir>` — packs the pre-primed directory without\n// running the full build lifecycle, avoiding the problematic teardown.\nasync function runDestructiveBuild(workDir: string, processedEnv: NodeJS.ProcessEnv, tmpSnap: string, outputFileName: string) {\n const primeArgs = [\"prime\", \"--destructive-mode\"]\n if (log.isDebugEnabled) {\n primeArgs.push(\"--verbose\")\n }\n log.info({ command: `snapcraft ${primeArgs.join(\" \")}`, workDir: log.filePath(workDir) }, \"snapcraft prime (1/2)\")\n await spawn(\"snapcraft\", primeArgs, {\n cwd: workDir,\n env: processedEnv,\n })\n\n const primeDir = path.join(workDir, \"prime\")\n const snapcraftPackArgs = [\"pack\", \"--output\", tmpSnap, primeDir]\n if (log.isDebugEnabled) {\n snapcraftPackArgs.push(\"--verbose\")\n }\n log.info({ command: `snapcraft ${snapcraftPackArgs.join(\" \")}`, workDir: log.filePath(workDir) }, \"snapcraft pack prime dir (2/2)\")\n await spawn(\"snapcraft\", snapcraftPackArgs, {\n cwd: workDir,\n env: processedEnv,\n })\n\n return copySnapToArtifactPath(workDir, tmpSnap, outputFileName)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"snapcraftBuilder.js","sourceRoot":"","sources":["../../../../src/targets/linux/snap/snapcraftBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, exec, InvalidConfigurationError, isEmptyOrSpaces, log, spawn, stripSensitiveEnvVars } from \"builder-util\"\nimport { randomUUID } from \"crypto\"\nimport { resolveSnapCredentials } from \"electron-publish\"\n\nimport * as path from \"path\"\nimport { LinuxPackager } from \"../../../linuxPackager.js\"\nimport { RemoteBuildOptions } from \"../../../options/SnapOptions.js\"\nimport { SnapcraftYAML } from \"./snapcraft.js\"\nimport { deepAssign, sleep } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nconst { copyFile, ensureDir, pathExists, readdir, remove } = _fsExtra\n\nexport const SNAPCRAFT_YAML_OPTIONS = { indent: 2, lineWidth: -1, noRefs: true } as const\nexport const DEFAULT_STAGE_PACKAGES: string[] = [\"libnspr4\", \"libnss3\", \"libxss1\", \"libappindicator3-1\", \"libsecret-1-0\"]\n\ninterface BuildSnapOptions {\n /** The snapcraft YAML configuration */\n snapcraftConfig: SnapcraftYAML\n /** Working directory where snapcraft.yaml is written and the build executes */\n stageDir: string\n /** Whether to use remote build (builds on Launchpad) */\n remoteBuild?: RemoteBuildOptions\n /** Whether to use LXD for local builds */\n useLXD?: boolean\n /** Whether to use Multipass for local builds */\n useMultipass?: boolean\n /** Whether to use destructive mode (builds directly on host, Linux only) */\n useDestructiveMode?: boolean\n /** The snap output path */\n artifactPath: string\n /** LinuxPackager instance, used to resolve workspace dir for remote build authentication */\n packager: LinuxPackager\n /** Snap Store credentials from SnapcraftOptions root — base64 string or file path */\n cscLink?: string\n}\n\n/**\n * Validates snapcraft.yaml using snapcraft's built-in `expand-extensions` command.\n * Throws on failure. The caller in `buildSnap` catches this and treats it as a non-fatal warning.\n */\nasync function validateSnapcraftYamlWithCLI(workDir: string): Promise<void> {\n try {\n const stdout = await exec(\"snapcraft\", [\"expand-extensions\"], {\n cwd: workDir,\n timeout: 30000,\n })\n log.debug({ expandedYaml: stdout }, \"validated extended snapcraft.yaml\")\n } catch (error: any) {\n // builder-util's exec folds stdout/stderr into the ExecError message\n log.error({ error: error.message }, \"snapcraft.yaml validation failed\")\n throw new Error(`Invalid snapcraft.yaml: ${error.message}\\n` + `Run 'snapcraft expand-extensions' in ${workDir} for more details`)\n }\n}\n\n/**\n * Validates snapcraft.yaml configuration with basic client-side checks\n * This is a fast pre-check before running the full CLI validation\n */\nfunction validateSnapcraftConfig(config: SnapcraftYAML): void {\n const errors: string[] = []\n const warnings: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push(\"name is required\")\n }\n if (!config.base) {\n errors.push(\"base is required\")\n }\n if (!config.confinement) {\n errors.push(\"confinement is required\")\n }\n if (!config.parts || Object.keys(config.parts).length === 0) {\n errors.push(\"at least one part is required\")\n }\n\n // Name validation\n if (config.name) {\n if (!/^[a-z0-9-]*$/.test(config.name)) {\n errors.push(\"name must only contain lowercase letters, numbers, and hyphens\")\n }\n if (config.name.length > 40) {\n errors.push(\"name must be 40 characters or less\")\n }\n if (config.name.startsWith(\"-\") || config.name.endsWith(\"-\")) {\n errors.push(\"name cannot start or end with a hyphen\")\n }\n }\n\n // Parts validation\n Object.entries(config.parts).forEach(([partName, part]) => {\n if (!part.plugin) {\n errors.push(`part '${partName}' missing required 'plugin' field`)\n }\n })\n\n // Apps validation\n if (config.apps) {\n Object.entries(config.apps).forEach(([appName, app]) => {\n if (!app.command) {\n errors.push(`app '${appName}' missing required 'command' field`)\n }\n })\n }\n\n // Summary validation\n if (config.summary && config.summary.length > 78) {\n warnings.push(`summary is ${config.summary.length} characters (recommended: 78 or less)`)\n }\n\n // Log results\n if (errors.length > 0) {\n log.error({ errors }, \"snapcraft.yaml validation failed\")\n throw new InvalidConfigurationError(`Invalid snapcraft.yaml: ${errors.join(\", \")}`)\n }\n\n if (warnings.length > 0) {\n log.warn({ warnings }, \"snapcraft.yaml validation warnings\")\n }\n}\n\n/**\n * Retry wrapper for operations that may fail transiently\n */\nasync function executeWithRetry<T>(\n fn: () => Promise<T>,\n options: {\n maxRetries?: number\n retryDelay?: number\n retryableErrors?: string[]\n } = {}\n): Promise<T> {\n const { maxRetries = 3, retryDelay = 5000, retryableErrors = [\"network timeout\", \"connection refused\", \"temporary failure\", \"snap store error\"] } = options\n\n let lastError: Error | undefined\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await fn()\n } catch (error: any) {\n lastError = error\n const errorMessage = error.message?.toLowerCase() || \"\"\n const isRetryable = retryableErrors.some(pattern => errorMessage.includes(pattern))\n\n if (attempt < maxRetries && isRetryable) {\n log.warn({ attempt, maxRetries, error: error.message, retryIn: retryDelay }, \"build failed with retryable error, retrying...\")\n await sleep(retryDelay)\n } else {\n break\n }\n }\n }\n\n throw lastError!\n}\n\n/**\n * Cleans up build artifacts\n */\nasync function cleanupBuildArtifacts(workDir: string): Promise<void> {\n const artifactsToClean = [\"parts\", \"stage\", \"prime\"]\n\n for (const artifact of artifactsToClean) {\n const artifactPath = path.join(workDir, artifact)\n try {\n await remove(artifactPath)\n log.debug({ artifact }, \"cleaned build artifact\")\n } catch (e: any) {\n log.debug({ artifact, error: e.message }, \"no build artifact to clean\")\n }\n }\n\n try {\n const files = await readdir(workDir)\n for (const file of files) {\n if (file.endsWith(\".snap\")) {\n await remove(path.join(workDir, file))\n log.debug({ file }, \"cleaned snap file\")\n }\n }\n } catch (e: any) {\n log.debug({ error: e.message }, \"no snap files to clean\")\n }\n}\n\n/**\n * Maps a snapcraft arch string (as found in snap filenames) back to an electron-builder Arch.\n * Used to assign the correct Arch value to extra artifacts from multi-arch remote-builds.\n */\nexport function snapArchStringToArch(snapArch: string): Arch {\n switch (snapArch) {\n case \"amd64\":\n return Arch.x64\n case \"arm64\":\n return Arch.arm64\n case \"armhf\":\n return Arch.armv7l\n case \"i386\":\n case \"i686\":\n return Arch.ia32\n default:\n log.warn({ snapArch }, \"unrecognised snap arch in output filename, defaulting to x64\")\n return Arch.x64\n }\n}\n\nasync function copySnapToArtifactPath(workDir: string, outputBasename: string, outputFileName: string): Promise<string> {\n const snapInWorkDir = path.join(workDir, outputBasename)\n if (snapInWorkDir !== outputFileName) {\n await ensureDir(path.dirname(outputFileName))\n await copyFile(snapInWorkDir, outputFileName)\n log.debug({ from: snapInWorkDir, to: outputFileName }, \"copied snap from build dir to artifact path\")\n }\n return outputFileName\n}\n\n/**\n * Builds a snap package from SnapcraftYAML configuration.\n *\n * `SNAPCRAFT_NO_NETWORK` is intentionally **not** forced to `\"1\"` here.\n * All build modes (destructive-mode, LXD, Multipass, remote) require network\n * access to download stage-packages, the base image, and extensions.\n * To opt into an offline build, set `SNAPCRAFT_NO_NETWORK=1` in your environment.\n */\nexport async function buildSnap(options: BuildSnapOptions): Promise<string[]> {\n const { SNAPCRAFT_NO_NETWORK } = process.env\n const { snapcraftConfig, artifactPath, remoteBuild, stageDir, useLXD = false, useMultipass = false, useDestructiveMode = false, cscLink } = options\n\n const isolatedEnv: Record<string, string> = {\n ...(SNAPCRAFT_NO_NETWORK != null ? { SNAPCRAFT_NO_NETWORK } : {}),\n }\n if (useDestructiveMode) {\n isolatedEnv.SNAPCRAFT_BUILD_ENVIRONMENT = \"host\"\n }\n\n if (useLXD && process.platform !== \"linux\") {\n throw new InvalidConfigurationError(`useLXD is only supported on Linux. On ${process.platform}, use useMultipass or remoteBuild instead.`)\n }\n if (useDestructiveMode && process.platform !== \"linux\") {\n throw new InvalidConfigurationError(\n `useDestructiveMode is only supported on Linux (requires Ubuntu 24.04 host for core24). On ${process.platform}, use useMultipass or remoteBuild instead.`\n )\n }\n\n // Config validation — throws InvalidConfigurationError, no build artifacts exist yet.\n validateSnapcraftConfig(snapcraftConfig)\n\n try {\n await validateSnapcraftYamlWithCLI(stageDir)\n } catch (validationError: any) {\n log.warn({ error: validationError.message }, \"snapcraft CLI pre-validation failed (non-fatal), continuing build\")\n }\n\n await ensureSnapcraftInstalled()\n\n // Inject credentials for all build modes from snapcraft.cscLink / SNAP_CSC_LINK.\n const credEnv = await resolveSnapCredentials(cscLink, options.packager.buildResourcesDir)\n deepAssign(isolatedEnv, credEnv)\n\n if (remoteBuild?.enabled) {\n // Remote-build auth does additional checks (interactive session, throws on missing creds)\n // and overrides any credential already set above.\n const authEnv = await ensureRemoteBuildAuthentication(cscLink, options.packager.buildResourcesDir)\n deepAssign(isolatedEnv, authEnv)\n }\n\n const projectAppDir = path.join(stageDir, \"app\")\n if (!(await pathExists(projectAppDir))) {\n throw new InvalidConfigurationError(`snap build failed: expected app directory not found at ${projectAppDir}`)\n }\n log.debug({ appFiles: (await readdir(projectAppDir)).slice(0, 20) }, \"app directory contents (truncated)\")\n\n if (!remoteBuild?.enabled && !useLXD && !useMultipass && !useDestructiveMode && process.platform !== \"linux\") {\n throw new InvalidConfigurationError(\n `No snap build environment specified for ${process.platform}. Set one of: useMultipass, useLXD (Linux only), useDestructiveMode (Linux only), or remoteBuild.enabled`\n )\n }\n\n // Actual build — only this step can leave partial artifacts that need cleanup.\n try {\n return await executeWithRetry(\n () =>\n executeSnapcraftBuild({\n workDir: stageDir,\n remoteBuild,\n outputSnap: artifactPath,\n useLXD,\n useMultipass,\n useDestructiveMode,\n isolatedEnv: isolatedEnv,\n }),\n { maxRetries: remoteBuild?.enabled ? 3 : 1, retryDelay: 10000 }\n )\n } catch (error: any) {\n log.error({ error: error.message }, \"snap build failed\")\n await cleanupBuildArtifacts(stageDir).catch((cleanupError: any) => {\n log.warn({ error: cleanupError.message }, \"failed to cleanup build artifacts\")\n })\n throw error\n }\n}\n\n/**\n * Ensures snapcraft is installed on the system\n */\nasync function ensureSnapcraftInstalled(): Promise<void> {\n try {\n const stdout = await exec(\"snapcraft\", [\"--version\"])\n log.info({ version: stdout.trim() }, \"snapcraft found\")\n } catch (error: any) {\n log.error({ error: error.message }, \"snapcraft is not installed\")\n\n const platform = process.platform\n if (platform === \"linux\") {\n log.error(null, \"Install with: sudo snap install snapcraft --classic\")\n } else if (platform === \"darwin\") {\n log.error(null, \"Install snapcraft with: pip3 install snapcraft\")\n log.error(null, \"On macOS, useMultipass or remoteBuild are the only supported build modes for core24\")\n } else if (platform === \"win32\") {\n log.error(null, \"Install snapcraft via WSL2 or use remote-build\")\n log.error(null, \"See: https://snapcraft.io/docs/snapcraft-overview\")\n }\n\n throw new InvalidConfigurationError(\"snapcraft not found - please install snapcraft to continue\")\n }\n}\n\n/**\n * Resolves Snapcraft Store authentication for remote builds and returns the credential\n * env entries to inject. Returns an empty map when snapcraft can authenticate itself\n * (interactive session). Throws when no credential source is found.\n */\nasync function ensureRemoteBuildAuthentication(cscLink: string | undefined, resourcesDir: string | undefined): Promise<Record<string, string>> {\n log.debug(null, \"resolving remote build authentication...\")\n\n // 1. snapcraft.cscLink / SNAP_CSC_LINK — config-level or env credential (base64 or file path).\n // resolveSnapCredentials already ran for all build modes; re-run here so remote-build\n // gets the same result and the interactive-session fallback is only reached when neither is set.\n const credEnv = await resolveSnapCredentials(cscLink, resourcesDir)\n if (Object.keys(credEnv).length > 0) {\n return credEnv\n }\n\n // 2. SNAPCRAFT_STORE_CREDENTIALS env var — directly provide the credentials string (not base64-encoded).\n const SNAPCRAFT_STORE_CREDENTIALS = process.env.SNAPCRAFT_STORE_CREDENTIALS?.trim()\n if (!isEmptyOrSpaces(SNAPCRAFT_STORE_CREDENTIALS)) {\n log.debug(null, \"using SNAPCRAFT_STORE_CREDENTIALS from environment, verbatim\")\n return { SNAPCRAFT_STORE_CREDENTIALS }\n }\n\n // 3. Interactive snapcraft session.\n try {\n const stdout = await exec(\"snapcraft\", [\"whoami\"])\n if (stdout.includes(\"email:\")) {\n log.debug({ account: stdout.trim() }, \"already authenticated with snapcraft\")\n return {}\n }\n } catch {\n // Not logged in, fall through to error.\n }\n\n throw new InvalidConfigurationError(\n \"Snapcraft authentication required for remote build.\\n\" +\n \"Authenticate with one of any:\\n\" +\n \" 1. Set SNAP_CSC_LINK\\n\" +\n \" 2. Set snapcraft.cscLink in your build config\\n\" +\n \" 3. Run: snapcraft login\\n\" +\n \" 4. Set SNAPCRAFT_STORE_CREDENTIALS environment variable directly\"\n )\n}\n\ninterface ExecuteSnapcraftOptions {\n workDir: string\n outputSnap: string\n remoteBuild?: RemoteBuildOptions\n useLXD: boolean\n useMultipass: boolean\n useDestructiveMode: boolean\n isolatedEnv: Record<string, string>\n}\n\n/**\n * Executes the snapcraft build command\n */\nasync function executeSnapcraftBuild(options: ExecuteSnapcraftOptions): Promise<string[]> {\n const { workDir, outputSnap: outputFileName, remoteBuild, useLXD, useMultipass, useDestructiveMode, isolatedEnv } = options\n let processedEnv: NodeJS.ProcessEnv = { ...stripSensitiveEnvVars(process.env), ...isolatedEnv }\n\n // Use a UUID-based temp name as the --output target so the copy below doesn't\n // depend on snapcraft's naming convention (which always uses underscores).\n const tmpSnap = `eb-snap-${randomUUID().replace(/-/g, \"\")}.snap`\n\n if (useDestructiveMode && !remoteBuild?.enabled) {\n return [await runDestructiveBuild(workDir, processedEnv, tmpSnap, outputFileName)]\n }\n\n const command = \"snapcraft\"\n const args: string[] = []\n\n if (remoteBuild?.enabled) {\n const remoteBuildArgs = generateRemoteBuildArgs(remoteBuild, workDir)\n // Remote build on Launchpad (works from any platform)\n args.push(...remoteBuildArgs.args)\n processedEnv = { ...processedEnv, ...remoteBuildArgs.isolatedEnv }\n } else {\n // `snapcraft pack` runs the full lifecycle (pull → build → stage → prime → pack).\n // snapcraft 8.x removed --use-multipass entirely; Multipass is now configured\n // via the SNAPCRAFT_BUILD_ENVIRONMENT env var (or auto-selected on macOS).\n // --use-lxd remains a supported CLI flag on `pack`.\n args.push(\"pack\")\n if (useLXD) {\n args.push(\"--use-lxd\")\n log.debug(null, \"using LXD for build\")\n } else if (useMultipass) {\n processedEnv.SNAPCRAFT_BUILD_ENVIRONMENT = \"multipass\"\n log.debug(null, \"using Multipass for build (via SNAPCRAFT_BUILD_ENVIRONMENT)\")\n } else {\n args.push(\"--output\", tmpSnap)\n }\n }\n\n if (log.isDebugEnabled) {\n args.push(\"--verbose\")\n }\n\n log.info({ workDir: log.filePath(workDir) }, \"executing snapcraft\")\n\n await spawn(command, args, {\n cwd: workDir,\n env: processedEnv,\n })\n\n if (remoteBuild?.enabled || useLXD || useMultipass) {\n // snapcraft names output snaps itself (e.g. <name>_<version>_<arch>.snap).\n // For multi-arch remote-builds (buildFor array), multiple snaps land in workDir.\n const files = await readdir(workDir)\n const builtSnaps = files.filter(f => f.endsWith(\".snap\"))\n if (builtSnaps.length === 0) {\n throw new Error(`Build succeeded but no .snap file found in ${workDir}`)\n }\n const outDir = path.dirname(outputFileName)\n // Extract the arch segment from the pre-computed artifact path so we can identify\n // the primary snap by arch rather than by filename — snapcraft may name its output\n // differently (e.g. underscores vs hyphens, different app name sanitization).\n const primaryBase = path.basename(outputFileName)\n const primaryArch = primaryBase\n .replace(/\\.snap$/, \"\")\n .split(\"_\")\n .pop()!\n const results: string[] = []\n for (const snapFile of builtSnaps) {\n const snapArch =\n snapFile\n .replace(/\\.snap$/, \"\")\n .split(\"_\")\n .pop() ?? primaryArch\n // Primary arch: honour the pre-computed outputFileName (respects artifactName macro).\n // Extra arches: substitute the arch segment in the primary basename to follow the same pattern.\n const dest = snapArch === primaryArch ? outputFileName : path.join(outDir, primaryBase.replace(new RegExp(`_${primaryArch}\\\\.snap$`), `_${snapArch}.snap`))\n results.push(await copySnapToArtifactPath(workDir, snapFile, dest))\n }\n return results\n }\n\n return [await copySnapToArtifactPath(workDir, tmpSnap, outputFileName)]\n}\n\nfunction generateRemoteBuildArgs(remoteBuild: RemoteBuildOptions, workDir: string) {\n const isolatedEnv: Record<string, string> = {}\n const args: string[] = [\"remote-build\"]\n\n log.debug(null, \"using remote-build (Launchpad)\")\n\n // Add remote build specific options\n if (remoteBuild.launchpadUsername) {\n args.push(\"--user\", remoteBuild.launchpadUsername)\n }\n\n if (remoteBuild.acceptPublicUpload) {\n args.push(\"--launchpad-accept-public-upload\")\n } else {\n log.warn(null, \"your project will be publicly uploaded to Launchpad. Use `acceptPublicUpload: true` to suppress this warning\")\n }\n\n if (remoteBuild.privateProject) {\n args.push(\"--project\", remoteBuild.privateProject)\n log.debug({ project: remoteBuild.privateProject }, \"using private Launchpad project\")\n }\n\n if (remoteBuild.buildFor) {\n const buildForStr = Array.isArray(remoteBuild.buildFor) ? remoteBuild.buildFor.join(\",\") : remoteBuild.buildFor\n args.push(\"--build-for\", buildForStr)\n log.debug({ arch: buildForStr }, \"building for architecture\")\n }\n\n if (remoteBuild.recover) {\n args.push(\"--recover\")\n log.debug(null, \"recovering previous build\")\n }\n\n if (remoteBuild.strategy) {\n isolatedEnv.SNAPCRAFT_REMOTE_BUILD_STRATEGY = remoteBuild.strategy\n }\n\n if (remoteBuild.timeout) {\n args.push(\"--timeout\", String(remoteBuild.timeout))\n log.debug({ timeout: `${remoteBuild.timeout}s` }, \"build timeout configured\")\n }\n\n // Remote-build downloads the finished snap into workDir.\n // --output-dir (not --output <file>) lets snapcraft name the file itself.\n args.push(\"--output-dir\", workDir)\n\n return { args, isolatedEnv }\n}\n\n// Snapcraft 8 (craft-application) hangs after a successful destructive-mode\n// build in containerised environments (Docker/CI without snapd running).\n// craft-application's PackageService teardown tries to reach\n// /run/snapd-snap.socket (snapctl IPC) which doesn't exist without a live\n// snapd daemon — causing an indefinite block.\n//\n// Work-around: split into two steps:\n// 1. `snapcraft prime --destructive-mode` — runs pull/build/stage/prime,\n// exits cleanly (no post-pack teardown executed).\n// 2. `snapcraft pack <primeDir>` — packs the pre-primed directory without\n// running the full build lifecycle, avoiding the problematic teardown.\nasync function runDestructiveBuild(workDir: string, processedEnv: NodeJS.ProcessEnv, tmpSnap: string, outputFileName: string) {\n const primeArgs = [\"prime\", \"--destructive-mode\"]\n if (log.isDebugEnabled) {\n primeArgs.push(\"--verbose\")\n }\n log.info({ command: `snapcraft ${primeArgs.join(\" \")}`, workDir: log.filePath(workDir) }, \"snapcraft prime (1/2)\")\n await spawn(\"snapcraft\", primeArgs, {\n cwd: workDir,\n env: processedEnv,\n })\n\n const primeDir = path.join(workDir, \"prime\")\n const snapcraftPackArgs = [\"pack\", \"--output\", tmpSnap, primeDir]\n if (log.isDebugEnabled) {\n snapcraftPackArgs.push(\"--verbose\")\n }\n log.info({ command: `snapcraft ${snapcraftPackArgs.join(\" \")}`, workDir: log.filePath(workDir) }, \"snapcraft pack prime dir (2/2)\")\n await spawn(\"snapcraft\", snapcraftPackArgs, {\n cwd: workDir,\n env: processedEnv,\n })\n\n return copySnapToArtifactPath(workDir, tmpSnap, outputFileName)\n}\n"]}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { Arch } from "builder-util";
|
|
2
2
|
import { Platform, Target } from "../core.js";
|
|
3
3
|
import { PlatformPackager } from "../platformPackager.js";
|
|
4
|
+
/**
|
|
5
|
+
* Populates the per-platform arch→target map from a list of CLI/config target specs (e.g. "nsis", "deb:armv7l").
|
|
6
|
+
* The shared scaffolding (get-or-create the platform map + the `target:arch` suffix parsing) is consolidated here;
|
|
7
|
+
* callers inject `commonArch` (how default architectures are resolved) and `setEmptyTypes` (what to do when no
|
|
8
|
+
* target types were given) since those policies differ between the programmatic packager and the CLI.
|
|
9
|
+
*/
|
|
10
|
+
export declare function addTargetsForPlatform(targets: Map<Platform, Map<Arch, Array<string>>>, platform: Platform, types: Array<string>, commonArch: (currentIfNotSpecified: boolean) => Array<Arch>, setEmptyTypes: (archToType: Map<Arch, Array<string>>) => void): void;
|
|
4
11
|
export declare function computeArchToTargetNamesMap(raw: Map<Arch, Array<string>>, platformPackager: PlatformPackager<any>, platform: Platform): Map<Arch, Array<string>>;
|
|
5
12
|
export declare function createTargets(nameToTarget: Map<string, Target>, rawList: Array<string>, outDir: string, packager: PlatformPackager<any>): Array<Target>;
|
|
6
13
|
export declare function createCommonTarget(target: string, outDir: string, packager: PlatformPackager<any>): Target;
|