@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,134 @@
1
+ /**
2
+ * Coverage Calculator
3
+ *
4
+ * Calculates endpoint coverage from test results
5
+ * without generating new tests (unlike preview-test-coverage)
6
+ *
7
+ * @module utils/coverage-calculator
8
+ */
9
+ /**
10
+ * Calculates endpoint coverage from test results
11
+ *
12
+ * Analyzes results.json to determine which endpoints were tested
13
+ * and which are missing coverage
14
+ *
15
+ * @param results - Test results object with allTests array
16
+ * @returns Coverage statistics
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const results = JSON.parse(await fs.readFile('results.json', 'utf-8'));
21
+ * const coverage = calculateCoverageFromResults(results);
22
+ *
23
+ * console.log(coverage.coveragePercentage); // "85%"
24
+ * console.log(coverage.uncoveredEndpoints); // [{ method: "DELETE", path: "/users/{id}" }]
25
+ * ```
26
+ */
27
+ export function calculateCoverageFromResults(results) {
28
+ const endpointMap = new Map();
29
+ // Extract and group tests by endpoint
30
+ for (const test of results.allTests || []) {
31
+ // Get endpoint identifier (prefer explicit endpoint field, fallback to method+path)
32
+ const method = test.method || 'UNKNOWN';
33
+ const path = test.path || 'unknown';
34
+ const endpointKey = test.endpoint || `${method} ${path}`;
35
+ if (!endpointMap.has(endpointKey)) {
36
+ endpointMap.set(endpointKey, {
37
+ method,
38
+ path,
39
+ totalTests: 0,
40
+ passedTests: 0,
41
+ failedTests: 0,
42
+ });
43
+ }
44
+ const endpoint = endpointMap.get(endpointKey);
45
+ endpoint.totalTests++;
46
+ if (test.status === 'passed') {
47
+ endpoint.passedTests++;
48
+ }
49
+ else if (test.status === 'failed') {
50
+ endpoint.failedTests++;
51
+ }
52
+ }
53
+ // Calculate coverage statistics
54
+ const totalEndpoints = endpointMap.size;
55
+ const testedEndpoints = endpointMap.size; // All endpoints in results have at least 1 test
56
+ // Find uncovered endpoints (in this case, none since we only have tested ones)
57
+ // This would require OpenAPI spec to find truly uncovered endpoints
58
+ const uncoveredEndpoints = [];
59
+ // Build detailed endpoint info
60
+ const endpointDetails = Array.from(endpointMap.entries()).map(([endpointKey, data]) => ({
61
+ endpoint: endpointKey,
62
+ method: data.method,
63
+ path: data.path,
64
+ totalTests: data.totalTests,
65
+ passedTests: data.passedTests,
66
+ failedTests: data.failedTests,
67
+ hasCoverage: data.totalTests > 0,
68
+ }));
69
+ const coveragePercentage = totalEndpoints > 0
70
+ ? `${((testedEndpoints / totalEndpoints) * 100).toFixed(2)}%`
71
+ : '0%';
72
+ return {
73
+ totalEndpoints,
74
+ testedEndpoints,
75
+ coveragePercentage,
76
+ uncoveredEndpoints,
77
+ endpointDetails,
78
+ };
79
+ }
80
+ /**
81
+ * Calculates coverage with OpenAPI spec to find truly uncovered endpoints
82
+ *
83
+ * Compares test results against OpenAPI spec to identify endpoints
84
+ * that exist in spec but have no tests
85
+ *
86
+ * @param results - Test results object
87
+ * @param specEndpoints - Parsed endpoints from OpenAPI spec
88
+ * @returns Coverage statistics including truly uncovered endpoints
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * const spec = await parseOpenAPISpec('api.yml');
93
+ * const endpoints = extractEndpoints(spec);
94
+ * const coverage = calculateCoverageWithSpec(results, endpoints);
95
+ *
96
+ * console.log(coverage.uncoveredEndpoints);
97
+ * // [{ method: "DELETE", path: "/admin/logs" }]
98
+ * ```
99
+ */
100
+ export function calculateCoverageWithSpec(results, specEndpoints) {
101
+ const baseCoverage = calculateCoverageFromResults(results);
102
+ // Get all tested endpoints
103
+ const testedEndpointsSet = new Set();
104
+ for (const test of results.allTests || []) {
105
+ const method = test.method || 'UNKNOWN';
106
+ const path = test.path || 'unknown';
107
+ const endpointKey = `${method} ${path}`;
108
+ testedEndpointsSet.add(endpointKey);
109
+ }
110
+ // Find uncovered endpoints from spec
111
+ const uncoveredEndpoints = [];
112
+ for (const endpoint of specEndpoints) {
113
+ const endpointKey = `${endpoint.method} ${endpoint.path}`;
114
+ if (!testedEndpointsSet.has(endpointKey)) {
115
+ uncoveredEndpoints.push({
116
+ method: endpoint.method,
117
+ path: endpoint.path,
118
+ });
119
+ }
120
+ }
121
+ const totalEndpoints = specEndpoints.length;
122
+ const testedEndpoints = totalEndpoints - uncoveredEndpoints.length;
123
+ const coveragePercentage = totalEndpoints > 0
124
+ ? `${((testedEndpoints / totalEndpoints) * 100).toFixed(2)}%`
125
+ : '0%';
126
+ return {
127
+ ...baseCoverage,
128
+ totalEndpoints,
129
+ testedEndpoints,
130
+ coveragePercentage,
131
+ uncoveredEndpoints,
132
+ };
133
+ }
134
+ //# sourceMappingURL=coverage-calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-calculator.js","sourceRoot":"","sources":["../../src/utils/coverage-calculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Test Data Loader
3
+ *
4
+ * Loads test data from various file formats (Excel, CSV, JSON).
5
+ * Supports sharing test data across teams via files.
6
+ *
7
+ * @module utils/data-loader
8
+ */
9
+ /**
10
+ * Loads test data from a file (Excel, CSV, or JSON)
11
+ *
12
+ * Supports:
13
+ * - Excel (.xlsx, .xls) - Reads first row as headers, second row as data
14
+ * - CSV (.csv) - Reads first row as headers, second row as data
15
+ * - JSON (.json) - Reads entire object
16
+ *
17
+ * @param filePath - Absolute path to the data file
18
+ * @returns Test data as key-value pairs
19
+ * @throws Error if file format is unsupported or file cannot be read
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * // Excel/CSV format:
24
+ * // | username | password | grant_type |
25
+ * // | user@bank.com | SecurePass123! | password |
26
+ *
27
+ * const data = await loadTestData('./test-data.xlsx');
28
+ * // Returns: { username: 'user@bank.com', password: 'SecurePass123!', grant_type: 'password' }
29
+ *
30
+ * // JSON format:
31
+ * // { "username": "user@bank.com", "password": "SecurePass123!" }
32
+ *
33
+ * const data = await loadTestData('./test-data.json');
34
+ * // Returns: { username: 'user@bank.com', password: 'SecurePass123!' }
35
+ * ```
36
+ */
37
+ export declare function loadTestData(filePath: string): Promise<Record<string, any>>;
38
+ /**
39
+ * Validates that test data contains required fields
40
+ *
41
+ * @param testData - Test data object
42
+ * @param requiredFields - Array of required field names
43
+ * @throws Error if any required field is missing
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * validateTestData(data, ['username', 'password']);
48
+ * // Throws if username or password is missing
49
+ * ```
50
+ */
51
+ export declare function validateTestData(testData: Record<string, any>, requiredFields: string[]): void;
52
+ //# sourceMappingURL=data-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-loader.d.ts","sourceRoot":"","sources":["../../src/utils/data-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAkBjF;AAsID;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,cAAc,EAAE,MAAM,EAAE,GACvB,IAAI,CAQN"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Test Data Loader
3
+ *
4
+ * Loads test data from various file formats (Excel, CSV, JSON).
5
+ * Supports sharing test data across teams via files.
6
+ *
7
+ * @module utils/data-loader
8
+ */
9
+ import * as XLSX from 'xlsx';
10
+ import * as Papa from 'papaparse';
11
+ import { promises as fs } from 'fs';
12
+ import { extname } from 'path';
13
+ import { createLogger } from './logger.js';
14
+ const log = createLogger('data-loader');
15
+ /**
16
+ * Loads test data from a file (Excel, CSV, or JSON)
17
+ *
18
+ * Supports:
19
+ * - Excel (.xlsx, .xls) - Reads first row as headers, second row as data
20
+ * - CSV (.csv) - Reads first row as headers, second row as data
21
+ * - JSON (.json) - Reads entire object
22
+ *
23
+ * @param filePath - Absolute path to the data file
24
+ * @returns Test data as key-value pairs
25
+ * @throws Error if file format is unsupported or file cannot be read
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * // Excel/CSV format:
30
+ * // | username | password | grant_type |
31
+ * // | user@bank.com | SecurePass123! | password |
32
+ *
33
+ * const data = await loadTestData('./test-data.xlsx');
34
+ * // Returns: { username: 'user@bank.com', password: 'SecurePass123!', grant_type: 'password' }
35
+ *
36
+ * // JSON format:
37
+ * // { "username": "user@bank.com", "password": "SecurePass123!" }
38
+ *
39
+ * const data = await loadTestData('./test-data.json');
40
+ * // Returns: { username: 'user@bank.com', password: 'SecurePass123!' }
41
+ * ```
42
+ */
43
+ export async function loadTestData(filePath) {
44
+ const ext = extname(filePath).toLowerCase();
45
+ log.info('Loading test data from file', { filePath, extension: ext });
46
+ switch (ext) {
47
+ case '.xlsx':
48
+ case '.xls':
49
+ return await loadExcelData(filePath);
50
+ case '.csv':
51
+ return await loadCsvData(filePath);
52
+ case '.json':
53
+ return await loadJsonData(filePath);
54
+ default:
55
+ throw new Error(`Unsupported test data file format: ${ext}. Supported formats: .xlsx, .xls, .csv, .json`);
56
+ }
57
+ }
58
+ /**
59
+ * Loads test data from Excel file
60
+ *
61
+ * Expects:
62
+ * - First row: Column headers (field names)
63
+ * - Second row: Data values
64
+ *
65
+ * @param filePath - Path to Excel file
66
+ * @returns Test data object
67
+ * @internal
68
+ */
69
+ async function loadExcelData(filePath) {
70
+ try {
71
+ // Read Excel file
72
+ const workbook = XLSX.readFile(filePath);
73
+ // Get first sheet
74
+ const sheetName = workbook.SheetNames[0];
75
+ if (!sheetName) {
76
+ throw new Error('Excel file is empty (no sheets found)');
77
+ }
78
+ const worksheet = workbook.Sheets[sheetName];
79
+ // Convert to JSON (array of objects)
80
+ const jsonData = XLSX.utils.sheet_to_json(worksheet);
81
+ if (jsonData.length === 0) {
82
+ throw new Error('Excel file is empty (no data rows found)');
83
+ }
84
+ // Return first row as test data
85
+ const testData = jsonData[0];
86
+ log.debug('Loaded Excel data', {
87
+ filePath,
88
+ sheetName,
89
+ rowCount: jsonData.length,
90
+ fields: Object.keys(testData),
91
+ });
92
+ return testData;
93
+ }
94
+ catch (error) {
95
+ const errorMessage = error instanceof Error ? error.message : String(error);
96
+ log.error('Failed to load Excel file', { filePath, error: errorMessage });
97
+ throw new Error(`Failed to load Excel file: ${errorMessage}`);
98
+ }
99
+ }
100
+ /**
101
+ * Loads test data from CSV file
102
+ *
103
+ * Expects:
104
+ * - First row: Column headers (field names)
105
+ * - Second row: Data values
106
+ *
107
+ * @param filePath - Path to CSV file
108
+ * @returns Test data object
109
+ * @internal
110
+ */
111
+ async function loadCsvData(filePath) {
112
+ try {
113
+ // Read CSV file
114
+ const csvContent = await fs.readFile(filePath, 'utf-8');
115
+ // Parse CSV
116
+ const result = Papa.parse(csvContent, {
117
+ header: true, // First row as headers
118
+ skipEmptyLines: true,
119
+ dynamicTyping: true, // Auto-convert numbers, booleans
120
+ });
121
+ if (result.errors.length > 0) {
122
+ const errorMessages = result.errors.map((e) => e.message).join(', ');
123
+ throw new Error(`CSV parsing errors: ${errorMessages}`);
124
+ }
125
+ if (result.data.length === 0) {
126
+ throw new Error('CSV file is empty (no data rows found)');
127
+ }
128
+ // Return first row as test data
129
+ const testData = result.data[0];
130
+ log.debug('Loaded CSV data', {
131
+ filePath,
132
+ rowCount: result.data.length,
133
+ fields: Object.keys(testData),
134
+ });
135
+ return testData;
136
+ }
137
+ catch (error) {
138
+ const errorMessage = error instanceof Error ? error.message : String(error);
139
+ log.error('Failed to load CSV file', { filePath, error: errorMessage });
140
+ throw new Error(`Failed to load CSV file: ${errorMessage}`);
141
+ }
142
+ }
143
+ /**
144
+ * Loads test data from JSON file
145
+ *
146
+ * Expects a JSON object with key-value pairs.
147
+ *
148
+ * @param filePath - Path to JSON file
149
+ * @returns Test data object
150
+ * @internal
151
+ */
152
+ async function loadJsonData(filePath) {
153
+ try {
154
+ // Read JSON file
155
+ const jsonContent = await fs.readFile(filePath, 'utf-8');
156
+ // Parse JSON
157
+ const testData = JSON.parse(jsonContent);
158
+ if (typeof testData !== 'object' || testData === null || Array.isArray(testData)) {
159
+ throw new Error('JSON file must contain an object (not an array or primitive)');
160
+ }
161
+ log.debug('Loaded JSON data', {
162
+ filePath,
163
+ fields: Object.keys(testData),
164
+ });
165
+ return testData;
166
+ }
167
+ catch (error) {
168
+ const errorMessage = error instanceof Error ? error.message : String(error);
169
+ log.error('Failed to load JSON file', { filePath, error: errorMessage });
170
+ throw new Error(`Failed to load JSON file: ${errorMessage}`);
171
+ }
172
+ }
173
+ /**
174
+ * Validates that test data contains required fields
175
+ *
176
+ * @param testData - Test data object
177
+ * @param requiredFields - Array of required field names
178
+ * @throws Error if any required field is missing
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * validateTestData(data, ['username', 'password']);
183
+ * // Throws if username or password is missing
184
+ * ```
185
+ */
186
+ export function validateTestData(testData, requiredFields) {
187
+ const missingFields = requiredFields.filter((field) => !(field in testData));
188
+ if (missingFields.length > 0) {
189
+ throw new Error(`Test data is missing required fields: ${missingFields.join(', ')}`);
190
+ }
191
+ }
192
+ //# sourceMappingURL=data-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-loader.js","sourceRoot":"","sources":["../../src/utils/data-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Custom Error Classes for OpenAPI Contract Tester
3
+ *
4
+ * Provides semantic error types with error codes for better error handling
5
+ * and user-friendly error messages.
6
+ *
7
+ * @module utils/errors
8
+ */
9
+ /**
10
+ * Error codes for different failure scenarios
11
+ */
12
+ export declare enum ErrorCode {
13
+ OPENAPI_PARSE_ERROR = "E001",
14
+ OPENAPI_INVALID_SPEC = "E002",
15
+ OPENAPI_UNSUPPORTED_VERSION = "E003",
16
+ OPENAPI_MISSING_PATHS = "E004",
17
+ OPENAPI_INVALID_SCHEMA = "E005",
18
+ TEST_GENERATION_FAILED = "E100",
19
+ NO_ENDPOINTS_FOUND = "E101",
20
+ INVALID_TEST_CATEGORY = "E102",
21
+ DATA_GENERATION_FAILED = "E103",
22
+ TEST_EXECUTION_FAILED = "E200",
23
+ HTTP_REQUEST_FAILED = "E201",
24
+ TIMEOUT_ERROR = "E202",
25
+ NETWORK_ERROR = "E203",
26
+ AUTH_ERROR = "E204",
27
+ SCHEMA_VALIDATION_FAILED = "E300",
28
+ RESPONSE_VALIDATION_FAILED = "E301",
29
+ CONTRACT_VALIDATION_FAILED = "E302",
30
+ BUSINESS_RULES_PARSE_ERROR = "E400",
31
+ BUSINESS_RULES_NOT_FOUND = "E401",
32
+ BUSINESS_RULES_INVALID = "E402",
33
+ DOCS_NOT_FOUND = "E403",
34
+ RULES_EXTRACTION_FAILED = "E404",
35
+ PACT_GENERATION_FAILED = "E500",
36
+ PACT_VERIFICATION_FAILED = "E501",
37
+ PACT_BROKER_ERROR = "E502",
38
+ MCP_TOOL_NOT_FOUND = "E600",
39
+ MCP_INVALID_ARGUMENTS = "E601",
40
+ MCP_INTERNAL_ERROR = "E602",
41
+ FILE_NOT_FOUND = "E700",
42
+ FILE_READ_ERROR = "E701",
43
+ FILE_WRITE_ERROR = "E702",
44
+ DIRECTORY_NOT_FOUND = "E703",
45
+ UNKNOWN_ERROR = "E999"
46
+ }
47
+ /**
48
+ * Base error class with error code and user-friendly messages
49
+ */
50
+ export declare class BaseError extends Error {
51
+ /**
52
+ * Error code for programmatic handling
53
+ */
54
+ readonly code: ErrorCode;
55
+ /**
56
+ * User-friendly error message
57
+ */
58
+ readonly userMessage: string;
59
+ /**
60
+ * Additional context/metadata
61
+ */
62
+ readonly context?: Record<string, unknown>;
63
+ /**
64
+ * Whether this error is retryable
65
+ */
66
+ readonly retryable: boolean;
67
+ constructor(code: ErrorCode, message: string, userMessage: string, context?: Record<string, unknown>, retryable?: boolean);
68
+ /**
69
+ * Converts error to JSON for logging/API responses
70
+ */
71
+ toJSON(): Record<string, unknown>;
72
+ }
73
+ /**
74
+ * OpenAPI parsing and validation errors
75
+ */
76
+ export declare class OpenAPIError extends BaseError {
77
+ constructor(code: ErrorCode, message: string, userMessage: string, context?: Record<string, unknown>);
78
+ }
79
+ /**
80
+ * Test generation errors
81
+ */
82
+ export declare class TestGenerationError extends BaseError {
83
+ constructor(code: ErrorCode, message: string, userMessage: string, context?: Record<string, unknown>);
84
+ }
85
+ /**
86
+ * Test execution errors (potentially retryable)
87
+ */
88
+ export declare class TestExecutionError extends BaseError {
89
+ constructor(code: ErrorCode, message: string, userMessage: string, context?: Record<string, unknown>, retryable?: boolean);
90
+ }
91
+ /**
92
+ * Validation errors
93
+ */
94
+ export declare class ValidationError extends BaseError {
95
+ constructor(code: ErrorCode, message: string, userMessage: string, context?: Record<string, unknown>);
96
+ }
97
+ /**
98
+ * Business rules errors
99
+ */
100
+ export declare class BusinessRuleError extends BaseError {
101
+ constructor(code: ErrorCode, message: string, userMessage: string, context?: Record<string, unknown>);
102
+ }
103
+ /**
104
+ * Pact contract testing errors
105
+ */
106
+ export declare class PactError extends BaseError {
107
+ constructor(code: ErrorCode, message: string, userMessage: string, context?: Record<string, unknown>, retryable?: boolean);
108
+ }
109
+ /**
110
+ * MCP server errors
111
+ */
112
+ export declare class MCPError extends BaseError {
113
+ constructor(code: ErrorCode, message: string, userMessage: string, context?: Record<string, unknown>);
114
+ }
115
+ /**
116
+ * File system errors
117
+ */
118
+ export declare class FileSystemError extends BaseError {
119
+ constructor(code: ErrorCode, message: string, userMessage: string, context?: Record<string, unknown>);
120
+ }
121
+ /**
122
+ * Formats an error for user display (removes stack trace, sanitizes)
123
+ *
124
+ * @param error - Error to format
125
+ * @returns User-friendly error object
126
+ *
127
+ * @example
128
+ * ```typescript
129
+ * try {
130
+ * // ... code
131
+ * } catch (error) {
132
+ * const formatted = formatError(error);
133
+ * return { success: false, error: formatted };
134
+ * }
135
+ * ```
136
+ */
137
+ export declare function formatError(error: unknown): {
138
+ code: string;
139
+ message: string;
140
+ retryable?: boolean;
141
+ context?: Record<string, unknown>;
142
+ };
143
+ /**
144
+ * Type guard to check if error is retryable
145
+ *
146
+ * @param error - Error to check
147
+ * @returns True if error is retryable
148
+ */
149
+ export declare function isRetryableError(error: unknown): boolean;
150
+ /**
151
+ * Wraps a native error in appropriate custom error class
152
+ *
153
+ * @param error - Native error
154
+ * @param context - Additional context
155
+ * @returns Custom error instance
156
+ *
157
+ * @example
158
+ * ```typescript
159
+ * try {
160
+ * await fs.readFile('file.yml');
161
+ * } catch (error) {
162
+ * throw wrapError(error, { file: 'file.yml' });
163
+ * }
164
+ * ```
165
+ */
166
+ export declare function wrapError(error: unknown, context?: Record<string, unknown>): BaseError;
167
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}