UNPKG

app-builder-lib

Version:
501 lines (500 loc) 22.3 kB
import { TargetSpecificOptions } from "../core"; import { SnapcraftYAML } from "../targets/snap/snapcraft"; import { CommonLinuxOptions } from "./linuxOptions"; /** * New-style snap configuration. Use this via the `snapcraft` key in your build config. * Selects the snapcraft core version and its per-core options. */ export interface SnapcraftOptions extends TargetSpecificOptions { /** * The snap base to use as the execution environment. Determines which set of per-core options * (`core18`, `core20`, `core22`, `core24`, `custom`) is active. * * Only one core may be selected per build target. */ readonly base: "core18" | "core20" | "core22" | "core24" | "custom"; /** * Snapcraft Store credentials — base64-encoded credentials string or file path. * Accepts the same formats as `WIN_CSC_LINK` / `CSC_LINK`: base64 data, * absolute/relative/`~/` file paths, and `file://` URIs. * Relative paths are resolved against the build resources directory. * * Injected as `SNAPCRAFT_STORE_CREDENTIALS` into every snapcraft subprocess * (core18/core20/core22/core24 builds and `snapcraft upload`). * Not applied for `base: "custom"` — inject credentials manually via environment variables. * * The `SNAP_CSC_LINK` environment variable is the CI-friendly alternative. * Generate with: `snapcraft export-login - | base64 -w0` */ readonly cscLink?: string; /** * Configuration for a core18 build. Only active when `base` is `"core18"`. */ readonly core18?: SnapOptionsLegacy | null; /** * Configuration for a core20 build. Only active when `base` is `"core20"`. */ readonly core20?: SnapOptionsLegacy | null; /** * Configuration for a core22 build. Only active when `base` is `"core22"`. */ readonly core22?: SnapOptionsLegacy | null; /** * **[Beta]** Options for building a core24 snap. Uses the snapcraft CLI directly. * Inherits desktop-entry fields from `CommonLinuxOptions` and publish config from `TargetSpecificOptions`. * @beta */ readonly core24?: SnapOptions24 | null; /** * **[Beta]** Pass-through custom snap configuration. electron-builder will read the * snapcraft.yaml at `yamlPath` and use it verbatim — no plugs, extensions, * organize mappings, or desktop files are injected. * @beta */ readonly custom?: SnapOptionsCustom | null; } export type SnapOptionsLegacy = Omit<SnapOptions, "base">; export interface SnapOptionsCustom { /** * Supports 2 routes: * - Path to an existing `snapcraft.yaml` file, relative to `buildResourcesDir`. electron-builder reads the file and passes it through without modification. * - A `SnapcraftYAML` object directly in the configuration. electron-builder uses the object to generate a `snapcraft.yaml` file, which is then passed through without modification. */ readonly yaml?: string | SnapcraftYAML | null; } /** * Flat snap options. Used via the `snap` key in your build config. * * @deprecated Prefer the `snapcraft` key with an explicit `base` field (e.g. * `{ "snapcraft": { "base": "core24", "core24": { ... } } }`). The flat `snap` * interface is maintained for backward compatibility and targets `core22` and * older snap bases only. * * Fields inherited from {@link CommonLinuxOptions} (e.g. `description`, `category`, * `mimeTypes`, `executableArgs`) are automatically populated from `linux.*` configuration * and do not need to be repeated here. Per-core values take precedence when both are set. */ export interface SnapOptions extends CommonLinuxOptions, TargetSpecificOptions { /** * The snap base to use as the execution environment. * Examples: `core18`, `core20`, `core22`. * * For new projects, use the `snapcraft` key with `base: "core24"` instead of * this legacy interface. */ readonly base?: string | null; /** * Whether to use the pre-built Electron snap template for faster builds. * When `true`, electron-builder delegates snap assembly to the upstream Electron snap * template rather than running a full snapcraft build, significantly reducing build time. * Defaults to `true` when `stagePackages` is not customised. * Only applicable to x64 and armv7l builds. */ readonly useTemplateApp?: boolean; /** * The type of [snap confinement](https://snapcraft.io/docs/reference/confinement). * - `strict` — recommended; the snap runs in a fully isolated sandbox. * - `devmode` — sandbox violations are logged but not enforced; for development only. * - `classic` — no confinement; equivalent to a traditionally packaged application. * Requires Snap Store approval before publishing. * @default strict */ readonly confinement?: "devmode" | "strict" | "classic" | null; /** * Environment variables injected into the snap's runtime environment. * Merged with the electron-builder default `{ TMPDIR: "$XDG_RUNTIME_DIR" }`. * User-supplied values take precedence. */ readonly environment?: { [key: string]: string; } | null; /** * A short summary of the snap (max 78 characters). * Defaults to [productName](./configuration.md#productName). */ readonly summary?: string | null; /** * The quality grade of the snap. * - `stable` — suitable for all channels, including `stable` and `candidate`. * - `devel` — development snapshot; cannot be promoted to `stable` or `candidate`. * @default stable */ readonly grade?: "devel" | "stable" | null; /** * [Snapd features](https://snapcraft.io/docs/snapcraft-yaml-reference#assumes) that must * be present on the host before the snap can be installed. */ readonly assumes?: Array<string> | string | null; /** * Debian packages required at **build** time (installed inside the build environment). */ readonly buildPackages?: Array<string> | null; /** * Ubuntu packages to **stage** alongside the app (equivalent to `depends` for deb). * Defaults to `["libnspr4", "libnss3", "libxss1", "libappindicator3-1", "libsecret-1-0"]`. * * Use the `"default"` keyword to extend the default list: * `["default", "my-extra-lib"]` appends `my-extra-lib` to the defaults. */ readonly stagePackages?: Array<string> | null; /** * Directory containing [snap hooks](https://snapcraft.io/docs/snap-hooks), relative to * the build resources directory (`build/`). * @default build/snap-hooks */ readonly hooks?: string | null; /** * [Plugs](https://snapcraft.io/docs/reference/interfaces) (consumed interfaces) to declare * for the app entry point. * Defaults to `["desktop", "desktop-legacy", "home", "x11", "wayland", "unity7", * "browser-support", "network", "gsettings", "audio-playback", "pulseaudio", "opengl"]`. * * Use `"default"` in the list to keep the defaults and append extras: * `["default", "camera"]` adds `camera` to the standard set. * * To configure plug attributes (e.g. `allow-sandbox` for Chromium's internal sandbox), * use a descriptor object: * ```json * [ * { "browser-sandbox": { "interface": "browser-support", "allow-sandbox": true } }, * "another-simple-plug-name" * ] * ``` */ readonly plugs?: Array<string | PlugDescriptor> | PlugDescriptor | null; /** * [Slots](https://snapcraft.io/docs/reference/interfaces) (provided interfaces) to declare * for the app. * * To expose an MPRIS player under the Chromium bus name (required for strict confinement): * ```json * [{ "mpris": { "name": "chromium" } }] * ``` * Chromium [hard-codes](https://source.chromium.org/chromium/chromium/src/+/master:components/system_media_controls/linux/system_media_controls_linux.cc;l=51;bpv=0;bpt=1) * the bus name `chromium`, so the slot name must match for snapd to * [allow it](https://forum.snapcraft.io/t/unable-to-use-mpris-interface/15360/7). */ readonly slots?: Array<string | SlotDescriptor> | SlotDescriptor | null; /** * Names of snapcraft parts that must be built before the app part. * Defaults to `["desktop-gtk2"]`. * * Use `"default"` to keep the default and add extras: * `["default", "my-helper-part"]`. */ readonly after?: Array<string> | null; /** * Whether the snap should automatically start on login. * @default false */ readonly autoStart?: boolean; /** * [Snap layouts](https://snapcraft.io/docs/snap-layouts) — bind-mount or symlink host paths * into the snap's namespace, making libraries or config at `/usr`, `/var`, `/etc`, etc. * accessible inside the confined environment. */ readonly layout?: { [key: string]: { [key: string]: string; }; } | null; /** * Filesets controlling which files from the app part are staged into the snap. * Supports individual files, directories, globs, globstars, and exclusions (prefix `!`). * See [Snapcraft filesets](https://snapcraft.io/docs/snapcraft-filesets). * When not set, the snap template's default stage list is used for legacy bases (core18/core20/core22). */ readonly appPartStage?: Array<string> | null; /** * Display title for the snap (may contain uppercase letters and spaces). * Defaults to `productName`. * See [snap format](https://snapcraft.io/docs/snap-format). */ readonly title?: string | null; /** * Compression algorithm for the snap SquashFS image. * - `xz` — smaller file, slower decompression (good for distribution). * - `lzo` — larger file, faster decompression (good for development iteration). * Omit to use snapcraft's default (`xz`). * * When not set, `linux.compression` is mapped automatically: * `"store"` → `"lzo"`, `"maximum"` → `"xz"`, `"normal"` → snapcraft default. * Explicitly setting this field always overrides the mapped value. */ readonly compression?: "xz" | "lzo" | null; /** * Allow the snap to run with native Wayland support (`--ozone-platform=wayland`). * Defaults to `false` for Electron < 38 (legacy behaviour); `true` for Electron ≥ 38. * Set explicitly to override the version-based default. */ readonly allowNativeWayland?: boolean | null; } /** * Configuration for a remote snap build on [Launchpad](https://launchpad.net/). * Remote builds run on Canonical's infrastructure without requiring native hardware or nested virtualisation. * * Each electron-builder build invocation targets exactly one architecture — to build for multiple * architectures, configure the top-level `arch` option (e.g. `arch: ["x64", "arm64"]`); each arch * spawns a separate `snapcraft remote-build` job on Launchpad. * * Authentication is resolved in this order: * 1. `cscLink` config field — base64-encoded credentials or a file path * 2. `SNAP_CSC_LINK` environment variable — same format as `cscLink` * (CI-recommended; follows the same pattern as `WIN_CSC_LINK` for Windows code signing) * 3. `SNAPCRAFT_STORE_CREDENTIALS` environment variable (read directly by snapcraft) * 4. An active interactive `snapcraft login` session * * **CI setup** (set once as a CI secret): * ```sh * export SNAP_CSC_LINK=$(snapcraft export-login - | base64 -w0) * ``` * The resolved credentials are injected only into the spawned `snapcraft` subprocess * environment and never exposed through `process.env`. */ export interface RemoteBuildOptions { /** * Whether to enable remote build on Launchpad. Must be set explicitly to `true` to opt in. */ enabled: boolean; /** * Your Launchpad username. Used to select the correct Launchpad account when more than * one set of credentials is available. */ launchpadUsername?: string; /** * Target architecture for the remote build. Accepts a single snapcraft arch string * (e.g. `"amd64"`, `"arm64"`, `"armhf"`). * * To build for multiple architectures, configure electron-builder's top-level `arch` option * (e.g. `arch: ["x64", "arm64"]`) — each arch spawns a separate remote-build job on Launchpad, * keeping the one-build-per-artifact contract intact. * @example "amd64" */ buildFor?: string; /** * Suppress the Launchpad public-upload consent prompt by automatically accepting it. * Your source code will be uploaded to a **public** Launchpad repository. * Set to `true` in CI once you understand the implications. */ acceptPublicUpload?: boolean; /** * Launchpad project name to use for a **private** source upload. * The project must already exist and you must have write access. */ privateProject?: string; /** * Resume a previously interrupted remote build rather than starting a new one. */ recover?: boolean; /** * Maximum time in seconds to wait for the remote build to complete before aborting. * Passed to `snapcraft remote-build` as `--timeout <seconds>`. * * @example 1800 // 30 minutes */ timeout?: number; /** * Controls whether snapcraft may fall back to a different remote build strategy. * - `"disable-fallback"` — always use the primary strategy, fail if unavailable. * - `"force-fallback"` — always use the fallback strategy. */ strategy?: "disable-fallback" | "force-fallback"; } /** * **[Beta]** Options for building a core24 snap. This interface does not extend the legacy * `SnapBaseOptions` — it uses the snapcraft CLI directly. * * Fields inherited from {@link CommonLinuxOptions} (`description`, `category`, `mimeTypes`, * `executableArgs`, `desktop`, `synopsis`) are automatically populated from the root `linux.*` * configuration. You do not need to duplicate them here; values set directly on this interface * take precedence over the cascaded `linux.*` values. * * @beta */ export interface SnapOptions24 extends CommonLinuxOptions, TargetSpecificOptions { /** * Use [LXD](https://canonical.com/lxd) as the isolated build environment. * Preferred over Multipass on most Linux CI systems where nested virtualisation is unavailable. * Mutually exclusive with `useMultipass` and `useDestructiveMode`. */ readonly useLXD?: boolean | null; /** * Use [Multipass](https://multipass.run/) as the isolated build environment. * Mutually exclusive with `useLXD` and `useDestructiveMode`. */ readonly useMultipass?: boolean | null; /** * Build directly on the host without an isolated VM or container (snapcraft `--destructive-mode`). * Equivalent to setting `SNAPCRAFT_BUILD_ENVIRONMENT=host`. * * **Not recommended for most use cases.** Destructive mode pollutes the host environment * and produces builds that are difficult to reproduce — any library or tool present on the * host at build time can silently end up in the snap. Prefer `useLXD` or `useMultipass` * for clean, reproducible builds; use `remoteBuild` for multi-architecture CI. * * Valid reasons to enable this option: * - Building inside a Docker container where nested virtualisation (LXD / Multipass) is * unavailable and a remote Launchpad build is not acceptable. * - Running test suites in CI where the environment is already fully controlled. * * The `gnome` extension is incompatible with this mode enabled — do not include it in `extensions`. * @see https://snapcraft.io/docs/build-options */ readonly useDestructiveMode?: boolean | null; /** * Configuration for a remote build on [Launchpad](https://launchpad.net/). * Enables cross-architecture builds in CI without native hardware or nested virtualisation. * Each build invocation targets one arch; use `arch: ["x64", "arm64"]` to build for multiple. */ readonly remoteBuild?: RemoteBuildOptions | null; /** * [Snapcraft extensions](https://snapcraft.io/docs/snapcraft-extensions) to apply to the app. * Defaults to `["gnome"]` in normal builds (recommended for Electron apps on Ubuntu 24.04+). * Automatically set to `[]` in `useDestructiveMode` builds, where the gnome extension is * incompatible. Explicitly including `"gnome"` while `useDestructiveMode` is set will throw. * See: https://snapcraft.io/docs/gnome-extension */ readonly extensions?: Array<string> | null; /** * The type of [confinement](https://snapcraft.io/docs/reference/confinement) supported by the snap. * @default strict */ readonly confinement?: "devmode" | "strict" | "classic" | null; /** * The quality grade of the snap. * `devel` — not publishable to stable/candidate channels. * `stable` — suitable for all channels. * @default stable */ readonly grade?: "devel" | "stable" | null; /** * A short summary of the snap (max 78 characters). Defaults to `productName`. */ readonly summary?: string | null; /** * An optional display title (may contain uppercase letters and spaces). Defaults to `productName`. * See [snap format](https://snapcraft.io/docs/snap-format). */ readonly title?: string | null; /** * Compression algorithm for the snap SquashFS image. * - `xz` — smaller file, slower decompression (recommended for distribution). * - `lzo` — larger file, faster decompression (useful for development iteration). * Omit to use snapcraft's default (`xz`). * * When not set, `linux.compression` is mapped automatically: * `"store"` → `"lzo"`, `"maximum"` → `"xz"`, `"normal"` → snapcraft default. * Explicitly setting this field always overrides the mapped value. */ readonly compression?: "xz" | "lzo" | null; /** * Features that must be supported by the host snapd before the snap can be installed. * See [assumes](https://snapcraft.io/docs/snapcraft-yaml-reference#assumes). */ readonly assumes?: Array<string> | string | null; /** * Debian packages required at **build** time (installed inside the build environment). */ readonly buildPackages?: Array<string> | null; /** * Ubuntu packages to **stage** alongside the app (equivalent to `depends` for deb). * Defaults to `["libnspr4", "libnss3", "libxss1", "libappindicator3-1", "libsecret-1-0"]`. * Supports the `"default"` keyword to reference the default list: * `["default", "my-extra-lib"]` appends `my-extra-lib` to the defaults. */ readonly stagePackages?: Array<string> | null; /** * Filesets controlling which files from the app part are staged into the snap. * Supports glob patterns and exclusions. See [filesets](https://snapcraft.io/docs/snapcraft-filesets). */ readonly appPartStage?: Array<string> | null; /** * Names of other snapcraft parts that must be built before the app part. */ readonly after?: Array<string> | null; /** * [Plugs](https://snapcraft.io/docs/reference/interfaces) (consumed interfaces) for the app. * When the `gnome` extension is active, content-snap plugs (themes, GNOME platform, GPU) * are added automatically — only list custom plugs here. * Without any extension, defaults to the standard Electron plug set. * * Supports descriptor objects for plugs with attributes: * ```json * [{ "browser-sandbox": { "interface": "browser-support", "allow-sandbox": true } }] * ``` */ readonly plugs?: Array<string | PlugDescriptor> | PlugDescriptor | null; /** * [Slots](https://snapcraft.io/docs/reference/interfaces) (provided interfaces) for the app. * Use for MPRIS, D-Bus services, etc. * * Example — expose MPRIS under the Chromium bus name: * ```json * [{ "mpris": { "name": "chromium" } }] * ``` */ readonly slots?: Array<string | SlotDescriptor> | SlotDescriptor | null; /** * [Snap layouts](https://snapcraft.io/docs/snap-layouts) — bind-mount or symlink host paths * into the snap's namespace. User-provided layouts always override the extension defaults. */ readonly layout?: { [key: string]: { [key: string]: string; }; } | null; /** * Additional environment variables injected into the snap's runtime environment. * Merged with the electron-builder defaults (`TMPDIR=$XDG_RUNTIME_DIR`). * User-supplied values take precedence. */ readonly environment?: { [key: string]: string; } | null; /** * Whether the app should auto-start on login (creates an autostart desktop entry). * @default false */ readonly autoStart?: boolean; /** * Set to `true` to force X11 by injecting `--ozone-platform=x11` into the snap command line. * When unset or `false`, no flag is injected and native Wayland is allowed. * Unlike the legacy `snap.allowNativeWayland`, there is no electron-version-based default here — * core24 always allows Wayland unless this is explicitly `true`. */ readonly forceX11?: boolean | null; /** * Directory containing [snap hooks](https://snapcraft.io/docs/snap-hooks), relative to * the build resources directory. * @default build/snap-hooks */ readonly hooks?: string | null; } /** * Maps a named plug to its attribute object. * `null` uses snapd defaults for that interface. * * @example * ```json * { "browser-sandbox": { "interface": "browser-support", "allow-sandbox": true } } * ``` */ export interface PlugDescriptor { [key: string]: { [key: string]: any; } | null; } /** * Maps a named slot to its attribute object. * `null` uses snapd defaults for that interface. * * @example * ```json * { "mpris": { "name": "chromium" } } * ``` */ export interface SlotDescriptor { [key: string]: { [key: string]: any; } | null; }