@if(!$host->sbom_data)

尚未收集 SBOM 資料,Agent 將於每天首次執行時自動收集。

@else @php $sbom = $host->sbom_data; $aptPkgs = collect($sbom['apt'] ?? [])->map(fn($p) => array_merge($p, ['type'=>'apt'])); $pipPkgs = collect($sbom['pip'] ?? [])->map(fn($p) => array_merge($p, ['type'=>'pip'])); $npmPkgs = collect($sbom['npm'] ?? [])->map(fn($p) => array_merge($p, ['type'=>'npm'])); $compPkgs = collect($sbom['composer'] ?? [])->map(fn($p) => array_merge($p, ['type'=>'composer'])); $all = $aptPkgs->merge($pipPkgs)->merge($npmPkgs)->merge($compPkgs); $typeCounts = [ 'apt' => $aptPkgs->count(), 'pip' => $pipPkgs->count(), 'npm' => $npmPkgs->count(), 'composer' => $compPkgs->count(), ]; $typeColors = ['apt'=>'primary','pip'=>'warning','npm'=>'success','composer'=>'info']; @endphp
@foreach($typeCounts as $t => $cnt) @if($cnt > 0) {{ strtoupper($t) }} {{ $cnt }} @endif @endforeach 全部 {{ $all->count() }}
@foreach($all as $pkg) @php $t = $pkg['type']; $lic = $pkg['license'] ?? ''; $desc = $pkg['description'] ?? ''; $descZh = $pkg['description_zh'] ?? ''; $licColor = match(true) { str_contains(strtolower($lic), 'mit') => 'success', str_contains(strtolower($lic), 'apache') => 'primary', str_contains(strtolower($lic), 'gpl') => 'warning', str_contains(strtolower($lic), 'bsd') => 'info', $lic === '' || $lic === 'unknown' => 'secondary', default => 'dark', }; @endphp @endforeach
名稱版本類型授權描述
{{ $pkg['name'] ?? '' }} {{ $pkg['version'] ?? '' }} {{ strtoupper($t) }} @if($lic){{ $lic }}@endif @if($descZh) {{ Str::limit($descZh, 50) }} @if($desc)
{{ $desc }}
@endif @elseif($desc) {{ $desc }} @endif
@endif