codebase-onboarder 0.5.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 +196 -47
  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 +449 -0
  8. package/cli/explorer/advanced.js.map +1 -0
  9. package/cli/explorer/app.d.ts +1 -0
  10. package/cli/explorer/app.js +396 -229
  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 +400 -162
  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 +73 -0
  23. package/cli/explorer/github.js.map +1 -0
  24. package/cli/explorer/graphs.d.ts +7 -0
  25. package/cli/explorer/graphs.js +173 -0
  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 +184 -95
  35. package/cli/explorer/session.js.map +1 -0
  36. package/cli/explorer/views.d.ts +19 -0
  37. package/cli/explorer/views.js +496 -412
  38. package/cli/explorer/views.js.map +1 -0
  39. package/cli/explorer/wrap.d.ts +1 -0
  40. package/cli/explorer/wrap.js +33 -0
  41. package/cli/explorer/wrap.js.map +1 -0
  42. package/cli/main.d.ts +1 -0
  43. package/cli/main.js +235 -138
  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 +55 -35
  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 +165 -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 +60 -0
  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 -37
  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 +79 -0
  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
@@ -1,138 +1,139 @@
1
1
  // TypeScript / TSX analyzer.
2
2
  // Extracts interfaces, type aliases, enums, decorators, and generic arities,
3
3
  // while preserving clause symbols and resolving imports according to tsconfig.json.
4
-
5
- import { blankComments, lineCounter, braceBodyEnd, uniqueBy } from '../util.js';
4
+ import { blankComments, jsCodeMask, lineCounter, braceBodyEnd, uniqueBy } from '../util.js';
6
5
  import { dirOf, joinPath, baseName } from '../pathUtil.js';
7
6
  import { resolveImport, packageNameOf } from './javascript.js';
8
-
9
7
  export const extensions = ['.ts', '.tsx'];
