code-auditor-mcp 3.1.0 → 3.4.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 (360) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +665 -1
  3. package/README.md +85 -11
  4. package/dist/__test_tmp__/spec18_test.d.ts +2 -0
  5. package/dist/__test_tmp__/spec18_test.d.ts.map +1 -0
  6. package/dist/__test_tmp__/spec18_test.js +5 -0
  7. package/dist/__test_tmp__/spec18_test.js.map +1 -0
  8. package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts +6 -0
  9. package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts.map +1 -0
  10. package/dist/__tests__/fixtures/spec-20/scripts/tool.js +12 -0
  11. package/dist/__tests__/fixtures/spec-20/scripts/tool.js.map +1 -0
  12. package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts +7 -0
  13. package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts.map +1 -0
  14. package/dist/__tests__/fixtures/spec-20/src/demo-module.js +13 -0
  15. package/dist/__tests__/fixtures/spec-20/src/demo-module.js.map +1 -0
  16. package/dist/analyzers/analyzerUtils.js +2 -2
  17. package/dist/analyzers/analyzerUtils.js.map +1 -1
  18. package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts +1 -1
  19. package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -1
  20. package/dist/analyzers/cross-language/APIContractAnalyzer.js +2 -4
  21. package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
  22. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts +3 -0
  23. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts.map +1 -1
  24. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js +3 -5
  25. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -1
  26. package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
  27. package/dist/analyzers/cross-language/DependencyGraphBuilder.js +0 -3
  28. package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
  29. package/dist/analyzers/cross-language/SchemaValidator.d.ts +1 -1
  30. package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
  31. package/dist/analyzers/cross-language/SchemaValidator.js +2 -5
  32. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  33. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +83 -0
  34. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -0
  35. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +611 -0
  36. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -0
  37. package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
  38. package/dist/analyzers/documentationAnalyzer.js +8 -4
  39. package/dist/analyzers/documentationAnalyzer.js.map +1 -1
  40. package/dist/analyzers/orm/adapterRegistry.d.ts +41 -0
  41. package/dist/analyzers/orm/adapterRegistry.d.ts.map +1 -0
  42. package/dist/analyzers/orm/adapterRegistry.js +73 -0
  43. package/dist/analyzers/orm/adapterRegistry.js.map +1 -0
  44. package/dist/analyzers/orm/drizzleAdapter.d.ts +42 -0
  45. package/dist/analyzers/orm/drizzleAdapter.d.ts.map +1 -0
  46. package/dist/analyzers/orm/drizzleAdapter.js +166 -0
  47. package/dist/analyzers/orm/drizzleAdapter.js.map +1 -0
  48. package/dist/analyzers/orm/index.d.ts +14 -0
  49. package/dist/analyzers/orm/index.d.ts.map +1 -0
  50. package/dist/analyzers/orm/index.js +24 -0
  51. package/dist/analyzers/orm/index.js.map +1 -0
  52. package/dist/analyzers/orm/prismaAdapter.d.ts +45 -0
  53. package/dist/analyzers/orm/prismaAdapter.d.ts.map +1 -0
  54. package/dist/analyzers/orm/prismaAdapter.js +170 -0
  55. package/dist/analyzers/orm/prismaAdapter.js.map +1 -0
  56. package/dist/analyzers/orm/types.d.ts +63 -0
  57. package/dist/analyzers/orm/types.d.ts.map +1 -0
  58. package/dist/analyzers/orm/types.js +10 -0
  59. package/dist/analyzers/orm/types.js.map +1 -0
  60. package/dist/analyzers/provenance.d.ts +133 -0
  61. package/dist/analyzers/provenance.d.ts.map +1 -0
  62. package/dist/analyzers/provenance.js +1041 -0
  63. package/dist/analyzers/provenance.js.map +1 -0
  64. package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
  65. package/dist/analyzers/reactAnalyzer.js +117 -1
  66. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  67. package/dist/analyzers/ruleRegistry.d.ts +38 -0
  68. package/dist/analyzers/ruleRegistry.d.ts.map +1 -0
  69. package/dist/analyzers/ruleRegistry.js +123 -0
  70. package/dist/analyzers/ruleRegistry.js.map +1 -0
  71. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts +58 -0
  72. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -0
  73. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +445 -0
  74. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -0
  75. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +52 -0
  76. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  77. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +108 -26
  78. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  79. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +64 -0
  80. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  81. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +259 -103
  82. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  83. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
  84. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +5 -15
  85. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  86. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  87. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +10 -10
  88. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
  89. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +25 -0
  90. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  91. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +250 -59
  92. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  93. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +103 -0
  94. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -0
  95. package/dist/analyzers/universal/UniversalStylesAnalyzer.js +750 -0
  96. package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -0
  97. package/dist/auditRunner.d.ts.map +1 -1
  98. package/dist/auditRunner.js +483 -3
  99. package/dist/auditRunner.js.map +1 -1
  100. package/dist/baseline.d.ts +98 -0
  101. package/dist/baseline.d.ts.map +1 -0
  102. package/dist/baseline.js +184 -0
  103. package/dist/baseline.js.map +1 -0
  104. package/dist/churn/churnExtractor.d.ts +32 -0
  105. package/dist/churn/churnExtractor.d.ts.map +1 -0
  106. package/dist/churn/churnExtractor.js +261 -0
  107. package/dist/churn/churnExtractor.js.map +1 -0
  108. package/dist/cli.js +1215 -11
  109. package/dist/cli.js.map +1 -1
  110. package/dist/codeIndexDB-enhanced.js +1 -1
  111. package/dist/codeIndexDB-enhanced.js.map +1 -1
  112. package/dist/codeIndexDB.d.ts +101 -0
  113. package/dist/codeIndexDB.d.ts.map +1 -1
  114. package/dist/codeIndexDB.js +661 -5
  115. package/dist/codeIndexDB.js.map +1 -1
  116. package/dist/config/configLoader.d.ts.map +1 -1
  117. package/dist/config/configLoader.js +95 -1
  118. package/dist/config/configLoader.js.map +1 -1
  119. package/dist/config/defaults.d.ts +72 -1
  120. package/dist/config/defaults.d.ts.map +1 -1
  121. package/dist/config/defaults.js +146 -15
  122. package/dist/config/defaults.js.map +1 -1
  123. package/dist/config/pathProfiles.d.ts +38 -0
  124. package/dist/config/pathProfiles.d.ts.map +1 -0
  125. package/dist/config/pathProfiles.js +47 -0
  126. package/dist/config/pathProfiles.js.map +1 -0
  127. package/dist/conventions/conventionMiner.d.ts +63 -0
  128. package/dist/conventions/conventionMiner.d.ts.map +1 -0
  129. package/dist/conventions/conventionMiner.js +696 -0
  130. package/dist/conventions/conventionMiner.js.map +1 -0
  131. package/dist/coverage/coverageService.d.ts +49 -0
  132. package/dist/coverage/coverageService.d.ts.map +1 -0
  133. package/dist/coverage/coverageService.js +117 -0
  134. package/dist/coverage/coverageService.js.map +1 -0
  135. package/dist/coverage/istanbulParser.d.ts +84 -0
  136. package/dist/coverage/istanbulParser.d.ts.map +1 -0
  137. package/dist/coverage/istanbulParser.js +120 -0
  138. package/dist/coverage/istanbulParser.js.map +1 -0
  139. package/dist/coverage/lcovParser.d.ts +40 -0
  140. package/dist/coverage/lcovParser.d.ts.map +1 -0
  141. package/dist/coverage/lcovParser.js +168 -0
  142. package/dist/coverage/lcovParser.js.map +1 -0
  143. package/dist/fingerprint.d.ts +17 -0
  144. package/dist/fingerprint.d.ts.map +1 -1
  145. package/dist/fingerprint.js +42 -0
  146. package/dist/fingerprint.js.map +1 -1
  147. package/dist/grammars/tree-sitter-css.wasm +0 -0
  148. package/dist/graph/blastRadius.d.ts +27 -0
  149. package/dist/graph/blastRadius.d.ts.map +1 -0
  150. package/dist/graph/blastRadius.js +150 -0
  151. package/dist/graph/blastRadius.js.map +1 -0
  152. package/dist/graph/callGraph.d.ts +78 -0
  153. package/dist/graph/callGraph.d.ts.map +1 -0
  154. package/dist/graph/callGraph.js +484 -0
  155. package/dist/graph/callGraph.js.map +1 -0
  156. package/dist/graph/importGraph.d.ts +91 -0
  157. package/dist/graph/importGraph.d.ts.map +1 -0
  158. package/dist/graph/importGraph.js +602 -0
  159. package/dist/graph/importGraph.js.map +1 -0
  160. package/dist/graph/outputFormatter.d.ts +55 -0
  161. package/dist/graph/outputFormatter.d.ts.map +1 -0
  162. package/dist/graph/outputFormatter.js +283 -0
  163. package/dist/graph/outputFormatter.js.map +1 -0
  164. package/dist/hooks/codex.d.ts +36 -1
  165. package/dist/hooks/codex.d.ts.map +1 -1
  166. package/dist/hooks/codex.js +88 -54
  167. package/dist/hooks/codex.js.map +1 -1
  168. package/dist/hotspots/hotspotScorer.d.ts +20 -0
  169. package/dist/hotspots/hotspotScorer.d.ts.map +1 -0
  170. package/dist/hotspots/hotspotScorer.js +202 -0
  171. package/dist/hotspots/hotspotScorer.js.map +1 -0
  172. package/dist/invariants/invariant-rules.schema.json +42 -1
  173. package/dist/invariants/ruleEngine.d.ts +4 -1
  174. package/dist/invariants/ruleEngine.d.ts.map +1 -1
  175. package/dist/invariants/ruleEngine.js +141 -5
  176. package/dist/invariants/ruleEngine.js.map +1 -1
  177. package/dist/invariants/ruleValidator.d.ts.map +1 -1
  178. package/dist/invariants/ruleValidator.js +62 -1
  179. package/dist/invariants/ruleValidator.js.map +1 -1
  180. package/dist/invariants/types.d.ts +23 -2
  181. package/dist/invariants/types.d.ts.map +1 -1
  182. package/dist/languages/UniversalAnalyzer.d.ts +1 -1
  183. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
  184. package/dist/languages/UniversalAnalyzer.js +59 -24
  185. package/dist/languages/UniversalAnalyzer.js.map +1 -1
  186. package/dist/languages/index.d.ts +1 -0
  187. package/dist/languages/index.d.ts.map +1 -1
  188. package/dist/languages/index.js +3 -0
  189. package/dist/languages/index.js.map +1 -1
  190. package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts +59 -0
  191. package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts.map +1 -0
  192. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +236 -0
  193. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js.map +1 -0
  194. package/dist/languages/tree-sitter/parser.d.ts.map +1 -1
  195. package/dist/languages/tree-sitter/parser.js +2 -0
  196. package/dist/languages/tree-sitter/parser.js.map +1 -1
  197. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
  198. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +61 -10
  199. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
  200. package/dist/ledger.d.ts +128 -0
  201. package/dist/ledger.d.ts.map +1 -0
  202. package/dist/ledger.js +345 -0
  203. package/dist/ledger.js.map +1 -0
  204. package/dist/mcp-tools/projectTasks.d.ts.map +1 -1
  205. package/dist/mcp-tools/projectTasks.js +9 -14
  206. package/dist/mcp-tools/projectTasks.js.map +1 -1
  207. package/dist/mcp.js +0 -0
  208. package/dist/mcpAuditJobs.d.ts.map +1 -1
  209. package/dist/mcpAuditJobs.js +3 -0
  210. package/dist/mcpAuditJobs.js.map +1 -1
  211. package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
  212. package/dist/reporting/csvReportGenerator.js +7 -1
  213. package/dist/reporting/csvReportGenerator.js.map +1 -1
  214. package/dist/reporting/htmlReportGenerator.d.ts.map +1 -1
  215. package/dist/reporting/htmlReportGenerator.js +5 -1
  216. package/dist/reporting/htmlReportGenerator.js.map +1 -1
  217. package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
  218. package/dist/reporting/jsonReportGenerator.js +10 -2
  219. package/dist/reporting/jsonReportGenerator.js.map +1 -1
  220. package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
  221. package/dist/reporting/sarifReportGenerator.js +17 -17
  222. package/dist/reporting/sarifReportGenerator.js.map +1 -1
  223. package/dist/scripts/runBench.d.ts +94 -0
  224. package/dist/scripts/runBench.d.ts.map +1 -0
  225. package/dist/scripts/runBench.js +1559 -0
  226. package/dist/scripts/runBench.js.map +1 -0
  227. package/dist/search/QueryParser.d.ts.map +1 -1
  228. package/dist/search/QueryParser.js +51 -4
  229. package/dist/search/QueryParser.js.map +1 -1
  230. package/dist/services/CodeMapGenerator.d.ts +33 -0
  231. package/dist/services/CodeMapGenerator.d.ts.map +1 -1
  232. package/dist/services/CodeMapGenerator.js +404 -0
  233. package/dist/services/CodeMapGenerator.js.map +1 -1
  234. package/dist/styles/normalizer.d.ts +37 -0
  235. package/dist/styles/normalizer.d.ts.map +1 -0
  236. package/dist/styles/normalizer.js +301 -0
  237. package/dist/styles/normalizer.js.map +1 -0
  238. package/dist/styles/styleExtractor.d.ts +38 -0
  239. package/dist/styles/styleExtractor.d.ts.map +1 -0
  240. package/dist/styles/styleExtractor.js +630 -0
  241. package/dist/styles/styleExtractor.js.map +1 -0
  242. package/dist/styles/styleIndexer.d.ts +35 -0
  243. package/dist/styles/styleIndexer.d.ts.map +1 -0
  244. package/dist/styles/styleIndexer.js +266 -0
  245. package/dist/styles/styleIndexer.js.map +1 -0
  246. package/dist/styles/tailwindConfigLoader.d.ts +38 -0
  247. package/dist/styles/tailwindConfigLoader.d.ts.map +1 -0
  248. package/dist/styles/tailwindConfigLoader.js +374 -0
  249. package/dist/styles/tailwindConfigLoader.js.map +1 -0
  250. package/dist/styles/tailwindExpander.d.ts +38 -0
  251. package/dist/styles/tailwindExpander.d.ts.map +1 -0
  252. package/dist/styles/tailwindExpander.js +637 -0
  253. package/dist/styles/tailwindExpander.js.map +1 -0
  254. package/dist/styles/types.d.ts +92 -0
  255. package/dist/styles/types.d.ts.map +1 -0
  256. package/dist/styles/types.js +10 -0
  257. package/dist/styles/types.js.map +1 -0
  258. package/dist/symbols.d.ts +21 -0
  259. package/dist/symbols.d.ts.map +1 -0
  260. package/dist/symbols.js +31 -0
  261. package/dist/symbols.js.map +1 -0
  262. package/dist/types.d.ts +326 -3
  263. package/dist/types.d.ts.map +1 -1
  264. package/dist/types.js.map +1 -1
  265. package/package.json +9 -5
  266. package/plugin/.claude-plugin/plugin.json +1 -1
  267. package/plugin/scripts/hook-audit.sh +5 -1
  268. package/plugin/skills/code-auditor/SKILL.md +51 -0
  269. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts +0 -21
  270. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts.map +0 -1
  271. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js +0 -21
  272. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js.map +0 -1
  273. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts +0 -13
  274. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts.map +0 -1
  275. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js +0 -12
  276. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js.map +0 -1
  277. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts +0 -11
  278. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts.map +0 -1
  279. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js +0 -22
  280. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js.map +0 -1
  281. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts +0 -9
  282. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts.map +0 -1
  283. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js +0 -13
  284. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js.map +0 -1
  285. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts +0 -13
  286. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts.map +0 -1
  287. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js +0 -18
  288. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js.map +0 -1
  289. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts +0 -10
  290. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts.map +0 -1
  291. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js +0 -16
  292. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js.map +0 -1
  293. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts +0 -14
  294. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts.map +0 -1
  295. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js +0 -18
  296. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js.map +0 -1
  297. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts +0 -13
  298. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts.map +0 -1
  299. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js +0 -22
  300. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js.map +0 -1
  301. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts +0 -10
  302. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts.map +0 -1
  303. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js +0 -20
  304. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js.map +0 -1
  305. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts +0 -18
  306. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts.map +0 -1
  307. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js +0 -28
  308. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js.map +0 -1
  309. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts +0 -11
  310. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts.map +0 -1
  311. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js +0 -31
  312. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js.map +0 -1
  313. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts +0 -11
  314. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts.map +0 -1
  315. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js +0 -18
  316. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js.map +0 -1
  317. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts +0 -13
  318. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts.map +0 -1
  319. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js +0 -61
  320. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js.map +0 -1
  321. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts +0 -10
  322. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts.map +0 -1
  323. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js +0 -15
  324. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js.map +0 -1
  325. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts +0 -11
  326. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts.map +0 -1
  327. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js +0 -49
  328. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js.map +0 -1
  329. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts +0 -10
  330. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts.map +0 -1
  331. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js +0 -19
  332. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js.map +0 -1
  333. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts +0 -37
  334. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts.map +0 -1
  335. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js +0 -73
  336. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js.map +0 -1
  337. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts +0 -12
  338. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts.map +0 -1
  339. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js +0 -82
  340. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js.map +0 -1
  341. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts +0 -10
  342. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts.map +0 -1
  343. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js +0 -15
  344. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js.map +0 -1
  345. package/dist/analyzers/dataAccessAnalyzer.d.ts +0 -46
  346. package/dist/analyzers/dataAccessAnalyzer.d.ts.map +0 -1
  347. package/dist/analyzers/dataAccessAnalyzer.js +0 -474
  348. package/dist/analyzers/dataAccessAnalyzer.js.map +0 -1
  349. package/dist/analyzers/dryAnalyzer.d.ts +0 -31
  350. package/dist/analyzers/dryAnalyzer.d.ts.map +0 -1
  351. package/dist/analyzers/dryAnalyzer.js +0 -734
  352. package/dist/analyzers/dryAnalyzer.js.map +0 -1
  353. package/dist/analyzers/schemaAnalyzer.d.ts +0 -23
  354. package/dist/analyzers/schemaAnalyzer.d.ts.map +0 -1
  355. package/dist/analyzers/schemaAnalyzer.js +0 -564
  356. package/dist/analyzers/schemaAnalyzer.js.map +0 -1
  357. package/dist/analyzers/solidAnalyzer.d.ts +0 -33
  358. package/dist/analyzers/solidAnalyzer.d.ts.map +0 -1
  359. package/dist/analyzers/solidAnalyzer.js +0 -847
  360. package/dist/analyzers/solidAnalyzer.js.map +0 -1
