@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,357 @@
1
+ /**
2
+ * Business Rules Test Generator
3
+ *
4
+ * Generates test cases from business rules (business-rules.yml).
5
+ * Creates both positive (valid) and negative (invalid) test cases
6
+ * for each business rule validation.
7
+ *
8
+ * @module business-rules/business-rules-generator
9
+ */
10
+ import { faker } from '@faker-js/faker';
11
+ import { generateDataFromSchema } from '../generators/data-generator.js';
12
+ import { readBusinessRulesYAML } from './business-rules-analyzer.js';
13
+ import { createLogger } from '../utils/logger.js';
14
+ import { applyValidRuleValues, generateInvalidValue } from './value-generators.js';
15
+ const log = createLogger('business-rules-generator');
16
+ /**
17
+ * Generates test cases from a business rules document
18
+ *
19
+ * @param rulesPath - Path to business-rules.yml file
20
+ * @param endpoints - Parsed OpenAPI endpoints for schema reference
21
+ * @param options - Generation options
22
+ * @returns Generated tests result
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const result = await generateBusinessRulesTests(
27
+ * './business-rules.yml',
28
+ * endpoints,
29
+ * { generatePositive: true, generateNegative: true, seed: 42 }
30
+ * );
31
+ * console.log(`Generated ${result.summary.total} business rule tests`);
32
+ * ```
33
+ */
34
+ export async function generateBusinessRulesTests(rulesPath, endpoints, options = {}) {
35
+ const { generatePositive = true, generateNegative = true, seed, includeOptional = false, } = options;
36
+ if (seed !== undefined) {
37
+ faker.seed(seed);
38
+ }
39
+ try {
40
+ // Read business rules document
41
+ const document = await readBusinessRulesYAML(rulesPath);
42
+ const allTests = [];
43
+ const byRule = {};
44
+ let positiveCount = 0;
45
+ let negativeCount = 0;
46
+ // Create endpoint map for quick lookup
47
+ const endpointMap = new Map();
48
+ for (const endpoint of endpoints) {
49
+ const key = `${endpoint.method} ${endpoint.path}`;
50
+ endpointMap.set(key, endpoint);
51
+ }
52
+ // Generate tests for each rule
53
+ for (const rule of document.rules) {
54
+ const endpoint = endpointMap.get(rule.endpoint);
55
+ if (!endpoint) {
56
+ log.warn(`Endpoint not found in OpenAPI spec: ${rule.endpoint}`, { ruleId: rule.id, endpoint: rule.endpoint });
57
+ continue;
58
+ }
59
+ const ruleTests = [];
60
+ // Generate positive tests (valid data)
61
+ if (generatePositive) {
62
+ const positiveTests = generatePositiveTests(rule, endpoint, includeOptional);
63
+ ruleTests.push(...positiveTests);
64
+ positiveCount += positiveTests.length;
65
+ }
66
+ // Generate negative tests (invalid data)
67
+ if (generateNegative) {
68
+ const negativeTests = generateNegativeTests(rule, endpoint, includeOptional);
69
+ ruleTests.push(...negativeTests);
70
+ negativeCount += negativeTests.length;
71
+ }
72
+ byRule[rule.id] = ruleTests.length;
73
+ allTests.push(...ruleTests);
74
+ }
75
+ return {
76
+ success: true,
77
+ tests: allTests,
78
+ summary: {
79
+ total: allTests.length,
80
+ byRule,
81
+ positive: positiveCount,
82
+ negative: negativeCount,
83
+ },
84
+ };
85
+ }
86
+ catch (error) {
87
+ throw new Error(`Failed to generate business rules tests: ${error instanceof Error ? error.message : String(error)}`);
88
+ }
89
+ }
90
+ /**
91
+ * Generates positive test cases (valid data) for a business rule
92
+ *
93
+ * @param rule - Business rule
94
+ * @param endpoint - Related endpoint
95
+ * @param includeOptional - Include optional fields
96
+ * @returns Array of positive test cases
97
+ */
98
+ function generatePositiveTests(rule, endpoint, includeOptional) {
99
+ const tests = [];
100
+ // Generate base valid data
101
+ const baseData = endpoint.requestBody
102
+ ? generateDataFromSchema(endpoint.requestBody, { includeOptional })
103
+ : {};
104
+ // Apply rule-specific valid values
105
+ const validData = applyValidRuleValues(baseData, rule);
106
+ // Create positive test
107
+ tests.push({
108
+ id: `${rule.id}-valid`,
109
+ name: `${rule.description} - debe aceptar (válido)`,
110
+ category: 'business-rule',
111
+ method: endpoint.method,
112
+ path: endpoint.path,
113
+ body: validData,
114
+ expectedStatus: getSuccessStatus(endpoint.method),
115
+ ruleId: rule.id,
116
+ });
117
+ return tests;
118
+ }
119
+ /**
120
+ * Generates negative test cases (invalid data) for a business rule
121
+ *
122
+ * @param rule - Business rule
123
+ * @param endpoint - Related endpoint
124
+ * @param includeOptional - Include optional fields
125
+ * @returns Array of negative test cases
126
+ */
127
+ function generateNegativeTests(rule, endpoint, includeOptional) {
128
+ const tests = [];
129
+ // Generate base valid data
130
+ const baseData = endpoint.requestBody
131
+ ? generateDataFromSchema(endpoint.requestBody, { includeOptional })
132
+ : {};
133
+ // Generate a negative test for each validation
134
+ for (const validation of rule.validations) {
135
+ const invalidData = typeof baseData === 'object' && baseData !== null ? { ...baseData } : {};
136
+ // Apply invalid value based on validation type
137
+ const invalidValue = generateInvalidValue(validation, rule.field);
138
+ if (rule.field && invalidValue !== undefined) {
139
+ invalidData[rule.field] = invalidValue;
140
+ }
141
+ const expectedStatus = validation.errorStatus || 400;
142
+ const expectedMessage = validation.errorMessage || 'Validation failed';
143
+ tests.push({
144
+ id: `${rule.id}-invalid-${validation.type}`,
145
+ name: `${rule.description} - debe rechazar (${validation.type})`,
146
+ category: 'business-rule',
147
+ method: endpoint.method,
148
+ path: endpoint.path,
149
+ body: invalidData,
150
+ expectedStatus,
151
+ ruleId: rule.id,
152
+ expectedErrorMessage: expectedMessage,
153
+ });
154
+ }
155
+ return tests;
156
+ }
157
+ // validValueGenerators, invalidValueGenerators, applyValidRuleValues,
158
+ // generateInvalidValue, generateValidPassword are now in value-generators.ts
159
+ /**
160
+ * Map of HTTP methods to expected success status codes
161
+ */
162
+ const successStatusCodes = {
163
+ POST: 201,
164
+ DELETE: 204,
165
+ PUT: 200,
166
+ PATCH: 200,
167
+ GET: 200,
168
+ };
169
+ /**
170
+ * Gets the expected success status code for an HTTP method
171
+ *
172
+ * @param method - HTTP method
173
+ * @returns Expected success status code
174
+ */
175
+ function getSuccessStatus(method) {
176
+ return successStatusCodes[method.toUpperCase()] || 200;
177
+ }
178
+ /**
179
+ * Generates test cases from a normalized PRD document
180
+ *
181
+ * @param endpoints - Parsed OpenAPI endpoints
182
+ * @param prd - Normalized PRD document
183
+ * @param options - Generation options
184
+ * @returns Array of generated test cases
185
+ *
186
+ * @example
187
+ * ```typescript
188
+ * const tests = generateBusinessRuleTestsFromPrd(endpoints, prd, { seed: 42 });
189
+ * console.log(`Generated ${tests.length} business rule tests from PRD`);
190
+ * ```
191
+ */
192
+ export function generateBusinessRuleTestsFromPrd(endpoints, prd, options = {}) {
193
+ if (options.seed !== undefined) {
194
+ faker.seed(options.seed);
195
+ }
196
+ const tests = [];
197
+ // Create endpoint map for quick lookup
198
+ const endpointMap = new Map();
199
+ for (const endpoint of endpoints) {
200
+ const key = `${endpoint.method.toUpperCase()} ${endpoint.path}`;
201
+ endpointMap.set(key, endpoint);
202
+ // Also add without method for pattern matching
203
+ endpointMap.set(endpoint.path, endpoint);
204
+ }
205
+ // Generate tests for business rules
206
+ for (const rule of prd.businessRules) {
207
+ const ruleTests = generateTestsForPrdRule(rule, endpoints, endpointMap);
208
+ tests.push(...ruleTests);
209
+ }
210
+ // Generate tests for API requirements
211
+ for (const requirement of prd.apiRequirements) {
212
+ if (requirement.endpoint && requirement.method) {
213
+ const key = `${requirement.method.toUpperCase()} ${requirement.endpoint}`;
214
+ const endpoint = endpointMap.get(key);
215
+ if (endpoint) {
216
+ tests.push({
217
+ id: `prd-req-${sanitizeForId(requirement.endpoint)}-${requirement.method}`,
218
+ name: `PRD Requirement: ${truncate(requirement.description, 50)}`,
219
+ description: requirement.description,
220
+ category: 'business-rule',
221
+ method: requirement.method.toUpperCase(),
222
+ path: requirement.endpoint,
223
+ expectedStatus: requirement.expectedStatus || 200,
224
+ validateSchema: true,
225
+ requiresAuth: endpoint.requiresAuth,
226
+ });
227
+ }
228
+ }
229
+ }
230
+ log.info('Generated business rule tests from PRD', { count: tests.length });
231
+ return tests;
232
+ }
233
+ /**
234
+ * Generates tests for a single PRD business rule
235
+ */
236
+ function generateTestsForPrdRule(rule, endpoints, endpointMap) {
237
+ const tests = [];
238
+ // Find related endpoints
239
+ const relatedEndpoints = rule.relatedEndpoints?.flatMap(pattern => {
240
+ // Try exact match first
241
+ const exact = endpointMap.get(pattern);
242
+ if (exact)
243
+ return [exact];
244
+ // Try pattern matching
245
+ return endpoints.filter(ep => ep.path.includes(pattern) || pattern.includes(ep.path));
246
+ }) || [];
247
+ // Remove duplicates
248
+ const uniqueEndpoints = [...new Map(relatedEndpoints.map(ep => [`${ep.method} ${ep.path}`, ep])).values()];
249
+ for (const endpoint of uniqueEndpoints) {
250
+ const ruleId = rule.id || faker.string.alphanumeric(8);
251
+ const pathPart = sanitizeForId(endpoint.path);
252
+ // Positive test - rule should be satisfied
253
+ // AGNOSTIC: Use Content-Type from OpenAPI spec instead of hardcoded application/json
254
+ const positiveHeaders = {};
255
+ if (endpoint.requestContentType) {
256
+ positiveHeaders['Content-Type'] = endpoint.requestContentType;
257
+ }
258
+ tests.push({
259
+ id: `br-${ruleId}-${endpoint.method.toLowerCase()}-${pathPart}`,
260
+ name: `Business Rule: ${rule.name}`,
261
+ description: `Verifies: ${rule.description}. Condition: ${rule.condition}. Expected: ${rule.expectedOutcome}`,
262
+ category: 'business-rule',
263
+ method: endpoint.method,
264
+ path: endpoint.path,
265
+ expectedStatus: determineExpectedStatusFromOutcome(rule.expectedOutcome, endpoint.method),
266
+ headers: Object.keys(positiveHeaders).length > 0 ? positiveHeaders : undefined,
267
+ contentType: endpoint.requestContentType,
268
+ validateSchema: true,
269
+ requiresAuth: endpoint.requiresAuth,
270
+ ruleId: ruleId,
271
+ });
272
+ // Negative test - rule violation
273
+ // AGNOSTIC: Use Content-Type from OpenAPI spec instead of hardcoded application/json
274
+ if (rule.condition && !rule.expectedOutcome.toLowerCase().includes('error')) {
275
+ const negativeHeaders = {};
276
+ if (endpoint.requestContentType) {
277
+ negativeHeaders['Content-Type'] = endpoint.requestContentType;
278
+ }
279
+ tests.push({
280
+ id: `br-${ruleId}-${endpoint.method.toLowerCase()}-${pathPart}-violation`,
281
+ name: `Business Rule Violation: ${rule.name}`,
282
+ description: `Violates: ${rule.description}. Should fail when: ${rule.condition} is not met.`,
283
+ category: 'business-rule',
284
+ method: endpoint.method,
285
+ path: endpoint.path,
286
+ expectedStatus: 400,
287
+ headers: Object.keys(negativeHeaders).length > 0 ? negativeHeaders : undefined,
288
+ contentType: endpoint.requestContentType,
289
+ validateSchema: false,
290
+ requiresAuth: endpoint.requiresAuth,
291
+ ruleId: ruleId,
292
+ });
293
+ }
294
+ }
295
+ return tests;
296
+ }
297
+ /**
298
+ * Determines expected status from rule outcome text
299
+ */
300
+ function determineExpectedStatusFromOutcome(outcome, method) {
301
+ const lower = outcome.toLowerCase();
302
+ if (lower.includes('create') || lower.includes('insert'))
303
+ return 201;
304
+ if (lower.includes('delete') || lower.includes('remove'))
305
+ return 204;
306
+ if (lower.includes('error') || lower.includes('reject') || lower.includes('fail'))
307
+ return 400;
308
+ if (lower.includes('unauthorized') || lower.includes('forbidden'))
309
+ return 403;
310
+ if (lower.includes('not found'))
311
+ return 404;
312
+ // Default based on method
313
+ if (method === 'POST')
314
+ return 201;
315
+ if (method === 'DELETE')
316
+ return 204;
317
+ return 200;
318
+ }
319
+ /**
320
+ * Sanitizes a path for use in test ID
321
+ */
322
+ function sanitizeForId(path) {
323
+ return path.replace(/\//g, '-').replace(/[{}:]/g, '').replace(/^-/, '').replace(/-$/, '').substring(0, 30);
324
+ }
325
+ /**
326
+ * Truncates text to specified length
327
+ */
328
+ function truncate(text, maxLength) {
329
+ return text.length > maxLength ? text.substring(0, maxLength) + '...' : text;
330
+ }
331
+ /**
332
+ * Combines business rule tests with technical tests
333
+ *
334
+ * @param businessTests - Tests from business rules
335
+ * @param technicalTests - Tests from OpenAPI (happy/edge/error)
336
+ * @returns Combined result with totals
337
+ *
338
+ * @example
339
+ * ```typescript
340
+ * const combined = combineTests(businessTests, technicalTests);
341
+ * console.log(`Total: ${combined.summary.combined.total} tests`);
342
+ * console.log(` Technical: ${combined.summary.combined.technical}`);
343
+ * console.log(` Business: ${combined.summary.combined.business}`);
344
+ * ```
345
+ */
346
+ export function combineTests(businessTests, technicalTests) {
347
+ return {
348
+ ...businessTests,
349
+ tests: [...businessTests.tests, ...technicalTests],
350
+ combined: {
351
+ technical: technicalTests.length,
352
+ business: businessTests.summary.total,
353
+ total: businessTests.summary.total + technicalTests.length,
354
+ },
355
+ };
356
+ }
357
+ //# sourceMappingURL=business-rules-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"business-rules-generator.js","sourceRoot":"","sources":["../../src/business-rules/business-rules-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Business Rule Extractors
3
+ *
4
+ * Strategy implementations for extracting specific types of business rules
5
+ * from documentation text. Each extractor handles one rule category.
6
+ *
7
+ * @module business-rules/extractors/rule-extractors
8
+ */
9
+ import type { BusinessRule } from '../../types/index.js';
10
+ /**
11
+ * Patterns for extracting business rules from documentation
12
+ */
13
+ export declare const PATTERNS: {
14
+ endpoint: RegExp;
15
+ ageMinimum: RegExp;
16
+ emailValidation: RegExp;
17
+ uniqueValidation: RegExp;
18
+ passwordLength: RegExp;
19
+ noSpaces: RegExp;
20
+ mustContainUpper: RegExp;
21
+ mustContainNumber: RegExp;
22
+ statusCode: RegExp;
23
+ errorMessage: RegExp;
24
+ fieldName: RegExp;
25
+ };
26
+ /**
27
+ * Extracts endpoint references from content
28
+ */
29
+ export declare function extractEndpointsFromContent(content: string): string[];
30
+ /**
31
+ * Extracts age validation rules
32
+ */
33
+ export declare function extractAgeValidationRules(content: string, source: string, endpoints: string[]): BusinessRule[];
34
+ /**
35
+ * Extracts email validation rules
36
+ */
37
+ export declare function extractEmailValidationRules(content: string, source: string, endpoints: string[]): BusinessRule[];
38
+ /**
39
+ * Extracts password validation rules
40
+ */
41
+ export declare function extractPasswordValidationRules(content: string, source: string, endpoints: string[]): BusinessRule[];
42
+ /**
43
+ * Extracts uniqueness validation rules
44
+ */
45
+ export declare function extractUniquenessRules(content: string, source: string, endpoints: string[]): BusinessRule[];
46
+ /**
47
+ * Extracts pattern validation rules (no spaces, etc.)
48
+ */
49
+ export declare function extractPatternValidationRules(content: string, source: string, endpoints: string[]): BusinessRule[];
50
+ //# sourceMappingURL=rule-extractors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-extractors.d.ts","sourceRoot":"","sources":["../../../src/business-rules/extractors/rule-extractors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAsC,MAAM,sBAAsB,CAAC;AAE7F;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;CAYpB,CAAC;AAEF;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWrE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,GAClB,YAAY,EAAE,CAyBhB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,GAClB,YAAY,EAAE,CAqBhB;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,GAClB,YAAY,EAAE,CA0ChB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,GAClB,YAAY,EAAE,CAyBhB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,GAClB,YAAY,EAAE,CA2BhB"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Business Rule Extractors
3
+ *
4
+ * Strategy implementations for extracting specific types of business rules
5
+ * from documentation text. Each extractor handles one rule category.
6
+ *
7
+ * @module business-rules/extractors/rule-extractors
8
+ */
9
+ /**
10
+ * Patterns for extracting business rules from documentation
11
+ */
12
+ export const PATTERNS = {
13
+ endpoint: /(?:^|\s)(GET|POST|PUT|PATCH|DELETE)\s+(\/[\w\-\/{}]+)/gi,
14
+ ageMinimum: /(?:edad|age).*?(?:>=|mayor|at least|mínimo|minimum).*?(\d+)/i,
15
+ emailValidation: /(?:email|correo).*?(?:válido|valid|debe ser|must be)/i,
16
+ uniqueValidation: /(?:único|unique|no puede existir|must not exist|duplicado|duplicate)/i,
17
+ passwordLength: /(?:password|contraseña).*?(?:mínimo|minimum|at least).*?(\d+)/i,
18
+ noSpaces: /(?:sin espacios|no spaces|without spaces)/i,
19
+ mustContainUpper: /(?:debe contener|must contain|must have).*?(?:mayúscula|uppercase|capital)/i,
20
+ mustContainNumber: /(?:debe contener|must contain|must have).*?(?:número|number|digit)/i,
21
+ statusCode: /(?:retorn|return|error|status).*?(\d{3})/i,
22
+ errorMessage: /"([^"]+)"|'([^']+)'/,
23
+ fieldName: /(?:campo|field|el|the)\s+(?:"([^"]+)"|'([^']+)'|(\w+))/i,
24
+ };
25
+ /**
26
+ * Extracts endpoint references from content
27
+ */
28
+ export function extractEndpointsFromContent(content) {
29
+ const endpoints = [];
30
+ const matches = content.matchAll(PATTERNS.endpoint);
31
+ for (const match of matches) {
32
+ const method = match[1].toUpperCase();
33
+ const pathValue = match[2];
34
+ endpoints.push(`${method} ${pathValue}`);
35
+ }
36
+ return endpoints.length > 0 ? endpoints : ['POST /users'];
37
+ }
38
+ /**
39
+ * Extracts age validation rules
40
+ */
41
+ export function extractAgeValidationRules(content, source, endpoints) {
42
+ const match = content.match(PATTERNS.ageMinimum);
43
+ if (!match)
44
+ return [];
45
+ const minimumAge = parseInt(match[1], 10);
46
+ const statusMatch = content.match(PATTERNS.statusCode);
47
+ const errorStatus = statusMatch ? parseInt(statusMatch[1], 10) : 400;
48
+ return endpoints.map((endpoint) => ({
49
+ id: ``,
50
+ source,
51
+ endpoint,
52
+ method: endpoint.split(' ')[0],
53
+ path: endpoint.split(' ')[1],
54
+ field: 'age',
55
+ description: `Edad mínima ${minimumAge} años`,
56
+ validations: [
57
+ {
58
+ type: 'minimum',
59
+ value: minimumAge,
60
+ errorStatus,
61
+ errorMessage: `Debe ser mayor de edad (${minimumAge}+)`,
62
+ },
63
+ ],
64
+ }));
65
+ }
66
+ /**
67
+ * Extracts email validation rules
68
+ */
69
+ export function extractEmailValidationRules(content, source, endpoints) {
70
+ const hasEmailValidation = PATTERNS.emailValidation.test(content);
71
+ if (!hasEmailValidation)
72
+ return [];
73
+ return endpoints.map((endpoint) => ({
74
+ id: ``,
75
+ source,
76
+ endpoint,
77
+ method: endpoint.split(' ')[0],
78
+ path: endpoint.split(' ')[1],
79
+ field: 'email',
80
+ description: 'Email debe ser válido',
81
+ validations: [
82
+ {
83
+ type: 'format',
84
+ format: 'email',
85
+ errorStatus: 400,
86
+ errorMessage: 'Formato de email inválido',
87
+ },
88
+ ],
89
+ }));
90
+ }
91
+ /**
92
+ * Extracts password validation rules
93
+ */
94
+ export function extractPasswordValidationRules(content, source, endpoints) {
95
+ const lengthMatch = content.match(PATTERNS.passwordLength);
96
+ if (!lengthMatch)
97
+ return [];
98
+ const minLength = parseInt(lengthMatch[1], 10);
99
+ const validations = [
100
+ {
101
+ type: 'minLength',
102
+ value: minLength,
103
+ errorStatus: 400,
104
+ errorMessage: `Password debe tener al menos ${minLength} caracteres`,
105
+ },
106
+ ];
107
+ if (PATTERNS.mustContainUpper.test(content)) {
108
+ validations.push({
109
+ type: 'pattern',
110
+ regex: '(?=.*[A-Z])',
111
+ errorStatus: 400,
112
+ errorMessage: 'Password debe contener al menos una mayúscula',
113
+ });
114
+ }
115
+ if (PATTERNS.mustContainNumber.test(content)) {
116
+ validations.push({
117
+ type: 'pattern',
118
+ regex: '(?=.*[0-9])',
119
+ errorStatus: 400,
120
+ errorMessage: 'Password debe contener al menos un número',
121
+ });
122
+ }
123
+ return endpoints.map((endpoint) => ({
124
+ id: ``,
125
+ source,
126
+ endpoint,
127
+ method: endpoint.split(' ')[0],
128
+ path: endpoint.split(' ')[1],
129
+ field: 'password',
130
+ description: 'Password seguro',
131
+ validations,
132
+ }));
133
+ }
134
+ /**
135
+ * Extracts uniqueness validation rules
136
+ */
137
+ export function extractUniquenessRules(content, source, endpoints) {
138
+ const emailUniquePattern = /email.*?(?:único|unique|duplicado|duplicate)/i;
139
+ if (!emailUniquePattern.test(content))
140
+ return [];
141
+ const errorMessageMatch = content.match(PATTERNS.errorMessage);
142
+ const errorMessage = errorMessageMatch
143
+ ? errorMessageMatch[1] || errorMessageMatch[2]
144
+ : 'Email ya registrado';
145
+ return endpoints.map((endpoint) => ({
146
+ id: ``,
147
+ source,
148
+ endpoint,
149
+ method: endpoint.split(' ')[0],
150
+ path: endpoint.split(' ')[1],
151
+ field: 'email',
152
+ description: 'Email debe ser único',
153
+ validations: [
154
+ {
155
+ type: 'unique',
156
+ errorStatus: 409,
157
+ errorMessage,
158
+ },
159
+ ],
160
+ }));
161
+ }
162
+ /**
163
+ * Extracts pattern validation rules (no spaces, etc.)
164
+ */
165
+ export function extractPatternValidationRules(content, source, endpoints) {
166
+ const rules = [];
167
+ const usernameNoSpaces = /(?:username|usuario).*?(?:sin espacios|no spaces)/i;
168
+ if (usernameNoSpaces.test(content)) {
169
+ rules.push(...endpoints.map((endpoint) => ({
170
+ id: ``,
171
+ source,
172
+ endpoint,
173
+ method: endpoint.split(' ')[0],
174
+ path: endpoint.split(' ')[1],
175
+ field: 'username',
176
+ description: 'Username sin espacios',
177
+ validations: [
178
+ {
179
+ type: 'pattern',
180
+ regex: '^[^\\s]+$',
181
+ errorStatus: 400,
182
+ errorMessage: 'Username no puede contener espacios',
183
+ },
184
+ ],
185
+ })));
186
+ }
187
+ return rules;
188
+ }
189
+ //# sourceMappingURL=rule-extractors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-extractors.js","sourceRoot":"","sources":["../../../src/business-rules/extractors/rule-extractors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,QAAQ,EAAE,yDAAyD;IACnE,UAAU,EAAE,8DAA8D;IAC1E,eAAe,EAAE,uDAAuD;IACxE,gBAAgB,EAAE,uEAAuE;IACzF,cAAc,EAAE,gEAAgE;IAChF,QAAQ,EAAE,4CAA4C;IACtD,gBAAgB,EAAE,6EAA6E;IAC/F,iBAAiB,EAAE,qEAAqE;IACxF,UAAU,EAAE,2CAA2C;IACvD,YAAY,EAAE,qBAAqB;IACnC,SAAS,EAAE,yDAAyD;CACrE,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAAe;IACzD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEpD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAgB,CAAC;QACpD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAe,EACf,MAAc,EACd,SAAmB;IAEnB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAErE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,EAAE,EAAE,EAAE;QACN,MAAM;QACN,QAAQ;QACR,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAe;QAC5C,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5B,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,eAAe,UAAU,OAAO;QAC7C,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,UAAU;gBACjB,WAAW;gBACX,YAAY,EAAE,2BAA2B,UAAU,IAAI;aACxD;SACF;KACF,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAe,EACf,MAAc,EACd,SAAmB;IAEnB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,IAAI,CAAC,kBAAkB;QAAE,OAAO,EAAE,CAAC;IAEnC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,EAAE,EAAE,EAAE;QACN,MAAM;QACN,QAAQ;QACR,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAe;QAC5C,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5B,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,uBAAuB;QACpC,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,OAAO;gBACf,WAAW,EAAE,GAAG;gBAChB,YAAY,EAAE,2BAA2B;aAC1C;SACF;KACF,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAC5C,OAAe,EACf,MAAc,EACd,SAAmB;IAEnB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAE5B,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,WAAW,GAA6B;QAC5C;YACE,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,GAAG;YAChB,YAAY,EAAE,gCAAgC,SAAS,aAAa;SACrE;KACF,CAAC;IAEF,IAAI,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,WAAW,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,GAAG;YAChB,YAAY,EAAE,+CAA+C;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,WAAW,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,GAAG;YAChB,YAAY,EAAE,2CAA2C;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,EAAE,EAAE,EAAE;QACN,MAAM;QACN,QAAQ;QACR,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAe;QAC5C,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5B,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,iBAAiB;QAC9B,WAAW;KACZ,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,MAAc,EACd,SAAmB;IAEnB,MAAM,kBAAkB,GAAG,+CAA+C,CAAC;IAC3E,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjD,MAAM,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,iBAAiB;QACpC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,qBAAqB,CAAC;IAE1B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,EAAE,EAAE,EAAE;QACN,MAAM;QACN,QAAQ;QACR,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAe;QAC5C,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5B,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,sBAAsB;QACnC,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,GAAG;gBAChB,YAAY;aACb;SACF;KACF,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,OAAe,EACf,MAAc,EACd,SAAmB;IAEnB,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,MAAM,gBAAgB,GAAG,oDAAoD,CAAC;IAC9E,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CACR,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC9B,EAAE,EAAE,EAAE;YACN,MAAM;YACN,QAAQ;YACR,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAe;YAC5C,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5B,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,uBAAuB;YACpC,WAAW,EAAE;gBACX;oBACE,IAAI,EAAE,SAAkB;oBACxB,KAAK,EAAE,WAAW;oBAClB,WAAW,EAAE,GAAG;oBAChB,YAAY,EAAE,qCAAqC;iBACpD;aACF;SACF,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}