waffensachkunde
Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.
| 1 | /** |
| 2 | * Hält fest, wann die Vollstufe des Gates zuletzt sauber durchlief. |
| 3 | * |
| 4 | * Der Stempel liegt in `.git/` und ist damit bewusst NICHT versioniert: Er |
| 5 | * beschreibt den Zustand dieses einen Arbeitsplatzes, nicht den des Projekts. |
| 6 | * Ein eingecheckter Stempel würde behaupten, bei jedem anderen sei die |
| 7 | * Vollstufe auch schon gelaufen. |
| 8 | * |
| 9 | * Der pre-commit-Hook vergleicht sein Alter mit der jüngsten Änderung unter |
| 10 | * `app/src` und erinnert, wenn der Quelltext seither weitergewandert ist. |
| 11 | */ |
| 12 | import { execFileSync } from 'node:child_process'; |
| 13 | import { writeFileSync } from 'node:fs'; |
| 14 | import { dirname, join } from 'node:path'; |
| 15 | import { fileURLToPath } from 'node:url'; |
| 16 | |
| 17 | import { paketstand } from './paketstand.mjs'; |
| 18 | |
| 19 | const wurzel = execFileSync('git', ['rev-parse', '--show-toplevel'], { |
| 20 | encoding: 'utf8', |
| 21 | }).trim(); |
| 22 | |
| 23 | const pfad = join(wurzel, '.git', 'gate-stempel'); |
| 24 | writeFileSync(pfad, `${new Date().toISOString()}\n`, 'utf8'); |
| 25 | |
| 26 | process.stdout.write(`Gate vollständig durchlaufen. Stempel: ${pfad}\n`); |
| 27 | |
| 28 | /* |
| 29 | Und jetzt das, was der Bericht bisher verschwieg. |
| 30 | |
| 31 | Playwright zählt übersprungene Prüfungen nicht in die Zusammenfassung: Aus |
| 32 | „203 bestanden“ wird „183 bestanden“, und die fehlenden fallen niemandem |
| 33 | auf. Ein Gate, das nicht sagt, was es ausgelassen hat, behauptet mehr, als |
| 34 | es geprüft hat – dieselbe Unwahrheit, gegen die `bauPruefen()` angelegt ist. |
| 35 | |
| 36 | Die Zahlen sind am 03.09.2026 gemessen (`npx playwright test --list`: 203 |
| 37 | Prüfungen in 23 Dateien; ohne frisches Paket bleiben 20 liegen – 15 aus |
| 38 | `gepackt.spec.ts`, 3 aus `fensterlage.spec.ts` und 2 aus |
| 39 | `store-paket.spec.ts`, die ein registriertes MSIX brauchen). Sie standen |
| 40 | hier bis Fassung 0.27.2 auf 119 und 110 und waren damit selbst das, wogegen |
| 41 | dieser Absatz argumentiert. |
| 42 | |
| 43 | Kein Fehlschlag, sondern eine Feststellung: `npm run gate` baut das Paket |
| 44 | nicht mit, und ein Abbruch zwänge zu einem mehrminütigen `dist:win` vor |
| 45 | jedem Lauf. Wer veröffentlicht, findet den Schritt in |
| 46 | docs/veroeffentlichen.md. |
| 47 | */ |
| 48 | const appWurzel = dirname(dirname(fileURLToPath(import.meta.url))); |
| 49 | const paket = paketstand(appWurzel); |
| 50 | |
| 51 | if (!paket.vorhanden || paket.veraltet) { |
| 52 | process.stdout.write( |
| 53 | `\nNICHT geprüft: e2e/gepackt.spec.ts – ${paket.grund}\n` + |
| 54 | 'Die gepackte Anwendung ist damit ungeprüft geblieben; vor einer ' + |
| 55 | 'Veröffentlichung ist das ein offener Punkt.\n', |
| 56 | ); |
| 57 | } else { |
| 58 | process.stdout.write('Einschließlich der Prüfungen gegen das gebaute Paket.\n'); |
| 59 | } |