import type { ForgeConfig } from "@electron-forge/shared-types"; import { MakerSquirrel } from "@electron-forge/maker-squirrel"; import { MakerZIP } from "@electron-forge/maker-zip"; import { MakerDeb } from "@electron-forge/maker-deb"; import { MakerRpm } from "@electron-forge/maker-rpm"; import { VitePlugin } from "@electron-forge/plugin-vite"; import { FusesPlugin } from "@electron-forge/plugin-fuses"; import { FuseV1Options, FuseVersion } from "@electron/fuses"; import { AutoUnpackNativesPlugin } from "@electron-forge/plugin-auto-unpack-natives"; // Based on https://github.com/electron/forge/blob/6b2d547a7216c30fde1e1fddd1118eee5d872945/packages/plugin/vite/src/VitePlugin.ts#L124 const ignore = (file: string) => { if (!file) return false; // `file` always starts with `/` // @see - https://github.com/electron/packager/blob/v18.1.3/src/copy-filter.ts#L89-L93 if (file === "/node_modules") { return false; } if (file.startsWith("/drizzle")) { return false; } if (file.startsWith("/scaffold")) { return false; } if (file.startsWith("/sandpack-generated")) { return false; } if (file.startsWith("/worker")) { return false; } if (file.startsWith("/node_modules/better-sqlite3")) { return false; } if (file.startsWith("/node_modules/bindings")) { return false; } if (file.startsWith("/node_modules/file-uri-to-path")) { return false; } if (file.startsWith("/.vite")) { return false; } return true; }; const config: ForgeConfig = { packagerConfig: { icon: "./assets/icon/logo", osxSign: { identity: process.env.APPLE_TEAM_ID, }, osxNotarize: { appleId: process.env.APPLE_ID!, appleIdPassword: process.env.APPLE_PASSWORD!, teamId: process.env.APPLE_TEAM_ID!, }, asar: true, ignore, // ignore: [/node_modules\/(?!(better-sqlite3|bindings|file-uri-to-path)\/)/], }, rebuildConfig: { extraModules: ["better-sqlite3"], force: true, }, makers: [ new MakerSquirrel({}), new MakerZIP({}, ["darwin"]), new MakerRpm({}), new MakerDeb({}), ], publishers: [ { name: "@electron-forge/publisher-github", config: { repository: { owner: "dyad-sh", name: "dyad", }, prerelease: true, }, }, ], plugins: [ new AutoUnpackNativesPlugin({}), new VitePlugin({ // `build` can specify multiple entry builds, which can be Main process, Preload scripts, Worker process, etc. // If you are familiar with Vite configuration, it will look really familiar. build: [ { // `entry` is just an alias for `build.lib.entry` in the corresponding file of `config`. entry: "src/main.ts", config: "vite.main.config.mts", target: "main", }, { entry: "src/preload.ts", config: "vite.preload.config.mts", target: "preload", }, ], renderer: [ { name: "main_window", config: "vite.renderer.config.mts", }, ], }), // Fuses are used to enable/disable various Electron functionality // at package time, before code signing the application new FusesPlugin({ version: FuseVersion.V1, [FuseV1Options.RunAsNode]: false, [FuseV1Options.EnableCookieEncryption]: true, [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false, [FuseV1Options.EnableNodeCliInspectArguments]: false, [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true, [FuseV1Options.OnlyLoadAppFromAsar]: true, }), ], }; export default config;