const builder = require("electron-builder") const fs = require("fs") const path = require("path") // AfterPack hook: set executable permissions on macOS; no-op on Windows const afterPack = async (context) => { if (context.electronPlatformName === "darwin") { const appPath = context.appOutDir const appBundleName = `${context.packager.appInfo.productFilename}.app` const resourcesRoot = path.join( appPath, appBundleName, "Contents", "Resources", "app", "resources" ) const fastapiPath = path.join(resourcesRoot, "fastapi", "fastapi") const exportPyDir = path.join(resourcesRoot, "export", "py") const converterCandidates = [ `convert-${process.platform}-${process.arch}`, `convert-${process.platform}`, "convert", ] console.log("Setting executable permissions for FastAPI binary...") console.log("FastAPI path:", fastapiPath) if (fs.existsSync(fastapiPath)) { fs.chmodSync(fastapiPath, 0o755) console.log("✓ Execute permissions set for FastAPI") } else { console.warn("⚠ FastAPI binary not found at:", fastapiPath) } console.log("Setting executable permissions for export converter binary...") let converterFound = false for (const candidate of converterCandidates) { const candidatePath = path.join(exportPyDir, candidate) if (fs.existsSync(candidatePath)) { fs.chmodSync(candidatePath, 0o755) console.log("✓ Execute permissions set for converter:", candidatePath) converterFound = true } } if (!converterFound) { console.warn("⚠ No converter binary found in:", exportPyDir) } const fastapiDir = path.join(resourcesRoot, "fastapi") if (fs.existsSync(fastapiDir)) { console.log("FastAPI directory contents:", fs.readdirSync(fastapiDir)) } if (fs.existsSync(exportPyDir)) { console.log("Export py directory contents:", fs.readdirSync(exportPyDir)) } } } const config = { appId: "PresentonAI.Presenton", asar: false, copyright: "Copyright © 2026 Presenton", directories: { output: "dist", buildResources: "build", }, files: [ "resources", "app_dist", "node_modules", "NOTICE" ], afterPack, mac: { artifactName: "Presenton-${version}.${ext}", target: ["dmg"], category: "public.app-category.productivity", icon: "resources/ui/assets/images/presenton_short_filled.png", }, linux: { artifactName: "Presenton-${version}.${ext}", target: ["AppImage", "deb"], icon: "build/icons", }, deb: { afterInstall: "build/after-install.tpl", recommends: ["libreoffice"], }, win: { target: ["nsis", "appx"], icon: "build/icon.ico", artifactName: "Presenton-${version}.${ext}", executableName: "Presenton", }, nsis: { oneClick: false, perMachine: false, allowToChangeInstallationDirectory: true, allowElevation: true, installerIcon: "build/icon.ico", uninstallerIcon: "build/icon.ico", installerHeaderIcon: "build/icon.ico", createDesktopShortcut: true, createStartMenuShortcut: true, shortcutName: "Presenton", uninstallDisplayName: "Presenton", }, appx: { identityName: "PresentonAI.Presenton", publisher: "CN=8A2C57B5-F1C6-473A-93EE-2E9B72134341", publisherDisplayName: "Presenton AI", applicationId: "PresentonAI.Presenton", }, } builder.build({ config })