import { readFileSync } from 'node:fs'; import { describe, expect, it } from 'vitest'; /* * JEDE ENTWICKLUNGSABHAENGIGKEIT STEHT IM VERZEICHNIS DER FREMDBESTANDTEILE * (Fassung 5.43.2). * * `docs/fremdbestandteile.md` fuehrt unter "Nur zur Entwicklung" die Pakete, * die nicht ins Auslieferungspaket gehen, "damit die Aufstellung oben als * vollstaendig gelesen werden kann". Vollstaendig war sie nicht: `7zip-bin` * stand seit Fassung 5.26.0 in `devDependencies` und im Verzeichnis nirgends - * gebraucht wurde es nur noch fuer eine Messung an Paketen, die nicht mehr * vorliegen, und zum Bauen gar nicht. Es ist gestrichen. * * Dieser Fall haelt beide Richtungen: Jede Entwicklungsabhaengigkeit steht im * Abschnitt, und der Abschnitt nennt keine, die `package.json` nicht fuehrt. * Eine neue Abhaengigkeit muss damit begruendet ins Verzeichnis, und eine * gestrichene faellt dort mit heraus. `electron`, `jspdf` und * `jspdf-autotable` nennt der Abschnitt ausdruecklich als die drei, die auch * ausgeliefert werden. */ const PAKET = JSON.parse(readFileSync('package.json', 'utf8')) as { readonly dependencies?: Readonly>; readonly devDependencies: Readonly>; }; const VERZEICHNIS = readFileSync('docs/fremdbestandteile.md', 'utf8'); /** Die Paketnamen in Backticks im Abschnitt "Nur zur Entwicklung". */ function imAbschnitt(): Set { const anfang = VERZEICHNIS.indexOf('## Nur zur Entwicklung'); expect(anfang, 'der Abschnitt "Nur zur Entwicklung" fehlt').toBeGreaterThanOrEqual(0); const ende = VERZEICHNIS.indexOf('\n---', anfang); const abschnitt = VERZEICHNIS.slice(anfang, ende === -1 ? undefined : ende); const namen = [...abschnitt.matchAll(/`([^`\s]+)`/g)] .map((treffer) => String(treffer[1])) .filter((name) => /^(@[a-z0-9-]+\/)?[a-z0-9][a-z0-9.-]*$/.test(name)); return new Set(namen); } describe('Die Entwicklungsabhängigkeiten und das Verzeichnis der Fremdbestandteile', () => { it('führt keine Laufzeitabhängigkeit', () => { expect(Object.keys(PAKET.dependencies ?? {})).toEqual([]); }); it('nennt jede Entwicklungsabhängigkeit aus package.json im Abschnitt "Nur zur Entwicklung"', () => { const genannt = imAbschnitt(); const fehlend = Object.keys(PAKET.devDependencies).filter((name) => !genannt.has(name)); expect(fehlend, 'in devDependencies, im Verzeichnis nicht genannt').toEqual([]); }); it('nennt dort keine, die package.json nicht führt', () => { const gefuehrt = new Set(Object.keys(PAKET.devDependencies)); const ueberzaehlig = [...imAbschnitt()].filter((name) => !gefuehrt.has(name)); expect(ueberzaehlig, 'im Verzeichnis genannt, in devDependencies nicht').toEqual([]); }); });