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
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare function codeStats(source: any, lang?: string): {
|
|
2
|
+
lines: number;
|
|
3
|
+
code: number;
|
|
4
|
+
comment: number;
|
|
5
|
+
blank: number;
|
|
6
|
+
};
|
|
7
|
+
export declare function complexityOf(source: any, lang: any): number;
|
|
8
|
+
export declare function halsteadMetrics(source: any, lang: any): {
|
|
9
|
+
n1: number;
|
|
10
|
+
n2: number;
|
|
11
|
+
N1: number;
|
|
12
|
+
N2: number;
|
|
13
|
+
vocabulary: number;
|
|
14
|
+
length: number;
|
|
15
|
+
volume: number;
|
|
16
|
+
difficulty: number;
|
|
17
|
+
effort: number;
|
|
18
|
+
};
|
|
19
|
+
export declare function cognitiveComplexity(source: any, lang: any): number;
|
|
20
|
+
export declare function maintainabilityIndex(halstead: any, complexity: any, loc: any): number;
|
|
@@ -1,120 +1,128 @@
|
|
|
1
1
|
import { blankComments } from './util.js';
|
|
2
|
-
|
|
3
2
|
const DECISIONS = {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
javascript: /\b(if|for|while|case|catch|do|else if)\b/g,
|
|
4
|
+
python: /\b(if|elif|for|while|except)\b/g,
|
|
5
|
+
go: /\b(if|for|case|go|select)\b/g,
|
|
7
6
|
};
|
|
8
7
|
const GENERIC = /\b(if|elif|for|while|case|catch|except|switch)\b/g;
|
|
9
|
-
|
|
10
8
|
export function codeStats(source, lang = '') {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
9
|
+
const lines = String(source).split('\n');
|
|
10
|
+
let blank = 0;
|
|
11
|
+
let comment = 0;
|
|
12
|
+
let code = 0;
|
|
13
|
+
let inBlock = false;
|
|
14
|
+
const isHashComment = ['python', 'ruby', 'yaml', 'toml', 'shell', 'bash', 'sh'].includes(lang)
|
|
15
|
+
|| (!lang && (source.includes('#!') || /\b(def|import|class)\b/.test(source)));
|
|
16
|
+
for (const raw of lines) {
|
|
17
|
+
const l = raw.trim();
|
|
18
|
+
if (!l) {
|
|
19
|
+
blank++;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (inBlock) {
|
|
23
|
+
comment++;
|
|
24
|
+
if (l.includes('*/'))
|
|
25
|
+
inBlock = false;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (l.startsWith('//') || (isHashComment && l.startsWith('#'))) {
|
|
29
|
+
comment++;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (l.startsWith('/*')) {
|
|
33
|
+
comment++;
|
|
34
|
+
if (!l.includes('*/'))
|
|
35
|
+
inBlock = true;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
code++;
|
|
39
|
+
}
|
|
40
|
+
return { lines: lines.length, code, comment, blank };
|
|
28
41
|
}
|
|
29
|
-
|
|
30
42
|
export function complexityOf(source, lang) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
43
|
+
const isHash = ['python', 'ruby', 'yaml', 'toml', 'shell'].includes(lang);
|
|
44
|
+
const clean = blankComments(String(source), { lineChar: isHash ? '#' : '//' });
|
|
45
|
+
const rx = DECISIONS[lang] || GENERIC;
|
|
46
|
+
let score = 1;
|
|
47
|
+
const decisions = clean.match(rx);
|
|
48
|
+
score += decisions ? decisions.length : 0;
|
|
49
|
+
const bools = clean.match(/&&|\|\||\?/g); // boolean ops + ternaries
|
|
50
|
+
score += bools ? bools.length : 0;
|
|
51
|
+
return score;
|
|
40
52
|
}
|
|
41
|
-
|
|
42
53
|
export function halsteadMetrics(source, lang) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const difficulty = (n2 === 0 || n1 === 0) ? 0 : (n1 / 2) * (N2 / n2);
|
|
71
|
-
const effort = difficulty * volume;
|
|
72
|
-
|
|
73
|
-
return { n1, n2, N1, N2, vocabulary, length, volume, difficulty, effort };
|
|
54
|
+
const isHash = ['python', 'ruby', 'yaml', 'toml', 'shell'].includes(lang);
|
|
55
|
+
const clean = blankComments(String(source), { lineChar: isHash ? '#' : '//' });
|
|
56
|
+
const ops = ['\+', '-', '\*', '/', '=', '==', '===', '!=', '!==', '<', '>', '<=', '>=', '&&', '\|\|', '!', '%', '\*\*', '\+\+', '--', '\+=', '-=', '\*=', '/=', '=>', '\?\?', '\?\.', '\.\.\.'];
|
|
57
|
+
const opPattern = new RegExp(ops.map(o => o.replace(/[.*+?^$\\{}()|[\]\\]/g, '\\$&')).join('|'), 'g');
|
|
58
|
+
const operators = new Set();
|
|
59
|
+
let N1 = 0;
|
|
60
|
+
for (const m of clean.matchAll(opPattern)) {
|
|
61
|
+
operators.add(m[0]);
|
|
62
|
+
N1++;
|
|
63
|
+
}
|
|
64
|
+
const n1 = operators.size;
|
|
65
|
+
const operands = new Set();
|
|
66
|
+
let N2 = 0;
|
|
67
|
+
for (const m of clean.matchAll(/\b[a-zA-Z_][a-zA-Z0-9_]*\b|\b\d+\b|['"][^'"]*['"]/g)) {
|
|
68
|
+
const val = m[0];
|
|
69
|
+
if (["if", "else", "for", "while", "return", "function", "class", "import", "export", "var", "let", "const", "true", "false", "null"].includes(val))
|
|
70
|
+
continue;
|
|
71
|
+
operands.add(val);
|
|
72
|
+
N2++;
|
|
73
|
+
}
|
|
74
|
+
const n2 = operands.size;
|
|
75
|
+
const vocabulary = n1 + n2;
|
|
76
|
+
const length = N1 + N2;
|
|
77
|
+
const volume = vocabulary === 0 ? 0 : length * Math.log2(vocabulary);
|
|
78
|
+
const difficulty = (n2 === 0 || n1 === 0) ? 0 : (n1 / 2) * (N2 / n2);
|
|
79
|
+
const effort = difficulty * volume;
|
|
80
|
+
return { n1, n2, N1, N2, vocabulary, length, volume, difficulty, effort };
|
|
74
81
|
}
|
|
75
|
-
|
|
76
82
|
export function cognitiveComplexity(source, lang) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
83
|
+
const isHash = ['python', 'ruby', 'yaml', 'toml', 'shell'].includes(lang);
|
|
84
|
+
const clean = blankComments(String(source), { lineChar: isHash ? '#' : '//' });
|
|
85
|
+
let score = 0;
|
|
86
|
+
let nesting = 0;
|
|
87
|
+
let inSwitch = false;
|
|
88
|
+
const lines = clean.split('\n');
|
|
89
|
+
for (const line of lines) {
|
|
90
|
+
const l = line.trim();
|
|
91
|
+
if (l.includes('{')) {
|
|
92
|
+
if (/\b(if|for|while|do|switch|catch)\b/.test(l)) {
|
|
93
|
+
if (/\bswitch\b/.test(l)) {
|
|
94
|
+
inSwitch = true;
|
|
95
|
+
score += (1 + nesting);
|
|
96
|
+
nesting++;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
score += (1 + nesting);
|
|
100
|
+
nesting++;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
nesting++;
|
|
105
|
+
}
|
|
96
106
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
if (l.includes('}')) {
|
|
108
|
+
nesting = Math.max(0, nesting - 1);
|
|
109
|
+
}
|
|
110
|
+
if (!l.includes('{') && /\b(if|else if|for|while|do|catch)\b/.test(l)) {
|
|
111
|
+
score += (1 + nesting);
|
|
112
|
+
}
|
|
113
|
+
if (/\belse\b(?!\s+if)/.test(l)) {
|
|
114
|
+
score += 1;
|
|
115
|
+
}
|
|
116
|
+
const ops = l.match(/&&|\|\||\?/g);
|
|
117
|
+
if (ops)
|
|
118
|
+
score += ops.length;
|
|
109
119
|
}
|
|
110
|
-
|
|
111
|
-
if (ops) score += ops.length;
|
|
112
|
-
}
|
|
113
|
-
return score;
|
|
120
|
+
return score;
|
|
114
121
|
}
|
|
115
|
-
|
|
116
122
|
export function maintainabilityIndex(halstead, complexity, loc) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
123
|
+
if (halstead.volume === 0 || loc === 0)
|
|
124
|
+
return 100;
|
|
125
|
+
let MI = (171 - 5.2 * Math.log(halstead.volume) - 0.23 * complexity - 16.2 * Math.log(loc)) * 100 / 171;
|
|
126
|
+
return Math.max(0, Math.min(100, MI));
|
|
120
127
|
}
|
|
128
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/shared/analyzer/metrics.ts"],"names":[],"mappings":"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","sourcesContent":["import { blankComments } from './util.js';\n\nconst DECISIONS = {\n javascript: /\\b(if|for|while|case|catch|do|else if)\\b/g,\n python: /\\b(if|elif|for|while|except)\\b/g,\n go: /\\b(if|for|case|go|select)\\b/g,\n};\nconst GENERIC = /\\b(if|elif|for|while|case|catch|except|switch)\\b/g;\n\nexport function codeStats(source, lang = '') {\n const lines = String(source).split('\\n');\n let blank = 0;\n let comment = 0;\n let code = 0;\n let inBlock = false;\n const isHashComment = ['python', 'ruby', 'yaml', 'toml', 'shell', 'bash', 'sh'].includes(lang)\n || (!lang && (source.includes('#!') || /\\b(def|import|class)\\b/.test(source)));\n\n for (const raw of lines) {\n const l = raw.trim();\n if (!l) { blank++; continue; }\n if (inBlock) { comment++; if (l.includes('*/')) inBlock = false; continue; }\n if (l.startsWith('//') || (isHashComment && l.startsWith('#'))) { comment++; continue; }\n if (l.startsWith('/*')) { comment++; if (!l.includes('*/')) inBlock = true; continue; }\n code++;\n }\n return { lines: lines.length, code, comment, blank };\n}\n\nexport function complexityOf(source, lang) {\n const isHash = ['python', 'ruby', 'yaml', 'toml', 'shell'].includes(lang);\n const clean = blankComments(String(source), { lineChar: isHash ? '#' : '//' });\n const rx = DECISIONS[lang] || GENERIC;\n let score = 1;\n const decisions = clean.match(rx);\n score += decisions ? decisions.length : 0;\n const bools = clean.match(/&&|\\|\\||\\?/g); // boolean ops + ternaries\n score += bools ? bools.length : 0;\n return score;\n}\n\nexport function halsteadMetrics(source, lang) {\n const isHash = ['python', 'ruby', 'yaml', 'toml', 'shell'].includes(lang);\n const clean = blankComments(String(source), { lineChar: isHash ? '#' : '//' });\n \n const ops = ['\\+', '-', '\\*', '/', '=', '==', '===', '!=', '!==', '<', '>', '<=', '>=', '&&', '\\|\\|', '!', '%', '\\*\\*', '\\+\\+', '--', '\\+=', '-=', '\\*=', '/=', '=>', '\\?\\?', '\\?\\.', '\\.\\.\\.'];\n const opPattern = new RegExp(ops.map(o => o.replace(/[.*+?^$\\\\{}()|[\\]\\\\]/g, '\\\\$&')).join('|'), 'g');\n \n const operators = new Set();\n let N1 = 0;\n for (const m of clean.matchAll(opPattern)) {\n operators.add(m[0]);\n N1++;\n }\n const n1 = operators.size;\n\n const operands = new Set();\n let N2 = 0;\n for (const m of clean.matchAll(/\\b[a-zA-Z_][a-zA-Z0-9_]*\\b|\\b\\d+\\b|['\"][^'\"]*['\"]/g)) {\n const val = m[0];\n if ([\"if\", \"else\", \"for\", \"while\", \"return\", \"function\", \"class\", \"import\", \"export\", \"var\", \"let\", \"const\", \"true\", \"false\", \"null\"].includes(val)) continue;\n operands.add(val);\n N2++;\n }\n const n2 = operands.size;\n\n const vocabulary = n1 + n2;\n const length = N1 + N2;\n const volume = vocabulary === 0 ? 0 : length * Math.log2(vocabulary);\n const difficulty = (n2 === 0 || n1 === 0) ? 0 : (n1 / 2) * (N2 / n2);\n const effort = difficulty * volume;\n\n return { n1, n2, N1, N2, vocabulary, length, volume, difficulty, effort };\n}\n\nexport function cognitiveComplexity(source, lang) {\n const isHash = ['python', 'ruby', 'yaml', 'toml', 'shell'].includes(lang);\n const clean = blankComments(String(source), { lineChar: isHash ? '#' : '//' });\n \n let score = 0;\n let nesting = 0;\n let inSwitch = false;\n\n const lines = clean.split('\\n');\n for (const line of lines) {\n const l = line.trim();\n if (l.includes('{')) {\n if (/\\b(if|for|while|do|switch|catch)\\b/.test(l)) {\n if (/\\bswitch\\b/.test(l)) {\n inSwitch = true;\n score += (1 + nesting);\n nesting++;\n } else {\n score += (1 + nesting);\n nesting++;\n }\n } else {\n nesting++;\n }\n }\n if (l.includes('}')) {\n nesting = Math.max(0, nesting - 1);\n }\n if (!l.includes('{') && /\\b(if|else if|for|while|do|catch)\\b/.test(l)) {\n score += (1 + nesting);\n }\n if (/\\belse\\b(?!\\s+if)/.test(l)) {\n score += 1;\n }\n const ops = l.match(/&&|\\|\\||\\?/g);\n if (ops) score += ops.length;\n }\n return score;\n}\n\nexport function maintainabilityIndex(halstead, complexity, loc) {\n if (halstead.volume === 0 || loc === 0) return 100;\n let MI = (171 - 5.2 * Math.log(halstead.volume) - 0.23 * complexity - 16.2 * Math.log(loc)) * 100 / 171;\n return Math.max(0, Math.min(100, MI));\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function normalize(path: any): string;
|
|
2
|
+
export declare function joinPath(...parts: any[]): string;
|
|
3
|
+
export declare function dirOf(path: any): any;
|
|
4
|
+
export declare function baseName(path: any): any;
|
|
5
|
+
export declare function extOf(path: any): any;
|
|
6
|
+
export declare function depthOf(path: any): any;
|
|
7
|
+
export declare function topFolderOf(path: any): any;
|
|
8
|
+
export declare const TEST_PATH_RE: RegExp;
|
|
9
|
+
export declare function isTestPath(path: any): boolean;
|
|
10
|
+
export declare function pathFilter({ text, showTests }?: Record<string, any>): (p: any) => any;
|
|
@@ -1,50 +1,44 @@
|
|
|
1
1
|
// Repo-relative path helpers. Everything here is POSIX-style with forward
|
|
2
2
|
// slashes, no leading slash, no trailing slash. Both file source adapters
|
|
3
3
|
// normalize to this convention before the analyzer sees a path.
|
|
4
|
-
|
|
5
4
|
export function normalize(path) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
const out = [];
|
|
6
|
+
for (const part of String(path).split('/')) {
|
|
7
|
+
if (!part || part === '.')
|
|
8
|
+
continue;
|
|
9
|
+
if (part === '..') {
|
|
10
|
+
out.pop();
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
out.push(part);
|
|
12
14
|
}
|
|
13
|
-
out.
|
|
14
|
-
}
|
|
15
|
-
return out.join('/');
|
|
15
|
+
return out.join('/');
|
|
16
16
|
}
|
|
17
|
-
|
|
18
17
|
export function joinPath(...parts) {
|
|
19
|
-
|
|
18
|
+
return normalize(parts.filter(Boolean).join('/'));
|
|
20
19
|
}
|
|
21
|
-
|
|
22
20
|
export function dirOf(path) {
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
const i = path.lastIndexOf('/');
|
|
22
|
+
return i === -1 ? '' : path.slice(0, i);
|
|
25
23
|
}
|
|
26
|
-
|
|
27
24
|
export function baseName(path) {
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
const i = path.lastIndexOf('/');
|
|
26
|
+
return path.slice(i + 1);
|
|
30
27
|
}
|
|
31
|
-
|
|
32
28
|
export function extOf(path) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
const base = baseName(path);
|
|
30
|
+
const i = base.lastIndexOf('.');
|
|
31
|
+
return i <= 0 ? '' : base.slice(i).toLowerCase();
|
|
36
32
|
}
|
|
37
|
-
|
|
38
33
|
export function depthOf(path) {
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
if (!path)
|
|
35
|
+
return 0;
|
|
36
|
+
return path.split('/').length;
|
|
41
37
|
}
|
|
42
|
-
|
|
43
38
|
export function topFolderOf(path) {
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
const i = path.indexOf('/');
|
|
40
|
+
return i === -1 ? '(root)' : path.slice(0, i);
|
|
46
41
|
}
|
|
47
|
-
|
|
48
42
|
// Does this path look like a test? Naming, not content — there is no reliable
|
|
49
43
|
// way to tell from a path alone, and every repo names them differently. The
|
|
50
44
|
// alternatives are bounded by the separators: `foo.test.js`, `foo_spec.rb`,
|
|
@@ -52,18 +46,18 @@ export function topFolderOf(path) {
|
|
|
52
46
|
// (`contest.js`, `latest.md`, `protester.go`) must not match, which is what the
|
|
53
47
|
// separator groups on either side are for.
|
|
54
48
|
export const TEST_PATH_RE = /(^|[._\-/])(test|tests|spec|specs|__tests__|__test__)([._\-/]|$)/i;
|
|
55
|
-
|
|
56
49
|
export function isTestPath(path) {
|
|
57
|
-
|
|
50
|
+
return TEST_PATH_RE.test(path);
|
|
58
51
|
}
|
|
59
|
-
|
|
60
52
|
// The stage filters, as a predicate over paths — or null when nothing is being
|
|
61
53
|
// filtered at all. Null rather than `() => true` on purpose: every diagram
|
|
62
54
|
// builder takes an `include` option and skips the whole filtering pass when it is
|
|
63
55
|
// absent, so the common case costs nothing. Callers must keep treating a missing
|
|
64
56
|
// filter as "everything", not as "nothing".
|
|
65
57
|
export function pathFilter({ text = '', showTests = true } = {}) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
58
|
+
const needle = text.trim().toLowerCase();
|
|
59
|
+
if (!needle && showTests)
|
|
60
|
+
return null;
|
|
61
|
+
return (p) => (showTests || !isTestPath(p)) && (!needle || p.toLowerCase().includes(needle));
|
|
69
62
|
}
|
|
63
|
+
//# sourceMappingURL=pathUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathUtil.js","sourceRoot":"","sources":["../../src/shared/analyzer/pathUtil.ts"],"names":[],"mappings":"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","sourcesContent":["// Repo-relative path helpers. Everything here is POSIX-style with forward\n// slashes, no leading slash, no trailing slash. Both file source adapters\n// normalize to this convention before the analyzer sees a path.\n\nexport function normalize(path) {\n const out = [];\n for (const part of String(path).split('/')) {\n if (!part || part === '.') continue;\n if (part === '..') {\n out.pop();\n continue;\n }\n out.push(part);\n }\n return out.join('/');\n}\n\nexport function joinPath(...parts) {\n return normalize(parts.filter(Boolean).join('/'));\n}\n\nexport function dirOf(path) {\n const i = path.lastIndexOf('/');\n return i === -1 ? '' : path.slice(0, i);\n}\n\nexport function baseName(path) {\n const i = path.lastIndexOf('/');\n return path.slice(i + 1);\n}\n\nexport function extOf(path) {\n const base = baseName(path);\n const i = base.lastIndexOf('.');\n return i <= 0 ? '' : base.slice(i).toLowerCase();\n}\n\nexport function depthOf(path) {\n if (!path) return 0;\n return path.split('/').length;\n}\n\nexport function topFolderOf(path) {\n const i = path.indexOf('/');\n return i === -1 ? '(root)' : path.slice(0, i);\n}\n\n// Does this path look like a test? Naming, not content — there is no reliable\n// way to tell from a path alone, and every repo names them differently. The\n// alternatives are bounded by the separators: `foo.test.js`, `foo_spec.rb`,\n// `tests/foo.py`, `__tests__/foo.jsx`. A word merely *containing* \"test\"\n// (`contest.js`, `latest.md`, `protester.go`) must not match, which is what the\n// separator groups on either side are for.\nexport const TEST_PATH_RE = /(^|[._\\-/])(test|tests|spec|specs|__tests__|__test__)([._\\-/]|$)/i;\n\nexport function isTestPath(path) {\n return TEST_PATH_RE.test(path);\n}\n\n// The stage filters, as a predicate over paths — or null when nothing is being\n// filtered at all. Null rather than `() => true` on purpose: every diagram\n// builder takes an `include` option and skips the whole filtering pass when it is\n// absent, so the common case costs nothing. Callers must keep treating a missing\n// filter as \"everything\", not as \"nothing\".\nexport function pathFilter({ text = '', showTests = true }: Record<string, any> = {}) {\n const needle = text.trim().toLowerCase();\n if (!needle && showTests) return null;\n return (p) => (showTests || !isTestPath(p)) && (!needle || p.toLowerCase().includes(needle));\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function computeLayers(scan: any, facts: any): {
|
|
2
|
+
layers: any[];
|
|
3
|
+
unreachable: any;
|
|
4
|
+
seeds: any;
|
|
5
|
+
};
|
|
6
|
+
export declare function detectPatterns(scan: any, facts: any, manifest: any, layersInfo: any): any[];
|
|
7
|
+
export declare function couplingMatrix(scan: any, facts: any, maxFolders?: number): {
|
|
8
|
+
folders: any[];
|
|
9
|
+
counts: Map<any, any>;
|
|
10
|
+
max: number;
|
|
11
|
+
};
|