api-tests-coverage 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/README.md +703 -0
  2. package/config.yaml.example +227 -0
  3. package/dist/action/src/index.d.ts +2 -0
  4. package/dist/action/src/index.d.ts.map +1 -0
  5. package/dist/action/src/index.js +349 -0
  6. package/dist/action/src/prComment.d.ts +34 -0
  7. package/dist/action/src/prComment.d.ts.map +1 -0
  8. package/dist/action/src/prComment.js +146 -0
  9. package/dist/src/ast/astAnalysisOrchestrator.d.ts +36 -0
  10. package/dist/src/ast/astAnalysisOrchestrator.d.ts.map +1 -0
  11. package/dist/src/ast/astAnalysisOrchestrator.js +123 -0
  12. package/dist/src/ast/astTypes.d.ts +105 -0
  13. package/dist/src/ast/astTypes.d.ts.map +1 -0
  14. package/dist/src/ast/astTypes.js +9 -0
  15. package/dist/src/ast/languageAnalyzer.d.ts +46 -0
  16. package/dist/src/ast/languageAnalyzer.d.ts.map +1 -0
  17. package/dist/src/ast/languageAnalyzer.js +9 -0
  18. package/dist/src/ast/languageCapabilities.d.ts +24 -0
  19. package/dist/src/ast/languageCapabilities.d.ts.map +1 -0
  20. package/dist/src/ast/languageCapabilities.js +92 -0
  21. package/dist/src/ast/parseFile.d.ts +16 -0
  22. package/dist/src/ast/parseFile.d.ts.map +1 -0
  23. package/dist/src/ast/parseFile.js +65 -0
  24. package/dist/src/ast/parserRegistry.d.ts +39 -0
  25. package/dist/src/ast/parserRegistry.d.ts.map +1 -0
  26. package/dist/src/ast/parserRegistry.js +66 -0
  27. package/dist/src/buildSummary.d.ts +26 -0
  28. package/dist/src/buildSummary.d.ts.map +1 -0
  29. package/dist/src/buildSummary.js +193 -0
  30. package/dist/src/businessCoverage.d.ts +68 -0
  31. package/dist/src/businessCoverage.d.ts.map +1 -0
  32. package/dist/src/businessCoverage.js +290 -0
  33. package/dist/src/compatibilityCoverage.d.ts +83 -0
  34. package/dist/src/compatibilityCoverage.d.ts.map +1 -0
  35. package/dist/src/compatibilityCoverage.js +501 -0
  36. package/dist/src/config/defaultConfig.d.ts +9 -0
  37. package/dist/src/config/defaultConfig.d.ts.map +1 -0
  38. package/dist/src/config/defaultConfig.js +97 -0
  39. package/dist/src/config/index.d.ts +12 -0
  40. package/dist/src/config/index.d.ts.map +1 -0
  41. package/dist/src/config/index.js +37 -0
  42. package/dist/src/config/loadConfig.d.ts +29 -0
  43. package/dist/src/config/loadConfig.d.ts.map +1 -0
  44. package/dist/src/config/loadConfig.js +135 -0
  45. package/dist/src/config/mergeConfig.d.ts +15 -0
  46. package/dist/src/config/mergeConfig.d.ts.map +1 -0
  47. package/dist/src/config/mergeConfig.js +57 -0
  48. package/dist/src/config/schema.d.ts +15 -0
  49. package/dist/src/config/schema.d.ts.map +1 -0
  50. package/dist/src/config/schema.js +30 -0
  51. package/dist/src/config/types.d.ts +175 -0
  52. package/dist/src/config/types.d.ts.map +1 -0
  53. package/dist/src/config/types.js +9 -0
  54. package/dist/src/config/validateConfig.d.ts +22 -0
  55. package/dist/src/config/validateConfig.d.ts.map +1 -0
  56. package/dist/src/config/validateConfig.js +171 -0
  57. package/dist/src/config.d.ts +168 -0
  58. package/dist/src/config.d.ts.map +1 -0
  59. package/dist/src/config.js +204 -0
  60. package/dist/src/coverage/deep-analysis/callGraph.d.ts +67 -0
  61. package/dist/src/coverage/deep-analysis/callGraph.d.ts.map +1 -0
  62. package/dist/src/coverage/deep-analysis/callGraph.js +275 -0
  63. package/dist/src/coverage/deep-analysis/deepEndpointResolver.d.ts +23 -0
  64. package/dist/src/coverage/deep-analysis/deepEndpointResolver.d.ts.map +1 -0
  65. package/dist/src/coverage/deep-analysis/deepEndpointResolver.js +394 -0
  66. package/dist/src/coverage/deep-analysis/index.d.ts +17 -0
  67. package/dist/src/coverage/deep-analysis/index.d.ts.map +1 -0
  68. package/dist/src/coverage/deep-analysis/index.js +63 -0
  69. package/dist/src/coverage/deep-analysis/resolveAssertions.d.ts +60 -0
  70. package/dist/src/coverage/deep-analysis/resolveAssertions.d.ts.map +1 -0
  71. package/dist/src/coverage/deep-analysis/resolveAssertions.js +121 -0
  72. package/dist/src/coverage/deep-analysis/resolveConstants.d.ts +36 -0
  73. package/dist/src/coverage/deep-analysis/resolveConstants.d.ts.map +1 -0
  74. package/dist/src/coverage/deep-analysis/resolveConstants.js +92 -0
  75. package/dist/src/coverage/deep-analysis/resolveEnums.d.ts +55 -0
  76. package/dist/src/coverage/deep-analysis/resolveEnums.d.ts.map +1 -0
  77. package/dist/src/coverage/deep-analysis/resolveEnums.js +152 -0
  78. package/dist/src/coverage/deep-analysis/resolveMethodChains.d.ts +70 -0
  79. package/dist/src/coverage/deep-analysis/resolveMethodChains.d.ts.map +1 -0
  80. package/dist/src/coverage/deep-analysis/resolveMethodChains.js +152 -0
  81. package/dist/src/coverage/deep-analysis/resolvePaths.d.ts +80 -0
  82. package/dist/src/coverage/deep-analysis/resolvePaths.d.ts.map +1 -0
  83. package/dist/src/coverage/deep-analysis/resolvePaths.js +216 -0
  84. package/dist/src/coverage/deep-analysis/resolveRequestWrappers.d.ts +71 -0
  85. package/dist/src/coverage/deep-analysis/resolveRequestWrappers.d.ts.map +1 -0
  86. package/dist/src/coverage/deep-analysis/resolveRequestWrappers.js +226 -0
  87. package/dist/src/coverage/deep-analysis/symbolTable.d.ts +58 -0
  88. package/dist/src/coverage/deep-analysis/symbolTable.d.ts.map +1 -0
  89. package/dist/src/coverage/deep-analysis/symbolTable.js +230 -0
  90. package/dist/src/coverage/deep-analysis/types.d.ts +122 -0
  91. package/dist/src/coverage/deep-analysis/types.d.ts.map +1 -0
  92. package/dist/src/coverage/deep-analysis/types.js +21 -0
  93. package/dist/src/discovery/fileClassifier.d.ts +50 -0
  94. package/dist/src/discovery/fileClassifier.d.ts.map +1 -0
  95. package/dist/src/discovery/fileClassifier.js +238 -0
  96. package/dist/src/discovery/projectDiscovery.d.ts +66 -0
  97. package/dist/src/discovery/projectDiscovery.d.ts.map +1 -0
  98. package/dist/src/discovery/projectDiscovery.js +287 -0
  99. package/dist/src/endpointCoverage.d.ts +70 -0
  100. package/dist/src/endpointCoverage.d.ts.map +1 -0
  101. package/dist/src/endpointCoverage.js +381 -0
  102. package/dist/src/errorCoverage.d.ts +93 -0
  103. package/dist/src/errorCoverage.d.ts.map +1 -0
  104. package/dist/src/errorCoverage.js +698 -0
  105. package/dist/src/index.d.ts +3 -0
  106. package/dist/src/index.d.ts.map +1 -0
  107. package/dist/src/index.js +1441 -0
  108. package/dist/src/inference/businessRuleInference.d.ts +63 -0
  109. package/dist/src/inference/businessRuleInference.d.ts.map +1 -0
  110. package/dist/src/inference/businessRuleInference.js +268 -0
  111. package/dist/src/inference/integrationFlowInference.d.ts +56 -0
  112. package/dist/src/inference/integrationFlowInference.d.ts.map +1 -0
  113. package/dist/src/inference/integrationFlowInference.js +266 -0
  114. package/dist/src/integrationCoverage.d.ts +72 -0
  115. package/dist/src/integrationCoverage.d.ts.map +1 -0
  116. package/dist/src/integrationCoverage.js +317 -0
  117. package/dist/src/intelligence/index.d.ts +20 -0
  118. package/dist/src/intelligence/index.d.ts.map +1 -0
  119. package/dist/src/intelligence/index.js +105 -0
  120. package/dist/src/intelligence/linkageEngine.d.ts +20 -0
  121. package/dist/src/intelligence/linkageEngine.d.ts.map +1 -0
  122. package/dist/src/intelligence/linkageEngine.js +522 -0
  123. package/dist/src/intelligence/markdownReporter.d.ts +12 -0
  124. package/dist/src/intelligence/markdownReporter.d.ts.map +1 -0
  125. package/dist/src/intelligence/markdownReporter.js +265 -0
  126. package/dist/src/intelligence/riskScoring.d.ts +53 -0
  127. package/dist/src/intelligence/riskScoring.d.ts.map +1 -0
  128. package/dist/src/intelligence/riskScoring.js +181 -0
  129. package/dist/src/intelligence/types.d.ts +121 -0
  130. package/dist/src/intelligence/types.d.ts.map +1 -0
  131. package/dist/src/intelligence/types.js +8 -0
  132. package/dist/src/languageDetection.d.ts +100 -0
  133. package/dist/src/languageDetection.d.ts.map +1 -0
  134. package/dist/src/languageDetection.js +349 -0
  135. package/dist/src/languages/java/index.d.ts +16 -0
  136. package/dist/src/languages/java/index.d.ts.map +1 -0
  137. package/dist/src/languages/java/index.js +103 -0
  138. package/dist/src/languages/java/parser.d.ts +7 -0
  139. package/dist/src/languages/java/parser.d.ts.map +1 -0
  140. package/dist/src/languages/java/parser.js +50 -0
  141. package/dist/src/languages/java/semanticBuilder.d.ts +21 -0
  142. package/dist/src/languages/java/semanticBuilder.d.ts.map +1 -0
  143. package/dist/src/languages/java/semanticBuilder.js +358 -0
  144. package/dist/src/languages/javascript/annotationExtractor.d.ts +20 -0
  145. package/dist/src/languages/javascript/annotationExtractor.d.ts.map +1 -0
  146. package/dist/src/languages/javascript/annotationExtractor.js +94 -0
  147. package/dist/src/languages/javascript/assertionResolver.d.ts +18 -0
  148. package/dist/src/languages/javascript/assertionResolver.d.ts.map +1 -0
  149. package/dist/src/languages/javascript/assertionResolver.js +150 -0
  150. package/dist/src/languages/javascript/callResolver.d.ts +23 -0
  151. package/dist/src/languages/javascript/callResolver.d.ts.map +1 -0
  152. package/dist/src/languages/javascript/callResolver.js +236 -0
  153. package/dist/src/languages/javascript/httpInteractionExtractor.d.ts +23 -0
  154. package/dist/src/languages/javascript/httpInteractionExtractor.d.ts.map +1 -0
  155. package/dist/src/languages/javascript/httpInteractionExtractor.js +205 -0
  156. package/dist/src/languages/javascript/index.d.ts +20 -0
  157. package/dist/src/languages/javascript/index.d.ts.map +1 -0
  158. package/dist/src/languages/javascript/index.js +136 -0
  159. package/dist/src/languages/javascript/parser.d.ts +14 -0
  160. package/dist/src/languages/javascript/parser.d.ts.map +1 -0
  161. package/dist/src/languages/javascript/parser.js +38 -0
  162. package/dist/src/languages/javascript/symbolResolver.d.ts +31 -0
  163. package/dist/src/languages/javascript/symbolResolver.d.ts.map +1 -0
  164. package/dist/src/languages/javascript/symbolResolver.js +183 -0
  165. package/dist/src/languages/kotlin/index.d.ts +16 -0
  166. package/dist/src/languages/kotlin/index.d.ts.map +1 -0
  167. package/dist/src/languages/kotlin/index.js +151 -0
  168. package/dist/src/languages/kotlin/parser.d.ts +11 -0
  169. package/dist/src/languages/kotlin/parser.d.ts.map +1 -0
  170. package/dist/src/languages/kotlin/parser.js +74 -0
  171. package/dist/src/languages/python/index.d.ts +15 -0
  172. package/dist/src/languages/python/index.d.ts.map +1 -0
  173. package/dist/src/languages/python/index.js +293 -0
  174. package/dist/src/languages/ruby/index.d.ts +15 -0
  175. package/dist/src/languages/ruby/index.d.ts.map +1 -0
  176. package/dist/src/languages/ruby/index.js +274 -0
  177. package/dist/src/languages/shared/treeSitterUtils.d.ts +43 -0
  178. package/dist/src/languages/shared/treeSitterUtils.d.ts.map +1 -0
  179. package/dist/src/languages/shared/treeSitterUtils.js +100 -0
  180. package/dist/src/languages/typescript/index.d.ts +14 -0
  181. package/dist/src/languages/typescript/index.d.ts.map +1 -0
  182. package/dist/src/languages/typescript/index.js +25 -0
  183. package/dist/src/lib/index.d.ts +228 -0
  184. package/dist/src/lib/index.d.ts.map +1 -0
  185. package/dist/src/lib/index.js +486 -0
  186. package/dist/src/mcp/client/index.d.ts +37 -0
  187. package/dist/src/mcp/client/index.d.ts.map +1 -0
  188. package/dist/src/mcp/client/index.js +235 -0
  189. package/dist/src/mcp/config.d.ts +50 -0
  190. package/dist/src/mcp/config.d.ts.map +1 -0
  191. package/dist/src/mcp/config.js +125 -0
  192. package/dist/src/mcp/events.d.ts +24 -0
  193. package/dist/src/mcp/events.d.ts.map +1 -0
  194. package/dist/src/mcp/events.js +48 -0
  195. package/dist/src/mcp/fallback/index.d.ts +50 -0
  196. package/dist/src/mcp/fallback/index.d.ts.map +1 -0
  197. package/dist/src/mcp/fallback/index.js +216 -0
  198. package/dist/src/mcp/index.d.ts +67 -0
  199. package/dist/src/mcp/index.d.ts.map +1 -0
  200. package/dist/src/mcp/index.js +212 -0
  201. package/dist/src/mcp/normalizer.d.ts +21 -0
  202. package/dist/src/mcp/normalizer.d.ts.map +1 -0
  203. package/dist/src/mcp/normalizer.js +99 -0
  204. package/dist/src/mcp/prompts/index.d.ts +86 -0
  205. package/dist/src/mcp/prompts/index.d.ts.map +1 -0
  206. package/dist/src/mcp/prompts/index.js +304 -0
  207. package/dist/src/mcp/templates/index.d.ts +35 -0
  208. package/dist/src/mcp/templates/index.d.ts.map +1 -0
  209. package/dist/src/mcp/templates/index.js +143 -0
  210. package/dist/src/mcp/testing/mock-server/index.d.ts +47 -0
  211. package/dist/src/mcp/testing/mock-server/index.d.ts.map +1 -0
  212. package/dist/src/mcp/testing/mock-server/index.js +157 -0
  213. package/dist/src/mcp/types.d.ts +127 -0
  214. package/dist/src/mcp/types.d.ts.map +1 -0
  215. package/dist/src/mcp/types.js +8 -0
  216. package/dist/src/observability.d.ts +138 -0
  217. package/dist/src/observability.d.ts.map +1 -0
  218. package/dist/src/observability.js +519 -0
  219. package/dist/src/parameterCoverage.d.ts +75 -0
  220. package/dist/src/parameterCoverage.d.ts.map +1 -0
  221. package/dist/src/parameterCoverage.js +629 -0
  222. package/dist/src/perfResilienceCoverage.d.ts +155 -0
  223. package/dist/src/perfResilienceCoverage.d.ts.map +1 -0
  224. package/dist/src/perfResilienceCoverage.js +670 -0
  225. package/dist/src/pluginLoader.d.ts +51 -0
  226. package/dist/src/pluginLoader.d.ts.map +1 -0
  227. package/dist/src/pluginLoader.js +72 -0
  228. package/dist/src/publishing.d.ts +63 -0
  229. package/dist/src/publishing.d.ts.map +1 -0
  230. package/dist/src/publishing.js +379 -0
  231. package/dist/src/qualityGate.d.ts +58 -0
  232. package/dist/src/qualityGate.d.ts.map +1 -0
  233. package/dist/src/qualityGate.js +118 -0
  234. package/dist/src/reporting.d.ts +41 -0
  235. package/dist/src/reporting.d.ts.map +1 -0
  236. package/dist/src/reporting.js +278 -0
  237. package/dist/src/screenshots.d.ts +71 -0
  238. package/dist/src/screenshots.d.ts.map +1 -0
  239. package/dist/src/screenshots.js +141 -0
  240. package/dist/src/security/gate/index.d.ts +11 -0
  241. package/dist/src/security/gate/index.d.ts.map +1 -0
  242. package/dist/src/security/gate/index.js +65 -0
  243. package/dist/src/security/index.d.ts +30 -0
  244. package/dist/src/security/index.d.ts.map +1 -0
  245. package/dist/src/security/index.js +342 -0
  246. package/dist/src/security/normalizers/semgrep.d.ts +10 -0
  247. package/dist/src/security/normalizers/semgrep.d.ts.map +1 -0
  248. package/dist/src/security/normalizers/semgrep.js +104 -0
  249. package/dist/src/security/normalizers/trivy.d.ts +10 -0
  250. package/dist/src/security/normalizers/trivy.d.ts.map +1 -0
  251. package/dist/src/security/normalizers/trivy.js +78 -0
  252. package/dist/src/security/normalizers/zap.d.ts +10 -0
  253. package/dist/src/security/normalizers/zap.d.ts.map +1 -0
  254. package/dist/src/security/normalizers/zap.js +104 -0
  255. package/dist/src/security/scanners/semgrep.d.ts +6 -0
  256. package/dist/src/security/scanners/semgrep.d.ts.map +1 -0
  257. package/dist/src/security/scanners/semgrep.js +125 -0
  258. package/dist/src/security/scanners/trivy.d.ts +6 -0
  259. package/dist/src/security/scanners/trivy.d.ts.map +1 -0
  260. package/dist/src/security/scanners/trivy.js +115 -0
  261. package/dist/src/security/scanners/zap.d.ts +6 -0
  262. package/dist/src/security/scanners/zap.d.ts.map +1 -0
  263. package/dist/src/security/scanners/zap.js +135 -0
  264. package/dist/src/security/types.d.ts +146 -0
  265. package/dist/src/security/types.d.ts.map +1 -0
  266. package/dist/src/security/types.js +6 -0
  267. package/dist/src/securityCoverage.d.ts +116 -0
  268. package/dist/src/securityCoverage.d.ts.map +1 -0
  269. package/dist/src/securityCoverage.js +725 -0
  270. package/dist/src/summary/buildSummary.d.ts +28 -0
  271. package/dist/src/summary/buildSummary.d.ts.map +1 -0
  272. package/dist/src/summary/buildSummary.js +257 -0
  273. package/dist/src/summary/evaluateMetrics.d.ts +31 -0
  274. package/dist/src/summary/evaluateMetrics.d.ts.map +1 -0
  275. package/dist/src/summary/evaluateMetrics.js +118 -0
  276. package/dist/src/summary/index.d.ts +10 -0
  277. package/dist/src/summary/index.d.ts.map +1 -0
  278. package/dist/src/summary/index.js +22 -0
  279. package/dist/src/summary/markdownRenderer.d.ts +139 -0
  280. package/dist/src/summary/markdownRenderer.d.ts.map +1 -0
  281. package/dist/src/summary/markdownRenderer.js +459 -0
  282. package/dist/src/summary/prSummary.d.ts +24 -0
  283. package/dist/src/summary/prSummary.d.ts.map +1 -0
  284. package/dist/src/summary/prSummary.js +233 -0
  285. package/dist/src/summary/summaryTypes.d.ts +35 -0
  286. package/dist/src/summary/summaryTypes.d.ts.map +1 -0
  287. package/dist/src/summary/summaryTypes.js +27 -0
  288. package/package.json +84 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Language detection and language-specific HTTP call extraction for the
