@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,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resilience Utilities - Retry Logic and Circuit Breaker
|
|
3
|
+
*
|
|
4
|
+
* Provides retry mechanisms and circuit breaker pattern for handling
|
|
5
|
+
* transient failures gracefully.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/resilience
|
|
8
|
+
*/
|
|
9
|
+
import { createLogger } from './logger.js';
|
|
10
|
+
import { isRetryableError } from './errors.js';
|
|
11
|
+
const log = createLogger('resilience');
|
|
12
|
+
/**
|
|
13
|
+
* Executes a function with retry logic and exponential backoff
|
|
14
|
+
*
|
|
15
|
+
* @param fn - Async function to execute
|
|
16
|
+
* @param options - Retry configuration
|
|
17
|
+
* @returns Result of the function
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const result = await withRetry(
|
|
22
|
+
* async () => fetch('https://api.example.com/data'),
|
|
23
|
+
* {
|
|
24
|
+
* maxRetries: 3,
|
|
25
|
+
* initialDelay: 1000,
|
|
26
|
+
* onRetry: (attempt, error, delay) => {
|
|
27
|
+
* console.log(`Retry attempt ${attempt} after ${delay}ms`);
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* );
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export async function withRetry(fn, options = {}) {
|
|
34
|
+
const { maxRetries = 3, initialDelay = 1000, maxDelay = 10000, backoffMultiplier = 2, shouldRetry = isRetryableError, onRetry, } = options;
|
|
35
|
+
let lastError;
|
|
36
|
+
let delay = initialDelay;
|
|
37
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
38
|
+
try {
|
|
39
|
+
return await fn();
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
lastError = error;
|
|
43
|
+
// Check if we should retry
|
|
44
|
+
if (attempt === maxRetries || !shouldRetry(error)) {
|
|
45
|
+
log.debug('Max retries reached or error not retryable', {
|
|
46
|
+
attempt,
|
|
47
|
+
maxRetries,
|
|
48
|
+
retryable: shouldRetry(error),
|
|
49
|
+
});
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
// Calculate delay with exponential backoff
|
|
53
|
+
const currentDelay = Math.min(delay, maxDelay);
|
|
54
|
+
delay *= backoffMultiplier;
|
|
55
|
+
log.warn('Retrying operation', {
|
|
56
|
+
attempt: attempt + 1,
|
|
57
|
+
maxRetries,
|
|
58
|
+
delay: currentDelay,
|
|
59
|
+
error: error instanceof Error ? error.message : String(error),
|
|
60
|
+
});
|
|
61
|
+
// Call retry callback if provided
|
|
62
|
+
if (onRetry) {
|
|
63
|
+
onRetry(attempt + 1, error, currentDelay);
|
|
64
|
+
}
|
|
65
|
+
// Wait before retrying
|
|
66
|
+
await sleep(currentDelay);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// This should never be reached, but TypeScript needs it
|
|
70
|
+
throw lastError;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Circuit breaker states
|
|
74
|
+
*/
|
|
75
|
+
export var CircuitState;
|
|
76
|
+
(function (CircuitState) {
|
|
77
|
+
CircuitState["CLOSED"] = "CLOSED";
|
|
78
|
+
CircuitState["OPEN"] = "OPEN";
|
|
79
|
+
CircuitState["HALF_OPEN"] = "HALF_OPEN";
|
|
80
|
+
})(CircuitState || (CircuitState = {}));
|
|
81
|
+
/**
|
|
82
|
+
* Circuit Breaker pattern implementation
|
|
83
|
+
*
|
|
84
|
+
* Prevents cascading failures by failing fast when a service is down
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* const breaker = new CircuitBreaker({
|
|
89
|
+
* failureThreshold: 5,
|
|
90
|
+
* resetTimeout: 60000,
|
|
91
|
+
* });
|
|
92
|
+
*
|
|
93
|
+
* try {
|
|
94
|
+
* const result = await breaker.execute(async () => {
|
|
95
|
+
* return await fetch('https://api.example.com/data');
|
|
96
|
+
* });
|
|
97
|
+
* } catch (error) {
|
|
98
|
+
* console.error('Request failed or circuit is open');
|
|
99
|
+
* }
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export class CircuitBreaker {
|
|
103
|
+
state = CircuitState.CLOSED;
|
|
104
|
+
failureCount = 0;
|
|
105
|
+
successCount = 0;
|
|
106
|
+
nextAttemptTime = 0;
|
|
107
|
+
options;
|
|
108
|
+
constructor(options = {}) {
|
|
109
|
+
this.options = {
|
|
110
|
+
failureThreshold: options.failureThreshold ?? 5,
|
|
111
|
+
resetTimeout: options.resetTimeout ?? 60000,
|
|
112
|
+
successThreshold: options.successThreshold ?? 2,
|
|
113
|
+
onStateChange: options.onStateChange ?? (() => { }),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Executes a function with circuit breaker protection
|
|
118
|
+
*
|
|
119
|
+
* @param fn - Async function to execute
|
|
120
|
+
* @returns Result of the function
|
|
121
|
+
* @throws Error if circuit is OPEN
|
|
122
|
+
*/
|
|
123
|
+
async execute(fn) {
|
|
124
|
+
if (this.state === CircuitState.OPEN) {
|
|
125
|
+
if (Date.now() < this.nextAttemptTime) {
|
|
126
|
+
const error = new Error('Circuit breaker is OPEN');
|
|
127
|
+
log.warn('Circuit breaker rejected request', {
|
|
128
|
+
state: this.state,
|
|
129
|
+
nextAttemptTime: new Date(this.nextAttemptTime).toISOString(),
|
|
130
|
+
});
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
// Transition to HALF_OPEN to test if service recovered
|
|
134
|
+
this.transitionTo(CircuitState.HALF_OPEN);
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
const result = await fn();
|
|
138
|
+
this.onSuccess();
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
this.onFailure();
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Called when operation succeeds
|
|
148
|
+
* @internal
|
|
149
|
+
*/
|
|
150
|
+
onSuccess() {
|
|
151
|
+
if (this.state === CircuitState.HALF_OPEN) {
|
|
152
|
+
this.successCount++;
|
|
153
|
+
log.debug('Circuit breaker success in HALF_OPEN', {
|
|
154
|
+
successCount: this.successCount,
|
|
155
|
+
threshold: this.options.successThreshold,
|
|
156
|
+
});
|
|
157
|
+
if (this.successCount >= this.options.successThreshold) {
|
|
158
|
+
this.transitionTo(CircuitState.CLOSED);
|
|
159
|
+
this.successCount = 0;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else if (this.state === CircuitState.CLOSED) {
|
|
163
|
+
// Reset failure count on success
|
|
164
|
+
this.failureCount = 0;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Called when operation fails
|
|
169
|
+
* @internal
|
|
170
|
+
*/
|
|
171
|
+
onFailure() {
|
|
172
|
+
this.failureCount++;
|
|
173
|
+
log.debug('Circuit breaker failure', {
|
|
174
|
+
state: this.state,
|
|
175
|
+
failureCount: this.failureCount,
|
|
176
|
+
threshold: this.options.failureThreshold,
|
|
177
|
+
});
|
|
178
|
+
if (this.state === CircuitState.HALF_OPEN) {
|
|
179
|
+
// Single failure in HALF_OPEN reopens circuit
|
|
180
|
+
this.transitionTo(CircuitState.OPEN);
|
|
181
|
+
this.successCount = 0;
|
|
182
|
+
}
|
|
183
|
+
else if (this.failureCount >= this.options.failureThreshold) {
|
|
184
|
+
this.transitionTo(CircuitState.OPEN);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Transitions circuit to a new state
|
|
189
|
+
* @internal
|
|
190
|
+
*/
|
|
191
|
+
transitionTo(newState) {
|
|
192
|
+
const oldState = this.state;
|
|
193
|
+
this.state = newState;
|
|
194
|
+
if (newState === CircuitState.OPEN) {
|
|
195
|
+
this.nextAttemptTime = Date.now() + this.options.resetTimeout;
|
|
196
|
+
log.warn('Circuit breaker OPENED', {
|
|
197
|
+
failureCount: this.failureCount,
|
|
198
|
+
resetTimeout: this.options.resetTimeout,
|
|
199
|
+
nextAttemptTime: new Date(this.nextAttemptTime).toISOString(),
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
else if (newState === CircuitState.CLOSED) {
|
|
203
|
+
this.failureCount = 0;
|
|
204
|
+
log.info('Circuit breaker CLOSED', { previousState: oldState });
|
|
205
|
+
}
|
|
206
|
+
else if (newState === CircuitState.HALF_OPEN) {
|
|
207
|
+
log.info('Circuit breaker HALF_OPEN (testing recovery)');
|
|
208
|
+
}
|
|
209
|
+
this.options.onStateChange(oldState, newState);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Gets current circuit state
|
|
213
|
+
*/
|
|
214
|
+
getState() {
|
|
215
|
+
return this.state;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Gets current failure count
|
|
219
|
+
*/
|
|
220
|
+
getFailureCount() {
|
|
221
|
+
return this.failureCount;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Manually resets the circuit breaker
|
|
225
|
+
*/
|
|
226
|
+
reset() {
|
|
227
|
+
log.info('Circuit breaker manually reset');
|
|
228
|
+
this.transitionTo(CircuitState.CLOSED);
|
|
229
|
+
this.failureCount = 0;
|
|
230
|
+
this.successCount = 0;
|
|
231
|
+
this.nextAttemptTime = 0;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Helper function to sleep for a given duration
|
|
236
|
+
*
|
|
237
|
+
* @param ms - Milliseconds to sleep
|
|
238
|
+
*/
|
|
239
|
+
function sleep(ms) {
|
|
240
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Creates a resilient version of a function with both retry and circuit breaker
|
|
244
|
+
*
|
|
245
|
+
* @param fn - Function to make resilient
|
|
246
|
+
* @param retryOptions - Retry configuration
|
|
247
|
+
* @param circuitBreakerOptions - Circuit breaker configuration
|
|
248
|
+
* @returns Wrapped function
|
|
249
|
+
*
|
|
250
|
+
* @example
|
|
251
|
+
* ```typescript
|
|
252
|
+
* const resilientFetch = makeResilient(
|
|
253
|
+
* async (url: string) => fetch(url),
|
|
254
|
+
* { maxRetries: 3 },
|
|
255
|
+
* { failureThreshold: 5 }
|
|
256
|
+
* );
|
|
257
|
+
*
|
|
258
|
+
* const data = await resilientFetch('https://api.example.com/data');
|
|
259
|
+
* ```
|
|
260
|
+
*/
|
|
261
|
+
export function makeResilient(fn, retryOptions, circuitBreakerOptions) {
|
|
262
|
+
const breaker = new CircuitBreaker(circuitBreakerOptions);
|
|
263
|
+
return (async (...args) => {
|
|
264
|
+
return await breaker.execute(async () => {
|
|
265
|
+
return await withRetry(() => fn(...args), retryOptions);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=resilience.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resilience.js","sourceRoot":"","sources":["../../src/utils/resilience.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI Response Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates API responses against OpenAPI specifications.
|
|
5
|
+
* Checks status codes, headers, content types, and response bodies.
|
|
6
|
+
*
|
|
7
|
+
* @module validators/openapi-validator
|
|
8
|
+
*/
|
|
9
|
+
import type { TestResult, ParsedEndpoint, ValidationResult } from '../types/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validates an API response against OpenAPI specification
|
|
12
|
+
*
|
|
13
|
+
* Checks:
|
|
14
|
+
* - Status code matches expected
|
|
15
|
+
* - Content-Type header is correct
|
|
16
|
+
* - Response body matches schema
|
|
17
|
+
*
|
|
18
|
+
* @param response - Actual API response
|
|
19
|
+
* @param endpoint - Expected endpoint definition
|
|
20
|
+
* @param expectedStatus - Expected status code
|
|
21
|
+
* @returns Validation result with detailed errors
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const response = {
|
|
26
|
+
* status: 200,
|
|
27
|
+
* headers: { 'content-type': 'application/json' },
|
|
28
|
+
* body: { id: 1, name: 'John' }
|
|
29
|
+
* };
|
|
30
|
+
*
|
|
31
|
+
* const result = validateResponse(response, endpoint, 200);
|
|
32
|
+
* if (!result.valid) {
|
|
33
|
+
* console.error('Response validation failed:', result.errors);
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateResponse(response: {
|
|
38
|
+
status: number;
|
|
39
|
+
headers: Record<string, string>;
|
|
40
|
+
body: unknown;
|
|
41
|
+
}, endpoint: ParsedEndpoint, expectedStatus: number): ValidationResult;
|
|
42
|
+
/**
|
|
43
|
+
* Validates that response status code is in the 2xx success range
|
|
44
|
+
*
|
|
45
|
+
* @param status - HTTP status code
|
|
46
|
+
* @returns True if status is successful (200-299)
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* isSuccessStatus(200) // true
|
|
51
|
+
* isSuccessStatus(201) // true
|
|
52
|
+
* isSuccessStatus(204) // true
|
|
53
|
+
* isSuccessStatus(400) // false
|
|
54
|
+
* isSuccessStatus(500) // false
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare function isSuccessStatus(status: number): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Validates that response status code is in the 4xx client error range
|
|
60
|
+
*
|
|
61
|
+
* @param status - HTTP status code
|
|
62
|
+
* @returns True if status is client error (400-499)
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* isClientError(400) // true
|
|
67
|
+
* isClientError(404) // true
|
|
68
|
+
* isClientError(422) // true
|
|
69
|
+
* isClientError(200) // false
|
|
70
|
+
* isClientError(500) // false
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function isClientError(status: number): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Validates that response status code is in the 5xx server error range
|
|
76
|
+
*
|
|
77
|
+
* @param status - HTTP status code
|
|
78
|
+
* @returns True if status is server error (500-599)
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* isServerError(500) // true
|
|
83
|
+
* isServerError(503) // true
|
|
84
|
+
* isServerError(200) // false
|
|
85
|
+
* isServerError(400) // false
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare function isServerError(status: number): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Gets a human-readable description of an HTTP status code
|
|
91
|
+
*
|
|
92
|
+
* @param status - HTTP status code
|
|
93
|
+
* @returns Description of the status code
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* getStatusDescription(200) // "OK"
|
|
98
|
+
* getStatusDescription(404) // "Not Found"
|
|
99
|
+
* getStatusDescription(500) // "Internal Server Error"
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export declare function getStatusDescription(status: number): string;
|
|
103
|
+
/**
|
|
104
|
+
* Validates test result against expected outcome
|
|
105
|
+
*
|
|
106
|
+
* Compares actual test result with expected values and generates
|
|
107
|
+
* detailed validation errors.
|
|
108
|
+
*
|
|
109
|
+
* @param testResult - Actual test execution result
|
|
110
|
+
* @param expectedStatus - Expected HTTP status code
|
|
111
|
+
* @param endpoint - Endpoint definition with response schemas
|
|
112
|
+
* @returns Validation result
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* const testResult = {
|
|
117
|
+
* id: 'test-1',
|
|
118
|
+
* name: 'POST /users',
|
|
119
|
+
* status: 'passed',
|
|
120
|
+
* actualStatus: 201,
|
|
121
|
+
* response: { id: 1, email: 'user@example.com' }
|
|
122
|
+
* };
|
|
123
|
+
*
|
|
124
|
+
* const result = validateTestResult(testResult, 201, endpoint);
|
|
125
|
+
* if (!result.valid) {
|
|
126
|
+
* console.error('Test result validation failed');
|
|
127
|
+
* }
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
export declare function validateTestResult(testResult: TestResult, expectedStatus: number, endpoint: ParsedEndpoint): ValidationResult;
|
|
131
|
+
/**
|
|
132
|
+
* Validates error response format
|
|
133
|
+
*
|
|
134
|
+
* Many APIs follow standard error response formats (RFC 7807, JSON:API, etc.).
|
|
135
|
+
* This function checks if error responses contain expected fields.
|
|
136
|
+
*
|
|
137
|
+
* @param response - Error response body
|
|
138
|
+
* @param expectedFormat - Expected error format
|
|
139
|
+
* @returns Validation result
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* const errorResponse = {
|
|
144
|
+
* error: 'Bad Request',
|
|
145
|
+
* message: 'Email is required',
|
|
146
|
+
* statusCode: 400
|
|
147
|
+
* };
|
|
148
|
+
*
|
|
149
|
+
* const result = validateErrorResponse(errorResponse, 'standard');
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
export declare function validateErrorResponse(response: unknown, expectedFormat?: 'standard' | 'rfc7807' | 'jsonapi'): ValidationResult;
|
|
153
|
+
/**
|
|
154
|
+
* Compares two response bodies for equality
|
|
155
|
+
*
|
|
156
|
+
* Performs deep comparison, useful for contract testing where
|
|
157
|
+
* exact response structure is expected.
|
|
158
|
+
*
|
|
159
|
+
* @param actual - Actual response body
|
|
160
|
+
* @param expected - Expected response body
|
|
161
|
+
* @returns True if responses match
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```typescript
|
|
165
|
+
* const actual = { id: 1, name: 'John' };
|
|
166
|
+
* const expected = { id: 1, name: 'John' };
|
|
167
|
+
* const matches = compareResponses(actual, expected); // true
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
export declare function compareResponses(actual: unknown, expected: unknown): boolean;
|
|
171
|
+
/**
|
|
172
|
+
* Extracts error details from a failed response
|
|
173
|
+
*
|
|
174
|
+
* Attempts to extract meaningful error information from various
|
|
175
|
+
* error response formats.
|
|
176
|
+
*
|
|
177
|
+
* @param response - Error response body
|
|
178
|
+
* @returns Extracted error details
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```typescript
|
|
182
|
+
* const errorResponse = {
|
|
183
|
+
* error: 'ValidationError',
|
|
184
|
+
* message: 'Email is required',
|
|
185
|
+
* statusCode: 400,
|
|
186
|
+
* details: { field: 'email' }
|
|
187
|
+
* };
|
|
188
|
+
*
|
|
189
|
+
* const details = extractErrorDetails(errorResponse);
|
|
190
|
+
* // { message: 'Email is required', code: 'ValidationError', details: { field: 'email' } }
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
export declare function extractErrorDetails(response: unknown): {
|
|
194
|
+
message?: string;
|
|
195
|
+
code?: string;
|
|
196
|
+
details?: unknown;
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=openapi-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-validator.d.ts","sourceRoot":"","sources":["../../src/validators/openapi-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGtF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE;IACR,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;CACf,EACD,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,MAAM,GACrB,gBAAgB,CA+ClB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgB3D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,cAAc,GACvB,gBAAgB,CA4ClB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EACjB,cAAc,GAAE,UAAU,GAAG,SAAS,GAAG,SAAsB,GAC9D,gBAAgB,CAwDlB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAE5E;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAYA"}
|