const { Arch } = require("electron-builder"); const pkg = require("./package.json"); const fs = require("fs"); const path = require("path"); const windowsShouldSign = !!process.env.SM_CODE_SIGNING_CERT_SHA1_HASH; /** * @type {import('electron-builder').Configuration} * @see https://www.electron.build/configuration/configuration */ const config = { appId: pkg.build.appId, productName: pkg.productName, executableName: pkg.productName, artifactName: "${productName}-${platform}-${arch}-${version}.${ext}", generateUpdatesFilesForAllChannels: true, npmRebuild: false, nodeGypRebuild: false, electronCompile: false, files: [ { from: "./dist", to: "./dist", filter: ["**/*", "!bin/*", "bin/wavesrv.${arch}*", "bin/wsh*"], }, { from: ".", to: ".", filter: ["package.json"], }, "!node_modules", // We don't need electron-builder to package in Node modules as Vite has already bundled any code that our program is using. ], directories: { output: "make", }, asarUnpack: [ "dist/bin/**/*", // wavesrv and wsh binaries "dist/docsite/**/*", // the static docsite ], mac: { target: [ { target: "zip", arch: ["universal", "arm64", "x64"], }, { target: "dmg", arch: ["universal", "arm64", "x64"], }, ], category: "public.app-category.developer-tools", minimumSystemVersion: "10.15.0", mergeASARs: true, singleArchFiles: "dist/bin/wavesrv.*", }, linux: { artifactName: "${name}-${platform}-${arch}-${version}.${ext}", category: "TerminalEmulator", executableName: pkg.name, target: ["zip", "deb", "rpm", "snap", "AppImage", "pacman"], synopsis: pkg.description, description: null, desktop: { Name: pkg.productName, Comment: pkg.description, Keywords: "developer;terminal;emulator;", category: "Development;Utility;", }, executableArgs: ["--enable-features", "UseOzonePlatform", "--ozone-platform-hint", "auto"], // Hint Electron to use Ozone abstraction layer for native Wayland support }, deb: { afterInstall: "build/deb-postinstall.tpl", }, win: { target: ["nsis", "msi", "zip"], signtoolOptions: windowsShouldSign && { signingHashAlgorithms: ["sha256"], publisherName: "Command Line Inc", certificateSubjectName: "Command Line Inc", certificateSha1: process.env.SM_CODE_SIGNING_CERT_SHA1_HASH, }, }, appImage: { license: "LICENSE", }, snap: { base: "core22", confinement: "classic", allowNativeWayland: true, }, publish: { provider: "generic", url: "https://dl.waveterm.dev/releases-w2", }, beforePack: () => { const staticSourcePath = process.env.STATIC_DOCSITE_PATH; const staticDestPath = "dist/docsite"; if (staticSourcePath) { console.log(`Static docsite path is specified, copying from "${staticSourcePath}" to "${staticDestPath}"`); fs.cpSync(staticSourcePath, staticDestPath, { recursive: true }); } }, afterPack: (context) => { // This is a workaround to restore file permissions to the wavesrv binaries on macOS after packaging the universal binary. if (context.electronPlatformName === "darwin" && context.arch === Arch.universal) { const packageBinDir = path.resolve( context.appOutDir, `${pkg.productName}.app/Contents/Resources/app.asar.unpacked/dist/bin` ); // Reapply file permissions to the wavesrv binaries in the final app package fs.readdirSync(packageBinDir, { recursive: true, withFileTypes: true, }) .filter((f) => f.isFile() && f.name.startsWith("wavesrv")) .forEach((f) => fs.chmodSync(path.resolve(f.parentPath ?? f.path, f.name), 0o755)); // 0o755 corresponds to -rwxr-xr-x } }, }; module.exports = config;