@@ -1,82 +0,0 @@
1
- /**
2
- * Spec-17 R8 Fixture 11: unique-method-74-lines
3
- * Report section: R3.1 — Self-reference fix
4
- *
5
- * A single 74-line unique method should produce ZERO duplicate findings.
6
- * The self-reference fix (span-overlap check, R3.1) ensures a block
7
- * never cites itself as the "first occurrence."
8
- */
9
- export class ReportGenerator {
10
- generateReport(title, data) {
11
- // Line 1 of method body
12
- const header = `=== ${title} ===`;
13
- // Line 2
14
- const separator = "=".repeat(header.length);
15
- // Line 3
16
- let total = 0;
17
- // Line 4
18
- let min = Number.MAX_VALUE;
19
- // Line 5
20
- let max = Number.MIN_VALUE;
21
- // Line 6
22
- const processed = [];
23
- // Line 7
24
- for (const value of data) {
25
- // Line 8
26
- if (value > 0) {
27
- // Line 9
28
- processed.push(value);
29
- // Line 10
30
- total += value;
31
- // Line 11
32
- if (value < min)
33
- min = value;
34
- // Line 12
35
- if (value > max)
36
- max = value;
37
- // Line 13
38
- }
39
- // Line 14
40
- }
41
- // Line 15
42
- const average = processed.length > 0 ? total / processed.length : 0;
43
- // Line 16
44
- const lines = [];
45
- // Line 17
46
- lines.push(header);
47
- // Line 18
48
- lines.push(separator);
49
- // Line 19
50
- lines.push(`Count: ${processed.length}`);
51
- // Line 20
52
- lines.push(`Total: ${total}`);
53
- // Line 21
54
- lines.push(`Average: ${average.toFixed(2)}`);
55
- // Line 22
56
- lines.push(`Min: ${min}`);
57
- // Line 23
58
- lines.push(`Max: ${max}`);
59
- // Line 24
60
- lines.push(`Range: ${max - min}`);
61
- // Line 25
62
- if (processed.length > 0) {
63
- // Line 26
64
- lines.push("---");
65
- // Line 27
66
- lines.push("Details:");
67
- // Line 28
68
- for (let i = 0; i < processed.length; i++) {
69
- // Line 29
70
- lines.push(` ${i + 1}. ${processed[i]}`);
71
- // Line 30
72
- }
73
- // Line 31
74
- }
75
- // Line 32
76
- lines.push(separator);
77
- // Line 33
78
- return lines.join("\n");
79
- // Line 34
80
- }
81
- }
82
- //# sourceMappingURL=unique-method-74-lines.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unique-method-74-lines.js","sourceRoot":"","sources":["../../../../../src/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,OAAO,eAAe;IACnB,cAAc,CAAC,KAAa,EAAE,IAAc;QACjD,wBAAwB;QACxB,MAAM,MAAM,GAAG,OAAO,KAAK,MAAM,CAAC;QAClC,SAAS;QACT,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,SAAS;QACT,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,SAAS;QACT,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;QAC3B,SAAS;QACT,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;QAC3B,SAAS;QACT,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,SAAS;QACT,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,SAAS;YACT,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,SAAS;gBACT,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtB,UAAU;gBACV,KAAK,IAAI,KAAK,CAAC;gBACf,UAAU;gBACV,IAAI,KAAK,GAAG,GAAG;oBAAE,GAAG,GAAG,KAAK,CAAC;gBAC7B,UAAU;gBACV,IAAI,KAAK,GAAG,GAAG;oBAAE,GAAG,GAAG,KAAK,CAAC;gBAC7B,UAAU;YACZ,CAAC;YACD,UAAU;QACZ,CAAC;QACD,UAAU;QACV,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,UAAU;QACV,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,UAAU,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QACzC,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QAC9B,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7C,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAC1B,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAC1B,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;QAClC,UAAU;QACV,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,UAAU;YACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,UAAU;YACV,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvB,UAAU;YACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,UAAU;gBACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1C,UAAU;YACZ,CAAC;YACD,UAAU;QACZ,CAAC;QACD,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,UAAU;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,UAAU;IACZ,CAAC;CACF"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Spec-17 R8 Fixture 7: word-the-in-comment
3
- * Report section: R2.1 — SQL-context-only extraction
4
- *
5
- * The word "the" appearing in a comment or string literal should produce
6
- * ZERO schema findings. This was a ~4,500-count false positive in the
7
- * diagnostic: the old regex matched "the" in comments as a table ref.
8
- */
9
- export declare function tellTheStory(): string;
10
- //# sourceMappingURL=word-the-in-comment.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"word-the-in-comment.d.ts","sourceRoot":"","sources":["../../../../../src/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,wBAAgB,YAAY,IAAI,MAAM,CAGrC"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Spec-17 R8 Fixture 7: word-the-in-comment
3
- * Report section: R2.1 — SQL-context-only extraction
4
- *
5
- * The word "the" appearing in a comment or string literal should produce
6
- * ZERO schema findings. This was a ~4,500-count false positive in the
7
- * diagnostic: the old regex matched "the" in comments as a table ref.
8
- */
9
- // The quick brown fox jumps over the lazy dog
10
- // The answer to life, the universe, and everything
11
- export function tellTheStory() {
12
- const message = "the hero returns from the journey";
13
- return message;
14
- }
15
- //# sourceMappingURL=word-the-in-comment.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"word-the-in-comment.js","sourceRoot":"","sources":["../../../../../src/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,8CAA8C;AAC9C,mDAAmD;AAEnD,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,mCAAmC,CAAC;IACpD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,46 +0,0 @@
1
- /**
2
- * Data Access Analyzer (Functional)
3
- * Analyzes database access patterns and data layer interactions
4
- *
5
- * Detects database usage, query patterns, performance risks,
6
- * and security concerns in data access code
7
- */
8
- import { AnalyzerDefinition } from '../types.js';
9
- /**
10
- * Configuration for Data Access analyzer
11
- */
12
- export interface DataAccessAnalyzerConfig {
13
- databases?: {
14
- [key: string]: {
15
- name: string;
16
- importPatterns: string[];
17
- queryPatterns: string[];
18
- ormPatterns?: string[];
19
- };
20
- };
21
- organizationPatterns?: string[];
22
- tablePatterns?: {
23
- orm?: RegExp[];
24
- sql?: RegExp[];
25
- queryBuilder?: RegExp[];
26
- };
27
- performanceThresholds?: {
28
- complexQueryCount?: number;
29
- unfilteredQueryCount?: number;
30
- joinedTableCount?: number;
31
- };
32
- securityPatterns?: {
33
- sqlInjectionRisks?: string[];
34
- parameterizedQueries?: string[];
35
- };
36
- sourcePatterns?: {
37
- api?: string[];
38
- page?: string[];
39
- service?: string[];
40
- };
41
- }
42
- /**
43
- * Data Access Analyzer definition
44
- */
45
- export declare const dataAccessAnalyzer: AnalyzerDefinition;
46
- //# sourceMappingURL=dataAccessAnalyzer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dataAccessAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/dataAccessAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAIL,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AA0BrB;;GAEG;AACH,MAAM,WAAW,wBAAwB;IAEvC,SAAS,CAAC,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,IAAI,EAAE,MAAM,CAAC;YACb,cAAc,EAAE,MAAM,EAAE,CAAC;YACzB,aAAa,EAAE,MAAM,EAAE,CAAC;YACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;SACxB,CAAC;KACH,CAAC;IAGF,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAGhC,aAAa,CAAC,EAAE;QACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IAGF,qBAAqB,CAAC,EAAE;QACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAGF,gBAAgB,CAAC,EAAE;QACjB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC;IAGF,cAAc,CAAC,EAAE;QACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AA6hBD;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,kBA8BhC,CAAC"}
@@ -1,474 +0,0 @@
1
- /**
2
- * Data Access Analyzer (Functional)
3
- * Analyzes database access patterns and data layer interactions
4
- *
5
- * Detects database usage, query patterns, performance risks,
6
- * and security concerns in data access code
7
- */
8
- import { processFiles, createViolation } from './analyzerUtils.js';
9
- import { getImports, findNodesByKind, getLineAndColumn } from '../utils/astUtils.js';
10
- // ---------------------------------------------------------------------------
11
- // Helpers
12
- // ---------------------------------------------------------------------------
13
- /** Get raw text from a tree-sitter node stored on ASTNode.raw. */
14
- function rawText(node) {
15
- return node.raw?.text ?? '';
16
- }
17
- /**
18
- * Default configuration
19
- */
20
- const DEFAULT_CONFIG = {
21
- databases: {
22
- 'primary': {
23
- name: 'Primary Database',
24
- importPatterns: ['/database/', '/db/', 'drizzle', 'prisma', 'typeorm'],
25
- queryPatterns: ['select', 'insert', 'update', 'delete', 'query'],
26
- ormPatterns: ['from', 'where', 'join', 'orderBy', 'groupBy']
27
- },
28
- 'secondary': {
29
- name: 'Secondary Database',
30
- importPatterns: ['/analytics/', '/reporting/'],
31
- queryPatterns: ['query', 'execute', 'run'],
32
- ormPatterns: []
33
- }
34
- },
35
- organizationPatterns: [
36
- 'organizationId',
37
- 'organization_id',
38
- 'orgId',
39
- 'org_id',
40
- 'tenantId',
41
- 'tenant_id',
42
- 'companyId',
43
- 'company_id',
44
- 'filterByOrganization',
45
- 'whereOrganization',
46
- 'scopeToOrg'
47
- ],
48
- tablePatterns: {
49
- orm: [
50
- /\.from\(['"`]?(\w+)['"`]?\)/g,
51
- /\.table\(['"`]?(\w+)['"`]?\)/g,
52
- /\.into\(['"`]?(\w+)['"`]?\)/g,
53
- /\.update\(['"`]?(\w+)['"`]?\)/g
54
- ],
55
- sql: [
56
- /(?:FROM|JOIN|INTO|UPDATE)\s+['"`]?(\w+)['"`]?/gi,
57
- /(?:INSERT\s+INTO)\s+['"`]?(\w+)['"`]?/gi,
58
- /(?:DELETE\s+FROM)\s+['"`]?(\w+)['"`]?/gi
59
- ],
60
- queryBuilder: [
61
- /table:\s*['"`](\w+)['"`]/g,
62
- /from:\s*['"`](\w+)['"`]/g
63
- ]
64
- },
65
- performanceThresholds: {
66
- complexQueryCount: 3,
67
- unfilteredQueryCount: 5,
68
- joinedTableCount: 2
69
- },
70
- securityPatterns: {
71
- sqlInjectionRisks: [
72
- 'concatenation',
73
- '${',
74
- 'string interpolation',
75
- '+ variable',
76
- 'raw(',
77
- 'unsafeRaw'
78
- ],
79
- parameterizedQueries: [
80
- 'prepared',
81
- 'parameterized',
82
- 'bind',
83
- '?',
84
- '$1',
85
- ':param'
86
- ]
87
- },
88
- sourcePatterns: {
89
- api: ['/api/', '/routes/', '/endpoints/'],
90
- page: ['/pages/', '/app/', '/views/'],
91
- service: ['/services/', '/lib/', '/utils/']
92
- }
93
- };
94
- // ---------------------------------------------------------------------------
95
- // Main analysis
96
- // ---------------------------------------------------------------------------
97
- /**
98
- * Analyze a single file for data access patterns.
99
- * Now accepts a pre-parsed AST (from processFiles) instead of parsing internally.
100
- */
101
- async function analyzeFile(filePath, ast, config, sourceCode) {
102
- const imports = getImports(ast.root);
103
- const patterns = [];
104
- const violations = [];
105
- // Extract database calls
106
- const dbCalls = extractDatabaseCalls(ast.root, imports, filePath, config, sourceCode);
107
- // Group calls by database type
108
- const callsByDb = new Map();
109
- dbCalls.forEach(call => {
110
- if (!callsByDb.has(call.type)) {
111
- callsByDb.set(call.type, []);
112
- }
113
- callsByDb.get(call.type).push(call);
114
- });
115
- // Create patterns for each database type used
116
- callsByDb.forEach((calls, dbType) => {
117
- const allTables = new Set();
118
- const queries = [];
119
- let hasOrgFilter = false;
120
- let hasSqlInjectionRisk = false;
121
- calls.forEach(call => {
122
- call.tables.forEach(table => allTables.add(table));
123
- hasOrgFilter = hasOrgFilter || call.hasOrganizationFilter;
124
- hasSqlInjectionRisk = hasSqlInjectionRisk || call.hasSqlInjectionRisk;
125
- // Create query info with enhanced analysis
126
- const queryInfo = extractQueryInfo(call, config);
127
- queries.push(queryInfo);
128
- });
129
- const pattern = {
130
- source: detectSourceType(filePath, config),
131
- filePath,
132
- database: dbType,
133
- tables: Array.from(allTables),
134
- queries,
135
- hasOrganizationFilter: hasOrgFilter,
136
- performanceRisk: assessPerformanceRisk(queries, config),
137
- hasSqlInjectionRisk
138
- };
139
- patterns.push(pattern);
140
- // Check for violations
141
- violations.push(...checkDataAccessViolations(pattern));
142
- });
143
- return { patterns, violations };
144
- }
145
- /**
146
- * Detect source type based on file path
147
- */
148
- function detectSourceType(filePath, config) {
149
- if (config.sourcePatterns.api.some(pattern => filePath.includes(pattern))) {
150
- return 'api';
151
- }
152
- else if (config.sourcePatterns.page.some(pattern => filePath.includes(pattern))) {
153
- return 'component';
154
- }
155
- else if (config.sourcePatterns.service.some(pattern => filePath.includes(pattern))) {
156
- return 'service';
157
- }
158
- return 'service';
159
- }
160
- /**
161
- * Extract database calls from the AST.
162
- * Uses tree-sitter call_expression nodes instead of TS API.
163
- */
164
- function extractDatabaseCalls(ast, imports, filePath, config, sourceCode) {
165
- const calls = [];
166
- // Map imports to database types
167
- const dbImports = mapDatabaseImports(imports, config);
168
- // Find all call expressions using tree-sitter node type
169
- const callExpressions = findNodesByKind(ast, 'call_expression');
170
- callExpressions.forEach(callExpr => {
171
- const callText = rawText(callExpr);
172
- const { line, column } = getLineAndColumn(callExpr);
173
- // Check each configured database
174
- Object.entries(dbImports).forEach(([dbType, importInfo]) => {
175
- if (importInfo.hasImports && isDatabaseCall(callText, importInfo)) {
176
- const tables = extractTablesFromCall(callText, config);
177
- const hasOrgFilter = checkOrganizationFilter(callText, config);
178
- const securityCheck = checkQuerySecurity(callText, config);
179
- calls.push({
180
- type: dbType,
181
- method: extractMethodName(callExpr),
182
- file: filePath,
183
- line,
184
- column,
185
- tables,
186
- hasOrganizationFilter: hasOrgFilter,
187
- hasParameterizedQuery: securityCheck.parameterized,
188
- hasSqlInjectionRisk: securityCheck.injectionRisk
189
- });
190
- }
191
- });
192
- });
193
- return calls;
194
- }
195
- /**
196
- * Map imports to database types
197
- */
198
- function mapDatabaseImports(imports, config) {
199
- const result = {};
200
- Object.entries(config.databases).forEach(([key, dbConfig]) => {
201
- const importNames = [];
202
- let hasImports = false;
203
- imports.forEach(imp => {
204
- if (dbConfig.importPatterns.some((pattern) => imp.moduleSpecifier.includes(pattern))) {
205
- hasImports = true;
206
- importNames.push(...imp.importedNames);
207
- }
208
- });
209
- result[key] = {
210
- hasImports,
211
- importNames,
212
- patterns: [...dbConfig.queryPatterns, ...importNames]
213
- };
214
- });
215
- return result;
216
- }
217
- /**
218
- * Check if a call is a database call
219
- */
220
- function isDatabaseCall(callText, importInfo) {
221
- if (!importInfo.hasImports)
222
- return false;
223
- return importInfo.patterns.some(pattern => callText.includes(pattern));
224
- }
225
- /**
226
- * Extract method name from a tree-sitter call_expression node.
227
- *
228
- * call_expression node structure:
229
- * children[0] = identifier (e.g., "query()")
230
- * OR
231
- * children[0] = member_expression (e.g., "db.query()")
232
- * children[0] = identifier (e.g., "db")
233
- * children[1] = "."
234
- * children[2] = property_identifier (e.g., "query")
235
- */
236
- function extractMethodName(callExpr) {
237
- const expression = callExpr.children?.[0];
238
- if (!expression)
239
- return 'unknown';
240
- if (expression.type === 'member_expression') {
241
- // e.g., db.query() — the property_identifier child holds the method name
242
- const propId = expression.children?.find(c => c.type === 'property_identifier');
243
- if (propId) {
244
- return rawText(propId);
245
- }
246
- }
247
- else if (expression.type === 'identifier') {
248
- // e.g., query()
249
- return rawText(expression);
250
- }
251
- return 'unknown';
252
- }
253
- /**
254
- * Extract table names from call
255
- */
256
- function extractTablesFromCall(callText, config) {
257
- const tables = new Set();
258
- // Try all table extraction patterns
259
- Object.values(config.tablePatterns).forEach(patterns => {
260
- patterns.forEach(pattern => {
261
- const matches = Array.from(callText.matchAll(pattern));
262
- matches.forEach(match => {
263
- if (match[1]) {
264
- tables.add(match[1].toLowerCase());
265
- }
266
- });
267
- });
268
- });
269
- return Array.from(tables);
270
- }
271
- /**
272
- * Check for organization filtering
273
- */
274
- function checkOrganizationFilter(callText, config) {
275
- return config.organizationPatterns.some(pattern => callText.toLowerCase().includes(pattern.toLowerCase()));
276
- }
277
- /**
278
- * Check query security
279
- */
280
- function checkQuerySecurity(callText, config) {
281
- const hasParameterized = config.securityPatterns.parameterizedQueries.some(pattern => callText.includes(pattern));
282
- const hasInjectionRisk = config.securityPatterns.sqlInjectionRisks.some(pattern => callText.includes(pattern));
283
- return {
284
- parameterized: hasParameterized,
285
- injectionRisk: hasInjectionRisk && !hasParameterized
286
- };
287
- }
288
- /**
289
- * Extract query info from database call
290
- */
291
- function extractQueryInfo(call, config) {
292
- return {
293
- type: inferQueryType(call.method),
294
- tables: call.tables,
295
- line: call.line,
296
- hasJoins: detectJoins(call.method),
297
- hasOrganizationFilter: call.hasOrganizationFilter,
298
- complexity: analyzeQueryComplexity(call, config)
299
- };
300
- }
301
- /**
302
- * Infer query type from method name
303
- */
304
- function inferQueryType(method) {
305
- const methodLower = method.toLowerCase();
306
- if (methodLower.includes('select') || methodLower.includes('find') || methodLower.includes('get')) {
307
- return 'select';
308
- }
309
- else if (methodLower.includes('insert') || methodLower.includes('create')) {
310
- return 'insert';
311
- }
312
- else if (methodLower.includes('update')) {
313
- return 'update';
314
- }
315
- else if (methodLower.includes('delete') || methodLower.includes('remove')) {
316
- return 'delete';
317
- }
318
- return 'other';
319
- }
320
- /**
321
- * Detect if a query has joins
322
- */
323
- function detectJoins(method) {
324
- const joinPatterns = [
325
- 'join',
326
- 'leftJoin',
327
- 'rightJoin',
328
- 'innerJoin',
329
- 'outerJoin',
330
- 'fullJoin'
331
- ];
332
- return joinPatterns.some(pattern => method.toLowerCase().includes(pattern.toLowerCase()));
333
- }
334
- /**
335
- * Analyze query complexity
336
- */
337
- function analyzeQueryComplexity(call, config) {
338
- let complexityScore = 0;
339
- // Table count factor
340
- if (call.tables.length > config.performanceThresholds.joinedTableCount) {
341
- complexityScore += 2;
342
- }
343
- else if (call.tables.length > 1) {
344
- complexityScore += 1;
345
- }
346
- // Method complexity
347
- if (detectJoins(call.method)) {
348
- complexityScore += 2;
349
- }
350
- // Security risk adds complexity
351
- if (call.hasSqlInjectionRisk) {
352
- complexityScore += 3;
353
- }
354
- // Missing org filter in multi-tenant context
355
- if (!call.hasOrganizationFilter && call.tables.length > 0) {
356
- complexityScore += 1;
357
- }
358
- // Determine complexity level
359
- if (complexityScore >= 5)
360
- return 'complex';
361
- if (complexityScore >= 2)
362
- return 'moderate';
363
- return 'simple';
364
- }
365
- /**
366
- * Assess performance risk based on queries
367
- */
368
- function assessPerformanceRisk(queries, config) {
369
- // Count complex queries
370
- const complexQueries = queries.filter(q => q.hasJoins ||
371
- q.tables.length > config.performanceThresholds.joinedTableCount ||
372
- q.complexity === 'complex').length;
373
- // Count queries without org filter
374
- const unfiltered = queries.filter(q => !q.hasOrganizationFilter).length;
375
- if (complexQueries > config.performanceThresholds.complexQueryCount ||
376
- unfiltered > config.performanceThresholds.unfilteredQueryCount) {
377
- return 'high';
378
- }
379
- else if (complexQueries > 1 || unfiltered > 2) {
380
- return 'medium';
381
- }
382
- return 'low';
383
- }
384
- /**
385
- * Check for data access violations
386
- */
387
- function checkDataAccessViolations(pattern) {
388
- const violations = [];
389
- // Check for missing organization filter in multi-tenant scenarios
390
- if (!pattern.hasOrganizationFilter && pattern.tables.length > 0) {
391
- violations.push(createViolation({
392
- analyzer: 'data-access',
393
- severity: 'warning',
394
- type: 'data-access',
395
- file: pattern.filePath,
396
- line: 1,
397
- column: 1,
398
- message: 'Database queries may be missing tenant/organization filtering',
399
- recommendation: 'Add appropriate filtering to ensure data isolation in multi-tenant environments',
400
- estimatedEffort: 'small'
401
- }));
402
- }
403
- // Check for SQL injection risks
404
- if (pattern.hasSqlInjectionRisk) {
405
- violations.push(createViolation({
406
- analyzer: 'data-access',
407
- severity: 'critical',
408
- type: 'data-access',
409
- file: pattern.filePath,
410
- line: 1,
411
- column: 1,
412
- message: 'Potential SQL injection vulnerability detected',
413
- recommendation: 'Use parameterized queries or prepared statements instead of string concatenation',
414
- estimatedEffort: 'medium'
415
- }));
416
- }
417
- // Check for performance risks
418
- if (pattern.performanceRisk === 'high') {
419
- violations.push(createViolation({
420
- analyzer: 'data-access',
421
- severity: 'warning',
422
- type: 'data-access',
423
- file: pattern.filePath,
424
- line: 1,
425
- column: 1,
426
- message: 'High performance risk detected in data access patterns',
427
- recommendation: 'Optimize queries, add indexes, implement caching, or paginate results',
428
- estimatedEffort: 'medium'
429
- }));
430
- }
431
- // Check for direct database access in presentation layer
432
- if (pattern.source === 'component') {
433
- violations.push(createViolation({
434
- analyzer: 'data-access',
435
- severity: 'suggestion',
436
- type: 'data-access',
437
- file: pattern.filePath,
438
- line: 1,
439
- column: 1,
440
- message: 'Direct database access detected in presentation layer',
441
- recommendation: 'Consider moving data access to service layer or API endpoints for better separation of concerns',
442
- estimatedEffort: 'medium'
443
- }));
444
- }
445
- return violations;
446
- }
447
- // ---------------------------------------------------------------------------
448
- // Analyzer definition
449
- // ---------------------------------------------------------------------------
450
- /**
451
- * Data Access Analyzer definition
452
- */
453
- export const dataAccessAnalyzer = {
454
- name: 'data-access',
455
- defaultConfig: DEFAULT_CONFIG,
456
- analyze: async (files, config, options, progressCallback) => {
457
- const mergedConfig = { ...DEFAULT_CONFIG, ...config };
458
- // Custom processor to handle patterns collection
459
- const patterns = [];
460
- const allViolations = [];
461
- const result = await processFiles(files, async (filePath, ast, procConfig, sourceCode) => {
462
- const fileResult = await analyzeFile(filePath, ast, mergedConfig, sourceCode);
463
- patterns.push(...fileResult.patterns);
464
- allViolations.push(...fileResult.violations);
465
- return fileResult.violations;
466
- }, 'data-access', mergedConfig, progressCallback ?
467
- (current, total, file) => progressCallback({ current, total, analyzer: 'data-access', file }) :
468
- undefined);
469
- // Override violations with our collected ones
470
- result.violations = allViolations;
471
- return result;
472
- }
473
- };
474
- //# sourceMappingURL=dataAccessAnalyzer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dataAccessAnalyzer.js","sourceRoot":"","sources":["../../src/analyzers/dataAccessAnalyzer.ts"],"names":[],"mappings":"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"}