DependencyReport.kt

package com.depanalyzer.report

import com.depanalyzer.core.graph.VulnerabilityChain
import com.depanalyzer.parser.Ecosystem
import com.fasterxml.jackson.annotation.JsonInclude

@JsonInclude(JsonInclude.Include.NON_NULL)
data class DependencyReport(
    val schemaVersion: String = "1.3",
    val projectName: String,
    val upToDate: List<DependencyInfo> = emptyList(),
    val outdated: List<OutdatedDependency> = emptyList(),
    val directVulnerable: List<VulnerableDependency> = emptyList(),
    val transitiveVulnerable: List<VulnerableDependency> = emptyList(),
    val vulnerabilityChains: List<VulnerabilityChain> = emptyList(),
    val dependencyTree: List<DependencyTreeNode>? = null,
    val analysis: AnalysisMetadata? = null
)

enum class AnalysisMode {
    DYNAMIC,
    STATIC,
    STATIC_FALLBACK
}

enum class VulnerabilityCoverage {
    COMPLETE,
    FALLBACK,
    UNAVAILABLE
}

data class ProviderAnalysisMetadata(
    val requested: String,
    val used: List<String> = emptyList(),
    val warnings: List<String> = emptyList(),
    val statuses: Map<String, String> = emptyMap()
)

data class AnalysisMetadata(
    val requestedMode: AnalysisMode,
    val actualMode: AnalysisMode,
    val projectType: String,
    val ecosystems: List<String> = emptyList(),
    val durationMs: Long,
    val inputFingerprint: String? = null,
    val vulnerabilityCoverage: VulnerabilityCoverage = VulnerabilityCoverage.UNAVAILABLE,
    val warnings: List<String> = emptyList(),
    val providers: ProviderAnalysisMetadata
)

data class DependencyInfo(
    val groupId: String,
    val artifactId: String,
    val version: String,
    val ecosystem: Ecosystem = Ecosystem.MAVEN,
    val sourceLocation: DependencySourceLocation? = null
)

data class OutdatedDependency(
    val groupId: String,
    val artifactId: String,
    val currentVersion: String,
    val latestVersion: String,
    val ecosystem: Ecosystem = Ecosystem.MAVEN,
    val sourceLocation: DependencySourceLocation? = null
)

data class VulnerableDependency(
    val groupId: String,
    val artifactId: String,
    val version: String,
    val vulnerabilities: List<Vulnerability>,
    val dependencyChain: List<String>? = null,
    val ecosystem: Ecosystem = Ecosystem.MAVEN,
    val sourceLocation: DependencySourceLocation? = null
)

data class DependencySourceLocation(
    val file: String,
    val line: Int,
    val startColumn: Int,
    val endColumn: Int
)