codebase-onboarder 0.6.0 → 0.7.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.
- package/README.md +174 -46
- package/bin/build-if-source.js +23 -0
- package/cli/commands.d.ts +26 -0
- package/cli/commands.js +836 -811
- package/cli/commands.js.map +1 -0
- package/cli/explorer/advanced.d.ts +14 -0
- package/cli/explorer/advanced.js +321 -329
- package/cli/explorer/advanced.js.map +1 -0
- package/cli/explorer/app.d.ts +1 -0
- package/cli/explorer/app.js +384 -313
- package/cli/explorer/app.js.map +1 -0
- package/cli/explorer/assistant.d.ts +9 -0
- package/cli/explorer/assistant.js +58 -0
- package/cli/explorer/assistant.js.map +1 -0
- package/cli/explorer/commands.d.ts +17 -0
- package/cli/explorer/commands.js +368 -302
- package/cli/explorer/commands.js.map +1 -0
- package/cli/explorer/featureViews.d.ts +124 -0
- package/cli/explorer/featureViews.js +179 -0
- package/cli/explorer/featureViews.js.map +1 -0
- package/cli/explorer/github.d.ts +21 -0
- package/cli/explorer/github.js +42 -44
- package/cli/explorer/github.js.map +1 -0
- package/cli/explorer/graphs.d.ts +7 -0
- package/cli/explorer/graphs.js +90 -95
- package/cli/explorer/graphs.js.map +1 -0
- package/cli/explorer/picker.d.ts +22 -0
- package/cli/explorer/picker.js +150 -0
- package/cli/explorer/picker.js.map +1 -0
- package/cli/explorer/report.d.ts +85 -0
- package/cli/explorer/report.js +60 -0
- package/cli/explorer/report.js.map +1 -0
- package/cli/explorer/session.d.ts +449 -0
- package/cli/explorer/session.js +143 -144
- package/cli/explorer/session.js.map +1 -0
- package/cli/explorer/views.d.ts +19 -0
- package/cli/explorer/views.js +465 -482
- package/cli/explorer/views.js.map +1 -0
- package/cli/explorer/wrap.d.ts +1 -0
- package/cli/explorer/wrap.js +28 -44
- package/cli/explorer/wrap.js.map +1 -0
- package/cli/main.d.ts +1 -0
- package/cli/main.js +214 -161
- package/cli/main.js.map +1 -0
- package/cli/prompt.d.ts +5 -0
- package/cli/prompt.js +84 -80
- package/cli/prompt.js.map +1 -0
- package/cli/scanOptions.d.ts +2 -0
- package/cli/scanOptions.js +11 -0
- package/cli/scanOptions.js.map +1 -0
- package/cli/ui.d.ts +33 -0
- package/cli/ui.js +35 -44
- package/cli/ui.js.map +1 -0
- package/cli/wizard.d.ts +187 -0
- package/cli/wizard.js +304 -284
- package/cli/wizard.js.map +1 -0
- package/package.json +15 -4
- package/public/app.d.ts +1 -0
- package/public/app.js +1057 -1009
- package/public/app.js.map +1 -0
- package/public/browser.d.ts +68 -0
- package/public/browser.js +2 -0
- package/public/browser.js.map +1 -0
- package/public/index.html +30 -13
- package/public/js/about.d.ts +6 -0
- package/public/js/about.js +152 -172
- package/public/js/about.js.map +1 -0
- package/public/js/aiDraft.d.ts +3 -0
- package/public/js/aiDraft.js +116 -124
- package/public/js/aiDraft.js.map +1 -0
- package/public/js/analysisPanel.d.ts +7 -0
- package/public/js/analysisPanel.js +166 -166
- package/public/js/analysisPanel.js.map +1 -0
- package/public/js/analysisReport.d.ts +38 -0
- package/public/js/analysisReport.js +105 -110
- package/public/js/analysisReport.js.map +1 -0
- package/public/js/api.d.ts +26 -0
- package/public/js/api.js +176 -167
- package/public/js/api.js.map +1 -0
- package/public/js/atlas.d.ts +6 -0
- package/public/js/atlas.js +50 -58
- package/public/js/atlas.js.map +1 -0
- package/public/js/blameView.d.ts +2 -0
- package/public/js/blameView.js +36 -37
- package/public/js/blameView.js.map +1 -0
- package/public/js/codeTab.d.ts +3 -0
- package/public/js/codeTab.js +175 -180
- package/public/js/codeTab.js.map +1 -0
- package/public/js/codeViewer.d.ts +5 -0
- package/public/js/codeViewer.js +162 -150
- package/public/js/codeViewer.js.map +1 -0
- package/public/js/components/FileChip.d.ts +9 -0
- package/public/js/components/FileChip.js +45 -49
- package/public/js/components/FileChip.js.map +1 -0
- package/public/js/components/MetricSparkline.d.ts +7 -0
- package/public/js/components/MetricSparkline.js +35 -44
- package/public/js/components/MetricSparkline.js.map +1 -0
- package/public/js/components/RiskBadge.d.ts +9 -0
- package/public/js/components/RiskBadge.js +55 -63
- package/public/js/components/RiskBadge.js.map +1 -0
- package/public/js/deepAnalysisView.d.ts +99 -0
- package/public/js/deepAnalysisView.js +282 -302
- package/public/js/deepAnalysisView.js.map +1 -0
- package/public/js/diagramPane.d.ts +8 -0
- package/public/js/diagramPane.js +133 -135
- package/public/js/diagramPane.js.map +1 -0
- package/public/js/diffView.d.ts +6 -0
- package/public/js/diffView.js +222 -209
- package/public/js/diffView.js.map +1 -0
- package/public/js/docsView.d.ts +2 -0
- package/public/js/docsView.js +441 -442
- package/public/js/docsView.js.map +1 -0
- package/public/js/dom.d.ts +189 -0
- package/public/js/dom.js +5 -0
- package/public/js/dom.js.map +1 -0
- package/public/js/fileSourceBrowser.d.ts +5 -0
- package/public/js/fileSourceBrowser.js +33 -41
- package/public/js/fileSourceBrowser.js.map +1 -0
- package/public/js/flameGraph.d.ts +5 -0
- package/public/js/flameGraph.js +62 -72
- package/public/js/flameGraph.js.map +1 -0
- package/public/js/forceGraph.d.ts +10 -0
- package/public/js/forceGraph.js +581 -556
- package/public/js/forceGraph.js.map +1 -0
- package/public/js/heatmap.d.ts +4 -0
- package/public/js/heatmap.js +142 -164
- package/public/js/heatmap.js.map +1 -0
- package/public/js/highlight.d.ts +2 -0
- package/public/js/highlight.js +116 -107
- package/public/js/highlight.js.map +1 -0
- package/public/js/html.d.ts +2 -0
- package/public/js/html.js +14 -44
- package/public/js/html.js.map +1 -0
- package/public/js/insightsView.d.ts +5 -0
- package/public/js/insightsView.js +93 -111
- package/public/js/insightsView.js.map +1 -0
- package/public/js/inspector.d.ts +37 -0
- package/public/js/inspector.js +416 -445
- package/public/js/inspector.js.map +1 -0
- package/public/js/llm.d.ts +113 -0
- package/public/js/llm.js +233 -272
- package/public/js/llm.js.map +1 -0
- package/public/js/mapView.d.ts +3 -0
- package/public/js/mapView.js +121 -120
- package/public/js/mapView.js.map +1 -0
- package/public/js/markdown.d.ts +3 -0
- package/public/js/markdown.js +84 -91
- package/public/js/markdown.js.map +1 -0
- package/public/js/mindmap.d.ts +32 -0
- package/public/js/mindmap.js +244 -259
- package/public/js/mindmap.js.map +1 -0
- package/public/js/mobilePanels.d.ts +5 -0
- package/public/js/mobilePanels.js +50 -0
- package/public/js/mobilePanels.js.map +1 -0
- package/public/js/repoFiles.d.ts +12 -0
- package/public/js/repoFiles.js +28 -27
- package/public/js/repoFiles.js.map +1 -0
- package/public/js/reviewView.d.ts +28 -0
- package/public/js/reviewView.js +256 -0
- package/public/js/reviewView.js.map +1 -0
- package/public/js/sbomView.d.ts +3 -0
- package/public/js/sbomView.js +59 -67
- package/public/js/sbomView.js.map +1 -0
- package/public/js/scanCache.d.ts +16 -0
- package/public/js/scanCache.js +67 -65
- package/public/js/scanCache.js.map +1 -0
- package/public/js/search.d.ts +7 -0
- package/public/js/search.js +868 -800
- package/public/js/search.js.map +1 -0
- package/public/js/searchLocal.d.ts +42 -0
- package/public/js/searchLocal.js +87 -0
- package/public/js/searchLocal.js.map +1 -0
- package/public/js/serverSettings.d.ts +5 -0
- package/public/js/serverSettings.js +153 -164
- package/public/js/serverSettings.js.map +1 -0
- package/public/js/state.d.ts +798 -0
- package/public/js/state.js +114 -122
- package/public/js/state.js.map +1 -0
- package/public/js/tour.d.ts +6 -0
- package/public/js/tour.js +5 -7
- package/public/js/tour.js.map +1 -0
- package/public/js/transitions.d.ts +2 -0
- package/public/js/transitions.js +9 -10
- package/public/js/transitions.js.map +1 -0
- package/public/js/tree.d.ts +12 -0
- package/public/js/tree.js +157 -154
- package/public/js/tree.js.map +1 -0
- package/public/js/workflowsView.d.ts +3 -0
- package/public/js/workflowsView.js +15 -22
- package/public/js/workflowsView.js.map +1 -0
- package/public/search.css +495 -0
- package/public/styles.css +163 -346
- package/public/workbench.css +166 -0
- package/server/apiAuth.d.ts +3 -0
- package/server/apiAuth.js +18 -20
- package/server/apiAuth.js.map +1 -0
- package/server/apiDiff.d.ts +2 -0
- package/server/apiDiff.js +20 -18
- package/server/apiDiff.js.map +1 -0
- package/server/apiDocs.d.ts +2 -0
- package/server/apiDocs.js +38 -40
- package/server/apiDocs.js.map +1 -0
- package/server/apiFile.d.ts +1 -0
- package/server/apiFile.js +14 -17
- package/server/apiFile.js.map +1 -0
- package/server/apiGitBlame.d.ts +2 -0
- package/server/apiGitBlame.js +50 -51
- package/server/apiGitBlame.js.map +1 -0
- package/server/apiMcp.d.ts +4 -0
- package/server/apiMcp.js +64 -66
- package/server/apiMcp.js.map +1 -0
- package/server/apiReview.d.ts +2 -0
- package/server/apiReview.js +45 -0
- package/server/apiReview.js.map +1 -0
- package/server/apiScan.d.ts +5 -0
- package/server/apiScan.js +90 -71
- package/server/apiScan.js.map +1 -0
- package/server/apiSearch.d.ts +33 -0
- package/server/apiSearch.js +184 -200
- package/server/apiSearch.js.map +1 -0
- package/server/apiSettings.d.ts +4 -0
- package/server/apiSettings.js +84 -85
- package/server/apiSettings.js.map +1 -0
- package/server/apiTools.d.ts +3 -0
- package/server/apiTools.js +55 -56
- package/server/apiTools.js.map +1 -0
- package/server/auth.d.ts +5 -0
- package/server/auth.js +54 -51
- package/server/auth.js.map +1 -0
- package/server/config.d.ts +42 -0
- package/server/config.js +189 -194
- package/server/config.js.map +1 -0
- package/server/daemon.d.ts +12 -0
- package/server/daemon.js +124 -114
- package/server/daemon.js.map +1 -0
- package/server/fileSourceNode.d.ts +2 -0
- package/server/fileSourceNode.js +34 -36
- package/server/fileSourceNode.js.map +1 -0
- package/server/gitClone.d.ts +9 -0
- package/server/gitClone.js +59 -61
- package/server/gitClone.js.map +1 -0
- package/server/gitDiff.d.ts +36 -0
- package/server/gitDiff.js +271 -169
- package/server/gitDiff.js.map +1 -0
- package/server/gitHistory.d.ts +12 -0
- package/server/gitHistory.js +80 -80
- package/server/gitHistory.js.map +1 -0
- package/server/gitRemote.d.ts +12 -0
- package/server/gitRemote.js +37 -38
- package/server/gitRemote.js.map +1 -0
- package/server/htmlText.d.ts +4 -0
- package/server/htmlText.js +16 -23
- package/server/htmlText.js.map +1 -0
- package/server/http.d.ts +5 -0
- package/server/http.js +27 -30
- package/server/http.js.map +1 -0
- package/server/httpGuards.d.ts +2 -0
- package/server/httpGuards.js +47 -43
- package/server/httpGuards.js.map +1 -0
- package/server/https.d.ts +34 -0
- package/server/https.js +121 -111
- package/server/https.js.map +1 -0
- package/server/index.d.ts +40 -0
- package/server/index.js +139 -147
- package/server/index.js.map +1 -0
- package/server/layout.d.ts +26 -0
- package/server/layout.js +59 -64
- package/server/layout.js.map +1 -0
- package/server/llmProxy.d.ts +3 -0
- package/server/llmProxy.js +137 -135
- package/server/llmProxy.js.map +1 -0
- package/server/logger.d.ts +38 -0
- package/server/logger.js +198 -211
- package/server/logger.js.map +1 -0
- package/server/mcp/analysis.d.ts +29 -0
- package/server/mcp/analysis.js +99 -120
- package/server/mcp/analysis.js.map +1 -0
- package/server/mcp/http.d.ts +9 -0
- package/server/mcp/http.js +128 -137
- package/server/mcp/http.js.map +1 -0
- package/server/mcp/runner.d.ts +68 -0
- package/server/mcp/runner.js +208 -218
- package/server/mcp/runner.js.map +1 -0
- package/server/mcp/server.d.ts +29 -0
- package/server/mcp/server.js +166 -179
- package/server/mcp/server.js.map +1 -0
- package/server/mcp/standalone.d.ts +1 -0
- package/server/mcp/standalone.js +8 -10
- package/server/mcp/standalone.js.map +1 -0
- package/server/mcp/tools.d.ts +2020 -0
- package/server/mcp/tools.js +523 -574
- package/server/mcp/tools.js.map +1 -0
- package/server/paths.d.ts +3 -0
- package/server/paths.js +17 -15
- package/server/paths.js.map +1 -0
- package/server/pidfile.d.ts +9 -0
- package/server/pidfile.js +43 -45
- package/server/pidfile.js.map +1 -0
- package/server/review.d.ts +5 -0
- package/server/review.js +35 -0
- package/server/review.js.map +1 -0
- package/server/router.d.ts +33 -0
- package/server/router.js +191 -197
- package/server/router.js.map +1 -0
- package/server/scanRequest.d.ts +3 -0
- package/server/scanRequest.js +36 -0
- package/server/scanRequest.js.map +1 -0
- package/server/searchIndex.d.ts +17 -0
- package/server/searchIndex.js +83 -80
- package/server/searchIndex.js.map +1 -0
- package/server/sessions.d.ts +14 -0
- package/server/sessions.js +62 -70
- package/server/sessions.js.map +1 -0
- package/server/startup.d.ts +118 -0
- package/server/startup.js +143 -148
- package/server/startup.js.map +1 -0
- package/server/static.d.ts +6 -0
- package/server/static.js +28 -31
- package/server/static.js.map +1 -0
- package/server/tools/install.d.ts +4 -0
- package/server/tools/install.js +176 -185
- package/server/tools/install.js.map +1 -0
- package/server/tools/parse.d.ts +8 -0
- package/server/tools/parse.js +112 -114
- package/server/tools/parse.js.map +1 -0
- package/server/tools/platform.d.ts +9 -0
- package/server/tools/platform.js +49 -47
- package/server/tools/platform.js.map +1 -0
- package/server/tools/registry.d.ts +137 -0
- package/server/tools/registry.js +173 -172
- package/server/tools/registry.js.map +1 -0
- package/server/tools/scan.d.ts +34 -0
- package/server/tools/scan.js +89 -98
- package/server/tools/scan.js.map +1 -0
- package/server/tools.d.ts +34 -0
- package/server/tools.js +94 -107
- package/server/tools.js.map +1 -0
- package/server/tunnel.d.ts +29 -0
- package/server/tunnel.js +61 -66
- package/server/tunnel.js.map +1 -0
- package/shared/analyzer/docs.d.ts +16 -0
- package/shared/analyzer/docs.js +99 -93
- package/shared/analyzer/docs.js.map +1 -0
- package/shared/analyzer/explainLocal.d.ts +4 -0
- package/shared/analyzer/explainLocal.js +122 -142
- package/shared/analyzer/explainLocal.js.map +1 -0
- package/shared/analyzer/github.d.ts +37 -0
- package/shared/analyzer/github.js +41 -43
- package/shared/analyzer/github.js.map +1 -0
- package/shared/analyzer/graph.d.ts +41 -0
- package/shared/analyzer/graph.js +393 -400
- package/shared/analyzer/graph.js.map +1 -0
- package/shared/analyzer/health.d.ts +33 -0
- package/shared/analyzer/health.js +197 -193
- package/shared/analyzer/health.js.map +1 -0
- package/shared/analyzer/history.d.ts +29 -0
- package/shared/analyzer/history.js +110 -111
- package/shared/analyzer/history.js.map +1 -0
- package/shared/analyzer/jsonConfig.d.ts +2 -0
- package/shared/analyzer/jsonConfig.js +61 -0
- package/shared/analyzer/jsonConfig.js.map +1 -0
- package/shared/analyzer/languages/csharp.d.ts +26 -0
- package/shared/analyzer/languages/csharp.js +83 -88
- package/shared/analyzer/languages/csharp.js.map +1 -0
- package/shared/analyzer/languages/generic.d.ts +23 -0
- package/shared/analyzer/languages/generic.js +94 -105
- package/shared/analyzer/languages/generic.js.map +1 -0
- package/shared/analyzer/languages/go.d.ts +24 -0
- package/shared/analyzer/languages/go.js +45 -54
- package/shared/analyzer/languages/go.js.map +1 -0
- package/shared/analyzer/languages/index.d.ts +6 -0
- package/shared/analyzer/languages/index.js +19 -20
- package/shared/analyzer/languages/index.js.map +1 -0
- package/shared/analyzer/languages/java.d.ts +20 -0
- package/shared/analyzer/languages/java.js +73 -78
- package/shared/analyzer/languages/java.js.map +1 -0
- package/shared/analyzer/languages/javascript.d.ts +12 -0
- package/shared/analyzer/languages/javascript.js +258 -209
- package/shared/analyzer/languages/javascript.js.map +1 -0
- package/shared/analyzer/languages/python.d.ts +23 -0
- package/shared/analyzer/languages/python.js +92 -100
- package/shared/analyzer/languages/python.js.map +1 -0
- package/shared/analyzer/languages/rust.d.ts +17 -0
- package/shared/analyzer/languages/rust.js +96 -98
- package/shared/analyzer/languages/rust.js.map +1 -0
- package/shared/analyzer/languages/typescript.d.ts +11 -0
- package/shared/analyzer/languages/typescript.js +117 -116
- package/shared/analyzer/languages/typescript.js.map +1 -0
- package/shared/analyzer/licenses.d.ts +18 -0
- package/shared/analyzer/licenses.js +130 -133
- package/shared/analyzer/licenses.js.map +1 -0
- package/shared/analyzer/metrics.d.ts +20 -0
- package/shared/analyzer/metrics.js +112 -104
- package/shared/analyzer/metrics.js.map +1 -0
- package/shared/analyzer/pathUtil.d.ts +10 -0
- package/shared/analyzer/pathUtil.js +29 -35
- package/shared/analyzer/pathUtil.js.map +1 -0
- package/shared/analyzer/patterns.d.ts +11 -0
- package/shared/analyzer/patterns.js +231 -253
- package/shared/analyzer/patterns.js.map +1 -0
- package/shared/analyzer/scan.d.ts +62 -0
- package/shared/analyzer/scan.js +451 -442
- package/shared/analyzer/scan.js.map +1 -0
- package/shared/analyzer/scanControl.d.ts +11 -0
- package/shared/analyzer/scanControl.js +62 -0
- package/shared/analyzer/scanControl.js.map +1 -0
- package/shared/analyzer/security.d.ts +18 -0
- package/shared/analyzer/security.js +159 -159
- package/shared/analyzer/security.js.map +1 -0
- package/shared/analyzer/services.d.ts +5 -0
- package/shared/analyzer/services.js +141 -138
- package/shared/analyzer/services.js.map +1 -0
- package/shared/analyzer/stack.d.ts +6 -0
- package/shared/analyzer/stack.js +134 -141
- package/shared/analyzer/stack.js.map +1 -0
- package/shared/analyzer/tour.d.ts +2 -0
- package/shared/analyzer/tour.js +45 -53
- package/shared/analyzer/tour.js.map +1 -0
- package/shared/analyzer/util.d.ts +8 -0
- package/shared/analyzer/util.js +130 -76
- package/shared/analyzer/util.js.map +1 -0
- package/shared/analyzer/workflows.d.ts +8 -0
- package/shared/analyzer/workflows.js +139 -134
- package/shared/analyzer/workflows.js.map +1 -0
- package/shared/contracts.d.ts +250 -0
- package/shared/contracts.js +2 -0
- package/shared/contracts.js.map +1 -0
- package/shared/diagram/aiFacts.d.ts +35 -0
- package/shared/diagram/aiFacts.js +102 -105
- package/shared/diagram/aiFacts.js.map +1 -0
- package/shared/diagram/aiMermaid.d.ts +5 -0
- package/shared/diagram/aiMermaid.js +46 -45
- package/shared/diagram/aiMermaid.js.map +1 -0
- package/shared/diagram/atlas.d.ts +16 -0
- package/shared/diagram/atlas.js +51 -60
- package/shared/diagram/atlas.js.map +1 -0
- package/shared/diagram/mermaid.d.ts +43 -0
- package/shared/diagram/mermaid.js +348 -370
- package/shared/diagram/mermaid.js.map +1 -0
- package/shared/review/contracts.d.ts +95 -0
- package/shared/review/contracts.js +2 -0
- package/shared/review/contracts.js.map +1 -0
- package/shared/review/review.d.ts +10 -0
- package/shared/review/review.js +184 -0
- package/shared/review/review.js.map +1 -0
- package/shared/search/query.d.ts +32 -0
- package/shared/search/query.js +395 -388
- package/shared/search/query.js.map +1 -0
package/public/js/sbomView.js
CHANGED
|
@@ -1,26 +1,22 @@
|
|
|
1
1
|
// Software Bill of Materials (SBOM) & License Compliance View.
|
|
2
2
|
// Renders dependency inventory, license classification, and copyleft compliance audit.
|
|
3
|
-
|
|
4
3
|
import { escapeHtml } from './html.js';
|
|
5
|
-
|
|
6
4
|
export function renderSbom(container, { scan }) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// dangling-call lint (nested template literals defeat its string blanking).
|
|
23
|
-
const filterBar = sbom.length ? `
|
|
5
|
+
if (!container)
|
|
6
|
+
return;
|
|
7
|
+
const report = scan?.licenseReport || {
|
|
8
|
+
projectLicense: scan?.license || { id: 'UNKNOWN', name: 'Unknown', type: 'unknown' },
|
|
9
|
+
sbom: scan?.sbom || [],
|
|
10
|
+
counts: { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: 0 },
|
|
11
|
+
complianceStatus: 'clean',
|
|
12
|
+
};
|
|
13
|
+
const sbom = report.sbom || [];
|
|
14
|
+
const counts = report.counts || { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: sbom.length };
|
|
15
|
+
const projectLicense = report.projectLicense || { id: 'UNKNOWN', name: 'Unknown' };
|
|
16
|
+
// The filter bar is pointless when there is nothing to filter.
|
|
17
|
+
// Built as a separate template — nesting backticks inline breaks the
|
|
18
|
+
// dangling-call lint (nested template literals defeat its string blanking).
|
|
19
|
+
const filterBar = sbom.length ? `
|
|
24
20
|
<div class="sbom-filter-bar">
|
|
25
21
|
<input type="text" class="text-input sbom-search-input" id="sbomSearchInput" placeholder="Filter dependencies or licenses…">
|
|
26
22
|
<div class="sbom-filter-chips">
|
|
@@ -30,8 +26,7 @@ export function renderSbom(container, { scan }) {
|
|
|
30
26
|
<button class="btn btn-ghost btn-sm" data-filter="copyleft">Copyleft (${counts.copyleft})</button>
|
|
31
27
|
</div>
|
|
32
28
|
</div>` : '';
|
|
33
|
-
|
|
34
|
-
container.innerHTML = `
|
|
29
|
+
container.innerHTML = `
|
|
35
30
|
<div class="sbom-layout">
|
|
36
31
|
<!-- License Header & Summary -->
|
|
37
32
|
<header class="sbom-header">
|
|
@@ -81,55 +76,51 @@ export function renderSbom(container, { scan }) {
|
|
|
81
76
|
</div>
|
|
82
77
|
</div>
|
|
83
78
|
`;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
applyFilter();
|
|
79
|
+
// Wire search & filtering
|
|
80
|
+
const searchInput = container.querySelector('#sbomSearchInput');
|
|
81
|
+
const tableBody = container.querySelector('#sbomTableBody');
|
|
82
|
+
const filterBtns = container.querySelectorAll('.sbom-filter-chips button');
|
|
83
|
+
let activeFilter = 'all';
|
|
84
|
+
function applyFilter() {
|
|
85
|
+
const q = (searchInput?.value || '').toLowerCase().trim();
|
|
86
|
+
const filtered = sbom.filter((item) => {
|
|
87
|
+
if (activeFilter === 'prod' && item.isDev)
|
|
88
|
+
return false;
|
|
89
|
+
if (activeFilter === 'dev' && !item.isDev)
|
|
90
|
+
return false;
|
|
91
|
+
if (activeFilter === 'copyleft' && item.license?.type !== 'copyleft')
|
|
92
|
+
return false;
|
|
93
|
+
if (!q)
|
|
94
|
+
return true;
|
|
95
|
+
return item.name.toLowerCase().includes(q)
|
|
96
|
+
|| item.ecosystem.toLowerCase().includes(q)
|
|
97
|
+
|| String(item.license?.id || '').toLowerCase().includes(q);
|
|
98
|
+
});
|
|
99
|
+
if (tableBody)
|
|
100
|
+
tableBody.innerHTML = renderSbomRows(filtered, { filtered: true });
|
|
101
|
+
}
|
|
102
|
+
searchInput?.addEventListener('input', applyFilter);
|
|
103
|
+
filterBtns.forEach((btn) => {
|
|
104
|
+
btn.addEventListener('click', () => {
|
|
105
|
+
filterBtns.forEach((b) => b.classList.remove('is-active'));
|
|
106
|
+
btn.classList.add('is-active');
|
|
107
|
+
activeFilter = btn.dataset.filter;
|
|
108
|
+
applyFilter();
|
|
109
|
+
});
|
|
116
110
|
});
|
|
117
|
-
});
|
|
118
111
|
}
|
|
119
|
-
|
|
120
112
|
function renderSbomRows(items, { filtered } = {}) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
113
|
+
if (!items.length) {
|
|
114
|
+
// Distinguish "nothing matched your filter" from "this project simply
|
|
115
|
+
// declares no dependencies" — the latter is a finding, not a dead end.
|
|
116
|
+
if (!filtered) {
|
|
117
|
+
return '<tr><td colspan="5" class="sbom-no-results">No dependency manifests found — this project declares no npm, pip, Go, or Cargo dependencies.</td></tr>';
|
|
118
|
+
}
|
|
119
|
+
return '<tr><td colspan="5" class="sbom-no-results">No packages match the current filter.</td></tr>';
|
|
126
120
|
}
|
|
127
|
-
return
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
return items.map((item) => {
|
|
131
|
-
const lic = item.license || { id: 'Unknown', type: 'unknown' };
|
|
132
|
-
return `
|
|
121
|
+
return items.map((item) => {
|
|
122
|
+
const lic = item.license || { id: 'Unknown', type: 'unknown' };
|
|
123
|
+
return `
|
|
133
124
|
<tr>
|
|
134
125
|
<td class="sbom-cell-pkg"><b>${escapeHtml(item.name)}</b></td>
|
|
135
126
|
<td class="sbom-cell-ver"><code>${escapeHtml(item.version)}</code></td>
|
|
@@ -138,5 +129,6 @@ function renderSbomRows(items, { filtered } = {}) {
|
|
|
138
129
|
<td class="sbom-cell-lic"><span class="sbom-badge is-${lic.type}">${escapeHtml(lic.id)}</span></td>
|
|
139
130
|
</tr>
|
|
140
131
|
`;
|
|
141
|
-
|
|
132
|
+
}).join('');
|
|
142
133
|
}
|
|
134
|
+
//# sourceMappingURL=sbomView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sbomView.js","sourceRoot":"","sources":["../../src/public/js/sbomView.ts"],"names":[],"mappings":"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","sourcesContent":["// Software Bill of Materials (SBOM) & License Compliance View.\n// Renders dependency inventory, license classification, and copyleft compliance audit.\n\nimport { escapeHtml } from './html.js';\n\nexport function renderSbom(container, { scan }) {\n if (!container) return;\n\n const report = scan?.licenseReport || {\n projectLicense: scan?.license || { id: 'UNKNOWN', name: 'Unknown', type: 'unknown' },\n sbom: scan?.sbom || [],\n counts: { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: 0 },\n complianceStatus: 'clean',\n };\n\n const sbom = report.sbom || [];\n const counts = report.counts || { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: sbom.length };\n const projectLicense = report.projectLicense || { id: 'UNKNOWN', name: 'Unknown' };\n\n // The filter bar is pointless when there is nothing to filter.\n // Built as a separate template — nesting backticks inline breaks the\n // dangling-call lint (nested template literals defeat its string blanking).\n const filterBar = sbom.length ? `\n <div class=\"sbom-filter-bar\">\n <input type=\"text\" class=\"text-input sbom-search-input\" id=\"sbomSearchInput\" placeholder=\"Filter dependencies or licenses…\">\n <div class=\"sbom-filter-chips\">\n <button class=\"btn btn-ghost btn-sm is-active\" data-filter=\"all\">All (${sbom.length})</button>\n <button class=\"btn btn-ghost btn-sm\" data-filter=\"prod\">Production</button>\n <button class=\"btn btn-ghost btn-sm\" data-filter=\"dev\">Development</button>\n <button class=\"btn btn-ghost btn-sm\" data-filter=\"copyleft\">Copyleft (${counts.copyleft})</button>\n </div>\n </div>` : '';\n\n container.innerHTML = `\n <div class=\"sbom-layout\">\n <!-- License Header & Summary -->\n <header class=\"sbom-header\">\n <div class=\"sbom-lic-card\">\n <span class=\"sbom-lic-label\">Project License</span>\n <div class=\"sbom-lic-val\">\n <span class=\"sbom-badge is-${projectLicense.type || 'permissive'}\">${escapeHtml(projectLicense.id)}</span>\n <span class=\"sbom-lic-name\">${escapeHtml(projectLicense.name)}</span>\n </div>\n </div>\n\n <div class=\"sbom-stat-cards\">\n <div class=\"sbom-stat-chip\">\n <b>${counts.total}</b> Total Packages\n </div>\n <div class=\"sbom-stat-chip is-permissive\">\n <b>${counts.permissive}</b> Permissive\n </div>\n <div class=\"sbom-stat-chip is-copyleft\">\n <b>${counts.copyleft}</b> Copyleft\n </div>\n <div class=\"sbom-stat-chip is-weak\">\n <b>${counts.weakCopyleft}</b> Weak Copyleft\n </div>\n </div>\n </header>\n\n <!-- Search & Filter Controls (only useful with packages to filter) -->\n ${filterBar}\n\n <!-- Dependencies Inventory Table -->\n <div class=\"sbom-table-wrap\">\n <table class=\"sbom-table\" id=\"sbomTable\">\n <thead>\n <tr>\n <th>Package Name</th>\n <th>Version</th>\n <th>Ecosystem</th>\n <th>Type</th>\n <th>License</th>\n </tr>\n </thead>\n <tbody id=\"sbomTableBody\">\n ${renderSbomRows(sbom)}\n </tbody>\n </table>\n </div>\n </div>\n `;\n\n // Wire search & filtering\n const searchInput = container.querySelector('#sbomSearchInput');\n const tableBody = container.querySelector('#sbomTableBody');\n const filterBtns = container.querySelectorAll('.sbom-filter-chips button');\n\n let activeFilter = 'all';\n\n function applyFilter() {\n const q = (searchInput?.value || '').toLowerCase().trim();\n const filtered = sbom.filter((item) => {\n if (activeFilter === 'prod' && item.isDev) return false;\n if (activeFilter === 'dev' && !item.isDev) return false;\n if (activeFilter === 'copyleft' && item.license?.type !== 'copyleft') return false;\n\n if (!q) return true;\n return item.name.toLowerCase().includes(q)\n || item.ecosystem.toLowerCase().includes(q)\n || String(item.license?.id || '').toLowerCase().includes(q);\n });\n\n if (tableBody) tableBody.innerHTML = renderSbomRows(filtered, { filtered: true });\n }\n\n searchInput?.addEventListener('input', applyFilter);\n\n filterBtns.forEach((btn) => {\n btn.addEventListener('click', () => {\n filterBtns.forEach((b) => b.classList.remove('is-active'));\n btn.classList.add('is-active');\n activeFilter = btn.dataset.filter;\n applyFilter();\n });\n });\n}\n\nfunction renderSbomRows(items, { filtered }: Record<string, any> = {}) {\n if (!items.length) {\n // Distinguish \"nothing matched your filter\" from \"this project simply\n // declares no dependencies\" — the latter is a finding, not a dead end.\n if (!filtered) {\n return '<tr><td colspan=\"5\" class=\"sbom-no-results\">No dependency manifests found — this project declares no npm, pip, Go, or Cargo dependencies.</td></tr>';\n }\n return '<tr><td colspan=\"5\" class=\"sbom-no-results\">No packages match the current filter.</td></tr>';\n }\n\n return items.map((item) => {\n const lic = item.license || { id: 'Unknown', type: 'unknown' };\n return `\n <tr>\n <td class=\"sbom-cell-pkg\"><b>${escapeHtml(item.name)}</b></td>\n <td class=\"sbom-cell-ver\"><code>${escapeHtml(item.version)}</code></td>\n <td class=\"sbom-cell-eco\"><span class=\"eco-tag eco-${item.ecosystem}\">${escapeHtml(item.ecosystem)}</span></td>\n <td class=\"sbom-cell-dev\"><span class=\"dep-type-chip ${item.isDev ? 'is-dev' : 'is-prod'}\">${item.isDev ? 'dev' : 'prod'}</span></td>\n <td class=\"sbom-cell-lic\"><span class=\"sbom-badge is-${lic.type}\">${escapeHtml(lic.id)}</span></td>\n </tr>\n `;\n }).join('');\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function hashString(str: any): string;
|
|
2
|
+
export declare function repoCacheKey(scan: any): string;
|
|
3
|
+
export declare function compareScans(prev: any, curr: any): {
|
|
4
|
+
scoreDiff: number;
|
|
5
|
+
filesDiff: number;
|
|
6
|
+
trend: string;
|
|
7
|
+
summary: string;
|
|
8
|
+
};
|
|
9
|
+
export declare class ScanCache {
|
|
10
|
+
storage: any;
|
|
11
|
+
memory: Map<string, any>;
|
|
12
|
+
constructor(storage?: Storage);
|
|
13
|
+
get(key: any): any;
|
|
14
|
+
set(key: any, val: any): void;
|
|
15
|
+
clear(): void;
|
|
16
|
+
}
|
package/public/js/scanCache.js
CHANGED
|
@@ -1,76 +1,78 @@
|
|
|
1
1
|
// Scan caching & trend analysis. Pure logic so it is unit-tested without a browser.
|
|
2
|
-
|
|
3
2
|
export function hashString(str) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
let h = 2166136261 >>> 0;
|
|
4
|
+
for (let i = 0; i < str.length; i++) {
|
|
5
|
+
h ^= str.charCodeAt(i);
|
|
6
|
+
h = Math.imul(h, 16777619) >>> 0;
|
|
7
|
+
}
|
|
8
|
+
return h.toString(16);
|
|
10
9
|
}
|
|
11
|
-
|
|
12
10
|
export function repoCacheKey(scan) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
if (!scan)
|
|
12
|
+
return '';
|
|
13
|
+
const id = scan.gitUrl || scan.root || scan.name || '';
|
|
14
|
+
const summary = (scan.files || [])
|
|
15
|
+
.map((f) => JSON.stringify([f.path, f.size, f.loc, f.imports, f.exports, f.findings]))
|
|
16
|
+
.join('|');
|
|
17
|
+
return `onboarder.cache.${hashString(id)}.${hashString(summary)}`;
|
|
20
18
|
}
|
|
21
|
-
|
|
22
19
|
export function compareScans(prev, curr) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
20
|
+
if (!prev || !curr)
|
|
21
|
+
return null;
|
|
22
|
+
const prevScore = prev.health?.score ?? prev.score ?? 100;
|
|
23
|
+
const currScore = curr.health?.score ?? curr.score ?? 100;
|
|
24
|
+
const scoreDiff = currScore - prevScore;
|
|
25
|
+
const prevFiles = prev.scan?.files?.length ?? prev.files?.length ?? 0;
|
|
26
|
+
const currFiles = curr.scan?.files?.length ?? curr.files?.length ?? 0;
|
|
27
|
+
const filesDiff = currFiles - prevFiles;
|
|
28
|
+
return {
|
|
29
|
+
scoreDiff,
|
|
30
|
+
filesDiff,
|
|
31
|
+
trend: scoreDiff > 0 ? 'improving' : scoreDiff < 0 ? 'degrading' : 'stable',
|
|
32
|
+
summary: scoreDiff > 0
|
|
33
|
+
? `Health improved by +${scoreDiff} pts since last scan.`
|
|
34
|
+
: scoreDiff < 0
|
|
35
|
+
? `Health decreased by ${scoreDiff} pts since last scan.`
|
|
36
|
+
: 'Health score matches previous scan.',
|
|
37
|
+
};
|
|
41
38
|
}
|
|
42
|
-
|
|
43
39
|
export class ScanCache {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
40
|
+
storage;
|
|
41
|
+
memory;
|
|
42
|
+
constructor(storage = typeof localStorage !== 'undefined' ? localStorage : null) {
|
|
43
|
+
this.storage = storage;
|
|
44
|
+
this.memory = new Map();
|
|
45
|
+
}
|
|
46
|
+
get(key) {
|
|
47
|
+
if (this.memory.has(key))
|
|
48
|
+
return this.memory.get(key);
|
|
49
|
+
if (!this.storage)
|
|
50
|
+
return null;
|
|
51
|
+
try {
|
|
52
|
+
const raw = this.storage.getItem(key);
|
|
53
|
+
if (!raw)
|
|
54
|
+
return null;
|
|
55
|
+
const parsed = JSON.parse(raw);
|
|
56
|
+
this.memory.set(key, parsed);
|
|
57
|
+
return parsed;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
set(key, val) {
|
|
64
|
+
this.memory.set(key, val);
|
|
65
|
+
if (!this.storage)
|
|
66
|
+
return;
|
|
67
|
+
try {
|
|
68
|
+
this.storage.setItem(key, JSON.stringify(val));
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Quota exceeded or disabled
|
|
72
|
+
}
|
|
60
73
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
set(key, val) {
|
|
64
|
-
this.memory.set(key, val);
|
|
65
|
-
if (!this.storage) return;
|
|
66
|
-
try {
|
|
67
|
-
this.storage.setItem(key, JSON.stringify(val));
|
|
68
|
-
} catch {
|
|
69
|
-
// Quota exceeded or disabled
|
|
74
|
+
clear() {
|
|
75
|
+
this.memory.clear();
|
|
70
76
|
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
clear() {
|
|
74
|
-
this.memory.clear();
|
|
75
|
-
}
|
|
76
77
|
}
|
|
78
|
+
//# sourceMappingURL=scanCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanCache.js","sourceRoot":"","sources":["../../src/public/js/scanCache.ts"],"names":[],"mappings":"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","sourcesContent":["// Scan caching & trend analysis. Pure logic so it is unit-tested without a browser.\n\nexport function hashString(str) {\n let h = 2166136261 >>> 0;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 16777619) >>> 0;\n }\n return h.toString(16);\n}\n\nexport function repoCacheKey(scan) {\n if (!scan) return '';\n const id = scan.gitUrl || scan.root || scan.name || '';\n const summary = (scan.files || [])\n .map((f) => JSON.stringify([f.path, f.size, f.loc, f.imports, f.exports, f.findings]))\n .join('|');\n return `onboarder.cache.${hashString(id)}.${hashString(summary)}`;\n}\n\nexport function compareScans(prev, curr) {\n if (!prev || !curr) return null;\n const prevScore = prev.health?.score ?? prev.score ?? 100;\n const currScore = curr.health?.score ?? curr.score ?? 100;\n const scoreDiff = currScore - prevScore;\n const prevFiles = prev.scan?.files?.length ?? prev.files?.length ?? 0;\n const currFiles = curr.scan?.files?.length ?? curr.files?.length ?? 0;\n const filesDiff = currFiles - prevFiles;\n\n return {\n scoreDiff,\n filesDiff,\n trend: scoreDiff > 0 ? 'improving' : scoreDiff < 0 ? 'degrading' : 'stable',\n summary: scoreDiff > 0\n ? `Health improved by +${scoreDiff} pts since last scan.`\n : scoreDiff < 0\n ? `Health decreased by ${scoreDiff} pts since last scan.`\n : 'Health score matches previous scan.',\n };\n}\n\nexport class ScanCache {\n storage: any;\n memory: Map<string, any>;\n\n constructor(storage = typeof localStorage !== 'undefined' ? localStorage : null) {\n this.storage = storage;\n this.memory = new Map();\n }\n\n get(key) {\n if (this.memory.has(key)) return this.memory.get(key);\n if (!this.storage) return null;\n try {\n const raw = this.storage.getItem(key);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n this.memory.set(key, parsed);\n return parsed;\n } catch {\n return null;\n }\n }\n\n set(key, val) {\n this.memory.set(key, val);\n if (!this.storage) return;\n try {\n this.storage.setItem(key, JSON.stringify(val));\n } catch {\n // Quota exceeded or disabled\n }\n }\n\n clear() {\n this.memory.clear();\n }\n}\n"]}
|