Electron 44 + TypeScript, drei Prozesse (haupt / kern als utilityProcess / fenster mit React), Nachrichten-Schema mit Pruef-Funktionen, node:sqlite als einzige Datenbank-Stelle (kern/speicher/db.ts, § 6.7), Prozess-Leine im Haupt (Job Object aus beweise/leine.js — Begruendung fuer den Ort im Dateikopf), MessagePort direkt Fenster<->Kern, Einzelinstanz-Sperre, Kern-Neustart-Wache, strikte CSP im gebauten Fenster. Wächter-Tests nach § 4.3: koffi nur an zwei benannten Orten (R1), kein leerer catch und kein catch-mit-Leerwert (R2/R4), kein HTTP-Server (§ 4.1), node:sqlite nur in db.ts (§ 6.7). Dazu Datenbank- und Schema-Tests: 18/18 gruen, Typpruefung in drei Kontexten. Der W-0-Beweis (npm run smoke, echtes Programm): SMOKE: OK — fenster=geladen kern=pid:13676,node:24.18.1 datenbank=ok leine=gesetzt pong=ok version=5.0.0-w0 Nachgemessen ausserdem: taskkill /F auf den Haupt-Prozess (ohne /T, der Absturz-Fall aus rc10) — der Kern stirbt mit. Bau-Fallen dokumentiert (BAUEN.md): npm 11 blockt Electrons Install-Skript (§ 3.5), plugin-react 6 verlangt Vite 8 (deshalb 5.2), TypeScript bewusst auf 5.9.3 gepinnt statt tsgo 7. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
66 lines
2.1 KiB
TypeScript
66 lines
2.1 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>',
|
|
`<head>\n <meta http-equiv="Content-Security-Policy" content="default-src 'self'" />`,
|
|
)
|
|
},
|
|
}
|
|
}
|
|
|
|
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') },
|
|
},
|
|
},
|
|
},
|
|
})
|