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,394 @@
1
+ "use strict";
2
+ /**
3
+ * Deep Code Analysis — Deep Endpoint Resolver
4
+ *
5
+ * Orchestrates all deep-analysis sub-modules to extract HTTP calls from a
6
+ * single source file, resolving constants, enums, string templates, wrapper
7
+ * methods, request builders, and assertion linkage.
8
+ *
9
+ * The main entry point is `deepResolveFile()`.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.extractResponseVariables = void 0;
13
+ exports.deepResolveFile = deepResolveFile;
14
+ const types_1 = require("./types");
15
+ const symbolTable_1 = require("./symbolTable");
16
+ const resolveConstants_1 = require("./resolveConstants");
17
+ const resolveEnums_1 = require("./resolveEnums");
18
+ const resolvePaths_1 = require("./resolvePaths");
19
+ const callGraph_1 = require("./callGraph");
20
+ const resolveMethodChains_1 = require("./resolveMethodChains");
21
+ const resolveRequestWrappers_1 = require("./resolveRequestWrappers");
22
+ const resolveAssertions_1 = require("./resolveAssertions");
23
+ Object.defineProperty(exports, "extractResponseVariables", { enumerable: true, get: function () { return resolveAssertions_1.extractResponseVariables; } });
24
+ // ─── Main entry point ─────────────────────────────────────────────────────────
25
+ /**
26
+ * Run deep endpoint analysis on a single source file.
27
+ *
28
+ * @param content Raw file content
29
+ * @param filePath Absolute path (used in output metadata)
30
+ * @param language Detected language
31
+ * @param config Deep analysis feature configuration
32
+ * @returns Array of resolved HTTP calls with resolution metadata
33
+ */
34
+ function deepResolveFile(content, filePath, language, config = types_1.DEFAULT_DEEP_ANALYSIS_CONFIG) {
35
+ if (!config.enabled)
36
+ return [];
37
+ const results = [];
38
+ const seen = new Set();
39
+ // ── 1. Build symbol table ────────────────────────────────────────────────
40
+ const table = (0, symbolTable_1.buildSymbolTable)(content, language);
41
+ // ── 2. Build call graph ──────────────────────────────────────────────────
42
+ const graph = language === 'java' || language === 'kotlin'
43
+ ? (0, callGraph_1.buildJavaCallGraph)(content)
44
+ : language === 'python'
45
+ ? (0, callGraph_1.buildPythonCallGraph)(content)
46
+ : (0, callGraph_1.buildJsCallGraph)(content);
47
+ // ── 3. Build assertion map ───────────────────────────────────────────────
48
+ const assertionMap = config.assertionAware ? (0, resolveAssertions_1.buildAssertionMap)(content) : new Map();
49
+ // ── 4. Resolve constant-backed HTTP calls ────────────────────────────────
50
+ if (config.resolveConstants || config.resolveEnums) {
51
+ const calls = extractHttpCallsWithVariableArgs(content, language);
52
+ for (const call of calls) {
53
+ const resolved = resolveCallArg(call.rawArg, table, config);
54
+ if (resolved) {
55
+ const path = stripUrlBase(resolved);
56
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
57
+ const assertionLinked = lookupAssertionLinked(call.responseVar, assertionMap);
58
+ addUnique(results, seen, {
59
+ method: call.method,
60
+ path,
61
+ normalizedPath: normalized !== path ? normalized : undefined,
62
+ sourceFile: filePath,
63
+ sourceLanguage: language,
64
+ resolutionType: call.resolutionType,
65
+ confidence: call.confidence,
66
+ assertionLinked,
67
+ rawCall: call.rawCall,
68
+ });
69
+ }
70
+ }
71
+ }
72
+ // ── 5. Resolve template literal paths ────────────────────────────────────
73
+ if (config.resolveStringTemplates) {
74
+ const templateCalls = extractTemplateArgHttpCalls(content, language);
75
+ for (const call of templateCalls) {
76
+ let resolved;
77
+ if (language === 'python') {
78
+ resolved = (0, resolvePaths_1.resolvePythonFString)(call.rawPath, table);
79
+ }
80
+ else if (language === 'java' || language === 'kotlin') {
81
+ resolved = (0, resolvePaths_1.resolveJavaConcatenation)(call.rawPath, table);
82
+ }
83
+ else {
84
+ // Check for template literal
85
+ if (call.rawPath.includes('${')) {
86
+ resolved = (0, resolvePaths_1.resolveTemplateLiteral)(call.rawPath, table);
87
+ }
88
+ else {
89
+ resolved = (0, resolvePaths_1.resolveStringConcatenation)(call.rawPath, table);
90
+ }
91
+ }
92
+ if (resolved && resolved.includes('/')) {
93
+ const path = stripUrlBase(resolved);
94
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
95
+ const assertionLinked = lookupAssertionLinked(call.responseVar, assertionMap);
96
+ addUnique(results, seen, {
97
+ method: call.method,
98
+ path,
99
+ normalizedPath: normalized !== path ? normalized : undefined,
100
+ sourceFile: filePath,
101
+ sourceLanguage: language,
102
+ resolutionType: 'string-template',
103
+ confidence: resolved.includes('{') ? 'medium' : 'high',
104
+ assertionLinked,
105
+ rawCall: call.rawCall,
106
+ });
107
+ }
108
+ }
109
+ }
110
+ // ── 6. Resolve request builder / object patterns ─────────────────────────
111
+ if (config.resolveRequestBuilders) {
112
+ const builderCalls = (0, resolveRequestWrappers_1.extractRequestBuilders)(content, language, table);
113
+ for (const call of builderCalls) {
114
+ const assertionLinked = false; // Cannot easily trace for builders without var tracking
115
+ addUnique(results, seen, {
116
+ method: call.method,
117
+ path: call.path,
118
+ normalizedPath: call.normalizedPath,
119
+ sourceFile: filePath,
120
+ sourceLanguage: language,
121
+ resolutionType: 'request-builder',
122
+ confidence: call.confidence,
123
+ assertionLinked,
124
+ });
125
+ }
126
+ }
127
+ // ── 7. Resolve wrapper/helper method calls ────────────────────────────────
128
+ if (config.resolveWrappers) {
129
+ // Find top-level calls that reference local functions
130
+ const helperCalls = language === 'java' || language === 'kotlin'
131
+ ? (0, resolveMethodChains_1.extractJavaHelperCallsInHttpArgs)(content)
132
+ : language === 'python'
133
+ ? (0, resolveMethodChains_1.extractPythonHelperCallsInHttpArgs)(content)
134
+ : (0, resolveMethodChains_1.extractJsHelperCallsInHttpArgs)(content);
135
+ for (const { method, helperName } of helperCalls) {
136
+ // First, try to get a return path from the helper
137
+ const returnPath = (0, resolveMethodChains_1.resolveHelperReturnPath)(helperName, graph, table, config.maxCallDepth);
138
+ if (returnPath) {
139
+ const resolved = language === 'python'
140
+ ? (0, resolvePaths_1.resolvePythonFString)(returnPath, table)
141
+ : (0, resolvePaths_1.resolveTemplateLiteral)(returnPath, table);
142
+ const path = stripUrlBase(resolved);
143
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
144
+ addUnique(results, seen, {
145
+ method,
146
+ path,
147
+ normalizedPath: normalized !== path ? normalized : undefined,
148
+ sourceFile: filePath,
149
+ sourceLanguage: language,
150
+ resolutionType: 'wrapper-method',
151
+ confidence: 'high',
152
+ });
153
+ }
154
+ else {
155
+ // Try resolving the entire wrapper body for HTTP calls
156
+ const wrapperResults = (0, resolveMethodChains_1.resolveWrapperCall)(helperName, graph, table, filePath, language, config.maxCallDepth);
157
+ for (const r of wrapperResults) {
158
+ addUnique(results, seen, r);
159
+ }
160
+ }
161
+ }
162
+ // Also scan all call graph nodes for direct HTTP calls inside them
163
+ // (catches helpers called from wrapper functions)
164
+ for (const [fnName, node] of graph.entries()) {
165
+ for (const { method, path } of node.directHttpCalls) {
166
+ // Only include if the function is called from the top-level content
167
+ const calledFromTopLevel = new RegExp(`\\b${escapeRegex(fnName)}\\s*\\(`).test(content);
168
+ if (calledFromTopLevel) {
169
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
170
+ addUnique(results, seen, {
171
+ method,
172
+ path,
173
+ normalizedPath: normalized !== path ? normalized : undefined,
174
+ sourceFile: filePath,
175
+ sourceLanguage: language,
176
+ resolutionType: 'wrapper-method',
177
+ confidence: 'medium',
178
+ });
179
+ }
180
+ }
181
+ }
182
+ }
183
+ // ── 8. Client mapping resolution ─────────────────────────────────────────
184
+ if (config.resolveClientMappings && config.clientMappings && config.clientMappings.length > 0) {
185
+ for (const mapping of config.clientMappings) {
186
+ const callPattern = new RegExp(`\\b${escapeRegex(mapping.classOrObject)}\\.${escapeRegex(mapping.method)}\\s*\\(`, 'g');
187
+ if (callPattern.test(content)) {
188
+ addUnique(results, seen, {
189
+ method: mapping.httpMethod.toUpperCase(),
190
+ path: mapping.pathTemplate,
191
+ sourceFile: filePath,
192
+ sourceLanguage: language,
193
+ resolutionType: 'client-mapping',
194
+ confidence: 'high',
195
+ });
196
+ }
197
+ }
198
+ }
199
+ // ── 9. Enrich with assertion linkage for response variable calls ──────────
200
+ if (config.assertionAware) {
201
+ const responseVarCalls = (0, resolveAssertions_1.extractResponseVariables)(content);
202
+ for (const { varName, method, path } of responseVarCalls) {
203
+ const assertionLinked = isAssertionLinked_local(varName, content);
204
+ if (assertionLinked) {
205
+ const normalized = (0, resolvePaths_1.normalizePathToTemplate)(path);
206
+ addUnique(results, seen, {
207
+ method,
208
+ path,
209
+ normalizedPath: normalized !== path ? normalized : undefined,
210
+ sourceFile: filePath,
211
+ sourceLanguage: language,
212
+ resolutionType: 'direct',
213
+ confidence: 'high',
214
+ assertionLinked: true,
215
+ });
216
+ }
217
+ }
218
+ }
219
+ return results;
220
+ }
221
+ /**
222
+ * Extract HTTP call sites where the path argument is a variable (not a literal).
223
+ *
224
+ * Example:
225
+ * client.get(USERS_PATH) → rawArg = USERS_PATH
226
+ * api.post(Routes.USERS) → rawArg = Routes.USERS
227
+ */
228
+ function extractHttpCallsWithVariableArgs(content, language) {
229
+ const calls = [];
230
+ let m;
231
+ if (language === 'java' || language === 'kotlin') {
232
+ // .get(IDENTIFIER) or .get(Enum.MEMBER)
233
+ const javaVarPattern = /\.(get|post|put|patch|delete|head|options)\s*\(\s*([A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*(?:\.[a-z]+\(\))?)\s*\)/gi;
234
+ while ((m = javaVarPattern.exec(content)) !== null) {
235
+ const arg = m[2];
236
+ if (!arg.includes('"') && !arg.startsWith('/')) {
237
+ const isEnum = arg.includes('.') && /^[A-Z]/.test(arg.split('.')[0]);
238
+ calls.push({
239
+ method: m[1].toUpperCase(),
240
+ rawArg: arg,
241
+ rawCall: m[0],
242
+ resolutionType: isEnum ? 'enum' : 'constant',
243
+ confidence: 'high',
244
+ });
245
+ }
246
+ }
247
+ }
248
+ else if (language === 'python') {
249
+ // .get(IDENTIFIER) or requests.get(IDENTIFIER)
250
+ const pyVarPattern = /\.(get|post|put|patch|delete|head|options)\s*\(\s*([A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*)\s*(?:[,)])/gi;
251
+ while ((m = pyVarPattern.exec(content)) !== null) {
252
+ const arg = m[2];
253
+ if (!arg.startsWith('/') && !arg.startsWith('"') && !arg.startsWith("'")) {
254
+ const isEnum = arg.includes('.') && /^[A-Z]/.test(arg.split('.')[0]);
255
+ calls.push({
256
+ method: m[1].toUpperCase(),
257
+ rawArg: arg,
258
+ rawCall: m[0],
259
+ resolutionType: isEnum ? 'enum' : 'constant',
260
+ confidence: 'high',
261
+ });
262
+ }
263
+ }
264
+ }
265
+ else {
266
+ // TypeScript/JavaScript
267
+ const jsVarPattern = /\.(get|post|put|patch|delete|head|options)\s*\(\s*([A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*)\s*[),]/gi;
268
+ while ((m = jsVarPattern.exec(content)) !== null) {
269
+ const arg = m[2];
270
+ // Skip if it looks like a function call (.get(someCall()) already handled)
271
+ if (arg.endsWith(')') || arg.startsWith('/'))
272
+ continue;
273
+ const isEnum = arg.includes('.') && /^[A-Z]/.test(arg.split('.')[0]);
274
+ calls.push({
275
+ method: m[1].toUpperCase(),
276
+ rawArg: arg,
277
+ rawCall: m[0],
278
+ resolutionType: isEnum ? 'enum' : 'constant',
279
+ confidence: 'high',
280
+ });
281
+ }
282
+ }
283
+ return calls;
284
+ }
285
+ /**
286
+ * Extract HTTP call sites where the path argument is a template literal or
287
+ * string concatenation.
288
+ */
289
+ function extractTemplateArgHttpCalls(content, language) {
290
+ const calls = [];
291
+ let m;
292
+ if (language === 'java' || language === 'kotlin') {
293
+ // .get(BASE + "/users/" + id)
294
+ const javaConcat = /\.(get|post|put|patch|delete|head|options)\s*\(\s*([A-Za-z_$][A-Za-z0-9_$"' +.]*)\s*\)/gi;
295
+ while ((m = javaConcat.exec(content)) !== null) {
296
+ const arg = m[2];
297
+ if (arg.includes('+') && (arg.includes('"') || /[A-Z_]/.test(arg))) {
298
+ calls.push({ method: m[1].toUpperCase(), rawPath: arg, rawCall: m[0] });
299
+ }
300
+ }
301
+ }
302
+ else if (language === 'python') {
303
+ // .get(f"{BASE}/users/{id}")
304
+ const pyFString = /\.(get|post|put|patch|delete|head|options)\s*\(\s*f['"]([^'"]+)['"]/gi;
305
+ while ((m = pyFString.exec(content)) !== null) {
306
+ calls.push({ method: m[1].toUpperCase(), rawPath: m[2], rawCall: m[0] });
307
+ }
308
+ // .get(BASE + "/users/" + str(id))
309
+ const pyConcat = /\.(get|post|put|patch|delete|head|options)\s*\(\s*([^'")\n]*\+[^'")\n]*)[^)\n]*\)/gi;
310
+ while ((m = pyConcat.exec(content)) !== null) {
311
+ if (m[2].includes('/')) {
312
+ calls.push({ method: m[1].toUpperCase(), rawPath: m[2].trim(), rawCall: m[0] });
313
+ }
314
+ }
315
+ }
316
+ else {
317
+ // TypeScript/JS: .get(`${BASE}/users/${id}`)
318
+ const tsTemplate = /\.(get|post|put|patch|delete|head|options)\s*\(\s*`([^`]+)`/gi;
319
+ while ((m = tsTemplate.exec(content)) !== null) {
320
+ if (m[2].includes('/')) {
321
+ calls.push({ method: m[1].toUpperCase(), rawPath: m[2], rawCall: m[0] });
322
+ }
323
+ }
324
+ // .get(BASE + '/users/' + id)
325
+ const jsConcat = /\.(get|post|put|patch|delete|head|options)\s*\(\s*([A-Za-z_$][^'"()\n]*\+[^'"`()\n]+)/gi;
326
+ while ((m = jsConcat.exec(content)) !== null) {
327
+ if (m[2].includes('/')) {
328
+ calls.push({ method: m[1].toUpperCase(), rawPath: m[2].trim(), rawCall: m[0] });
329
+ }
330
+ }
331
+ }
332
+ return calls;
333
+ }
334
+ /**
335
+ * Resolve a call argument using symbol table (constants + enums).
336
+ */
337
+ function resolveCallArg(rawArg, table, config) {
338
+ // Try enum resolution first (dotted access looks like enum)
339
+ if (config.resolveEnums && rawArg.includes('.')) {
340
+ const r = (0, resolveEnums_1.resolveEnumToken)(rawArg, table);
341
+ if (r !== undefined)
342
+ return r;
343
+ }
344
+ if (config.resolveConstants) {
345
+ const r = (0, resolveConstants_1.resolveToken)(rawArg, table);
346
+ if (r !== undefined)
347
+ return r;
348
+ }
349
+ return undefined;
350
+ }
351
+ /** Deduplicate results using a method:path key */
352
+ function addUnique(results, seen, call) {
353
+ const key = `${call.method}:${call.path}:${call.resolutionType}`;
354
+ if (!seen.has(key)) {
355
+ seen.add(key);
356
+ results.push(call);
357
+ }
358
+ }
359
+ /** Look up assertion linkage for a response variable name */
360
+ function lookupAssertionLinked(responseVar, assertionMap) {
361
+ if (!responseVar)
362
+ return undefined;
363
+ const linked = assertionMap.get(responseVar);
364
+ return linked !== undefined ? linked : undefined;
365
+ }
366
+ /** Inline assertion check (used inside deepResolveFile without importing) */
367
+ function isAssertionLinked_local(varName, content) {
368
+ if (!varName)
369
+ return false;
370
+ const jsExpect = new RegExp(`\\bexpect\\s*\\(\\s*${escapeRegex(varName)}\\b`);
371
+ if (jsExpect.test(content))
372
+ return true;
373
+ const javaAssert = new RegExp(`\\b(?:assertEquals|assertNotNull|assertThat)\\s*\\([^)]*\\b${escapeRegex(varName)}\\b`);
374
+ if (javaAssert.test(content))
375
+ return true;
376
+ const pyAssert = new RegExp(`\\bassert\\s+${escapeRegex(varName)}\\b`);
377
+ if (pyAssert.test(content))
378
+ return true;
379
+ return false;
380
+ }
381
+ function escapeRegex(s) {
382
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
383
+ }
384
+ function stripUrlBase(value) {
385
+ if (value.startsWith('/') || value.startsWith('{'))
386
+ return value;
387
+ try {
388
+ const url = new URL(value);
389
+ return url.pathname;
390
+ }
391
+ catch {
392
+ return value;
393
+ }
394
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Deep Code Analysis — Public API
3
+ *
4
+ * Re-exports the public interface of the deep-endpoint-analysis feature.
5
+ */
6
+ export type { ResolvedHttpCall, ResolutionType, ConfidenceLevel, SymbolEntry, SymbolTable, SymbolKind, DeepAnalysisConfig, ClientMethodMapping, CallGraphNode, CallGraph, } from './types';
7
+ export { DEFAULT_DEEP_ANALYSIS_CONFIG } from './types';
8
+ export { deepResolveFile } from './deepEndpointResolver';
9
+ export { buildSymbolTable, buildSymbolTableFromJs, buildSymbolTableFromJava, buildSymbolTableFromKotlin, buildSymbolTableFromPython, resolveSymbol, } from './symbolTable';
10
+ export { resolveToken, resolveFragments, extractStringConstants, } from './resolveConstants';
11
+ export { resolveEnumToken, extractTsEnumValues, extractJavaEnumValues, extractKotlinEnumValues, extractPythonEnumValues, } from './resolveEnums';
12
+ export { normalizePathToTemplate, resolveTemplateLiteral, resolveStringConcatenation, resolveJavaConcatenation, resolvePythonFString, resolveRubyInterpolation, extractTemplateLiterals, extractPythonFStrings, stripUrlBase, } from './resolvePaths';
13
+ export { buildJsCallGraph, buildJavaCallGraph, buildPythonCallGraph, extractJsFunctions, extractJavaKotlinFunctions, extractPythonFunctions, extractBalancedBraces, } from './callGraph';
14
+ export { resolveWrapperCall, resolveHelperReturnPath, extractJsHelperCallsInHttpArgs, extractJavaHelperCallsInHttpArgs, extractPythonHelperCallsInHttpArgs, } from './resolveMethodChains';
15
+ export { extractRequestBuilders, extractJsRequestBuilders, extractJavaRequestBuilders, extractKotlinRequestBuilders, extractPythonRequestBuilders, } from './resolveRequestWrappers';
16
+ export { isAssertionLinked, extractResponseVariables, buildAssertionMap, } from './resolveAssertions';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/coverage/deep-analysis/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,WAAW,EACX,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,SAAS,GACV,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,8BAA8B,EAC9B,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ /**
3
+ * Deep Code Analysis — Public API
4
+ *
5
+ * Re-exports the public interface of the deep-endpoint-analysis feature.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.buildAssertionMap = exports.extractResponseVariables = exports.isAssertionLinked = exports.extractPythonRequestBuilders = exports.extractKotlinRequestBuilders = exports.extractJavaRequestBuilders = exports.extractJsRequestBuilders = exports.extractRequestBuilders = exports.extractPythonHelperCallsInHttpArgs = exports.extractJavaHelperCallsInHttpArgs = exports.extractJsHelperCallsInHttpArgs = exports.resolveHelperReturnPath = exports.resolveWrapperCall = exports.extractBalancedBraces = exports.extractPythonFunctions = exports.extractJavaKotlinFunctions = exports.extractJsFunctions = exports.buildPythonCallGraph = exports.buildJavaCallGraph = exports.buildJsCallGraph = exports.stripUrlBase = exports.extractPythonFStrings = exports.extractTemplateLiterals = exports.resolveRubyInterpolation = exports.resolvePythonFString = exports.resolveJavaConcatenation = exports.resolveStringConcatenation = exports.resolveTemplateLiteral = exports.normalizePathToTemplate = exports.extractPythonEnumValues = exports.extractKotlinEnumValues = exports.extractJavaEnumValues = exports.extractTsEnumValues = exports.resolveEnumToken = exports.extractStringConstants = exports.resolveFragments = exports.resolveToken = exports.resolveSymbol = exports.buildSymbolTableFromPython = exports.buildSymbolTableFromKotlin = exports.buildSymbolTableFromJava = exports.buildSymbolTableFromJs = exports.buildSymbolTable = exports.deepResolveFile = exports.DEFAULT_DEEP_ANALYSIS_CONFIG = void 0;
9
+ var types_1 = require("./types");
10
+ Object.defineProperty(exports, "DEFAULT_DEEP_ANALYSIS_CONFIG", { enumerable: true, get: function () { return types_1.DEFAULT_DEEP_ANALYSIS_CONFIG; } });
11
+ var deepEndpointResolver_1 = require("./deepEndpointResolver");
12
+ Object.defineProperty(exports, "deepResolveFile", { enumerable: true, get: function () { return deepEndpointResolver_1.deepResolveFile; } });
13
+ var symbolTable_1 = require("./symbolTable");
14
+ Object.defineProperty(exports, "buildSymbolTable", { enumerable: true, get: function () { return symbolTable_1.buildSymbolTable; } });
15
+ Object.defineProperty(exports, "buildSymbolTableFromJs", { enumerable: true, get: function () { return symbolTable_1.buildSymbolTableFromJs; } });
16
+ Object.defineProperty(exports, "buildSymbolTableFromJava", { enumerable: true, get: function () { return symbolTable_1.buildSymbolTableFromJava; } });
17
+ Object.defineProperty(exports, "buildSymbolTableFromKotlin", { enumerable: true, get: function () { return symbolTable_1.buildSymbolTableFromKotlin; } });
18
+ Object.defineProperty(exports, "buildSymbolTableFromPython", { enumerable: true, get: function () { return symbolTable_1.buildSymbolTableFromPython; } });
19
+ Object.defineProperty(exports, "resolveSymbol", { enumerable: true, get: function () { return symbolTable_1.resolveSymbol; } });
20
+ var resolveConstants_1 = require("./resolveConstants");
21
+ Object.defineProperty(exports, "resolveToken", { enumerable: true, get: function () { return resolveConstants_1.resolveToken; } });
22
+ Object.defineProperty(exports, "resolveFragments", { enumerable: true, get: function () { return resolveConstants_1.resolveFragments; } });
23
+ Object.defineProperty(exports, "extractStringConstants", { enumerable: true, get: function () { return resolveConstants_1.extractStringConstants; } });
24
+ var resolveEnums_1 = require("./resolveEnums");
25
+ Object.defineProperty(exports, "resolveEnumToken", { enumerable: true, get: function () { return resolveEnums_1.resolveEnumToken; } });
26
+ Object.defineProperty(exports, "extractTsEnumValues", { enumerable: true, get: function () { return resolveEnums_1.extractTsEnumValues; } });
27
+ Object.defineProperty(exports, "extractJavaEnumValues", { enumerable: true, get: function () { return resolveEnums_1.extractJavaEnumValues; } });
28
+ Object.defineProperty(exports, "extractKotlinEnumValues", { enumerable: true, get: function () { return resolveEnums_1.extractKotlinEnumValues; } });
29
+ Object.defineProperty(exports, "extractPythonEnumValues", { enumerable: true, get: function () { return resolveEnums_1.extractPythonEnumValues; } });
30
+ var resolvePaths_1 = require("./resolvePaths");
31
+ Object.defineProperty(exports, "normalizePathToTemplate", { enumerable: true, get: function () { return resolvePaths_1.normalizePathToTemplate; } });
32
+ Object.defineProperty(exports, "resolveTemplateLiteral", { enumerable: true, get: function () { return resolvePaths_1.resolveTemplateLiteral; } });
33
+ Object.defineProperty(exports, "resolveStringConcatenation", { enumerable: true, get: function () { return resolvePaths_1.resolveStringConcatenation; } });
34
+ Object.defineProperty(exports, "resolveJavaConcatenation", { enumerable: true, get: function () { return resolvePaths_1.resolveJavaConcatenation; } });
35
+ Object.defineProperty(exports, "resolvePythonFString", { enumerable: true, get: function () { return resolvePaths_1.resolvePythonFString; } });
36
+ Object.defineProperty(exports, "resolveRubyInterpolation", { enumerable: true, get: function () { return resolvePaths_1.resolveRubyInterpolation; } });
37
+ Object.defineProperty(exports, "extractTemplateLiterals", { enumerable: true, get: function () { return resolvePaths_1.extractTemplateLiterals; } });
38
+ Object.defineProperty(exports, "extractPythonFStrings", { enumerable: true, get: function () { return resolvePaths_1.extractPythonFStrings; } });
39
+ Object.defineProperty(exports, "stripUrlBase", { enumerable: true, get: function () { return resolvePaths_1.stripUrlBase; } });
40
+ var callGraph_1 = require("./callGraph");
41
+ Object.defineProperty(exports, "buildJsCallGraph", { enumerable: true, get: function () { return callGraph_1.buildJsCallGraph; } });
42
+ Object.defineProperty(exports, "buildJavaCallGraph", { enumerable: true, get: function () { return callGraph_1.buildJavaCallGraph; } });
43
+ Object.defineProperty(exports, "buildPythonCallGraph", { enumerable: true, get: function () { return callGraph_1.buildPythonCallGraph; } });
44
+ Object.defineProperty(exports, "extractJsFunctions", { enumerable: true, get: function () { return callGraph_1.extractJsFunctions; } });
45
+ Object.defineProperty(exports, "extractJavaKotlinFunctions", { enumerable: true, get: function () { return callGraph_1.extractJavaKotlinFunctions; } });
46
+ Object.defineProperty(exports, "extractPythonFunctions", { enumerable: true, get: function () { return callGraph_1.extractPythonFunctions; } });
47
+ Object.defineProperty(exports, "extractBalancedBraces", { enumerable: true, get: function () { return callGraph_1.extractBalancedBraces; } });
48
+ var resolveMethodChains_1 = require("./resolveMethodChains");
49
+ Object.defineProperty(exports, "resolveWrapperCall", { enumerable: true, get: function () { return resolveMethodChains_1.resolveWrapperCall; } });
50
+ Object.defineProperty(exports, "resolveHelperReturnPath", { enumerable: true, get: function () { return resolveMethodChains_1.resolveHelperReturnPath; } });
51
+ Object.defineProperty(exports, "extractJsHelperCallsInHttpArgs", { enumerable: true, get: function () { return resolveMethodChains_1.extractJsHelperCallsInHttpArgs; } });
52
+ Object.defineProperty(exports, "extractJavaHelperCallsInHttpArgs", { enumerable: true, get: function () { return resolveMethodChains_1.extractJavaHelperCallsInHttpArgs; } });
53
+ Object.defineProperty(exports, "extractPythonHelperCallsInHttpArgs", { enumerable: true, get: function () { return resolveMethodChains_1.extractPythonHelperCallsInHttpArgs; } });
54
+ var resolveRequestWrappers_1 = require("./resolveRequestWrappers");
55
+ Object.defineProperty(exports, "extractRequestBuilders", { enumerable: true, get: function () { return resolveRequestWrappers_1.extractRequestBuilders; } });
56
+ Object.defineProperty(exports, "extractJsRequestBuilders", { enumerable: true, get: function () { return resolveRequestWrappers_1.extractJsRequestBuilders; } });
57
+ Object.defineProperty(exports, "extractJavaRequestBuilders", { enumerable: true, get: function () { return resolveRequestWrappers_1.extractJavaRequestBuilders; } });
58
+ Object.defineProperty(exports, "extractKotlinRequestBuilders", { enumerable: true, get: function () { return resolveRequestWrappers_1.extractKotlinRequestBuilders; } });
59
+ Object.defineProperty(exports, "extractPythonRequestBuilders", { enumerable: true, get: function () { return resolveRequestWrappers_1.extractPythonRequestBuilders; } });
60
+ var resolveAssertions_1 = require("./resolveAssertions");
61
+ Object.defineProperty(exports, "isAssertionLinked", { enumerable: true, get: function () { return resolveAssertions_1.isAssertionLinked; } });
62
+ Object.defineProperty(exports, "extractResponseVariables", { enumerable: true, get: function () { return resolveAssertions_1.extractResponseVariables; } });
63
+ Object.defineProperty(exports, "buildAssertionMap", { enumerable: true, get: function () { return resolveAssertions_1.buildAssertionMap; } });
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Deep Code Analysis — Assertion Awareness
3
+ *
4
+ * Associates HTTP response variables with their downstream assertions to
5
+ * determine whether a request is "meaningfully" tested (i.e. the response
6
+ * is actually checked) rather than just called incidentally.
7
+ *
8
+ * Supported patterns:
9
+ *
10
+ * TypeScript (Jest / Supertest):
11
+ * const response = api.get('/users');
12
+ * expect(response.status).toBe(200);
13
+ * expect(response.body).toEqual({ ... });
14
+ *
15
+ * Java (JUnit / RestAssured):
16
+ * Response response = api.get("/users");
17
+ * assertEquals(200, response.getStatusCode());
18
+ * assertThat(response.getBody(), ...).isNotEmpty();
19
+ *
20
+ * Python (pytest / unittest):
21
+ * response = client.get('/users')
22
+ * assert response.status_code == 200
23
+ * self.assertEqual(response.status_code, 200)
24
+ *
25
+ * Kotlin:
26
+ * val response = client.get("/users")
27
+ * assertEquals(200, response.status)
28
+ * assertThat(response.body).isNotNull()
29
+ */
30
+ /**
31
+ * Detect whether a response variable is followed by at least one assertion.
32
+ *
33
+ * This is a lightweight heuristic: we check whether the response variable
34
+ * name appears inside an expect(), assert, assertEquals, assertThat, or
35
+ * similar assertion call within the same file.
36
+ *
37
+ * Returns true when at least one assertion is found.
38
+ */
39
+ export declare function isAssertionLinked(responseVar: string, content: string): boolean;
40
+ /**
41
+ * Extract all response variable names from HTTP call sites in a file.
42
+ *
43
+ * Returns a map of varName → { method, path } for all assignments like:
44
+ * const resp = client.get('/users')
45
+ * Response res = api.post("/users")
46
+ * response = client.get('/path')
47
+ */
48
+ export declare function extractResponseVariables(content: string): Array<{
49
+ varName: string;
50
+ method: string;
51
+ path: string;
52
+ }>;
53
+ /**
54
+ * For each response variable in the content, determine if it has an
55
+ * associated assertion.
56
+ *
57
+ * Returns a map: varName → assertionLinked (boolean)
58
+ */
59
+ export declare function buildAssertionMap(content: string): Map<string, boolean>;
60
+ //# sourceMappingURL=resolveAssertions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveAssertions.d.ts","sourceRoot":"","sources":["../../../../src/coverage/deep-analysis/resolveAssertions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAmC/E;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,GACd,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B1D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CASvE"}