/ forge.config.ts
forge.config.ts
  1  import type { ForgeConfig } from '@electron-forge/shared-types';
  2  import { MakerSquirrel } from '@electron-forge/maker-squirrel';
  3  import { MakerZIP } from '@electron-forge/maker-zip';
  4  import { MakerDeb } from '@electron-forge/maker-deb';
  5  import { MakerRpm } from '@electron-forge/maker-rpm';
  6  import { MakerDMG } from '@electron-forge/maker-dmg';
  7  import { AutoUnpackNativesPlugin } from '@electron-forge/plugin-auto-unpack-natives';
  8  import { WebpackPlugin } from '@electron-forge/plugin-webpack';
  9  import { PublisherGithub } from '@electron-forge/publisher-github';
 10  import fs from 'fs';
 11  import { exec } from 'child_process';
 12  
 13  import { mainConfig, mainDevConfig } from './webpack.main.config';
 14  import { rendererConfig } from './webpack.renderer.config';
 15  
 16  const config: ForgeConfig = {
 17    packagerConfig: {
 18      asar: true,
 19      name: 'morpheus',
 20      extraResource: ['./executables/'],
 21      icon: 'src/frontend/assets/images/circle-mor-logo',
 22      osxSign: {
 23        identity: process.env.APPLE_DEVELOPER_ID,
 24        optionsForFile: () => {
 25          return {
 26            entitlements: './entitlements.plist',
 27          };
 28        },
 29      },
 30      ...(process.env.APPLE_ID &&
 31        process.env.APPLE_ID_PASSWORD &&
 32        process.env.APPLE_TEAM_ID && {
 33        osxNotarize: {
 34          appleId: process.env.APPLE_ID,
 35          appleIdPassword: process.env.APPLE_ID_PASSWORD,
 36          teamId: process.env.APPLE_TEAM_ID,
 37        },
 38      }),
 39    },
 40    hooks: {
 41      prePackage: async (_, platform) => {
 42        const platformFile =
 43          platform === 'darwin'
 44            ? 'ollama-darwin'
 45            : platform === 'win32'
 46              ? 'ollama.exe'
 47              : 'ollama-linux';
 48  
 49        const filePath = `src/executables/${platformFile}`;
 50  
 51        platform !== 'win32'
 52          ? exec(`chmod +x ${filePath}`)
 53          : fs.chmodSync(filePath, 755);
 54  
 55        fs.mkdirSync('executables');
 56        fs.copyFileSync(filePath, `executables/${platformFile}`);
 57      },
 58      postPackage: async () => {
 59        fs.rmSync('executables', { recursive: true, force: true });
 60      }
 61    },
 62    rebuildConfig: {},
 63    makers: [
 64      new MakerSquirrel({
 65        setupIcon: 'src/frontend/assets/images/circle-mor-logo.ico',
 66      }),
 67      new MakerZIP({}, ['darwin']),
 68      new MakerRpm({}),
 69      new MakerDeb({
 70        options: {
 71          icon: 'src/frontend/assets/images/MOR_logo_circle.iconset/icon_512x512.png',
 72          maintainer: 'Morpheus',
 73          homepage: 'https://www.mor.org',
 74          categories: ['Utility'],
 75        },
 76      }),
 77      new MakerDMG({
 78        icon: 'src/frontend/assets/images/circle-mor-logo.icns',
 79        format: 'ULFO',
 80        background: 'src/frontend/assets/images/dmgbg.svg',
 81        overwrite: true,
 82        additionalDMGOptions: {
 83          window: {
 84            size: {
 85              width: 600,
 86              height: 600,
 87            },
 88          },
 89        },
 90      }),
 91    ],
 92    publishers: [
 93      new PublisherGithub({
 94        repository: {
 95          owner: 'MorpheusAIs',
 96          name: 'Node',
 97        },
 98        draft: true,
 99      }),
100    ],
101    plugins: [
102      new AutoUnpackNativesPlugin({}),
103      new WebpackPlugin({
104        mainConfig: process.env.NODE_ENV === 'development' ? mainDevConfig : mainConfig,
105        devContentSecurityPolicy:
106          "connect-src 'self' unsafe-inline ws://localhost:* https://metamask-sdk-socket.metafi.codefi.network wss://metamask-sdk-socket.metafi.codefi.network data:",
107        renderer: {
108          config: rendererConfig,
109          entryPoints: [
110            {
111              html: './src/backend/index.html',
112              js: './src/backend/renderer.ts',
113              name: 'main_window',
114              preload: {
115                js: './src/backend/preload.ts',
116              },
117            },
118          ],
119        },
120      }),
121    ],
122  };
123  
124  export default config;