Files
5chan/forge.config.js
Tommaso CasaburiandGitHub a67c66de0d perf(electron): speed up Windows packaging with ASAR (#1190)
* perf(electron): package Windows app with ASAR

* fix(electron): use portable ASAR unpack glob

* fix(electron): unpack native modules from ASAR
2026-08-01 12:50:23 +02:00

133 lines
3.5 KiB
JavaScript

import { downloadIpfsClients } from './electron/before-pack.js';
// Sign and notarize the mac app only when Apple credentials are present (CI release
// builds); local builds without the certificate stay unsigned and keep working.
const shouldSignMac = process.platform === 'darwin' && !!process.env.APPLE_ID && !!process.env.APPLE_APP_SPECIFIC_PASSWORD && !!process.env.APPLE_TEAM_ID;
const config = {
packagerConfig: {
name: '5chan',
executableName: '5chan',
appBundleId: '5chan.desktop',
icon: './public/icon', // electron-forge adds the correct extension per platform
// Keep Squirrel from processing the deeply nested dependency tree as loose files.
// Kubo and native modules still need real filesystem paths at runtime.
asar: {
// Use forward slashes so minimatch also recognizes the glob on Windows.
unpackDir: 'bin/**/*',
},
// Exclude unnecessary files from the package
ignore: [
/^\/src$/,
/^\/public$/,
/^\/android$/,
/^\/\.github$/,
/^\/scripts$/,
/^\/\.git/,
/^\/\.pkc$/,
/^\/out$/,
/^\/dist$/,
/^\/squashfs-root$/,
/\.map$/,
/\.md$/,
/\.ts$/,
/tsconfig\.json$/,
/\.oxfmtrc/,
/oxlintrc/,
/vite\.config/,
/forge\.config/,
/capacitor\.config/,
/\.env$/,
/\.DS_Store$/,
/yarn\.lock$/,
// Exclude build-time scripts from the package
/electron\/before-pack\.js/,
// Exclude .bin directories anywhere in node_modules (contain escaping symlinks)
/node_modules\/.*\/\.bin/,
/node_modules\/\.bin/,
/node_modules\/\.cache/,
],
...(shouldSignMac && {
osxSign: {
// identity is auto-discovered from the keychain (the only Developer ID
// Application identity present, both locally and in the CI temp keychain)
optionsForFile: () => ({
hardenedRuntime: true,
entitlements: './electron/entitlements.plist',
}),
},
osxNotarize: {
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_APP_SPECIFIC_PASSWORD,
teamId: process.env.APPLE_TEAM_ID,
},
}),
},
rebuildConfig: {
// Only better-sqlite3 is intentionally prepared and verified before packaging.
// Using `onlyModules` prevents Forge from rebuilding unrelated optional addons
// that inflate Windows package times.
onlyModules: ['better-sqlite3'],
},
hooks: {
// Download IPFS/Kubo binaries before packaging
generateAssets: async () => {
console.log('Downloading IPFS clients...');
await downloadIpfsClients();
console.log('IPFS clients downloaded.');
},
},
plugins: [
{
name: '@electron-forge/plugin-auto-unpack-natives',
config: {},
},
],
makers: [
// macOS
{
name: '@electron-forge/maker-dmg',
platforms: ['darwin'],
config: {
name: '5chan',
icon: './public/icon.icns',
format: 'ULFO',
},
},
{
name: '@electron-forge/maker-zip',
platforms: ['darwin'],
},
// Windows
{
name: '@electron-forge/maker-squirrel',
platforms: ['win32'],
config: {
name: '5chan',
setupIcon: './public/windows-icon.ico',
},
},
// Linux
{
name: '@reforged/maker-appimage',
platforms: ['linux'],
config: {
options: {
name: '5chan',
icon: './public/icon.png',
categories: ['Network'],
},
},
},
],
};
export default config;