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,358 @@
1
+ "use strict";
2
+ /**
3
+ * Java semantic model builder.
4
+ *
5
+ * Walks the tree-sitter Java CST to extract:
6
+ * - static final String constants and enum members
7
+ * - method definitions with their HTTP call bodies
8
+ * - assertion patterns
9
+ * - Cucumber step definition annotations
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.extractJavaSymbols = extractJavaSymbols;
13
+ exports.extractJavaFunctions = extractJavaFunctions;
14
+ exports.extractJavaHttpCalls = extractJavaHttpCalls;
15
+ exports.extractJavaAssertions = extractJavaAssertions;
16
+ exports.extractJavaBusinessRuleRefs = extractJavaBusinessRuleRefs;
17
+ exports.extractJavaFlowRefs = extractJavaFlowRefs;
18
+ const treeSitterUtils_1 = require("../shared/treeSitterUtils");
19
+ const resolvePaths_1 = require("../../coverage/deep-analysis/resolvePaths");
20
+ const HTTP_METHODS = new Set(['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'request']);
21
+ // ─── Symbol extraction ────────────────────────────────────────────────────────
22
+ function extractJavaSymbols(root) {
23
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
24
+ const constants = new Map();
25
+ const enums = new Map();
26
+ // Field declarations: private static final String USERS = "/users";
27
+ const fieldDecls = (0, treeSitterUtils_1.findNodes)(root, ['field_declaration']);
28
+ for (const field of fieldDecls) {
29
+ const modifiers = extractModifierTexts(field);
30
+ if (!modifiers.includes('static') || !modifiers.includes('final'))
31
+ continue;
32
+ const declarators = (0, treeSitterUtils_1.findNodes)(field, ['variable_declarator']);
33
+ for (const decl of declarators) {
34
+ const nameNode = (0, treeSitterUtils_1.firstChildOfType)(decl, 'identifier');
35
+ const valueNode = (0, treeSitterUtils_1.firstChildOfType)(decl, 'string_literal');
36
+ if (nameNode && valueNode) {
37
+ const name = (_a = nameNode.text) !== null && _a !== void 0 ? _a : '';
38
+ const value = (_b = (0, treeSitterUtils_1.extractStringValue)(valueNode)) !== null && _b !== void 0 ? _b : '';
39
+ constants.set(name, { name, kind: 'const', value, resolvedValue: value });
40
+ }
41
+ }
42
+ }
43
+ // Local variable declarations inside methods: String USERS = "/users";
44
+ const localDecls = (0, treeSitterUtils_1.findNodes)(root, ['local_variable_declaration']);
45
+ for (const decl of localDecls) {
46
+ const declarators = (0, treeSitterUtils_1.findNodes)(decl, ['variable_declarator']);
47
+ for (const vd of declarators) {
48
+ const nameNode = (0, treeSitterUtils_1.firstChildOfType)(vd, 'identifier');
49
+ const valueNode = (0, treeSitterUtils_1.firstChildOfType)(vd, 'string_literal');
50
+ if (nameNode && valueNode) {
51
+ const name = (_c = nameNode.text) !== null && _c !== void 0 ? _c : '';
52
+ const value = (_d = (0, treeSitterUtils_1.extractStringValue)(valueNode)) !== null && _d !== void 0 ? _d : '';
53
+ constants.set(name, { name, kind: 'let', value, resolvedValue: value });
54
+ }
55
+ }
56
+ }
57
+ // Enum declarations
58
+ const enumDecls = (0, treeSitterUtils_1.findNodes)(root, ['enum_declaration']);
59
+ for (const enumDecl of enumDecls) {
60
+ const enumName = (_f = (_e = (0, treeSitterUtils_1.firstChildOfType)(enumDecl, 'identifier')) === null || _e === void 0 ? void 0 : _e.text) !== null && _f !== void 0 ? _f : '';
61
+ if (!enumName)
62
+ continue;
63
+ const memberMap = new Map();
64
+ const constants2 = (0, treeSitterUtils_1.findNodes)(enumDecl, ['enum_constant']);
65
+ for (const constant of constants2) {
66
+ const memberName = (_h = (_g = (0, treeSitterUtils_1.firstChildOfType)(constant, 'identifier')) === null || _g === void 0 ? void 0 : _g.text) !== null && _h !== void 0 ? _h : '';
67
+ const argList = (0, treeSitterUtils_1.firstChildOfType)(constant, 'argument_list');
68
+ if (argList) {
69
+ const strLit = (0, treeSitterUtils_1.firstChildOfType)(argList, 'string_literal');
70
+ if (strLit && memberName) {
71
+ const value = (_j = (0, treeSitterUtils_1.extractStringValue)(strLit)) !== null && _j !== void 0 ? _j : '';
72
+ memberMap.set(memberName, value);
73
+ const fullName = `${enumName}.${memberName}`;
74
+ constants.set(fullName, {
75
+ name: fullName,
76
+ kind: 'enum-member',
77
+ value,
78
+ resolvedValue: value,
79
+ });
80
+ }
81
+ }
82
+ }
83
+ if (memberMap.size > 0)
84
+ enums.set(enumName, memberMap);
85
+ }
86
+ return { constants, enums };
87
+ }
88
+ // ─── Function/method extraction ───────────────────────────────────────────────
89
+ function extractJavaFunctions(root, constants) {
90
+ var _a, _b, _c, _d, _e;
91
+ const graph = new Map();
92
+ const methodDecls = (0, treeSitterUtils_1.findNodes)(root, ['method_declaration']);
93
+ for (const method of methodDecls) {
94
+ const nameNode = (_b = (_a = method.childForFieldName) === null || _a === void 0 ? void 0 : _a.call(method, 'name')) !== null && _b !== void 0 ? _b : (0, treeSitterUtils_1.firstChildOfType)(method, 'identifier');
95
+ const name = (_c = nameNode === null || nameNode === void 0 ? void 0 : nameNode.text) !== null && _c !== void 0 ? _c : '';
96
+ if (!name)
97
+ continue;
98
+ const annotations = extractAnnotationNames(method);
99
+ const block = (_e = (_d = method.childForFieldName) === null || _d === void 0 ? void 0 : _d.call(method, 'body')) !== null && _e !== void 0 ? _e : (0, treeSitterUtils_1.firstChildOfType)(method, 'block');
100
+ const bodyHttpCalls = [];
101
+ const calledFunctions = [];
102
+ let returnValue;
103
+ if (block) {
104
+ extractJavaHttpCalls(block, constants, bodyHttpCalls);
105
+ extractCalledMethods(block, calledFunctions);
106
+ returnValue = extractJavaReturnValue(block, constants);
107
+ }
108
+ // Cucumber step pattern from annotation
109
+ const cucumberPattern = extractCucumberPattern(annotations, method);
110
+ graph.set(name, {
111
+ name,
112
+ parameters: [],
113
+ bodyHttpCalls,
114
+ calledFunctions,
115
+ returnValue,
116
+ annotations,
117
+ cucumberPattern,
118
+ });
119
+ }
120
+ return graph;
121
+ }
122
+ // ─── HTTP call extraction ─────────────────────────────────────────────────────
123
+ function extractJavaHttpCalls(block, constants, out) {
124
+ var _a, _b, _c, _d, _e, _f, _g;
125
+ const methodInvocations = (0, treeSitterUtils_1.findNodes)(block, ['method_invocation']);
126
+ for (const invoc of methodInvocations) {
127
+ const methodName = (_e = (_c = (_b = (_a = invoc.childForFieldName) === null || _a === void 0 ? void 0 : _a.call(invoc, 'name')) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : (_d = firstChildNamed(invoc, 'identifier')) === null || _d === void 0 ? void 0 : _d.text) !== null && _e !== void 0 ? _e : '';
128
+ const lowerMethod = methodName.toLowerCase();
129
+ if (!HTTP_METHODS.has(lowerMethod))
130
+ continue;
131
+ const argList = (_g = (_f = invoc.childForFieldName) === null || _f === void 0 ? void 0 : _f.call(invoc, 'arguments')) !== null && _g !== void 0 ? _g : (0, treeSitterUtils_1.firstChildOfType)(invoc, 'argument_list');
132
+ if (!argList)
133
+ continue;
134
+ // Extract the first string argument (path)
135
+ const firstStringArg = findFirstStringInArgList(argList, constants);
136
+ if (!firstStringArg)
137
+ continue;
138
+ const { value: path, isDirect, varName } = firstStringArg;
139
+ // Try to detect the HTTP method from context
140
+ let httpMethod = lowerMethod.toUpperCase();
141
+ // RestAssured: .when().get("/path") or .given().get("/path")
142
+ // The method name IS the HTTP method in RestAssured style
143
+ if (!HTTP_METHODS.has(lowerMethod))
144
+ continue;
145
+ // MockMvc: perform(get("/path")) — perform wraps a method call
146
+ if (lowerMethod === 'perform') {
147
+ // The arg is another method invocation
148
+ continue; // Handled when we process the inner get/post
149
+ }
150
+ if (lowerMethod === 'request') {
151
+ // generic request(method, path) — try to get HTTP method from first arg
152
+ const stringArgs = findAllStringsInArgList(argList, constants);
153
+ if (stringArgs.length >= 2) {
154
+ httpMethod = stringArgs[0].value.toUpperCase();
155
+ const pathVal = stringArgs[1].value;
156
+ const normalizedPath = pathVal.startsWith('/') ? (0, resolvePaths_1.normalizePathToTemplate)(pathVal) : undefined;
157
+ out.push({
158
+ method: httpMethod,
159
+ rawPathArg: varName !== null && varName !== void 0 ? varName : pathVal,
160
+ resolvedPath: pathVal,
161
+ normalizedPath,
162
+ resolutionType: isDirect ? 'direct' : 'constant',
163
+ confidence: isDirect ? 'high' : 'medium',
164
+ });
165
+ continue;
166
+ }
167
+ }
168
+ const normalizedPath = path.startsWith('/') ? (0, resolvePaths_1.normalizePathToTemplate)(path) : undefined;
169
+ out.push({
170
+ method: httpMethod,
171
+ rawPathArg: varName !== null && varName !== void 0 ? varName : path,
172
+ resolvedPath: path,
173
+ normalizedPath,
174
+ resolutionType: isDirect ? 'direct' : 'constant',
175
+ confidence: isDirect ? 'high' : 'medium',
176
+ });
177
+ }
178
+ }
179
+ // ─── Assertion extraction ─────────────────────────────────────────────────────
180
+ function extractJavaAssertions(root) {
181
+ var _a, _b, _c, _d, _e;
182
+ const assertions = [];
183
+ const methodInvocations = (0, treeSitterUtils_1.findNodes)(root, ['method_invocation']);
184
+ for (const invoc of methodInvocations) {
185
+ const name = (_e = (_c = (_b = (_a = invoc.childForFieldName) === null || _a === void 0 ? void 0 : _a.call(invoc, 'name')) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : (_d = firstChildNamed(invoc, 'identifier')) === null || _d === void 0 ? void 0 : _d.text) !== null && _e !== void 0 ? _e : '';
186
+ const lowerName = name.toLowerCase();
187
+ if (lowerName.startsWith('assertequals') ||
188
+ lowerName.startsWith('assertthat') ||
189
+ lowerName.startsWith('assertnotnull') ||
190
+ lowerName.startsWith('assert') ||
191
+ lowerName === 'statuscode' ||
192
+ lowerName === 'statusmustbe') {
193
+ const type = lowerName.includes('status') ? 'status-code' : 'body-field';
194
+ assertions.push({ assertionType: type });
195
+ }
196
+ }
197
+ return assertions;
198
+ }
199
+ // ─── Business rule and flow ref extraction ────────────────────────────────────
200
+ function extractJavaBusinessRuleRefs(root) {
201
+ var _a;
202
+ const refs = [];
203
+ const annotations = (0, treeSitterUtils_1.findNodes)(root, ['annotation', 'marker_annotation']);
204
+ for (const ann of annotations) {
205
+ const annText = (_a = ann.text) !== null && _a !== void 0 ? _a : '';
206
+ const brMatch = annText.match(/@(?:BusinessRule|businessRule|Tag)\s*\(\s*["']?([^)"'\s]+)/);
207
+ if (brMatch) {
208
+ refs.push({ ruleId: brMatch[1], source: 'annotation' });
209
+ }
210
+ }
211
+ return refs;
212
+ }
213
+ function extractJavaFlowRefs(root) {
214
+ var _a;
215
+ const refs = [];
216
+ const annotations = (0, treeSitterUtils_1.findNodes)(root, ['annotation', 'marker_annotation']);
217
+ for (const ann of annotations) {
218
+ const annText = (_a = ann.text) !== null && _a !== void 0 ? _a : '';
219
+ const flowMatch = annText.match(/@(?:Flow|IntegrationFlow|FlowId)\s*\(\s*["']?([^)"'\s]+)/);
220
+ if (flowMatch) {
221
+ refs.push({ flowId: flowMatch[1], source: 'annotation' });
222
+ }
223
+ }
224
+ return refs;
225
+ }
226
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
227
+ function extractModifierTexts(node) {
228
+ const modifiers = [];
229
+ (0, treeSitterUtils_1.walkTree)(node, (n) => {
230
+ var _a;
231
+ if (n.type === 'modifier' || n.type === 'final' || n.type === 'static' || n.type === 'public' ||
232
+ n.type === 'private' || n.type === 'protected') {
233
+ modifiers.push((_a = n.text) !== null && _a !== void 0 ? _a : '');
234
+ }
235
+ });
236
+ return modifiers;
237
+ }
238
+ function extractAnnotationNames(node) {
239
+ var _a;
240
+ const names = [];
241
+ for (let i = 0; i < ((_a = node === null || node === void 0 ? void 0 : node.childCount) !== null && _a !== void 0 ? _a : 0); i++) {
242
+ const child = node.child(i);
243
+ if ((child === null || child === void 0 ? void 0 : child.type) === 'modifiers') {
244
+ (0, treeSitterUtils_1.walkTree)(child, (n) => {
245
+ var _a;
246
+ if (n.type === 'annotation' || n.type === 'marker_annotation') {
247
+ // Get the annotation name
248
+ const nameNode = (0, treeSitterUtils_1.firstChildOfType)(n, 'identifier');
249
+ if (nameNode)
250
+ names.push('@' + ((_a = nameNode.text) !== null && _a !== void 0 ? _a : ''));
251
+ }
252
+ });
253
+ }
254
+ }
255
+ return names;
256
+ }
257
+ function extractCucumberPattern(annotations, methodNode) {
258
+ const cucumberAnnotations = ['@Given', '@When', '@Then', '@And', '@But'];
259
+ for (const ann of annotations) {
260
+ if (cucumberAnnotations.some((ca) => ann.startsWith(ca))) {
261
+ // Extract the pattern string from the annotation
262
+ const annNodes = (0, treeSitterUtils_1.findNodes)(methodNode, ['annotation']);
263
+ for (const annNode of annNodes) {
264
+ const strLit = (0, treeSitterUtils_1.firstChildOfType)(annNode, 'string_literal');
265
+ if (strLit)
266
+ return (0, treeSitterUtils_1.extractStringValue)(strLit);
267
+ }
268
+ }
269
+ }
270
+ return undefined;
271
+ }
272
+ function firstChildNamed(node, type) {
273
+ var _a;
274
+ if (!node)
275
+ return undefined;
276
+ // Find last identifier child (method name is usually at end of member access)
277
+ let found;
278
+ for (let i = 0; i < ((_a = node.childCount) !== null && _a !== void 0 ? _a : 0); i++) {
279
+ const child = node.child(i);
280
+ if ((child === null || child === void 0 ? void 0 : child.type) === type)
281
+ found = child;
282
+ }
283
+ return found;
284
+ }
285
+ function findFirstStringInArgList(argList, constants) {
286
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
287
+ for (let i = 0; i < ((_a = argList === null || argList === void 0 ? void 0 : argList.childCount) !== null && _a !== void 0 ? _a : 0); i++) {
288
+ const child = argList.child(i);
289
+ if (!child)
290
+ continue;
291
+ if (child.type === 'string_literal') {
292
+ const value = (_b = (0, treeSitterUtils_1.extractStringValue)(child)) !== null && _b !== void 0 ? _b : '';
293
+ if (value)
294
+ return { value, isDirect: true };
295
+ }
296
+ if (child.type === 'identifier') {
297
+ const varName = (_c = child.text) !== null && _c !== void 0 ? _c : '';
298
+ const resolved = (_d = constants.get(varName)) === null || _d === void 0 ? void 0 : _d.resolvedValue;
299
+ if (resolved)
300
+ return { value: resolved, isDirect: false, varName };
301
+ }
302
+ // Field access: Routes.USERS
303
+ if (child.type === 'field_access' || child.type === 'member_access') {
304
+ const objName = (_g = (_f = (_e = child.childForFieldName) === null || _e === void 0 ? void 0 : _e.call(child, 'object')) === null || _f === void 0 ? void 0 : _f.text) !== null && _g !== void 0 ? _g : '';
305
+ const fieldName = (_k = (_j = (_h = child.childForFieldName) === null || _h === void 0 ? void 0 : _h.call(child, 'field')) === null || _j === void 0 ? void 0 : _j.text) !== null && _k !== void 0 ? _k : '';
306
+ if (objName && fieldName) {
307
+ const key = `${objName}.${fieldName}`;
308
+ const resolved = (_l = constants.get(key)) === null || _l === void 0 ? void 0 : _l.resolvedValue;
309
+ if (resolved)
310
+ return { value: resolved, isDirect: false, varName: key };
311
+ }
312
+ }
313
+ }
314
+ return undefined;
315
+ }
316
+ function findAllStringsInArgList(argList, constants) {
317
+ var _a, _b, _c, _d;
318
+ const results = [];
319
+ for (let i = 0; i < ((_a = argList === null || argList === void 0 ? void 0 : argList.childCount) !== null && _a !== void 0 ? _a : 0); i++) {
320
+ const child = argList.child(i);
321
+ if (!child)
322
+ continue;
323
+ if (child.type === 'string_literal') {
324
+ const value = (_b = (0, treeSitterUtils_1.extractStringValue)(child)) !== null && _b !== void 0 ? _b : '';
325
+ if (value)
326
+ results.push({ value, isDirect: true });
327
+ }
328
+ if (child.type === 'identifier') {
329
+ const resolved = (_d = constants.get((_c = child.text) !== null && _c !== void 0 ? _c : '')) === null || _d === void 0 ? void 0 : _d.resolvedValue;
330
+ if (resolved)
331
+ results.push({ value: resolved, isDirect: false });
332
+ }
333
+ }
334
+ return results;
335
+ }
336
+ function extractCalledMethods(block, out) {
337
+ var _a, _b, _c, _d, _e;
338
+ const invocations = (0, treeSitterUtils_1.findNodes)(block, ['method_invocation']);
339
+ for (const inv of invocations) {
340
+ const name = (_e = (_c = (_b = (_a = inv.childForFieldName) === null || _a === void 0 ? void 0 : _a.call(inv, 'name')) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : (_d = firstChildNamed(inv, 'identifier')) === null || _d === void 0 ? void 0 : _d.text) !== null && _e !== void 0 ? _e : '';
341
+ if (name && !out.includes(name))
342
+ out.push(name);
343
+ }
344
+ }
345
+ function extractJavaReturnValue(block, constants) {
346
+ var _a, _b;
347
+ const returnStmts = (0, treeSitterUtils_1.findNodes)(block, ['return_statement']);
348
+ for (const ret of returnStmts) {
349
+ const strLit = (0, treeSitterUtils_1.firstChildOfType)(ret, 'string_literal');
350
+ if (strLit)
351
+ return (0, treeSitterUtils_1.extractStringValue)(strLit);
352
+ const identifier = (0, treeSitterUtils_1.firstChildOfType)(ret, 'identifier');
353
+ if (identifier) {
354
+ return (_b = constants.get((_a = identifier.text) !== null && _a !== void 0 ? _a : '')) === null || _b === void 0 ? void 0 : _b.resolvedValue;
355
+ }
356
+ }
357
+ return undefined;
358
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Business rule and integration flow annotation extractor for JS/TS.
3
+ *
4
+ * Detects annotations in test files as:
5
+ * - JSDoc-style comments: @businessRule BR-001, @flowId FLOW-001
6
+ * - jest.each tags or describe block labels with rule IDs
7
+ * - Cucumber-style tags in describe/it names: 'BR-001 user can login'
8
+ */
9
+ import type { BusinessRuleRef, FlowRef } from '../../ast/astTypes';
10
+ type AstNode = any;
11
+ /**
12
+ * Extract business rule references from JSDoc comments and string labels in the AST.
13
+ */
14
+ export declare function extractBusinessRuleRefs(ast: AstNode): BusinessRuleRef[];
15
+ /**
16
+ * Extract flow references from JSDoc comments and string labels in the AST.
17
+ */
18
+ export declare function extractFlowRefs(ast: AstNode): FlowRef[];
19
+ export {};
20
+ //# sourceMappingURL=annotationExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotationExtractor.d.ts","sourceRoot":"","sources":["../../../../src/languages/javascript/annotationExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGnE,KAAK,OAAO,GAAG,GAAG,CAAC;AAKnB;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,EAAE,CAoBvE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,EAAE,CAgBvD"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /**
3
+ * Business rule and integration flow annotation extractor for JS/TS.
4
+ *
5
+ * Detects annotations in test files as:
6
+ * - JSDoc-style comments: @businessRule BR-001, @flowId FLOW-001
7
+ * - jest.each tags or describe block labels with rule IDs
8
+ * - Cucumber-style tags in describe/it names: 'BR-001 user can login'
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.extractBusinessRuleRefs = extractBusinessRuleRefs;
12
+ exports.extractFlowRefs = extractFlowRefs;
13
+ const BUSINESS_RULE_PATTERN = /(?:@businessRule|@business-rule|BR-?(\w+))\s*([\w-]+)?/gi;
14
+ const FLOW_ID_PATTERN = /(?:@flowId|@flow-id|FLOW-?(\w+))\s*([\w-]+)?/gi;
15
+ /**
16
+ * Extract business rule references from JSDoc comments and string labels in the AST.
17
+ */
18
+ function extractBusinessRuleRefs(ast) {
19
+ var _a, _b, _c, _d, _e, _f;
20
+ const refs = [];
21
+ if (!ast)
22
+ return refs;
23
+ // Check comments
24
+ for (const comment of (_a = ast.comments) !== null && _a !== void 0 ? _a : []) {
25
+ const text = (_b = comment.value) !== null && _b !== void 0 ? _b : '';
26
+ const matches = [...text.matchAll(BUSINESS_RULE_PATTERN)];
27
+ for (const match of matches) {
28
+ const ruleId = ((_d = (_c = match[1]) !== null && _c !== void 0 ? _c : match[2]) !== null && _d !== void 0 ? _d : '').trim();
29
+ if (ruleId) {
30
+ refs.push({ ruleId, source: 'comment', line: (_f = (_e = comment.loc) === null || _e === void 0 ? void 0 : _e.start) === null || _f === void 0 ? void 0 : _f.line });
31
+ }
32
+ }
33
+ }
34
+ // Check string literals in describe/it block labels
35
+ extractFromStringLabels(ast, BUSINESS_RULE_PATTERN, refs, 'comment');
36
+ return refs;
37
+ }
38
+ /**
39
+ * Extract flow references from JSDoc comments and string labels in the AST.
40
+ */
41
+ function extractFlowRefs(ast) {
42
+ var _a, _b, _c, _d, _e, _f;
43
+ const refs = [];
44
+ if (!ast)
45
+ return refs;
46
+ for (const comment of (_a = ast.comments) !== null && _a !== void 0 ? _a : []) {
47
+ const text = (_b = comment.value) !== null && _b !== void 0 ? _b : '';
48
+ const matches = [...text.matchAll(FLOW_ID_PATTERN)];
49
+ for (const match of matches) {
50
+ const flowId = ((_d = (_c = match[1]) !== null && _c !== void 0 ? _c : match[2]) !== null && _d !== void 0 ? _d : '').trim();
51
+ if (flowId) {
52
+ refs.push({ flowId, source: 'comment', line: (_f = (_e = comment.loc) === null || _e === void 0 ? void 0 : _e.start) === null || _f === void 0 ? void 0 : _f.line });
53
+ }
54
+ }
55
+ }
56
+ return refs;
57
+ }
58
+ function extractFromStringLabels(ast, pattern, refs, source) {
59
+ if (!(ast === null || ast === void 0 ? void 0 : ast.body))
60
+ return;
61
+ for (const node of ast.body) {
62
+ walkStringLabels(node, pattern, refs, source);
63
+ }
64
+ }
65
+ function walkStringLabels(node, pattern, refs, source) {
66
+ var _a, _b, _c, _d, _e, _f, _g, _h;
67
+ if (!node || typeof node !== 'object')
68
+ return;
69
+ if (node.type === 'CallExpression' &&
70
+ (((_a = node.callee) === null || _a === void 0 ? void 0 : _a.name) === 'describe' || ((_b = node.callee) === null || _b === void 0 ? void 0 : _b.name) === 'it' || ((_c = node.callee) === null || _c === void 0 ? void 0 : _c.name) === 'test')) {
71
+ const label = (_d = node.arguments) === null || _d === void 0 ? void 0 : _d[0];
72
+ if ((label === null || label === void 0 ? void 0 : label.type) === 'Literal' && typeof label.value === 'string') {
73
+ pattern.lastIndex = 0;
74
+ const matches = [...label.value.matchAll(pattern)];
75
+ for (const match of matches) {
76
+ const ruleId = ((_f = (_e = match[1]) !== null && _e !== void 0 ? _e : match[2]) !== null && _f !== void 0 ? _f : '').trim();
77
+ if (ruleId)
78
+ refs.push({ ruleId, source, line: (_h = (_g = label.loc) === null || _g === void 0 ? void 0 : _g.start) === null || _h === void 0 ? void 0 : _h.line });
79
+ }
80
+ }
81
+ }
82
+ for (const key of ['body', 'expression', 'declaration', 'declarations', 'arguments']) {
83
+ const child = node[key];
84
+ if (Array.isArray(child)) {
85
+ for (const c of child) {
86
+ if (c && typeof c === 'object')
87
+ walkStringLabels(c, pattern, refs, source);
88
+ }
89
+ }
90
+ else if (child && typeof child === 'object') {
91
+ walkStringLabels(child, pattern, refs, source);
92
+ }
93
+ }
94
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * JavaScript/TypeScript assertion resolver.
3
+ *
4
+ * Detects assertion patterns linked to HTTP response variables:
5
+ * - expect(response).toHaveProperty(...) → body-field
6
+ * - expect(response.status).toBe(200) → status-code
7
+ * - expect(response.statusCode).toEqual(200) → status-code
8
+ * - response.expect(200) → fluent-chain (supertest)
9
+ * - .expect(res => { ... }) → fluent-chain
10
+ */
11
+ import type { SemanticAssertion } from '../../ast/astTypes';
12
+ type AstNode = any;
13
+ /**
14
+ * Extract all assertion nodes from an AST subtree.
15
+ */
16
+ export declare function extractAssertions(ast: AstNode): SemanticAssertion[];
17
+ export {};
18
+ //# sourceMappingURL=assertionResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertionResolver.d.ts","sourceRoot":"","sources":["../../../../src/languages/javascript/assertionResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,KAAK,OAAO,GAAG,GAAG,CAAC;AAEnB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,EAAE,CAKnE"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ /**
3
+ * JavaScript/TypeScript assertion resolver.
4
+ *
5
+ * Detects assertion patterns linked to HTTP response variables:
6
+ * - expect(response).toHaveProperty(...) → body-field
7
+ * - expect(response.status).toBe(200) → status-code
8
+ * - expect(response.statusCode).toEqual(200) → status-code
9
+ * - response.expect(200) → fluent-chain (supertest)
10
+ * - .expect(res => { ... }) → fluent-chain
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.extractAssertions = extractAssertions;
14
+ /**
15
+ * Extract all assertion nodes from an AST subtree.
16
+ */
17
+ function extractAssertions(ast) {
18
+ const assertions = [];
19
+ if (!ast)
20
+ return assertions;
21
+ walkForAssertions(ast, assertions);
22
+ return assertions;
23
+ }
24
+ function walkForAssertions(node, out) {
25
+ if (!node || typeof node !== 'object')
26
+ return;
27
+ if (node.type === 'CallExpression') {
28
+ const assertion = tryExtractAssertion(node);
29
+ if (assertion) {
30
+ out.push(assertion);
31
+ }
32
+ }
33
+ for (const key of Object.keys(node)) {
34
+ if (key === 'parent' || key === 'tokens' || key === 'comments')
35
+ continue;
36
+ const child = node[key];
37
+ if (Array.isArray(child)) {
38
+ for (const c of child) {
39
+ if (c && typeof c === 'object' && c.type)
40
+ walkForAssertions(c, out);
41
+ }
42
+ }
43
+ else if (child && typeof child === 'object' && child.type) {
44
+ walkForAssertions(child, out);
45
+ }
46
+ }
47
+ }
48
+ function tryExtractAssertion(callNode) {
49
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y;
50
+ const callee = callNode.callee;
51
+ if (!callee)
52
+ return null;
53
+ // expect(subject) — the start of a Jest/Jasmine assertion chain
54
+ if (callee.type === 'Identifier' && callee.name === 'expect') {
55
+ const subject = (_a = callNode.arguments) === null || _a === void 0 ? void 0 : _a[0];
56
+ if (!subject)
57
+ return null;
58
+ const { variable, assertionType } = classifyExpectSubject(subject);
59
+ return { assertionType, subjectVariable: variable, line: (_c = (_b = callNode.loc) === null || _b === void 0 ? void 0 : _b.start) === null || _c === void 0 ? void 0 : _c.line };
60
+ }
61
+ // expect(subject).toBe / toEqual / toHaveProperty etc.
62
+ if (callee.type === 'MemberExpression' && ((_d = callee.object) === null || _d === void 0 ? void 0 : _d.type) === 'CallExpression') {
63
+ const innerCall = callee.object;
64
+ if (((_e = innerCall.callee) === null || _e === void 0 ? void 0 : _e.name) === 'expect') {
65
+ const subject = (_f = innerCall.arguments) === null || _f === void 0 ? void 0 : _f[0];
66
+ if (!subject)
67
+ return null;
68
+ const methodName = (_j = (_h = (_g = callee.property) === null || _g === void 0 ? void 0 : _g.name) === null || _h === void 0 ? void 0 : _h.toLowerCase()) !== null && _j !== void 0 ? _j : '';
69
+ const assertionType = classifyAssertionMethod(methodName);
70
+ const { variable } = classifyExpectSubject(subject);
71
+ return { assertionType, subjectVariable: variable, line: (_l = (_k = callNode.loc) === null || _k === void 0 ? void 0 : _k.start) === null || _l === void 0 ? void 0 : _l.line };
72
+ }
73
+ }
74
+ // supertest fluent: response.expect(200) or .expect(res => { ... })
75
+ if (callee.type === 'MemberExpression' && ((_m = callee.property) === null || _m === void 0 ? void 0 : _m.name) === 'expect') {
76
+ const obj = callee.object;
77
+ const varName = (obj === null || obj === void 0 ? void 0 : obj.type) === 'Identifier'
78
+ ? obj.name
79
+ : (obj === null || obj === void 0 ? void 0 : obj.type) === 'CallExpression'
80
+ ? undefined // chained call — variable is unknown
81
+ : undefined;
82
+ const firstArg = (_o = callNode.arguments) === null || _o === void 0 ? void 0 : _o[0];
83
+ if ((firstArg === null || firstArg === void 0 ? void 0 : firstArg.type) === 'Literal' && typeof firstArg.value === 'number') {
84
+ return {
85
+ assertionType: 'status-code',
86
+ subjectVariable: varName,
87
+ line: (_q = (_p = callNode.loc) === null || _p === void 0 ? void 0 : _p.start) === null || _q === void 0 ? void 0 : _q.line,
88
+ };
89
+ }
90
+ return {
91
+ assertionType: 'fluent-chain',
92
+ subjectVariable: varName,
93
+ line: (_s = (_r = callNode.loc) === null || _r === void 0 ? void 0 : _r.start) === null || _s === void 0 ? void 0 : _s.line,
94
+ };
95
+ }
96
+ // assert(condition), assert.equal, chai assert
97
+ if (callee.type === 'Identifier' && callee.name === 'assert') {
98
+ return { assertionType: 'status-code', line: (_u = (_t = callNode.loc) === null || _t === void 0 ? void 0 : _t.start) === null || _u === void 0 ? void 0 : _u.line };
99
+ }
100
+ if (callee.type === 'MemberExpression' &&
101
+ (((_v = callee.object) === null || _v === void 0 ? void 0 : _v.name) === 'assert' || ((_w = callee.object) === null || _w === void 0 ? void 0 : _w.name) === 'chai')) {
102
+ return {
103
+ assertionType: 'body-field',
104
+ line: (_y = (_x = callNode.loc) === null || _x === void 0 ? void 0 : _x.start) === null || _y === void 0 ? void 0 : _y.line,
105
+ };
106
+ }
107
+ return null;
108
+ }
109
+ function classifyExpectSubject(subject) {
110
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
111
+ if (subject.type === 'Identifier') {
112
+ return { variable: subject.name, assertionType: 'body-field' };
113
+ }
114
+ if (subject.type === 'MemberExpression') {
115
+ const obj = subject.object;
116
+ const prop = (_c = (_b = (_a = subject.property) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.toLowerCase()) !== null && _c !== void 0 ? _c : '';
117
+ const variable = (obj === null || obj === void 0 ? void 0 : obj.type) === 'Identifier' ? obj.name : undefined;
118
+ if (prop === 'status' || prop === 'statuscode' || prop === 'status_code') {
119
+ return { variable, assertionType: 'status-code' };
120
+ }
121
+ if (prop === 'body' || prop === 'data' || prop === 'json') {
122
+ return { variable, assertionType: 'body-field' };
123
+ }
124
+ return { variable, assertionType: 'body-field' };
125
+ }
126
+ if (subject.type === 'CallExpression') {
127
+ const methodName = (_g = (_f = (_e = (_d = subject.callee) === null || _d === void 0 ? void 0 : _d.property) === null || _e === void 0 ? void 0 : _e.name) === null || _f === void 0 ? void 0 : _f.toLowerCase()) !== null && _g !== void 0 ? _g : '';
128
+ const variable = (_j = (_h = subject.callee) === null || _h === void 0 ? void 0 : _h.object) === null || _j === void 0 ? void 0 : _j.name;
129
+ if (methodName === 'json' || methodName === 'text') {
130
+ return { variable, assertionType: 'body-field' };
131
+ }
132
+ }
133
+ return { variable: undefined, assertionType: 'body-field' };
134
+ }
135
+ function classifyAssertionMethod(methodName) {
136
+ if (methodName === 'tobe' ||
137
+ methodName === 'toequal' ||
138
+ methodName === 'tostrictequal' ||
139
+ methodName === 'tobetruthy' ||
140
+ methodName === 'tobefalsy') {
141
+ return 'status-code'; // Could be either, default to status-code
142
+ }
143
+ if (methodName === 'tohaveproperty' || methodName === 'tocontain' || methodName === 'tomatch') {
144
+ return 'body-field';
145
+ }
146
+ if (methodName === 'tothrow' || methodName === 'tothrowserror') {
147
+ return 'exception-catch';
148
+ }
149
+ return 'body-field';
150
+ }