codebase-onboarder 0.6.0 → 1.0.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 (526) hide show
  1. package/README.md +284 -53
  2. package/bin/build-if-source.js +23 -0
  3. package/bin/onboarder.js +0 -0
  4. package/cli/agent/command.d.ts +71 -0
  5. package/cli/agent/command.js +177 -0
  6. package/cli/agent/command.js.map +1 -0
  7. package/cli/agent/config.d.ts +31 -0
  8. package/cli/agent/config.js +98 -0
  9. package/cli/agent/config.js.map +1 -0
  10. package/cli/agent/contracts.d.ts +77 -0
  11. package/cli/agent/contracts.js +2 -0
  12. package/cli/agent/contracts.js.map +1 -0
  13. package/cli/agent/files.d.ts +19 -0
  14. package/cli/agent/files.js +109 -0
  15. package/cli/agent/files.js.map +1 -0
  16. package/cli/agent/gitSource.d.ts +18 -0
  17. package/cli/agent/gitSource.js +69 -0
  18. package/cli/agent/gitSource.js.map +1 -0
  19. package/cli/agent/github.d.ts +21 -0
  20. package/cli/agent/github.js +94 -0
  21. package/cli/agent/github.js.map +1 -0
  22. package/cli/agent/mcp.d.ts +15 -0
  23. package/cli/agent/mcp.js +78 -0
  24. package/cli/agent/mcp.js.map +1 -0
  25. package/cli/agent/process.d.ts +18 -0
  26. package/cli/agent/process.js +118 -0
  27. package/cli/agent/process.js.map +1 -0
  28. package/cli/agent/protocol.d.ts +3 -0
  29. package/cli/agent/protocol.js +26 -0
  30. package/cli/agent/protocol.js.map +1 -0
  31. package/cli/agent/runner.d.ts +34 -0
  32. package/cli/agent/runner.js +152 -0
  33. package/cli/agent/runner.js.map +1 -0
  34. package/cli/agent/stdio.d.ts +1 -0
  35. package/cli/agent/stdio.js +62 -0
  36. package/cli/agent/stdio.js.map +1 -0
  37. package/cli/agent/tools.d.ts +7 -0
  38. package/cli/agent/tools.js +201 -0
  39. package/cli/agent/tools.js.map +1 -0
  40. package/cli/chat/app.d.ts +16 -0
  41. package/cli/chat/app.js +345 -0
  42. package/cli/chat/app.js.map +1 -0
  43. package/cli/chat/commands.d.ts +11 -0
  44. package/cli/chat/commands.js +120 -0
  45. package/cli/chat/commands.js.map +1 -0
  46. package/cli/chat/composer.d.ts +75 -0
  47. package/cli/chat/composer.js +467 -0
  48. package/cli/chat/composer.js.map +1 -0
  49. package/cli/chat/controller.d.ts +60 -0
  50. package/cli/chat/controller.js +393 -0
  51. package/cli/chat/controller.js.map +1 -0
  52. package/cli/chat/logo.d.ts +3 -0
  53. package/cli/chat/logo.js +14 -0
  54. package/cli/chat/logo.js.map +1 -0
  55. package/cli/chat/models.d.ts +18 -0
  56. package/cli/chat/models.js +88 -0
  57. package/cli/chat/models.js.map +1 -0
  58. package/cli/chat/profile.d.ts +5 -0
  59. package/cli/chat/profile.js +98 -0
  60. package/cli/chat/profile.js.map +1 -0
  61. package/cli/chat/render.d.ts +40 -0
  62. package/cli/chat/render.js +259 -0
  63. package/cli/chat/render.js.map +1 -0
  64. package/cli/chat/screen.d.ts +26 -0
  65. package/cli/chat/screen.js +117 -0
  66. package/cli/chat/screen.js.map +1 -0
  67. package/cli/chat/source.d.ts +29 -0
  68. package/cli/chat/source.js +116 -0
  69. package/cli/chat/source.js.map +1 -0
  70. package/cli/chat/store.d.ts +43 -0
  71. package/cli/chat/store.js +94 -0
  72. package/cli/chat/store.js.map +1 -0
  73. package/cli/chat/text.d.ts +4 -0
  74. package/cli/chat/text.js +27 -0
  75. package/cli/chat/text.js.map +1 -0
  76. package/cli/commands.d.ts +26 -0
  77. package/cli/commands.js +836 -811
  78. package/cli/commands.js.map +1 -0
  79. package/cli/explorer/advanced.d.ts +14 -0
  80. package/cli/explorer/advanced.js +321 -329
  81. package/cli/explorer/advanced.js.map +1 -0
  82. package/cli/explorer/app.d.ts +2 -0
  83. package/cli/explorer/app.js +404 -314
  84. package/cli/explorer/app.js.map +1 -0
  85. package/cli/explorer/assistant.d.ts +9 -0
  86. package/cli/explorer/assistant.js +58 -0
  87. package/cli/explorer/assistant.js.map +1 -0
  88. package/cli/explorer/commands.d.ts +17 -0
  89. package/cli/explorer/commands.js +373 -302
  90. package/cli/explorer/commands.js.map +1 -0
  91. package/cli/explorer/featureViews.d.ts +124 -0
  92. package/cli/explorer/featureViews.js +179 -0
  93. package/cli/explorer/featureViews.js.map +1 -0
  94. package/cli/explorer/github.d.ts +21 -0
  95. package/cli/explorer/github.js +42 -44
  96. package/cli/explorer/github.js.map +1 -0
  97. package/cli/explorer/graphs.d.ts +7 -0
  98. package/cli/explorer/graphs.js +90 -95
  99. package/cli/explorer/graphs.js.map +1 -0
  100. package/cli/explorer/picker.d.ts +22 -0
  101. package/cli/explorer/picker.js +150 -0
  102. package/cli/explorer/picker.js.map +1 -0
  103. package/cli/explorer/report.d.ts +85 -0
  104. package/cli/explorer/report.js +60 -0
  105. package/cli/explorer/report.js.map +1 -0
  106. package/cli/explorer/session.d.ts +449 -0
  107. package/cli/explorer/session.js +143 -144
  108. package/cli/explorer/session.js.map +1 -0
  109. package/cli/explorer/views.d.ts +19 -0
  110. package/cli/explorer/views.js +465 -482
  111. package/cli/explorer/views.js.map +1 -0
  112. package/cli/explorer/wrap.d.ts +1 -0
  113. package/cli/explorer/wrap.js +28 -44
  114. package/cli/explorer/wrap.js.map +1 -0
  115. package/cli/main.d.ts +1 -0
  116. package/cli/main.js +251 -164
  117. package/cli/main.js.map +1 -0
  118. package/cli/prompt.d.ts +5 -0
  119. package/cli/prompt.js +84 -80
  120. package/cli/prompt.js.map +1 -0
  121. package/cli/scanOptions.d.ts +2 -0
  122. package/cli/scanOptions.js +11 -0
  123. package/cli/scanOptions.js.map +1 -0
  124. package/cli/ui.d.ts +33 -0
  125. package/cli/ui.js +35 -44
  126. package/cli/ui.js.map +1 -0
  127. package/cli/wizard.d.ts +187 -0
  128. package/cli/wizard.js +304 -284
  129. package/cli/wizard.js.map +1 -0
  130. package/docs/HERMES_RESEARCH.md +51 -0
  131. package/package.json +16 -4
  132. package/public/app.d.ts +1 -0
  133. package/public/app.js +1133 -1011
  134. package/public/app.js.map +1 -0
  135. package/public/assets/onboarder-mark.svg +11 -0
  136. package/public/browser.d.ts +71 -0
  137. package/public/browser.js +2 -0
  138. package/public/browser.js.map +1 -0
  139. package/public/index.html +54 -20
  140. package/public/js/about.d.ts +6 -0
  141. package/public/js/about.js +152 -172
  142. package/public/js/about.js.map +1 -0
  143. package/public/js/aiDraft.d.ts +4 -0
  144. package/public/js/aiDraft.js +166 -125
  145. package/public/js/aiDraft.js.map +1 -0
  146. package/public/js/analysisPanel.d.ts +7 -0
  147. package/public/js/analysisPanel.js +166 -166
  148. package/public/js/analysisPanel.js.map +1 -0
  149. package/public/js/analysisReport.d.ts +38 -0
  150. package/public/js/analysisReport.js +105 -110
  151. package/public/js/analysisReport.js.map +1 -0
  152. package/public/js/api.d.ts +29 -0
  153. package/public/js/api.js +198 -166
  154. package/public/js/api.js.map +1 -0
  155. package/public/js/atlas.d.ts +6 -0
  156. package/public/js/atlas.js +50 -58
  157. package/public/js/atlas.js.map +1 -0
  158. package/public/js/blameView.d.ts +2 -0
  159. package/public/js/blameView.js +36 -37
  160. package/public/js/blameView.js.map +1 -0
  161. package/public/js/codeTab.d.ts +3 -0
  162. package/public/js/codeTab.js +175 -180
  163. package/public/js/codeTab.js.map +1 -0
  164. package/public/js/codeViewer.d.ts +5 -0
  165. package/public/js/codeViewer.js +162 -150
  166. package/public/js/codeViewer.js.map +1 -0
  167. package/public/js/components/FileChip.d.ts +9 -0
  168. package/public/js/components/FileChip.js +45 -49
  169. package/public/js/components/FileChip.js.map +1 -0
  170. package/public/js/components/MetricSparkline.d.ts +7 -0
  171. package/public/js/components/MetricSparkline.js +35 -44
  172. package/public/js/components/MetricSparkline.js.map +1 -0
  173. package/public/js/components/RiskBadge.d.ts +9 -0
  174. package/public/js/components/RiskBadge.js +55 -63
  175. package/public/js/components/RiskBadge.js.map +1 -0
  176. package/public/js/deepAnalysisView.d.ts +99 -0
  177. package/public/js/deepAnalysisView.js +282 -302
  178. package/public/js/deepAnalysisView.js.map +1 -0
  179. package/public/js/diagramPane.d.ts +9 -0
  180. package/public/js/diagramPane.js +138 -135
  181. package/public/js/diagramPane.js.map +1 -0
  182. package/public/js/diffView.d.ts +6 -0
  183. package/public/js/diffView.js +222 -209
  184. package/public/js/diffView.js.map +1 -0
  185. package/public/js/docsView.d.ts +2 -0
  186. package/public/js/docsView.js +441 -442
  187. package/public/js/docsView.js.map +1 -0
  188. package/public/js/dom.d.ts +197 -0
  189. package/public/js/dom.js +5 -0
  190. package/public/js/dom.js.map +1 -0
  191. package/public/js/fileSourceBrowser.d.ts +5 -0
  192. package/public/js/fileSourceBrowser.js +33 -41
  193. package/public/js/fileSourceBrowser.js.map +1 -0
  194. package/public/js/flameGraph.d.ts +5 -0
  195. package/public/js/flameGraph.js +62 -72
  196. package/public/js/flameGraph.js.map +1 -0
  197. package/public/js/forceGraph.d.ts +10 -0
  198. package/public/js/forceGraph.js +581 -556
  199. package/public/js/forceGraph.js.map +1 -0
  200. package/public/js/heatmap.d.ts +4 -0
  201. package/public/js/heatmap.js +142 -164
  202. package/public/js/heatmap.js.map +1 -0
  203. package/public/js/highlight.d.ts +2 -0
  204. package/public/js/highlight.js +116 -107
  205. package/public/js/highlight.js.map +1 -0
  206. package/public/js/html.d.ts +2 -0
  207. package/public/js/html.js +14 -44
  208. package/public/js/html.js.map +1 -0
  209. package/public/js/insightsView.d.ts +5 -0
  210. package/public/js/insightsView.js +93 -111
  211. package/public/js/insightsView.js.map +1 -0
  212. package/public/js/inspector.d.ts +37 -0
  213. package/public/js/inspector.js +416 -445
  214. package/public/js/inspector.js.map +1 -0
  215. package/public/js/llm.d.ts +115 -0
  216. package/public/js/llm.js +246 -278
  217. package/public/js/llm.js.map +1 -0
  218. package/public/js/mapView.d.ts +3 -0
  219. package/public/js/mapView.js +121 -120
  220. package/public/js/mapView.js.map +1 -0
  221. package/public/js/markdown.d.ts +3 -0
  222. package/public/js/markdown.js +84 -91
  223. package/public/js/markdown.js.map +1 -0
  224. package/public/js/mindmap.d.ts +32 -0
  225. package/public/js/mindmap.js +244 -259
  226. package/public/js/mindmap.js.map +1 -0
  227. package/public/js/mobilePanels.d.ts +5 -0
  228. package/public/js/mobilePanels.js +50 -0
  229. package/public/js/mobilePanels.js.map +1 -0
  230. package/public/js/repoFiles.d.ts +12 -0
  231. package/public/js/repoFiles.js +29 -28
  232. package/public/js/repoFiles.js.map +1 -0
  233. package/public/js/reviewView.d.ts +28 -0
  234. package/public/js/reviewView.js +256 -0
  235. package/public/js/reviewView.js.map +1 -0
  236. package/public/js/sbomView.d.ts +3 -0
  237. package/public/js/sbomView.js +59 -67
  238. package/public/js/sbomView.js.map +1 -0
  239. package/public/js/scanCache.d.ts +16 -0
  240. package/public/js/scanCache.js +67 -65
  241. package/public/js/scanCache.js.map +1 -0
  242. package/public/js/search.d.ts +7 -0
  243. package/public/js/search.js +868 -800
  244. package/public/js/search.js.map +1 -0
  245. package/public/js/searchLocal.d.ts +42 -0
  246. package/public/js/searchLocal.js +87 -0
  247. package/public/js/searchLocal.js.map +1 -0
  248. package/public/js/serverSettings.d.ts +5 -0
  249. package/public/js/serverSettings.js +153 -164
  250. package/public/js/serverSettings.js.map +1 -0
  251. package/public/js/state.d.ts +798 -0
  252. package/public/js/state.js +114 -122
  253. package/public/js/state.js.map +1 -0
  254. package/public/js/tour.d.ts +6 -0
  255. package/public/js/tour.js +5 -7
  256. package/public/js/tour.js.map +1 -0
  257. package/public/js/transitions.d.ts +2 -0
  258. package/public/js/transitions.js +9 -10
  259. package/public/js/transitions.js.map +1 -0
  260. package/public/js/tree.d.ts +12 -0
  261. package/public/js/tree.js +157 -154
  262. package/public/js/tree.js.map +1 -0
  263. package/public/js/workflowsView.d.ts +3 -0
  264. package/public/js/workflowsView.js +15 -22
  265. package/public/js/workflowsView.js.map +1 -0
  266. package/public/search.css +495 -0
  267. package/public/styles.css +188 -346
  268. package/public/workbench.css +166 -0
  269. package/server/apiAuth.d.ts +3 -0
  270. package/server/apiAuth.js +18 -20
  271. package/server/apiAuth.js.map +1 -0
  272. package/server/apiDiff.d.ts +2 -0
  273. package/server/apiDiff.js +20 -18
  274. package/server/apiDiff.js.map +1 -0
  275. package/server/apiDocs.d.ts +2 -0
  276. package/server/apiDocs.js +38 -40
  277. package/server/apiDocs.js.map +1 -0
  278. package/server/apiFile.d.ts +1 -0
  279. package/server/apiFile.js +14 -17
  280. package/server/apiFile.js.map +1 -0
  281. package/server/apiGitBlame.d.ts +2 -0
  282. package/server/apiGitBlame.js +50 -51
  283. package/server/apiGitBlame.js.map +1 -0
  284. package/server/apiMcp.d.ts +4 -0
  285. package/server/apiMcp.js +64 -66
  286. package/server/apiMcp.js.map +1 -0
  287. package/server/apiReview.d.ts +2 -0
  288. package/server/apiReview.js +45 -0
  289. package/server/apiReview.js.map +1 -0
  290. package/server/apiScan.d.ts +5 -0
  291. package/server/apiScan.js +90 -71
  292. package/server/apiScan.js.map +1 -0
  293. package/server/apiSearch.d.ts +33 -0
  294. package/server/apiSearch.js +184 -200
  295. package/server/apiSearch.js.map +1 -0
  296. package/server/apiSettings.d.ts +4 -0
  297. package/server/apiSettings.js +84 -85
  298. package/server/apiSettings.js.map +1 -0
  299. package/server/apiTools.d.ts +3 -0
  300. package/server/apiTools.js +55 -56
  301. package/server/apiTools.js.map +1 -0
  302. package/server/auth.d.ts +5 -0
  303. package/server/auth.js +54 -51
  304. package/server/auth.js.map +1 -0
  305. package/server/config.d.ts +42 -0
  306. package/server/config.js +189 -194
  307. package/server/config.js.map +1 -0
  308. package/server/daemon.d.ts +12 -0
  309. package/server/daemon.js +124 -114
  310. package/server/daemon.js.map +1 -0
  311. package/server/fileSourceNode.d.ts +2 -0
  312. package/server/fileSourceNode.js +34 -36
  313. package/server/fileSourceNode.js.map +1 -0
  314. package/server/gitClone.d.ts +9 -0
  315. package/server/gitClone.js +59 -61
  316. package/server/gitClone.js.map +1 -0
  317. package/server/gitDiff.d.ts +36 -0
  318. package/server/gitDiff.js +271 -169
  319. package/server/gitDiff.js.map +1 -0
  320. package/server/gitHistory.d.ts +12 -0
  321. package/server/gitHistory.js +80 -80
  322. package/server/gitHistory.js.map +1 -0
  323. package/server/gitRemote.d.ts +12 -0
  324. package/server/gitRemote.js +37 -38
  325. package/server/gitRemote.js.map +1 -0
  326. package/server/hermesChat.d.ts +13 -0
  327. package/server/hermesChat.js +145 -0
  328. package/server/hermesChat.js.map +1 -0
  329. package/server/htmlText.d.ts +4 -0
  330. package/server/htmlText.js +16 -23
  331. package/server/htmlText.js.map +1 -0
  332. package/server/http.d.ts +6 -0
  333. package/server/http.js +27 -34
  334. package/server/http.js.map +1 -0
  335. package/server/httpGuards.d.ts +2 -0
  336. package/server/httpGuards.js +47 -43
  337. package/server/httpGuards.js.map +1 -0
  338. package/server/https.d.ts +34 -0
  339. package/server/https.js +121 -111
  340. package/server/https.js.map +1 -0
  341. package/server/index.d.ts +40 -0
  342. package/server/index.js +139 -147
  343. package/server/index.js.map +1 -0
  344. package/server/layout.d.ts +26 -0
  345. package/server/layout.js +59 -64
  346. package/server/layout.js.map +1 -0
  347. package/server/llmProxy.d.ts +3 -0
  348. package/server/llmProxy.js +137 -135
  349. package/server/llmProxy.js.map +1 -0
  350. package/server/logger.d.ts +38 -0
  351. package/server/logger.js +198 -211
  352. package/server/logger.js.map +1 -0
  353. package/server/mcp/analysis.d.ts +29 -0
  354. package/server/mcp/analysis.js +99 -120
  355. package/server/mcp/analysis.js.map +1 -0
  356. package/server/mcp/http.d.ts +9 -0
  357. package/server/mcp/http.js +128 -137
  358. package/server/mcp/http.js.map +1 -0
  359. package/server/mcp/runner.d.ts +68 -0
  360. package/server/mcp/runner.js +208 -218
  361. package/server/mcp/runner.js.map +1 -0
  362. package/server/mcp/server.d.ts +29 -0
  363. package/server/mcp/server.js +167 -180
  364. package/server/mcp/server.js.map +1 -0
  365. package/server/mcp/standalone.d.ts +1 -0
  366. package/server/mcp/standalone.js +8 -10
  367. package/server/mcp/standalone.js.map +1 -0
  368. package/server/mcp/tools.d.ts +2020 -0
  369. package/server/mcp/tools.js +523 -574
  370. package/server/mcp/tools.js.map +1 -0
  371. package/server/paths.d.ts +3 -0
  372. package/server/paths.js +17 -15
  373. package/server/paths.js.map +1 -0
  374. package/server/pidfile.d.ts +9 -0
  375. package/server/pidfile.js +43 -45
  376. package/server/pidfile.js.map +1 -0
  377. package/server/review.d.ts +5 -0
  378. package/server/review.js +35 -0
  379. package/server/review.js.map +1 -0
  380. package/server/router.d.ts +33 -0
  381. package/server/router.js +195 -197
  382. package/server/router.js.map +1 -0
  383. package/server/scanRequest.d.ts +3 -0
  384. package/server/scanRequest.js +36 -0
  385. package/server/scanRequest.js.map +1 -0
  386. package/server/searchIndex.d.ts +17 -0
  387. package/server/searchIndex.js +83 -80
  388. package/server/searchIndex.js.map +1 -0
  389. package/server/sessions.d.ts +14 -0
  390. package/server/sessions.js +62 -70
  391. package/server/sessions.js.map +1 -0
  392. package/server/startup.d.ts +118 -0
  393. package/server/startup.js +143 -148
  394. package/server/startup.js.map +1 -0
  395. package/server/static.d.ts +6 -0
  396. package/server/static.js +28 -31
  397. package/server/static.js.map +1 -0
  398. package/server/tools/install.d.ts +4 -0
  399. package/server/tools/install.js +176 -185
  400. package/server/tools/install.js.map +1 -0
  401. package/server/tools/parse.d.ts +8 -0
  402. package/server/tools/parse.js +112 -114
  403. package/server/tools/parse.js.map +1 -0
  404. package/server/tools/platform.d.ts +9 -0
  405. package/server/tools/platform.js +49 -47
  406. package/server/tools/platform.js.map +1 -0
  407. package/server/tools/registry.d.ts +137 -0
  408. package/server/tools/registry.js +173 -172
  409. package/server/tools/registry.js.map +1 -0
  410. package/server/tools/scan.d.ts +34 -0
  411. package/server/tools/scan.js +89 -98
  412. package/server/tools/scan.js.map +1 -0
  413. package/server/tools.d.ts +34 -0
  414. package/server/tools.js +94 -107
  415. package/server/tools.js.map +1 -0
  416. package/server/tunnel.d.ts +29 -0
  417. package/server/tunnel.js +61 -66
  418. package/server/tunnel.js.map +1 -0
  419. package/shared/analyzer/docs.d.ts +16 -0
  420. package/shared/analyzer/docs.js +99 -93
  421. package/shared/analyzer/docs.js.map +1 -0
  422. package/shared/analyzer/explainLocal.d.ts +4 -0
  423. package/shared/analyzer/explainLocal.js +122 -142
  424. package/shared/analyzer/explainLocal.js.map +1 -0
  425. package/shared/analyzer/github.d.ts +37 -0
  426. package/shared/analyzer/github.js +41 -43
  427. package/shared/analyzer/github.js.map +1 -0
  428. package/shared/analyzer/graph.d.ts +41 -0
  429. package/shared/analyzer/graph.js +393 -400
  430. package/shared/analyzer/graph.js.map +1 -0
  431. package/shared/analyzer/health.d.ts +33 -0
  432. package/shared/analyzer/health.js +197 -193
  433. package/shared/analyzer/health.js.map +1 -0
  434. package/shared/analyzer/history.d.ts +29 -0
  435. package/shared/analyzer/history.js +110 -111
  436. package/shared/analyzer/history.js.map +1 -0
  437. package/shared/analyzer/jsonConfig.d.ts +2 -0
  438. package/shared/analyzer/jsonConfig.js +61 -0
  439. package/shared/analyzer/jsonConfig.js.map +1 -0
  440. package/shared/analyzer/languages/csharp.d.ts +26 -0
  441. package/shared/analyzer/languages/csharp.js +83 -88
  442. package/shared/analyzer/languages/csharp.js.map +1 -0
  443. package/shared/analyzer/languages/generic.d.ts +23 -0
  444. package/shared/analyzer/languages/generic.js +94 -105
  445. package/shared/analyzer/languages/generic.js.map +1 -0
  446. package/shared/analyzer/languages/go.d.ts +24 -0
  447. package/shared/analyzer/languages/go.js +45 -54
  448. package/shared/analyzer/languages/go.js.map +1 -0
  449. package/shared/analyzer/languages/index.d.ts +6 -0
  450. package/shared/analyzer/languages/index.js +19 -20
  451. package/shared/analyzer/languages/index.js.map +1 -0
  452. package/shared/analyzer/languages/java.d.ts +20 -0
  453. package/shared/analyzer/languages/java.js +73 -78
  454. package/shared/analyzer/languages/java.js.map +1 -0
  455. package/shared/analyzer/languages/javascript.d.ts +12 -0
  456. package/shared/analyzer/languages/javascript.js +258 -209
  457. package/shared/analyzer/languages/javascript.js.map +1 -0
  458. package/shared/analyzer/languages/python.d.ts +23 -0
  459. package/shared/analyzer/languages/python.js +92 -100
  460. package/shared/analyzer/languages/python.js.map +1 -0
  461. package/shared/analyzer/languages/rust.d.ts +17 -0
  462. package/shared/analyzer/languages/rust.js +96 -98
  463. package/shared/analyzer/languages/rust.js.map +1 -0
  464. package/shared/analyzer/languages/typescript.d.ts +11 -0
  465. package/shared/analyzer/languages/typescript.js +117 -116
  466. package/shared/analyzer/languages/typescript.js.map +1 -0
  467. package/shared/analyzer/licenses.d.ts +18 -0
  468. package/shared/analyzer/licenses.js +130 -133
  469. package/shared/analyzer/licenses.js.map +1 -0
  470. package/shared/analyzer/metrics.d.ts +20 -0
  471. package/shared/analyzer/metrics.js +112 -104
  472. package/shared/analyzer/metrics.js.map +1 -0
  473. package/shared/analyzer/pathUtil.d.ts +10 -0
  474. package/shared/analyzer/pathUtil.js +29 -35
  475. package/shared/analyzer/pathUtil.js.map +1 -0
  476. package/shared/analyzer/patterns.d.ts +11 -0
  477. package/shared/analyzer/patterns.js +231 -253
  478. package/shared/analyzer/patterns.js.map +1 -0
  479. package/shared/analyzer/scan.d.ts +62 -0
  480. package/shared/analyzer/scan.js +451 -442
  481. package/shared/analyzer/scan.js.map +1 -0
  482. package/shared/analyzer/scanControl.d.ts +11 -0
  483. package/shared/analyzer/scanControl.js +62 -0
  484. package/shared/analyzer/scanControl.js.map +1 -0
  485. package/shared/analyzer/security.d.ts +18 -0
  486. package/shared/analyzer/security.js +159 -159
  487. package/shared/analyzer/security.js.map +1 -0
  488. package/shared/analyzer/services.d.ts +5 -0
  489. package/shared/analyzer/services.js +141 -138
  490. package/shared/analyzer/services.js.map +1 -0
  491. package/shared/analyzer/stack.d.ts +6 -0
  492. package/shared/analyzer/stack.js +134 -141
  493. package/shared/analyzer/stack.js.map +1 -0
  494. package/shared/analyzer/tour.d.ts +2 -0
  495. package/shared/analyzer/tour.js +45 -53
  496. package/shared/analyzer/tour.js.map +1 -0
  497. package/shared/analyzer/util.d.ts +8 -0
  498. package/shared/analyzer/util.js +130 -76
  499. package/shared/analyzer/util.js.map +1 -0
  500. package/shared/analyzer/workflows.d.ts +8 -0
  501. package/shared/analyzer/workflows.js +139 -134
  502. package/shared/analyzer/workflows.js.map +1 -0
  503. package/shared/contracts.d.ts +250 -0
  504. package/shared/contracts.js +2 -0
  505. package/shared/contracts.js.map +1 -0
  506. package/shared/diagram/aiFacts.d.ts +35 -0
  507. package/shared/diagram/aiFacts.js +102 -105
  508. package/shared/diagram/aiFacts.js.map +1 -0
  509. package/shared/diagram/aiMermaid.d.ts +5 -0
  510. package/shared/diagram/aiMermaid.js +50 -46
  511. package/shared/diagram/aiMermaid.js.map +1 -0
  512. package/shared/diagram/atlas.d.ts +16 -0
  513. package/shared/diagram/atlas.js +51 -60
  514. package/shared/diagram/atlas.js.map +1 -0
  515. package/shared/diagram/mermaid.d.ts +43 -0
  516. package/shared/diagram/mermaid.js +348 -370
  517. package/shared/diagram/mermaid.js.map +1 -0
  518. package/shared/review/contracts.d.ts +95 -0
  519. package/shared/review/contracts.js +2 -0
  520. package/shared/review/contracts.js.map +1 -0
  521. package/shared/review/review.d.ts +10 -0
  522. package/shared/review/review.js +184 -0
  523. package/shared/review/review.js.map +1 -0
  524. package/shared/search/query.d.ts +32 -0
  525. package/shared/search/query.js +395 -388
  526. package/shared/search/query.js.map +1 -0
