lsa-planer
LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.
/ tests tools entwicklungsabhaengigkeiten.test.ts
| 1 | import { readFileSync } from 'node:fs'; |
| 2 | import { describe, expect, it } from 'vitest'; |
| 3 | |
| 4 | /* |
| 5 | * JEDE ENTWICKLUNGSABHAENGIGKEIT STEHT IM VERZEICHNIS DER FREMDBESTANDTEILE |
| 6 | * (Fassung 5.43.2). |
| 7 | * |
| 8 | * `docs/fremdbestandteile.md` fuehrt unter "Nur zur Entwicklung" die Pakete, |
| 9 | * die nicht ins Auslieferungspaket gehen, "damit die Aufstellung oben als |
| 10 | * vollstaendig gelesen werden kann". Vollstaendig war sie nicht: `7zip-bin` |
| 11 | * stand seit Fassung 5.26.0 in `devDependencies` und im Verzeichnis nirgends - |
| 12 | * gebraucht wurde es nur noch fuer eine Messung an Paketen, die nicht mehr |
| 13 | * vorliegen, und zum Bauen gar nicht. Es ist gestrichen. |
| 14 | * |
| 15 | * Dieser Fall haelt beide Richtungen: Jede Entwicklungsabhaengigkeit steht im |
| 16 | * Abschnitt, und der Abschnitt nennt keine, die `package.json` nicht fuehrt. |
| 17 | * Eine neue Abhaengigkeit muss damit begruendet ins Verzeichnis, und eine |
| 18 | * gestrichene faellt dort mit heraus. `electron`, `jspdf` und |
| 19 | * `jspdf-autotable` nennt der Abschnitt ausdruecklich als die drei, die auch |
| 20 | * ausgeliefert werden. |
| 21 | */ |
| 22 | |
| 23 | const PAKET = JSON.parse(readFileSync('package.json', 'utf8')) as { |
| 24 | readonly dependencies?: Readonly<Record<string, string>>; |
| 25 | readonly devDependencies: Readonly<Record<string, string>>; |
| 26 | }; |
| 27 | |
| 28 | const VERZEICHNIS = readFileSync('docs/fremdbestandteile.md', 'utf8'); |
| 29 | |
| 30 | /** Die Paketnamen in Backticks im Abschnitt "Nur zur Entwicklung". */ |
| 31 | function imAbschnitt(): Set<string> { |
| 32 | const anfang = VERZEICHNIS.indexOf('## Nur zur Entwicklung'); |
| 33 | expect(anfang, 'der Abschnitt "Nur zur Entwicklung" fehlt').toBeGreaterThanOrEqual(0); |
| 34 | const ende = VERZEICHNIS.indexOf('\n---', anfang); |
| 35 | const abschnitt = VERZEICHNIS.slice(anfang, ende === -1 ? undefined : ende); |
| 36 | const namen = [...abschnitt.matchAll(/`([^`\s]+)`/g)] |
| 37 | .map((treffer) => String(treffer[1])) |
| 38 | .filter((name) => /^(@[a-z0-9-]+\/)?[a-z0-9][a-z0-9.-]*$/.test(name)); |
| 39 | return new Set(namen); |
| 40 | } |
| 41 | |
| 42 | describe('Die Entwicklungsabhängigkeiten und das Verzeichnis der Fremdbestandteile', () => { |
| 43 | it('führt keine Laufzeitabhängigkeit', () => { |
| 44 | expect(Object.keys(PAKET.dependencies ?? {})).toEqual([]); |
| 45 | }); |
| 46 | |
| 47 | it('nennt jede Entwicklungsabhängigkeit aus package.json im Abschnitt "Nur zur Entwicklung"', () => { |
| 48 | const genannt = imAbschnitt(); |
| 49 | const fehlend = Object.keys(PAKET.devDependencies).filter((name) => !genannt.has(name)); |
| 50 | expect(fehlend, 'in devDependencies, im Verzeichnis nicht genannt').toEqual([]); |
| 51 | }); |
| 52 | |
| 53 | it('nennt dort keine, die package.json nicht führt', () => { |
| 54 | const gefuehrt = new Set(Object.keys(PAKET.devDependencies)); |
| 55 | const ueberzaehlig = [...imAbschnitt()].filter((name) => !gefuehrt.has(name)); |
| 56 | expect(ueberzaehlig, 'im Verzeichnis genannt, in devDependencies nicht').toEqual([]); |
| 57 | }); |
| 58 | }); |