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.
Files changed (448) hide show
  1. package/README.md +174 -46
  2. package/bin/build-if-source.js +23 -0
  3. package/cli/commands.d.ts +26 -0
  4. package/cli/commands.js +836 -811
  5. package/cli/commands.js.map +1 -0
  6. package/cli/explorer/advanced.d.ts +14 -0
  7. package/cli/explorer/advanced.js +321 -329
  8. package/cli/explorer/advanced.js.map +1 -0
  9. package/cli/explorer/app.d.ts +1 -0
  10. package/cli/explorer/app.js +384 -313
  11. package/cli/explorer/app.js.map +1 -0
  12. package/cli/explorer/assistant.d.ts +9 -0
  13. package/cli/explorer/assistant.js +58 -0
  14. package/cli/explorer/assistant.js.map +1 -0
  15. package/cli/explorer/commands.d.ts +17 -0
  16. package/cli/explorer/commands.js +368 -302
  17. package/cli/explorer/commands.js.map +1 -0
  18. package/cli/explorer/featureViews.d.ts +124 -0
  19. package/cli/explorer/featureViews.js +179 -0
  20. package/cli/explorer/featureViews.js.map +1 -0
  21. package/cli/explorer/github.d.ts +21 -0
  22. package/cli/explorer/github.js +42 -44
  23. package/cli/explorer/github.js.map +1 -0
  24. package/cli/explorer/graphs.d.ts +7 -0
  25. package/cli/explorer/graphs.js +90 -95
  26. package/cli/explorer/graphs.js.map +1 -0
  27. package/cli/explorer/picker.d.ts +22 -0
  28. package/cli/explorer/picker.js +150 -0
  29. package/cli/explorer/picker.js.map +1 -0
  30. package/cli/explorer/report.d.ts +85 -0
  31. package/cli/explorer/report.js +60 -0
  32. package/cli/explorer/report.js.map +1 -0
  33. package/cli/explorer/session.d.ts +449 -0
  34. package/cli/explorer/session.js +143 -144
  35. package/cli/explorer/session.js.map +1 -0
  36. package/cli/explorer/views.d.ts +19 -0
  37. package/cli/explorer/views.js +465 -482
  38. package/cli/explorer/views.js.map +1 -0
  39. package/cli/explorer/wrap.d.ts +1 -0
  40. package/cli/explorer/wrap.js +28 -44
  41. package/cli/explorer/wrap.js.map +1 -0
  42. package/cli/main.d.ts +1 -0
  43. package/cli/main.js +214 -161
  44. package/cli/main.js.map +1 -0
  45. package/cli/prompt.d.ts +5 -0
  46. package/cli/prompt.js +84 -80
  47. package/cli/prompt.js.map +1 -0
  48. package/cli/scanOptions.d.ts +2 -0
  49. package/cli/scanOptions.js +11 -0
  50. package/cli/scanOptions.js.map +1 -0
  51. package/cli/ui.d.ts +33 -0
  52. package/cli/ui.js +35 -44
  53. package/cli/ui.js.map +1 -0
  54. package/cli/wizard.d.ts +187 -0
  55. package/cli/wizard.js +304 -284
  56. package/cli/wizard.js.map +1 -0
  57. package/package.json +15 -4
  58. package/public/app.d.ts +1 -0
  59. package/public/app.js +1057 -1009
  60. package/public/app.js.map +1 -0
  61. package/public/browser.d.ts +68 -0
  62. package/public/browser.js +2 -0
  63. package/public/browser.js.map +1 -0
  64. package/public/index.html +30 -13
  65. package/public/js/about.d.ts +6 -0
  66. package/public/js/about.js +152 -172
  67. package/public/js/about.js.map +1 -0
  68. package/public/js/aiDraft.d.ts +3 -0
  69. package/public/js/aiDraft.js +116 -124
  70. package/public/js/aiDraft.js.map +1 -0
  71. package/public/js/analysisPanel.d.ts +7 -0
  72. package/public/js/analysisPanel.js +166 -166
  73. package/public/js/analysisPanel.js.map +1 -0
  74. package/public/js/analysisReport.d.ts +38 -0
  75. package/public/js/analysisReport.js +105 -110
  76. package/public/js/analysisReport.js.map +1 -0
  77. package/public/js/api.d.ts +26 -0
  78. package/public/js/api.js +176 -167
  79. package/public/js/api.js.map +1 -0
  80. package/public/js/atlas.d.ts +6 -0
  81. package/public/js/atlas.js +50 -58
  82. package/public/js/atlas.js.map +1 -0
  83. package/public/js/blameView.d.ts +2 -0
  84. package/public/js/blameView.js +36 -37
  85. package/public/js/blameView.js.map +1 -0
  86. package/public/js/codeTab.d.ts +3 -0
  87. package/public/js/codeTab.js +175 -180
  88. package/public/js/codeTab.js.map +1 -0
  89. package/public/js/codeViewer.d.ts +5 -0
  90. package/public/js/codeViewer.js +162 -150
  91. package/public/js/codeViewer.js.map +1 -0
  92. package/public/js/components/FileChip.d.ts +9 -0
  93. package/public/js/components/FileChip.js +45 -49
  94. package/public/js/components/FileChip.js.map +1 -0
  95. package/public/js/components/MetricSparkline.d.ts +7 -0
  96. package/public/js/components/MetricSparkline.js +35 -44
  97. package/public/js/components/MetricSparkline.js.map +1 -0
  98. package/public/js/components/RiskBadge.d.ts +9 -0
  99. package/public/js/components/RiskBadge.js +55 -63
  100. package/public/js/components/RiskBadge.js.map +1 -0
  101. package/public/js/deepAnalysisView.d.ts +99 -0
  102. package/public/js/deepAnalysisView.js +282 -302
  103. package/public/js/deepAnalysisView.js.map +1 -0
  104. package/public/js/diagramPane.d.ts +8 -0
  105. package/public/js/diagramPane.js +133 -135
  106. package/public/js/diagramPane.js.map +1 -0
  107. package/public/js/diffView.d.ts +6 -0
  108. package/public/js/diffView.js +222 -209
  109. package/public/js/diffView.js.map +1 -0
  110. package/public/js/docsView.d.ts +2 -0
  111. package/public/js/docsView.js +441 -442
  112. package/public/js/docsView.js.map +1 -0
  113. package/public/js/dom.d.ts +189 -0
  114. package/public/js/dom.js +5 -0
  115. package/public/js/dom.js.map +1 -0
  116. package/public/js/fileSourceBrowser.d.ts +5 -0
  117. package/public/js/fileSourceBrowser.js +33 -41
  118. package/public/js/fileSourceBrowser.js.map +1 -0
  119. package/public/js/flameGraph.d.ts +5 -0
  120. package/public/js/flameGraph.js +62 -72
  121. package/public/js/flameGraph.js.map +1 -0
  122. package/public/js/forceGraph.d.ts +10 -0
  123. package/public/js/forceGraph.js +581 -556
  124. package/public/js/forceGraph.js.map +1 -0
  125. package/public/js/heatmap.d.ts +4 -0
  126. package/public/js/heatmap.js +142 -164
  127. package/public/js/heatmap.js.map +1 -0
  128. package/public/js/highlight.d.ts +2 -0
  129. package/public/js/highlight.js +116 -107
  130. package/public/js/highlight.js.map +1 -0
  131. package/public/js/html.d.ts +2 -0
  132. package/public/js/html.js +14 -44
  133. package/public/js/html.js.map +1 -0
  134. package/public/js/insightsView.d.ts +5 -0
  135. package/public/js/insightsView.js +93 -111
  136. package/public/js/insightsView.js.map +1 -0
  137. package/public/js/inspector.d.ts +37 -0
  138. package/public/js/inspector.js +416 -445
  139. package/public/js/inspector.js.map +1 -0
  140. package/public/js/llm.d.ts +113 -0
  141. package/public/js/llm.js +233 -272
  142. package/public/js/llm.js.map +1 -0
  143. package/public/js/mapView.d.ts +3 -0
  144. package/public/js/mapView.js +121 -120
  145. package/public/js/mapView.js.map +1 -0
  146. package/public/js/markdown.d.ts +3 -0
  147. package/public/js/markdown.js +84 -91
  148. package/public/js/markdown.js.map +1 -0
  149. package/public/js/mindmap.d.ts +32 -0
  150. package/public/js/mindmap.js +244 -259
  151. package/public/js/mindmap.js.map +1 -0
  152. package/public/js/mobilePanels.d.ts +5 -0
  153. package/public/js/mobilePanels.js +50 -0
  154. package/public/js/mobilePanels.js.map +1 -0
  155. package/public/js/repoFiles.d.ts +12 -0
  156. package/public/js/repoFiles.js +28 -27
  157. package/public/js/repoFiles.js.map +1 -0
  158. package/public/js/reviewView.d.ts +28 -0
  159. package/public/js/reviewView.js +256 -0
  160. package/public/js/reviewView.js.map +1 -0
  161. package/public/js/sbomView.d.ts +3 -0
  162. package/public/js/sbomView.js +59 -67
  163. package/public/js/sbomView.js.map +1 -0
  164. package/public/js/scanCache.d.ts +16 -0
  165. package/public/js/scanCache.js +67 -65
  166. package/public/js/scanCache.js.map +1 -0
  167. package/public/js/search.d.ts +7 -0
  168. package/public/js/search.js +868 -800
  169. package/public/js/search.js.map +1 -0
  170. package/public/js/searchLocal.d.ts +42 -0
  171. package/public/js/searchLocal.js +87 -0
  172. package/public/js/searchLocal.js.map +1 -0
  173. package/public/js/serverSettings.d.ts +5 -0
  174. package/public/js/serverSettings.js +153 -164
  175. package/public/js/serverSettings.js.map +1 -0
  176. package/public/js/state.d.ts +798 -0
  177. package/public/js/state.js +114 -122
  178. package/public/js/state.js.map +1 -0
  179. package/public/js/tour.d.ts +6 -0
  180. package/public/js/tour.js +5 -7
  181. package/public/js/tour.js.map +1 -0
  182. package/public/js/transitions.d.ts +2 -0
  183. package/public/js/transitions.js +9 -10
  184. package/public/js/transitions.js.map +1 -0
  185. package/public/js/tree.d.ts +12 -0
  186. package/public/js/tree.js +157 -154
  187. package/public/js/tree.js.map +1 -0
  188. package/public/js/workflowsView.d.ts +3 -0
  189. package/public/js/workflowsView.js +15 -22
  190. package/public/js/workflowsView.js.map +1 -0
  191. package/public/search.css +495 -0
  192. package/public/styles.css +163 -346
  193. package/public/workbench.css +166 -0
  194. package/server/apiAuth.d.ts +3 -0
  195. package/server/apiAuth.js +18 -20
  196. package/server/apiAuth.js.map +1 -0
  197. package/server/apiDiff.d.ts +2 -0
  198. package/server/apiDiff.js +20 -18
  199. package/server/apiDiff.js.map +1 -0
  200. package/server/apiDocs.d.ts +2 -0
  201. package/server/apiDocs.js +38 -40
  202. package/server/apiDocs.js.map +1 -0
  203. package/server/apiFile.d.ts +1 -0
  204. package/server/apiFile.js +14 -17
  205. package/server/apiFile.js.map +1 -0
  206. package/server/apiGitBlame.d.ts +2 -0
  207. package/server/apiGitBlame.js +50 -51
  208. package/server/apiGitBlame.js.map +1 -0
  209. package/server/apiMcp.d.ts +4 -0
  210. package/server/apiMcp.js +64 -66
  211. package/server/apiMcp.js.map +1 -0
  212. package/server/apiReview.d.ts +2 -0
  213. package/server/apiReview.js +45 -0
  214. package/server/apiReview.js.map +1 -0
  215. package/server/apiScan.d.ts +5 -0
  216. package/server/apiScan.js +90 -71
  217. package/server/apiScan.js.map +1 -0
  218. package/server/apiSearch.d.ts +33 -0
  219. package/server/apiSearch.js +184 -200
  220. package/server/apiSearch.js.map +1 -0
  221. package/server/apiSettings.d.ts +4 -0
  222. package/server/apiSettings.js +84 -85
  223. package/server/apiSettings.js.map +1 -0
  224. package/server/apiTools.d.ts +3 -0
  225. package/server/apiTools.js +55 -56
  226. package/server/apiTools.js.map +1 -0
  227. package/server/auth.d.ts +5 -0
  228. package/server/auth.js +54 -51
  229. package/server/auth.js.map +1 -0
  230. package/server/config.d.ts +42 -0
  231. package/server/config.js +189 -194
  232. package/server/config.js.map +1 -0
  233. package/server/daemon.d.ts +12 -0
  234. package/server/daemon.js +124 -114
  235. package/server/daemon.js.map +1 -0
  236. package/server/fileSourceNode.d.ts +2 -0
  237. package/server/fileSourceNode.js +34 -36
  238. package/server/fileSourceNode.js.map +1 -0
  239. package/server/gitClone.d.ts +9 -0
  240. package/server/gitClone.js +59 -61
  241. package/server/gitClone.js.map +1 -0
  242. package/server/gitDiff.d.ts +36 -0
  243. package/server/gitDiff.js +271 -169
  244. package/server/gitDiff.js.map +1 -0
  245. package/server/gitHistory.d.ts +12 -0
  246. package/server/gitHistory.js +80 -80
  247. package/server/gitHistory.js.map +1 -0
  248. package/server/gitRemote.d.ts +12 -0
  249. package/server/gitRemote.js +37 -38
  250. package/server/gitRemote.js.map +1 -0
  251. package/server/htmlText.d.ts +4 -0
  252. package/server/htmlText.js +16 -23
  253. package/server/htmlText.js.map +1 -0
  254. package/server/http.d.ts +5 -0
  255. package/server/http.js +27 -30
  256. package/server/http.js.map +1 -0
  257. package/server/httpGuards.d.ts +2 -0
  258. package/server/httpGuards.js +47 -43
  259. package/server/httpGuards.js.map +1 -0
  260. package/server/https.d.ts +34 -0
  261. package/server/https.js +121 -111
  262. package/server/https.js.map +1 -0
  263. package/server/index.d.ts +40 -0
  264. package/server/index.js +139 -147
  265. package/server/index.js.map +1 -0
  266. package/server/layout.d.ts +26 -0
  267. package/server/layout.js +59 -64
  268. package/server/layout.js.map +1 -0
  269. package/server/llmProxy.d.ts +3 -0
  270. package/server/llmProxy.js +137 -135
  271. package/server/llmProxy.js.map +1 -0
  272. package/server/logger.d.ts +38 -0
  273. package/server/logger.js +198 -211
  274. package/server/logger.js.map +1 -0
  275. package/server/mcp/analysis.d.ts +29 -0
  276. package/server/mcp/analysis.js +99 -120
  277. package/server/mcp/analysis.js.map +1 -0
  278. package/server/mcp/http.d.ts +9 -0
  279. package/server/mcp/http.js +128 -137
  280. package/server/mcp/http.js.map +1 -0
  281. package/server/mcp/runner.d.ts +68 -0
  282. package/server/mcp/runner.js +208 -218
  283. package/server/mcp/runner.js.map +1 -0
  284. package/server/mcp/server.d.ts +29 -0
  285. package/server/mcp/server.js +166 -179
  286. package/server/mcp/server.js.map +1 -0
  287. package/server/mcp/standalone.d.ts +1 -0
  288. package/server/mcp/standalone.js +8 -10
  289. package/server/mcp/standalone.js.map +1 -0
  290. package/server/mcp/tools.d.ts +2020 -0
  291. package/server/mcp/tools.js +523 -574
  292. package/server/mcp/tools.js.map +1 -0
  293. package/server/paths.d.ts +3 -0
  294. package/server/paths.js +17 -15
  295. package/server/paths.js.map +1 -0
  296. package/server/pidfile.d.ts +9 -0
  297. package/server/pidfile.js +43 -45
  298. package/server/pidfile.js.map +1 -0
  299. package/server/review.d.ts +5 -0
  300. package/server/review.js +35 -0
  301. package/server/review.js.map +1 -0
  302. package/server/router.d.ts +33 -0
  303. package/server/router.js +191 -197
  304. package/server/router.js.map +1 -0
  305. package/server/scanRequest.d.ts +3 -0
  306. package/server/scanRequest.js +36 -0
  307. package/server/scanRequest.js.map +1 -0
  308. package/server/searchIndex.d.ts +17 -0
  309. package/server/searchIndex.js +83 -80
  310. package/server/searchIndex.js.map +1 -0
  311. package/server/sessions.d.ts +14 -0
  312. package/server/sessions.js +62 -70
  313. package/server/sessions.js.map +1 -0
  314. package/server/startup.d.ts +118 -0
  315. package/server/startup.js +143 -148
  316. package/server/startup.js.map +1 -0
  317. package/server/static.d.ts +6 -0
  318. package/server/static.js +28 -31
  319. package/server/static.js.map +1 -0
  320. package/server/tools/install.d.ts +4 -0
  321. package/server/tools/install.js +176 -185
  322. package/server/tools/install.js.map +1 -0
  323. package/server/tools/parse.d.ts +8 -0
  324. package/server/tools/parse.js +112 -114
  325. package/server/tools/parse.js.map +1 -0
  326. package/server/tools/platform.d.ts +9 -0
  327. package/server/tools/platform.js +49 -47
  328. package/server/tools/platform.js.map +1 -0
  329. package/server/tools/registry.d.ts +137 -0
  330. package/server/tools/registry.js +173 -172
  331. package/server/tools/registry.js.map +1 -0
  332. package/server/tools/scan.d.ts +34 -0
  333. package/server/tools/scan.js +89 -98
  334. package/server/tools/scan.js.map +1 -0
  335. package/server/tools.d.ts +34 -0
  336. package/server/tools.js +94 -107
  337. package/server/tools.js.map +1 -0
  338. package/server/tunnel.d.ts +29 -0
  339. package/server/tunnel.js +61 -66
  340. package/server/tunnel.js.map +1 -0
  341. package/shared/analyzer/docs.d.ts +16 -0
  342. package/shared/analyzer/docs.js +99 -93
  343. package/shared/analyzer/docs.js.map +1 -0
  344. package/shared/analyzer/explainLocal.d.ts +4 -0
  345. package/shared/analyzer/explainLocal.js +122 -142
  346. package/shared/analyzer/explainLocal.js.map +1 -0
  347. package/shared/analyzer/github.d.ts +37 -0
  348. package/shared/analyzer/github.js +41 -43
  349. package/shared/analyzer/github.js.map +1 -0
  350. package/shared/analyzer/graph.d.ts +41 -0
  351. package/shared/analyzer/graph.js +393 -400
  352. package/shared/analyzer/graph.js.map +1 -0
  353. package/shared/analyzer/health.d.ts +33 -0
  354. package/shared/analyzer/health.js +197 -193
  355. package/shared/analyzer/health.js.map +1 -0
  356. package/shared/analyzer/history.d.ts +29 -0
  357. package/shared/analyzer/history.js +110 -111
  358. package/shared/analyzer/history.js.map +1 -0
  359. package/shared/analyzer/jsonConfig.d.ts +2 -0
  360. package/shared/analyzer/jsonConfig.js +61 -0
  361. package/shared/analyzer/jsonConfig.js.map +1 -0
  362. package/shared/analyzer/languages/csharp.d.ts +26 -0
  363. package/shared/analyzer/languages/csharp.js +83 -88
  364. package/shared/analyzer/languages/csharp.js.map +1 -0
  365. package/shared/analyzer/languages/generic.d.ts +23 -0
  366. package/shared/analyzer/languages/generic.js +94 -105
  367. package/shared/analyzer/languages/generic.js.map +1 -0
  368. package/shared/analyzer/languages/go.d.ts +24 -0
  369. package/shared/analyzer/languages/go.js +45 -54
  370. package/shared/analyzer/languages/go.js.map +1 -0
  371. package/shared/analyzer/languages/index.d.ts +6 -0
  372. package/shared/analyzer/languages/index.js +19 -20
  373. package/shared/analyzer/languages/index.js.map +1 -0
  374. package/shared/analyzer/languages/java.d.ts +20 -0
  375. package/shared/analyzer/languages/java.js +73 -78
  376. package/shared/analyzer/languages/java.js.map +1 -0
  377. package/shared/analyzer/languages/javascript.d.ts +12 -0
  378. package/shared/analyzer/languages/javascript.js +258 -209
  379. package/shared/analyzer/languages/javascript.js.map +1 -0
  380. package/shared/analyzer/languages/python.d.ts +23 -0
  381. package/shared/analyzer/languages/python.js +92 -100
  382. package/shared/analyzer/languages/python.js.map +1 -0
  383. package/shared/analyzer/languages/rust.d.ts +17 -0
  384. package/shared/analyzer/languages/rust.js +96 -98
  385. package/shared/analyzer/languages/rust.js.map +1 -0
  386. package/shared/analyzer/languages/typescript.d.ts +11 -0
  387. package/shared/analyzer/languages/typescript.js +117 -116
  388. package/shared/analyzer/languages/typescript.js.map +1 -0
  389. package/shared/analyzer/licenses.d.ts +18 -0
  390. package/shared/analyzer/licenses.js +130 -133
  391. package/shared/analyzer/licenses.js.map +1 -0
  392. package/shared/analyzer/metrics.d.ts +20 -0
  393. package/shared/analyzer/metrics.js +112 -104
  394. package/shared/analyzer/metrics.js.map +1 -0
  395. package/shared/analyzer/pathUtil.d.ts +10 -0
  396. package/shared/analyzer/pathUtil.js +29 -35
  397. package/shared/analyzer/pathUtil.js.map +1 -0
  398. package/shared/analyzer/patterns.d.ts +11 -0
  399. package/shared/analyzer/patterns.js +231 -253
  400. package/shared/analyzer/patterns.js.map +1 -0
  401. package/shared/analyzer/scan.d.ts +62 -0
  402. package/shared/analyzer/scan.js +451 -442
  403. package/shared/analyzer/scan.js.map +1 -0
  404. package/shared/analyzer/scanControl.d.ts +11 -0
  405. package/shared/analyzer/scanControl.js +62 -0
  406. package/shared/analyzer/scanControl.js.map +1 -0
  407. package/shared/analyzer/security.d.ts +18 -0
  408. package/shared/analyzer/security.js +159 -159
  409. package/shared/analyzer/security.js.map +1 -0
  410. package/shared/analyzer/services.d.ts +5 -0
  411. package/shared/analyzer/services.js +141 -138
  412. package/shared/analyzer/services.js.map +1 -0
  413. package/shared/analyzer/stack.d.ts +6 -0
  414. package/shared/analyzer/stack.js +134 -141
  415. package/shared/analyzer/stack.js.map +1 -0
  416. package/shared/analyzer/tour.d.ts +2 -0
  417. package/shared/analyzer/tour.js +45 -53
  418. package/shared/analyzer/tour.js.map +1 -0
  419. package/shared/analyzer/util.d.ts +8 -0
  420. package/shared/analyzer/util.js +130 -76
  421. package/shared/analyzer/util.js.map +1 -0
  422. package/shared/analyzer/workflows.d.ts +8 -0
  423. package/shared/analyzer/workflows.js +139 -134
  424. package/shared/analyzer/workflows.js.map +1 -0
  425. package/shared/contracts.d.ts +250 -0
  426. package/shared/contracts.js +2 -0
  427. package/shared/contracts.js.map +1 -0
  428. package/shared/diagram/aiFacts.d.ts +35 -0
  429. package/shared/diagram/aiFacts.js +102 -105
  430. package/shared/diagram/aiFacts.js.map +1 -0
  431. package/shared/diagram/aiMermaid.d.ts +5 -0
  432. package/shared/diagram/aiMermaid.js +46 -45
  433. package/shared/diagram/aiMermaid.js.map +1 -0
  434. package/shared/diagram/atlas.d.ts +16 -0
  435. package/shared/diagram/atlas.js +51 -60
  436. package/shared/diagram/atlas.js.map +1 -0
  437. package/shared/diagram/mermaid.d.ts +43 -0
  438. package/shared/diagram/mermaid.js +348 -370
  439. package/shared/diagram/mermaid.js.map +1 -0
  440. package/shared/review/contracts.d.ts +95 -0
  441. package/shared/review/contracts.js +2 -0
  442. package/shared/review/contracts.js.map +1 -0
  443. package/shared/review/review.d.ts +10 -0
  444. package/shared/review/review.js +184 -0
  445. package/shared/review/review.js.map +1 -0
  446. package/shared/search/query.d.ts +32 -0
  447. package/shared/search/query.js +395 -388
  448. 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