@@ -1,120 +1,112 @@
1
1
  // Python. Line-oriented, indentation-aware enough for our purposes.
2
-
3
2
  import { blankComments, lineCounter, uniqueBy, callsWithin, declarationOrder } from '../util.js';
4
3
  import { dirOf, joinPath } from '../pathUtil.js';
5
-
6
4
  export const extensions = ['.py'];
7
-
8
5
  const IMPORT_FROM_RE = /^[ \t]*from\s+([.\w]+)\s+import\s+/gm;
9
6
  const IMPORT_PLAIN_RE = /^[ \t]*import\s+([\w.,\s]+?)\s*(?:#.*)?$/gm;
10
7
  const DEF_RE = /^([ \t]*)(?:async\s+)?def\s+([\w]+)\s*\(/gm;
11
8
  const CLASS_RE = /^([ \t]*)class\s+([\w]+)/gm;
12
-
13
9
  export function analyze(source, path) {
14
- const clean = blankComments(source, { block: false, lineChar: '#' });
15
- const lineAt = lineCounter(clean);
16
-
17
- const imports = [];
18
- for (const m of clean.matchAll(IMPORT_FROM_RE)) {
19
- imports.push({ spec: m[1], kind: 'from', line: lineAt(m.index) });
20
- }
21
- for (const m of clean.matchAll(IMPORT_PLAIN_RE)) {
22
- for (let part of m[1].split(',')) {
23
- part = part.trim().split(/\s+as\s+/)[0].trim();
24
- if (part) imports.push({ spec: part, kind: 'import', line: lineAt(m.index) });
10
+ const clean = blankComments(source, { block: false, lineChar: '#' });
11
+ const lineAt = lineCounter(clean);
12
+ const imports = [];
13
+ for (const m of clean.matchAll(IMPORT_FROM_RE)) {
14
+ imports.push({ spec: m[1], kind: 'from', line: lineAt(m.index) });
25
15
  }
26
- }
27
-
28
- const functions = [];
29
- for (const m of clean.matchAll(DEF_RE)) {
30
- const indent = m[1].length;
31
- functions.push({
32
- name: m[2],
33
- kind: indent > 0 ? 'method' : 'function',
34
- line: lineAt(m.index),
35
- indent,
36
- });
37
- }
38
-
39
- const classes = [];
40
- for (const m of clean.matchAll(CLASS_RE)) {
41
- classes.push({ name: m[2], line: lineAt(m.index) });
42
- }
43
-
44
- // Calls: a function's body is the run of lines more indented than its def.
45
- const lines = clean.split('\n');
46
- const calls = [];
47
- const topLevel = functions.filter((f) => f.kind === 'function');
48
- const names = new Set(functions.map((f) => f.name));
49
- const declaredAt = declarationOrder(functions);
50
- for (const fn of functions) {
51
- const body = indentedBody(lines, fn.line - 1, fn.indent);
52
- if (!body) continue;
53
- const called = callsWithin(body, names)
54
- .filter((name) => name !== fn.name)
55
- .sort((a, b) => declaredAt.get(a) - declaredAt.get(b));
56
- for (const name of called) calls.push({ from: fn.name, to: name });
57
- }
58
-
59
- const exports = topLevel
60
- .filter((f) => !f.name.startsWith('_'))
61
- .map((f) => ({ name: f.name, kind: 'function' }))
62
- .concat(classes.filter((c) => !c.name.startsWith('_')).map((c) => ({ name: c.name, kind: 'class' })));
63
-
64
- const hasMain = /__name__\s*==\s*['"]__main__['"]/.test(clean);
65
-
66
- return {
67
- imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),
68
- exports: uniqueBy(exports, (e) => e.name),
69
- functions: functions.map(({ indent, ...rest }) => rest),
70
- classes,
71
- calls: uniqueBy(calls, (c) => c.from + '->' + c.to),
72
- hasMain,
73
- };
16
+ for (const m of clean.matchAll(IMPORT_PLAIN_RE)) {
17
+ for (let part of m[1].split(',')) {
18
+ part = part.trim().split(/\s+as\s+/)[0].trim();
19
+ if (part)
20
+ imports.push({ spec: part, kind: 'import', line: lineAt(m.index) });
21
+ }
22
+ }
23
+ const functions = [];
24
+ for (const m of clean.matchAll(DEF_RE)) {
25
+ const indent = m[1].length;
26
+ functions.push({
27
+ name: m[2],
28
+ kind: indent > 0 ? 'method' : 'function',
29
+ line: lineAt(m.index),
30
+ indent,
31
+ });
32
+ }
33
+ const classes = [];
34
+ for (const m of clean.matchAll(CLASS_RE)) {
35
+ classes.push({ name: m[2], line: lineAt(m.index) });
36
+ }
37
+ // Calls: a function's body is the run of lines more indented than its def.
38
+ const lines = clean.split('\n');
39
+ const calls = [];
40
+ const topLevel = functions.filter((f) => f.kind === 'function');
41
+ const names = new Set(functions.map((f) => f.name));
42
+ const declaredAt = declarationOrder(functions);
43
+ for (const fn of functions) {
44
+ const body = indentedBody(lines, fn.line - 1, fn.indent);
45
+ if (!body)
46
+ continue;
47
+ const called = callsWithin(body, names)
48
+ .filter((name) => name !== fn.name)
49
+ .sort((a, b) => declaredAt.get(a) - declaredAt.get(b));
50
+ for (const name of called)
51
+ calls.push({ from: fn.name, to: name });
52
+ }
53
+ const exports = topLevel
54
+ .filter((f) => !f.name.startsWith('_'))
55
+ .map((f) => ({ name: f.name, kind: 'function' }))
56
+ .concat(classes.filter((c) => !c.name.startsWith('_')).map((c) => ({ name: c.name, kind: 'class' })));
57
+ const hasMain = /__name__\s*==\s*['"]__main__['"]/.test(clean);
58
+ return {
59
+ imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),
60
+ exports: uniqueBy(exports, (e) => e.name),
61
+ functions: functions.map(({ indent, ...rest }) => rest),
62
+ classes,
63
+ calls: uniqueBy(calls, (c) => c.from + '->' + c.to),
64
+ hasMain,
65
+ };
74
66
  }
75
-
76
67
  function indentedBody(lines, defLineIdx, indent) {
77
- const out = [];
78
- for (let i = defLineIdx + 1; i < lines.length; i++) {
79
- const line = lines[i];
80
- if (line.trim() === '') {
81
- out.push('');
82
- continue;
68
+ const out = [];
69
+ for (let i = defLineIdx + 1; i < lines.length; i++) {
70
+ const line = lines[i];
71
+ if (line.trim() === '') {
72
+ out.push('');
73
+ continue;
74
+ }
75
+ const lead = line.length - line.trimStart().length;
76
+ if (lead <= indent)
77
+ break;
78
+ out.push(line);
83
79
  }
84
- const lead = line.length - line.trimStart().length;
85
- if (lead <= indent) break;
86
- out.push(line);
87
- }
88
- return out.join('\n');
80
+ return out.join('\n');
89
81
  }
90
-
91
82
  export function packageNameOf(spec) {
92
- return spec.replace(/^\.+/, '').split('.')[0] || spec;
83
+ return spec.replace(/^\.+/, '').split('.')[0] || spec;
93
84
  }
94
-
95
85
  export function resolveImport(spec, fromPath, has, context = {}) {
96
- const fromDir = dirOf(fromPath);
97
-
98
- if (spec.startsWith('.')) {
99
- // Relative import: one dot = current package, two = parent, and so on.
100
- const dots = spec.match(/^\.+/)[0].length;
101
- let base = fromDir;
102
- for (let i = 1; i < dots; i++) base = dirOf(base);
103
- const rest = spec.slice(dots).replace(/\./g, '/');
104
- const target = rest ? joinPath(base, rest) : base;
105
- for (const cand of [target + '.py', target + '/__init__.py']) {
106
- if (has(cand)) return { path: cand };
86
+ const fromDir = dirOf(fromPath);
87
+ if (spec.startsWith('.')) {
88
+ // Relative import: one dot = current package, two = parent, and so on.
89
+ const dots = spec.match(/^\.+/)[0].length;
90
+ let base = fromDir;
91
+ for (let i = 1; i < dots; i++)
92
+ base = dirOf(base);
93
+ const rest = spec.slice(dots).replace(/\./g, '/');
94
+ const target = rest ? joinPath(base, rest) : base;
95
+ for (const cand of [target + '.py', target + '/__init__.py']) {
96
+ if (has(cand))
97
+ return { path: cand };
98
+ }
99
+ return { unresolved: spec };
107
100
  }
108
- return { unresolved: spec };
109
- }
110
-
111
- // Absolute import: try from repo root, then relative to the file (a common
112
- // layout in small scripts), then give up and call it external.
113
- const rel = spec.replace(/\./g, '/');
114
- for (const root of ['', fromDir]) {
115
- for (const cand of [joinPath(root, rel) + '.py', joinPath(root, rel) + '/__init__.py']) {
116
- if (has(cand)) return { path: cand };
101
+ // Absolute import: try from repo root, then relative to the file (a common
102
+ // layout in small scripts), then give up and call it external.
103
+ const rel = spec.replace(/\./g, '/');
104
+ for (const root of ['', fromDir]) {
105
+ for (const cand of [joinPath(root, rel) + '.py', joinPath(root, rel) + '/__init__.py']) {
106
+ if (has(cand))
107
+ return { path: cand };
108
+ }
117
109
  }
118
- }
119
- return { external: spec.split('.')[0] };
110
+ return { external: spec.split('.')[0] };
120
111
  }
112
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/shared/analyzer/languages/python.ts"],"names":[],"mappings":"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","sourcesContent":["// Python. Line-oriented, indentation-aware enough for our purposes.\n\nimport { blankComments, lineCounter, uniqueBy, callsWithin, declarationOrder } from '../util.js';\nimport { dirOf, joinPath } from '../pathUtil.js';\n\nexport const extensions = ['.py'];\n\nconst IMPORT_FROM_RE = /^[ \\t]*from\\s+([.\\w]+)\\s+import\\s+/gm;\nconst IMPORT_PLAIN_RE = /^[ \\t]*import\\s+([\\w.,\\s]+?)\\s*(?:#.*)?$/gm;\nconst DEF_RE = /^([ \\t]*)(?:async\\s+)?def\\s+([\\w]+)\\s*\\(/gm;\nconst CLASS_RE = /^([ \\t]*)class\\s+([\\w]+)/gm;\n\nexport function analyze(source, path) {\n const clean = blankComments(source, { block: false, lineChar: '#' });\n const lineAt = lineCounter(clean);\n\n const imports = [];\n for (const m of clean.matchAll(IMPORT_FROM_RE)) {\n imports.push({ spec: m[1], kind: 'from', line: lineAt(m.index) });\n }\n for (const m of clean.matchAll(IMPORT_PLAIN_RE)) {\n for (let part of m[1].split(',')) {\n part = part.trim().split(/\\s+as\\s+/)[0].trim();\n if (part) imports.push({ spec: part, kind: 'import', line: lineAt(m.index) });\n }\n }\n\n const functions = [];\n for (const m of clean.matchAll(DEF_RE)) {\n const indent = m[1].length;\n functions.push({\n name: m[2],\n kind: indent > 0 ? 'method' : 'function',\n line: lineAt(m.index),\n indent,\n });\n }\n\n const classes = [];\n for (const m of clean.matchAll(CLASS_RE)) {\n classes.push({ name: m[2], line: lineAt(m.index) });\n }\n\n // Calls: a function's body is the run of lines more indented than its def.\n const lines = clean.split('\\n');\n const calls = [];\n const topLevel = functions.filter((f) => f.kind === 'function');\n const names = new Set(functions.map((f) => f.name));\n const declaredAt = declarationOrder(functions);\n for (const fn of functions) {\n const body = indentedBody(lines, fn.line - 1, fn.indent);\n if (!body) continue;\n const called = callsWithin(body, names)\n .filter((name) => name !== fn.name)\n .sort((a, b) => declaredAt.get(a) - declaredAt.get(b));\n for (const name of called) calls.push({ from: fn.name, to: name });\n }\n\n const exports = topLevel\n .filter((f) => !f.name.startsWith('_'))\n .map((f) => ({ name: f.name, kind: 'function' }))\n .concat(classes.filter((c) => !c.name.startsWith('_')).map((c) => ({ name: c.name, kind: 'class' })));\n\n const hasMain = /__name__\\s*==\\s*['\"]__main__['\"]/.test(clean);\n\n return {\n imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),\n exports: uniqueBy(exports, (e) => e.name),\n functions: functions.map(({ indent, ...rest }) => rest),\n classes,\n calls: uniqueBy(calls, (c) => c.from + '->' + c.to),\n hasMain,\n };\n}\n\nfunction indentedBody(lines, defLineIdx, indent) {\n const out = [];\n for (let i = defLineIdx + 1; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim() === '') {\n out.push('');\n continue;\n }\n const lead = line.length - line.trimStart().length;\n if (lead <= indent) break;\n out.push(line);\n }\n return out.join('\\n');\n}\n\nexport function packageNameOf(spec) {\n return spec.replace(/^\\.+/, '').split('.')[0] || spec;\n}\n\nexport function resolveImport(spec, fromPath, has, context: Record<string, any> = {}) {\n const fromDir = dirOf(fromPath);\n\n if (spec.startsWith('.')) {\n // Relative import: one dot = current package, two = parent, and so on.\n const dots = spec.match(/^\\.+/)[0].length;\n let base = fromDir;\n for (let i = 1; i < dots; i++) base = dirOf(base);\n const rest = spec.slice(dots).replace(/\\./g, '/');\n const target = rest ? joinPath(base, rest) : base;\n for (const cand of [target + '.py', target + '/__init__.py']) {\n if (has(cand)) return { path: cand };\n }\n return { unresolved: spec };\n }\n\n // Absolute import: try from repo root, then relative to the file (a common\n // layout in small scripts), then give up and call it external.\n const rel = spec.replace(/\\./g, '/');\n for (const root of ['', fromDir]) {\n for (const cand of [joinPath(root, rel) + '.py', joinPath(root, rel) + '/__init__.py']) {\n if (has(cand)) return { path: cand };\n }\n }\n return { external: spec.split('.')[0] };\n}\n"]}
@@ -0,0 +1,17 @@
1
+ export declare const extensions: string[];
2
+ export declare function analyze(source: any, path: any): {
3
+ imports: any[];
4
+ exports: any[];
5
+ functions: any[];
6
+ classes: any[];
7
+ hasMain: boolean;
8
+ };
9
+ export declare function crateRootFor(fromPath: any): string;
10
+ export declare function moduleDirFor(fromPath: any): string;
11
+ export declare function resolveImport(spec: any, fromPath: any, has: any, context?: Record<string, any>, meta?: Record<string, any>): {
12
+ unresolved: any;
13
+ path?: undefined;
14
+ } | {
15
+ unresolved?: undefined;
16
+ path: string;
17
+ };
@@ -14,62 +14,56 @@
14
14
  // dependency from Cargo.toml — stays unresolved, because inventing a file would
15
15
  // be a node in the graph that does not exist.
16
16
  import { blankComments, lineCounter, uniqueBy } from '../util.js';
17
-
18
17
  export const extensions = ['.rs'];
19
-
20
18
  export function analyze(source, path) {
21
- const clean = blankComments(source);
22
- const lineAt = lineCounter(clean);
23
-
24
- const imports = [];
25
- // `use foo::bar;` and `mod foo;` are both dependencies on a file, and both are
26
- // worth an edge. `pub use` is a re-export — still a real dependency.
27
- for (const m of clean.matchAll(/\b(?:pub\s+)?(?:use|mod)\s+([a-zA-Z0-9_:]+)/g)) {
28
- imports.push({ spec: m[1], line: lineAt(m.index) });
29
- }
30
-
31
- const functions = [];
32
- for (const m of clean.matchAll(/\b(pub\s+)?fn\s+([a-zA-Z0-9_]+)/g)) {
33
- functions.push({ name: m[2], pub: !!m[1], line: lineAt(m.index) });
34
- }
35
-
36
- const classes = [];
37
- for (const m of clean.matchAll(/\b(pub\s+)?(?:struct|enum|trait)\s+([a-zA-Z0-9_]+)/g)) {
38
- classes.push({ name: m[2], pub: !!m[1], line: lineAt(m.index) });
39
- }
40
-
41
- const exports = [];
42
- for (const f of functions) if (f.pub) exports.push({ name: f.name, kind: 'function' });
43
- for (const c of classes) if (c.pub) exports.push({ name: c.name, kind: 'class' });
44
-
45
- const hasMain = /\bfn\s+main\s*\(/.test(clean);
46
-
47
- return {
48
- imports: uniqueBy(imports, i => i.spec + ':' + i.line),
49
- exports,
50
- functions,
51
- classes,
52
- hasMain
53
- };
19
+ const clean = blankComments(source);
20
+ const lineAt = lineCounter(clean);
21
+ const imports = [];
22
+ // `use foo::bar;` and `mod foo;` are both dependencies on a file, and both are
23
+ // worth an edge. `pub use` is a re-export — still a real dependency.
24
+ for (const m of clean.matchAll(/\b(?:pub\s+)?(?:use|mod)\s+([a-zA-Z0-9_:]+)/g)) {
25
+ imports.push({ spec: m[1], line: lineAt(m.index) });
26
+ }
27
+ const functions = [];
28
+ for (const m of clean.matchAll(/\b(pub\s+)?fn\s+([a-zA-Z0-9_]+)/g)) {
29
+ functions.push({ name: m[2], pub: !!m[1], line: lineAt(m.index) });
30
+ }
31
+ const classes = [];
32
+ for (const m of clean.matchAll(/\b(pub\s+)?(?:struct|enum|trait)\s+([a-zA-Z0-9_]+)/g)) {
33
+ classes.push({ name: m[2], pub: !!m[1], line: lineAt(m.index) });
34
+ }
35
+ const exports = [];
36
+ for (const f of functions)
37
+ if (f.pub)
38
+ exports.push({ name: f.name, kind: 'function' });
39
+ for (const c of classes)
40
+ if (c.pub)
41
+ exports.push({ name: c.name, kind: 'class' });
42
+ const hasMain = /\bfn\s+main\s*\(/.test(clean);
43
+ return {
44
+ imports: uniqueBy(imports, i => i.spec + ':' + i.line),
45
+ exports,
46
+ functions,
47
+ classes,
48
+ hasMain
49
+ };
54
50
  }
55
-
56
51
  const dirOfPath = (p) => {
57
- const at = String(p).lastIndexOf('/');
58
- return at < 0 ? '' : String(p).slice(0, at + 1);
52
+ const at = String(p).lastIndexOf('/');
53
+ return at < 0 ? '' : String(p).slice(0, at + 1);
59
54
  };
60
-
61
55
  // The crate root: the `src/` directory, wherever it sits. `src/lib.rs` → `src/`;
62
56
  // `crates/foo/src/main.rs` → `crates/foo/src/`. A crate with no `src/` (a flat
63
57
  // `lib.rs` in the repo root) is rooted at that file's own directory, which is the
64
58
  // same rule with one fewer component to find.
65
59
  export function crateRootFor(fromPath) {
66
- const normalized = String(fromPath).replace(/\\/g, '/');
67
- const segments = normalized.split('/');
68
- const at = segments.lastIndexOf('src');
69
- if (at < 0) return dirOfPath(normalized);
70
- return segments.slice(0, at + 1).join('/') + '/';
60
+ const normalized = String(fromPath).replace(/\\/g, '/');
61
+ const segments = normalized.split('/');
62
+ const at = segments.lastIndexOf('src');
63
+ if (at < 0)
64
+ return dirOfPath(normalized);
65
+ return segments.slice(0, at + 1).join('/') + '/';
71
66
  }
72
-
73
67
  // The directory that holds the *children* of the module this file defines.
74
68
  //
75
69
  // This is not simply the dirname, and getting it wrong breaks every `self::`.
@@ -81,64 +75,68 @@ export function crateRootFor(fromPath) {
81
75
  // after the crate, not after their module, so stripping `.rs` from `src/lib.rs`
82
76
  // would invent a module called `lib`.
83
77
  export function moduleDirFor(fromPath) {
84
- const normalized = String(fromPath).replace(/\\/g, '/');
85
- const dir = dirOfPath(normalized);
86
- const name = normalized.slice(dir.length);
87
- if (name === 'mod.rs' || name === 'lib.rs' || name === 'main.rs') return dir;
88
- return normalized.replace(/\.rs$/, '') + '/';
78
+ const normalized = String(fromPath).replace(/\\/g, '/');
79
+ const dir = dirOfPath(normalized);
80
+ const name = normalized.slice(dir.length);
81
+ if (name === 'mod.rs' || name === 'lib.rs' || name === 'main.rs')
82
+ return dir;
83
+ return normalized.replace(/\.rs$/, '') + '/';
89
84
  }
90
-
91
85
  // A module named by a path is either `path.rs` or `path/mod.rs`. Both are
92
86
  // idiomatic Rust, so both are tried and the first that exists wins.
93
87
  function moduleCandidates(path) {
94
- return [path + '.rs', path + '/mod.rs'];
88
+ return [path + '.rs', path + '/mod.rs'];
95
89
  }
96
-
97
90
  export function resolveImport(spec, fromPath, has, context = {}, meta = {}) {
98
- const from = String(fromPath).replace(/\\/g, '/');
99
- const raw = String(spec);
100
- // `::foo::Bar` is a 2018 absolute path — another crate, not this one.
101
- if (raw.startsWith('::')) return { unresolved: spec };
102
- const segments = raw.split('::').filter(Boolean);
103
- if (!segments.length) return { unresolved: spec };
104
-
105
- // Where the path starts. `crate::` is the crate root; `self::` and a bare
106
- // `mod foo;` are the current file's own module; `super::` is one level up.
107
- const head = segments[0];
108
- let base;
109
- let rest;
110
- if (head === 'crate') {
111
- base = crateRootFor(from);
112
- rest = segments.slice(1);
113
- } else if (head === 'super') {
114
- // `dirOfPath` already ends in a separator, so do not add another — `src/a//`
115
- // never matches a real path, and the miss would be silent.
116
- base = dirOfPath(moduleDirFor(from).replace(/\/$/, ''));
117
- rest = segments.slice(1);
118
- } else if (head === 'self') {
119
- base = moduleDirFor(from);
120
- rest = segments.slice(1);
121
- } else {
122
- // A bare `mod foo;` declares a module beside the current one. A bare
123
- // `use foo::Bar;` means an *external crate* in Rust 2018, so it will not be
124
- // found here and stays unresolved — which is the right answer for
125
- // `serde::Serialize` and every other dependency.
126
- base = moduleDirFor(from);
127
- rest = segments;
128
- }
129
- if (!rest.length) return { unresolved: spec };
130
-
131
- // `crate::a::b::T` means T is declared *in* the module `a::b`, so the answer is
132
- // the module file for the longest prefix that exists. Trying the deepest path
133
- // first costs one lookup and covers the flat `mod a;` → `a.rs` case.
134
- for (let end = rest.length; end > 0; end -= 1) {
135
- const candidate = base + rest.slice(0, end).join('/');
136
- for (const file of moduleCandidates(candidate)) {
137
- if (has(file)) return { path: file };
91
+ const from = String(fromPath).replace(/\\/g, '/');
92
+ const raw = String(spec);
93
+ // `::foo::Bar` is a 2018 absolute path — another crate, not this one.
94
+ if (raw.startsWith('::'))
95
+ return { unresolved: spec };
96
+ const segments = raw.split('::').filter(Boolean);
97
+ if (!segments.length)
98
+ return { unresolved: spec };
99
+ // Where the path starts. `crate::` is the crate root; `self::` and a bare
100
+ // `mod foo;` are the current file's own module; `super::` is one level up.
101
+ const head = segments[0];
102
+ let base;
103
+ let rest;
104
+ if (head === 'crate') {
105
+ base = crateRootFor(from);
106
+ rest = segments.slice(1);
107
+ }
108
+ else if (head === 'super') {
109
+ // `dirOfPath` already ends in a separator, so do not add another — `src/a//`
110
+ // never matches a real path, and the miss would be silent.
111
+ base = dirOfPath(moduleDirFor(from).replace(/\/$/, ''));
112
+ rest = segments.slice(1);
113
+ }
114
+ else if (head === 'self') {
115
+ base = moduleDirFor(from);
116
+ rest = segments.slice(1);
117
+ }
118
+ else {
119
+ // A bare `mod foo;` declares a module beside the current one. A bare
120
+ // `use foo::Bar;` means an *external crate* in Rust 2018, so it will not be
121
+ // found here and stays unresolved — which is the right answer for
122
+ // `serde::Serialize` and every other dependency.
123
+ base = moduleDirFor(from);
124
+ rest = segments;
125
+ }
126
+ if (!rest.length)
127
+ return { unresolved: spec };
128
+ // `crate::a::b::T` means T is declared *in* the module `a::b`, so the answer is
129
+ // the module file for the longest prefix that exists. Trying the deepest path
130
+ // first costs one lookup and covers the flat `mod a;` → `a.rs` case.
131
+ for (let end = rest.length; end > 0; end -= 1) {
132
+ const candidate = base + rest.slice(0, end).join('/');
133
+ for (const file of moduleCandidates(candidate)) {
134
+ if (has(file))
135
+ return { path: file };
136
+ }
138
137
  }
139
- }
140
-
141
- // `std`, `serde`, anything from Cargo.toml: outside this crate. Unresolved is
142
- // the honest answer, and scan.js reports these by name.
143
- return { unresolved: spec };
138
+ // `std`, `serde`, anything from Cargo.toml: outside this crate. Unresolved is
139
+ // the honest answer, and scan.js reports these by name.
140
+ return { unresolved: spec };
144
141
  }
142
+ //# sourceMappingURL=rust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.js","sourceRoot":"","sources":["../../../src/shared/analyzer/languages/rust.ts"],"names":[],"mappings":"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","sourcesContent":["// Rust analyzer\n//\n// Rust has no `import` in the Java sense: a crate is a module tree, and `use`\n// names a path *into* that tree. The mapping is still real, though, and it is\n// what gives a Rust repo a graph:\n//\n// crate root src/lib.rs, src/main.rs, or crates/<name>/src/lib.rs\n// module `a` src/a.rs or src/a/mod.rs\n// `crate::a::T` T is declared in src/a.rs (or src/a/mod.rs)\n//\n// So a `use` resolves to the *module file* that owns the item, and the leading\n// `crate` is just the crate root. `self::` and `super::` are relative to the\n// current file's module directory. Anything outside the crate — `std`, a\n// dependency from Cargo.toml — stays unresolved, because inventing a file would\n// be a node in the graph that does not exist.\nimport { blankComments, lineCounter, uniqueBy } from '../util.js';\n\nexport const extensions = ['.rs'];\n\nexport function analyze(source, path) {\n const clean = blankComments(source);\n const lineAt = lineCounter(clean);\n\n const imports = [];\n // `use foo::bar;` and `mod foo;` are both dependencies on a file, and both are\n // worth an edge. `pub use` is a re-export — still a real dependency.\n for (const m of clean.matchAll(/\\b(?:pub\\s+)?(?:use|mod)\\s+([a-zA-Z0-9_:]+)/g)) {\n imports.push({ spec: m[1], line: lineAt(m.index) });\n }\n\n const functions = [];\n for (const m of clean.matchAll(/\\b(pub\\s+)?fn\\s+([a-zA-Z0-9_]+)/g)) {\n functions.push({ name: m[2], pub: !!m[1], line: lineAt(m.index) });\n }\n\n const classes = [];\n for (const m of clean.matchAll(/\\b(pub\\s+)?(?:struct|enum|trait)\\s+([a-zA-Z0-9_]+)/g)) {\n classes.push({ name: m[2], pub: !!m[1], line: lineAt(m.index) });\n }\n\n const exports = [];\n for (const f of functions) if (f.pub) exports.push({ name: f.name, kind: 'function' });\n for (const c of classes) if (c.pub) exports.push({ name: c.name, kind: 'class' });\n\n const hasMain = /\\bfn\\s+main\\s*\\(/.test(clean);\n\n return {\n imports: uniqueBy(imports, i => i.spec + ':' + i.line),\n exports,\n functions,\n classes,\n hasMain\n };\n}\n\nconst dirOfPath = (p) => {\n const at = String(p).lastIndexOf('/');\n return at < 0 ? '' : String(p).slice(0, at + 1);\n};\n\n// The crate root: the `src/` directory, wherever it sits. `src/lib.rs` → `src/`;\n// `crates/foo/src/main.rs` → `crates/foo/src/`. A crate with no `src/` (a flat\n// `lib.rs` in the repo root) is rooted at that file's own directory, which is the\n// same rule with one fewer component to find.\nexport function crateRootFor(fromPath) {\n const normalized = String(fromPath).replace(/\\\\/g, '/');\n const segments = normalized.split('/');\n const at = segments.lastIndexOf('src');\n if (at < 0) return dirOfPath(normalized);\n return segments.slice(0, at + 1).join('/') + '/';\n}\n\n// The directory that holds the *children* of the module this file defines.\n//\n// This is not simply the dirname, and getting it wrong breaks every `self::`.\n// src/lib.rs → `src/` the crate root's children sit in src/\n// src/a/b.rs → `src/a/b/` the module is `a::b`, so `self::x` is a/b/x.rs\n// src/a/b/mod.rs → `src/a/b/` the same module, declared the directory way\n//\n// The lib/main special case is the one that is easy to miss: they are named\n// after the crate, not after their module, so stripping `.rs` from `src/lib.rs`\n// would invent a module called `lib`.\nexport function moduleDirFor(fromPath) {\n const normalized = String(fromPath).replace(/\\\\/g, '/');\n const dir = dirOfPath(normalized);\n const name = normalized.slice(dir.length);\n if (name === 'mod.rs' || name === 'lib.rs' || name === 'main.rs') return dir;\n return normalized.replace(/\\.rs$/, '') + '/';\n}\n\n// A module named by a path is either `path.rs` or `path/mod.rs`. Both are\n// idiomatic Rust, so both are tried and the first that exists wins.\nfunction moduleCandidates(path) {\n return [path + '.rs', path + '/mod.rs'];\n}\n\nexport function resolveImport(spec, fromPath, has, context: Record<string, any> = {}, meta: Record<string, any> = {}) {\n const from = String(fromPath).replace(/\\\\/g, '/');\n const raw = String(spec);\n // `::foo::Bar` is a 2018 absolute path — another crate, not this one.\n if (raw.startsWith('::')) return { unresolved: spec };\n const segments = raw.split('::').filter(Boolean);\n if (!segments.length) return { unresolved: spec };\n\n // Where the path starts. `crate::` is the crate root; `self::` and a bare\n // `mod foo;` are the current file's own module; `super::` is one level up.\n const head = segments[0];\n let base;\n let rest;\n if (head === 'crate') {\n base = crateRootFor(from);\n rest = segments.slice(1);\n } else if (head === 'super') {\n // `dirOfPath` already ends in a separator, so do not add another — `src/a//`\n // never matches a real path, and the miss would be silent.\n base = dirOfPath(moduleDirFor(from).replace(/\\/$/, ''));\n rest = segments.slice(1);\n } else if (head === 'self') {\n base = moduleDirFor(from);\n rest = segments.slice(1);\n } else {\n // A bare `mod foo;` declares a module beside the current one. A bare\n // `use foo::Bar;` means an *external crate* in Rust 2018, so it will not be\n // found here and stays unresolved — which is the right answer for\n // `serde::Serialize` and every other dependency.\n base = moduleDirFor(from);\n rest = segments;\n }\n if (!rest.length) return { unresolved: spec };\n\n // `crate::a::b::T` means T is declared *in* the module `a::b`, so the answer is\n // the module file for the longest prefix that exists. Trying the deepest path\n // first costs one lookup and covers the flat `mod a;` → `a.rs` case.\n for (let end = rest.length; end > 0; end -= 1) {\n const candidate = base + rest.slice(0, end).join('/');\n for (const file of moduleCandidates(candidate)) {\n if (has(file)) return { path: file };\n }\n }\n\n // `std`, `serde`, anything from Cargo.toml: outside this crate. Unresolved is\n // the honest answer, and scan.js reports these by name.\n return { unresolved: spec };\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { resolveImport, packageNameOf } from './javascript.js';
2
+ export declare const extensions: string[];
3
+ export declare function analyze(source: any, path: any): {
4
+ imports: any[];
5
+ exports: any[];
6
+ functions: any[];
7
+ classes: any[];
8
+ interfaces: any[];
9
+ hasMain: boolean;
10
+ };
11
+ export { resolveImport, packageNameOf };