export type SecuritySeverity = 'low' | 'medium' | 'high' | 'critical'; export type SecurityCategory = | 'injection' | 'authentication' | 'authorization' | 'cryptography' | 'data_exposure' | 'input_validation' | 'dependency' | 'configuration' | 'logging' | 'other'; export interface SecurityIssue { readonly id: string; readonly severity: SecuritySeverity; readonly category: SecurityCategory; readonly title: string; readonly description: string; readonly filePath: string; readonly lineNumber?: number; readonly codeSnippet?: string; readonly cweId?: string; readonly remediation: string; readonly references?: string[]; readonly falsePositive?: boolean; readonly metadata?: Record; } export interface SecurityIssueBuilder { id(id: string): SecurityIssueBuilder; severity(severity: SecuritySeverity): SecurityIssueBuilder; category(category: SecurityCategory): SecurityIssueBuilder; title(title: string): SecurityIssueBuilder; description(description: string): SecurityIssueBuilder; filePath(filePath: string): SecurityIssueBuilder; lineNumber(lineNumber: number): SecurityIssueBuilder; codeSnippet(codeSnippet: string): SecurityIssueBuilder; cweId(cweId: string): SecurityIssueBuilder; remediation(remediation: string): SecurityIssueBuilder; addReference(reference: string): SecurityIssueBuilder; references(references: string[]): SecurityIssueBuilder; falsePositive(falsePositive: boolean): SecurityIssueBuilder; metadata(metadata: Record): SecurityIssueBuilder; build(): SecurityIssue; } export class SecurityIssueImpl implements SecurityIssueBuilder { private issue: any = { references: [], }; id(id: string): SecurityIssueBuilder { this.issue.id = id; return this; } severity(severity: SecuritySeverity): SecurityIssueBuilder { this.issue.severity = severity; return this; } category(category: SecurityCategory): SecurityIssueBuilder { this.issue.category = category; return this; } title(title: string): SecurityIssueBuilder { this.issue.title = title; return this; } description(description: string): SecurityIssueBuilder { this.issue.description = description; return this; } filePath(filePath: string): SecurityIssueBuilder { this.issue.filePath = filePath; return this; } lineNumber(lineNumber: number): SecurityIssueBuilder { this.issue.lineNumber = lineNumber; return this; } codeSnippet(codeSnippet: string): SecurityIssueBuilder { this.issue.codeSnippet = codeSnippet; return this; } cweId(cweId: string): SecurityIssueBuilder { this.issue.cweId = cweId; return this; } remediation(remediation: string): SecurityIssueBuilder { this.issue.remediation = remediation; return this; } addReference(reference: string): SecurityIssueBuilder { if (!this.issue.references) { this.issue.references = []; } this.issue.references.push(reference); return this; } references(references: string[]): SecurityIssueBuilder { this.issue.references = references; return this; } falsePositive(falsePositive: boolean): SecurityIssueBuilder { this.issue.falsePositive = falsePositive; return this; } metadata(metadata: Record): SecurityIssueBuilder { this.issue.metadata = metadata; return this; } build(): SecurityIssue { if (!this.issue.id || !this.issue.severity || !this.issue.category || !this.issue.title || !this.issue.description || !this.issue.filePath || !this.issue.remediation || !this.issue.references) { throw new Error('Required fields missing for SecurityIssue'); } return { id: this.issue.id, severity: this.issue.severity, category: this.issue.category, title: this.issue.title, description: this.issue.description, filePath: this.issue.filePath, lineNumber: this.issue.lineNumber, codeSnippet: this.issue.codeSnippet, cweId: this.issue.cweId, remediation: this.issue.remediation, references: this.issue.references, falsePositive: this.issue.falsePositive, metadata: this.issue.metadata, }; } }