- javascript: /\b(if|for|while|case|catch|do|else if)\b/g,
5
- python: /\b(if|elif|for|while|except)\b/g,
6
- go: /\b(if|for|case|go|select)\b/g,
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
- const lines = String(source).split('\n');
12
- let blank = 0;
13
- let comment = 0;
14
- let code = 0;
15
- let inBlock = false;
16
- const isHashComment = ['python', 'ruby', 'yaml', 'toml', 'shell', 'bash', 'sh'].includes(lang)
17
- || (!lang && (source.includes('#!') || /\b(def|import|class)\b/.test(source)));
18
-
19
- for (const raw of lines) {
20
- const l = raw.trim();
21
- if (!l) { blank++; continue; }
22
- if (inBlock) { comment++; if (l.includes('*/')) inBlock = false; continue; }
23
- if (l.startsWith('//') || (isHashComment && l.startsWith('#'))) { comment++; continue; }
24
- if (l.startsWith('/*')) { comment++; if (!l.includes('*/')) inBlock = true; continue; }
25
- code++;
26
- }
27
- return { lines: lines.length, code, comment, blank };
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
- const isHash = ['python', 'ruby', 'yaml', 'toml', 'shell'].includes(lang);
32
- const clean = blankComments(String(source), { lineChar: isHash ? '#' : '//' });
33
- const rx = DECISIONS[lang] || GENERIC;
34
- let score = 1;
35
- const decisions = clean.match(rx);
36
- score += decisions ? decisions.length : 0;
37
- const bools = clean.match(/&&|\|\||\?/g); // boolean ops + ternaries
38
- score += bools ? bools.length : 0;
39
- return score;
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
- const isHash = ['python', 'ruby', 'yaml', 'toml', 'shell'].includes(lang);
44
- const clean = blankComments(String(source), { lineChar: isHash ? '#' : '//' });
45
-
46
- const ops = ['\+', '-', '\*', '/', '=', '==', '===', '!=', '!==', '<', '>', '<=', '>=', '&&', '\|\|', '!', '%', '\*\*', '\+\+', '--', '\+=', '-=', '\*=', '/=', '=>', '\?\?', '\?\.', '\.\.\.'];
47
- const opPattern = new RegExp(ops.map(o => o.replace(/[.*+?^$\\{}()|[\]\\]/g, '\\$&')).join('|'), 'g');
48
-
49
- const operators = new Set();
50
- let N1 = 0;
51
- for (const m of clean.matchAll(opPattern)) {
52
- operators.add(m[0]);
53
- N1++;
54
- }
55
- const n1 = operators.size;
56
-
57
- const operands = new Set();
58
- let N2 = 0;
59
- for (const m of clean.matchAll(/\b[a-zA-Z_][a-zA-Z0-9_]*\b|\b\d+\b|['"][^'"]*['"]/g)) {
60
- const val = m[0];
61
- if (["if", "else", "for", "while", "return", "function", "class", "import", "export", "var", "let", "const", "true", "false", "null"].includes(val)) continue;
62
- operands.add(val);
63
- N2++;
64
- }
65
- const n2 = operands.size;
66
-
67
- const vocabulary = n1 + n2;
68
- const length = N1 + N2;
69
- const volume = vocabulary === 0 ? 0 : length * Math.log2(vocabulary);
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
- const isHash = ['python', 'ruby', 'yaml', 'toml', 'shell'].includes(lang);
78
- const clean = blankComments(String(source), { lineChar: isHash ? '#' : '//' });
79
-
80
- let score = 0;
81
- let nesting = 0;
82
- let inSwitch = false;
83
-
84
- const lines = clean.split('\n');
85
- for (const line of lines) {
86
- const l = line.trim();
87
- if (l.includes('{')) {
88
- if (/\b(if|for|while|do|switch|catch)\b/.test(l)) {
89
- if (/\bswitch\b/.test(l)) {
90
- inSwitch = true;
91
- score += (1 + nesting);
92
- nesting++;
93
- } else {
94
- score += (1 + nesting);
95
- nesting++;
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
- } else {
98
- nesting++;
99
- }
100
- }
101
- if (l.includes('}')) {
102
- nesting = Math.max(0, nesting - 1);
103
- }
104
- if (!l.includes('{') && /\b(if|else if|for|while|do|catch)\b/.test(l)) {
105
- score += (1 + nesting);
106
- }
107
- if (/\belse\b(?!\s+if)/.test(l)) {
108
- score += 1;
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
- const ops = l.match(/&&|\|\||\?/g);
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
- if (halstead.volume === 0 || loc === 0) return 100;
118
- let MI = (171 - 5.2 * Math.log(halstead.volume) - 0.23 * complexity - 16.2 * Math.log(loc)) * 100 / 171;
119
- return Math.max(0, Math.min(100, MI));
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
- const out = [];
7
- for (const part of String(path).split('/')) {
8
- if (!part || part === '.') continue;
9
- if (part === '..') {
10
- out.pop();
11
- continue;
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.push(part);
14
- }
15
- return out.join('/');
15
+ return out.join('/');
16
16
  }
17
-
18
17
  export function joinPath(...parts) {
19
- return normalize(parts.filter(Boolean).join('/'));
18
+ return normalize(parts.filter(Boolean).join('/'));
20
19
  }
21
-
22
20
  export function dirOf(path) {
23
- const i = path.lastIndexOf('/');
24
- return i === -1 ? '' : path.slice(0, i);
21
+ const i = path.lastIndexOf('/');
22
+ return i === -1 ? '' : path.slice(0, i);
25
23
  }
26
-
27
24
  export function baseName(path) {
28
- const i = path.lastIndexOf('/');
29
- return path.slice(i + 1);
25
+ const i = path.lastIndexOf('/');
26
+ return path.slice(i + 1);
30
27
  }
31
-
32
28
  export function extOf(path) {
33
- const base = baseName(path);
34
- const i = base.lastIndexOf('.');
35
- return i <= 0 ? '' : base.slice(i).toLowerCase();
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
- if (!path) return 0;
40
- return path.split('/').length;
34
+ if (!path)
35
+ return 0;
36
+ return path.split('/').length;
41
37
  }
42
-
43
38
  export function topFolderOf(path) {
44
- const i = path.indexOf('/');
45
- return i === -1 ? '(root)' : path.slice(0, i);
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
- return TEST_PATH_RE.test(path);
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
- const needle = text.trim().toLowerCase();
67
- if (!needle && showTests) return null;
68
- return (p) => (showTests || !isTestPath(p)) && (!needle || p.toLowerCase().includes(needle));
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":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,gEAAgE;AAEhE,MAAM,UAAU,SAAS,CAAC,IAAI;IAC5B,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG;YAAE,SAAS;QACpC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAG,KAAK;IAC/B,OAAO,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAI;IACxB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAI;IAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAI;IACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAI;IAC1B,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAI;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,gFAAgF;AAChF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG,mEAAmE,CAAC;AAEhG,MAAM,UAAU,UAAU,CAAC,IAAI;IAC7B,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,+EAA+E;AAC/E,2EAA2E;AAC3E,kFAAkF;AAClF,iFAAiF;AACjF,4CAA4C;AAC5C,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,GAAwB,EAAE;IAClF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/F,CAAC","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
+ };