dependency-radar 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
3
+ // Generated by scripts/build-report.ts from report-ui build output
4
+ // To update, modify files in report-ui/ and run: npm run build:report
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.JS_CONTENT = exports.CSS_CONTENT = void 0;
7
+ /**
8
+ * CSS content for the dependency radar HTML report
9
+ * Built from report-ui/style.css
10
+ */
11
+ exports.CSS_CONTENT = `*,*:before,*:after{box-sizing:border-box}:root{--bg-primary: #0c1222;--bg-secondary: #151d2e;--bg-card: rgba(21, 29, 46, .95);--bg-card-hover: rgba(30, 41, 59, .95);--text-primary: #e8edf5;--text-secondary: #8b99b0;--text-muted: #5c6b82;--border-color: rgba(99, 120, 150, .2);--border-color-strong: rgba(99, 120, 150, .35);--accent: #06b6d4;--accent-hover: #22d3ee;--accent-subtle: rgba(6, 182, 212, .15);--title-gradient: linear-gradient(135deg, #06b6d4 0%, #10b981 100%);--green: #10b981;--green-bg: rgba(16, 185, 129, .15);--amber: #f59e0b;--amber-bg: rgba(245, 158, 11, .15);--red: #ef4444;--red-bg: rgba(239, 68, 68, .15);--gray: #64748b;--gray-bg: rgba(100, 116, 139, .15);--license-permissive: #10b981;--license-weak-copyleft: #f59e0b;--license-strong-copyleft: #ef4444;--license-unknown: #64748b;--font-stack: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--transition: .2s ease;--radius: 8px;--radius-lg: 12px}:root.light{--bg-primary: #f5f7fa;--bg-secondary: #e8ecf2;--bg-card: rgba(255, 255, 255, .98);--bg-card-hover: rgba(248, 250, 252, 1);--text-primary: #0f172a;--text-secondary: #475569;--text-muted: #64748b;--border-color: rgba(100, 116, 139, .18);--border-color-strong: rgba(100, 116, 139, .3);--accent: #0891b2;--accent-hover: #06b6d4;--accent-subtle: rgba(8, 145, 178, .1);--title-gradient: linear-gradient(135deg, #0891b2 0%, #059669 100%)}html{scroll-behavior:smooth}body{font-family:var(--font-stack);background:var(--bg-primary);color:var(--text-primary);margin:0;padding:0;line-height:1.5;transition:background var(--transition),color var(--transition)}.top-header{padding:28px 24px 20px;max-width:1400px;margin:0 auto}.header-row{display:flex;align-items:flex-start;justify-content:space-between;gap:24px}.header-content{display:flex;align-items:flex-start;gap:18px}.logo,.logo-wrapper{display:block;width:64px;height:64px;flex-shrink:0}.logo svg{width:100%;height:100%}.header-text h1{margin:0;font-size:26px;font-weight:700;background:var(--title-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:-.02em}.header-meta{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px;font-size:12px}.meta-item{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-secondary)}.meta-item strong{color:var(--text-primary);font-family:var(--font-mono);font-size:11px;font-weight:500}.meta-label{color:var(--text-muted);font-size:10px;text-transform:uppercase;letter-spacing:.3px}.header-disclaimer{display:block;width:100%;font-size:10px;color:var(--text-muted);margin-top:6px;padding-left:2px}.cta-section{flex-shrink:0;text-align:right;max-width:280px}.cta-link{display:inline-flex;align-items:center;gap:8px;padding:10px 18px;background:var(--accent);color:#fff;text-decoration:none;border-radius:var(--radius);font-size:13px;font-weight:600;transition:all var(--transition);box-shadow:0 2px 8px #06b6d440}.cta-link:hover{background:var(--accent-hover);transform:translateY(-1px);box-shadow:0 4px 12px #06b6d459}.cta-benefits{margin-top:8px;font-size:11px;color:var(--text-muted);line-height:1.5;text-align:left;padding-left:2px}.cta-benefits span{display:block;padding-left:12px;position:relative}.cta-benefits span:before{content:"→";position:absolute;left:0;color:var(--accent);font-size:10px}.cta-text{display:block;font-size:11px;color:var(--text-muted);margin-top:6px}.cta-arrow{font-size:14px;transition:transform var(--transition)}.cta-link:hover .cta-arrow{transform:translate(2px)}.filter-bar{position:sticky;top:0;z-index:100;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:12px 24px;transition:background var(--transition),border-color var(--transition)}.filter-bar-inner{max-width:1400px;margin:0 auto;display:flex;flex-wrap:wrap;align-items:center;gap:12px}.filter-group{display:flex;align-items:center;gap:6px}.filter-label{font-size:12px;font-weight:500;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px}.search-wrapper{position:relative;flex:1;min-width:180px;max-width:280px}.search-icon{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-muted);pointer-events:none}input[type=search]{width:100%;padding:8px 12px 8px 32px;border:1px solid var(--border-color);border-radius:var(--radius);background:var(--bg-primary);color:var(--text-primary);font-size:14px;transition:border-color var(--transition),background var(--transition)}input[type=search]:focus{outline:none;border-color:var(--accent)}input[type=search]::placeholder{color:var(--text-muted)}select{padding:8px 28px 8px 10px;border:1px solid var(--border-color);border-radius:var(--radius);background:var(--bg-primary);color:var(--text-primary);font-size:13px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;transition:border-color var(--transition),background var(--transition)}select:focus{outline:none;border-color:var(--accent)}.sort-wrapper{display:flex;align-items:center;gap:4px}.sort-direction-btn{padding:8px;border:1px solid var(--border-color);border-radius:var(--radius);background:var(--bg-primary);color:var(--text-secondary);cursor:pointer;font-size:14px;line-height:1;transition:all var(--transition)}.sort-direction-btn:hover{border-color:var(--accent);color:var(--accent)}.checkbox-filter{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text-secondary);cursor:pointer}.checkbox-filter input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}.theme-toggle{margin-left:auto;display:flex;align-items:center;gap:8px}.theme-toggle-label{font-size:12px;color:var(--text-muted)}.theme-switch{position:relative;width:44px;height:24px;background:var(--bg-primary);border:1px solid var(--border-color);border-radius:12px;cursor:pointer;transition:background var(--transition),border-color var(--transition)}.theme-switch:after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;background:var(--text-secondary);border-radius:50%;transition:transform var(--transition),background var(--transition)}.theme-switch.light:after{transform:translate(20px);background:var(--accent)}.license-filter-toggle{padding:6px 12px;border:1px solid var(--border-color);border-radius:var(--radius);background:transparent;color:var(--text-secondary);font-size:12px;cursor:pointer;display:flex;align-items:center;gap:6px;transition:all var(--transition)}.license-filter-toggle:hover{border-color:var(--accent);color:var(--accent)}.license-filter-toggle .chevron{transition:transform var(--transition)}.license-filter-toggle.open .chevron{transform:rotate(180deg)}.license-filter-panel{max-height:0;overflow:hidden;transition:max-height .3s ease-out;background:var(--bg-secondary);border-bottom:1px solid transparent}.license-filter-panel.open{max-height:200px;border-bottom-color:var(--border-color)}.license-filter-inner{max-width:1400px;margin:0 auto;padding:12px 24px}.license-filter-header{display:flex;align-items:center;gap:12px;margin-bottom:8px}.license-filter-title{font-size:12px;font-weight:500;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px}.license-quick-actions{display:flex;gap:8px}.quick-action-btn{padding:4px 10px;font-size:11px;border:1px solid var(--border-color);border-radius:4px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:all var(--transition)}.quick-action-btn:hover{border-color:var(--accent);color:var(--accent)}.license-groups{display:flex;flex-wrap:wrap;gap:16px}.license-group-checkbox{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text-secondary);cursor:pointer}.license-group-checkbox input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}.license-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.license-dot.permissive{background:var(--license-permissive)}.license-dot.weak-copyleft{background:var(--license-weak-copyleft)}.license-dot.strong-copyleft{background:var(--license-strong-copyleft)}.license-dot.unknown{background:var(--license-unknown)}.tool-errors{max-width:1400px;margin:16px auto;padding:12px 16px;background:var(--red-bg);border:1px solid var(--red);border-radius:var(--radius);color:var(--red)}.tool-errors:empty{display:none}.tool-errors strong{display:block;margin-bottom:8px}.main-content{max-width:1400px;margin:0 auto;padding:16px 24px 48px}.results-summary{margin-bottom:16px;font-size:14px;color:var(--text-secondary)}.results-summary strong{color:var(--text-primary)}.dependency-grid{display:flex;flex-direction:column;gap:8px}.dep-card{background:var(--bg-card);border:1px solid var(--border-color);border-radius:var(--radius-lg);overflow:hidden;transition:border-color var(--transition)}.dep-card:hover{border-color:var(--border-color-strong)}.dep-card[data-risk=red]{border-left:3px solid var(--red)}.dep-card[data-risk=amber]{border-left:3px solid var(--amber)}.dep-card[data-risk=green]{border-left:3px solid var(--green)}.dep-summary{display:flex;align-items:center;gap:10px;padding:0 0 0 12px;cursor:pointer;list-style:none;transition:background var(--transition)}.dep-summary:hover{background:var(--bg-card-hover)}.dep-summary::-webkit-details-marker{display:none}.expand-icon{color:var(--text-muted);transition:transform var(--transition);flex-shrink:0}details[open] .expand-icon{transform:rotate(90deg)}.dep-name{font-family:var(--font-mono);font-size:14px;font-weight:600;color:var(--text-primary);padding:8px 0}.dep-version{font-weight:400;color:var(--text-secondary)}.dep-indicators{display:grid;grid-template-columns:repeat(5,1fr);margin-left:auto;flex-shrink:0;width:60%}.badge-card{display:flex;flex-direction:column;justify-content:center;min-height:38px;padding:4px 8px 4px 10px;background:var(--bg-primary);border-left:1px solid var(--border-color);position:relative;overflow:hidden}.badge-card:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--gray)}.badge-card.green:before{background:var(--green)}.badge-card.amber:before{background:var(--amber)}.badge-card.red:before{background:var(--red)}.badge-card.gray:before{background:var(--gray)}.badge-label{font-size:8px;font-weight:500;color:var(--text-muted);text-transform:uppercase;letter-spacing:.3px;line-height:1.1}.badge-value{font-size:11px;font-weight:500;color:var(--text-primary);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dep-details{padding:0 16px 16px;border-top:1px solid var(--border-color);animation:slideDown .2s ease-out}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.package-links{display:flex;flex-wrap:wrap;gap:8px;padding:12px 0;margin-bottom:4px;border-bottom:1px solid var(--border-color)}.package-link{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:var(--bg-hover);border:1px solid var(--border-color);border-radius:var(--radius-md);color:var(--text-primary);text-decoration:none;font-size:13px;font-weight:500;transition:all var(--transition)}.package-link:hover{background:var(--accent);border-color:var(--accent);color:#fff}.package-link svg{width:14px;height:14px;flex-shrink:0}.section,.section:first-child{margin-top:16px}.section-header{display:flex;align-items:center;gap:8px;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid var(--border-color)}.section-title{font-size:13px;font-weight:600;color:var(--text-primary);text-transform:uppercase;letter-spacing:.5px}.section-desc{font-size:11px;color:var(--text-muted)}.kv-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px}.kv-item{display:flex;flex-direction:column;gap:2px}.kv-label{font-size:12px;font-weight:500;color:var(--text-muted)}.kv-value{font-size:14px;color:var(--text-primary)}.kv-hint{font-size:11px;color:var(--text-muted);font-style:italic}.package-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.package-tag{padding:2px 8px;background:var(--bg-primary);border:1px solid var(--border-color);border-radius:4px;font-size:11px;font-family:var(--font-mono);color:var(--text-secondary)}.package-list-toggle{font-size:11px;color:var(--accent);background:none;border:none;cursor:pointer;padding:2px 4px}.package-list-toggle:hover{text-decoration:underline}.vuln-table{width:100%;border-collapse:collapse;font-size:13px}.vuln-table th,.vuln-table td{text-align:left;padding:8px 12px;border-bottom:1px solid var(--border-color)}.vuln-table th{font-weight:500;color:var(--text-muted);font-size:11px;text-transform:uppercase;letter-spacing:.5px}.vuln-table tr[data-severity=critical],.vuln-table tr[data-severity=high]{background:var(--red-bg)}.vuln-table tr[data-severity=moderate]{background:var(--amber-bg)}.vuln-table a{color:var(--accent);text-decoration:none}.vuln-table a:hover{text-decoration:underline}.no-vulns{font-size:13px;color:var(--text-secondary);padding:8px 0}.raw-data-toggle{margin-top:16px}.raw-data-toggle summary{font-size:12px;color:var(--text-muted);cursor:pointer;padding:8px 0}.raw-data-toggle pre{margin:8px 0 0;padding:12px;background:var(--bg-primary);border:1px solid var(--border-color);border-radius:var(--radius);font-family:var(--font-mono);font-size:11px;color:var(--text-secondary);overflow-x:auto;max-height:300px}.empty-state{text-align:center;padding:48px 24px;color:var(--text-muted)}.empty-state-icon{font-size:48px;margin-bottom:12px}.empty-state-text{font-size:16px}@media (max-width: 768px){.top-header{padding:20px 16px}.header-row{flex-direction:column;align-items:flex-start;gap:16px}.header-content{gap:12px}.logo,.logo-wrapper{width:48px;height:48px}.header-text h1{font-size:22px}.header-meta{gap:6px}.meta-item{padding:3px 8px;font-size:11px}.cta-section{width:100%;max-width:none;text-align:left}.cta-benefits{display:none}.filter-bar{padding:10px 16px}.filter-bar-inner{flex-direction:column;align-items:stretch;gap:10px}.search-wrapper{max-width:none}.filter-group{justify-content:space-between}.theme-toggle{margin-left:0;justify-content:flex-end}.main-content{padding:12px 16px 32px}.dep-summary{flex-wrap:wrap;padding:8px 12px}.dep-name{font-size:13px}.dep-indicators{display:flex;flex-wrap:wrap;min-width:auto;width:100%;margin-left:0;margin-top:6px;padding-top:6px;border-top:1px solid var(--border-color);gap:4px}.badge-card{flex:1 1 calc(50% - 4px);min-width:0}.badge-value{font-size:10px}.badge-label{font-size:7px}}@media (max-width: 480px){.header-text h1{font-size:20px}.meta-item{font-size:10px;padding:2px 6px}.cta-link{width:100%;justify-content:center;padding:12px 16px}.badge-card{flex:1 1 100%}}
12
+ `;
13
+ /**
14
+ * JavaScript content for the dependency radar HTML report
15
+ * Built from report-ui/main.ts
16
+ */
17
+ exports.JS_CONTENT = `!function(){"use strict";const e={permissive:["MIT","ISC","BSD-2-Clause","BSD-3-Clause","Apache-2.0","Unlicense","0BSD","CC0-1.0","BSD","Apache","Apache 2.0","Apache License 2.0","MIT License","ISC License"],weakCopyleft:["LGPL-2.1","LGPL-3.0","LGPL-2.0","LGPL","MPL-2.0","MPL-1.1","MPL","EPL-1.0","EPL-2.0","EPL"],strongCopyleft:["GPL-2.0","GPL-3.0","GPL","AGPL-3.0","AGPL","GPL-2.0-only","GPL-3.0-only","GPL-2.0-or-later","GPL-3.0-or-later"]};function n(n){if(!n)return"unknown";const t=n.toUpperCase();for(const[s,i]of Object.entries(e))if(i.some(e=>t.includes(e.toUpperCase())))return s;return"unknown"}const t={none:0,low:1,moderate:2,high:3,critical:4};function s(e){var n;return(null==(n=e.vulnerabilities)?void 0:n.highestSeverity)||"none"}function i(e){if(!e)return"0 B";const n=["B","KB","MB","GB"];let t=e,s=0;for(;t>=1024&&s<n.length-1;)t/=1024,s++;return t.toFixed(t>=10?0:1)+" "+n[s]}function a(e){return e?"Yes":"No"}function o(e){return e?String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):""}function r(e){return"imported"===e?"Imported":"not-imported"===e?"Not imported":"undeclared"===e?"Undeclared":"Unknown"}function l(e,n,t){return'<div class="badge-card '+t+'"><span class="badge-label">'+o(e)+'</span><span class="badge-value">'+o(n)+"</span></div>"}function c(e,n,t){let s='<div class="kv-item">';return s+='<span class="kv-label">'+o(e)+"</span>",s+='<span class="kv-value">'+o(String(n))+"</span>",t&&(s+='<span class="kv-hint">'+o(t)+"</span>"),s+="</div>",s}function d(e,n){if(!e||0===e.length)return'<span class="kv-value">None</span>';const t=e.slice(0,n),s=e.length-n;let i='<div class="package-list">';return t.forEach(e=>{i+='<span class="package-tag">'+o(e)+"</span>"}),s>0&&(i+='<span class="package-tag">+'+s+" more</span>"),i+="</div>",i}function u(e,n,t){let s='<div class="section">';return s+='<div class="section-header">',s+='<span class="section-title">'+o(e)+"</span>",n&&(s+='<span class="section-desc">'+o(n)+"</span>"),s+="</div>",s+=t,s+="</div>",s}function p(e,n,t){return u(e,n,'<div class="kv-grid">'+t.join("")+"</div>")}function m(e){const n='<svg viewBox="0 0 24 24" fill="currentColor"><path d="M0 7.334v8h6.666v1.332H12v-1.332h12v-8H0zm6.666 6.664H5.334v-4H3.999v4H1.335V8.667h5.331v5.331zm4 0v1.336H8.001V8.667h5.334v5.332h-2.669v-.001zm12.001 0h-1.33v-4h-1.336v4h-1.335v-4h-1.33v4h-2.671V8.667h8.002v5.331zM10.665 10H12v2.667h-1.335V10z"/></svg>',t='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"/></svg>',s='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>',i='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>';let a='<div class="package-links">';return a+='<a href="'+o(e.npm)+'" target="_blank" rel="noopener" class="package-link">'+n+"npm</a>",e.repository&&(a+='<a href="'+o(e.repository)+'" target="_blank" rel="noopener" class="package-link">'+t+"Repository</a>"),e.homepage&&(a+='<a href="'+o(e.homepage)+'" target="_blank" rel="noopener" class="package-link">'+i+"Homepage</a>"),e.bugs&&(a+='<a href="'+o(e.bugs)+'" target="_blank" rel="noopener" class="package-link">'+s+"Issues</a>"),a+="</div>",a}function g(e){var t,g;const h=e.license.license||"Unknown",v=n(h),y=function(e){const n=[e.vulnRisk,e.licenseRisk];return n.includes("red")?"red":n.includes("amber")?"amber":"green"}(e),f=s(e),k={permissive:{text:"Permissive",class:"green"},weakCopyleft:{text:"Weak Copyleft",class:"amber"},strongCopyleft:{text:"Strong Copyleft",class:"red"},unknown:{text:"Unknown",class:"gray"}},C=e.direct?"Dependency":"Sub-Dependency",L=e.direct?"green":"amber",B="runtime"===e.runtimeClass?"green":"build-time"===e.runtimeClass?"amber":"gray",S="undeclared"===e.usage.status?"red":"imported"===e.usage.status?"green":"not-imported"===e.usage.status?"amber":"gray",E=[l("Type",C,L),l("Runtime",(w=e.runtimeClass,"runtime"===w?"Runtime":"build-time"===w?"Build-time":"dev-only"===w?"Dev-only":w),B),l("License",h,k[v].class),l("Vulns",(b=f,b?b.charAt(0).toUpperCase()+b.slice(1):b),e.vulnRisk),l("Usage",r(e.usage.status),S)];var b,w;const I=['<summary class="dep-summary">','<svg class="expand-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m9 18 6-6-6-6"/></svg>','<span class="dep-name">'+o(e.name)+'<span class="dep-version">@'+o(e.version)+"</span></span>",'<div class="dep-indicators">',E.join(""),"</div>","</summary>"].join(""),P=e.vulnerabilities.items.map(e=>'<tr data-severity="'+e.severity+'"><td>'+o(e.title)+"</td><td>"+o(e.severity)+"</td><td>"+o(e.vulnerableRange||"")+'</td><td><a href="'+o(e.url||"#")+'" target="_blank" rel="noopener">Link</a></td></tr>').join(""),x=e.vulnerabilities.items.length?'<table class="vuln-table"><thead><tr><th>Title</th><th>Severity</th><th>Range</th><th>Ref</th></tr></thead><tbody>'+P+"</tbody></table>":'<p class="no-vulns">No known vulnerabilities.</p>',D=JSON.stringify(e,null,2),j=(e.parents||[]).map(e=>e.split("@")[0]),M=(e.rootCauses||[]).join(", ")||(e.direct?"package.json":"Unknown"),R=p("Overview","Dependency position and runtime classification",[c("Type",C,e.direct?"Listed in package.json":"Installed as a sub-dependency"),c("Depth",e.depth,"How deep this package is in the dependency tree"),c("Parents",j.join(", ")||"None (direct dependency)","Packages that directly depend on this"),c("Installed By",M,"Root dependency in package.json that causes this to be installed"),c("Runtime Class",e.runtimeClass,e.runtimeReason)]),T=p("License","License information for this package",[c("License",h,"The declared license"),c("Category",k[v].text,"Business-friendliness classification"),c("License File",e.license.licenseFile||"Not found","Path to license file if present")]),U=u("Vulnerabilities","Known security issues from npm audit",x),z=u("Maintenance","Package maintenance status",'<div class="kv-grid">'+c("Status",e.maintenance.status,e.maintenance.reason)+(e.maintenance.lastPublished?c("Last Published",e.maintenance.lastPublished,""):"")+"</div>"),A=u("Usage","Static import usage in your codebase",'<div class="kv-grid">'+c("Status",r(e.usage.status),e.usage.reason)+"</div>"),F=p("Identity & Metadata","Package metadata",[c("Deprecated",a(e.identity.deprecated),"Whether the author has deprecated this package"),c("Node Engine",e.identity.nodeEngine||"Any","Required Node.js version"),c("Repository",a(e.identity.hasRepository),"Whether source repo is linked"),c("Funding",a(e.identity.hasFunding),"Whether funding info is provided")]),G=p("Dependency Surface","What this package depends on",[c("Dependencies",e.dependencySurface.dependencies+" prod / "+e.dependencySurface.devDependencies+" dev / "+e.dependencySurface.peerDependencies+" peer / "+e.dependencySurface.optionalDependencies+" optional",""),c("Has Peer Dependencies",a(e.dependencySurface.hasPeerDependencies),"Peer deps can complicate upgrades")]),H=p("Size & Footprint","Disk space usage",[c("Installed Size",i(e.sizeFootprint.installedSize),"Total size on disk"),c("File Count",e.sizeFootprint.fileCount,"Number of files installed")]),N=p("Build & Platform","Build complexity indicators",[c("Native Code",a(e.buildPlatform.nativeBindings),"Requires compilation"),c("Install Scripts",a(e.buildPlatform.installScripts),"Runs code during install")]),O=p("Module System","Module format information",[c("Format",e.moduleSystem.format,"CommonJS, ESM, or dual"),c("Conditional Exports",a(e.moduleSystem.conditionalExports),"Uses exports field")]),V=p("TypeScript","Type definition support",[c("Types","bundled"===e.typescript.types?"Bundled":"None","Whether types are included")]),W=(null==(t=e.graph)?void 0:t.dependedOnBy)||[],q=(null==(g=e.graph)?void 0:g.dependsOn)||[],_=u("Graph Shape","Dependency graph connections",'<div class="kv-grid"><div class="kv-item"><span class="kv-label">Depended On By ('+e.graph.fanIn+")</span>"+d(W,8)+'</div><div class="kv-item"><span class="kv-label">Depends On ('+e.graph.fanOut+")</span>"+d(q,8)+"</div></div>");return['<details class="dep-card" data-risk="'+y+'">',I,'<div class="dep-details">',m(e.links),R,T,U,z,A,F,G,H,N,O,V,_,'<details class="raw-data-toggle"><summary>View raw data</summary><pre>'+o(D)+"</pre></details>","</div>","</details>"].join("")}async function h(){var e,i;const a=await async function(){const e=document.getElementById("radar-data");return e&&e.textContent&&"{}"!==e.textContent.trim()?JSON.parse(e.textContent):(await fetch("./sample-data.json")).json()}(),r=document.getElementById("dependency-list"),l=document.getElementById("results-summary"),c=document.getElementById("project-path");c&&(c.textContent=a.projectPath);const d=document.getElementById("git-branch-item"),u=document.getElementById("git-branch");a.gitBranch&&d&&u&&(u.textContent=a.gitBranch,d.style.display="");const p=document.getElementById("node-item"),m=document.getElementById("node-version"),h=document.getElementById("node-disclaimer");if((null==(e=a.environment)?void 0:e.node)&&p&&m){const e=(null==(i=a.environment.node.runtimeVersion)?void 0:i.replace(/^v/,""))||"unknown",n=a.environment.node.minRequiredMajor;m.textContent=e+(void 0!==n?\` (requires ≥\${n})\`:""),p.style.display="",void 0!==n&&h&&(h.textContent="Node requirement derived from dependency engine ranges.",h.style.display="")}const v=document.getElementById("formatted-date");if(v&&a.generatedAt)try{const e=new Date(a.generatedAt),n=new Intl.DateTimeFormat(void 0,{day:"numeric",month:"short",year:"numeric",hour:"2-digit",minute:"2-digit"}).format(e);v.textContent=n}catch{v.textContent=a.generatedAt}const y=document.getElementById("tool-errors");if(y&&a.toolErrors&&Object.keys(a.toolErrors).length>0){const e=Object.entries(a.toolErrors).map(([e,n])=>\`<div><strong>\${o(e)}:</strong> \${o(n)}</div>\`).join("");y.innerHTML=\`<strong>Some tools failed:</strong>\${e}\`}const f={search:document.getElementById("search"),direct:document.getElementById("direct-filter"),runtime:document.getElementById("runtime-filter"),sort:document.getElementById("sort-by"),sortDirection:document.getElementById("sort-direction"),hasVulns:document.getElementById("has-vulns"),unusedOnly:document.getElementById("unused-only"),themeSwitch:document.getElementById("theme-switch"),licenseToggle:document.getElementById("license-toggle"),licensePanel:document.getElementById("license-panel"),licensePermissive:document.getElementById("license-permissive"),licenseWeakCopyleft:document.getElementById("license-weak-copyleft"),licenseStrongCopyleft:document.getElementById("license-strong-copyleft"),licenseUnknown:document.getElementById("license-unknown"),licenseAll:document.getElementById("license-all"),licenseFriendly:document.getElementById("license-friendly")};let k=!0;function C(){const e=function(e){const n=f.sort.value,i=[...e];return"name"===n?i.sort((e,n)=>e.name.localeCompare(n.name)):"depth"===n?i.sort((e,n)=>e.depth-n.depth):"severity"===n?i.sort((e,n)=>t[s(n)]-t[s(e)]):"size"===n&&i.sort((e,n)=>{var t,s;return((null==(t=n.sizeFootprint)?void 0:t.installedSize)||0)-((null==(s=e.sizeFootprint)?void 0:s.installedSize)||0)}),k||i.reverse(),i}(function(){const e=(f.search.value||"").toLowerCase(),i=f.direct.value,o=f.runtime.value,r=f.hasVulns.checked,l=f.unusedOnly.checked,c=f.licensePermissive.checked,d=f.licenseWeakCopyleft.checked,u=f.licenseStrongCopyleft.checked,p=f.licenseUnknown.checked;return a.dependencies.filter(a=>{if(e&&!a.name.toLowerCase().includes(e)&&!(a.license.license||"").toLowerCase().includes(e))return!1;if("direct"===i&&!a.direct)return!1;if("transitive"===i&&a.direct)return!1;if("all"!==o&&a.runtimeClass!==o)return!1;if(r&&0===t[s(a)])return!1;if(l&&"not-imported"!==a.usage.status)return!1;const m=n(a.license.license);return!("permissive"===m&&!c||"weakCopyleft"===m&&!d||"strongCopyleft"===m&&!u||"unknown"===m&&!p)})}());l.innerHTML="Showing <strong>"+e.length+"</strong> of <strong>"+a.dependencies.length+"</strong> dependencies",0!==e.length?r.innerHTML=e.map(g).join(""):r.innerHTML='<div class="empty-state"><div class="empty-state-icon">📦</div><div class="empty-state-text">No dependencies match your filters</div></div>'}"light"===localStorage.getItem("dependency-radar-theme")&&(document.documentElement.classList.add("light"),f.themeSwitch.classList.add("light")),f.themeSwitch.addEventListener("click",()=>{document.documentElement.classList.toggle("light"),f.themeSwitch.classList.toggle("light");const e=document.documentElement.classList.contains("light");localStorage.setItem("dependency-radar-theme",e?"light":"dark")}),f.licenseToggle.addEventListener("click",()=>{f.licenseToggle.classList.toggle("open"),f.licensePanel.classList.toggle("open")}),f.sortDirection.addEventListener("click",()=>{k=!k,f.sortDirection.textContent=k?"↑":"↓",C()}),f.licenseAll.addEventListener("click",()=>{f.licensePermissive.checked=!0,f.licenseWeakCopyleft.checked=!0,f.licenseStrongCopyleft.checked=!0,f.licenseUnknown.checked=!0,C()}),f.licenseFriendly.addEventListener("click",()=>{f.licensePermissive.checked=!0,f.licenseWeakCopyleft.checked=!1,f.licenseStrongCopyleft.checked=!1,f.licenseUnknown.checked=!1,C()});[f.search,f.direct,f.runtime,f.sort,f.hasVulns,f.unusedOnly,f.licensePermissive,f.licenseWeakCopyleft,f.licenseStrongCopyleft,f.licenseUnknown].forEach(e=>{e&&(e.addEventListener("input",C),e.addEventListener("change",C))}),C()}"loading"===document.readyState?document.addEventListener("DOMContentLoaded",h):h()}();
18
+ `;