sanctum/forge.config.ts

161 lines
4.5 KiB
TypeScript

import { MakerAppX } from "@electron-forge/maker-appx";
import { MakerDeb } from "@electron-forge/maker-deb";
import { MakerFlatpak } from "@electron-forge/maker-flatpak";
import { MakerFlatpakOptionsConfig } from "@electron-forge/maker-flatpak/dist/Config";
import { MakerSquirrel } from "@electron-forge/maker-squirrel";
import { MakerZIP } from "@electron-forge/maker-zip";
import { FusesPlugin } from "@electron-forge/plugin-fuses";
import { VitePlugin } from "@electron-forge/plugin-vite";
import { VitePluginBuildConfig } from "@electron-forge/plugin-vite/dist/Config";
import type { ForgeConfig } from "@electron-forge/shared-types";
import { FuseV1Options, FuseVersion } from "@electron/fuses";
import * as fs from "fs";
const STRINGS = {
author: "izzy",
name: "Sanctum",
execName: "sanctum",
description: "Open source user-first chat platform.",
};
const ASSET_DIR = "assets/desktop";
const AVIA_ASSET_DIR = "avia_assets";
const makers: ForgeConfig["makers"] = [
new MakerSquirrel({
name: STRINGS.name,
authors: STRINGS.author,
iconUrl: `https://stoat.chat/app/assets/icon-DUSNE-Pb.ico`,
setupIcon: `${AVIA_ASSET_DIR}/icon.ico`,
description: STRINGS.description,
exe: `${STRINGS.execName}.exe`,
setupExe: `${STRINGS.execName}-setup.exe`,
copyright: "Copyright (C) 2025 Revolt Platforms LTD",
}),
new MakerZIP({}),
];
if (!process.env.PLATFORM) {
makers.push(
new MakerAppX({
certPass: "",
packageExecutable: `app\\${STRINGS.execName}.exe`,
publisher: "CN=B040CC7E-0016-4AF5-957F-F8977A6CFA3B",
}),
new MakerFlatpak({
options: {
id: "cloud.mithraic.sanctum",
description: STRINGS.description,
productName: STRINGS.name,
productDescription: STRINGS.description,
runtimeVersion: "25.08",
icon: {
"16x16": `${ASSET_DIR}/hicolor/16x16.png`,
"32x32": `${ASSET_DIR}/hicolor/32x32.png`,
"64x64": `${ASSET_DIR}/hicolor/64x64.png`,
"128x128": `${ASSET_DIR}/hicolor/128x128.png`,
"256x256": `${ASSET_DIR}/hicolor/256x256.png`,
"512x512": `${ASSET_DIR}/hicolor/512x512.png`,
} as unknown,
categories: ["Network"],
modules: [
{
name: "zypak",
sources: [
{
type: "git",
url: "https://github.com/refi64/zypak",
tag: "v2025.09",
},
],
},
],
finishArgs: [
"--socket=fallback-x11",
"--share=ipc",
"--device=dri",
"--socket=pulseaudio",
"--filesystem=home",
"--env=TMPDIR=/var/tmp",
"--share=network",
"--talk-name=org.freedesktop.Notifications",
"--talk-name=com.canonical.Unity",
],
files: [],
} as MakerFlatpakOptionsConfig,
}),
new MakerDeb({
options: {
productName: STRINGS.name,
productDescription: STRINGS.description,
categories: ["Network"],
icon: `${AVIA_ASSET_DIR}/icon.png`,
},
}),
);
}
const customVitePluginBuild: VitePluginBuildConfig[] = [
{
entry: "avia_assets/icon.png",
config: "vite.main.config.ts",
target: "main",
},
{
entry: "about.html",
config: "vite.main.config.ts",
target: "main",
},
{
entry: "src/main.ts",
config: "vite.main.config.ts",
target: "main",
},
{
entry: "src/preload.ts",
config: "vite.preload.config.ts",
target: "preload",
},
];
fs.readdir("avia_core", (err: NodeJS.ErrnoException, files: string[]) => {
if (err) return;
for (const file of files) {
if (["js", "ts", "tsx"].includes(file.split(".").pop().toLowerCase())) {
customVitePluginBuild.push({
entry: `avia_core/${file}`,
config: "vite.main.config.ts",
target: "main",
});
}
}
});
const config: ForgeConfig = {
packagerConfig: {
asar: true,
name: STRINGS.name,
executableName: STRINGS.execName,
icon: `${AVIA_ASSET_DIR}/icon`,
},
rebuildConfig: {},
makers,
plugins: [
new VitePlugin({
build: customVitePluginBuild,
renderer: [],
}),
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;