const builder = require("electron-builder")
const fs = require("fs")
const path = require("path")
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 Inc.",
applicationId: "PresentonAI.Presenton",
},
}
builder.build({ config })