[ADD] electron: own shell, portable Windows exe built under podman
The deliverable is a single-file portable executable whose Electron the
project updates itself. The shell keeps context isolation on, Node
integration off and the page sandboxed; one IPC channel returns the
folder the portable launcher publishes. The build runs in a no-Wine image
pinned by digest, relays no host variable, refuses to overwrite a built
number, removes what a failed build leaves, and accepts only the name
version.json gives. The spec stops claiming the portable target needs
Wine.
Checked: exe built in 86 s, resource FileVersion 2026.1005.1.0 and
© 2026 TechnoLibre; 109 node tests pass; two end-of-build mutations fail.
--- FR ---
[ADD] electron : coquille propre, exécutable portable construit sous podman
Le livrable est un exécutable portable à fichier unique, dont le projet
met lui-même Electron à jour. La coquille garde l'isolation de contexte,
coupe l'intégration de Node et isole la page ; un seul canal IPC rend le
dossier que publie le lanceur portable. La construction s'exécute dans
une image sans Wine épinglée par empreinte, ne relaie aucune variable de
l'hôte, refuse d'écraser un numéro construit, retire ce qu'un échec
laisse, et n'accepte que le nom que donne version.json. Le spec cesse
d'affirmer que la cible portable exige Wine.
Vérifié : exécutable construit en 86 s, ressource FileVersion
2026.1005.1.0 et © 2026 TechnoLibre ; 109 épreuves node passent ; deux
mutations du contrôle de fin échouent.
Assisted-by: Claude Opus 5.5
2026-10-05 13:13:32 -04:00
|
|
|
// © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
|
|
|
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
|
|
|
|
|
|
|
|
|
// Processus principal de la coquille Electron (§ 13.1) : une fenêtre qui
|
|
|
|
|
// charge la page construite par Vite dans www/, et un seul canal IPC, que
|
|
|
|
|
// electron/preload.cjs expose à la page sous window.gtt.
|
|
|
|
|
//
|
|
|
|
|
// La page n'a ni Node ni accès au disque : isolation de contexte active,
|
|
|
|
|
// intégration de Node coupée, rendu en bac à sable. Elle n'atteint le
|
|
|
|
|
// processus principal que par les canaux que ce module traite. Un nom importé
|
|
|
|
|
// interprété comme du balisage reste ainsi une faute d'affichage, et non un
|
|
|
|
|
// accès au disque.
|
[FIX] electron: remove Electron's default English application menu
Without a menu set by the application, Electron installs its own: in
English, while the interface is French, and offering Reload and the
developer tools to the operator. The shell now sets a null menu before
its first window, which also removes the menu bar on Windows.
Checked: the shell test fails without the call and passes with it; the
rebuilt exe, run under Wine 11, shows the version banner and no menu bar.
--- FR ---
[FIX] electron : retirer le menu anglais par défaut d'Electron
Sans menu posé par l'application, Electron installe le sien : en
anglais, alors que l'interface est en français, et offrant à l'opérateur
le rechargement et les outils de développement. La coquille pose
désormais un menu nul avant sa première fenêtre, ce qui retire aussi la
barre de menu sous Windows.
Vérifié : l'épreuve de la coquille échoue sans l'appel et passe avec ;
l'exécutable reconstruit, lancé sous Wine 11, montre le bandeau de
version et aucune barre de menu.
Assisted-by: Claude Opus 5.5
2026-10-05 13:47:16 -04:00
|
|
|
import { app, BrowserWindow, ipcMain, Menu } from 'electron';
|
[ADD] electron: own shell, portable Windows exe built under podman
The deliverable is a single-file portable executable whose Electron the
project updates itself. The shell keeps context isolation on, Node
integration off and the page sandboxed; one IPC channel returns the
folder the portable launcher publishes. The build runs in a no-Wine image
pinned by digest, relays no host variable, refuses to overwrite a built
number, removes what a failed build leaves, and accepts only the name
version.json gives. The spec stops claiming the portable target needs
Wine.
Checked: exe built in 86 s, resource FileVersion 2026.1005.1.0 and
© 2026 TechnoLibre; 109 node tests pass; two end-of-build mutations fail.
--- FR ---
[ADD] electron : coquille propre, exécutable portable construit sous podman
Le livrable est un exécutable portable à fichier unique, dont le projet
met lui-même Electron à jour. La coquille garde l'isolation de contexte,
coupe l'intégration de Node et isole la page ; un seul canal IPC rend le
dossier que publie le lanceur portable. La construction s'exécute dans
une image sans Wine épinglée par empreinte, ne relaie aucune variable de
l'hôte, refuse d'écraser un numéro construit, retire ce qu'un échec
laisse, et n'accepte que le nom que donne version.json. Le spec cesse
d'affirmer que la cible portable exige Wine.
Vérifié : exécutable construit en 86 s, ressource FileVersion
2026.1005.1.0 et © 2026 TechnoLibre ; 109 épreuves node passent ; deux
mutations du contrôle de fin échouent.
Assisted-by: Claude Opus 5.5
2026-10-05 13:13:32 -04:00
|
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
|
|
|
|
|
|
// Chemins relatifs à ce module : ils valent dans le dépôt comme dans
|
|
|
|
|
// l'archive app.asar de l'exécutable, qui reproduit electron/ et www/.
|
|
|
|
|
const PRECHARGEMENT = fileURLToPath(new URL('./preload.cjs', import.meta.url));
|
|
|
|
|
const PAGE = fileURLToPath(new URL('../www/index.html', import.meta.url));
|
|
|
|
|
|
|
|
|
|
// Dossier de l'exécutable livré (§ 8.6, point 1). L'exécutable portable est
|
|
|
|
|
// une archive auto-extractible : l'application tourne depuis un dossier
|
|
|
|
|
// temporaire effacé à la sortie, et le lanceur publie son propre dossier dans
|
|
|
|
|
// PORTABLE_EXECUTABLE_DIR avant de la lancer. Hors de ce lanceur, la variable
|
|
|
|
|
// est absente ; vide, elle ne désigne aucun dossier. Dans les deux cas, le
|
|
|
|
|
// canal rend null. Le gestionnaire est posé avant le chargement de la page,
|
|
|
|
|
// qui peut l'appeler dès son premier script.
|
|
|
|
|
ipcMain.handle('gtt:dossier-executable', () => process.env.PORTABLE_EXECUTABLE_DIR || null);
|
|
|
|
|
|
|
|
|
|
function creerFenetre() {
|
|
|
|
|
const fenetre = new BrowserWindow({
|
|
|
|
|
width: 1366,
|
|
|
|
|
height: 768,
|
|
|
|
|
webPreferences: {
|
|
|
|
|
preload: PRECHARGEMENT,
|
|
|
|
|
contextIsolation: true,
|
|
|
|
|
nodeIntegration: false,
|
|
|
|
|
sandbox: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
// La page ne quitte jamais www/ : toute nouvelle fenêtre est refusée, toute
|
|
|
|
|
// navigation annulée, quelle que soit sa cible.
|
|
|
|
|
fenetre.webContents.setWindowOpenHandler(() => ({ action: 'deny' }));
|
|
|
|
|
fenetre.webContents.on('will-navigate', (evenement) => evenement.preventDefault());
|
|
|
|
|
fenetre.loadFile(PAGE);
|
|
|
|
|
}
|
|
|
|
|
|
[FIX] electron: remove Electron's default English application menu
Without a menu set by the application, Electron installs its own: in
English, while the interface is French, and offering Reload and the
developer tools to the operator. The shell now sets a null menu before
its first window, which also removes the menu bar on Windows.
Checked: the shell test fails without the call and passes with it; the
rebuilt exe, run under Wine 11, shows the version banner and no menu bar.
--- FR ---
[FIX] electron : retirer le menu anglais par défaut d'Electron
Sans menu posé par l'application, Electron installe le sien : en
anglais, alors que l'interface est en français, et offrant à l'opérateur
le rechargement et les outils de développement. La coquille pose
désormais un menu nul avant sa première fenêtre, ce qui retire aussi la
barre de menu sous Windows.
Vérifié : l'épreuve de la coquille échoue sans l'appel et passe avec ;
l'exécutable reconstruit, lancé sous Wine 11, montre le bandeau de
version et aucune barre de menu.
Assisted-by: Claude Opus 5.5
2026-10-05 13:47:16 -04:00
|
|
|
// Sans menu posé par l'application, Electron installe le sien : en anglais,
|
|
|
|
|
// alors que l'interface est en français (§ 2), et porteur de « Reload » et
|
|
|
|
|
// des outils de développement. null le retire, et retire avec lui la barre
|
|
|
|
|
// de menu des fenêtres sous Windows et Linux ; il est posé avant la première
|
|
|
|
|
// fenêtre, qui naîtrait sinon avec la barre.
|
|
|
|
|
app.whenReady().then(() => {
|
|
|
|
|
Menu.setApplicationMenu(null);
|
|
|
|
|
creerFenetre();
|
|
|
|
|
});
|