render method
Renders report as Markdown.
Implementation
String render(ScanReport report) {
final StringBuffer buffer = StringBuffer()
..writeln('# dep_sherpa Report')
..writeln()
..writeln('- Project: `${report.projectName}`')
..writeln('- Generated: `${report.generatedAt.toIso8601String()}`')
..writeln(
'- Overall dependency risk: `${report.overallScore.toStringAsFixed(1)}`')
..writeln('- Include transitive: `${report.includeTransitive}`')
..writeln()
..writeln('## Graph Summary')
..writeln()
..writeln('| Metric | Value |')
..writeln('| --- | ---: |')
..writeln('| Max depth | ${report.graph.maxDepth} |')
..writeln('| Total nodes | ${report.graph.totalNodes} |')
..writeln(
'| Direct dependencies | ${report.graph.directDependencyCount} |')
..writeln(
'| Transitive dependencies | ${report.graph.transitiveDependencyCount} |')
..writeln()
..writeln('## Ranked Dependencies')
..writeln()
..writeln(
'| Package | Score | Class | Trust | Depth | Transitive | Hard Triggers |',
)
..writeln('| --- | ---: | --- | ---: | ---: | ---: | --- |');
for (final DependencyRiskEntry entry in report.dependencies) {
buffer.writeln(
'| `${entry.dependency.node.name}` | '
'${entry.riskScore.finalScore.toStringAsFixed(1)} | '
'${entry.riskScore.classification.name} | '
'${entry.riskScore.trustFactor.toStringAsFixed(1)} | '
'${entry.dependency.metrics.maxDepth} | '
'${entry.dependency.metrics.transitiveCount} | '
'${entry.riskScore.hardRiskTriggers.join(", ")} |',
);
}
buffer.writeln();
buffer.writeln('## Transparency');
buffer.writeln();
for (final DependencyRiskEntry entry in report.dependencies) {
buffer.writeln('### ${entry.dependency.node.name}');
buffer.writeln();
buffer.writeln('```json');
buffer.writeln(
const JsonEncoder.withIndent(' ').convert(entry.toJson()),
);
buffer.writeln('```');
buffer.writeln();
}
return buffer.toString();
}