lsa-planer

LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.

/ tests tools entwicklungsabhaengigkeiten.test.ts

2,7 KB Rohdatei
tests/tools/entwicklungsabhaengigkeiten.test.ts — 58 Zeilen
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 });