// EINE Stelle, an der Werkzeuge gestartet werden (5.4.0) — mit einer Naht // für den Klick-Beweis (bau/klick-smoke.mjs): Zeigt der eingestellte // Werkzeug-Pfad auf ein Node-Skript (.cjs/.js), läuft es über die eigene // Node-Laufzeit (ELECTRON_RUN_AS_NODE, Electron-Doku »Environment // Variables«) statt als EXE. So klickt der Beweis durch das ECHTE Programm // — Fenster, Kern, Datenbank, Warteschlange — nur makemkvcon und HandBrake // sind nachgebaut. Für echte EXE-Pfade ändert sich nichts. // // Warum nicht einfach eine .cmd: Node weigert sich seit 18.20/20.12, // .bat/.cmd ohne Shell zu starten (CVE-2024-27980) — und mit Shell wären // Pfade mit Leerzeichen wieder eine Falle. import { spawn } from 'node:child_process' export function istSkript(programm: string): boolean { const p = programm.toLowerCase() return p.endsWith('.cjs') || p.endsWith('.mjs') || p.endsWith('.js') } /** Programm + Argumente, so wie spawn sie bekommen soll. */ export function werkzeugStart( programm: string, args: readonly string[], umgebung: NodeJS.ProcessEnv = process.env, ): { programm: string; args: string[]; env: NodeJS.ProcessEnv } { if (!istSkript(programm)) return { programm, args: [...args], env: umgebung } return { programm: process.execPath, args: [programm, ...args], env: { ...umgebung, ELECTRON_RUN_AS_NODE: '1' }, } } /** spawn mit der Naht — dieselbe Signatur, dieselben Typen. */ export const werkzeugSpawn: typeof spawn = ((programm: string, args: readonly string[], optionen: Record) => { const start = werkzeugStart(programm, args) return spawn(start.programm, start.args, { ...optionen, env: start.env }) }) as typeof spawn