generateHtml method

String generateHtml(
  1. List<AuditRunResult> results, {
  2. required ProjectContext context,
})

Builds the full HTML document as a string.

Implementation

String generateHtml(
  List<AuditRunResult> results, {
  required ProjectContext context,
}) {
  final securityIssues = <SecurityIssue>[];
  final maintenanceIssues = <SecurityIssue>[];
  final passedAudits = <Audit>[];

  for (final run in results) {
    if (!run.result.hasIssues) {
      passedAudits.add(run.audit);
      continue;
    }
    if (maintenanceAuditIds.contains(run.audit.id)) {
      maintenanceIssues.addAll(run.result.issues);
    } else {
      securityIssues.addAll(run.result.issues);
    }
  }

  final bySeverity = {
    for (final severity in Severity.values)
      severity: securityIssues
          .where((issue) => issue.severity == severity)
          .toList(),
  };

  final projectName = p.basename(context.rootPath);
  final now = DateTime.now();
  final date =
      '${now.year.toString().padLeft(4, '0')}-'
      '${now.month.toString().padLeft(2, '0')}-'
      '${now.day.toString().padLeft(2, '0')} '
      '${now.hour.toString().padLeft(2, '0')}:'
      '${now.minute.toString().padLeft(2, '0')}:'
      '${now.second.toString().padLeft(2, '0')}';

  final buffer = StringBuffer()
    ..writeln('<!DOCTYPE html>')
    ..writeln('<html lang="en">')
    ..writeln('<head>')
    ..writeln('<meta charset="UTF-8">')
    ..writeln(
      '<meta name="viewport" content="width=device-width, initial-scale=1.0">',
    )
    ..writeln('<title>Flutter Auditor Report — $projectName</title>')
    ..writeln('<style>${_css()}</style>')
    ..writeln('</head>')
    ..writeln('<body>')
    ..writeln('<div class="page">');

  _writeHeader(
    buffer,
    projectName: projectName,
    context: context,
    date: date,
  );
  _writeSummaryAndChart(
    buffer,
    bySeverity: bySeverity,
    maintenanceCount: maintenanceIssues.length,
    passedCount: passedAudits.length,
  );

  for (final severity in [Severity.critical, Severity.high]) {
    _writeIssueSection(
      buffer,
      title: '${severity.label} Risk',
      color: _severityColors[severity]!,
      issues: bySeverity[severity]!,
    );
  }
  _writeIssueSection(
    buffer,
    title: 'Medium Risk',
    color: _severityColors[Severity.medium]!,
    issues: bySeverity[Severity.medium]!,
  );
  _writeIssueSection(
    buffer,
    title: 'Low Risk',
    color: _severityColors[Severity.low]!,
    issues: [...bySeverity[Severity.low]!, ...bySeverity[Severity.info]!],
    collapsedByDefault: true,
  );
  _writeIssueSection(
    buffer,
    title: 'Maintenance',
    color: _maintenanceColor,
    issues: maintenanceIssues,
    collapsedByDefault: true,
  );
  _writePassedSection(buffer, passedAudits: passedAudits);

  buffer
    ..writeln(
      '<div class="footer">Generated by flutter_auditor on $date</div>',
    )
    ..writeln('</div>')
    ..writeln('</body>')
    ..writeln('</html>');

  return buffer.toString();
}