WAS: `npm run klick` startet das ECHTE Rippy (Electron, Haupt, Kern, Fenster, Datenbank) mit eigenem Profil (--profil, --klick-smoke: ohne Tray, Updater, Toasts), einem nachgebauten Laufwerk (RIPPY_FAKE_LAUFWERK) und nachgebauten Werkzeugen (bau/klick/fake-*.cjs) — und klickt sich durch: Rippen → Dialog → Sprachen je Titel (jpn statt deu) → Rollen auf Folge → Staffel 1, ab Folge 3 → Vorschau → Rip → Warteschlange → Kompression → Ablage als S01E03/S01E04 unter Serien\…\Season 01 → Einstellungen/Roh-Dateien → Roh loeschen → Ereignisse. Bilder liegen in beweise/klick/. Die Naht dafuer (kern/werkzeuge/aufruf.ts): Zeigt ein Werkzeug-Pfad auf ein Node-Skript, laeuft es ueber die eigene Laufzeit (ELECTRON_RUN_AS_NODE) — fuer EXE-Pfade aendert sich nichts. WARUM: Beide Fehler vom 01.09.2026 waren Verkabelung; 261 Unit-Tests sahen keinen. Der Klick-Beweis haette beide gefunden. NEBENBEFUND: Die CSP blockte eingebettete Schrift-Teile (data:-Fonts der fontsource-Pakete) — Konsolenfehler im gebauten Fenster, jetzt font-src. Dazu test/messung.spuren.test.ts: HandBrake-Scan einer echten Roh-Datei auf Verlangen (RIPPY_MESSUNG_MKV). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
71 lines
2.5 KiB
TypeScript
71 lines
2.5 KiB
TypeScript
// Bau-Konfiguration für die drei Prozesse (KONZEPT-WINDOWS.md § 4.1):
|
|
// haupt → out/haupt/index.js (Electron Main)
|
|
// kern → out/haupt/kern.js (utilityProcess — als zweiter Eintrag im
|
|
// selben Node-Bau, weil er dieselbe Umgebung hat wie haupt)
|
|
// bruecke → out/bruecke/index.js (Preload des Fensters)
|
|
// fenster → out/fenster/ (React)
|
|
// externalizeDepsPlugin hält "dependencies" (koffi — natives Modul) aus dem
|
|
// Bündel heraus; sie werden zur Laufzeit aus node_modules geladen.
|
|
import { resolve } from 'node:path'
|
|
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
|
|
import react from '@vitejs/plugin-react'
|
|
import tailwindcss from '@tailwindcss/vite'
|
|
import type { Plugin } from 'vite'
|
|
|
|
// Strikte CSP fürs GEBAUTE Fenster (lädt nur eigene Dateien). Nur im Bau:
|
|
// Der Dev-Server braucht Inline-Skripte (react-refresh) und WebSocket (HMR),
|
|
// eine Dev-CSP bräche also genau das Werkzeug, das sie schützen soll.
|
|
// Ob die Seite unter der CSP vollständig läuft, misst der Smoke-Lauf —
|
|
// blockte sie das Skript, käme kein Pong und der Lauf würde rot.
|
|
function cspNurImBau(): Plugin {
|
|
return {
|
|
name: 'csp-nur-im-bau',
|
|
apply: 'build',
|
|
transformIndexHtml(html) {
|
|
return html.replace(
|
|
'<head>',
|
|
// img-src erlaubt TMDb-Poster (Kachel + Ändern-Dialog) — sonst
|
|
// bleibt alles bei 'self'. font-src data: (5.4.0, im Klick-Beweis
|
|
// gesehen): Vite bettet kleine Schrift-Teile der fontsource-Pakete
|
|
// als data:-URI ein, und die blockte die CSP — als Fehler in der
|
|
// Konsole, unsichtbar im Fenster.
|
|
`<head>\n <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' data: https://image.tmdb.org; font-src 'self' data:" />`,
|
|
)
|
|
},
|
|
}
|
|
}
|
|
|
|
export default defineConfig({
|
|
main: {
|
|
plugins: [externalizeDepsPlugin()],
|
|
build: {
|
|
outDir: 'out/haupt',
|
|
rollupOptions: {
|
|
input: {
|
|
index: resolve(__dirname, 'src/haupt/index.ts'),
|
|
kern: resolve(__dirname, 'src/kern/index.ts'),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
preload: {
|
|
plugins: [externalizeDepsPlugin()],
|
|
build: {
|
|
outDir: 'out/bruecke',
|
|
rollupOptions: {
|
|
input: { index: resolve(__dirname, 'src/bruecke/index.ts') },
|
|
},
|
|
},
|
|
},
|
|
renderer: {
|
|
root: 'src/fenster',
|
|
plugins: [react(), tailwindcss(), cspNurImBau()],
|
|
build: {
|
|
outDir: 'out/fenster',
|
|
rollupOptions: {
|
|
input: { index: resolve(__dirname, 'src/fenster/index.html') },
|
|
},
|
|
},
|
|
},
|
|
})
|