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
@@ -2,239 +2,288 @@
2
2
  // Regex-based by design: no parser dependency, runs the same in Node and the
3
3
  // browser. It will miss dynamic tricks (require(variable), eval'd imports);
4
4
  // that is an accepted, documented trade.
5
-
6
- import { blankComments, lineCounter, braceBodyEnd, uniqueBy, callsWithin, declarationOrder } from '../util.js';
5
+ import { blankComments, jsCodeMask, lineCounter, braceBodyEnd, uniqueBy, callsWithin, declarationOrder } from '../util.js';
7
6
  import { dirOf, joinPath, baseName } from '../pathUtil.js';
8
-
9
7
  export const extensions = ['.js', '.jsx', '.mjs', '.cjs'];
10
-
11
8
  const IMPORT_RES = [
12
- /\bimport\s+(?:type\s+)?[\w$*{}\s,]+?\sfrom\s*['"]([^'"\n]+)['"]/g,
13
- /(?<!['"\w$])import\s*['"]([^'"\n]+)['"]/g,
14
- /\bexport\s+(?:type\s+)?[\w$*{}\s,]+?\sfrom\s*['"]([^'"\n]+)['"]/g,
15
- /\brequire\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g,
16
- /(?<!['"\w$])import\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g,
9
+ /\bimport\s+(?:type\s+)?[\w$*{}\s,]+?\sfrom\s*['"]([^'"\n]+)['"]/g,
10
+ /(?<!['"\w$])import\s*['"]([^'"\n]+)['"]/g,
11
+ /\bexport\s+(?:type\s+)?[\w$*{}\s,]+?\sfrom\s*['"]([^'"\n]+)['"]/g,
12
+ /\brequire\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g,
13
+ /(?<!['"\w$])import\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g,
17
14
  ];
18
-
19
15
  const EXPORT_RES = [
20
- { re: /\bexport\s+(?:async\s+)?function\s*\*?\s*([\w$]+)/g, kind: 'function' },
21
- { re: /\bexport\s+(?:abstract\s+)?class\s+([\w$]+)/g, kind: 'class' },
22
- { re: /\bexport\s+(?:const|let|var)\s+([\w$]+)/g, kind: 'const' },
23
- { re: /\bexport\s+(?:interface|type|enum)\s+([\w$]+)/g, kind: 'type' },
24
- { re: /\bexport\s+default\b/g, kind: 'default', name: 'default' },
25
- { re: /\bexports\.([\w$]+)\s*=/g, kind: 'const' },
26
- { re: /\bmodule\.exports\s*=/g, kind: 'default', name: 'default' },
16
+ { re: /\bexport\s+(?:async\s+)?function\s*\*?\s*([\w$]+)/g, kind: 'function' },
17
+ { re: /\bexport\s+(?:abstract\s+)?class\s+([\w$]+)/g, kind: 'class' },
18
+ { re: /\bexport\s+(?:const|let|var)\s+([\w$]+)/g, kind: 'const' },
19
+ { re: /\bexport\s+(?:interface|type|enum)\s+([\w$]+)/g, kind: 'type' },
20
+ { re: /\bexport\s+default\b/g, kind: 'default', name: 'default' },
21
+ { re: /\bexports\.([\w$]+)\s*=/g, kind: 'const' },
22
+ { re: /\bmodule\.exports\s*=/g, kind: 'default', name: 'default' },
27
23
  ];
28
-
29
24
  const NAMED_EXPORT_RE = /\bexport\s*\{([^}]*)\}/g;
30
-
31
25
  const CONTROL_WORDS = new Set([
32
- 'if', 'for', 'while', 'switch', 'catch', 'return', 'else', 'do', 'new',
33
- 'typeof', 'case', 'throw', 'delete', 'void', 'in', 'of', 'yield', 'await',
34
- 'function', 'constructor', 'class',
26
+ 'if', 'for', 'while', 'switch', 'catch', 'return', 'else', 'do', 'new',
27
+ 'typeof', 'case', 'throw', 'delete', 'void', 'in', 'of', 'yield', 'await',
28
+ 'function', 'constructor', 'class',
35
29
  ]);
36
-
37
30
  const FUNCTION_RES = [
38
- { re: /\bfunction\s*\*?\s*([\w$]+)\s*\(/g, kind: 'function' },
39
- { re: /\b(?:const|let|var)\s+([\w$]+)\s*=\s*(?:async\s+)?function/g, kind: 'function' },
40
- { re: /\b(?:const|let|var)\s+([\w$]+)\s*=\s*(?:async\s*)?(?:\([^)]*\)|[\w$]+)\s*=>/g, kind: 'arrow' },
41
- {
42
- re: /^[ \t]*(?:export\s+)?(?:(?:public|private|protected|static|async|override|readonly|abstract|get|set)\s+)*([\w$]+)\s*\([^;{]*\)\s*(?::[\w$<>[\]|&., ]+)?\s*\{/gm,
43
- kind: 'method',
44
- },
31
+ { re: /\bfunction\s*\*?\s*([\w$]+)\s*\(/g, kind: 'function' },
32
+ { re: /\b(?:const|let|var)\s+([\w$]+)\s*=\s*(?:async\s+)?function/g, kind: 'function' },
33
+ { re: /\b(?:const|let|var)\s+([\w$]+)\s*=\s*(?:async\s*)?(?:\([^)]*\)|[\w$]+)\s*=>/g, kind: 'arrow' },
34
+ {
35
+ re: /^[ \t]*(?:export\s+)?(?:(?:public|private|protected|static|async|override|readonly|abstract|get|set)\s+)*([\w$]+)\s*\([^;{]*\)\s*(?::[\w$<>[\]|&., ]+)?\s*\{/gm,
36
+ kind: 'method',
37
+ },
45
38
  ];
46
-
47
39
  const CLASS_RE = /\bclass\s+([\w$]+)/g;
48
-
49
40
  function extractClauseSymbols(clause) {
50
- const symbols = [];
51
- const c = clause.trim();
52
- if (!c) return symbols;
53
- if (c.startsWith('*')) return ['*'];
54
-
55
- const braceStart = c.indexOf('{');
56
- if (braceStart === -1) {
57
- const defMatch = c.match(/^[\w$]+/);
58
- if (defMatch && defMatch[0] !== 'type') return ['default'];
41
+ const symbols = [];
42
+ const c = clause.trim();
43
+ if (!c)
44
+ return symbols;
45
+ if (c.startsWith('*'))
46
+ return ['*'];
47
+ const braceStart = c.indexOf('{');
48
+ if (braceStart === -1) {
49
+ const defMatch = c.match(/^[\w$]+/);
50
+ if (defMatch && defMatch[0] !== 'type')
51
+ return ['default'];
52
+ return symbols;
53
+ }
54
+ const beforeBrace = c.slice(0, braceStart).trim().replace(/,$/, '').trim();
55
+ if (beforeBrace && beforeBrace !== 'type') {
56
+ symbols.push('default');
57
+ }
58
+ const braceEnd = c.lastIndexOf('}');
59
+ if (braceEnd > braceStart) {
60
+ const inside = c.slice(braceStart + 1, braceEnd);
61
+ for (const part of inside.split(',')) {
62
+ let t = part.trim();
63
+ if (!t)
64
+ continue;
65
+ if (t.startsWith('type '))
66
+ t = t.slice(5).trim();
67
+ const asMatch = t.match(/^([\w$]+)\s+as\s+[\w$]+/);
68
+ const name = asMatch ? asMatch[1] : (t.match(/^[\w$]+/) || [])[0];
69
+ if (name)
70
+ symbols.push(name);
71
+ }
72
+ }
59
73
  return symbols;
60
- }
61
-
62
- const beforeBrace = c.slice(0, braceStart).trim().replace(/,$/, '').trim();
63
- if (beforeBrace && beforeBrace !== 'type') {
64
- symbols.push('default');
65
- }
66
-
67
- const braceEnd = c.lastIndexOf('}');
68
- if (braceEnd > braceStart) {
69
- const inside = c.slice(braceStart + 1, braceEnd);
70
- for (const part of inside.split(',')) {
71
- let t = part.trim();
72
- if (!t) continue;
73
- if (t.startsWith('type ')) t = t.slice(5).trim();
74
- const asMatch = t.match(/^([\w$]+)\s+as\s+[\w$]+/);
75
- const name = asMatch ? asMatch[1] : (t.match(/^[\w$]+/) || [])[0];
76
- if (name) symbols.push(name);
77
- }
78
- }
79
- return symbols;
80
74
  }
81
-
82
75
  export function analyze(source, path) {
83
- const clean = blankComments(source);
84
- const lineAt = lineCounter(clean);
85
-
86
- const imports = [];
87
- for (const m of clean.matchAll(/\bimport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
88
- imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
89
- }
90
- for (const m of clean.matchAll(/\bexport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
91
- imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
92
- }
93
- for (const m of clean.matchAll(/(?<!['"\w$])import\s*['"]([^'"\n]+)['"]/g)) {
94
- imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
95
- }
96
- for (const m of clean.matchAll(/\brequire\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
97
- imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
98
- }
99
- for (const m of clean.matchAll(/(?<!['"\w$])import\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
100
- imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
101
- }
102
-
103
- const exports = [];
104
- for (const { re, kind, name } of EXPORT_RES) {
105
- for (const m of clean.matchAll(re)) {
106
- exports.push({ name: name ?? m[1], kind });
107
- }
108
- }
109
- for (const m of clean.matchAll(NAMED_EXPORT_RE)) {
110
- for (const part of m[1].split(',')) {
111
- const t = part.trim();
112
- if (!t || (/^type\b/.test(t) && !/[\w$]/.test(t.replace(/^type\s+/, '')))) continue;
113
- const asMatch = t.match(/(?:^|\s)as\s+([\w$]+)$/);
114
- const name = asMatch ? asMatch[1] : (t.match(/^([\w$]+)/) || [])[1];
115
- if (name) exports.push({ name, kind: 'named' });
116
- }
117
- }
118
-
119
- const functions = [];
120
- for (const { re, kind } of FUNCTION_RES) {
121
- for (const m of clean.matchAll(re)) {
122
- const name = m[1];
123
- if (CONTROL_WORDS.has(name)) continue;
124
- functions.push({ name, kind, line: lineAt(m.index), index: m.index, len: m[0].length });
125
- }
126
- }
127
-
128
- const classes = [];
129
- for (const m of clean.matchAll(CLASS_RE)) {
130
- classes.push({ name: m[1], line: lineAt(m.index) });
131
- }
132
-
133
- // Best-effort intra-file call graph: find each function's body, then look
134
- // for calls to other functions declared in the same file.
135
- const seen = new Set();
136
- const fns = [];
137
- for (const f of functions) {
138
- const key = f.name + ':' + f.line;
139
- if (seen.has(key)) continue;
140
- seen.add(key);
141
- fns.push(f);
142
- }
143
-
144
- const calls = [];
145
- const names = new Set(fns.map((f) => f.name));
146
- const declaredAt = declarationOrder(fns);
147
- for (const fn of fns) {
148
- const body = functionBody(clean, fn);
149
- if (!body) continue;
150
- const called = callsWithin(body, names)
151
- .filter((name) => name !== fn.name)
152
- .sort((a, b) => declaredAt.get(a) - declaredAt.get(b));
153
- for (const name of called) calls.push({ from: fn.name, to: name });
154
- }
155
-
156
- return {
157
- imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),
158
- exports: uniqueBy(exports, (e) => e.name),
159
- functions: fns.map(({ index, len, ...rest }) => rest),
160
- classes,
161
- calls: uniqueBy(calls, (c) => c.from + '->' + c.to),
162
- hasMain: false,
163
- };
76
+ const clean = blankComments(source);
77
+ const code = jsCodeMask(source);
78
+ const lineAt = lineCounter(clean);
79
+ const imports = [];
80
+ for (const m of source.matchAll(/\bimport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
81
+ if (code[m.index] === ' ')
82
+ continue;
83
+ imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
84
+ }
85
+ for (const m of source.matchAll(/\bexport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
86
+ if (code[m.index] === ' ')
87
+ continue;
88
+ imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
89
+ }
90
+ for (const m of source.matchAll(/(?<!['"\w$])import\s*['"]([^'"\n]+)['"]/g)) {
91
+ if (code[m.index] === ' ')
92
+ continue;
93
+ imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
94
+ }
95
+ for (const m of source.matchAll(/\brequire\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
96
+ if (code[m.index] === ' ')
97
+ continue;
98
+ imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
99
+ }
100
+ for (const m of source.matchAll(/(?<!['"\w$])import\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
101
+ if (code[m.index] === ' ')
102
+ continue;
103
+ imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
104
+ }
105
+ const exports = [];
106
+ for (const { re, kind, name } of EXPORT_RES) {
107
+ for (const m of clean.matchAll(re)) {
108
+ exports.push({ name: name ?? m[1], kind });
109
+ }
110
+ }
111
+ for (const m of clean.matchAll(NAMED_EXPORT_RE)) {
112
+ for (const part of m[1].split(',')) {
113
+ const t = part.trim();
114
+ if (!t || (/^type\b/.test(t) && !/[\w$]/.test(t.replace(/^type\s+/, ''))))
115
+ continue;
116
+ const asMatch = t.match(/(?:^|\s)as\s+([\w$]+)$/);
117
+ const name = asMatch ? asMatch[1] : (t.match(/^([\w$]+)/) || [])[1];
118
+ if (name)
119
+ exports.push({ name, kind: 'named' });
120
+ }
121
+ }
122
+ const functions = [];
123
+ for (const { re, kind } of FUNCTION_RES) {
124
+ for (const m of clean.matchAll(re)) {
125
+ const name = m[1];
126
+ if (CONTROL_WORDS.has(name))
127
+ continue;
128
+ functions.push({ name, kind, line: lineAt(m.index), index: m.index, len: m[0].length });
129
+ }
130
+ }
131
+ const classes = [];
132
+ for (const m of clean.matchAll(CLASS_RE)) {
133
+ classes.push({ name: m[1], line: lineAt(m.index) });
134
+ }
135
+ // Best-effort intra-file call graph: find each function's body, then look
136
+ // for calls to other functions declared in the same file.
137
+ const seen = new Set();
138
+ const fns = [];
139
+ for (const f of functions) {
140
+ const key = f.name + ':' + f.line;
141
+ if (seen.has(key))
142
+ continue;
143
+ seen.add(key);
144
+ fns.push(f);
145
+ }
146
+ const calls = [];
147
+ const names = new Set(fns.map((f) => f.name));
148
+ const declaredAt = declarationOrder(fns);
149
+ for (const fn of fns) {
150
+ const body = functionBody(clean, fn);
151
+ if (!body)
152
+ continue;
153
+ const called = callsWithin(body, names)
154
+ .filter((name) => name !== fn.name)
155
+ .sort((a, b) => declaredAt.get(a) - declaredAt.get(b));
156
+ for (const name of called)
157
+ calls.push({ from: fn.name, to: name });
158
+ }
159
+ return {
160
+ imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),
161
+ exports: uniqueBy(exports, (e) => e.name),
162
+ functions: fns.map(({ index, len, ...rest }) => rest),
163
+ classes,
164
+ calls: uniqueBy(calls, (c) => c.from + '->' + c.to),
165
+ hasMain: false,
166
+ };
164
167
  }
165
-
166
168
  function functionBody(clean, fn) {
167
- const open = clean.indexOf('{', fn.index + fn.len - 1);
168
- if (open === -1 || open > fn.index + fn.len + 400) return null;
169
- return clean.slice(open, braceBodyEnd(clean, open));
169
+ const open = clean.indexOf('{', fn.index + fn.len - 1);
170
+ if (open === -1 || open > fn.index + fn.len + 400)
171
+ return null;
172
+ return clean.slice(open, braceBodyEnd(clean, open));
170
173
  }
171
-
172
174
  export function packageNameOf(spec) {
173
- if (spec.startsWith('node:')) return spec.slice(5);
174
- const parts = spec.split('/');
175
- return spec.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0];
175
+ if (spec.startsWith('node:'))
176
+ return spec.slice(5);
177
+ const parts = spec.split('/');
178
+ return spec.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0];
176
179
  }
177
-
178
180
  export function resolveImport(spec, fromPath, has, context = {}) {
179
- const tryResolve = (base) => {
180
- if (has(base)) return { path: base };
181
- const allExts = [...extensions, '.ts', '.tsx'];
182
- for (const ext of allExts) {
183
- if (has(base + ext)) return { path: base + ext };
184
- }
185
- for (const ext of allExts) {
186
- const idx = base + '/index' + ext;
187
- if (has(idx)) return { path: idx };
188
- }
189
- const asTs = base.replace(/\.jsx?$/, '');
190
- if (asTs !== base) {
191
- for (const ext of ['.ts', '.tsx']) {
192
- if (has(asTs + ext)) return { path: asTs + ext };
193
- }
194
- }
195
- return null;
196
- };
197
-
198
- if (spec.startsWith('.') || spec.startsWith('/')) {
199
- const base = spec.startsWith('/')
200
- ? joinPath('', spec)
201
- : joinPath(dirOf(fromPath), spec);
202
- const hit = tryResolve(base);
203
- if (hit) return hit;
204
- return { unresolved: spec };
205
- }
206
-
207
- // tsconfig.json / jsconfig.json paths aliases
208
- if (context.tsPaths) {
209
- const { baseUrl = '', paths = {} } = context.tsPaths;
210
- for (const [pattern, targets] of Object.entries(paths)) {
211
- const starIdx = pattern.indexOf('*');
212
- if (starIdx !== -1) {
213
- const prefix = pattern.slice(0, starIdx);
214
- const suffix = pattern.slice(starIdx + 1);
215
- if (spec.startsWith(prefix) && spec.endsWith(suffix)) {
216
- const matchWildcard = spec.slice(prefix.length, spec.length - suffix.length);
217
- for (const target of targets) {
218
- const resolvedTarget = target.replace('*', matchWildcard);
219
- const candBase = joinPath(baseUrl, resolvedTarget);
220
- const hit = tryResolve(candBase);
221
- if (hit) return hit;
222
- }
181
+ const tryResolve = (base, mapOutput = true) => {
182
+ if (has(base))
183
+ return { path: base };
184
+ const allExts = [...extensions, '.ts', '.tsx'];
185
+ for (const ext of allExts) {
186
+ if (has(base + ext))
187
+ return { path: base + ext };
188
+ }
189
+ for (const ext of allExts) {
190
+ const idx = base + '/index' + ext;
191
+ if (has(idx))
192
+ return { path: idx };
223
193
  }
224
- } else if (spec === pattern) {
225
- for (const target of targets) {
226
- const candBase = joinPath(baseUrl, target);
227
- const hit = tryResolve(candBase);
228
- if (hit) return hit;
194
+ const asTs = base.replace(/\.jsx?$/, '');
195
+ if (asTs !== base) {
196
+ for (const ext of ['.ts', '.tsx']) {
197
+ if (has(asTs + ext))
198
+ return { path: asTs + ext };
199
+ }
200
+ }
201
+ // Runtime imports may point to emitted .js that the scan intentionally
202
+ // ignores. Map them back through rootDir/outDir to canonical TS source.
203
+ const { sourceRoot, outputRoot } = context.tsPaths || {};
204
+ if (mapOutput && sourceRoot && outputRoot !== undefined && (outputRoot || (base !== sourceRoot && !base.startsWith(sourceRoot + '/')))) {
205
+ if (!outputRoot || base.startsWith(outputRoot + '/')) {
206
+ const relative = outputRoot ? base.slice(outputRoot.length + 1) : base;
207
+ const candidate = joinPath(sourceRoot, relative);
208
+ if (candidate !== base)
209
+ return tryResolve(candidate, false);
210
+ }
211
+ }
212
+ return null;
213
+ };
214
+ // tsconfig.json / jsconfig.json paths aliases
215
+ if (context.tsPaths && !spec.startsWith('.')) {
216
+ const { baseUrl = '', paths = {} } = context.tsPaths;
217
+ // A matching alias is a local mapping even when its target is absent from
218
+ // the scan. Calling that an npm package made import confidence look better
219
+ // while hiding the missing edge. Exact keys take precedence over wildcard
220
+ // keys, regardless of the order they appear in the config file.
221
+ const aliases = Object.entries(paths).sort(([a], [b]) => {
222
+ const aStar = a.indexOf('*');
223
+ const bStar = b.indexOf('*');
224
+ if (aStar === -1 || bStar === -1)
225
+ return Number(aStar !== -1) - Number(bStar !== -1);
226
+ return bStar - aStar || (b.length - bStar) - (a.length - aStar);
227
+ });
228
+ for (const [pattern, targets] of aliases) {
229
+ const starIdx = pattern.indexOf('*');
230
+ if (starIdx !== -1) {
231
+ const prefix = pattern.slice(0, starIdx);
232
+ const suffix = pattern.slice(starIdx + 1);
233
+ if (spec.startsWith(prefix) && spec.endsWith(suffix)) {
234
+ const matchWildcard = spec.slice(prefix.length, spec.length - suffix.length);
235
+ for (const target of Array.isArray(targets) ? targets : []) {
236
+ if (typeof target !== 'string')
237
+ continue;
238
+ const resolvedTarget = target.replace('*', matchWildcard);
239
+ const candBase = joinPath(baseUrl, resolvedTarget);
240
+ const hit = tryResolve(candBase);
241
+ if (hit)
242
+ return hit;
243
+ }
244
+ return { unresolved: spec };
245
+ }
246
+ }
247
+ else if (spec === pattern) {
248
+ for (const target of Array.isArray(targets) ? targets : []) {
249
+ if (typeof target !== 'string')
250
+ continue;
251
+ const candBase = joinPath(baseUrl, target);
252
+ const hit = tryResolve(candBase);
253
+ if (hit)
254
+ return hit;
255
+ }
256
+ return { unresolved: spec };
257
+ }
258
+ }
259
+ if (baseUrl) {
260
+ const candBase = joinPath(baseUrl, spec);
261
+ const hit = tryResolve(candBase);
262
+ if (hit)
263
+ return hit;
229
264
  }
230
- }
231
265
  }
232
- if (baseUrl) {
233
- const candBase = joinPath(baseUrl, spec);
234
- const hit = tryResolve(candBase);
235
- if (hit) return hit;
266
+ if (spec.startsWith('.') || spec.startsWith('/')) {
267
+ if (spec.startsWith('/')) {
268
+ // A leading slash in a browser module is relative to the document root.
269
+ // Files inside public/ have a known document root; elsewhere, keep the
270
+ // previous repo-root lookup instead of guessing a framework convention.
271
+ const bases = fromPath.startsWith('public/')
272
+ ? [joinPath('public', spec), joinPath('', spec)]
273
+ : [joinPath('', spec)];
274
+ for (const base of bases) {
275
+ const hit = tryResolve(base);
276
+ if (hit)
277
+ return hit;
278
+ }
279
+ }
280
+ else {
281
+ const hit = tryResolve(joinPath(dirOf(fromPath), spec));
282
+ if (hit)
283
+ return hit;
284
+ }
285
+ return { unresolved: spec };
236
286
  }
237
- }
238
-
239
- return { external: packageNameOf(spec) };
287
+ return { external: packageNameOf(spec) };
240
288
  }
289
+ //# sourceMappingURL=javascript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/shared/analyzer/languages/javascript.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ResolverContext, ImportResolution } from '../../contracts.js';\n// JavaScript / TypeScript / JSX / TSX.\n// Regex-based by design: no parser dependency, runs the same in Node and the\n// browser. It will miss dynamic tricks (require(variable), eval'd imports);\n// that is an accepted, documented trade.\n\nimport { blankComments, jsCodeMask, lineCounter, braceBodyEnd, uniqueBy, callsWithin, declarationOrder } from '../util.js';\nimport { dirOf, joinPath, baseName } from '../pathUtil.js';\n\nexport const extensions = ['.js', '.jsx', '.mjs', '.cjs'];\n\nconst IMPORT_RES = [\n /\\bimport\\s+(?:type\\s+)?[\\w$*{}\\s,]+?\\sfrom\\s*['\"]([^'\"\\n]+)['\"]/g,\n /(?<!['\"\\w$])import\\s*['\"]([^'\"\\n]+)['\"]/g,\n /\\bexport\\s+(?:type\\s+)?[\\w$*{}\\s,]+?\\sfrom\\s*['\"]([^'\"\\n]+)['\"]/g,\n /\\brequire\\s*\\(\\s*['\"]([^'\"\\n]+)['\"]\\s*\\)/g,\n /(?<!['\"\\w$])import\\s*\\(\\s*['\"]([^'\"\\n]+)['\"]\\s*\\)/g,\n];\n\nconst EXPORT_RES = [\n { re: /\\bexport\\s+(?:async\\s+)?function\\s*\\*?\\s*([\\w$]+)/g, kind: 'function' },\n { re: /\\bexport\\s+(?:abstract\\s+)?class\\s+([\\w$]+)/g, kind: 'class' },\n { re: /\\bexport\\s+(?:const|let|var)\\s+([\\w$]+)/g, kind: 'const' },\n { re: /\\bexport\\s+(?:interface|type|enum)\\s+([\\w$]+)/g, kind: 'type' },\n { re: /\\bexport\\s+default\\b/g, kind: 'default', name: 'default' },\n { re: /\\bexports\\.([\\w$]+)\\s*=/g, kind: 'const' },\n { re: /\\bmodule\\.exports\\s*=/g, kind: 'default', name: 'default' },\n];\n\nconst NAMED_EXPORT_RE = /\\bexport\\s*\\{([^}]*)\\}/g;\n\nconst CONTROL_WORDS = new Set([\n 'if', 'for', 'while', 'switch', 'catch', 'return', 'else', 'do', 'new',\n 'typeof', 'case', 'throw', 'delete', 'void', 'in', 'of', 'yield', 'await',\n 'function', 'constructor', 'class',\n]);\n\nconst FUNCTION_RES = [\n { re: /\\bfunction\\s*\\*?\\s*([\\w$]+)\\s*\\(/g, kind: 'function' },\n { re: /\\b(?:const|let|var)\\s+([\\w$]+)\\s*=\\s*(?:async\\s+)?function/g, kind: 'function' },\n { re: /\\b(?:const|let|var)\\s+([\\w$]+)\\s*=\\s*(?:async\\s*)?(?:\\([^)]*\\)|[\\w$]+)\\s*=>/g, kind: 'arrow' },\n {\n re: /^[ \\t]*(?:export\\s+)?(?:(?:public|private|protected|static|async|override|readonly|abstract|get|set)\\s+)*([\\w$]+)\\s*\\([^;{]*\\)\\s*(?::[\\w$<>[\\]|&., ]+)?\\s*\\{/gm,\n kind: 'method',\n },\n];\n\nconst CLASS_RE = /\\bclass\\s+([\\w$]+)/g;\n\nfunction extractClauseSymbols(clause) {\n const symbols = [];\n const c = clause.trim();\n if (!c) return symbols;\n if (c.startsWith('*')) return ['*'];\n\n const braceStart = c.indexOf('{');\n if (braceStart === -1) {\n const defMatch = c.match(/^[\\w$]+/);\n if (defMatch && defMatch[0] !== 'type') return ['default'];\n return symbols;\n }\n\n const beforeBrace = c.slice(0, braceStart).trim().replace(/,$/, '').trim();\n if (beforeBrace && beforeBrace !== 'type') {\n symbols.push('default');\n }\n\n const braceEnd = c.lastIndexOf('}');\n if (braceEnd > braceStart) {\n const inside = c.slice(braceStart + 1, braceEnd);\n for (const part of inside.split(',')) {\n let t = part.trim();\n if (!t) continue;\n if (t.startsWith('type ')) t = t.slice(5).trim();\n const asMatch = t.match(/^([\\w$]+)\\s+as\\s+[\\w$]+/);\n const name = asMatch ? asMatch[1] : (t.match(/^[\\w$]+/) || [])[0];\n if (name) symbols.push(name);\n }\n }\n return symbols;\n}\n\nexport function analyze(source, path) {\n const clean = blankComments(source);\n const code = jsCodeMask(source);\n const lineAt = lineCounter(clean);\n\n const imports = [];\n for (const m of source.matchAll(/\\bimport\\s+(?:type\\s+)?([\\w$*{}\\s,]+?)\\s+from\\s*['\"]([^'\"\\n]+)['\"]/g)) {\n if (code[m.index] === ' ') continue;\n imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });\n }\n for (const m of source.matchAll(/\\bexport\\s+(?:type\\s+)?([\\w$*{}\\s,]+?)\\s+from\\s*['\"]([^'\"\\n]+)['\"]/g)) {\n if (code[m.index] === ' ') continue;\n imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });\n }\n for (const m of source.matchAll(/(?<!['\"\\w$])import\\s*['\"]([^'\"\\n]+)['\"]/g)) {\n if (code[m.index] === ' ') continue;\n imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });\n }\n for (const m of source.matchAll(/\\brequire\\s*\\(\\s*['\"]([^'\"\\n]+)['\"]\\s*\\)/g)) {\n if (code[m.index] === ' ') continue;\n imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });\n }\n for (const m of source.matchAll(/(?<!['\"\\w$])import\\s*\\(\\s*['\"]([^'\"\\n]+)['\"]\\s*\\)/g)) {\n if (code[m.index] === ' ') continue;\n imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });\n }\n\n const exports = [];\n for (const { re, kind, name } of EXPORT_RES) {\n for (const m of clean.matchAll(re)) {\n exports.push({ name: name ?? m[1], kind });\n }\n }\n for (const m of clean.matchAll(NAMED_EXPORT_RE)) {\n for (const part of m[1].split(',')) {\n const t = part.trim();\n if (!t || (/^type\\b/.test(t) && !/[\\w$]/.test(t.replace(/^type\\s+/, '')))) continue;\n const asMatch = t.match(/(?:^|\\s)as\\s+([\\w$]+)$/);\n const name = asMatch ? asMatch[1] : (t.match(/^([\\w$]+)/) || [])[1];\n if (name) exports.push({ name, kind: 'named' });\n }\n }\n\n const functions = [];\n for (const { re, kind } of FUNCTION_RES) {\n for (const m of clean.matchAll(re)) {\n const name = m[1];\n if (CONTROL_WORDS.has(name)) continue;\n functions.push({ name, kind, line: lineAt(m.index), index: m.index, len: m[0].length });\n }\n }\n\n const classes = [];\n for (const m of clean.matchAll(CLASS_RE)) {\n classes.push({ name: m[1], line: lineAt(m.index) });\n }\n\n // Best-effort intra-file call graph: find each function's body, then look\n // for calls to other functions declared in the same file.\n const seen = new Set();\n const fns = [];\n for (const f of functions) {\n const key = f.name + ':' + f.line;\n if (seen.has(key)) continue;\n seen.add(key);\n fns.push(f);\n }\n\n const calls = [];\n const names = new Set(fns.map((f) => f.name));\n const declaredAt = declarationOrder(fns);\n for (const fn of fns) {\n const body = functionBody(clean, fn);\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 return {\n imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),\n exports: uniqueBy(exports, (e) => e.name),\n functions: fns.map(({ index, len, ...rest }) => rest),\n classes,\n calls: uniqueBy(calls, (c) => c.from + '->' + c.to),\n hasMain: false,\n };\n}\n\nfunction functionBody(clean, fn) {\n const open = clean.indexOf('{', fn.index + fn.len - 1);\n if (open === -1 || open > fn.index + fn.len + 400) return null;\n return clean.slice(open, braceBodyEnd(clean, open));\n}\n\nexport function packageNameOf(spec) {\n if (spec.startsWith('node:')) return spec.slice(5);\n const parts = spec.split('/');\n return spec.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0];\n}\n\nexport function resolveImport(spec: string, fromPath: string, has: (path: string) => boolean, context: ResolverContext = {}): ImportResolution {\n const tryResolve = (base: string, mapOutput = true): ImportResolution | null => {\n if (has(base)) return { path: base };\n const allExts = [...extensions, '.ts', '.tsx'];\n for (const ext of allExts) {\n if (has(base + ext)) return { path: base + ext };\n }\n for (const ext of allExts) {\n const idx = base + '/index' + ext;\n if (has(idx)) return { path: idx };\n }\n const asTs = base.replace(/\\.jsx?$/, '');\n if (asTs !== base) {\n for (const ext of ['.ts', '.tsx']) {\n if (has(asTs + ext)) return { path: asTs + ext };\n }\n }\n // Runtime imports may point to emitted .js that the scan intentionally\n // ignores. Map them back through rootDir/outDir to canonical TS source.\n const { sourceRoot, outputRoot } = context.tsPaths || {};\n if (mapOutput && sourceRoot && outputRoot !== undefined && (outputRoot || (base !== sourceRoot && !base.startsWith(sourceRoot + '/')))) {\n if (!outputRoot || base.startsWith(outputRoot + '/')) {\n const relative = outputRoot ? base.slice(outputRoot.length + 1) : base;\n const candidate = joinPath(sourceRoot, relative);\n if (candidate !== base) return tryResolve(candidate, false);\n }\n }\n return null;\n };\n\n // tsconfig.json / jsconfig.json paths aliases\n if (context.tsPaths && !spec.startsWith('.')) {\n const { baseUrl = '', paths = {} } = context.tsPaths;\n // A matching alias is a local mapping even when its target is absent from\n // the scan. Calling that an npm package made import confidence look better\n // while hiding the missing edge. Exact keys take precedence over wildcard\n // keys, regardless of the order they appear in the config file.\n const aliases = Object.entries(paths).sort(([a], [b]) => {\n const aStar = a.indexOf('*');\n const bStar = b.indexOf('*');\n if (aStar === -1 || bStar === -1) return Number(aStar !== -1) - Number(bStar !== -1);\n return bStar - aStar || (b.length - bStar) - (a.length - aStar);\n });\n for (const [pattern, targets] of aliases) {\n const starIdx = pattern.indexOf('*');\n if (starIdx !== -1) {\n const prefix = pattern.slice(0, starIdx);\n const suffix = pattern.slice(starIdx + 1);\n if (spec.startsWith(prefix) && spec.endsWith(suffix)) {\n const matchWildcard = spec.slice(prefix.length, spec.length - suffix.length);\n for (const target of Array.isArray(targets) ? targets : []) {\n if (typeof target !== 'string') continue;\n const resolvedTarget = target.replace('*', matchWildcard);\n const candBase = joinPath(baseUrl, resolvedTarget);\n const hit = tryResolve(candBase);\n if (hit) return hit;\n }\n return { unresolved: spec };\n }\n } else if (spec === pattern) {\n for (const target of Array.isArray(targets) ? targets : []) {\n if (typeof target !== 'string') continue;\n const candBase = joinPath(baseUrl, target);\n const hit = tryResolve(candBase);\n if (hit) return hit;\n }\n return { unresolved: spec };\n }\n }\n if (baseUrl) {\n const candBase = joinPath(baseUrl, spec);\n const hit = tryResolve(candBase);\n if (hit) return hit;\n }\n }\n\n if (spec.startsWith('.') || spec.startsWith('/')) {\n if (spec.startsWith('/')) {\n // A leading slash in a browser module is relative to the document root.\n // Files inside public/ have a known document root; elsewhere, keep the\n // previous repo-root lookup instead of guessing a framework convention.\n const bases = fromPath.startsWith('public/')\n ? [joinPath('public', spec), joinPath('', spec)]\n : [joinPath('', spec)];\n for (const base of bases) {\n const hit = tryResolve(base);\n if (hit) return hit;\n }\n } else {\n const hit = tryResolve(joinPath(dirOf(fromPath), spec));\n if (hit) return hit;\n }\n return { unresolved: spec };\n }\n\n return { external: packageNameOf(spec) };\n}\n"]}
@@ -0,0 +1,23 @@
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
+ calls: any[];
8
+ hasMain: boolean;
9
+ };
10
+ export declare function packageNameOf(spec: any): any;
11
+ export declare function resolveImport(spec: any, fromPath: any, has: any, context?: Record<string, any>): {
12
+ path: string;
13
+ unresolved?: undefined;
14
+ external?: undefined;
15
+ } | {
16
+ path?: undefined;
17
+ unresolved: any;
18
+ external?: undefined;
19
+ } | {
20
+ path?: undefined;
21
+ unresolved?: undefined;
22
+ external: any;
23
+ };