diff --git a/.gitignore b/.gitignore index e2cb697..431dd18 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,15 @@ env.bak/ venv.bak/ .venv/ +# Legacy Electron Forge in-repo temp (see scripts/electron-forge-local-tmp.js) +.forge-tmp/ + +# flatpak-builder / snapcraft working trees (large; may contain root-owned cache) +.flatpak-builder/ +parts/ +prime/ +stage/ + # Build files /build/ /dist/ diff --git a/forge.config.js b/forge.config.js index e1435a5..a2e5ffa 100644 --- a/forge.config.js +++ b/forge.config.js @@ -1,5 +1,21 @@ const { FusesPlugin } = require("@electron-forge/plugin-fuses"); const { FuseV1Options, FuseVersion } = require("@electron/fuses"); +const which = require("which"); + +function hasExecutable(name) { + return which.sync(name, { nothrow: true }) !== null; +} + +const forgeSnapExplicit = + process.env.FORGE_MAKE_SNAP === "1" || process.env.FORGE_MAKE_SNAP === "true"; +const forgeFlatpakExplicit = + process.env.FORGE_MAKE_FLATPAK === "1" || + process.env.FORGE_MAKE_FLATPAK === "true"; + +const forgeSnapEnabled = hasExecutable("snapcraft") || forgeSnapExplicit; +const forgeFlatpakEnabled = + (hasExecutable("flatpak-builder") && hasExecutable("eu-strip")) || + forgeFlatpakExplicit; const platform = process.env.PLATFORM || process.platform; const arch = process.env.ARCH || process.arch; @@ -13,6 +29,13 @@ if (platform === "win32" || platform === "win") { module.exports = { packagerConfig: { asar: true, + ignore: [ + /^\/\.flatpak-builder(\/|$)/, + /^\/\.snapcraft(\/|$)/, + /^\/parts(\/|$)/, + /^\/prime(\/|$)/, + /^\/stage(\/|$)/, + ], extraResource: [extraResourceDir], executableName: "reticulum-meshchatx", name: "Reticulum MeshChatX", @@ -46,8 +69,24 @@ module.exports = { name: "@electron-forge/maker-rpm", config: {}, }, + { + name: "@electron-forge/maker-snap", + enabled: forgeSnapEnabled, + config: { + summary: "Mesh networking chat client", + description: + "A simple mesh network communications app powered by the Reticulum Network Stack", + confinement: "strict", + grade: "devel", + features: { + audio: true, + webgl: true, + }, + }, + }, { name: "@electron-forge/maker-flatpak", + enabled: forgeFlatpakEnabled, config: { options: { categories: ["Network"], @@ -56,6 +95,19 @@ module.exports = { sdk: "org.freedesktop.Sdk", base: "org.electronjs.Electron2.BaseApp", baseVersion: "24.08", + finishArgs: [ + "--share=ipc", + "--share=network", + "--socket=x11", + "--socket=wayland", + "--device=dri", + "--allow=bluetooth", + "--filesystem=home", + "--talk-name=org.freedesktop.Notifications", + "--env=TMPDIR=/var/tmp", + "--socket=pulseaudio", + ], + extraFlatpakBuilderArgs: ["--verbose"], }, }, }, diff --git a/package.json b/package.json index 45cdc5c..4756622 100644 --- a/package.json +++ b/package.json @@ -39,15 +39,17 @@ "dist:windows": "pnpm run electron-postinstall && cross-env PLATFORM=win32 pnpm run build && electron-builder --win portable nsis --publish=never", "dist:win-x64": "pnpm run electron-postinstall && cross-env PLATFORM=win32 ARCH=x64 pnpm run build && electron-builder --win portable nsis --x64 --publish=never", "dist:win-arm64": "pnpm run electron-postinstall && cross-env PLATFORM=win32 ARCH=arm64 pnpm run build && electron-builder --win portable nsis --arm64 --publish=never", - "dist:zip": "pnpm run electron-postinstall && pnpm run build && electron-forge make --targets @electron-forge/maker-zip", + "dist:zip": "pnpm run electron-postinstall && pnpm run build && node scripts/electron-forge-local-tmp.js make --targets @electron-forge/maker-zip", "dist-prebuilt": "pnpm run electron-postinstall && pnpm run build-backend && electron-builder --publish=never", "dist:windows-prebuilt": "pnpm run electron-postinstall && cross-env PLATFORM=win32 pnpm run version:sync && cross-env PLATFORM=win32 pnpm run build-backend && electron-builder --win portable nsis --publish=never", "dist:linux-prebuilt": "pnpm run electron-postinstall && cross-env PLATFORM=linux pnpm run version:sync && cross-env PLATFORM=linux pnpm run build-backend && electron-builder --linux AppImage deb --publish=never", "dist:mac-arm64": "pnpm run electron-postinstall && pnpm run build && electron-builder --mac --arm64 --publish=never", "dist:mac-universal": "bash scripts/build-macos-universal.sh", - "start": "pnpm run build && electron-forge start", - "package": "pnpm run build && electron-forge package", - "make": "pnpm run build && electron-forge make" + "start": "pnpm run build && node scripts/electron-forge-local-tmp.js start", + "package": "pnpm run build && node scripts/electron-forge-local-tmp.js package", + "make": "pnpm run build && node scripts/electron-forge-local-tmp.js make", + "make:snap": "pnpm run electron-postinstall && pnpm run build && cross-env FORGE_MAKE_SNAP=1 node scripts/electron-forge-local-tmp.js make --targets @electron-forge/maker-snap", + "make:flatpak": "pnpm run electron-postinstall && pnpm run build && cross-env DEBUG=@malept/flatpak-bundler*,electron-installer-flatpak* FORGE_MAKE_FLATPAK=1 node scripts/electron-forge-local-tmp.js make --targets @electron-forge/maker-flatpak" }, "license": "0BSD AND MIT", "engines": { @@ -59,6 +61,7 @@ "@electron-forge/maker-deb": "^7.11.1", "@electron-forge/maker-flatpak": "^7.11.1", "@electron-forge/maker-rpm": "^7.11.1", + "@electron-forge/maker-snap": "^7.11.1", "@electron-forge/maker-squirrel": "^7.11.1", "@electron-forge/maker-zip": "^7.11.1", "@electron-forge/plugin-auto-unpack-natives": "^7.11.1", @@ -106,6 +109,7 @@ "tmp": ">=0.2.4", "tar": ">=7.5.7", "minimatch": ">=10.2.1", + "@electron/asar>minimatch": "3.1.2", "serialize-javascript": ">=7.0.3", "flatted": ">=3.4.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 871d3f3..16bd449 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,7 @@ overrides: tmp: '>=0.2.4' tar: '>=7.5.7' minimatch: '>=10.2.1' + '@electron/asar>minimatch': 3.1.2 serialize-javascript: '>=7.0.3' flatted: '>=3.4.2' @@ -95,6 +96,9 @@ importers: '@electron-forge/maker-rpm': specifier: ^7.11.1 version: 7.11.1 + '@electron-forge/maker-snap': + specifier: ^7.11.1 + version: 7.11.1 '@electron-forge/maker-squirrel': specifier: ^7.11.1 version: 7.11.1 @@ -314,6 +318,10 @@ packages: resolution: {integrity: sha512-iEfJPRQQyaTqk2EbUfZgulChNWvxGXeYUH0xBX/r5cj1pL4vcJXt3jLMQBVn3mk/0Ytv9UWRs8R/XuNWX6sf2w==} engines: {node: '>= 16.4.0'} + '@electron-forge/maker-snap@7.11.1': + resolution: {integrity: sha512-VNWSLH+eT8OctTWL3Q7VMSlu0mIiaa2aSJFFXBJZWgpBgYjQdeT6i1RWRD/FsuYkk1naix68LeRzb9V4TlShKA==} + engines: {node: '>= 16.4.0'} + '@electron-forge/maker-squirrel@7.11.1': resolution: {integrity: sha512-oSg7fgad6l+X0DjtRkSpMzB0AjzyDO4mb2gzM4kTodkP1ADeiMi08bxy0ZeCESqLm5+fG72cAPmEr3BAPvI1yw==} engines: {node: '>= 16.4.0'} @@ -1160,6 +1168,9 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1203,6 +1214,9 @@ packages: peerDependencies: postcss: ^8.1.0 + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} @@ -1238,6 +1252,9 @@ packages: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} @@ -1437,6 +1454,9 @@ packages: compressorjs@1.3.0: resolution: {integrity: sha512-TsvzkRgDm/6mIRUdxJbrTH7kfSW3oJzOw8b1xU60fziQSosTML5TczpO6Z4H1LGF0yRmTotk6r5UNhuRxEwA1A==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -1621,6 +1641,11 @@ packages: os: [darwin, linux] hasBin: true + electron-installer-snap@5.2.0: + resolution: {integrity: sha512-SRm7pCpNHMXV545JjScV8fLC9NhFli5r8L8Ju4EHdXwRh76+mwrJoUEDLItixBudZ5Mcgz1SJcDPJfWpEQWX7Q==} + engines: {node: '>= 10.0'} + hasBin: true + electron-prompt@1.7.0: resolution: {integrity: sha512-IfqJYEgcRO6NuyPROo8AtdkAiZ6N9I1lQEf4dJAkPuhV5YgOHdmLqZJf6OXumZJfzrjpzCM5jHeYOrhGdgbnEA==} @@ -1781,6 +1806,11 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -2300,6 +2330,10 @@ packages: js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true @@ -2595,6 +2629,9 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -3330,6 +3367,9 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} @@ -4153,6 +4193,16 @@ snapshots: - bluebird - supports-color + '@electron-forge/maker-snap@7.11.1': + dependencies: + '@electron-forge/maker-base': 7.11.1 + '@electron-forge/shared-types': 7.11.1 + optionalDependencies: + electron-installer-snap: 5.2.0 + transitivePeerDependencies: + - bluebird + - supports-color + '@electron-forge/maker-squirrel@7.11.1': dependencies: '@electron-forge/maker-base': 7.11.1 @@ -4279,7 +4329,7 @@ snapshots: dependencies: commander: 5.1.0 glob: 7.2.3 - minimatch: 10.2.5 + minimatch: 3.1.2 '@electron/fuses@1.8.0': dependencies: @@ -5292,6 +5342,11 @@ snapshots: arg@5.0.2: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + optional: true + argparse@2.0.1: {} assert-plus@1.0.0: @@ -5327,6 +5382,8 @@ snapshots: postcss: 8.5.10 postcss-value-parser: 4.2.0 + balanced-match@1.0.2: {} + balanced-match@4.0.4: {} base64-js@1.5.1: {} @@ -5354,6 +5411,11 @@ snapshots: boolean@3.2.0: optional: true + brace-expansion@1.1.14: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 @@ -5588,6 +5650,8 @@ snapshots: blueimp-canvas-to-blob: 3.29.0 is-blob: 2.1.0 + concat-map@0.0.1: {} + config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -5825,6 +5889,22 @@ snapshots: - supports-color optional: true + electron-installer-snap@5.2.0: + dependencies: + '@malept/cross-spawn-promise': 1.1.1 + debug: 4.4.3 + electron-installer-common: 0.10.4 + fs-extra: 9.1.0 + js-yaml: 3.14.2 + lodash: 4.18.1 + semver: 7.7.4 + tmp-promise: 3.0.3 + which: 2.0.2 + yargs: 16.2.0 + transitivePeerDependencies: + - supports-color + optional: true + electron-prompt@1.7.0: {} electron-publish@26.8.1: @@ -6012,6 +6092,9 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 + esprima@4.0.1: + optional: true + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -6562,6 +6645,12 @@ snapshots: js-tokens@10.0.0: {} + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + optional: true + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -6853,6 +6942,10 @@ snapshots: dependencies: brace-expansion: 5.0.5 + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.14 + minimist@1.2.8: {} minipass-collect@1.0.2: @@ -7544,6 +7637,9 @@ snapshots: spdx-license-ids@3.0.23: {} + sprintf-js@1.0.3: + optional: true + sprintf-js@1.1.3: optional: true