@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.
- package/.env.example +91 -0
- package/README.md +472 -0
- package/dist/ai-engine/assertion-generator.d.ts +48 -0
- package/dist/ai-engine/assertion-generator.d.ts.map +1 -0
- package/dist/ai-engine/assertion-generator.js +166 -0
- package/dist/ai-engine/assertion-generator.js.map +1 -0
- package/dist/ai-engine/context-data-generator.d.ts +38 -0
- package/dist/ai-engine/context-data-generator.d.ts.map +1 -0
- package/dist/ai-engine/context-data-generator.js +146 -0
- package/dist/ai-engine/context-data-generator.js.map +1 -0
- package/dist/ai-engine/dataflow-detector.d.ts +53 -0
- package/dist/ai-engine/dataflow-detector.d.ts.map +1 -0
- package/dist/ai-engine/dataflow-detector.js +217 -0
- package/dist/ai-engine/dataflow-detector.js.map +1 -0
- package/dist/ai-engine/dependency-detector.d.ts +52 -0
- package/dist/ai-engine/dependency-detector.d.ts.map +1 -0
- package/dist/ai-engine/dependency-detector.js +241 -0
- package/dist/ai-engine/dependency-detector.js.map +1 -0
- package/dist/ai-engine/edge-case-suggester.d.ts +63 -0
- package/dist/ai-engine/edge-case-suggester.d.ts.map +1 -0
- package/dist/ai-engine/edge-case-suggester.js +177 -0
- package/dist/ai-engine/edge-case-suggester.js.map +1 -0
- package/dist/ai-engine/index.d.ts +13 -0
- package/dist/ai-engine/index.d.ts.map +1 -0
- package/dist/ai-engine/index.js +13 -0
- package/dist/ai-engine/index.js.map +1 -0
- package/dist/analyzers/ai-failure-analyzer.d.ts +41 -0
- package/dist/analyzers/ai-failure-analyzer.d.ts.map +1 -0
- package/dist/analyzers/ai-failure-analyzer.js +220 -0
- package/dist/analyzers/ai-failure-analyzer.js.map +1 -0
- package/dist/analyzers/comparison-utils.d.ts +31 -0
- package/dist/analyzers/comparison-utils.d.ts.map +1 -0
- package/dist/analyzers/comparison-utils.js +85 -0
- package/dist/analyzers/comparison-utils.js.map +1 -0
- package/dist/analyzers/context-analyzer.d.ts +49 -0
- package/dist/analyzers/context-analyzer.d.ts.map +1 -0
- package/dist/analyzers/context-analyzer.js +292 -0
- package/dist/analyzers/context-analyzer.js.map +1 -0
- package/dist/analyzers/dependency-analyzer.d.ts +44 -0
- package/dist/analyzers/dependency-analyzer.d.ts.map +1 -0
- package/dist/analyzers/dependency-analyzer.js +313 -0
- package/dist/analyzers/dependency-analyzer.js.map +1 -0
- package/dist/analyzers/failure-analyzer.d.ts +122 -0
- package/dist/analyzers/failure-analyzer.d.ts.map +1 -0
- package/dist/analyzers/failure-analyzer.js +140 -0
- package/dist/analyzers/failure-analyzer.js.map +1 -0
- package/dist/analyzers/failure-detectors/index.d.ts +33 -0
- package/dist/analyzers/failure-detectors/index.d.ts.map +1 -0
- package/dist/analyzers/failure-detectors/index.js +164 -0
- package/dist/analyzers/failure-detectors/index.js.map +1 -0
- package/dist/analyzers/failure-discrepancy-correlator.d.ts +111 -0
- package/dist/analyzers/failure-discrepancy-correlator.d.ts.map +1 -0
- package/dist/analyzers/failure-discrepancy-correlator.js +202 -0
- package/dist/analyzers/failure-discrepancy-correlator.js.map +1 -0
- package/dist/analyzers/index.d.ts +10 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +10 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/semantic-matcher.d.ts +123 -0
- package/dist/analyzers/semantic-matcher.d.ts.map +1 -0
- package/dist/analyzers/semantic-matcher.js +297 -0
- package/dist/analyzers/semantic-matcher.js.map +1 -0
- package/dist/analyzers/source-comparator.d.ts +177 -0
- package/dist/analyzers/source-comparator.d.ts.map +1 -0
- package/dist/analyzers/source-comparator.js +225 -0
- package/dist/analyzers/source-comparator.js.map +1 -0
- package/dist/business-rules/business-rules-analyzer.d.ts +44 -0
- package/dist/business-rules/business-rules-analyzer.d.ts.map +1 -0
- package/dist/business-rules/business-rules-analyzer.js +363 -0
- package/dist/business-rules/business-rules-analyzer.js.map +1 -0
- package/dist/business-rules/business-rules-generator.d.ts +78 -0
- package/dist/business-rules/business-rules-generator.d.ts.map +1 -0
- package/dist/business-rules/business-rules-generator.js +357 -0
- package/dist/business-rules/business-rules-generator.js.map +1 -0
- package/dist/business-rules/extractors/rule-extractors.d.ts +50 -0
- package/dist/business-rules/extractors/rule-extractors.d.ts.map +1 -0
- package/dist/business-rules/extractors/rule-extractors.js +189 -0
- package/dist/business-rules/extractors/rule-extractors.js.map +1 -0
- package/dist/business-rules/value-generators.d.ts +70 -0
- package/dist/business-rules/value-generators.d.ts.map +1 -0
- package/dist/business-rules/value-generators.js +142 -0
- package/dist/business-rules/value-generators.js.map +1 -0
- package/dist/executor/auth-providers/auth-header-builder.d.ts +16 -0
- package/dist/executor/auth-providers/auth-header-builder.d.ts.map +1 -0
- package/dist/executor/auth-providers/auth-header-builder.js +47 -0
- package/dist/executor/auth-providers/auth-header-builder.js.map +1 -0
- package/dist/executor/auth-providers/oauth2-provider.d.ts +19 -0
- package/dist/executor/auth-providers/oauth2-provider.d.ts.map +1 -0
- package/dist/executor/auth-providers/oauth2-provider.js +114 -0
- package/dist/executor/auth-providers/oauth2-provider.js.map +1 -0
- package/dist/executor/http-client.d.ts +133 -0
- package/dist/executor/http-client.d.ts.map +1 -0
- package/dist/executor/http-client.js +172 -0
- package/dist/executor/http-client.js.map +1 -0
- package/dist/executor/http-request-builder.d.ts +69 -0
- package/dist/executor/http-request-builder.d.ts.map +1 -0
- package/dist/executor/http-request-builder.js +140 -0
- package/dist/executor/http-request-builder.js.map +1 -0
- package/dist/executor/http-response-parser.d.ts +28 -0
- package/dist/executor/http-response-parser.d.ts.map +1 -0
- package/dist/executor/http-response-parser.js +74 -0
- package/dist/executor/http-response-parser.js.map +1 -0
- package/dist/executor/response-handler.d.ts +66 -0
- package/dist/executor/response-handler.d.ts.map +1 -0
- package/dist/executor/response-handler.js +135 -0
- package/dist/executor/response-handler.js.map +1 -0
- package/dist/executor/result-processor.d.ts +27 -0
- package/dist/executor/result-processor.d.ts.map +1 -0
- package/dist/executor/result-processor.js +140 -0
- package/dist/executor/result-processor.js.map +1 -0
- package/dist/executor/result-utils.d.ts +21 -0
- package/dist/executor/result-utils.d.ts.map +1 -0
- package/dist/executor/result-utils.js +29 -0
- package/dist/executor/result-utils.js.map +1 -0
- package/dist/executor/test-executor.d.ts +49 -0
- package/dist/executor/test-executor.d.ts.map +1 -0
- package/dist/executor/test-executor.js +226 -0
- package/dist/executor/test-executor.js.map +1 -0
- package/dist/executor/test-runner.d.ts +85 -0
- package/dist/executor/test-runner.d.ts.map +1 -0
- package/dist/executor/test-runner.js +177 -0
- package/dist/executor/test-runner.js.map +1 -0
- package/dist/executor/token-detector/index.d.ts +7 -0
- package/dist/executor/token-detector/index.d.ts.map +1 -0
- package/dist/executor/token-detector/index.js +7 -0
- package/dist/executor/token-detector/index.js.map +1 -0
- package/dist/executor/token-detector/token-detector.d.ts +64 -0
- package/dist/executor/token-detector/token-detector.d.ts.map +1 -0
- package/dist/executor/token-detector/token-detector.js +140 -0
- package/dist/executor/token-detector/token-detector.js.map +1 -0
- package/dist/generators/business-rule-from-stories-generator.d.ts +30 -0
- package/dist/generators/business-rule-from-stories-generator.d.ts.map +1 -0
- package/dist/generators/business-rule-from-stories-generator.js +227 -0
- package/dist/generators/business-rule-from-stories-generator.js.map +1 -0
- package/dist/generators/data/ai-data-generator.d.ts +23 -0
- package/dist/generators/data/ai-data-generator.d.ts.map +1 -0
- package/dist/generators/data/ai-data-generator.js +41 -0
- package/dist/generators/data/ai-data-generator.js.map +1 -0
- package/dist/generators/data/base-generator.d.ts +121 -0
- package/dist/generators/data/base-generator.d.ts.map +1 -0
- package/dist/generators/data/base-generator.js +200 -0
- package/dist/generators/data/base-generator.js.map +1 -0
- package/dist/generators/data/heuristic-data-generator.d.ts +28 -0
- package/dist/generators/data/heuristic-data-generator.d.ts.map +1 -0
- package/dist/generators/data/heuristic-data-generator.js +49 -0
- package/dist/generators/data/heuristic-data-generator.js.map +1 -0
- package/dist/generators/data/index.d.ts +48 -0
- package/dist/generators/data/index.d.ts.map +1 -0
- package/dist/generators/data/index.js +201 -0
- package/dist/generators/data/index.js.map +1 -0
- package/dist/generators/data/schema-walker.d.ts +45 -0
- package/dist/generators/data/schema-walker.d.ts.map +1 -0
- package/dist/generators/data/schema-walker.js +103 -0
- package/dist/generators/data/schema-walker.js.map +1 -0
- package/dist/generators/data/type-strategies.d.ts +79 -0
- package/dist/generators/data/type-strategies.d.ts.map +1 -0
- package/dist/generators/data/type-strategies.js +394 -0
- package/dist/generators/data/type-strategies.js.map +1 -0
- package/dist/generators/data-generator.d.ts +11 -0
- package/dist/generators/data-generator.d.ts.map +1 -0
- package/dist/generators/data-generator.js +11 -0
- package/dist/generators/data-generator.js.map +1 -0
- package/dist/generators/edge-case-generator.d.ts +55 -0
- package/dist/generators/edge-case-generator.d.ts.map +1 -0
- package/dist/generators/edge-case-generator.js +327 -0
- package/dist/generators/edge-case-generator.js.map +1 -0
- package/dist/generators/edge-cases/boundary-analyzer.d.ts +26 -0
- package/dist/generators/edge-cases/boundary-analyzer.d.ts.map +1 -0
- package/dist/generators/edge-cases/boundary-analyzer.js +95 -0
- package/dist/generators/edge-cases/boundary-analyzer.js.map +1 -0
- package/dist/generators/error-case-generator.d.ts +11 -0
- package/dist/generators/error-case-generator.d.ts.map +1 -0
- package/dist/generators/error-case-generator.js +11 -0
- package/dist/generators/error-case-generator.js.map +1 -0
- package/dist/generators/errors/auth-error-strategy.d.ts +36 -0
- package/dist/generators/errors/auth-error-strategy.d.ts.map +1 -0
- package/dist/generators/errors/auth-error-strategy.js +118 -0
- package/dist/generators/errors/auth-error-strategy.js.map +1 -0
- package/dist/generators/errors/business-error-strategy.d.ts +44 -0
- package/dist/generators/errors/business-error-strategy.d.ts.map +1 -0
- package/dist/generators/errors/business-error-strategy.js +152 -0
- package/dist/generators/errors/business-error-strategy.js.map +1 -0
- package/dist/generators/errors/error-strategy-factory.d.ts +27 -0
- package/dist/generators/errors/error-strategy-factory.d.ts.map +1 -0
- package/dist/generators/errors/error-strategy-factory.js +47 -0
- package/dist/generators/errors/error-strategy-factory.js.map +1 -0
- package/dist/generators/errors/error-strategy.d.ts +62 -0
- package/dist/generators/errors/error-strategy.d.ts.map +1 -0
- package/dist/generators/errors/error-strategy.js +69 -0
- package/dist/generators/errors/error-strategy.js.map +1 -0
- package/dist/generators/errors/index.d.ts +23 -0
- package/dist/generators/errors/index.d.ts.map +1 -0
- package/dist/generators/errors/index.js +73 -0
- package/dist/generators/errors/index.js.map +1 -0
- package/dist/generators/errors/validation-error-strategy.d.ts +25 -0
- package/dist/generators/errors/validation-error-strategy.d.ts.map +1 -0
- package/dist/generators/errors/validation-error-strategy.js +214 -0
- package/dist/generators/errors/validation-error-strategy.js.map +1 -0
- package/dist/generators/happy-path-generator.d.ts +93 -0
- package/dist/generators/happy-path-generator.d.ts.map +1 -0
- package/dist/generators/happy-path-generator.js +275 -0
- package/dist/generators/happy-path-generator.js.map +1 -0
- package/dist/generators/test-enricher.d.ts +44 -0
- package/dist/generators/test-enricher.d.ts.map +1 -0
- package/dist/generators/test-enricher.js +109 -0
- package/dist/generators/test-enricher.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/ai-cache.d.ts +123 -0
- package/dist/llm/ai-cache.d.ts.map +1 -0
- package/dist/llm/ai-cache.js +220 -0
- package/dist/llm/ai-cache.js.map +1 -0
- package/dist/llm/ai-client.d.ts +92 -0
- package/dist/llm/ai-client.d.ts.map +1 -0
- package/dist/llm/ai-client.js +386 -0
- package/dist/llm/ai-client.js.map +1 -0
- package/dist/llm/data-generator-ai.d.ts +84 -0
- package/dist/llm/data-generator-ai.d.ts.map +1 -0
- package/dist/llm/data-generator-ai.js +284 -0
- package/dist/llm/data-generator-ai.js.map +1 -0
- package/dist/llm/index.d.ts +7 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +7 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/mcp/handlers/base-handler.d.ts +72 -0
- package/dist/mcp/handlers/base-handler.d.ts.map +1 -0
- package/dist/mcp/handlers/base-handler.js +86 -0
- package/dist/mcp/handlers/base-handler.js.map +1 -0
- package/dist/mcp/handlers/compare-sources.d.ts +91 -0
- package/dist/mcp/handlers/compare-sources.d.ts.map +1 -0
- package/dist/mcp/handlers/compare-sources.js +182 -0
- package/dist/mcp/handlers/compare-sources.js.map +1 -0
- package/dist/mcp/handlers/export-results.d.ts +53 -0
- package/dist/mcp/handlers/export-results.d.ts.map +1 -0
- package/dist/mcp/handlers/export-results.js +132 -0
- package/dist/mcp/handlers/export-results.js.map +1 -0
- package/dist/mcp/handlers/export-to-postman.d.ts +65 -0
- package/dist/mcp/handlers/export-to-postman.d.ts.map +1 -0
- package/dist/mcp/handlers/export-to-postman.js +128 -0
- package/dist/mcp/handlers/export-to-postman.js.map +1 -0
- package/dist/mcp/handlers/generate-tests.d.ts +74 -0
- package/dist/mcp/handlers/generate-tests.d.ts.map +1 -0
- package/dist/mcp/handlers/generate-tests.js +519 -0
- package/dist/mcp/handlers/generate-tests.js.map +1 -0
- package/dist/mcp/handlers/index.d.ts +13 -0
- package/dist/mcp/handlers/index.d.ts.map +1 -0
- package/dist/mcp/handlers/index.js +12 -0
- package/dist/mcp/handlers/index.js.map +1 -0
- package/dist/mcp/handlers/run-tests.d.ts +89 -0
- package/dist/mcp/handlers/run-tests.d.ts.map +1 -0
- package/dist/mcp/handlers/run-tests.js +233 -0
- package/dist/mcp/handlers/run-tests.js.map +1 -0
- package/dist/mcp/handlers/types.d.ts +61 -0
- package/dist/mcp/handlers/types.d.ts.map +1 -0
- package/dist/mcp/handlers/types.js +9 -0
- package/dist/mcp/handlers/types.js.map +1 -0
- package/dist/mcp/server.d.ts +64 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +200 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/services/file-service.d.ts +66 -0
- package/dist/mcp/services/file-service.d.ts.map +1 -0
- package/dist/mcp/services/file-service.js +143 -0
- package/dist/mcp/services/file-service.js.map +1 -0
- package/dist/mcp/services/llm-service.d.ts +70 -0
- package/dist/mcp/services/llm-service.d.ts.map +1 -0
- package/dist/mcp/services/llm-service.js +189 -0
- package/dist/mcp/services/llm-service.js.map +1 -0
- package/dist/mcp/services/postman-service.d.ts +128 -0
- package/dist/mcp/services/postman-service.d.ts.map +1 -0
- package/dist/mcp/services/postman-service.js +266 -0
- package/dist/mcp/services/postman-service.js.map +1 -0
- package/dist/mcp/services/report-service.d.ts +81 -0
- package/dist/mcp/services/report-service.d.ts.map +1 -0
- package/dist/mcp/services/report-service.js +210 -0
- package/dist/mcp/services/report-service.js.map +1 -0
- package/dist/mcp/services/spec-service.d.ts +58 -0
- package/dist/mcp/services/spec-service.d.ts.map +1 -0
- package/dist/mcp/services/spec-service.js +140 -0
- package/dist/mcp/services/spec-service.js.map +1 -0
- package/dist/parsers/endpoint-extractor.d.ts +32 -0
- package/dist/parsers/endpoint-extractor.d.ts.map +1 -0
- package/dist/parsers/endpoint-extractor.js +160 -0
- package/dist/parsers/endpoint-extractor.js.map +1 -0
- package/dist/parsers/openapi-parser.d.ts +120 -0
- package/dist/parsers/openapi-parser.d.ts.map +1 -0
- package/dist/parsers/openapi-parser.js +257 -0
- package/dist/parsers/openapi-parser.js.map +1 -0
- package/dist/parsers/visitors/auth-visitor.d.ts +28 -0
- package/dist/parsers/visitors/auth-visitor.d.ts.map +1 -0
- package/dist/parsers/visitors/auth-visitor.js +116 -0
- package/dist/parsers/visitors/auth-visitor.js.map +1 -0
- package/dist/prd/index.d.ts +10 -0
- package/dist/prd/index.d.ts.map +1 -0
- package/dist/prd/index.js +10 -0
- package/dist/prd/index.js.map +1 -0
- package/dist/prd/prd-reader.d.ts +124 -0
- package/dist/prd/prd-reader.d.ts.map +1 -0
- package/dist/prd/prd-reader.js +308 -0
- package/dist/prd/prd-reader.js.map +1 -0
- package/dist/prd/prd-storage.d.ts +232 -0
- package/dist/prd/prd-storage.d.ts.map +1 -0
- package/dist/prd/prd-storage.js +129 -0
- package/dist/prd/prd-storage.js.map +1 -0
- package/dist/repairers/test-auto-repairer.d.ts +61 -0
- package/dist/repairers/test-auto-repairer.d.ts.map +1 -0
- package/dist/repairers/test-auto-repairer.js +213 -0
- package/dist/repairers/test-auto-repairer.js.map +1 -0
- package/dist/reporters/comparison-report-generator.d.ts +58 -0
- package/dist/reporters/comparison-report-generator.d.ts.map +1 -0
- package/dist/reporters/comparison-report-generator.js +369 -0
- package/dist/reporters/comparison-report-generator.js.map +1 -0
- package/dist/reporters/gherkin-formatter.d.ts +34 -0
- package/dist/reporters/gherkin-formatter.d.ts.map +1 -0
- package/dist/reporters/gherkin-formatter.js +231 -0
- package/dist/reporters/gherkin-formatter.js.map +1 -0
- package/dist/reporters/html-report-generator.d.ts +174 -0
- package/dist/reporters/html-report-generator.d.ts.map +1 -0
- package/dist/reporters/html-report-generator.js +194 -0
- package/dist/reporters/html-report-generator.js.map +1 -0
- package/dist/reporters/report-charts.d.ts +23 -0
- package/dist/reporters/report-charts.d.ts.map +1 -0
- package/dist/reporters/report-charts.js +182 -0
- package/dist/reporters/report-charts.js.map +1 -0
- package/dist/reporters/report-sections.d.ts +34 -0
- package/dist/reporters/report-sections.d.ts.map +1 -0
- package/dist/reporters/report-sections.js +481 -0
- package/dist/reporters/report-sections.js.map +1 -0
- package/dist/reporters/report-styles.d.ts +12 -0
- package/dist/reporters/report-styles.d.ts.map +1 -0
- package/dist/reporters/report-styles.js +412 -0
- package/dist/reporters/report-styles.js.map +1 -0
- package/dist/reporters/report-test-details.d.ts +56 -0
- package/dist/reporters/report-test-details.d.ts.map +1 -0
- package/dist/reporters/report-test-details.js +328 -0
- package/dist/reporters/report-test-details.js.map +1 -0
- package/dist/reporters/report-utils.d.ts +40 -0
- package/dist/reporters/report-utils.d.ts.map +1 -0
- package/dist/reporters/report-utils.js +163 -0
- package/dist/reporters/report-utils.js.map +1 -0
- package/dist/types/ai-config.d.ts +63 -0
- package/dist/types/ai-config.d.ts.map +1 -0
- package/dist/types/ai-config.js +79 -0
- package/dist/types/ai-config.js.map +1 -0
- package/dist/types/business-rules.d.ts +235 -0
- package/dist/types/business-rules.d.ts.map +1 -0
- package/dist/types/business-rules.js +6 -0
- package/dist/types/business-rules.js.map +1 -0
- package/dist/types/config.d.ts +106 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/core.d.ts +72 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +6 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/openapi.d.ts +139 -0
- package/dist/types/openapi.d.ts.map +1 -0
- package/dist/types/openapi.js +6 -0
- package/dist/types/openapi.js.map +1 -0
- package/dist/types/pact.d.ts +101 -0
- package/dist/types/pact.d.ts.map +1 -0
- package/dist/types/pact.js +6 -0
- package/dist/types/pact.js.map +1 -0
- package/dist/types/reporting.d.ts +93 -0
- package/dist/types/reporting.d.ts.map +1 -0
- package/dist/types/reporting.js +6 -0
- package/dist/types/reporting.js.map +1 -0
- package/dist/types/test-case.d.ts +233 -0
- package/dist/types/test-case.d.ts.map +1 -0
- package/dist/types/test-case.js +6 -0
- package/dist/types/test-case.js.map +1 -0
- package/dist/types/test-execution.d.ts +80 -0
- package/dist/types/test-execution.d.ts.map +1 -0
- package/dist/types/test-execution.js +6 -0
- package/dist/types/test-execution.js.map +1 -0
- package/dist/utils/auth-generator.d.ts +30 -0
- package/dist/utils/auth-generator.d.ts.map +1 -0
- package/dist/utils/auth-generator.js +68 -0
- package/dist/utils/auth-generator.js.map +1 -0
- package/dist/utils/config.d.ts +181 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +141 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/coverage-calculator.d.ts +81 -0
- package/dist/utils/coverage-calculator.d.ts.map +1 -0
- package/dist/utils/coverage-calculator.js +134 -0
- package/dist/utils/coverage-calculator.js.map +1 -0
- package/dist/utils/data-loader.d.ts +52 -0
- package/dist/utils/data-loader.d.ts.map +1 -0
- package/dist/utils/data-loader.js +192 -0
- package/dist/utils/data-loader.js.map +1 -0
- package/dist/utils/errors.d.ts +167 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +257 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +220 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +325 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/openapi-discovery.d.ts +31 -0
- package/dist/utils/openapi-discovery.d.ts.map +1 -0
- package/dist/utils/openapi-discovery.js +322 -0
- package/dist/utils/openapi-discovery.js.map +1 -0
- package/dist/utils/path-resolver.d.ts +101 -0
- package/dist/utils/path-resolver.d.ts.map +1 -0
- package/dist/utils/path-resolver.js +167 -0
- package/dist/utils/path-resolver.js.map +1 -0
- package/dist/utils/resilience.d.ts +181 -0
- package/dist/utils/resilience.d.ts.map +1 -0
- package/dist/utils/resilience.js +269 -0
- package/dist/utils/resilience.js.map +1 -0
- package/dist/validators/openapi-validator.d.ts +198 -0
- package/dist/validators/openapi-validator.d.ts.map +1 -0
- package/dist/validators/openapi-validator.js +349 -0
- package/dist/validators/openapi-validator.js.map +1 -0
- package/dist/validators/response-matcher.d.ts +84 -0
- package/dist/validators/response-matcher.d.ts.map +1 -0
- package/dist/validators/response-matcher.js +234 -0
- package/dist/validators/response-matcher.js.map +1 -0
- package/dist/validators/schema-validator.d.ts +174 -0
- package/dist/validators/schema-validator.d.ts.map +1 -0
- package/dist/validators/schema-validator.js +340 -0
- package/dist/validators/schema-validator.js.map +1 -0
- 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":"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"}
|