PMD und ESLint-Regeln einführen (Sonar-Regeln ohne Server) #154
Labels
No labels
Kind
Bug
Kind
Enhancement
Kind
Maintenance
Priority
P1
Priority
P2
Priority
P3
Status
In Progress
Status
Need More Info
Status
Zur Abnahme
Änderungen Wettspielreglement
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
sffs-tt-basel/sffs-tt-issues#154
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Worum es geht
Ein grosser Teil der Regeln, die SonarQube prüft, soll auch hier gelten, ohne SonarQube-Server: PMD fürs Backend, ESLint mit
eslint-plugin-sonarjs(Sonars eigene JS/TS-Regeln) fürs Frontend. Beide hängen sich in Schritte, die schon laufen (mvn -B clean verify,npm run lint). Neue Treffer machen den Build rot, der Altbestand wird eingefroren oder behoben.Die Regeln hat Olli am 25.10.2026 einzeln ausgewählt, auf einer Swipe-Seite mit Treffern aus dem eigenen Code (Probelauf auf
main67413ac, PMD 7.28.0 mit allen Java-Regeln, eslint-plugin-sonarjs 4.2.2 mit allen Regeln). Die vollständige Entscheidungsliste hängt alsdecisions.jsonan, die Einstellungen aus dem Gespräch alseinstellungen.md.Befund vorab
ESLint ist in
portalundcontenteingerichtet, läuft aber nirgends: nicht in der CI, nicht im Docker-Build. Darum ist es rot (am 25.10.: portal 46 Fehler, content 5).homepageundpackages/sharedhaben gar kein ESLint.Etappe 1: jetzt
Vom Backend-Umbau (ADR 0033, #122) unabhängig.
Frontend
eslint-plugin-astro),npm run lintals CI-Schritt.eslint-plugin-sonarjs: die 20 behaltenen Regeln mit Treffern und 209 ohne Treffer (Voreinstellung).curly: ["error", "all"]: immer Klammern, wie in Java (21 Treffer, per--fix).eslint-suppressions.json); die Datei darf nur schrumpfen, wie der ArchUnit-Store.no-duplicate-stringprefer-read-only-propsno-nested-conditionaldeprecationcognitive-complexitystrings-comparisonmax-lines-per-functionno-alphabetical-sortno-nested-template-literalsno-clear-text-protocolsprefer-specific-assertionsarray-constructorfunction-return-typenested-control-flowno-hardcoded-passwordsprefer-regexp-execno-hardcoded-ipno-misleading-array-reverseno-undefined-argumenttable-headerBackend
maven-pmd-plugininmvn -B clean verify, eine Regeldatei im Repo.OnlyOneReturnmitallowGuardIfs=true(Etappe 2),MethodNamingConventionsmitjunit5TestPattern=[a-z][a-zA-Z0-9_]*,UseExplicitTypesmitallowCtors/allowLiterals/allowCasts,AvoidLiteralsInIfConditionohne weitere Ausnahmen.!x.isEmpty()auf Collections →CollectionUtils.isNotEmpty(x)(neue Abhängigkeitcommons-collections4), auf Strings →StringUtils.isNotEmpty(s). Mit Gegentest, damit sie nicht still nichts findet. Heute 28 Stellen im Produktivcode, 9 in Tests.TestIsolationundTestDataInitializerumbenennen (RegelTestClassWithoutTestCases: „Test“ heisst JUnit-Test); Verweise in Code,META-INF/services, CLAUDE.md und docs/README.md nachziehen, alte Pläne und Specs nicht.AvoidDuplicateLiteralsUseExplicitTypesFieldDeclarationsShouldBeAtStartOfClassRelianceOnDefaultCharsetLinguisticNamingAvoidLiteralsInIfConditionAddEmptyStringPreserveStackTraceAssignmentInOperandUseLocaleWithCaseConversionsSimplifiableTestAssertionAvoidCatchingGenericExceptionCloseResourceLiteralsFirstInComparisonsUnnecessaryFullyQualifiedNameUnusedFormalParameterLambdaCanBeMethodReferenceLooseCouplingVariableCanBeInlinedMissingOverrideSimplifyBooleanReturnsDanglingJavadocTestClassWithoutTestCasesUseCollectionIsEmptyAvoidReassigningParametersInstantiableUtilityClassAvoidAccessibilityAlterationAvoidThrowingRawExceptionTypesCheckResultSetUnusedPrivateMethodClassWithOnlyPrivateConstructorsShouldBeFinalCompareObjectsWithEqualsControlStatementBracesEmptyCatchBlockExceptionAsFlowControlLocalVariableNamingConventionsMissingStaticMethodInNonInstantiatableClassNonExhaustiveSwitchReturnEmptyCollectionRatherThanNullSingularFieldUnusedLocalVariableMethodNamingConventionsCLAUDE.md
Etappe 2: nach #122 und dem Abschied von Active Record
Der Service-Zuschnitt teilt genau die betroffenen Methoden neu auf. Jetzt eingefroren, würden sie beim Umbau als neuer Code gelten.
OnlyOneReturnCognitiveComplexityGodClassNPathComplexity(
OnlyOneReturnmitallowGuardIfs=truegemessen: 164 Treffer in 54 Dateien.)Gestrichen
Regeln mit Treffern, die nicht gelten: 46 PMD, 25 sonarjs. Begründung je Regel in
decisions.jsonbzw. auf den Karten; die grossen sindLocalVariableCouldBeFinal/MethodArgumentCouldBeFinal(über 8000 Treffer zusammen, Parameter-Neuzuweisung verbietet stattdessenAvoidReassigningParameters),LawOfDemeter, die Kommentar-Regeln undarrow-function-convention.Regeln ohne Treffer nach Voreinstellung (PMD-Schnellstart bzw. Sonar-Empfehlung): 297 behalten, 148 gestrichen.
Offen
excludeFromFailureFile). Entscheidung im Plan.AvoidDuplicateLiterals(468) undno-duplicate-string(332) treffen fast nur Tests. Behalten ist entschieden, ob Tests ausgenommen werden, nicht.continueganz verbieten? Besprochen, nicht entschieden: ESLintno-continue(Frontend 10 Treffer), für Java bräuchte es eine eigene Regel (85 Treffer).