add win32 + linux electron builds

This commit is contained in:
Ramnique Singh 2026-02-06 05:58:21 +05:30
parent dbdfcffa8d
commit e1637d5965
6 changed files with 354 additions and 43 deletions

View file

@ -22,7 +22,7 @@ await esbuild.build({
platform: 'node',
target: 'node20',
outfile: './.package/dist/main.cjs',
external: ['electron'], // Provided by Electron runtime
external: ['electron', 'electron-squirrel-startup'], // Provided by Electron runtime
// Use CommonJS format - many dependencies use require() which doesn't work
// well with esbuild's ESM shim. CJS handles dynamic requires natively.
format: 'cjs',

View file

@ -19,9 +19,6 @@ module.exports = {
appleIdPassword: process.env.APPLE_PASSWORD,
teamId: process.env.APPLE_TEAM_ID
},
// NOTE: Electron Forge ignores packagerConfig.dir and always packages from the
// config file's directory. We use packageAfterCopy hook instead to customize output.
// dir: path.join(__dirname, '.package'), // Not supported by Forge
// Since we bundle everything with esbuild, we don't need node_modules at all.
// These settings prevent Forge's dependency walker (flora-colossus) from trying
// to analyze/copy node_modules, which fails with pnpm's symlinked workspaces.
@ -43,23 +40,27 @@ module.exports = {
})
},
{
name: '@electron-forge/maker-zip',
platforms: ['darwin'],
// ZIP is used by Squirrel.Mac for auto-updates
name: '@electron-forge/maker-squirrel',
config: (arch) => ({
// Path must match S3 publisher's folder structure: releases/darwin/{arch}
macUpdateManifestBaseUrl: `https://rowboat-desktop-app-releases.s3.amazonaws.com/releases/darwin/${arch}`
authors: 'Rowboat',
description: 'AI coworker with memory',
name: `Rowboat-win32-${arch}`,
})
},
{
name: '@electron-forge/maker-zip',
platform: ["darwin", "win32", "linux"],
}
],
publishers: [
{
name: '@electron-forge/publisher-s3',
name: '@electron-forge/publisher-github',
config: {
bucket: 'rowboat-desktop-app-releases',
region: 'us-east-1',
public: true,
folder: 'releases' // Creates structure: releases/darwin/{arch}/files (separate builds for arm64 and x64)
repository: {
owner: 'rowboatlabs',
name: 'rowboat'
},
prerelease: true
}
}
],

View file

@ -6,9 +6,8 @@
"scripts": {
"start": "electron .",
"build": "rm -rf dist && tsc && node bundle.mjs",
"package": "electron-forge package --arch=arm64,x64 --platform=darwin",
"make": "electron-forge make --arch=arm64,x64 --platform=darwin",
"publish": "electron-forge publish --arch=arm64,x64 --platform=darwin"
"package": "electron-forge package",
"make": "electron-forge make"
},
"dependencies": {
"@x/core": "workspace:*",
@ -18,14 +17,15 @@
"zod": "^4.2.1"
},
"devDependencies": {
"@types/node": "^25.0.3",
"electron": "^39.2.7",
"esbuild": "^0.24.2",
"@electron-forge/cli": "^7.10.2",
"@electron-forge/maker-deb": "^7.10.2",
"@electron-forge/maker-dmg": "^7.10.2",
"@electron-forge/maker-squirrel": "^7.10.2",
"@electron-forge/maker-zip": "^7.10.2",
"@electron-forge/publisher-s3": "^7.10.2"
"@electron-forge/publisher-github": "^7.11.1",
"@electron-forge/publisher-s3": "^7.10.2",
"@types/node": "^25.0.3",
"electron": "^39.2.7",
"esbuild": "^0.24.2"
}
}

View file

@ -16,6 +16,9 @@ import { initConfigs } from "@x/core/dist/config/initConfigs.js";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
// run this as early in the main process as possible
if (require('electron-squirrel-startup')) app.quit();
// Path resolution differs between development and production:
const preloadPath = app.isPackaged
? path.join(__dirname, "../preload/dist/preload.js")
@ -115,8 +118,8 @@ app.whenReady().then(async () => {
if (app.isPackaged) {
updateElectronApp({
updateSource: {
type: UpdateSourceType.StaticStorage,
baseUrl: `https://rowboat-desktop-app-releases.s3.amazonaws.com/releases/${process.platform}/${process.arch}`,
type: UpdateSourceType.ElectronPublicUpdateService,
repo: "rowboatlabs/rowboat",
},
notifyUser: true, // Shows native dialog when update is available
});