{"version":3,"file":"snapcraftBuilder.js","sourceRoot":"","sources":["../../../src/targets/snap/snapcraftBuilder.ts"],"names":[],"mappings":"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","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\"\nimport { copyFile, ensureDir, pathExists, readdir, remove } from \"fs-extra\"\nimport * as path from \"path\"\nimport * as util from \"util\"\nimport { LinuxPackager } from \"../../linuxPackager\"\nimport { RemoteBuildOptions } from \"../../options/SnapOptions\"\nimport { SnapcraftYAML } from \"./snapcraft\"\nimport { deepAssign } from \"builder-util-runtime\"\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 new Promise(resolve => setTimeout(resolve, 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"]}