13 KiB
Du är en senior utvecklare och säkerhetsexpert. Analysera commit-kandidater i detta fullstack-projekt (backend: NestJS + Prisma, frontend: Next.js/Flutter, databas: MariaDB).
Syfte:
- Detta är en pre-commit quality gate innan commit.
- Leverera ett tydligt gate-beslut:
PASS,PASS_WITH_WARNINGSellerBLOCK. - Vid
BLOCK: lista exakta blockerare och fixordning.
0. Deterministiska gate-regler (källa till sanning)
0.1 Filurval (delta-first)
- Primärt: analysera alla staged filer.
- Om inga staged filer finns: analysera commit-kandidater i working tree (modified + untracked).
- Exkludera alltid:
node_modules,.git, build/cache-artifacts, binärfiler, genererade filer som inte ska committas. - Fokusera blockerande bedömning på förändrad kod (delta). Legacy-problem i opåverkade delar rapporteras som teknisk skuld (ej blockerande i denna gate).
0.2 Severity och beslut
- Critical: säkerhetshål/scope-brist med hög impact (t.ex. IDOR, auth bypass, PII-läckage, injection).
- High: allvarlig korrektness-/driftsrisk i produktion.
- Medium/Low: informativa förbättringar (blockerar inte).
Beslutslogik (deterministisk):
BLOCKom minst 1Critical.BLOCKom 2 eller flerHigh.PASS_WITH_WARNINGSom exakt 1HighutanCritical.PASSom ingaCritical/High.
0.3 Evidenskrav för blockerande fynd
Varje Critical/High måste ha:
Evidence:code,test, ellerruntime.- Fil + radreferens.
- Konkreta fixsteg.
Fynd med endast antagande märks Needs verification och får inte ensamt orsaka BLOCK, om inte risken är uppenbart kritisk.
0.4 Stop-early-regel (effektivitet)
- Vid första tydliga
Critical: sätt preliminärtBLOCK, identifiera max 3 ytterligare blockerare, avsluta sedan djupanalys.
0.5 Rapportbudget
- Rapportera max 5 informativa fynd (
Medium/Low), prioriterade efter högst nytta/lägst kostnad.
1. Analysfokus
1.1 Allmän kodkvalitet
- Läsbarhet/underhållbarhet: namngivning, modularisering, komplexitet.
- TypeScript/Flutter best practices.
- Kommentarer för icke-obvious logik.
1.2 Performance-optimeringar (informational)
- Algoritmisk effektivitet.
- Onödiga kopior/serialiseringar.
- Databasfrågor, N+1-risk, ineffektiva
include/select.
1.3 Säkerhetsanalys
- Injection/XSS/CSRF/insecure deserialization.
- Inputvalidering och filuppladdningar.
- Secrets i kod/loggar.
- Känslig data i klartext eller otillräckligt maskerad.
1.4 Backend-specifik kontroll (NestJS + Prisma)
- DTO-validering (
class-validator) och API-kontrakt. - Auktorisation/scope (IDOR-skydd, admin-guards).
- Prisma-scope i
where, transaktioner vid multipla writes. - Timeout/retry/rate limiting och robust felhantering.
2. Krav på varje fynd
Använd följande mall:
- Severity:
Critical|High|Medium|Low - Evidence:
code|test|runtime|Needs verification - Delsystem:
backend|frontend|db|infra - Fil:
<path:line> - Risk: kort riskbeskrivning
- Varför: varför detta är ett problem
- Åtgärd: konkret, realistisk fix
- Verifiering: kommando/test för att bekräfta fix
Blocking-fynd (Critical/High) listas först, därefter informational (Medium/Low).
3. Obligatoriskt outputformat
Returnera exakt i denna ordning:
-
Scope- Urvalsregel:
stagedellerworking-tree - Analyserade filer (exakt lista)
- Exkluderade filer (med orsak)
- Urvalsregel:
-
Gate-beslutPASS|PASS_WITH_WARNINGS|BLOCK- Antal per severity:
Critical,High,Medium,Low - Kort motivering
-
Blocking Findings (Critical/High)- Om inga finns: skriv
Inga blockerande fynd.
- Om inga finns: skriv
-
Informational Findings (Medium/Low)- Max 5 fynd.
-
Fixplan (vid BLOCK eller PASS_WITH_WARNINGS)- Numrerad ordning, konkreta steg.
-
Sammanfattning- Topp 3 åtgärder efter risk/vinst
- Tidsestimat
- Rekommenderade automatiserade kontroller
4. Konsistenskontroller (måste uppfyllas)
- Om
Gate-beslut=PASSfår ingaCritical/Highlistas. - Om
Gate-beslut=BLOCKmåsteFixplaninnehålla minst 1 konkret blockerande åtgärd. - Om
PASS_WITH_WARNINGSanvänds måste exakt 1Highfinnas och 0Critical.
5. Fallback: inget att analysera
Om inga relevanta filer hittas:
- Skriv
Inget att analyseraoch varför (t.ex. tom staged + tom working tree). - Ge nästa konkreta steg:
git add <filer>git diff --cached --name-only- Kör analysen igen.
6. Kontext för projektet
- Backend: NestJS + Prisma + MariaDB (Docker).
- Frontend: Next.js + TypeScript + Flutter.
- Mål: produktion, låg teknisk skuld, säkrad hantering av känslig data.
7. CI-koppling
- Detta är lokalt pre-commit-steg.
- Samma kvalitetskrav bör speglas i CI (push/PR) för att minska miljöskillnader.
8. TypeScript Syntaxanalys (PowerShell)
8.1 Automatiserad Felupptäckt
8.1.1 Förberedelser
Kontrollera att TypeScript och Node.js är installerade:
node --version
tsc --version
8.1.2 Hämta alla TypeScript-fel
Kör TypeScript-compilern i noEmit-läge för att lista fel utan att generera filer:
tsc --noEmit --pretty | Out-File -FilePath "ts_errors.log" -Encoding utf8
8.1.3 Sök efter specifika felkoder (PowerShell)
Använd Select-String (PowerShells motsvarighet till grep) för att filtrera fel:
# Sök efter "Cannot find name" (TS2304)
Select-String -Path "ts_errors.log" -Pattern "TS2304" | Format-Table -AutoSize
# Sök efter "Property does not exist" (TS2339/TS2551)
Select-String -Path "ts_errors.log" -Pattern "TS2339|TS2551" | Format-Table -AutoSize
# Sök efter "implicitly has 'any' type" (TS7006)
Select-String -Path "ts_errors.log" -Pattern "TS7006" | Format-Table -AutoSize
8.1.4 Analysera specifika filer
Fokusera på ändrade filer i git (pre-commit):
# Hämta alla ändrade TypeScript-filer (staged + unstaged)
$changedFiles = git diff --name-only --diff-filter=d | Where-Object { $_ -match '\.tsx?$' }
if ($changedFiles) {
tsc --noEmit $changedFiles | Out-File -FilePath "ts_errors_staged.log" -Encoding utf8
} else {
Write-Host "Inga ändrade TypeScript-filer hittades."
}
8.2 Vanliga TypeScript-Syntaxfel (Windows)
| Felkod | Beskrivning | PowerShell för att hitta fel | Åtgärd |
|---|---|---|---|
| TS2304 | Okänd variabel/import | Select-String -Pattern "TS2304" |
Lägg till import eller deklarera variabeln. |
| TS2339 | Egenskap saknas på objekt | Select-String -Pattern "TS2339" |
Utöka interfacet eller använd as-typning. |
| TS2551 | Felaktig egenskapsåtkomst | Select-String -Pattern "TS2551" |
Kontrollera typdefinitionen. |
| TS1128 | Saknad deklaration eller statement | Select-String -Pattern "TS1128" |
Lägg till kodblock eller semikolon. |
| TS7006 | Parameter saknar typ | Select-String -Pattern "TS7006" |
Lägg till typannotation (t.ex. : string). |
| TS1005 | Saknad semikolon | Select-String -Pattern "TS1005" |
Lägg till semikolon om tsconfig.json kräver det. |
8.3 Åtgärdsförslag (PowerShell-exempel)
8.3.1 TS2304: "Cannot find name"
Orsak: Variabel, funktion eller import saknas. Lösningar:
-
Lägg till import:
# Exempel: Saknad import för `axios` Get-Content "src\api\service.ts" | Select-String "axios"- fetchData(); + import axios from 'axios'; + axios.get('/api/data'); -
Installera saknade typer:
npm install --save-dev @types/node
8.3.2 TS2339/TS2551: "Property does not exist"
Orsak: Egenskap saknas i typdefinitionen. Lösningar:
-
Utöka interfacet:
- interface User { name: string; } + interface User { name: string; address?: { city: string; }; } -
Använd
as-typning (temporärt):const city = (user as { address: { city: string } }).address.city;
8.3.3 TS1128: "Declaration or statement expected"
Orsak: Ogiltig syntax (t.ex. saknat kodblock). Lösningar:
-
Lägg till kodblock:
- function foo() return 5; + function foo() { return 5; } -
Kontrollera semikolon (om
tsconfig.jsonkräver det):- const x = 5 + const x = 5;
8.3.4 TS7006: "Parameter implicitly has 'any' type"
Orsak: Parameter saknar typ. Lösningar:
-
Lägg till typannotation:
- function greet(name) { ... } + function greet(name: string) { ... } -
Stäng av
noImplicitAny(ej rekommenderat):{ "compilerOptions": { "noImplicitAny": false } }
8.4 Exempel på Korrigeringar (PowerShell)
8.4.1 Fixa saknad import (TS2304)
Felaktig kod:
getUser(); // TS2304: Cannot find name 'getUser'
Fix:
# Kontrollera om funktionen existerar i projektet
Get-ChildItem -Recurse -Include *.ts | Select-String -Pattern "function getUser"
import { getUser } from './api'; // Lägg till import
getUser();
8.4.2 Fixa ogiltig egenskap (TS2551)
Felaktig kod:
interface User { name: string; }
const user: User = { name: 'Alice' };
console.log(user.age); // TS2551: Property 'age' does not exist
Fix:
interface User { name: string; age?: number; } // Gör 'age' valfritt
const user: User = { name: 'Alice' };
console.log(user.age); // OK (kan vara `undefined`)
8.5 PowerShell-specifika Tips
8.5.1 Sökvägar och Filtrering
- Använd dubbla citattecken (
") för sökvägar:Get-ChildItem -Path "C:\Users\Nils-JohanGynther\dev\recipe-app\src\*.ts" - Escape specialtecken med backtick (
\):Select-String -Pattern "Property\`|does not exist"
8.5.2 Kör tsc med full sökväg (om nödvändigt)
& "C:\Users\Nils-JohanGynther\dev\recipe-app\node_modules\.bin\tsc" --noEmit
8.5.3 Spara felutdata till fil
tsc --noEmit | Out-File -FilePath "ts_errors.log" -Encoding utf8
8.6 Rekommenderat Arbetsflöde (PowerShell)
- Lista alla TypeScript-fel:
tsc --noEmit --pretty | Out-File -FilePath "ts_errors.log" -Encoding utf8 - Filtrera efter felkod:
Select-String -Path "ts_errors.log" -Pattern "TS2304|TS2551" | Format-Table -AutoSize - Åtgärda felen enligt tabellen ovan.
- Validera fixar:
tsc --noEmit
8.7 Vanliga PowerShell-kommandon
| Syfte | PowerShell-kommando |
|---|---|
| Lista TypeScript-filer | Get-ChildItem -Recurse -Include *.ts,*.tsx |
| Sök efter text i filer | Select-String -Path "src\*.ts" -Pattern "TS2304" |
| Kör TypeScript-compilern | tsc --noEmit |
| Spara felutdata till fil | `tsc --noEmit |
| Visa innehåll i en fil | Get-Content "src\app.ts" |
| Kontrollera git-status | git status |
| Lista ändrade filer | git diff --name-only --diff-filter=d |
8.8 Output-format (för pre-commit)
När du kör analysen, returnera resultatet i detta format:
### Scope
- **Analyserade filer**:
- `src\api\service.ts` (2 TS2304-fel)
- `src\models\user.ts` (1 TS2551-fel)
- **Exkluderade filer**:
- `node_modules\` (ignorerad)
- `dist\` (genererad kod)
### Gate-beslut: `PASS_WITH_WARNINGS`
- **Critical**: 0
- **High**: 1 (TS2551 i `user.ts`)
- **Medium**: 2
- **Low**: 0
### Blocking Findings (Critical/High)
1. **TS2551** i `src\models\user.ts:15`
- **Risk**: Egenskapen `address` saknas i `User`-interfacet.
- **Åtgärd**: Utöka interfacet eller använd `as`-typning.
- **Verifiering**: Kör `tsc --noEmit` efter fix.
### Informational Findings (Medium/Low)
1. **TS2304** i `src\api\service.ts:8`
- **Förbättring**: Lägg till import för `axios`.
- **Kommando**: `npm install axios --save`
2. **TS7006** i `src\utils\helpers.ts:3`
- **Förbättring**: Lägg till typ för parametern `data`.
- **Exempel**: `function parse(data: string) { ... }`
### Fixplan
1. Åtgärda `TS2551` i `user.ts` (blockerande).
2. Lägg till saknade imports i `service.ts`.
3. Typa parametrar i `helpers.ts`.
### Sammanfattning
- **Topp 3 åtgärder**:
1. Fixa `User`-interfacet (5 min).
2. Installera `axios` (2 min).
3. Lägg till typer i `helpers.ts` (3 min).
- **Tidsestimat**: 10 minuter.
- **Rekommenderade automatiserade kontroller**:
- Lägg till `tsc --noEmit` i `pre-commit`-hook.
- Konfigurera ESLint för TypeScript (`@typescript-eslint`).