Lektion 0201 hat drei Kontexte gezeichnet. Jetzt werden sie Code: je Kontext eine Gruppe von Bibliotheken, die zusammen ein Fachgebiet tragen, mit Regeln, die der Lint-Lauf durchsetzt. Dazu gehören Fragen des Alltags: Was darf im Front End stehen, in welche Richtung darf eine Bibliothek schauen, wie finden Sie einen Zyklus, wie verschieben Sie eine Bibliothek? Der Workspace aus 0101 und 0102 wird vorausgesetzt (Nx, Etiketten, enforce-module-boundaries); die Befehle dort wiederholt diese Lektion nicht.

Stand der Prüfung. Ausgeführt (Node 24.22.3, Nx 24.0.6, Angular 22.2, Vitest 4.1.12, Wegwerf-Workspace außerhalb des Repositorys): elf Bibliotheken in vier Gruppen und die Anwendung kladde-buero mit @nx/angular:library; nx run-many -t lint über 12 Projekte (Exit 0); nx graph --file=graph.json und die Kanten daraus; ein Verstoß gegen das Fachgebiet (Exit 1); ein absichtlicher Zyklus (Exit 1, Meldung unten) und seine Beseitigung (Exit 0, 13 Projekte); nx generate @nx/workspace:move (zweimal, siehe die Falle unten); nx test termine-domain (1 Test, Exit 0); nx build kladde-buero (Exit 0). Nicht ausgeführt: ein Browser, die Seiten der Anwendung, das Teilen einer Bibliothek (beschrieben, kein Befehl), Sheriff, die Pipeline. Die Bibliothekskörper sind für die Übung geschrieben. Die Wege /api/contacts, /api/appointments entsprechen dem Plan; /api/tenders und das Feld deadline sind für diese Lektion erfunden (der Plan nennt keine Ausschreibungs-API für das Front End: Stand K2 prüfen).

Ein Kontext, eine Gruppe

Die Namen folgen <fachgebiet>-<art>[-<name>], die Ordner libs/<fachgebiet>/<art>[-<name>]. Die Kladde bekommt:

Gruppe Bibliotheken
kontakte kontakte-domain, kontakte-data-access, kontakte-ui, kontakte-feature-liste
termine termine-domain, termine-data-access, termine-feature-kalender
ausschreibungen ausschreibungen-domain, ausschreibungen-data-access, ausschreibungen-feature-liste
shared shared-util-datum

Wer 0102 durchgespielt hat, hat kontakte-feature-liste, kontakte-data-access, kontakte-ui, termine-data-access und shared-util-datum schon; neu sind die vier domain-Bibliotheken (je eine), termine-feature-kalender, ausschreibungen-data-access und ausschreibungen-feature-liste. Eine Bibliothek legen Sie wie in 0102 an; die Etiketten stehen in Anführungszeichen:

PowerShell
npx nx generate @nx/angular:library --directory=libs/kontakte/domain `
    --name=kontakte-domain --prefix=kl --importPath=@kladde/kontakte/domain `
    "--tags=scope:kontakte,type:domain" --no-interactive

Der Generator legt auch eine Beispielkomponente an; eine domain-Bibliothek braucht sie nicht, löschen Sie ihren Ordner lib/ und schreiben Sie eigene Dateien.

Ab jetzt gilt gegenüber 0102 zweierlei. Es gibt eine fünfte Art: type:domain für reine TypeScript-Dateien ohne Angular, in denen das Modell des Kontexts liegt. Und es gibt das Fachgebiet scope:ausschreibungen, das die Anwendung scope:buero nutzen darf. Die Regeln in eslint.config.mjs ändern sich so:

JavaScript
{ sourceTag: 'type:ui', onlyDependOnLibsWithTags: ['type:ui', 'type:domain', 'type:util'] },
{ sourceTag: 'type:data-access', onlyDependOnLibsWithTags: ['type:data-access', 'type:domain', 'type:util'] },
{ sourceTag: 'type:domain', onlyDependOnLibsWithTags: ['type:domain', 'type:util'] },
{ sourceTag: 'scope:ausschreibungen', onlyDependOnLibsWithTags: ['scope:ausschreibungen', 'scope:shared'] },

dazu 'type:domain' in den Listen von type:app und type:feature und 'scope:ausschreibungen' in der von scope:buero; alles andere bleibt wie in 0102.