@machina.ai/openapi-contract-tester 2.1.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 (431) hide show
  1. package/.env.example +91 -0
  2. package/README.md +472 -0
  3. package/dist/ai-engine/assertion-generator.d.ts +48 -0
  4. package/dist/ai-engine/assertion-generator.d.ts.map +1 -0
  5. package/dist/ai-engine/assertion-generator.js +166 -0
  6. package/dist/ai-engine/assertion-generator.js.map +1 -0
  7. package/dist/ai-engine/context-data-generator.d.ts +38 -0
  8. package/dist/ai-engine/context-data-generator.d.ts.map +1 -0
  9. package/dist/ai-engine/context-data-generator.js +146 -0
  10. package/dist/ai-engine/context-data-generator.js.map +1 -0
  11. package/dist/ai-engine/dataflow-detector.d.ts +53 -0
  12. package/dist/ai-engine/dataflow-detector.d.ts.map +1 -0
  13. package/dist/ai-engine/dataflow-detector.js +217 -0
  14. package/dist/ai-engine/dataflow-detector.js.map +1 -0
  15. package/dist/ai-engine/dependency-detector.d.ts +52 -0
  16. package/dist/ai-engine/dependency-detector.d.ts.map +1 -0
  17. package/dist/ai-engine/dependency-detector.js +241 -0
  18. package/dist/ai-engine/dependency-detector.js.map +1 -0
  19. package/dist/ai-engine/edge-case-suggester.d.ts +63 -0
  20. package/dist/ai-engine/edge-case-suggester.d.ts.map +1 -0
  21. package/dist/ai-engine/edge-case-suggester.js +177 -0
  22. package/dist/ai-engine/edge-case-suggester.js.map +1 -0
  23. package/dist/ai-engine/index.d.ts +13 -0
  24. package/dist/ai-engine/index.d.ts.map +1 -0
  25. package/dist/ai-engine/index.js +13 -0
  26. package/dist/ai-engine/index.js.map +1 -0
  27. package/dist/analyzers/ai-failure-analyzer.d.ts +41 -0
  28. package/dist/analyzers/ai-failure-analyzer.d.ts.map +1 -0
  29. package/dist/analyzers/ai-failure-analyzer.js +220 -0
  30. package/dist/analyzers/ai-failure-analyzer.js.map +1 -0
  31. package/dist/analyzers/comparison-utils.d.ts +31 -0
  32. package/dist/analyzers/comparison-utils.d.ts.map +1 -0
  33. package/dist/analyzers/comparison-utils.js +85 -0
  34. package/dist/analyzers/comparison-utils.js.map +1 -0
  35. package/dist/analyzers/context-analyzer.d.ts +49 -0
  36. package/dist/analyzers/context-analyzer.d.ts.map +1 -0
  37. package/dist/analyzers/context-analyzer.js +292 -0
  38. package/dist/analyzers/context-analyzer.js.map +1 -0
  39. package/dist/analyzers/dependency-analyzer.d.ts +44 -0
  40. package/dist/analyzers/dependency-analyzer.d.ts.map +1 -0
  41. package/dist/analyzers/dependency-analyzer.js +313 -0
  42. package/dist/analyzers/dependency-analyzer.js.map +1 -0
  43. package/dist/analyzers/failure-analyzer.d.ts +122 -0
  44. package/dist/analyzers/failure-analyzer.d.ts.map +1 -0
  45. package/dist/analyzers/failure-analyzer.js +140 -0
  46. package/dist/analyzers/failure-analyzer.js.map +1 -0
  47. package/dist/analyzers/failure-detectors/index.d.ts +33 -0
  48. package/dist/analyzers/failure-detectors/index.d.ts.map +1 -0
  49. package/dist/analyzers/failure-detectors/index.js +164 -0
  50. package/dist/analyzers/failure-detectors/index.js.map +1 -0
  51. package/dist/analyzers/failure-discrepancy-correlator.d.ts +111 -0
  52. package/dist/analyzers/failure-discrepancy-correlator.d.ts.map +1 -0
  53. package/dist/analyzers/failure-discrepancy-correlator.js +202 -0
  54. package/dist/analyzers/failure-discrepancy-correlator.js.map +1 -0
  55. package/dist/analyzers/index.d.ts +10 -0
  56. package/dist/analyzers/index.d.ts.map +1 -0
  57. package/dist/analyzers/index.js +10 -0
  58. package/dist/analyzers/index.js.map +1 -0
  59. package/dist/analyzers/semantic-matcher.d.ts +123 -0
  60. package/dist/analyzers/semantic-matcher.d.ts.map +1 -0
  61. package/dist/analyzers/semantic-matcher.js +297 -0
  62. package/dist/analyzers/semantic-matcher.js.map +1 -0
  63. package/dist/analyzers/source-comparator.d.ts +177 -0
  64. package/dist/analyzers/source-comparator.d.ts.map +1 -0
  65. package/dist/analyzers/source-comparator.js +225 -0
  66. package/dist/analyzers/source-comparator.js.map +1 -0
  67. package/dist/business-rules/business-rules-analyzer.d.ts +44 -0
  68. package/dist/business-rules/business-rules-analyzer.d.ts.map +1 -0
  69. package/dist/business-rules/business-rules-analyzer.js +363 -0
  70. package/dist/business-rules/business-rules-analyzer.js.map +1 -0
  71. package/dist/business-rules/business-rules-generator.d.ts +78 -0
  72. package/dist/business-rules/business-rules-generator.d.ts.map +1 -0
  73. package/dist/business-rules/business-rules-generator.js +357 -0
  74. package/dist/business-rules/business-rules-generator.js.map +1 -0
  75. package/dist/business-rules/extractors/rule-extractors.d.ts +50 -0
  76. package/dist/business-rules/extractors/rule-extractors.d.ts.map +1 -0
  77. package/dist/business-rules/extractors/rule-extractors.js +189 -0
  78. package/dist/business-rules/extractors/rule-extractors.js.map +1 -0
  79. package/dist/business-rules/value-generators.d.ts +70 -0
  80. package/dist/business-rules/value-generators.d.ts.map +1 -0
  81. package/dist/business-rules/value-generators.js +142 -0
  82. package/dist/business-rules/value-generators.js.map +1 -0
  83. package/dist/executor/auth-providers/auth-header-builder.d.ts +16 -0
  84. package/dist/executor/auth-providers/auth-header-builder.d.ts.map +1 -0
  85. package/dist/executor/auth-providers/auth-header-builder.js +47 -0
  86. package/dist/executor/auth-providers/auth-header-builder.js.map +1 -0
  87. package/dist/executor/auth-providers/oauth2-provider.d.ts +19 -0
  88. package/dist/executor/auth-providers/oauth2-provider.d.ts.map +1 -0
  89. package/dist/executor/auth-providers/oauth2-provider.js +114 -0
  90. package/dist/executor/auth-providers/oauth2-provider.js.map +1 -0
  91. package/dist/executor/http-client.d.ts +133 -0
  92. package/dist/executor/http-client.d.ts.map +1 -0
  93. package/dist/executor/http-client.js +172 -0
  94. package/dist/executor/http-client.js.map +1 -0
  95. package/dist/executor/http-request-builder.d.ts +69 -0
  96. package/dist/executor/http-request-builder.d.ts.map +1 -0
  97. package/dist/executor/http-request-builder.js +140 -0
  98. package/dist/executor/http-request-builder.js.map +1 -0
  99. package/dist/executor/http-response-parser.d.ts +28 -0
  100. package/dist/executor/http-response-parser.d.ts.map +1 -0
  101. package/dist/executor/http-response-parser.js +74 -0
  102. package/dist/executor/http-response-parser.js.map +1 -0
  103. package/dist/executor/response-handler.d.ts +66 -0
  104. package/dist/executor/response-handler.d.ts.map +1 -0
  105. package/dist/executor/response-handler.js +135 -0
  106. package/dist/executor/response-handler.js.map +1 -0
  107. package/dist/executor/result-processor.d.ts +27 -0
  108. package/dist/executor/result-processor.d.ts.map +1 -0
  109. package/dist/executor/result-processor.js +140 -0
  110. package/dist/executor/result-processor.js.map +1 -0
  111. package/dist/executor/result-utils.d.ts +21 -0
  112. package/dist/executor/result-utils.d.ts.map +1 -0
  113. package/dist/executor/result-utils.js +29 -0
  114. package/dist/executor/result-utils.js.map +1 -0
  115. package/dist/executor/test-executor.d.ts +49 -0
  116. package/dist/executor/test-executor.d.ts.map +1 -0
  117. package/dist/executor/test-executor.js +226 -0
  118. package/dist/executor/test-executor.js.map +1 -0
  119. package/dist/executor/test-runner.d.ts +85 -0
  120. package/dist/executor/test-runner.d.ts.map +1 -0
  121. package/dist/executor/test-runner.js +177 -0
  122. package/dist/executor/test-runner.js.map +1 -0
  123. package/dist/executor/token-detector/index.d.ts +7 -0
  124. package/dist/executor/token-detector/index.d.ts.map +1 -0
  125. package/dist/executor/token-detector/index.js +7 -0
  126. package/dist/executor/token-detector/index.js.map +1 -0
  127. package/dist/executor/token-detector/token-detector.d.ts +64 -0
  128. package/dist/executor/token-detector/token-detector.d.ts.map +1 -0
  129. package/dist/executor/token-detector/token-detector.js +140 -0
  130. package/dist/executor/token-detector/token-detector.js.map +1 -0
  131. package/dist/generators/business-rule-from-stories-generator.d.ts +30 -0
  132. package/dist/generators/business-rule-from-stories-generator.d.ts.map +1 -0
  133. package/dist/generators/business-rule-from-stories-generator.js +227 -0
  134. package/dist/generators/business-rule-from-stories-generator.js.map +1 -0
  135. package/dist/generators/data/ai-data-generator.d.ts +23 -0
  136. package/dist/generators/data/ai-data-generator.d.ts.map +1 -0
  137. package/dist/generators/data/ai-data-generator.js +41 -0
  138. package/dist/generators/data/ai-data-generator.js.map +1 -0
  139. package/dist/generators/data/base-generator.d.ts +121 -0
  140. package/dist/generators/data/base-generator.d.ts.map +1 -0
  141. package/dist/generators/data/base-generator.js +200 -0
  142. package/dist/generators/data/base-generator.js.map +1 -0
  143. package/dist/generators/data/heuristic-data-generator.d.ts +28 -0
  144. package/dist/generators/data/heuristic-data-generator.d.ts.map +1 -0
  145. package/dist/generators/data/heuristic-data-generator.js +49 -0
  146. package/dist/generators/data/heuristic-data-generator.js.map +1 -0
  147. package/dist/generators/data/index.d.ts +48 -0
  148. package/dist/generators/data/index.d.ts.map +1 -0
  149. package/dist/generators/data/index.js +201 -0
  150. package/dist/generators/data/index.js.map +1 -0
  151. package/dist/generators/data/schema-walker.d.ts +45 -0
  152. package/dist/generators/data/schema-walker.d.ts.map +1 -0
  153. package/dist/generators/data/schema-walker.js +103 -0
  154. package/dist/generators/data/schema-walker.js.map +1 -0
  155. package/dist/generators/data/type-strategies.d.ts +79 -0
  156. package/dist/generators/data/type-strategies.d.ts.map +1 -0
  157. package/dist/generators/data/type-strategies.js +394 -0
  158. package/dist/generators/data/type-strategies.js.map +1 -0
  159. package/dist/generators/data-generator.d.ts +11 -0
  160. package/dist/generators/data-generator.d.ts.map +1 -0
  161. package/dist/generators/data-generator.js +11 -0
  162. package/dist/generators/data-generator.js.map +1 -0
  163. package/dist/generators/edge-case-generator.d.ts +55 -0
  164. package/dist/generators/edge-case-generator.d.ts.map +1 -0
  165. package/dist/generators/edge-case-generator.js +327 -0
  166. package/dist/generators/edge-case-generator.js.map +1 -0
  167. package/dist/generators/edge-cases/boundary-analyzer.d.ts +26 -0
  168. package/dist/generators/edge-cases/boundary-analyzer.d.ts.map +1 -0
  169. package/dist/generators/edge-cases/boundary-analyzer.js +95 -0
  170. package/dist/generators/edge-cases/boundary-analyzer.js.map +1 -0
  171. package/dist/generators/error-case-generator.d.ts +11 -0
  172. package/dist/generators/error-case-generator.d.ts.map +1 -0
  173. package/dist/generators/error-case-generator.js +11 -0
  174. package/dist/generators/error-case-generator.js.map +1 -0
  175. package/dist/generators/errors/auth-error-strategy.d.ts +36 -0
  176. package/dist/generators/errors/auth-error-strategy.d.ts.map +1 -0
  177. package/dist/generators/errors/auth-error-strategy.js +118 -0
  178. package/dist/generators/errors/auth-error-strategy.js.map +1 -0
  179. package/dist/generators/errors/business-error-strategy.d.ts +44 -0
  180. package/dist/generators/errors/business-error-strategy.d.ts.map +1 -0
  181. package/dist/generators/errors/business-error-strategy.js +152 -0
  182. package/dist/generators/errors/business-error-strategy.js.map +1 -0
  183. package/dist/generators/errors/error-strategy-factory.d.ts +27 -0
  184. package/dist/generators/errors/error-strategy-factory.d.ts.map +1 -0
  185. package/dist/generators/errors/error-strategy-factory.js +47 -0
  186. package/dist/generators/errors/error-strategy-factory.js.map +1 -0
  187. package/dist/generators/errors/error-strategy.d.ts +62 -0
  188. package/dist/generators/errors/error-strategy.d.ts.map +1 -0
  189. package/dist/generators/errors/error-strategy.js +69 -0
  190. package/dist/generators/errors/error-strategy.js.map +1 -0
  191. package/dist/generators/errors/index.d.ts +23 -0
  192. package/dist/generators/errors/index.d.ts.map +1 -0
  193. package/dist/generators/errors/index.js +73 -0
  194. package/dist/generators/errors/index.js.map +1 -0
  195. package/dist/generators/errors/validation-error-strategy.d.ts +25 -0
  196. package/dist/generators/errors/validation-error-strategy.d.ts.map +1 -0
  197. package/dist/generators/errors/validation-error-strategy.js +214 -0
  198. package/dist/generators/errors/validation-error-strategy.js.map +1 -0
  199. package/dist/generators/happy-path-generator.d.ts +93 -0
  200. package/dist/generators/happy-path-generator.d.ts.map +1 -0
  201. package/dist/generators/happy-path-generator.js +275 -0
  202. package/dist/generators/happy-path-generator.js.map +1 -0
  203. package/dist/generators/test-enricher.d.ts +44 -0
  204. package/dist/generators/test-enricher.d.ts.map +1 -0
  205. package/dist/generators/test-enricher.js +109 -0
  206. package/dist/generators/test-enricher.js.map +1 -0
  207. package/dist/index.d.ts +9 -0
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/index.js +14 -0
  210. package/dist/index.js.map +1 -0
  211. package/dist/llm/ai-cache.d.ts +123 -0
  212. package/dist/llm/ai-cache.d.ts.map +1 -0
  213. package/dist/llm/ai-cache.js +220 -0
  214. package/dist/llm/ai-cache.js.map +1 -0
  215. package/dist/llm/ai-client.d.ts +92 -0
  216. package/dist/llm/ai-client.d.ts.map +1 -0
  217. package/dist/llm/ai-client.js +386 -0
  218. package/dist/llm/ai-client.js.map +1 -0
  219. package/dist/llm/data-generator-ai.d.ts +84 -0
  220. package/dist/llm/data-generator-ai.d.ts.map +1 -0
  221. package/dist/llm/data-generator-ai.js +284 -0
  222. package/dist/llm/data-generator-ai.js.map +1 -0
  223. package/dist/llm/index.d.ts +7 -0
  224. package/dist/llm/index.d.ts.map +1 -0
  225. package/dist/llm/index.js +7 -0
  226. package/dist/llm/index.js.map +1 -0
  227. package/dist/mcp/handlers/base-handler.d.ts +72 -0
  228. package/dist/mcp/handlers/base-handler.d.ts.map +1 -0
  229. package/dist/mcp/handlers/base-handler.js +86 -0
  230. package/dist/mcp/handlers/base-handler.js.map +1 -0
  231. package/dist/mcp/handlers/compare-sources.d.ts +91 -0
  232. package/dist/mcp/handlers/compare-sources.d.ts.map +1 -0
  233. package/dist/mcp/handlers/compare-sources.js +182 -0
  234. package/dist/mcp/handlers/compare-sources.js.map +1 -0
  235. package/dist/mcp/handlers/export-results.d.ts +53 -0
  236. package/dist/mcp/handlers/export-results.d.ts.map +1 -0
  237. package/dist/mcp/handlers/export-results.js +132 -0
  238. package/dist/mcp/handlers/export-results.js.map +1 -0
  239. package/dist/mcp/handlers/export-to-postman.d.ts +65 -0
  240. package/dist/mcp/handlers/export-to-postman.d.ts.map +1 -0
  241. package/dist/mcp/handlers/export-to-postman.js +128 -0
  242. package/dist/mcp/handlers/export-to-postman.js.map +1 -0
  243. package/dist/mcp/handlers/generate-tests.d.ts +74 -0
  244. package/dist/mcp/handlers/generate-tests.d.ts.map +1 -0
  245. package/dist/mcp/handlers/generate-tests.js +519 -0
  246. package/dist/mcp/handlers/generate-tests.js.map +1 -0
  247. package/dist/mcp/handlers/index.d.ts +13 -0
  248. package/dist/mcp/handlers/index.d.ts.map +1 -0
  249. package/dist/mcp/handlers/index.js +12 -0
  250. package/dist/mcp/handlers/index.js.map +1 -0
  251. package/dist/mcp/handlers/run-tests.d.ts +89 -0
  252. package/dist/mcp/handlers/run-tests.d.ts.map +1 -0
  253. package/dist/mcp/handlers/run-tests.js +233 -0
  254. package/dist/mcp/handlers/run-tests.js.map +1 -0
  255. package/dist/mcp/handlers/types.d.ts +61 -0
  256. package/dist/mcp/handlers/types.d.ts.map +1 -0
  257. package/dist/mcp/handlers/types.js +9 -0
  258. package/dist/mcp/handlers/types.js.map +1 -0
  259. package/dist/mcp/server.d.ts +64 -0
  260. package/dist/mcp/server.d.ts.map +1 -0
  261. package/dist/mcp/server.js +200 -0
  262. package/dist/mcp/server.js.map +1 -0
  263. package/dist/mcp/services/file-service.d.ts +66 -0
  264. package/dist/mcp/services/file-service.d.ts.map +1 -0
  265. package/dist/mcp/services/file-service.js +143 -0
  266. package/dist/mcp/services/file-service.js.map +1 -0
  267. package/dist/mcp/services/llm-service.d.ts +70 -0
  268. package/dist/mcp/services/llm-service.d.ts.map +1 -0
  269. package/dist/mcp/services/llm-service.js +189 -0
  270. package/dist/mcp/services/llm-service.js.map +1 -0
  271. package/dist/mcp/services/postman-service.d.ts +128 -0
  272. package/dist/mcp/services/postman-service.d.ts.map +1 -0
  273. package/dist/mcp/services/postman-service.js +266 -0
  274. package/dist/mcp/services/postman-service.js.map +1 -0
  275. package/dist/mcp/services/report-service.d.ts +81 -0
  276. package/dist/mcp/services/report-service.d.ts.map +1 -0
  277. package/dist/mcp/services/report-service.js +210 -0
  278. package/dist/mcp/services/report-service.js.map +1 -0
  279. package/dist/mcp/services/spec-service.d.ts +58 -0
  280. package/dist/mcp/services/spec-service.d.ts.map +1 -0
  281. package/dist/mcp/services/spec-service.js +140 -0
  282. package/dist/mcp/services/spec-service.js.map +1 -0
  283. package/dist/parsers/endpoint-extractor.d.ts +32 -0
  284. package/dist/parsers/endpoint-extractor.d.ts.map +1 -0
  285. package/dist/parsers/endpoint-extractor.js +160 -0
  286. package/dist/parsers/endpoint-extractor.js.map +1 -0
  287. package/dist/parsers/openapi-parser.d.ts +120 -0
  288. package/dist/parsers/openapi-parser.d.ts.map +1 -0
  289. package/dist/parsers/openapi-parser.js +257 -0
  290. package/dist/parsers/openapi-parser.js.map +1 -0
  291. package/dist/parsers/visitors/auth-visitor.d.ts +28 -0
  292. package/dist/parsers/visitors/auth-visitor.d.ts.map +1 -0
  293. package/dist/parsers/visitors/auth-visitor.js +116 -0
  294. package/dist/parsers/visitors/auth-visitor.js.map +1 -0
  295. package/dist/prd/index.d.ts +10 -0
  296. package/dist/prd/index.d.ts.map +1 -0
  297. package/dist/prd/index.js +10 -0
  298. package/dist/prd/index.js.map +1 -0
  299. package/dist/prd/prd-reader.d.ts +124 -0
  300. package/dist/prd/prd-reader.d.ts.map +1 -0
  301. package/dist/prd/prd-reader.js +308 -0
  302. package/dist/prd/prd-reader.js.map +1 -0
  303. package/dist/prd/prd-storage.d.ts +232 -0
  304. package/dist/prd/prd-storage.d.ts.map +1 -0
  305. package/dist/prd/prd-storage.js +129 -0
  306. package/dist/prd/prd-storage.js.map +1 -0
  307. package/dist/repairers/test-auto-repairer.d.ts +61 -0
  308. package/dist/repairers/test-auto-repairer.d.ts.map +1 -0
  309. package/dist/repairers/test-auto-repairer.js +213 -0
  310. package/dist/repairers/test-auto-repairer.js.map +1 -0
  311. package/dist/reporters/comparison-report-generator.d.ts +58 -0
  312. package/dist/reporters/comparison-report-generator.d.ts.map +1 -0
  313. package/dist/reporters/comparison-report-generator.js +369 -0
  314. package/dist/reporters/comparison-report-generator.js.map +1 -0
  315. package/dist/reporters/gherkin-formatter.d.ts +34 -0
  316. package/dist/reporters/gherkin-formatter.d.ts.map +1 -0
  317. package/dist/reporters/gherkin-formatter.js +231 -0
  318. package/dist/reporters/gherkin-formatter.js.map +1 -0
  319. package/dist/reporters/html-report-generator.d.ts +174 -0
  320. package/dist/reporters/html-report-generator.d.ts.map +1 -0
  321. package/dist/reporters/html-report-generator.js +194 -0
  322. package/dist/reporters/html-report-generator.js.map +1 -0
  323. package/dist/reporters/report-charts.d.ts +23 -0
  324. package/dist/reporters/report-charts.d.ts.map +1 -0
  325. package/dist/reporters/report-charts.js +182 -0
  326. package/dist/reporters/report-charts.js.map +1 -0
  327. package/dist/reporters/report-sections.d.ts +34 -0
  328. package/dist/reporters/report-sections.d.ts.map +1 -0
  329. package/dist/reporters/report-sections.js +481 -0
  330. package/dist/reporters/report-sections.js.map +1 -0
  331. package/dist/reporters/report-styles.d.ts +12 -0
  332. package/dist/reporters/report-styles.d.ts.map +1 -0
  333. package/dist/reporters/report-styles.js +412 -0
  334. package/dist/reporters/report-styles.js.map +1 -0
  335. package/dist/reporters/report-test-details.d.ts +56 -0
  336. package/dist/reporters/report-test-details.d.ts.map +1 -0
  337. package/dist/reporters/report-test-details.js +328 -0
  338. package/dist/reporters/report-test-details.js.map +1 -0
  339. package/dist/reporters/report-utils.d.ts +40 -0
  340. package/dist/reporters/report-utils.d.ts.map +1 -0
  341. package/dist/reporters/report-utils.js +163 -0
  342. package/dist/reporters/report-utils.js.map +1 -0
  343. package/dist/types/ai-config.d.ts +63 -0
  344. package/dist/types/ai-config.d.ts.map +1 -0
  345. package/dist/types/ai-config.js +79 -0
  346. package/dist/types/ai-config.js.map +1 -0
  347. package/dist/types/business-rules.d.ts +235 -0
  348. package/dist/types/business-rules.d.ts.map +1 -0
  349. package/dist/types/business-rules.js +6 -0
  350. package/dist/types/business-rules.js.map +1 -0
  351. package/dist/types/config.d.ts +106 -0
  352. package/dist/types/config.d.ts.map +1 -0
  353. package/dist/types/config.js +6 -0
  354. package/dist/types/config.js.map +1 -0
  355. package/dist/types/core.d.ts +72 -0
  356. package/dist/types/core.d.ts.map +1 -0
  357. package/dist/types/core.js +6 -0
  358. package/dist/types/core.js.map +1 -0
  359. package/dist/types/index.d.ts +17 -0
  360. package/dist/types/index.d.ts.map +1 -0
  361. package/dist/types/index.js +10 -0
  362. package/dist/types/index.js.map +1 -0
  363. package/dist/types/openapi.d.ts +139 -0
  364. package/dist/types/openapi.d.ts.map +1 -0
  365. package/dist/types/openapi.js +6 -0
  366. package/dist/types/openapi.js.map +1 -0
  367. package/dist/types/pact.d.ts +101 -0
  368. package/dist/types/pact.d.ts.map +1 -0
  369. package/dist/types/pact.js +6 -0
  370. package/dist/types/pact.js.map +1 -0
  371. package/dist/types/reporting.d.ts +93 -0
  372. package/dist/types/reporting.d.ts.map +1 -0
  373. package/dist/types/reporting.js +6 -0
  374. package/dist/types/reporting.js.map +1 -0
  375. package/dist/types/test-case.d.ts +233 -0
  376. package/dist/types/test-case.d.ts.map +1 -0
  377. package/dist/types/test-case.js +6 -0
  378. package/dist/types/test-case.js.map +1 -0
  379. package/dist/types/test-execution.d.ts +80 -0
  380. package/dist/types/test-execution.d.ts.map +1 -0
  381. package/dist/types/test-execution.js +6 -0
  382. package/dist/types/test-execution.js.map +1 -0
  383. package/dist/utils/auth-generator.d.ts +30 -0
  384. package/dist/utils/auth-generator.d.ts.map +1 -0
  385. package/dist/utils/auth-generator.js +68 -0
  386. package/dist/utils/auth-generator.js.map +1 -0
  387. package/dist/utils/config.d.ts +181 -0
  388. package/dist/utils/config.d.ts.map +1 -0
  389. package/dist/utils/config.js +141 -0
  390. package/dist/utils/config.js.map +1 -0
  391. package/dist/utils/coverage-calculator.d.ts +81 -0
  392. package/dist/utils/coverage-calculator.d.ts.map +1 -0
  393. package/dist/utils/coverage-calculator.js +134 -0
  394. package/dist/utils/coverage-calculator.js.map +1 -0
  395. package/dist/utils/data-loader.d.ts +52 -0
  396. package/dist/utils/data-loader.d.ts.map +1 -0
  397. package/dist/utils/data-loader.js +192 -0
  398. package/dist/utils/data-loader.js.map +1 -0
  399. package/dist/utils/errors.d.ts +167 -0
  400. package/dist/utils/errors.d.ts.map +1 -0
  401. package/dist/utils/errors.js +257 -0
  402. package/dist/utils/errors.js.map +1 -0
  403. package/dist/utils/logger.d.ts +220 -0
  404. package/dist/utils/logger.d.ts.map +1 -0
  405. package/dist/utils/logger.js +325 -0
  406. package/dist/utils/logger.js.map +1 -0
  407. package/dist/utils/openapi-discovery.d.ts +31 -0
  408. package/dist/utils/openapi-discovery.d.ts.map +1 -0
  409. package/dist/utils/openapi-discovery.js +322 -0
  410. package/dist/utils/openapi-discovery.js.map +1 -0
  411. package/dist/utils/path-resolver.d.ts +101 -0
  412. package/dist/utils/path-resolver.d.ts.map +1 -0
  413. package/dist/utils/path-resolver.js +167 -0
  414. package/dist/utils/path-resolver.js.map +1 -0
  415. package/dist/utils/resilience.d.ts +181 -0
  416. package/dist/utils/resilience.d.ts.map +1 -0
  417. package/dist/utils/resilience.js +269 -0
  418. package/dist/utils/resilience.js.map +1 -0
  419. package/dist/validators/openapi-validator.d.ts +198 -0
  420. package/dist/validators/openapi-validator.d.ts.map +1 -0
  421. package/dist/validators/openapi-validator.js +349 -0
  422. package/dist/validators/openapi-validator.js.map +1 -0
  423. package/dist/validators/response-matcher.d.ts +84 -0
  424. package/dist/validators/response-matcher.d.ts.map +1 -0
  425. package/dist/validators/response-matcher.js +234 -0
  426. package/dist/validators/response-matcher.js.map +1 -0
  427. package/dist/validators/schema-validator.d.ts +174 -0
  428. package/dist/validators/schema-validator.d.ts.map +1 -0
  429. package/dist/validators/schema-validator.js +340 -0
  430. package/dist/validators/schema-validator.js.map +1 -0
  431. package/package.json +76 -0
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Gherkin Formatter - Converts test cases to BDD Gherkin format
3
+ *
4
+ * Generates human-readable Given/When/Then scenarios from test cases
5
+ * for stakeholder-friendly reporting.
6
+ *
7
+ * @module reporters/gherkin-formatter
8
+ */
9
+ import { escapeHtml } from './report-utils.js';
10
+ /**
11
+ * Converts a test result to Gherkin scenario format
12
+ */
13
+ export function toGherkinScenario(test) {
14
+ const steps = [];
15
+ const tags = [];
16
+ // Tags
17
+ if (test.category) {
18
+ tags.push(`@${test.category}`);
19
+ }
20
+ if (test.method) {
21
+ tags.push(`@${test.method.toLowerCase()}`);
22
+ }
23
+ // GIVEN - Preconditions
24
+ const givenSteps = buildGivenSteps(test);
25
+ steps.push(...givenSteps);
26
+ // WHEN - Action
27
+ const whenStep = buildWhenStep(test);
28
+ steps.push(whenStep);
29
+ // THEN - Expected outcome
30
+ const thenSteps = buildThenSteps(test);
31
+ steps.push(...thenSteps);
32
+ return {
33
+ title: test.name,
34
+ steps,
35
+ status: test.status,
36
+ tags
37
+ };
38
+ }
39
+ /**
40
+ * Builds Given steps (preconditions)
41
+ */
42
+ function buildGivenSteps(test) {
43
+ const steps = [];
44
+ // Authentication
45
+ if (test.request?.headers?.Authorization) {
46
+ const authType = test.request.headers.Authorization.startsWith('Bearer')
47
+ ? 'con token bearer'
48
+ : 'con API key';
49
+ steps.push({
50
+ keyword: 'Given',
51
+ text: `estoy autenticado ${authType}`,
52
+ status: 'passed'
53
+ });
54
+ }
55
+ // Path parameters (resource exists)
56
+ if (test.request?.queryParams && Object.keys(test.request.queryParams).length > 0) {
57
+ const params = Object.entries(test.request.queryParams)
58
+ .map(([k, v]) => `${k}=${v}`)
59
+ .join(', ');
60
+ steps.push({
61
+ keyword: 'And',
62
+ text: `los siguientes parámetros de consulta están configurados: ${params}`,
63
+ status: 'passed'
64
+ });
65
+ }
66
+ // If no Given steps, add default
67
+ if (steps.length === 0) {
68
+ steps.push({
69
+ keyword: 'Given',
70
+ text: 'la API está disponible',
71
+ status: 'passed'
72
+ });
73
+ }
74
+ return steps;
75
+ }
76
+ /**
77
+ * Builds When step (action)
78
+ */
79
+ function buildWhenStep(test) {
80
+ const method = test.method?.toUpperCase() || 'REQUEST';
81
+ const path = test.path || test.endpoint || '/';
82
+ const step = {
83
+ keyword: 'When',
84
+ text: `envío una solicitud ${method} a "${path}"`,
85
+ status: 'passed'
86
+ };
87
+ // Add request body as data table
88
+ if (test.request?.body && typeof test.request.body === 'object') {
89
+ step.dataTable = Object.entries(test.request.body).map(([key, value]) => ({
90
+ key,
91
+ value: formatValue(value)
92
+ }));
93
+ }
94
+ return step;
95
+ }
96
+ /**
97
+ * Builds Then steps (expected outcomes and actual results)
98
+ */
99
+ function buildThenSteps(test) {
100
+ const steps = [];
101
+ // Expected status
102
+ const statusPassed = test.actualStatus === test.expectedStatus;
103
+ steps.push({
104
+ keyword: 'Then',
105
+ text: `el código de estado de la respuesta debe ser ${test.expectedStatus}`,
106
+ status: statusPassed ? 'passed' : 'failed',
107
+ error: statusPassed ? undefined : `Se obtuvo ${test.actualStatus} en su lugar`
108
+ });
109
+ // Response body validation
110
+ if (test.status === 'passed' && test.response?.body) {
111
+ const bodyType = typeof test.response.body;
112
+ if (bodyType === 'object' && !Array.isArray(test.response.body)) {
113
+ const fieldCount = Object.keys(test.response.body).length;
114
+ steps.push({
115
+ keyword: 'And',
116
+ text: `la respuesta debe contener ${fieldCount} campo${fieldCount !== 1 ? 's' : ''}`,
117
+ status: 'passed'
118
+ });
119
+ }
120
+ else if (Array.isArray(test.response.body)) {
121
+ steps.push({
122
+ keyword: 'And',
123
+ text: `la respuesta debe ser un arreglo con ${test.response.body.length} elemento${test.response.body.length !== 1 ? 's' : ''}`,
124
+ status: 'passed'
125
+ });
126
+ }
127
+ }
128
+ // Error message validation (for error cases)
129
+ if (test.error) {
130
+ steps.push({
131
+ keyword: 'But',
132
+ text: 'ocurrió un error',
133
+ status: 'failed',
134
+ error: test.error
135
+ });
136
+ }
137
+ // Response time
138
+ if (test.duration !== undefined) {
139
+ const responseTime = test.duration;
140
+ const timeStatus = responseTime < 2000 ? 'passed' : 'failed';
141
+ steps.push({
142
+ keyword: 'And',
143
+ text: `el tiempo de respuesta debe ser menor a 2000ms`,
144
+ status: timeStatus,
145
+ error: timeStatus === 'failed' ? `Tomó ${responseTime}ms` : undefined
146
+ });
147
+ }
148
+ return steps;
149
+ }
150
+ /**
151
+ * Formats a value for display in Gherkin table
152
+ */
153
+ function formatValue(value) {
154
+ if (value === null)
155
+ return 'null';
156
+ if (value === undefined)
157
+ return 'undefined';
158
+ if (typeof value === 'boolean')
159
+ return String(value);
160
+ if (typeof value === 'number')
161
+ return String(value);
162
+ if (typeof value === 'string')
163
+ return value.length > 50 ? value.substring(0, 47) + '...' : value;
164
+ if (Array.isArray(value))
165
+ return `[${value.length} items]`;
166
+ if (typeof value === 'object')
167
+ return '{object}';
168
+ return String(value);
169
+ }
170
+ /**
171
+ * Renders a Gherkin scenario as HTML
172
+ */
173
+ export function renderGherkinScenarioHTML(scenario) {
174
+ const statusClass = scenario.status === 'passed' ? 'gherkin-passed' :
175
+ scenario.status === 'failed' ? 'gherkin-failed' :
176
+ 'gherkin-skipped';
177
+ return `
178
+ <div class="gherkin-scenario ${statusClass}">
179
+ <div class="gherkin-header">
180
+ ${scenario.tags.map(tag => `<span class="gherkin-tag">${escapeHtml(tag)}</span>`).join(' ')}
181
+ <h4 class="gherkin-title">
182
+ <span class="gherkin-keyword">Scenario:</span>
183
+ <span class="gherkin-name">${escapeHtml(scenario.title)}</span>
184
+ </h4>
185
+ </div>
186
+
187
+ <div class="gherkin-steps">
188
+ ${scenario.steps.map(step => renderGherkinStepHTML(step)).join('')}
189
+ </div>
190
+ </div>
191
+ `;
192
+ }
193
+ /**
194
+ * Renders a Gherkin step as HTML
195
+ */
196
+ function renderGherkinStepHTML(step) {
197
+ const statusClass = step.status === 'passed' ? 'step-passed' :
198
+ step.status === 'failed' ? 'step-failed' :
199
+ 'step-neutral';
200
+ const statusIcon = step.status === 'passed' ? '✓' :
201
+ step.status === 'failed' ? '✗' :
202
+ '';
203
+ return `
204
+ <div class="gherkin-step ${statusClass}">
205
+ <div class="step-content">
206
+ <span class="step-keyword">${step.keyword}</span>
207
+ <span class="step-text">${escapeHtml(step.text)}</span>
208
+ ${statusIcon ? `<span class="step-status">${statusIcon}</span>` : ''}
209
+ </div>
210
+
211
+ ${step.dataTable ? `
212
+ <table class="gherkin-data-table">
213
+ ${step.dataTable.map(row => `
214
+ <tr>
215
+ <td class="data-key">${escapeHtml(row.key)}</td>
216
+ <td class="data-value">${escapeHtml(row.value)}</td>
217
+ </tr>
218
+ `).join('')}
219
+ </table>
220
+ ` : ''}
221
+
222
+ ${step.error ? `
223
+ <div class="step-error">
224
+ <span class="error-icon">⚠️</span>
225
+ <span class="error-text">${escapeHtml(step.error)}</span>
226
+ </div>
227
+ ` : ''}
228
+ </div>
229
+ `;
230
+ }
231
+ //# sourceMappingURL=gherkin-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gherkin-formatter.js","sourceRoot":"","sources":["../../src/reporters/gherkin-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Professional HTML Report Generator for API Testing
3
+ *
4
+ * Based on industry best practices from:
5
+ * - Newman HTMLExtra Reporter
6
+ * - Allure Reports
7
+ * - REST Assured Reports
8
+ *
9
+ * Facade: orchestrates section renderers and embeds Chart.js scripts.
10
+ *
11
+ * @module reporters/html-report-generator
12
+ */
13
+ export interface TestResult {
14
+ id?: string;
15
+ name: string;
16
+ category: string;
17
+ status: 'passed' | 'failed' | 'skipped';
18
+ method?: string;
19
+ path?: string;
20
+ endpoint: string;
21
+ expectedStatus?: number;
22
+ actualStatus?: number;
23
+ duration?: number;
24
+ error?: string;
25
+ schemaErrors?: any;
26
+ request?: {
27
+ headers?: Record<string, string>;
28
+ body?: any;
29
+ queryParams?: Record<string, string>;
30
+ };
31
+ response?: {
32
+ headers?: Record<string, string>;
33
+ body?: any;
34
+ };
35
+ }
36
+ export interface TestSummary {
37
+ total: number;
38
+ passed: number;
39
+ failed: number;
40
+ skipped?: number;
41
+ duration?: number;
42
+ avgResponseTime?: number;
43
+ passRate?: string;
44
+ }
45
+ export interface ReportData {
46
+ apiName?: string;
47
+ environment?: string;
48
+ timestamp: string;
49
+ summary: TestSummary;
50
+ byCategory?: Record<string, {
51
+ passed: number;
52
+ failed: number;
53
+ total: number;
54
+ }>;
55
+ byEndpoint?: Record<string, {
56
+ passed: number;
57
+ failed: number;
58
+ total: number;
59
+ }>;
60
+ allTests: TestResult[];
61
+ failedTests?: TestResult[];
62
+ failureAnalysis?: unknown;
63
+ discrepancies?: Array<{
64
+ type: string;
65
+ severity: string;
66
+ description: string;
67
+ }>;
68
+ coverage?: {
69
+ totalEndpoints: number;
70
+ testedEndpoints: number;
71
+ coveragePercentage: string;
72
+ uncoveredEndpoints: Array<{
73
+ method: string;
74
+ path: string;
75
+ }>;
76
+ endpointDetails: Array<{
77
+ endpoint: string;
78
+ method: string;
79
+ path: string;
80
+ totalTests: number;
81
+ passedTests: number;
82
+ failedTests: number;
83
+ hasCoverage: boolean;
84
+ }>;
85
+ };
86
+ aiAnalysis?: {
87
+ summary: string;
88
+ recommendations: Array<{
89
+ issue: string;
90
+ fix: string;
91
+ priority?: 'critical' | 'high' | 'medium' | 'low';
92
+ autoRepairSuggestion?: string;
93
+ }>;
94
+ patterns?: Array<{
95
+ pattern: string;
96
+ occurrences: number;
97
+ description: string;
98
+ impact: 'critical' | 'high' | 'medium' | 'low';
99
+ }>;
100
+ errorExplanations?: Record<string, string>;
101
+ criticalIssues?: Array<{
102
+ title: string;
103
+ description: string;
104
+ affectedEndpoints: string[];
105
+ }>;
106
+ };
107
+ sourceComparison?: {
108
+ timestamp: string;
109
+ summary: {
110
+ totalEndpointsInSpec: number;
111
+ totalEndpointsInCode: number;
112
+ totalRequirementsInPrd: number;
113
+ matchingEndpoints: number;
114
+ discrepanciesFound: number;
115
+ errors: number;
116
+ warnings: number;
117
+ info: number;
118
+ critical: number;
119
+ high: number;
120
+ medium: number;
121
+ low: number;
122
+ };
123
+ allEndpoints: Array<{
124
+ method: string;
125
+ path: string;
126
+ inOpenApi: boolean;
127
+ inCode: boolean;
128
+ inPrd: boolean;
129
+ }>;
130
+ discrepancies: Array<{
131
+ type: string;
132
+ severity: string;
133
+ priority: string;
134
+ description: string;
135
+ endpoint?: {
136
+ method: string;
137
+ path: string;
138
+ };
139
+ suggestion?: string;
140
+ }>;
141
+ };
142
+ failureDiscrepancyCorrelation?: {
143
+ totalFailures: number;
144
+ correlatedFailures: number;
145
+ correlationRate: string;
146
+ correlations: Array<{
147
+ failure: {
148
+ testId: string;
149
+ name: string;
150
+ method: string;
151
+ path: string;
152
+ expectedStatus: number;
153
+ actualStatus: number;
154
+ error?: string;
155
+ category: string;
156
+ };
157
+ relatedDiscrepancy?: any;
158
+ rootCause: string;
159
+ confidence: number;
160
+ explanation: string;
161
+ suggestedFix?: string;
162
+ autoRepairable: boolean;
163
+ }>;
164
+ summaryByRootCause: Record<string, number>;
165
+ };
166
+ }
167
+ /**
168
+ * Generates a professional HTML report following industry best practices.
169
+ *
170
+ * Template Method pattern: defines the HTML skeleton and delegates each
171
+ * section to a specialised renderer.
172
+ */
173
+ export declare function generateProfessionalHtmlReport(data: ReportData): string;
174
+ //# sourceMappingURL=html-report-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-report-generator.d.ts","sourceRoot":"","sources":["../../src/reporters/html-report-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,GAAG,CAAC;KACZ,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,QAAQ,CAAC,EAAE;QACT,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,kBAAkB,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC5D,eAAe,EAAE,KAAK,CAAC;YACrB,QAAQ,EAAE,MAAM,CAAC;YACjB,MAAM,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,WAAW,EAAE,MAAM,CAAC;YACpB,WAAW,EAAE,MAAM,CAAC;YACpB,WAAW,EAAE,OAAO,CAAC;SACtB,CAAC,CAAC;KACJ,CAAC;IACF,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,KAAK,CAAC;YACrB,KAAK,EAAE,MAAM,CAAC;YACd,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;YAClD,oBAAoB,CAAC,EAAE,MAAM,CAAC;SAC/B,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,KAAK,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;YAChB,WAAW,EAAE,MAAM,CAAC;YACpB,WAAW,EAAE,MAAM,CAAC;YACpB,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;SAChD,CAAC,CAAC;QACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,cAAc,CAAC,EAAE,KAAK,CAAC;YACrB,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;SAC7B,CAAC,CAAC;KACJ,CAAC;IACF,gBAAgB,CAAC,EAAE;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE;YACP,oBAAoB,EAAE,MAAM,CAAC;YAC7B,oBAAoB,EAAE,MAAM,CAAC;YAC7B,sBAAsB,EAAE,MAAM,CAAC;YAC/B,iBAAiB,EAAE,MAAM,CAAC;YAC1B,kBAAkB,EAAE,MAAM,CAAC;YAC3B,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;YACf,GAAG,EAAE,MAAM,CAAC;SACb,CAAC;QACF,YAAY,EAAE,KAAK,CAAC;YAClB,MAAM,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,OAAO,CAAC;YACnB,MAAM,EAAE,OAAO,CAAC;YAChB,KAAK,EAAE,OAAO,CAAC;SAChB,CAAC,CAAC;QACH,aAAa,EAAE,KAAK,CAAC;YACnB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,CAAC,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC;IACF,6BAA6B,CAAC,EAAE;QAC9B,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,KAAK,CAAC;YAClB,OAAO,EAAE;gBACP,MAAM,EAAE,MAAM,CAAC;gBACf,IAAI,EAAE,MAAM,CAAC;gBACb,MAAM,EAAE,MAAM,CAAC;gBACf,IAAI,EAAE,MAAM,CAAC;gBACb,cAAc,EAAE,MAAM,CAAC;gBACvB,YAAY,EAAE,MAAM,CAAC;gBACrB,KAAK,CAAC,EAAE,MAAM,CAAC;gBACf,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,kBAAkB,CAAC,EAAE,GAAG,CAAC;YACzB,SAAS,EAAE,MAAM,CAAC;YAClB,UAAU,EAAE,MAAM,CAAC;YACnB,WAAW,EAAE,MAAM,CAAC;YACpB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,cAAc,EAAE,OAAO,CAAC;SACzB,CAAC,CAAC;QACH,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC5C,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAuLvE"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Professional HTML Report Generator for API Testing
3
+ *
4
+ * Based on industry best practices from:
5
+ * - Newman HTMLExtra Reporter
6
+ * - Allure Reports
7
+ * - REST Assured Reports
8
+ *
9
+ * Facade: orchestrates section renderers and embeds Chart.js scripts.
10
+ *
11
+ * @module reporters/html-report-generator
12
+ */
13
+ import { getReportStyles } from './report-styles.js';
14
+ import { formatDuration, escapeHtml } from './report-utils.js';
15
+ import { generateCategoryTable, generateEndpointTable, generateCoverageSection, generateAiAnalysisSection, generateSourceComparisonSection, generateRootCauseSection, } from './report-sections.js';
16
+ import { generateDetailsByCategory } from './report-test-details.js';
17
+ import { getJavaScript } from './report-charts.js';
18
+ /**
19
+ * Generates a professional HTML report following industry best practices.
20
+ *
21
+ * Template Method pattern: defines the HTML skeleton and delegates each
22
+ * section to a specialised renderer.
23
+ */
24
+ export function generateProfessionalHtmlReport(data) {
25
+ const { apiName, summary, allTests = [], byCategory = {}, byEndpoint = {}, environment = 'Test', timestamp, aiAnalysis, coverage, } = data;
26
+ const passedTests = allTests.filter(t => t.status === 'passed');
27
+ const failedTests = allTests.filter(t => t.status === 'failed');
28
+ const skippedTests = allTests.filter(t => t.status === 'skipped');
29
+ const passRate = summary.passRate || (summary.total > 0
30
+ ? `${((summary.passed / summary.total) * 100).toFixed(2)}%`
31
+ : '0.00%');
32
+ const safeEnv = escapeHtml(String(environment));
33
+ return `<!DOCTYPE html>
34
+ <html lang="es">
35
+ <head>
36
+ <meta charset="UTF-8">
37
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
38
+ <title>${apiName ? escapeHtml(apiName) + ' - ' : ''}Test Report</title>
39
+ <script src="https://cdn.tailwindcss.com"></script>
40
+ <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
41
+ <style>
42
+ ${getReportStyles()}
43
+ </style>
44
+ </head>
45
+ <body class="bg-gray-50 min-h-screen">
46
+ <!-- Header -->
47
+ <header class="bg-white border-b border-gray-200 mb-8 sticky top-0 z-50 shadow-sm">
48
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
49
+ <h1 class="text-3xl md:text-4xl font-bold text-gray-900 mb-2">
50
+ ${apiName ? escapeHtml(apiName) : 'Reporte de Pruebas de API'}
51
+ </h1>
52
+ <div class="flex flex-wrap gap-3 items-center text-sm">
53
+ <span class="px-3 py-1.5 bg-gray-100 text-gray-700 rounded-md font-medium border border-gray-200">
54
+ ${safeEnv}
55
+ </span>
56
+ <span class="text-gray-500">${new Date(timestamp).toLocaleString()}</span>
57
+ </div>
58
+ </div>
59
+ </header>
60
+
61
+ <!-- Dashboard Summary -->
62
+ <section class="mb-8">
63
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
64
+ <div class="bg-white rounded-lg shadow-sm border border-gray-200 p-6 md:p-8">
65
+ <!-- Metrics Grid -->
66
+ <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
67
+ <div class="bg-white rounded-lg p-6 border border-gray-200 hover:border-gray-300 transition-all">
68
+ <div class="flex items-center justify-between mb-3">
69
+ <div class="text-sm font-medium text-gray-600">Total Tests</div>
70
+ <div class="w-10 h-10 rounded-lg bg-gray-100 flex items-center justify-center">
71
+ <svg class="w-5 h-5 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
72
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"/>
73
+ </svg>
74
+ </div>
75
+ </div>
76
+ <div class="text-3xl font-bold text-gray-900">${summary.total}</div>
77
+ </div>
78
+
79
+ <div class="bg-white rounded-lg p-6 border border-emerald-200 hover:border-emerald-300 transition-all">
80
+ <div class="flex items-center justify-between mb-3">
81
+ <div class="text-sm font-medium text-emerald-700">Passed</div>
82
+ <div class="w-10 h-10 rounded-lg bg-emerald-100 flex items-center justify-center">
83
+ <svg class="w-5 h-5 text-emerald-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
84
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
85
+ </svg>
86
+ </div>
87
+ </div>
88
+ <div class="text-3xl font-bold text-emerald-700">${summary.passed}</div>
89
+ <div class="text-sm text-emerald-600 mt-1 font-medium">${passRate} pass rate</div>
90
+ </div>
91
+
92
+ <div class="bg-white rounded-lg p-6 border border-red-200 hover:border-red-300 transition-all">
93
+ <div class="flex items-center justify-between mb-3">
94
+ <div class="text-sm font-medium text-red-700">Failed</div>
95
+ <div class="w-10 h-10 rounded-lg bg-red-100 flex items-center justify-center">
96
+ <svg class="w-5 h-5 text-red-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
97
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"/>
98
+ </svg>
99
+ </div>
100
+ </div>
101
+ <div class="text-3xl font-bold text-red-700">${summary.failed}</div>
102
+ </div>
103
+
104
+ <div class="bg-white rounded-lg p-6 border border-blue-200 hover:border-blue-300 transition-all">
105
+ <div class="flex items-center justify-between mb-3">
106
+ <div class="text-sm font-medium text-blue-700">Duration</div>
107
+ <div class="w-10 h-10 rounded-lg bg-blue-100 flex items-center justify-center">
108
+ <svg class="w-5 h-5 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
109
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
110
+ </svg>
111
+ </div>
112
+ </div>
113
+ <div class="text-3xl font-bold text-blue-700">${formatDuration(summary.duration || 0)}</div>
114
+ ${summary.avgResponseTime ? `<div class="text-sm text-blue-600 mt-1">Avg: ${summary.avgResponseTime.toFixed(0)}ms</div>` : ''}
115
+ </div>
116
+ </div>
117
+
118
+ <!-- Chart + Category Table -->
119
+ <div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-6">
120
+ <div class="bg-white rounded-lg p-6 border border-gray-200 flex flex-col items-center justify-center">
121
+ <h3 class="text-lg font-semibold text-gray-900 mb-4">Distribución de Resultados</h3>
122
+ <canvas id="passFailChart" class="max-h-56"></canvas>
123
+ </div>
124
+ <div class="lg:col-span-2">
125
+ ${generateCategoryTable(byCategory)}
126
+ </div>
127
+ </div>
128
+
129
+ <!-- Endpoint Table (full width) -->
130
+ ${generateEndpointTable(byEndpoint)}
131
+ </div>
132
+ </div>
133
+ </section>
134
+
135
+ ${coverage ? generateCoverageSection(coverage) : ''}
136
+
137
+ ${aiAnalysis && failedTests.length > 0 ? generateAiAnalysisSection(aiAnalysis) : ''}
138
+
139
+ ${data.sourceComparison ? generateSourceComparisonSection(data.sourceComparison) : ''}
140
+
141
+ ${data.failureDiscrepancyCorrelation && data.failureDiscrepancyCorrelation.correlatedFailures > 0
142
+ ? generateRootCauseSection(data.failureDiscrepancyCorrelation)
143
+ : ''}
144
+
145
+ <!-- Test Results -->
146
+ <section class="mb-8">
147
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
148
+ <div class="bg-white rounded-lg shadow-sm border border-gray-200 p-6 md:p-8">
149
+ <div class="flex flex-col lg:flex-row lg:justify-between lg:items-center gap-4 mb-6">
150
+ <h2 class="text-2xl font-bold text-gray-900">Test Details</h2>
151
+ <div class="flex flex-wrap gap-2">
152
+ <button class="px-4 py-2 rounded-md font-medium transition-all bg-blue-600 text-white tab-btn active" data-filter="all">
153
+ All (${allTests.length})
154
+ </button>
155
+ <button class="px-4 py-2 rounded-md font-medium transition-all bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 tab-btn" data-filter="passed">
156
+ Passed (${passedTests.length})
157
+ </button>
158
+ <button class="px-4 py-2 rounded-md font-medium transition-all bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 tab-btn" data-filter="failed">
159
+ Failed (${failedTests.length})
160
+ </button>
161
+ ${skippedTests.length > 0 ? `
162
+ <button class="px-4 py-2 rounded-md font-medium transition-all bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 tab-btn" data-filter="skipped">
163
+ Skipped (${skippedTests.length})
164
+ </button>
165
+ ` : ''}
166
+ </div>
167
+ </div>
168
+
169
+ <div class="space-y-4">
170
+ ${generateDetailsByCategory(allTests, aiAnalysis)}
171
+ </div>
172
+ </div>
173
+ </div>
174
+ </section>
175
+
176
+ <!-- Footer -->
177
+ <footer class="bg-white border-t border-gray-200 mt-12">
178
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
179
+ <div class="flex flex-col md:flex-row justify-between items-center gap-4">
180
+ <p class="text-sm text-gray-600">
181
+ Generated by <span class="font-semibold text-gray-900">OpenAPI Contract Tester</span>
182
+ </p>
183
+ <p class="text-sm text-gray-500">${new Date().toLocaleString()}</p>
184
+ </div>
185
+ </div>
186
+ </footer>
187
+
188
+ <script>
189
+ ${getJavaScript(summary)}
190
+ </script>
191
+ </body>
192
+ </html>`;
193
+ }
194
+ //# sourceMappingURL=html-report-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-report-generator.js","sourceRoot":"","sources":["../../src/reporters/html-report-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Chart JavaScript for HTML Report
3
+ *
4
+ * Generates the embedded JavaScript for Chart.js charts and
5
+ * interactive filter/toggle functionality.
6
+ *
7
+ * @module reporters/report-charts
8
+ */
9
+ export interface ChartTestSummary {
10
+ passed: number;
11
+ failed: number;
12
+ skipped?: number;
13
+ total: number;
14
+ }
15
+ /**
16
+ * Generates the embedded JavaScript for the HTML report.
17
+ * Initializes Chart.js charts and wires up interactive filters.
18
+ *
19
+ * @param summary - Test summary with pass/fail counts
20
+ * @returns JavaScript string to embed in the HTML report
21
+ */
22
+ export declare function getJavaScript(summary: ChartTestSummary): string;
23
+ //# sourceMappingURL=report-charts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-charts.d.ts","sourceRoot":"","sources":["../../src/reporters/report-charts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,gBAAgB,GACxB,MAAM,CAqKR"}