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,226 @@
1
+ "use strict";
2
+ /**
3
+ * Deep Code Analysis — Request Object and Builder Pattern Resolution
4
+ *
5
+ * Detects and resolves HTTP calls that are hidden inside request object
6
+ * construction or builder patterns.
7
+ *
8
+ * Supported patterns:
9
+ *
10
+ * TypeScript/JavaScript:
11
+ * const request = new ApiRequest('GET', '/users');
12
+ * client.execute(request);
13
+ *
14
+ * Java:
15
+ * Request req = Request.builder().method(GET).path("/users").build();
16
+ * client.execute(req);
17
+ *
18
+ * Kotlin:
19
+ * val req = RequestBuilder().get().path("/users").build()
20
+ * api.execute(req)
21
+ *
22
+ * Python:
23
+ * request = ApiRequest(method='GET', path='/users')
24
+ * client.execute(request)
25
+ */
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.extractJsRequestBuilders = extractJsRequestBuilders;
28
+ exports.extractJavaRequestBuilders = extractJavaRequestBuilders;
29
+ exports.extractKotlinRequestBuilders = extractKotlinRequestBuilders;
30
+ exports.extractPythonRequestBuilders = extractPythonRequestBuilders;
31
+ exports.extractRequestBuilders = extractRequestBuilders;
32
+ const resolvePaths_1 = require("./resolvePaths");
33
+ const resolveConstants_1 = require("./resolveConstants");
34
+ // ─── TypeScript / JavaScript ──────────────────────────────────────────────────
35
+ /**
36
+ * Extract HTTP calls from TypeScript/JavaScript request object and builder patterns.
37
+ *
38
+ * Detects:
39
+ * new ApiRequest('GET', '/users')
40
+ * new Request({ method: 'GET', url: '/users' })
41
+ * ApiRequest.create({ method: 'get', path: '/users' })
42
+ */
43
+ function extractJsRequestBuilders(content, table) {
44
+ var _a, _b, _c;
45
+ const calls = [];
46
+ let m;
47
+ // new SomeRequest('METHOD', '/path')
48
+ const ctorPattern = /new\s+[A-Za-z][A-Za-z0-9_]*Request\s*\(\s*['"`](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)[`'"]\s*,\s*['"`]([^'"`]+)['"`]/gi;
49
+ while ((m = ctorPattern.exec(content)) !== null) {
50
+ const path = (_a = (0, resolveConstants_1.resolveToken)(m[2], table)) !== null && _a !== void 0 ? _a : m[2];
51
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
52
+ calls.push({
53
+ method: m[1].toUpperCase(),
54
+ path,
55
+ normalizedPath: normalized !== path ? normalized : undefined,
56
+ confidence: 'high',
57
+ pattern: 'constructor(method, path)',
58
+ });
59
+ }
60
+ // { method: 'GET', url: '/path' } or { method: 'GET', path: '/path' }
61
+ const objLiteralPattern = /\{\s*(?:method|verb)\s*:\s*['"`](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)['"`]\s*,\s*(?:url|path|endpoint)\s*:\s*['"`]([^'"`]+)['"`]/gi;
62
+ while ((m = objLiteralPattern.exec(content)) !== null) {
63
+ const path = (_b = (0, resolveConstants_1.resolveToken)(m[2], table)) !== null && _b !== void 0 ? _b : m[2];
64
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
65
+ calls.push({
66
+ method: m[1].toUpperCase(),
67
+ path,
68
+ normalizedPath: normalized !== path ? normalized : undefined,
69
+ confidence: 'high',
70
+ pattern: 'object literal {method, path}',
71
+ });
72
+ }
73
+ // fetch('/path', { method: 'POST' })
74
+ const fetchPattern = /\bfetch\s*\(\s*['"`]([^'"`]+)['"`]\s*,\s*\{[^}]*(?:method|verb)\s*:\s*['"`](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)['"`]/gi;
75
+ while ((m = fetchPattern.exec(content)) !== null) {
76
+ const path = (_c = (0, resolveConstants_1.resolveToken)(m[1], table)) !== null && _c !== void 0 ? _c : m[1];
77
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
78
+ calls.push({
79
+ method: m[2].toUpperCase(),
80
+ path,
81
+ normalizedPath: normalized !== path ? normalized : undefined,
82
+ confidence: 'high',
83
+ pattern: 'fetch(url, {method})',
84
+ });
85
+ }
86
+ return calls;
87
+ }
88
+ // ─── Java ─────────────────────────────────────────────────────────────────────
89
+ /**
90
+ * Extract HTTP calls from Java builder patterns.
91
+ *
92
+ * Detects:
93
+ * Request.builder().method(HttpMethod.GET).path("/users").build()
94
+ * new HttpRequest.Builder().uri("/users").method("GET", ...).build()
95
+ * MockMvcRequestBuilders.get("/users")
96
+ */
97
+ function extractJavaRequestBuilders(content, table) {
98
+ var _a, _b;
99
+ const calls = [];
100
+ let m;
101
+ // .method(GET|HttpMethod.GET|"GET").path("/users") or reversed
102
+ const builderMethodPath = /\.method\s*\(\s*(?:HttpMethod\.)?["']?(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)["']?\s*[,)][^;]*\.(?:path|uri)\s*\(\s*"([^"]+)"/gi;
103
+ while ((m = builderMethodPath.exec(content)) !== null) {
104
+ const path = (_a = (0, resolveConstants_1.resolveToken)(m[2], table)) !== null && _a !== void 0 ? _a : m[2];
105
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
106
+ calls.push({
107
+ method: m[1].toUpperCase(),
108
+ path,
109
+ normalizedPath: normalized !== path ? normalized : undefined,
110
+ confidence: 'high',
111
+ pattern: 'builder .method().path()',
112
+ });
113
+ }
114
+ // .path("/users").method("GET") reversed order
115
+ const builderPathMethod = /\.(?:path|uri)\s*\(\s*"([^"]+)"\s*\)[^;]*\.method\s*\(\s*(?:HttpMethod\.)?["']?(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)/gi;
116
+ while ((m = builderPathMethod.exec(content)) !== null) {
117
+ const path = (_b = (0, resolveConstants_1.resolveToken)(m[1], table)) !== null && _b !== void 0 ? _b : m[1];
118
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
119
+ calls.push({
120
+ method: m[2].toUpperCase(),
121
+ path,
122
+ normalizedPath: normalized !== path ? normalized : undefined,
123
+ confidence: 'high',
124
+ pattern: 'builder .path().method()',
125
+ });
126
+ }
127
+ return calls;
128
+ }
129
+ // ─── Kotlin ───────────────────────────────────────────────────────────────────
130
+ /**
131
+ * Extract HTTP calls from Kotlin builder patterns.
132
+ *
133
+ * Detects:
134
+ * RequestBuilder().get().path("/users").build()
135
+ * val req = RequestBuilder().method("GET").path("/users").build()
136
+ */
137
+ function extractKotlinRequestBuilders(content, table) {
138
+ var _a, _b;
139
+ const calls = [];
140
+ let m;
141
+ // .get().path("/users") — method via chain method name
142
+ const chainPattern = /\.(get|post|put|patch|delete|head|options)\s*\(\s*\)\s*\.path\s*\(\s*["']([^"']+)["']/gi;
143
+ while ((m = chainPattern.exec(content)) !== null) {
144
+ const path = (_a = (0, resolveConstants_1.resolveToken)(m[2], table)) !== null && _a !== void 0 ? _a : m[2];
145
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
146
+ calls.push({
147
+ method: m[1].toUpperCase(),
148
+ path,
149
+ normalizedPath: normalized !== path ? normalized : undefined,
150
+ confidence: 'high',
151
+ pattern: 'builder .method().path()',
152
+ });
153
+ }
154
+ // .method("GET").path("/users")
155
+ const methodPathPattern = /\.method\s*\(\s*["']?(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)["']?\s*\)\s*\.path\s*\(\s*["']([^"']+)["']/gi;
156
+ while ((m = methodPathPattern.exec(content)) !== null) {
157
+ const path = (_b = (0, resolveConstants_1.resolveToken)(m[2], table)) !== null && _b !== void 0 ? _b : m[2];
158
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
159
+ calls.push({
160
+ method: m[1].toUpperCase(),
161
+ path,
162
+ normalizedPath: normalized !== path ? normalized : undefined,
163
+ confidence: 'high',
164
+ pattern: 'builder .method().path()',
165
+ });
166
+ }
167
+ return calls;
168
+ }
169
+ // ─── Python ───────────────────────────────────────────────────────────────────
170
+ /**
171
+ * Extract HTTP calls from Python request object patterns.
172
+ *
173
+ * Detects:
174
+ * ApiRequest(method='GET', path='/users')
175
+ * requests.Request('GET', '/users')
176
+ */
177
+ function extractPythonRequestBuilders(content, table) {
178
+ var _a, _b;
179
+ const calls = [];
180
+ let m;
181
+ // ApiRequest(method='GET', path='/users')
182
+ const kwPattern = /\w+\s*\(\s*method\s*=\s*['"`](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)['"`]\s*,\s*(?:path|url|endpoint)\s*=\s*['"`]([^'"`]+)['"`]/gi;
183
+ while ((m = kwPattern.exec(content)) !== null) {
184
+ const path = (_a = (0, resolveConstants_1.resolveToken)(m[2], table)) !== null && _a !== void 0 ? _a : m[2];
185
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
186
+ calls.push({
187
+ method: m[1].toUpperCase(),
188
+ path,
189
+ normalizedPath: normalized !== path ? normalized : undefined,
190
+ confidence: 'high',
191
+ pattern: 'Request(method=, path=)',
192
+ });
193
+ }
194
+ // requests.Request('GET', 'http://host/path')
195
+ const posPattern = /requests\.Request\s*\(\s*['"`](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)['"`]\s*,\s*['"`]([^'"`]+)['"`]/gi;
196
+ while ((m = posPattern.exec(content)) !== null) {
197
+ const path = (_b = (0, resolveConstants_1.resolveToken)(m[2], table)) !== null && _b !== void 0 ? _b : m[2];
198
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
199
+ calls.push({
200
+ method: m[1].toUpperCase(),
201
+ path,
202
+ normalizedPath: normalized !== path ? normalized : undefined,
203
+ confidence: 'high',
204
+ pattern: 'requests.Request(method, url)',
205
+ });
206
+ }
207
+ return calls;
208
+ }
209
+ // ─── Dispatcher ───────────────────────────────────────────────────────────────
210
+ /**
211
+ * Extract request builder / request object HTTP calls for any supported language.
212
+ */
213
+ function extractRequestBuilders(content, language, table) {
214
+ switch (language) {
215
+ case 'java':
216
+ return extractJavaRequestBuilders(content, table);
217
+ case 'kotlin':
218
+ return [...extractKotlinRequestBuilders(content, table), ...extractJavaRequestBuilders(content, table)];
219
+ case 'python':
220
+ return extractPythonRequestBuilders(content, table);
221
+ case 'typescript':
222
+ case 'javascript':
223
+ default:
224
+ return extractJsRequestBuilders(content, table);
225
+ }
226
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Deep Code Analysis — Symbol Table
3
+ *
4
+ * Extracts named symbols (constants, variables, enum members) from source
5
+ * file content across all supported languages and builds a per-file symbol
6
+ * table for downstream resolvers.
7
+ */
8
+ import type { SymbolTable } from './types';
9
+ /**
10
+ * Extract symbols from TypeScript/JavaScript source.
11
+ *
12
+ * Captures:
13
+ * - const NAME = 'value' (top-level and local)
14
+ * - let NAME = 'value'
15
+ * - var NAME = 'value'
16
+ * - enum Foo { MEMBER = 'value' } (string enums)
17
+ * - const obj = { key: 'value' } — top-level object property literals
18
+ */
19
+ export declare function buildSymbolTableFromJs(content: string): SymbolTable;
20
+ /**
21
+ * Extract symbols from Java source.
22
+ *
23
+ * Captures:
24
+ * - static final String NAME = "value";
25
+ * - final String NAME = "value";
26
+ * - String NAME = "value";
27
+ * - enum Routes { USERS("/users"), ... } (constructor-style enums)
28
+ */
29
+ export declare function buildSymbolTableFromJava(content: string): SymbolTable;
30
+ /**
31
+ * Extract symbols from Kotlin source.
32
+ *
33
+ * Captures:
34
+ * - const val NAME = "value"
35
+ * - val NAME = "value"
36
+ * - enum class Routes(val path: String) { USERS("/users"), ... }
37
+ * - object Constants { const val NAME = "value" }
38
+ */
39
+ export declare function buildSymbolTableFromKotlin(content: string): SymbolTable;
40
+ /**
41
+ * Extract symbols from Python source.
42
+ *
43
+ * Captures:
44
+ * - UPPER_CASE = "/path" (module-level constants)
45
+ * - class Routes(Enum): USERS = "/users"
46
+ */
47
+ export declare function buildSymbolTableFromPython(content: string): SymbolTable;
48
+ /**
49
+ * Build a symbol table from source content for the given language.
50
+ */
51
+ export declare function buildSymbolTable(content: string, language: 'typescript' | 'javascript' | 'java' | 'kotlin' | 'python' | 'ruby' | 'cucumber' | 'auto'): SymbolTable;
52
+ /**
53
+ * Resolve a symbol name to its string value using the table.
54
+ * Returns undefined when the symbol is not found or has no static value.
55
+ * Prevents infinite loops via a resolving guard flag.
56
+ */
57
+ export declare function resolveSymbol(name: string, table: SymbolTable): string | undefined;
58
+ //# sourceMappingURL=symbolTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbolTable.d.ts","sourceRoot":"","sources":["../../../../src/coverage/deep-analysis/symbolTable.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,SAAS,CAAC;AAIxD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CA8CnE;AAID;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAoCrE;AAID;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAyCvE;AAID;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAmCvE;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAClG,WAAW,CAcb;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAKlF"}
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ /**
3
+ * Deep Code Analysis — Symbol Table
4
+ *
5
+ * Extracts named symbols (constants, variables, enum members) from source
6
+ * file content across all supported languages and builds a per-file symbol
7
+ * table for downstream resolvers.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.buildSymbolTableFromJs = buildSymbolTableFromJs;
11
+ exports.buildSymbolTableFromJava = buildSymbolTableFromJava;
12
+ exports.buildSymbolTableFromKotlin = buildSymbolTableFromKotlin;
13
+ exports.buildSymbolTableFromPython = buildSymbolTableFromPython;
14
+ exports.buildSymbolTable = buildSymbolTable;
15
+ exports.resolveSymbol = resolveSymbol;
16
+ // ─── TypeScript / JavaScript ──────────────────────────────────────────────────
17
+ /**
18
+ * Extract symbols from TypeScript/JavaScript source.
19
+ *
20
+ * Captures:
21
+ * - const NAME = 'value' (top-level and local)
22
+ * - let NAME = 'value'
23
+ * - var NAME = 'value'
24
+ * - enum Foo { MEMBER = 'value' } (string enums)
25
+ * - const obj = { key: 'value' } — top-level object property literals
26
+ */
27
+ function buildSymbolTableFromJs(content) {
28
+ const table = new Map();
29
+ // Simple const/let/var assignments with a string literal value (allow empty strings)
30
+ const varPattern = /\b(const|let|var)\s+([A-Za-z_$][A-Za-z0-9_$]*)\s*=\s*['"`]([^'"`\n]*)['"`]/g;
31
+ let m;
32
+ while ((m = varPattern.exec(content)) !== null) {
33
+ const [, kind, name, value] = m;
34
+ table.set(name, {
35
+ name,
36
+ kind: kind === 'const' ? 'const' : kind === 'let' ? 'let' : 'var',
37
+ value,
38
+ });
39
+ }
40
+ // TypeScript string enum members: enum Routes { USERS = '/users' }
41
+ // Allow {param} segments inside enum body strings (e.g. "/users/{id}")
42
+ const enumPattern = /\benum\s+([A-Za-z_$][A-Za-z0-9_$]*)\s*\{((?:[^{}]|\{[^}]*\})*)\}/g;
43
+ while ((m = enumPattern.exec(content)) !== null) {
44
+ const enumName = m[1];
45
+ const body = m[2];
46
+ const memberPattern = /([A-Za-z_$][A-Za-z0-9_$]*)\s*=\s*['"`]([^'"`\n]+)['"`]/g;
47
+ let mm;
48
+ while ((mm = memberPattern.exec(body)) !== null) {
49
+ const [, member, value] = mm;
50
+ // Register as both Routes.USERS and bare USERS
51
+ table.set(`${enumName}.${member}`, { name: `${enumName}.${member}`, kind: 'enum', value });
52
+ table.set(member, { name: member, kind: 'enum', value });
53
+ }
54
+ }
55
+ // Object literal properties: const Paths = { USERS: '/users', ... }
56
+ const objPattern = /\b(?:const|let|var)\s+([A-Za-z_$][A-Za-z0-9_$]*)\s*=\s*\{([^}]+)\}/g;
57
+ while ((m = objPattern.exec(content)) !== null) {
58
+ const objName = m[1];
59
+ const body = m[2];
60
+ const propPattern = /([A-Za-z_$][A-Za-z0-9_$]*)\s*:\s*['"`]([^'"`\n]+)['"`]/g;
61
+ let mm;
62
+ while ((mm = propPattern.exec(body)) !== null) {
63
+ const [, prop, value] = mm;
64
+ table.set(`${objName}.${prop}`, { name: `${objName}.${prop}`, kind: 'property', value });
65
+ // Don't register bare property names to avoid collisions
66
+ }
67
+ }
68
+ return table;
69
+ }
70
+ // ─── Java ─────────────────────────────────────────────────────────────────────
71
+ /**
72
+ * Extract symbols from Java source.
73
+ *
74
+ * Captures:
75
+ * - static final String NAME = "value";
76
+ * - final String NAME = "value";
77
+ * - String NAME = "value";
78
+ * - enum Routes { USERS("/users"), ... } (constructor-style enums)
79
+ */
80
+ function buildSymbolTableFromJava(content) {
81
+ const table = new Map();
82
+ // Static/final string constants
83
+ const constPattern = /(?:(?:private|public|protected|package)\s+)?(?:static\s+)?(?:final\s+)?String\s+([A-Z_][A-Z0-9_]*)\s*=\s*"([^"\\]*(?:\\.[^"\\]*)*)"/g;
84
+ let m;
85
+ while ((m = constPattern.exec(content)) !== null) {
86
+ table.set(m[1], { name: m[1], kind: 'const', value: m[2] });
87
+ }
88
+ // Camel-case constants too (e.g. private static final String basePath = "/api")
89
+ const camelPattern = /(?:(?:private|public|protected|package)\s+)?(?:static\s+)?(?:final\s+)?String\s+([a-z][A-Za-z0-9_]*)\s*=\s*"([^"\\]*(?:\\.[^"\\]*)*)"/g;
90
+ while ((m = camelPattern.exec(content)) !== null) {
91
+ if (!table.has(m[1])) {
92
+ table.set(m[1], { name: m[1], kind: 'const', value: m[2] });
93
+ }
94
+ }
95
+ // Enum constructor style: USERS("/users")
96
+ // Allow {param} segments inside enum body strings (e.g. "/users/{id}")
97
+ const enumBlock = /enum\s+([A-Za-z_][A-Za-z0-9_]*)\s*\{((?:[^{}]|\{[^}]*\})*)\}/g;
98
+ while ((m = enumBlock.exec(content)) !== null) {
99
+ const enumName = m[1];
100
+ const body = m[2];
101
+ const memberPattern = /([A-Z_][A-Z0-9_]*)\s*\(\s*"([^"]+)"/g;
102
+ let mm;
103
+ while ((mm = memberPattern.exec(body)) !== null) {
104
+ const [, member, value] = mm;
105
+ table.set(`${enumName}.${member}`, { name: `${enumName}.${member}`, kind: 'enum', value });
106
+ table.set(member, { name: member, kind: 'enum', value });
107
+ }
108
+ }
109
+ return table;
110
+ }
111
+ // ─── Kotlin ───────────────────────────────────────────────────────────────────
112
+ /**
113
+ * Extract symbols from Kotlin source.
114
+ *
115
+ * Captures:
116
+ * - const val NAME = "value"
117
+ * - val NAME = "value"
118
+ * - enum class Routes(val path: String) { USERS("/users"), ... }
119
+ * - object Constants { const val NAME = "value" }
120
+ */
121
+ function buildSymbolTableFromKotlin(content) {
122
+ const table = new Map();
123
+ // const val and val string assignments
124
+ const valPattern = /\b(?:const\s+)?val\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*["']([^"'\n]+)["']/g;
125
+ let m;
126
+ while ((m = valPattern.exec(content)) !== null) {
127
+ table.set(m[1], { name: m[1], kind: 'const', value: m[2] });
128
+ }
129
+ // Kotlin enum class with constructor argument: USERS("/users")
130
+ const enumBlock = /enum\s+class\s+([A-Za-z_][A-Za-z0-9_]*)[^{]*\{([^}]+)\}/gs;
131
+ while ((m = enumBlock.exec(content)) !== null) {
132
+ const enumName = m[1];
133
+ const body = m[2];
134
+ const memberPattern = /([A-Z_][A-Z0-9_]*)\s*\(\s*["']([^"']+)["']/g;
135
+ let mm;
136
+ while ((mm = memberPattern.exec(body)) !== null) {
137
+ const [, member, value] = mm;
138
+ table.set(`${enumName}.${member}`, { name: `${enumName}.${member}`, kind: 'enum', value });
139
+ table.set(member, { name: member, kind: 'enum', value });
140
+ }
141
+ }
142
+ // Kotlin object/companion object property: object Routes { const val USERS = "/users" }
143
+ const objectBlock = /(?:companion\s+)?object\s+([A-Za-z_][A-Za-z0-9_]*)\s*\{([^}]+)\}/g;
144
+ while ((m = objectBlock.exec(content)) !== null) {
145
+ const objName = m[1];
146
+ const body = m[2];
147
+ const propPattern = /\b(?:const\s+)?val\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*["']([^"'\n]+)["']/g;
148
+ let mm;
149
+ while ((mm = propPattern.exec(body)) !== null) {
150
+ const [, prop, value] = mm;
151
+ table.set(`${objName}.${prop}`, { name: `${objName}.${prop}`, kind: 'property', value });
152
+ if (!table.has(prop)) {
153
+ table.set(prop, { name: prop, kind: 'const', value });
154
+ }
155
+ }
156
+ }
157
+ return table;
158
+ }
159
+ // ─── Python ───────────────────────────────────────────────────────────────────
160
+ /**
161
+ * Extract symbols from Python source.
162
+ *
163
+ * Captures:
164
+ * - UPPER_CASE = "/path" (module-level constants)
165
+ * - class Routes(Enum): USERS = "/users"
166
+ */
167
+ function buildSymbolTableFromPython(content) {
168
+ const table = new Map();
169
+ // Module-level UPPER_CASE constants
170
+ const constPattern = /^([A-Z_][A-Z0-9_]*)\s*=\s*['"]([^'"\n]+)['"]/gm;
171
+ let m;
172
+ while ((m = constPattern.exec(content)) !== null) {
173
+ table.set(m[1], { name: m[1], kind: 'const', value: m[2] });
174
+ }
175
+ // Also capture lower-case module-level string assignments
176
+ const lowerPattern = /^([a-z_][a-z0-9_]*)\s*=\s*['"]([^'"\n]+)['"]/gm;
177
+ while ((m = lowerPattern.exec(content)) !== null) {
178
+ if (!table.has(m[1])) {
179
+ table.set(m[1], { name: m[1], kind: 'let', value: m[2] });
180
+ }
181
+ }
182
+ // Enum class members: class Routes(Enum):\n USERS = "/users"
183
+ // Note: no \s* after colon — the \n must be left for the body group to match
184
+ // Use [ \t]* (not \s*) for trailing whitespace to avoid consuming next line's \n
185
+ const enumBlock = /class\s+([A-Za-z_][A-Za-z0-9_]*)\s*\([^)]*Enum[^)]*\):((?:\n[ \t]+[A-Z_][A-Z0-9_]*\s*=\s*['"][^'"]+['"][ \t]*)+)/g;
186
+ while ((m = enumBlock.exec(content)) !== null) {
187
+ const enumName = m[1];
188
+ const body = m[2];
189
+ const memberPattern = /([A-Z_][A-Z0-9_]*)\s*=\s*['"]([^'"]+)['"]/g;
190
+ let mm;
191
+ while ((mm = memberPattern.exec(body)) !== null) {
192
+ const [, member, value] = mm;
193
+ table.set(`${enumName}.${member}`, { name: `${enumName}.${member}`, kind: 'enum', value });
194
+ table.set(member, { name: member, kind: 'enum', value });
195
+ }
196
+ }
197
+ return table;
198
+ }
199
+ // ─── Dispatcher ───────────────────────────────────────────────────────────────
200
+ /**
201
+ * Build a symbol table from source content for the given language.
202
+ */
203
+ function buildSymbolTable(content, language) {
204
+ switch (language) {
205
+ case 'java':
206
+ return buildSymbolTableFromJava(content);
207
+ case 'kotlin':
208
+ return buildSymbolTableFromKotlin(content);
209
+ case 'python':
210
+ return buildSymbolTableFromPython(content);
211
+ case 'typescript':
212
+ case 'javascript':
213
+ case 'auto':
214
+ default:
215
+ return buildSymbolTableFromJs(content);
216
+ }
217
+ }
218
+ /**
219
+ * Resolve a symbol name to its string value using the table.
220
+ * Returns undefined when the symbol is not found or has no static value.
221
+ * Prevents infinite loops via a resolving guard flag.
222
+ */
223
+ function resolveSymbol(name, table) {
224
+ const entry = table.get(name);
225
+ if (!entry || entry.resolving)
226
+ return undefined;
227
+ if (entry.value !== undefined)
228
+ return entry.value;
229
+ return undefined;
230
+ }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Deep Code Analysis — Shared Types
3
+ *
4
+ * Types used across all deep-analysis sub-modules.
5
+ */
6
+ /**
7
+ * How the HTTP call was resolved. 'direct' means a literal string was found
8
+ * in the call site; all other types represent an indirection that was resolved.
9
+ */
10
+ export type ResolutionType = 'direct' | 'constant' | 'enum' | 'string-template' | 'interpolated-path' | 'wrapper-method' | 'request-builder' | 'client-mapping' | 'client-abstraction' | 'cucumber-step' | 'heuristic';
11
+ /**
12
+ * The kind of assertion that was linked to an HTTP interaction.
13
+ */
14
+ export type AssertionType = 'status-code' | 'body-field' | 'fluent-chain' | 'exception-catch' | 'none';
15
+ export type ConfidenceLevel = 'high' | 'medium' | 'low';
16
+ /**
17
+ * A fully or partially resolved HTTP call produced by the deep-analysis layer.
18
+ */
19
+ export interface ResolvedHttpCall {
20
+ /** HTTP method in upper-case (GET, POST, …) */
21
+ method: string;
22
+ /** Raw path as resolved (may contain variables like /users/123) */
23
+ path: string;
24
+ /**
25
+ * Path normalized to an OpenAPI path template.
26
+ * e.g. /users/123 → /users/{id}
27
+ */
28
+ normalizedPath?: string;
29
+ /** Absolute path of the source file where the call was found */
30
+ sourceFile: string;
31
+ /** Language the call was found in */
32
+ sourceLanguage: string;
33
+ /** How the endpoint was resolved */
34
+ resolutionType: ResolutionType;
35
+ /** Confidence level of the resolution */
36
+ confidence: ConfidenceLevel;
37
+ /** Whether the call was followed by an assertion on the response */
38
+ assertionLinked?: boolean;
39
+ /** The type of assertion linked to this call, if any */
40
+ assertionType?: AssertionType;
41
+ /** The raw call text as it appeared in the source for debugging */
42
+ rawCall?: string;
43
+ }
44
+ export type SymbolKind = 'const' | 'let' | 'var' | 'enum' | 'parameter' | 'property' | 'function';
45
+ /** A single symbol entry extracted from a source file */
46
+ export interface SymbolEntry {
47
+ /** Symbol identifier name */
48
+ name: string;
49
+ /** Symbol declaration kind */
50
+ kind: SymbolKind;
51
+ /** Statically known string value, if any */
52
+ value?: string;
53
+ /** Guard against circular resolution */
54
+ resolving?: boolean;
55
+ /** Line number where the symbol is declared (1-based, if known) */
56
+ line?: number;
57
+ }
58
+ /** Per-file symbol lookup map */
59
+ export type SymbolTable = Map<string, SymbolEntry>;
60
+ /**
61
+ * A user-defined mapping from a domain-level client method call to an HTTP
62
+ * method + path template. Used to resolve calls like userClient.getById(id).
63
+ */
64
+ export interface ClientMethodMapping {
65
+ /** The class or object name (e.g. 'userClient', 'PaymentsApi') */
66
+ classOrObject: string;
67
+ /** The method name (e.g. 'getById', 'createRefund') */
68
+ method: string;
69
+ /** HTTP method in upper-case (e.g. 'GET') */
70
+ httpMethod: string;
71
+ /** OpenAPI-style path template (e.g. '/users/{id}') */
72
+ pathTemplate: string;
73
+ }
74
+ /**
75
+ * Configuration for the deep-endpoint-analysis feature.
76
+ */
77
+ export interface DeepAnalysisConfig {
78
+ /** Master switch. When false the engine falls back to direct regex only. */
79
+ enabled: boolean;
80
+ /** Maximum number of method-call levels to follow when tracing wrappers. */
81
+ maxCallDepth: number;
82
+ /** Resolve named constant/variable references to their literal values. */
83
+ resolveConstants: boolean;
84
+ /** Resolve enum member references to their literal path values. */
85
+ resolveEnums: boolean;
86
+ /** Resolve template literals and string concatenation. */
87
+ resolveStringTemplates: boolean;
88
+ /** Trace helper/wrapper methods one or more levels to find HTTP calls. */
89
+ resolveWrappers: boolean;
90
+ /** Detect request-builder / request-object patterns. */
91
+ resolveRequestBuilders: boolean;
92
+ /** Apply explicit or inferred client-to-HTTP-method mapping. */
93
+ resolveClientMappings: boolean;
94
+ /** Associate HTTP calls with downstream response assertions. */
95
+ assertionAware: boolean;
96
+ /** Explicit client-method → HTTP mappings (optional, user-supplied). */
97
+ clientMappings?: ClientMethodMapping[];
98
+ }
99
+ /** Default deep-analysis configuration (enabled, all features on). */
100
+ export declare const DEFAULT_DEEP_ANALYSIS_CONFIG: DeepAnalysisConfig;
101
+ /**
102
+ * A node in the per-file call graph.
103
+ * Represents one function/method defined in the same file.
104
+ */
105
+ export interface CallGraphNode {
106
+ /** Function/method name */
107
+ name: string;
108
+ /** Raw body text of the function */
109
+ body: string;
110
+ /** Names of other local functions this one calls */
111
+ calls: string[];
112
+ /** HTTP calls found directly in this function body (before wrapper resolution) */
113
+ directHttpCalls: Array<{
114
+ method: string;
115
+ path: string;
116
+ }>;
117
+ /** The static return value if the function just returns a string literal */
118
+ returnValue?: string;
119
+ }
120
+ /** Per-file call graph */
121
+ export type CallGraph = Map<string, CallGraphNode>;
122
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/coverage/deep-analysis/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Deep Code Analysis — Shared Types
4
+ *
5
+ * Types used across all deep-analysis sub-modules.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DEFAULT_DEEP_ANALYSIS_CONFIG = void 0;
9
+ /** Default deep-analysis configuration (enabled, all features on). */
10
+ exports.DEFAULT_DEEP_ANALYSIS_CONFIG = {
11
+ enabled: true,
12
+ maxCallDepth: 4,
13
+ resolveConstants: true,
14
+ resolveEnums: true,
15
+ resolveStringTemplates: true,
16
+ resolveWrappers: true,
17
+ resolveRequestBuilders: true,
18
+ resolveClientMappings: true,
19
+ assertionAware: true,
20
+ clientMappings: [],
21
+ };