10
-
11
8
  const IMPORT_RES = [
12
- /\bimport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g,
13
- /\bexport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g,
14
- /(?<!['"\w$])import\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,]+?)\s+from\s*['"]([^'"\n]+)['"]/g,
10
+ /\bexport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g,
11
+ /(?<!['"\w$])import\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' },
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' },
25
21
  ];
26
-
27
22
  const NAMED_EXPORT_RE = /\bexport\s*\{([^}]*)\}/g;
28
23
  const DECORATOR_RE = /@([\w$]+)(?:\s*\()?/g;
29
24
  const GENERIC_RE = /<([A-Za-z0-9_$,\s]+)>/;
30
-
31
25
  function extractClauseSymbols(clause) {
32
- const symbols = [];
33
- const c = clause.trim();
34
- if (!c) return symbols;
35
- if (c.startsWith('*')) return ['*'];
36
-
37
- const braceStart = c.indexOf('{');
38
- if (braceStart === -1) {
39
- const defMatch = c.match(/^[\w$]+/);
40
- if (defMatch && defMatch[0] !== 'type') return ['default'];
41
- return symbols;
42
- }
43
-
44
- const beforeBrace = c.slice(0, braceStart).trim().replace(/,$/, '').trim();
45
- if (beforeBrace && beforeBrace !== 'type') {
46
- symbols.push('default');
47
- }
48
-
49
- const braceEnd = c.lastIndexOf('}');
50
- if (braceEnd > braceStart) {
51
- const inside = c.slice(braceStart + 1, braceEnd);
52
- for (const part of inside.split(',')) {
53
- let t = part.trim();
54
- if (!t) continue;
55
- if (t.startsWith('type ')) t = t.slice(5).trim();
56
- const asMatch = t.match(/^([\w$]+)\s+as\s+[\w$]+/);
57
- const name = asMatch ? asMatch[1] : (t.match(/^[\w$]+/) || [])[0];
58
- if (name) symbols.push(name);
26
+ const symbols = [];
27
+ const c = clause.trim();
28
+ if (!c)
29
+ return symbols;
30
+ if (c.startsWith('*'))
31
+ return ['*'];
32
+ const braceStart = c.indexOf('{');
33
+ if (braceStart === -1) {
34
+ const defMatch = c.match(/^[\w$]+/);
35
+ if (defMatch && defMatch[0] !== 'type')
36
+ return ['default'];
37
+ return symbols;
38
+ }
39
+ const beforeBrace = c.slice(0, braceStart).trim().replace(/,$/, '').trim();
40
+ if (beforeBrace && beforeBrace !== 'type') {
41
+ symbols.push('default');
42
+ }
43
+ const braceEnd = c.lastIndexOf('}');
44
+ if (braceEnd > braceStart) {
45
+ const inside = c.slice(braceStart + 1, braceEnd);
46
+ for (const part of inside.split(',')) {
47
+ let t = part.trim();
48
+ if (!t)
49
+ continue;
50
+ if (t.startsWith('type '))
51
+ t = t.slice(5).trim();
52
+ const asMatch = t.match(/^([\w$]+)\s+as\s+[\w$]+/);
53
+ const name = asMatch ? asMatch[1] : (t.match(/^[\w$]+/) || [])[0];
54
+ if (name)
55
+ symbols.push(name);
56
+ }
59
57
  }
60
- }
61
- return symbols;
58
+ return symbols;
62
59
  }
63
-
64
60
  export function analyze(source, path) {
65
- const clean = blankComments(source);
66
- const lineAt = lineCounter(clean);
67
-
68
- const imports = [];
69
- for (const m of clean.matchAll(/\bimport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
70
- imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
71
- }
72
- for (const m of clean.matchAll(/\bexport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
73
- imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
74
- }
75
- for (const m of clean.matchAll(/(?<!['"\w$])import\s*['"]([^'"\n]+)['"]/g)) {
76
- imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
77
- }
78
- for (const m of clean.matchAll(/\brequire\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
79
- imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
80
- }
81
- for (const m of clean.matchAll(/(?<!['"\w$])import\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
82
- imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
83
- }
84
-
85
- const exports = [];
86
- for (const { re, kind, name } of EXPORT_RES) {
87
- for (const m of clean.matchAll(re)) {
88
- exports.push({ name: name ?? m[1], kind });
61
+ const clean = blankComments(source);
62
+ const code = jsCodeMask(source);
63
+ const lineAt = lineCounter(clean);
64
+ const imports = [];
65
+ for (const m of source.matchAll(/\bimport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
66
+ if (code[m.index] === ' ')
67
+ continue;
68
+ imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
69
+ }
70
+ for (const m of source.matchAll(/\bexport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
71
+ if (code[m.index] === ' ')
72
+ continue;
73
+ imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
74
+ }
75
+ for (const m of source.matchAll(/(?<!['"\w$])import\s*['"]([^'"\n]+)['"]/g)) {
76
+ if (code[m.index] === ' ')
77
+ continue;
78
+ imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
79
+ }
80
+ for (const m of source.matchAll(/\brequire\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
81
+ if (code[m.index] === ' ')
82
+ continue;
83
+ imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
84
+ }
85
+ for (const m of source.matchAll(/(?<!['"\w$])import\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
86
+ if (code[m.index] === ' ')
87
+ continue;
88
+ imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
89
+ }
90
+ const exports = [];
91
+ for (const { re, kind, name } of EXPORT_RES) {
92
+ for (const m of clean.matchAll(re)) {
93
+ exports.push({ name: name ?? m[1], kind });
94
+ }
95
+ }
96
+ for (const m of clean.matchAll(NAMED_EXPORT_RE)) {
97
+ for (const part of m[1].split(',')) {
98
+ const t = part.trim();
99
+ if (!t || (/^type\b/.test(t) && !/[\w$]/.test(t.replace(/^type\s+/, ''))))
100
+ continue;
101
+ const asMatch = t.match(/(?:^|\s)as\s+([\w$]+)$/);
102
+ const name = asMatch ? asMatch[1] : (t.match(/^([\w$]+)/) || [])[1];
103
+ if (name)
104
+ exports.push({ name, kind: 'named' });
105
+ }
106
+ }
107
+ const functions = [];
108
+ for (const m of clean.matchAll(/\bfunction\s+([\w$]+)/g)) {
109
+ functions.push({ name: m[1], kind: 'function', line: lineAt(m.index) });
89
110
  }
90
- }
91
- for (const m of clean.matchAll(NAMED_EXPORT_RE)) {
92
- for (const part of m[1].split(',')) {
93
- const t = part.trim();
94
- if (!t || (/^type\b/.test(t) && !/[\w$]/.test(t.replace(/^type\s+/, '')))) continue;
95
- const asMatch = t.match(/(?:^|\s)as\s+([\w$]+)$/);
96
- const name = asMatch ? asMatch[1] : (t.match(/^([\w$]+)/) || [])[1];
97
- if (name) exports.push({ name, kind: 'named' });
111
+ const classes = [];
112
+ for (const m of clean.matchAll(/\bclass\s+([\w$]+)([^{]*)\{/g)) {
113
+ const name = m[1];
114
+ const signature = m[2] || '';
115
+ const decs = [];
116
+ const beforeClass = clean.slice(Math.max(0, m.index - 200), m.index);
117
+ for (const dm of beforeClass.matchAll(DECORATOR_RE)) {
118
+ decs.push(dm[1]);
119
+ }
120
+ const genMatch = signature.match(GENERIC_RE);
121
+ const arity = genMatch ? genMatch[1].split(',').length : 0;
122
+ classes.push({ name, decorators: decs, genericArity: arity, line: lineAt(m.index) });
98
123
  }
99
- }
100
-
101
- const functions = [];
102
- for (const m of clean.matchAll(/\bfunction\s+([\w$]+)/g)) {
103
- functions.push({ name: m[1], kind: 'function', line: lineAt(m.index) });
104
- }
105
-
106
- const classes = [];
107
- for (const m of clean.matchAll(/\bclass\s+([\w$]+)([^{]*)\{/g)) {
108
- const name = m[1];
109
- const signature = m[2] || '';
110
- const decs = [];
111
- const beforeClass = clean.slice(Math.max(0, m.index - 200), m.index);
112
- for (const dm of beforeClass.matchAll(DECORATOR_RE)) {
113
- decs.push(dm[1]);
124
+ const interfaces = [];
125
+ for (const m of clean.matchAll(/\b(?:interface|type|enum)\s+([\w$]+)/g)) {
126
+ interfaces.push({ name: m[1], line: lineAt(m.index) });
114
127
  }
115
- const genMatch = signature.match(GENERIC_RE);
116
- const arity = genMatch ? genMatch[1].split(',').length : 0;
117
-
118
- classes.push({ name, decorators: decs, genericArity: arity, line: lineAt(m.index) });
119
- }
120
-
121
- const interfaces = [];
122
- for (const m of clean.matchAll(/\b(?:interface|type|enum)\s+([\w$]+)/g)) {
123
- interfaces.push({ name: m[1], line: lineAt(m.index) });
124
- }
125
-
126
- const hasMain = /if\s*\(\s*require\.main\s*===\s*module\s*\)|import\.meta\.main/g.test(clean);
127
-
128
- return {
129
- imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),
130
- exports: uniqueBy(exports, (e) => e.name),
131
- functions,
132
- classes,
133
- interfaces,
134
- hasMain,
135
- };
128
+ const hasMain = /if\s*\(\s*require\.main\s*===\s*module\s*\)|import\.meta\.main/g.test(clean);
129
+ return {
130
+ imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),
131
+ exports: uniqueBy(exports, (e) => e.name),
132
+ functions,
133
+ classes,
134
+ interfaces,
135
+ hasMain,
136
+ };
136
137
  }
137
-
138
138
  export { resolveImport, packageNameOf };
139
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/shared/analyzer/languages/typescript.ts"],"names":[],"mappings":"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","sourcesContent":["// TypeScript / TSX analyzer.\n// Extracts interfaces, type aliases, enums, decorators, and generic arities,\n// while preserving clause symbols and resolving imports according to tsconfig.json.\n\nimport { blankComments, jsCodeMask, lineCounter, braceBodyEnd, uniqueBy } from '../util.js';\nimport { dirOf, joinPath, baseName } from '../pathUtil.js';\nimport { resolveImport, packageNameOf } from './javascript.js';\n\nexport const extensions = ['.ts', '.tsx'];\n\nconst IMPORT_RES = [\n /\\bimport\\s+(?:type\\s+)?([\\w$*{}\\s,]+?)\\s+from\\s*['\"]([^'\"\\n]+)['\"]/g,\n /\\bexport\\s+(?:type\\s+)?([\\w$*{}\\s,]+?)\\s+from\\s*['\"]([^'\"\\n]+)['\"]/g,\n /(?<!['\"\\w$])import\\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];\n\nconst NAMED_EXPORT_RE = /\\bexport\\s*\\{([^}]*)\\}/g;\nconst DECORATOR_RE = /@([\\w$]+)(?:\\s*\\()?/g;\nconst GENERIC_RE = /<([A-Za-z0-9_$,\\s]+)>/;\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 m of clean.matchAll(/\\bfunction\\s+([\\w$]+)/g)) {\n functions.push({ name: m[1], kind: 'function', line: lineAt(m.index) });\n }\n\n const classes = [];\n for (const m of clean.matchAll(/\\bclass\\s+([\\w$]+)([^{]*)\\{/g)) {\n const name = m[1];\n const signature = m[2] || '';\n const decs = [];\n const beforeClass = clean.slice(Math.max(0, m.index - 200), m.index);\n for (const dm of beforeClass.matchAll(DECORATOR_RE)) {\n decs.push(dm[1]);\n }\n const genMatch = signature.match(GENERIC_RE);\n const arity = genMatch ? genMatch[1].split(',').length : 0;\n \n classes.push({ name, decorators: decs, genericArity: arity, line: lineAt(m.index) });\n }\n\n const interfaces = [];\n for (const m of clean.matchAll(/\\b(?:interface|type|enum)\\s+([\\w$]+)/g)) {\n interfaces.push({ name: m[1], line: lineAt(m.index) });\n }\n\n const hasMain = /if\\s*\\(\\s*require\\.main\\s*===\\s*module\\s*\\)|import\\.meta\\.main/g.test(clean);\n\n return {\n imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),\n exports: uniqueBy(exports, (e) => e.name),\n functions,\n classes,\n interfaces,\n hasMain,\n };\n}\n\nexport { resolveImport, packageNameOf };\n"]}
@@ -0,0 +1,18 @@
1
+ export declare function detectLicenseFromText(text: any): {
2
+ id: string;
3
+ name: string;
4
+ type: string;
5
+ };
6
+ export declare function classifyLicenseType(licenseId: any): "copyleft" | "custom" | "permissive" | "unknown" | "weak-copyleft";
7
+ export declare function analyzeLicenses(source: any, manifest?: Record<string, any>): Promise<{
8
+ projectLicense: any;
9
+ sbom: any[];
10
+ counts: {
11
+ permissive: number;
12
+ copyleft: number;
13
+ weakCopyleft: number;
14
+ unknown: number;
15
+ total: number;
16
+ };
17
+ complianceStatus: string;
18
+ }>;
@@ -1,151 +1,148 @@
1
1
  // License detection and Software Bill of Materials (SBOM) compliance analysis.
2
2
  // Pure isomorphic analyzer — works in Node and browser.
3
-
4
3
  const KNOWN_LICENSES = [
5
- { id: 'MIT', name: 'MIT License', type: 'permissive', rx: /\bMIT\b|Permission is hereby granted, free of charge/i },
6
- { id: 'Apache-2.0', name: 'Apache License 2.0', type: 'permissive', rx: /Apache License,\s*Version 2\.0|http:\/\/www\.apache\.org\/licenses\/LICENSE-2\.0/i },
7
- { id: 'BSD-3-Clause', name: 'BSD 3-Clause "New" or "Revised" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\s\S]*?Neither the name of[\s\S]*?nor the names of its contributors/i },
8
- { id: 'BSD-2-Clause', name: 'BSD 2-Clause "Simplified" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\s\S]*?Redistributions in binary form must reproduce the above copyright/i },
9
- { id: 'ISC', name: 'ISC License', type: 'permissive', rx: /Permission to use, copy, modify, and\/or distribute this software for any purpose/i },
10
- { id: 'GPL-3.0', name: 'GNU General Public License v3.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\s+Version 3|GPL-3\.0/i },
11
- { id: 'GPL-2.0', name: 'GNU General Public License v2.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\s+Version 2|GPL-2\.0/i },
12
- { id: 'AGPL-3.0', name: 'GNU Affero General Public License v3.0', type: 'copyleft', rx: /GNU AFFERO GENERAL PUBLIC LICENSE/i },
13
- { id: 'LGPL-3.0', name: 'GNU Lesser General Public License v3.0', type: 'weak-copyleft', rx: /GNU LESSER GENERAL PUBLIC LICENSE\s+Version 3/i },
14
- { id: 'MPL-2.0', name: 'Mozilla Public License 2.0', type: 'weak-copyleft', rx: /Mozilla Public License,?\s*v\.?\s*2\.0/i },
15
- { id: 'Unlicense', name: 'The Unlicense', type: 'public-domain', rx: /This is free and unencumbered software released into the public domain/i },
16
- { id: 'CC0-1.0', name: 'Creative Commons Zero v1.0 Universal', type: 'public-domain', rx: /CC0 1\.0 Universal|Public Domain Dedication/i },
4
+ { id: 'MIT', name: 'MIT License', type: 'permissive', rx: /\bMIT\b|Permission is hereby granted, free of charge/i },
5
+ { id: 'Apache-2.0', name: 'Apache License 2.0', type: 'permissive', rx: /Apache License,\s*Version 2\.0|http:\/\/www\.apache\.org\/licenses\/LICENSE-2\.0/i },
6
+ { id: 'BSD-3-Clause', name: 'BSD 3-Clause "New" or "Revised" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\s\S]*?Neither the name of[\s\S]*?nor the names of its contributors/i },
7
+ { id: 'BSD-2-Clause', name: 'BSD 2-Clause "Simplified" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\s\S]*?Redistributions in binary form must reproduce the above copyright/i },
8
+ { id: 'ISC', name: 'ISC License', type: 'permissive', rx: /Permission to use, copy, modify, and\/or distribute this software for any purpose/i },
9
+ { id: 'GPL-3.0', name: 'GNU General Public License v3.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\s+Version 3|GPL-3\.0/i },
10
+ { id: 'GPL-2.0', name: 'GNU General Public License v2.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\s+Version 2|GPL-2\.0/i },
11
+ { id: 'AGPL-3.0', name: 'GNU Affero General Public License v3.0', type: 'copyleft', rx: /GNU AFFERO GENERAL PUBLIC LICENSE/i },
12
+ { id: 'LGPL-3.0', name: 'GNU Lesser General Public License v3.0', type: 'weak-copyleft', rx: /GNU LESSER GENERAL PUBLIC LICENSE\s+Version 3/i },
13
+ { id: 'MPL-2.0', name: 'Mozilla Public License 2.0', type: 'weak-copyleft', rx: /Mozilla Public License,?\s*v\.?\s*2\.0/i },
14
+ { id: 'Unlicense', name: 'The Unlicense', type: 'public-domain', rx: /This is free and unencumbered software released into the public domain/i },
15
+ { id: 'CC0-1.0', name: 'Creative Commons Zero v1.0 Universal', type: 'public-domain', rx: /CC0 1\.0 Universal|Public Domain Dedication/i },
17
16
  ];
18
-
19
17
  export function detectLicenseFromText(text) {
20
- if (!text || typeof text !== 'string') return null;
21
- for (const lic of KNOWN_LICENSES) {
22
- if (lic.rx.test(text)) {
23
- return { id: lic.id, name: lic.name, type: lic.type };
18
+ if (!text || typeof text !== 'string')
19
+ return null;
20
+ for (const lic of KNOWN_LICENSES) {
21
+ if (lic.rx.test(text)) {
22
+ return { id: lic.id, name: lic.name, type: lic.type };
23
+ }
24
24
  }
25
- }
26
- return null;
25
+ return null;
27
26
  }
28
-
29
27
  export function classifyLicenseType(licenseId) {
30
- if (!licenseId || licenseId === 'UNKNOWN') return 'unknown';
31
- const id = String(licenseId).toUpperCase();
32
- if (/MIT|APACHE|BSD|ISC|UNLICENSE|CC0|ZLIB|WTFPL/.test(id)) return 'permissive';
33
- if (/LGPL|MPL|EPL/.test(id)) return 'weak-copyleft';
34
- if (/AGPL|GPL-2|GPL-3|GPLV2|GPLV3|GPL/.test(id)) return 'copyleft';
35
- return 'custom';
28
+ if (!licenseId || licenseId === 'UNKNOWN')
29
+ return 'unknown';
30
+ const id = String(licenseId).toUpperCase();
31
+ if (/MIT|APACHE|BSD|ISC|UNLICENSE|CC0|ZLIB|WTFPL/.test(id))
32
+ return 'permissive';
33
+ if (/LGPL|MPL|EPL/.test(id))
34
+ return 'weak-copyleft';
35
+ if (/AGPL|GPL-2|GPL-3|GPLV2|GPLV3|GPL/.test(id))
36
+ return 'copyleft';
37
+ return 'custom';
36
38
  }
37
-
38
39
  export async function analyzeLicenses(source, manifest = {}) {
39
- let projectLicense = null;
40
-
41
- // 1. Check root LICENSE / COPYING / LICENSE.md files
42
- const rootFiles = await source.list('').catch(() => []);
43
- const licFile = rootFiles.find((f) => /^LICENSE|^COPYING|^UNLICENSE/i.test(f.name));
44
- if (licFile) {
45
- const content = await source.read(licFile.path).catch(() => '');
46
- projectLicense = detectLicenseFromText(content) || {
47
- id: 'Custom',
48
- name: licFile.name,
49
- type: 'custom',
40
+ let projectLicense = null;
41
+ // 1. Check root LICENSE / COPYING / LICENSE.md files
42
+ const rootFiles = await source.list('').catch(() => []);
43
+ const licFile = rootFiles.find((f) => /^LICENSE|^COPYING|^UNLICENSE/i.test(f.name));
44
+ if (licFile) {
45
+ const content = await source.read(licFile.path).catch(() => '');
46
+ projectLicense = detectLicenseFromText(content) || {
47
+ id: 'Custom',
48
+ name: licFile.name,
49
+ type: 'custom',
50
+ };
51
+ }
52
+ // 2. Fallback to manifest.license from package.json
53
+ if (!projectLicense && manifest.license) {
54
+ const licId = manifest.license;
55
+ projectLicense = {
56
+ id: licId,
57
+ name: licId,
58
+ type: classifyLicenseType(licId),
59
+ };
60
+ }
61
+ // 3. Build SBOM entries from manifest dependencies
62
+ const sbom = [];
63
+ const addDep = (name, version, ecosystem, dev = false) => {
64
+ sbom.push({
65
+ name,
66
+ version: version || '*',
67
+ ecosystem,
68
+ isDev: dev,
69
+ license: inferKnownDepLicense(name, ecosystem),
70
+ });
50
71
  };
51
- }
52
-
53
- // 2. Fallback to manifest.license from package.json
54
- if (!projectLicense && manifest.license) {
55
- const licId = manifest.license;
56
- projectLicense = {
57
- id: licId,
58
- name: licId,
59
- type: classifyLicenseType(licId),
72
+ const npmDeps = manifest.deps?.npm || {};
73
+ for (const [name, ver] of Object.entries(npmDeps)) {
74
+ addDep(name, ver, 'npm', false);
75
+ }
76
+ const devDeps = manifest.deps?.dev || {};
77
+ for (const [name, ver] of Object.entries(devDeps)) {
78
+ addDep(name, ver, 'npm', true);
79
+ }
80
+ for (const name of manifest.deps?.pip || []) {
81
+ addDep(name, '*', 'pip', false);
82
+ }
83
+ for (const name of manifest.deps?.go || []) {
84
+ addDep(name, '*', 'go', false);
85
+ }
86
+ for (const name of manifest.deps?.cargo || []) {
87
+ addDep(name, '*', 'cargo', false);
88
+ }
89
+ const counts = { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: sbom.length };
90
+ for (const item of sbom) {
91
+ const type = item.license.type;
92
+ if (type === 'permissive')
93
+ counts.permissive++;
94
+ else if (type === 'copyleft')
95
+ counts.copyleft++;
96
+ else if (type === 'weak-copyleft')
97
+ counts.weakCopyleft++;
98
+ else
99
+ counts.unknown++;
100
+ }
101
+ const hasCopyleft = counts.copyleft > 0;
102
+ const complianceStatus = hasCopyleft && projectLicense?.type === 'permissive'
103
+ ? 'warning'
104
+ : 'clean';
105
+ return {
106
+ projectLicense: projectLicense || { id: 'UNLICENSED', name: 'None detected', type: 'unknown' },
107
+ sbom,
108
+ counts,
109
+ complianceStatus,
60
110
  };
61
- }
62
-
63
- // 3. Build SBOM entries from manifest dependencies
64
- const sbom = [];
65
- const addDep = (name, version, ecosystem, dev = false) => {
66
- sbom.push({
67
- name,
68
- version: version || '*',
69
- ecosystem,
70
- isDev: dev,
71
- license: inferKnownDepLicense(name, ecosystem),
72
- });
73
- };
74
-
75
- const npmDeps = manifest.deps?.npm || {};
76
- for (const [name, ver] of Object.entries(npmDeps)) {
77
- addDep(name, ver, 'npm', false);
78
- }
79
- const devDeps = manifest.deps?.dev || {};
80
- for (const [name, ver] of Object.entries(devDeps)) {
81
- addDep(name, ver, 'npm', true);
82
- }
83
- for (const name of manifest.deps?.pip || []) {
84
- addDep(name, '*', 'pip', false);
85
- }
86
- for (const name of manifest.deps?.go || []) {
87
- addDep(name, '*', 'go', false);
88
- }
89
- for (const name of manifest.deps?.cargo || []) {
90
- addDep(name, '*', 'cargo', false);
91
- }
92
-
93
- const counts = { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: sbom.length };
94
- for (const item of sbom) {
95
- const type = item.license.type;
96
- if (type === 'permissive') counts.permissive++;
97
- else if (type === 'copyleft') counts.copyleft++;
98
- else if (type === 'weak-copyleft') counts.weakCopyleft++;
99
- else counts.unknown++;
100
- }
101
-
102
- const hasCopyleft = counts.copyleft > 0;
103
- const complianceStatus = hasCopyleft && projectLicense?.type === 'permissive'
104
- ? 'warning'
105
- : 'clean';
106
-
107
- return {
108
- projectLicense: projectLicense || { id: 'UNLICENSED', name: 'None detected', type: 'unknown' },
109
- sbom,
110
- counts,
111
- complianceStatus,
112
- };
113
111
  }
114
-
115
112
  // Inferred licenses for standard popular open-source dependencies
116
113
  const POPULAR_LICENSES = {
117
- react: 'MIT',
118
- 'react-dom': 'MIT',
119
- vue: 'MIT',
120
- express: 'MIT',
121
- lodash: 'MIT',
122
- axios: 'MIT',
123
- typescript: 'Apache-2.0',
124
- next: 'MIT',
125
- tailwindcss: 'MIT',
126
- eslint: 'MIT',
127
- prettier: 'MIT',
128
- mocha: 'MIT',
129
- jest: 'MIT',
130
- vite: 'MIT',
131
- fastapi: 'MIT',
132
- django: 'BSD-3-Clause',
133
- flask: 'BSD-3-Clause',
134
- requests: 'Apache-2.0',
135
- pytest: 'MIT',
136
- numpy: 'BSD-3-Clause',
137
- pandas: 'BSD-3-Clause',
138
- tokio: 'MIT',
139
- serde: 'MIT / Apache-2.0',
140
- gin: 'MIT',
141
- fiber: 'MIT',
114
+ react: 'MIT',
115
+ 'react-dom': 'MIT',
116
+ vue: 'MIT',
117
+ express: 'MIT',
118
+ lodash: 'MIT',
119
+ axios: 'MIT',
120
+ typescript: 'Apache-2.0',
121
+ next: 'MIT',
122
+ tailwindcss: 'MIT',
123
+ eslint: 'MIT',
124
+ prettier: 'MIT',
125
+ mocha: 'MIT',
126
+ jest: 'MIT',
127
+ vite: 'MIT',
128
+ fastapi: 'MIT',
129
+ django: 'BSD-3-Clause',
130
+ flask: 'BSD-3-Clause',
131
+ requests: 'Apache-2.0',
132
+ pytest: 'MIT',
133
+ numpy: 'BSD-3-Clause',
134
+ pandas: 'BSD-3-Clause',
135
+ tokio: 'MIT',
136
+ serde: 'MIT / Apache-2.0',
137
+ gin: 'MIT',
138
+ fiber: 'MIT',
142
139
  };
143
-
144
140
  function inferKnownDepLicense(name, ecosystem) {
145
- const normName = name.toLowerCase().replace(/^@[^/]+\//, '');
146
- const id = POPULAR_LICENSES[name] || POPULAR_LICENSES[normName] || 'Permissive (Inferred)';
147
- return {
148
- id,
149
- type: classifyLicenseType(id),
150
- };
141
+ const normName = name.toLowerCase().replace(/^@[^/]+\//, '');
142
+ const id = POPULAR_LICENSES[name] || POPULAR_LICENSES[normName] || 'Permissive (Inferred)';
143
+ return {
144
+ id,
145
+ type: classifyLicenseType(id),
146
+ };
151
147
  }
148
+ //# sourceMappingURL=licenses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"licenses.js","sourceRoot":"","sources":["../../src/shared/analyzer/licenses.ts"],"names":[],"mappings":"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","sourcesContent":["// License detection and Software Bill of Materials (SBOM) compliance analysis.\n// Pure isomorphic analyzer — works in Node and browser.\n\nconst KNOWN_LICENSES = [\n { id: 'MIT', name: 'MIT License', type: 'permissive', rx: /\\bMIT\\b|Permission is hereby granted, free of charge/i },\n { id: 'Apache-2.0', name: 'Apache License 2.0', type: 'permissive', rx: /Apache License,\\s*Version 2\\.0|http:\\/\\/www\\.apache\\.org\\/licenses\\/LICENSE-2\\.0/i },\n { id: 'BSD-3-Clause', name: 'BSD 3-Clause \"New\" or \"Revised\" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\\s\\S]*?Neither the name of[\\s\\S]*?nor the names of its contributors/i },\n { id: 'BSD-2-Clause', name: 'BSD 2-Clause \"Simplified\" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\\s\\S]*?Redistributions in binary form must reproduce the above copyright/i },\n { id: 'ISC', name: 'ISC License', type: 'permissive', rx: /Permission to use, copy, modify, and\\/or distribute this software for any purpose/i },\n { id: 'GPL-3.0', name: 'GNU General Public License v3.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\\s+Version 3|GPL-3\\.0/i },\n { id: 'GPL-2.0', name: 'GNU General Public License v2.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\\s+Version 2|GPL-2\\.0/i },\n { id: 'AGPL-3.0', name: 'GNU Affero General Public License v3.0', type: 'copyleft', rx: /GNU AFFERO GENERAL PUBLIC LICENSE/i },\n { id: 'LGPL-3.0', name: 'GNU Lesser General Public License v3.0', type: 'weak-copyleft', rx: /GNU LESSER GENERAL PUBLIC LICENSE\\s+Version 3/i },\n { id: 'MPL-2.0', name: 'Mozilla Public License 2.0', type: 'weak-copyleft', rx: /Mozilla Public License,?\\s*v\\.?\\s*2\\.0/i },\n { id: 'Unlicense', name: 'The Unlicense', type: 'public-domain', rx: /This is free and unencumbered software released into the public domain/i },\n { id: 'CC0-1.0', name: 'Creative Commons Zero v1.0 Universal', type: 'public-domain', rx: /CC0 1\\.0 Universal|Public Domain Dedication/i },\n];\n\nexport function detectLicenseFromText(text) {\n if (!text || typeof text !== 'string') return null;\n for (const lic of KNOWN_LICENSES) {\n if (lic.rx.test(text)) {\n return { id: lic.id, name: lic.name, type: lic.type };\n }\n }\n return null;\n}\n\nexport function classifyLicenseType(licenseId) {\n if (!licenseId || licenseId === 'UNKNOWN') return 'unknown';\n const id = String(licenseId).toUpperCase();\n if (/MIT|APACHE|BSD|ISC|UNLICENSE|CC0|ZLIB|WTFPL/.test(id)) return 'permissive';\n if (/LGPL|MPL|EPL/.test(id)) return 'weak-copyleft';\n if (/AGPL|GPL-2|GPL-3|GPLV2|GPLV3|GPL/.test(id)) return 'copyleft';\n return 'custom';\n}\n\nexport async function analyzeLicenses(source, manifest: Record<string, any> = {}) {\n let projectLicense = null;\n\n // 1. Check root LICENSE / COPYING / LICENSE.md files\n const rootFiles = await source.list('').catch(() => []);\n const licFile = rootFiles.find((f) => /^LICENSE|^COPYING|^UNLICENSE/i.test(f.name));\n if (licFile) {\n const content = await source.read(licFile.path).catch(() => '');\n projectLicense = detectLicenseFromText(content) || {\n id: 'Custom',\n name: licFile.name,\n type: 'custom',\n };\n }\n\n // 2. Fallback to manifest.license from package.json\n if (!projectLicense && manifest.license) {\n const licId = manifest.license;\n projectLicense = {\n id: licId,\n name: licId,\n type: classifyLicenseType(licId),\n };\n }\n\n // 3. Build SBOM entries from manifest dependencies\n const sbom = [];\n const addDep = (name, version, ecosystem, dev = false) => {\n sbom.push({\n name,\n version: version || '*',\n ecosystem,\n isDev: dev,\n license: inferKnownDepLicense(name, ecosystem),\n });\n };\n\n const npmDeps = manifest.deps?.npm || {};\n for (const [name, ver] of Object.entries(npmDeps)) {\n addDep(name, ver, 'npm', false);\n }\n const devDeps = manifest.deps?.dev || {};\n for (const [name, ver] of Object.entries(devDeps)) {\n addDep(name, ver, 'npm', true);\n }\n for (const name of manifest.deps?.pip || []) {\n addDep(name, '*', 'pip', false);\n }\n for (const name of manifest.deps?.go || []) {\n addDep(name, '*', 'go', false);\n }\n for (const name of manifest.deps?.cargo || []) {\n addDep(name, '*', 'cargo', false);\n }\n\n const counts = { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: sbom.length };\n for (const item of sbom) {\n const type = item.license.type;\n if (type === 'permissive') counts.permissive++;\n else if (type === 'copyleft') counts.copyleft++;\n else if (type === 'weak-copyleft') counts.weakCopyleft++;\n else counts.unknown++;\n }\n\n const hasCopyleft = counts.copyleft > 0;\n const complianceStatus = hasCopyleft && projectLicense?.type === 'permissive'\n ? 'warning'\n : 'clean';\n\n return {\n projectLicense: projectLicense || { id: 'UNLICENSED', name: 'None detected', type: 'unknown' },\n sbom,\n counts,\n complianceStatus,\n };\n}\n\n// Inferred licenses for standard popular open-source dependencies\nconst POPULAR_LICENSES = {\n react: 'MIT',\n 'react-dom': 'MIT',\n vue: 'MIT',\n express: 'MIT',\n lodash: 'MIT',\n axios: 'MIT',\n typescript: 'Apache-2.0',\n next: 'MIT',\n tailwindcss: 'MIT',\n eslint: 'MIT',\n prettier: 'MIT',\n mocha: 'MIT',\n jest: 'MIT',\n vite: 'MIT',\n fastapi: 'MIT',\n django: 'BSD-3-Clause',\n flask: 'BSD-3-Clause',\n requests: 'Apache-2.0',\n pytest: 'MIT',\n numpy: 'BSD-3-Clause',\n pandas: 'BSD-3-Clause',\n tokio: 'MIT',\n serde: 'MIT / Apache-2.0',\n gin: 'MIT',\n fiber: 'MIT',\n};\n\nfunction inferKnownDepLicense(name, ecosystem) {\n const normName = name.toLowerCase().replace(/^@[^/]+\\//, '');\n const id = POPULAR_LICENSES[name] || POPULAR_LICENSES[normName] || 'Permissive (Inferred)';\n return {\n id,\n type: classifyLicenseType(id),\n };\n}\n"]}