code-auditor-mcp 3.1.1 → 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 (357) 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 -2
  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 -3
  25. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -1
  26. package/dist/analyzers/cross-language/SchemaValidator.d.ts +1 -1
  27. package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
  28. package/dist/analyzers/cross-language/SchemaValidator.js +2 -2
  29. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  30. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +83 -0
  31. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -0
  32. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +611 -0
  33. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -0
  34. package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
  35. package/dist/analyzers/documentationAnalyzer.js +8 -4
  36. package/dist/analyzers/documentationAnalyzer.js.map +1 -1
  37. package/dist/analyzers/orm/adapterRegistry.d.ts +41 -0
  38. package/dist/analyzers/orm/adapterRegistry.d.ts.map +1 -0
  39. package/dist/analyzers/orm/adapterRegistry.js +73 -0
  40. package/dist/analyzers/orm/adapterRegistry.js.map +1 -0
  41. package/dist/analyzers/orm/drizzleAdapter.d.ts +42 -0
  42. package/dist/analyzers/orm/drizzleAdapter.d.ts.map +1 -0
  43. package/dist/analyzers/orm/drizzleAdapter.js +166 -0
  44. package/dist/analyzers/orm/drizzleAdapter.js.map +1 -0
  45. package/dist/analyzers/orm/index.d.ts +14 -0
  46. package/dist/analyzers/orm/index.d.ts.map +1 -0
  47. package/dist/analyzers/orm/index.js +24 -0
  48. package/dist/analyzers/orm/index.js.map +1 -0
  49. package/dist/analyzers/orm/prismaAdapter.d.ts +45 -0
  50. package/dist/analyzers/orm/prismaAdapter.d.ts.map +1 -0
  51. package/dist/analyzers/orm/prismaAdapter.js +170 -0
  52. package/dist/analyzers/orm/prismaAdapter.js.map +1 -0
  53. package/dist/analyzers/orm/types.d.ts +63 -0
  54. package/dist/analyzers/orm/types.d.ts.map +1 -0
  55. package/dist/analyzers/orm/types.js +10 -0
  56. package/dist/analyzers/orm/types.js.map +1 -0
  57. package/dist/analyzers/provenance.d.ts +133 -0
  58. package/dist/analyzers/provenance.d.ts.map +1 -0
  59. package/dist/analyzers/provenance.js +1041 -0
  60. package/dist/analyzers/provenance.js.map +1 -0
  61. package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
  62. package/dist/analyzers/reactAnalyzer.js +117 -1
  63. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  64. package/dist/analyzers/ruleRegistry.d.ts +38 -0
  65. package/dist/analyzers/ruleRegistry.d.ts.map +1 -0
  66. package/dist/analyzers/ruleRegistry.js +123 -0
  67. package/dist/analyzers/ruleRegistry.js.map +1 -0
  68. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts +58 -0
  69. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -0
  70. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +445 -0
  71. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -0
  72. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +52 -0
  73. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  74. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +108 -26
  75. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  76. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +64 -0
  77. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  78. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +259 -53
  79. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  80. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
  81. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +5 -15
  82. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  83. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  84. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +10 -10
  85. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
  86. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +25 -0
  87. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  88. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +250 -59
  89. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  90. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +103 -0
  91. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -0
  92. package/dist/analyzers/universal/UniversalStylesAnalyzer.js +750 -0
  93. package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -0
  94. package/dist/auditRunner.d.ts.map +1 -1
  95. package/dist/auditRunner.js +483 -3
  96. package/dist/auditRunner.js.map +1 -1
  97. package/dist/baseline.d.ts +98 -0
  98. package/dist/baseline.d.ts.map +1 -0
  99. package/dist/baseline.js +184 -0
  100. package/dist/baseline.js.map +1 -0
  101. package/dist/churn/churnExtractor.d.ts +32 -0
  102. package/dist/churn/churnExtractor.d.ts.map +1 -0
  103. package/dist/churn/churnExtractor.js +261 -0
  104. package/dist/churn/churnExtractor.js.map +1 -0
  105. package/dist/cli.js +1215 -11
  106. package/dist/cli.js.map +1 -1
  107. package/dist/codeIndexDB-enhanced.js +1 -1
  108. package/dist/codeIndexDB-enhanced.js.map +1 -1
  109. package/dist/codeIndexDB.d.ts +101 -0
  110. package/dist/codeIndexDB.d.ts.map +1 -1
  111. package/dist/codeIndexDB.js +661 -5
  112. package/dist/codeIndexDB.js.map +1 -1
  113. package/dist/config/configLoader.d.ts.map +1 -1
  114. package/dist/config/configLoader.js +95 -1
  115. package/dist/config/configLoader.js.map +1 -1
  116. package/dist/config/defaults.d.ts +72 -1
  117. package/dist/config/defaults.d.ts.map +1 -1
  118. package/dist/config/defaults.js +146 -15
  119. package/dist/config/defaults.js.map +1 -1
  120. package/dist/config/pathProfiles.d.ts +38 -0
  121. package/dist/config/pathProfiles.d.ts.map +1 -0
  122. package/dist/config/pathProfiles.js +47 -0
  123. package/dist/config/pathProfiles.js.map +1 -0
  124. package/dist/conventions/conventionMiner.d.ts +63 -0
  125. package/dist/conventions/conventionMiner.d.ts.map +1 -0
  126. package/dist/conventions/conventionMiner.js +696 -0
  127. package/dist/conventions/conventionMiner.js.map +1 -0
  128. package/dist/coverage/coverageService.d.ts +49 -0
  129. package/dist/coverage/coverageService.d.ts.map +1 -0
  130. package/dist/coverage/coverageService.js +117 -0
  131. package/dist/coverage/coverageService.js.map +1 -0
  132. package/dist/coverage/istanbulParser.d.ts +84 -0
  133. package/dist/coverage/istanbulParser.d.ts.map +1 -0
  134. package/dist/coverage/istanbulParser.js +120 -0
  135. package/dist/coverage/istanbulParser.js.map +1 -0
  136. package/dist/coverage/lcovParser.d.ts +40 -0
  137. package/dist/coverage/lcovParser.d.ts.map +1 -0
  138. package/dist/coverage/lcovParser.js +168 -0
  139. package/dist/coverage/lcovParser.js.map +1 -0
  140. package/dist/fingerprint.d.ts +17 -0
  141. package/dist/fingerprint.d.ts.map +1 -1
  142. package/dist/fingerprint.js +42 -0
  143. package/dist/fingerprint.js.map +1 -1
  144. package/dist/grammars/tree-sitter-css.wasm +0 -0
  145. package/dist/graph/blastRadius.d.ts +27 -0
  146. package/dist/graph/blastRadius.d.ts.map +1 -0
  147. package/dist/graph/blastRadius.js +150 -0
  148. package/dist/graph/blastRadius.js.map +1 -0
  149. package/dist/graph/callGraph.d.ts +78 -0
  150. package/dist/graph/callGraph.d.ts.map +1 -0
  151. package/dist/graph/callGraph.js +484 -0
  152. package/dist/graph/callGraph.js.map +1 -0
  153. package/dist/graph/importGraph.d.ts +91 -0
  154. package/dist/graph/importGraph.d.ts.map +1 -0
  155. package/dist/graph/importGraph.js +602 -0
  156. package/dist/graph/importGraph.js.map +1 -0
  157. package/dist/graph/outputFormatter.d.ts +55 -0
  158. package/dist/graph/outputFormatter.d.ts.map +1 -0
  159. package/dist/graph/outputFormatter.js +283 -0
  160. package/dist/graph/outputFormatter.js.map +1 -0
  161. package/dist/hooks/codex.d.ts +36 -1
  162. package/dist/hooks/codex.d.ts.map +1 -1
  163. package/dist/hooks/codex.js +88 -54
  164. package/dist/hooks/codex.js.map +1 -1
  165. package/dist/hotspots/hotspotScorer.d.ts +20 -0
  166. package/dist/hotspots/hotspotScorer.d.ts.map +1 -0
  167. package/dist/hotspots/hotspotScorer.js +202 -0
  168. package/dist/hotspots/hotspotScorer.js.map +1 -0
  169. package/dist/invariants/invariant-rules.schema.json +42 -1
  170. package/dist/invariants/ruleEngine.d.ts +4 -1
  171. package/dist/invariants/ruleEngine.d.ts.map +1 -1
  172. package/dist/invariants/ruleEngine.js +141 -5
  173. package/dist/invariants/ruleEngine.js.map +1 -1
  174. package/dist/invariants/ruleValidator.d.ts.map +1 -1
  175. package/dist/invariants/ruleValidator.js +62 -1
  176. package/dist/invariants/ruleValidator.js.map +1 -1
  177. package/dist/invariants/types.d.ts +23 -2
  178. package/dist/invariants/types.d.ts.map +1 -1
  179. package/dist/languages/UniversalAnalyzer.d.ts +1 -1
  180. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
  181. package/dist/languages/UniversalAnalyzer.js +61 -4
  182. package/dist/languages/UniversalAnalyzer.js.map +1 -1
  183. package/dist/languages/index.d.ts +1 -0
  184. package/dist/languages/index.d.ts.map +1 -1
  185. package/dist/languages/index.js +3 -0
  186. package/dist/languages/index.js.map +1 -1
  187. package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts +59 -0
  188. package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts.map +1 -0
  189. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +236 -0
  190. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js.map +1 -0
  191. package/dist/languages/tree-sitter/parser.d.ts.map +1 -1
  192. package/dist/languages/tree-sitter/parser.js +2 -0
  193. package/dist/languages/tree-sitter/parser.js.map +1 -1
  194. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
  195. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +61 -10
  196. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
  197. package/dist/ledger.d.ts +128 -0
  198. package/dist/ledger.d.ts.map +1 -0
  199. package/dist/ledger.js +345 -0
  200. package/dist/ledger.js.map +1 -0
  201. package/dist/mcp-tools/projectTasks.d.ts.map +1 -1
  202. package/dist/mcp-tools/projectTasks.js +9 -14
  203. package/dist/mcp-tools/projectTasks.js.map +1 -1
  204. package/dist/mcp.js +0 -0
  205. package/dist/mcpAuditJobs.d.ts.map +1 -1
  206. package/dist/mcpAuditJobs.js +3 -0
  207. package/dist/mcpAuditJobs.js.map +1 -1
  208. package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
  209. package/dist/reporting/csvReportGenerator.js +7 -1
  210. package/dist/reporting/csvReportGenerator.js.map +1 -1
  211. package/dist/reporting/htmlReportGenerator.d.ts.map +1 -1
  212. package/dist/reporting/htmlReportGenerator.js +5 -1
  213. package/dist/reporting/htmlReportGenerator.js.map +1 -1
  214. package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
  215. package/dist/reporting/jsonReportGenerator.js +10 -2
  216. package/dist/reporting/jsonReportGenerator.js.map +1 -1
  217. package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
  218. package/dist/reporting/sarifReportGenerator.js +17 -17
  219. package/dist/reporting/sarifReportGenerator.js.map +1 -1
  220. package/dist/scripts/runBench.d.ts +94 -0
  221. package/dist/scripts/runBench.d.ts.map +1 -0
  222. package/dist/scripts/runBench.js +1559 -0
  223. package/dist/scripts/runBench.js.map +1 -0
  224. package/dist/search/QueryParser.d.ts.map +1 -1
  225. package/dist/search/QueryParser.js +51 -4
  226. package/dist/search/QueryParser.js.map +1 -1
  227. package/dist/services/CodeMapGenerator.d.ts +33 -0
  228. package/dist/services/CodeMapGenerator.d.ts.map +1 -1
  229. package/dist/services/CodeMapGenerator.js +404 -0
  230. package/dist/services/CodeMapGenerator.js.map +1 -1
  231. package/dist/styles/normalizer.d.ts +37 -0
  232. package/dist/styles/normalizer.d.ts.map +1 -0
  233. package/dist/styles/normalizer.js +301 -0
  234. package/dist/styles/normalizer.js.map +1 -0
  235. package/dist/styles/styleExtractor.d.ts +38 -0
  236. package/dist/styles/styleExtractor.d.ts.map +1 -0
  237. package/dist/styles/styleExtractor.js +630 -0
  238. package/dist/styles/styleExtractor.js.map +1 -0
  239. package/dist/styles/styleIndexer.d.ts +35 -0
  240. package/dist/styles/styleIndexer.d.ts.map +1 -0
  241. package/dist/styles/styleIndexer.js +266 -0
  242. package/dist/styles/styleIndexer.js.map +1 -0
  243. package/dist/styles/tailwindConfigLoader.d.ts +38 -0
  244. package/dist/styles/tailwindConfigLoader.d.ts.map +1 -0
  245. package/dist/styles/tailwindConfigLoader.js +374 -0
  246. package/dist/styles/tailwindConfigLoader.js.map +1 -0
  247. package/dist/styles/tailwindExpander.d.ts +38 -0
  248. package/dist/styles/tailwindExpander.d.ts.map +1 -0
  249. package/dist/styles/tailwindExpander.js +637 -0
  250. package/dist/styles/tailwindExpander.js.map +1 -0
  251. package/dist/styles/types.d.ts +92 -0
  252. package/dist/styles/types.d.ts.map +1 -0
  253. package/dist/styles/types.js +10 -0
  254. package/dist/styles/types.js.map +1 -0
  255. package/dist/symbols.d.ts +21 -0
  256. package/dist/symbols.d.ts.map +1 -0
  257. package/dist/symbols.js +31 -0
  258. package/dist/symbols.js.map +1 -0
  259. package/dist/types.d.ts +326 -3
  260. package/dist/types.d.ts.map +1 -1
  261. package/dist/types.js.map +1 -1
  262. package/package.json +9 -5
  263. package/plugin/.claude-plugin/plugin.json +1 -1
  264. package/plugin/scripts/hook-audit.sh +5 -1
  265. package/plugin/skills/code-auditor/SKILL.md +51 -0
  266. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts +0 -21
  267. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts.map +0 -1
  268. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js +0 -21
  269. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js.map +0 -1
  270. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts +0 -13
  271. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts.map +0 -1
  272. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js +0 -12
  273. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js.map +0 -1
  274. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts +0 -11
  275. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts.map +0 -1
  276. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js +0 -22
  277. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js.map +0 -1
  278. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts +0 -9
  279. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts.map +0 -1
  280. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js +0 -13
  281. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js.map +0 -1
  282. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts +0 -13
  283. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts.map +0 -1
  284. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js +0 -18
  285. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js.map +0 -1
  286. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts +0 -10
  287. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts.map +0 -1
  288. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js +0 -16
  289. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js.map +0 -1
  290. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts +0 -14
  291. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts.map +0 -1
  292. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js +0 -18
  293. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js.map +0 -1
  294. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts +0 -13
  295. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts.map +0 -1
  296. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js +0 -22
  297. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js.map +0 -1
  298. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts +0 -10
  299. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts.map +0 -1
  300. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js +0 -20
  301. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js.map +0 -1
  302. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts +0 -18
  303. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts.map +0 -1
  304. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js +0 -28
  305. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js.map +0 -1
  306. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts +0 -11
  307. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts.map +0 -1
  308. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js +0 -31
  309. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js.map +0 -1
  310. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts +0 -11
  311. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts.map +0 -1
  312. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js +0 -18
  313. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js.map +0 -1
  314. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts +0 -13
  315. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts.map +0 -1
  316. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js +0 -61
  317. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js.map +0 -1
  318. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts +0 -10
  319. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts.map +0 -1
  320. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js +0 -15
  321. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js.map +0 -1
  322. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts +0 -11
  323. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts.map +0 -1
  324. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js +0 -49
  325. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js.map +0 -1
  326. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts +0 -10
  327. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts.map +0 -1
  328. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js +0 -19
  329. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js.map +0 -1
  330. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts +0 -37
  331. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts.map +0 -1
  332. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js +0 -73
  333. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js.map +0 -1
  334. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts +0 -12
  335. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts.map +0 -1
  336. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js +0 -82
  337. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js.map +0 -1
  338. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts +0 -10
  339. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts.map +0 -1
  340. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js +0 -15
  341. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js.map +0 -1
  342. package/dist/analyzers/dataAccessAnalyzer.d.ts +0 -46
  343. package/dist/analyzers/dataAccessAnalyzer.d.ts.map +0 -1
  344. package/dist/analyzers/dataAccessAnalyzer.js +0 -474
  345. package/dist/analyzers/dataAccessAnalyzer.js.map +0 -1
  346. package/dist/analyzers/dryAnalyzer.d.ts +0 -31
  347. package/dist/analyzers/dryAnalyzer.d.ts.map +0 -1
  348. package/dist/analyzers/dryAnalyzer.js +0 -734
  349. package/dist/analyzers/dryAnalyzer.js.map +0 -1
  350. package/dist/analyzers/schemaAnalyzer.d.ts +0 -23
  351. package/dist/analyzers/schemaAnalyzer.d.ts.map +0 -1
  352. package/dist/analyzers/schemaAnalyzer.js +0 -564
  353. package/dist/analyzers/schemaAnalyzer.js.map +0 -1
  354. package/dist/analyzers/solidAnalyzer.d.ts +0 -33
  355. package/dist/analyzers/solidAnalyzer.d.ts.map +0 -1
  356. package/dist/analyzers/solidAnalyzer.js +0 -847
  357. 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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"}