3
+ * API test coverage analyzer.
4
+ *
5
+ * Supports: JavaScript, TypeScript, Java, Kotlin, Python, Ruby, Cucumber.
6
+ */
7
+ export type SupportedLanguage = 'javascript' | 'typescript' | 'java' | 'kotlin' | 'python' | 'ruby' | 'cucumber' | 'auto';
8
+ export declare const SUPPORTED_LANGUAGES: SupportedLanguage[];
9
+ export interface HttpCall {
10
+ method: string;
11
+ path: string;
12
+ }
13
+ /**
14
+ * Detect the language of a single file from its extension.
15
+ * Returns `null` if the extension is not recognised.
16
+ */
17
+ export declare function detectLanguageFromExtension(filePath: string): SupportedLanguage | null;
18
+ /**
19
+ * Detect all languages present in a list of file paths.
20
+ */
21
+ export declare function detectLanguages(filePaths: string[]): SupportedLanguage[];
22
+ /**
23
+ * Return the default glob patterns used to locate test files for a given language.
24
+ */
25
+ export declare function getDefaultGlobsForLanguage(language: SupportedLanguage): string[];
26
+ /**
27
+ * Extract HTTP calls from JavaScript/TypeScript test content.
28
+ *
29
+ * Detects patterns like:
30
+ * - `GET /users` (string literals)
31
+ * - `fetch('/users', { method: 'GET' })`
32
+ * - `supertest(app).get('/users')`
33
+ * - `axios.get('/users')`
34
+ */
35
+ export declare function extractHttpCallsFromJs(content: string): HttpCall[];
36
+ /**
37
+ * Extract HTTP calls from Java/Kotlin test content.
38
+ *
39
+ * Detects:
40
+ * - RestAssured: `given().when().get("/path")`, `.when().post("/path")`
41
+ * - Spring MockMvc: `perform(get("/path"))`, `perform(MockMvcRequestBuilders.get(...))`
42
+ * - WebTestClient: `webTestClient.get().uri("/path")`
43
+ * - OkHttp / Ktor: `client.get("/path")`
44
+ * - Generic strings: `"GET /path"`
45
+ */
46
+ export declare function extractHttpCallsFromJava(content: string): HttpCall[];
47
+ /**
48
+ * Extract HTTP calls from Python test content.
49
+ *
50
+ * Detects:
51
+ * - `requests.get('/path')`, `requests.post('/path')`, etc.
52
+ * - `httpx.get('/path')`
53
+ * - `client.get('/path')` (Flask/Django test client)
54
+ * - `self.client.get('/path')`
55
+ * - `response = client.get('/api/users')`
56
+ */
57
+ export declare function extractHttpCallsFromPython(content: string): HttpCall[];
58
+ /**
59
+ * Extract HTTP calls from Ruby test content.
60
+ *
61
+ * Detects:
62
+ * - Rails request specs / integration tests: `get '/path'`, `post '/path'`
63
+ * - HTTParty: `HTTParty.get('/path')`
64
+ * - Faraday: `conn.get('/path')`
65
+ * - Net::HTTP (generic patterns)
66
+ * - Generic "METHOD /path" strings
67
+ */
68
+ export declare function extractHttpCallsFromRuby(content: string): HttpCall[];
69
+ /**
70
+ * Extract HTTP calls from Cucumber feature files and step definition files.
71
+ *
72
+ * Detects:
73
+ * - Gherkin steps: `When I send a GET request to "/users"`
74
+ * - Gherkin steps: `When I call "GET /users"`
75
+ * - Step definition files in any supported language (falls through to respective extractor)
76
+ */
77
+ export declare function extractHttpCallsFromCucumber(content: string): HttpCall[];
78
+ /**
79
+ * Extract HTTP calls from file content using the most appropriate strategy
80
+ * for the detected or specified language.
81
+ */
82
+ export declare function extractHttpCalls(content: string, language: SupportedLanguage): HttpCall[];
83
+ /**
84
+ * Parse a `--language` CLI option value into an array of `SupportedLanguage` values.
85
+ *
86
+ * Accepts:
87
+ * - A single value: `java`
88
+ * - A comma-separated list: `java,kotlin`
89
+ * - Multiple invocations are handled by Commander's `.collect()` middleware
90
+ *
91
+ * @throws if no valid languages are found in the input.
92
+ */
93
+ export declare function parseLanguageOption(value: string): SupportedLanguage[];
94
+ /**
95
+ * Extract the path portion from a URL string.
96
+ * If the string is already a path (starts with `/`), it is returned as-is.
97
+ * Full URLs like `http://localhost:8080/api/users` → `/api/users`.
98
+ */
99
+ export declare function extractPathFromUrl(urlOrPath: string): string;
100
+ //# sourceMappingURL=languageDetection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languageDetection.d.ts","sourceRoot":"","sources":["../../src/languageDetection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,YAAY,GACZ,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,UAAU,GACV,MAAM,CAAC;AAEX,eAAO,MAAM,mBAAmB,EAAE,iBAAiB,EASlD,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAiBD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAKtF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAOxE;AAID;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,EAAE,CA4BhF;AAID;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CA0BlE;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAyCpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CA6BtE;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CA6BpE;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAsBxE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,QAAQ,EAAE,CAkBzF;AAID;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAatE;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO5D"}
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+ /**
3
+ * Language detection and language-specific HTTP call extraction for the
4
+ * API test coverage analyzer.
5
+ *
6
+ * Supports: JavaScript, TypeScript, Java, Kotlin, Python, Ruby, Cucumber.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SUPPORTED_LANGUAGES = void 0;
10
+ exports.detectLanguageFromExtension = detectLanguageFromExtension;
11
+ exports.detectLanguages = detectLanguages;
12
+ exports.getDefaultGlobsForLanguage = getDefaultGlobsForLanguage;
13
+ exports.extractHttpCallsFromJs = extractHttpCallsFromJs;
14
+ exports.extractHttpCallsFromJava = extractHttpCallsFromJava;
15
+ exports.extractHttpCallsFromPython = extractHttpCallsFromPython;
16
+ exports.extractHttpCallsFromRuby = extractHttpCallsFromRuby;
17
+ exports.extractHttpCallsFromCucumber = extractHttpCallsFromCucumber;
18
+ exports.extractHttpCalls = extractHttpCalls;
19
+ exports.parseLanguageOption = parseLanguageOption;
20
+ exports.extractPathFromUrl = extractPathFromUrl;
21
+ exports.SUPPORTED_LANGUAGES = [
22
+ 'javascript',
23
+ 'typescript',
24
+ 'java',
25
+ 'kotlin',
26
+ 'python',
27
+ 'ruby',
28
+ 'cucumber',
29
+ 'auto',
30
+ ];
31
+ // ─── Extension → language mapping ─────────────────────────────────────────────
32
+ const EXTENSION_TO_LANGUAGE = {
33
+ '.ts': 'typescript',
34
+ '.tsx': 'typescript',
35
+ '.js': 'javascript',
36
+ '.jsx': 'javascript',
37
+ '.java': 'java',
38
+ '.kt': 'kotlin',
39
+ '.kts': 'kotlin',
40
+ '.py': 'python',
41
+ '.rb': 'ruby',
42
+ '.feature': 'cucumber',
43
+ };
44
+ /**
45
+ * Detect the language of a single file from its extension.
46
+ * Returns `null` if the extension is not recognised.
47
+ */
48
+ function detectLanguageFromExtension(filePath) {
49
+ var _a;
50
+ const dotIndex = filePath.lastIndexOf('.');
51
+ if (dotIndex === -1)
52
+ return null;
53
+ const ext = filePath.slice(dotIndex).toLowerCase();
54
+ return (_a = EXTENSION_TO_LANGUAGE[ext]) !== null && _a !== void 0 ? _a : null;
55
+ }
56
+ /**
57
+ * Detect all languages present in a list of file paths.
58
+ */
59
+ function detectLanguages(filePaths) {
60
+ const langs = new Set();
61
+ for (const fp of filePaths) {
62
+ const lang = detectLanguageFromExtension(fp);
63
+ if (lang)
64
+ langs.add(lang);
65
+ }
66
+ return Array.from(langs);
67
+ }
68
+ // ─── Default glob patterns per language ───────────────────────────────────────
69
+ /**
70
+ * Return the default glob patterns used to locate test files for a given language.
71
+ */
72
+ function getDefaultGlobsForLanguage(language) {
73
+ switch (language) {
74
+ case 'java':
75
+ return ['**/*Test.java', '**/*Tests.java', '**/*Spec.java', '**/test/**/*.java', '**/tests/**/*.java'];
76
+ case 'kotlin':
77
+ return ['**/*Test.kt', '**/*Tests.kt', '**/*Spec.kt', '**/test/**/*.kt', '**/tests/**/*.kt'];
78
+ case 'python':
79
+ return ['**/test_*.py', '**/*_test.py', '**/tests/**/*.py', '**/test/**/*.py'];
80
+ case 'ruby':
81
+ return ['**/*_spec.rb', '**/spec/**/*.rb', '**/test/**/*.rb'];
82
+ case 'cucumber':
83
+ return ['**/*.feature', '**/step_definitions/**/*.rb', '**/step_definitions/**/*.java', '**/step_definitions/**/*.py', '**/step_definitions/**/*.kt'];
84
+ case 'typescript':
85
+ return ['**/*.test.ts', '**/*.spec.ts', '**/tests/**/*.ts'];
86
+ case 'javascript':
87
+ return ['**/*.test.js', '**/*.spec.js', '**/tests/**/*.js'];
88
+ case 'auto':
89
+ default:
90
+ return [
91
+ '**/*.test.ts', '**/*.spec.ts', '**/tests/**/*.ts',
92
+ '**/*.test.js', '**/*.spec.js', '**/tests/**/*.js',
93
+ '**/*Test.java', '**/*Tests.java', '**/test/**/*.java',
94
+ '**/*Test.kt', '**/*Spec.kt', '**/test/**/*.kt',
95
+ '**/test_*.py', '**/*_test.py', '**/tests/**/*.py',
96
+ '**/*_spec.rb', '**/spec/**/*.rb',
97
+ '**/*.feature',
98
+ ];
99
+ }
100
+ }
101
+ // ─── HTTP call extraction ─────────────────────────────────────────────────────
102
+ /**
103
+ * Extract HTTP calls from JavaScript/TypeScript test content.
104
+ *
105
+ * Detects patterns like:
106
+ * - `GET /users` (string literals)
107
+ * - `fetch('/users', { method: 'GET' })`
108
+ * - `supertest(app).get('/users')`
109
+ * - `axios.get('/users')`
110
+ */
111
+ function extractHttpCallsFromJs(content) {
112
+ const calls = [];
113
+ // Bare "METHOD /path" string (e.g. in test descriptions or request helpers)
114
+ const bare = /\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE)\s+(\/[^\s'"`,)]*)/gi;
115
+ let m;
116
+ while ((m = bare.exec(content)) !== null) {
117
+ const p = m[2];
118
+ if (!p.includes('{')) {
119
+ calls.push({ method: m[1].toUpperCase(), path: p });
120
+ }
121
+ }
122
+ // axios / superagent / got: axios.get('/path'), axios.post('/path')
123
+ const axiosLike = /\b(?:axios|request|supertest|got|agent)\.(get|post|put|patch|delete|head|options)\s*\(\s*['"`]([^'"`]+)['"`]/gi;
124
+ while ((m = axiosLike.exec(content)) !== null) {
125
+ calls.push({ method: m[1].toUpperCase(), path: extractPathFromUrl(m[2]) });
126
+ }
127
+ // supertest(app).get('/path')
128
+ const supertestChain = /\)\s*\.(get|post|put|patch|delete|head|options)\s*\(\s*['"`]([^'"`]+)['"`]/gi;
129
+ while ((m = supertestChain.exec(content)) !== null) {
130
+ calls.push({ method: m[1].toUpperCase(), path: extractPathFromUrl(m[2]) });
131
+ }
132
+ return deduplicateCalls(calls);
133
+ }
134
+ /**
135
+ * Extract HTTP calls from Java/Kotlin test content.
136
+ *
137
+ * Detects:
138
+ * - RestAssured: `given().when().get("/path")`, `.when().post("/path")`
139
+ * - Spring MockMvc: `perform(get("/path"))`, `perform(MockMvcRequestBuilders.get(...))`
140
+ * - WebTestClient: `webTestClient.get().uri("/path")`
141
+ * - OkHttp / Ktor: `client.get("/path")`
142
+ * - Generic strings: `"GET /path"`
143
+ */
144
+ function extractHttpCallsFromJava(content) {
145
+ const calls = [];
146
+ let m;
147
+ // RestAssured: .when().get("/path")
148
+ const raWhen = /\.when\(\)\s*\.\s*(get|post|put|patch|delete|head|options)\s*\(\s*["'`]([^"'`]+)["'`]/gi;
149
+ while ((m = raWhen.exec(content)) !== null) {
150
+ calls.push({ method: m[1].toUpperCase(), path: m[2] });
151
+ }
152
+ // RestAssured shorthand: given().get("/path") or RestAssured.get("/path")
153
+ const raGiven = /(?:given\(\)|RestAssured)[^;.(]*\.(get|post|put|patch|delete|head|options)\s*\(\s*["'`]([^"'`]+)["'`]/gi;
154
+ while ((m = raGiven.exec(content)) !== null) {
155
+ calls.push({ method: m[1].toUpperCase(), path: m[2] });
156
+ }
157
+ // Spring MockMvc / WebMvcTest: perform(get("/path"))
158
+ const mockMvc = /perform\s*\(\s*(?:\w+\s*\.\s*)?(get|post|put|patch|delete|head|options)\s*\(\s*["'`]([^"'`]+)["'`]/gi;
159
+ while ((m = mockMvc.exec(content)) !== null) {
160
+ calls.push({ method: m[1].toUpperCase(), path: m[2] });
161
+ }
162
+ // WebTestClient: webTestClient.get().uri("/path")
163
+ const webTest = /webTestClient\s*\.\s*(get|post|put|patch|delete|head|options)\s*\(\s*\)\s*\.uri\s*\(\s*["'`]([^"'`]+)["'`]/gi;
164
+ while ((m = webTest.exec(content)) !== null) {
165
+ calls.push({ method: m[1].toUpperCase(), path: m[2] });
166
+ }
167
+ // OkHttp / Ktor client: client.get("/path")
168
+ const okHttp = /\bclient\s*\.\s*(get|post|put|patch|delete|head|options)\s*\(\s*["'`]([^"'`]+)["'`]/gi;
169
+ while ((m = okHttp.exec(content)) !== null) {
170
+ calls.push({ method: m[1].toUpperCase(), path: m[2] });
171
+ }
172
+ // Generic quoted "METHOD /path"
173
+ const generic = /["'`](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE)\s+(\/[^"'`\s]+)["'`]/gi;
174
+ while ((m = generic.exec(content)) !== null) {
175
+ calls.push({ method: m[1].toUpperCase(), path: m[2] });
176
+ }
177
+ return deduplicateCalls(calls);
178
+ }
179
+ /**
180
+ * Extract HTTP calls from Python test content.
181
+ *
182
+ * Detects:
183
+ * - `requests.get('/path')`, `requests.post('/path')`, etc.
184
+ * - `httpx.get('/path')`
185
+ * - `client.get('/path')` (Flask/Django test client)
186
+ * - `self.client.get('/path')`
187
+ * - `response = client.get('/api/users')`
188
+ */
189
+ function extractHttpCallsFromPython(content) {
190
+ const calls = [];
191
+ let m;
192
+ // requests.METHOD('/path')
193
+ const reqPattern = /\brequests\.(get|post|put|patch|delete|head|options)\s*\(\s*['"]([^'"]+)['"]/gi;
194
+ while ((m = reqPattern.exec(content)) !== null) {
195
+ calls.push({ method: m[1].toUpperCase(), path: extractPathFromUrl(m[2]) });
196
+ }
197
+ // httpx.METHOD('/path')
198
+ const httpxPattern = /\bhttpx\.(get|post|put|patch|delete|head|options)\s*\(\s*['"]([^'"]+)['"]/gi;
199
+ while ((m = httpxPattern.exec(content)) !== null) {
200
+ calls.push({ method: m[1].toUpperCase(), path: extractPathFromUrl(m[2]) });
201
+ }
202
+ // client.METHOD('/path'), self.client.METHOD('/path')
203
+ const clientPattern = /(?:self\.)?\bclient\.(get|post|put|patch|delete|head|options)\s*\(\s*['"]([^'"]+)['"]/gi;
204
+ while ((m = clientPattern.exec(content)) !== null) {
205
+ calls.push({ method: m[1].toUpperCase(), path: extractPathFromUrl(m[2]) });
206
+ }
207
+ // Generic "METHOD /path"
208
+ const generic = /['"]?(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE)\s+(\/[^'")\s]+)['"]?/gi;
209
+ while ((m = generic.exec(content)) !== null) {
210
+ calls.push({ method: m[1].toUpperCase(), path: m[2] });
211
+ }
212
+ return deduplicateCalls(calls);
213
+ }
214
+ /**
215
+ * Extract HTTP calls from Ruby test content.
216
+ *
217
+ * Detects:
218
+ * - Rails request specs / integration tests: `get '/path'`, `post '/path'`
219
+ * - HTTParty: `HTTParty.get('/path')`
220
+ * - Faraday: `conn.get('/path')`
221
+ * - Net::HTTP (generic patterns)
222
+ * - Generic "METHOD /path" strings
223
+ */
224
+ function extractHttpCallsFromRuby(content) {
225
+ const calls = [];
226
+ let m;
227
+ // Rails request specs: get '/path', post '/path', etc.
228
+ const railsPattern = /\b(get|post|put|patch|delete|head|options)\s+['"]([^'"]+)['"]/gi;
229
+ while ((m = railsPattern.exec(content)) !== null) {
230
+ calls.push({ method: m[1].toUpperCase(), path: extractPathFromUrl(m[2]) });
231
+ }
232
+ // HTTParty: HTTParty.get('/path')
233
+ const httpartyPattern = /HTTParty\.(get|post|put|patch|delete|head|options)\s*\(\s*['"]([^'"]+)['"]/gi;
234
+ while ((m = httpartyPattern.exec(content)) !== null) {
235
+ calls.push({ method: m[1].toUpperCase(), path: extractPathFromUrl(m[2]) });
236
+ }
237
+ // Faraday: conn.get('/path'), connection.post('/path')
238
+ const faradaySimple = /(?:conn|connection|faraday)\.(get|post|put|patch|delete|head|options)\s*\(\s*['"]([^'"]+)['"]/gi;
239
+ while ((m = faradaySimple.exec(content)) !== null) {
240
+ calls.push({ method: m[1].toUpperCase(), path: extractPathFromUrl(m[2]) });
241
+ }
242
+ // Generic "METHOD /path"
243
+ const generic = /["'](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE)\s+(\/[^"'\s]+)["']/gi;
244
+ while ((m = generic.exec(content)) !== null) {
245
+ calls.push({ method: m[1].toUpperCase(), path: m[2] });
246
+ }
247
+ return deduplicateCalls(calls);
248
+ }
249
+ /**
250
+ * Extract HTTP calls from Cucumber feature files and step definition files.
251
+ *
252
+ * Detects:
253
+ * - Gherkin steps: `When I send a GET request to "/users"`
254
+ * - Gherkin steps: `When I call "GET /users"`
255
+ * - Step definition files in any supported language (falls through to respective extractor)
256
+ */
257
+ function extractHttpCallsFromCucumber(content) {
258
+ const calls = [];
259
+ let m;
260
+ // "When I send a GET request to /users" or "When I make a POST request to /users"
261
+ const gherkin1 = /\b(?:When|Given|Then|And)\s+I\s+(?:send|make|perform)\s+(?:an?\s+)?["']?(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE)["']?\s+request\s+to\s+["']?(\/[^"'\s]+)["']?/gi;
262
+ while ((m = gherkin1.exec(content)) !== null) {
263
+ calls.push({ method: m[1].toUpperCase(), path: m[2] });
264
+ }
265
+ // 'When I call "GET /users"'
266
+ const gherkin2 = /\b(?:When|Given|Then|And)[^"']*["'](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE)\s+(\/[^"'\s]+)["']/gi;
267
+ while ((m = gherkin2.exec(content)) !== null) {
268
+ calls.push({ method: m[1].toUpperCase(), path: m[2] });
269
+ }
270
+ // Also apply language-specific extractors (for step definition files)
271
+ calls.push(...extractHttpCallsFromJava(content));
272
+ calls.push(...extractHttpCallsFromPython(content));
273
+ calls.push(...extractHttpCallsFromRuby(content));
274
+ return deduplicateCalls(calls);
275
+ }
276
+ /**
277
+ * Extract HTTP calls from file content using the most appropriate strategy
278
+ * for the detected or specified language.
279
+ */
280
+ function extractHttpCalls(content, language) {
281
+ switch (language) {
282
+ case 'java':
283
+ case 'kotlin':
284
+ return extractHttpCallsFromJava(content);
285
+ case 'python':
286
+ return extractHttpCallsFromPython(content);
287
+ case 'ruby':
288
+ return extractHttpCallsFromRuby(content);
289
+ case 'cucumber':
290
+ return extractHttpCallsFromCucumber(content);
291
+ case 'typescript':
292
+ case 'javascript':
293
+ case 'auto':
294
+ default:
295
+ // For 'auto', use JS patterns (good for TS/JS) as the baseline
296
+ return extractHttpCallsFromJs(content);
297
+ }
298
+ }
299
+ // ─── CLI option parsing ────────────────────────────────────────────────────────
300
+ /**
301
+ * Parse a `--language` CLI option value into an array of `SupportedLanguage` values.
302
+ *
303
+ * Accepts:
304
+ * - A single value: `java`
305
+ * - A comma-separated list: `java,kotlin`
306
+ * - Multiple invocations are handled by Commander's `.collect()` middleware
307
+ *
308
+ * @throws if no valid languages are found in the input.
309
+ */
310
+ function parseLanguageOption(value) {
311
+ const parts = value
312
+ .split(',')
313
+ .map((s) => s.trim().toLowerCase())
314
+ .filter(Boolean);
315
+ const valid = parts.filter((p) => exports.SUPPORTED_LANGUAGES.includes(p));
316
+ if (valid.length === 0) {
317
+ throw new Error(`Invalid language value: "${value}". Supported values: ${exports.SUPPORTED_LANGUAGES.join(', ')}`);
318
+ }
319
+ return valid;
320
+ }
321
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
322
+ /**
323
+ * Extract the path portion from a URL string.
324
+ * If the string is already a path (starts with `/`), it is returned as-is.
325
+ * Full URLs like `http://localhost:8080/api/users` → `/api/users`.
326
+ */
327
+ function extractPathFromUrl(urlOrPath) {
328
+ if (urlOrPath.startsWith('/'))
329
+ return urlOrPath;
330
+ try {
331
+ return new URL(urlOrPath).pathname;
332
+ }
333
+ catch {
334
+ return urlOrPath;
335
+ }
336
+ }
337
+ /**
338
+ * Remove duplicate HTTP calls (same method + path).
339
+ */
340
+ function deduplicateCalls(calls) {
341
+ const seen = new Set();
342
+ return calls.filter((c) => {
343
+ const key = `${c.method}:${c.path}`;
344
+ if (seen.has(key))
345
+ return false;
346
+ seen.add(key);
347
+ return true;
348
+ });
349
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Java language analyzer.
3
+ * Uses tree-sitter-java for AST parsing.
4
+ */
5
+ import type { LanguageAnalyzer } from '../../ast/languageAnalyzer';
6
+ import type { SupportedLanguage, ParsedSourceFile, SemanticModel, ResolvedHttpInteraction, SemanticAssertion, BusinessRuleRef, FlowRef, AnalysisContext } from '../../ast/astTypes';
7
+ export declare class JavaAnalyzer implements LanguageAnalyzer {
8
+ readonly language: SupportedLanguage;
9
+ parse(filePath: string, content: string): ParsedSourceFile;
10
+ buildSemanticModel(parsed: ParsedSourceFile, _context: AnalysisContext): SemanticModel;
11
+ extractHttpInteractions(model: SemanticModel, _context: AnalysisContext): ResolvedHttpInteraction[];
12
+ extractAssertions(model: SemanticModel): SemanticAssertion[];
13
+ extractBusinessRuleRefs(model: SemanticModel): BusinessRuleRef[];
14
+ extractFlowRefs(model: SemanticModel): FlowRef[];
15
+ }
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/languages/java/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,OAAO,EACP,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAY5B,qBAAa,YAAa,YAAW,gBAAgB;IACnD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAU;IAE9C,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB;IAI1D,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,GAAG,aAAa;IA0BtF,uBAAuB,CACrB,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,eAAe,GACxB,uBAAuB,EAAE;IAoC5B,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,iBAAiB,EAAE;IAI5D,uBAAuB,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,EAAE;IAIhE,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,EAAE;CAGjD"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * Java language analyzer.
4
+ * Uses tree-sitter-java for AST parsing.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.JavaAnalyzer = void 0;
8
+ const parserRegistry_1 = require("../../ast/parserRegistry");
9
+ const parser_1 = require("./parser");
10
+ const semanticBuilder_1 = require("./semanticBuilder");
11
+ const resolvePaths_1 = require("../../coverage/deep-analysis/resolvePaths");
12
+ class JavaAnalyzer {
13
+ constructor() {
14
+ this.language = 'java';
15
+ }
16
+ parse(filePath, content) {
17
+ return (0, parser_1.parseJava)(filePath, content);
18
+ }
19
+ buildSemanticModel(parsed, _context) {
20
+ var _a, _b;
21
+ const root = (_b = (_a = parsed.ast) === null || _a === void 0 ? void 0 : _a.rootNode) !== null && _b !== void 0 ? _b : parsed.ast;
22
+ if (!root) {
23
+ return emptyModel(parsed.filePath, 'java');
24
+ }
25
+ const { constants, enums } = (0, semanticBuilder_1.extractJavaSymbols)(root);
26
+ const functions = (0, semanticBuilder_1.extractJavaFunctions)(root, constants);
27
+ const assertions = (0, semanticBuilder_1.extractJavaAssertions)(root);
28
+ const businessRuleRefs = (0, semanticBuilder_1.extractJavaBusinessRuleRefs)(root);
29
+ const flowRefs = (0, semanticBuilder_1.extractJavaFlowRefs)(root);
30
+ return {
31
+ filePath: parsed.filePath,
32
+ language: 'java',
33
+ localVariables: new Map(),
34
+ constants,
35
+ enums,
36
+ functions,
37
+ httpInteractions: [],
38
+ assertions,
39
+ businessRuleRefs,
40
+ flowRefs,
41
+ };
42
+ }
43
+ extractHttpInteractions(model, _context) {
44
+ var _a;
45
+ const results = [];
46
+ const seen = new Set();
47
+ function add(call) {
48
+ var _a;
49
+ const key = `${call.method}:${(_a = call.normalizedPath) !== null && _a !== void 0 ? _a : call.path}`;
50
+ if (seen.has(key))
51
+ return;
52
+ seen.add(key);
53
+ results.push(call);
54
+ }
55
+ for (const fn of model.functions.values()) {
56
+ for (const c of fn.bodyHttpCalls) {
57
+ const path = (_a = c.resolvedPath) !== null && _a !== void 0 ? _a : c.rawPathArg;
58
+ if (!path)
59
+ continue;
60
+ const normalizedPath = path.startsWith('/') ? (0, resolvePaths_1.normalizePathToTemplate)(path) : undefined;
61
+ add({
62
+ method: c.method,
63
+ path,
64
+ normalizedPath,
65
+ sourceFile: model.filePath,
66
+ sourceLanguage: 'java',
67
+ resolutionType: c.resolutionType,
68
+ confidence: c.confidence,
69
+ assertionLinked: false,
70
+ rawCall: c.rawPathArg,
71
+ // Cucumber metadata
72
+ ...(fn.cucumberPattern ? { resolutionType: 'cucumber-step' } : {}),
73
+ });
74
+ }
75
+ }
76
+ return results;
77
+ }
78
+ extractAssertions(model) {
79
+ return model.assertions;
80
+ }
81
+ extractBusinessRuleRefs(model) {
82
+ return model.businessRuleRefs;
83
+ }
84
+ extractFlowRefs(model) {
85
+ return model.flowRefs;
86
+ }
87
+ }
88
+ exports.JavaAnalyzer = JavaAnalyzer;
89
+ function emptyModel(filePath, language) {
90
+ return {
91
+ filePath,
92
+ language,
93
+ localVariables: new Map(),
94
+ constants: new Map(),
95
+ enums: new Map(),
96
+ functions: new Map(),
97
+ httpInteractions: [],
98
+ assertions: [],
99
+ businessRuleRefs: [],
100
+ flowRefs: [],
101
+ };
102
+ }
103
+ (0, parserRegistry_1.registerAnalyzer)('java', () => new JavaAnalyzer());
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Java AST parser.
3
+ * Uses tree-sitter-java with lazy loading; sets parseError on failure.
4
+ */
5
+ import type { ParsedSourceFile } from '../../ast/astTypes';
6
+ export declare function parseJava(filePath: string, content: string): ParsedSourceFile;
7
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../src/languages/java/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAoB3D,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAwB7E"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /**
3
+ * Java AST parser.
4
+ * Uses tree-sitter-java with lazy loading; sets parseError on failure.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.parseJava = parseJava;
8
+ const treeSitterUtils_1 = require("../shared/treeSitterUtils");
9
+ let cachedParser = undefined;
10
+ let parserLoaded = false;
11
+ function getJavaParser() {
12
+ if (!parserLoaded) {
13
+ parserLoaded = true;
14
+ try {
15
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
16
+ const grammar = require('tree-sitter-java');
17
+ cachedParser = (0, treeSitterUtils_1.createParser)(grammar);
18
+ }
19
+ catch {
20
+ cachedParser = null;
21
+ }
22
+ }
23
+ return cachedParser;
24
+ }
25
+ function parseJava(filePath, content) {
26
+ const parser = getJavaParser();
27
+ if (!parser) {
28
+ return {
29
+ filePath,
30
+ language: 'java',
31
+ ast: null,
32
+ content,
33
+ parseError: new Error('tree-sitter-java not available'),
34
+ };
35
+ }
36
+ try {
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ const tree = parser.parse(content);
39
+ return { filePath, language: 'java', ast: tree, content };
40
+ }
41
+ catch (err) {
42
+ return {
43
+ filePath,
44
+ language: 'java',
45
+ ast: null,
46
+ content,
47
+ parseError: err instanceof Error ? err : new Error(String(err)),
48
+ };
49
+ }
50
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Java semantic model builder.
3
+ *
4
+ * Walks the tree-sitter Java CST to extract:
5
+ * - static final String constants and enum members
6
+ * - method definitions with their HTTP call bodies
7
+ * - assertion patterns
8
+ * - Cucumber step definition annotations
9
+ */
10
+ import type { SemanticSymbol, SemanticFunction, SemanticHttpCall, SemanticAssertion, BusinessRuleRef, FlowRef } from '../../ast/astTypes';
11
+ import { type TsNode } from '../shared/treeSitterUtils';
12
+ export declare function extractJavaSymbols(root: TsNode): {
13
+ constants: Map<string, SemanticSymbol>;
14
+ enums: Map<string, Map<string, string>>;
15
+ };
16
+ export declare function extractJavaFunctions(root: TsNode, constants: Map<string, SemanticSymbol>): Map<string, SemanticFunction>;
17
+ export declare function extractJavaHttpCalls(block: TsNode, constants: Map<string, SemanticSymbol>, out: SemanticHttpCall[]): void;
18
+ export declare function extractJavaAssertions(root: TsNode): SemanticAssertion[];
19
+ export declare function extractJavaBusinessRuleRefs(root: TsNode): BusinessRuleRef[];
20
+ export declare function extractJavaFlowRefs(root: TsNode): FlowRef[];
21
+ //# sourceMappingURL=semanticBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semanticBuilder.d.ts","sourceRoot":"","sources":["../../../../src/languages/java/semanticBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAEV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,OAAO,EACR,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAKL,KAAK,MAAM,EACZ,MAAM,2BAA2B,CAAC;AAOnC,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GACX;IAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAmErF;AAID,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GACrC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAqC/B;AAID,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACtC,GAAG,EAAE,gBAAgB,EAAE,GACtB,IAAI,CA6DN;AAID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAyBvE;AAID,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAa3E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAa3D"}