@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,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test execution types - runtime behavior and matchers
|
|
3
|
+
* @module types/test-execution
|
|
4
|
+
*/
|
|
5
|
+
import type { TestCase } from './test-case.js';
|
|
6
|
+
/**
|
|
7
|
+
* Response matcher for flexible validation
|
|
8
|
+
* Validates type instead of exact value (e.g., "is a number" vs "is 123")
|
|
9
|
+
*/
|
|
10
|
+
export interface ResponseMatcher {
|
|
11
|
+
/**
|
|
12
|
+
* Type of matcher
|
|
13
|
+
*/
|
|
14
|
+
type: 'type' | 'regex' | 'range' | 'exists';
|
|
15
|
+
/**
|
|
16
|
+
* Expected type (for type matcher)
|
|
17
|
+
*/
|
|
18
|
+
expectedType?: 'string' | 'number' | 'boolean' | 'object' | 'array' | 'null';
|
|
19
|
+
/**
|
|
20
|
+
* Regular expression pattern (for regex matcher)
|
|
21
|
+
*/
|
|
22
|
+
pattern?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Minimum value (for range matcher)
|
|
25
|
+
*/
|
|
26
|
+
min?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Maximum value (for range matcher)
|
|
29
|
+
*/
|
|
30
|
+
max?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Whether field must exist (for exists matcher)
|
|
33
|
+
*/
|
|
34
|
+
required?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* State handler callback for test setup/teardown
|
|
38
|
+
* Allows users to prepare database, mock services, etc.
|
|
39
|
+
*/
|
|
40
|
+
export type StateHandler = (testCase: TestCase) => Promise<void> | void;
|
|
41
|
+
/**
|
|
42
|
+
* Options for test execution with matchers and state handlers
|
|
43
|
+
*/
|
|
44
|
+
export interface TestExecutionOptions {
|
|
45
|
+
/**
|
|
46
|
+
* Use type-based matchers for response validation
|
|
47
|
+
* @default false
|
|
48
|
+
*/
|
|
49
|
+
useMatchers?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Custom matchers per test or globally
|
|
52
|
+
* Key: test ID or "*" for all tests
|
|
53
|
+
* Value: Field path to matcher config
|
|
54
|
+
* @example
|
|
55
|
+
* {
|
|
56
|
+
* "*": {
|
|
57
|
+
* "response.body.id": { type: "type", expectedType: "number" },
|
|
58
|
+
* "response.body.email": { type: "regex", pattern: "^[^@]+@[^@]+$" }
|
|
59
|
+
* }
|
|
60
|
+
* }
|
|
61
|
+
*/
|
|
62
|
+
matchers?: Record<string, Record<string, ResponseMatcher>>;
|
|
63
|
+
/**
|
|
64
|
+
* Callback executed before each test
|
|
65
|
+
* Use for database seeding, mock setup, etc.
|
|
66
|
+
* @example
|
|
67
|
+
* beforeTest: async (test) => {
|
|
68
|
+
* if (test.path.includes('/users')) {
|
|
69
|
+
* await database.seed('users');
|
|
70
|
+
* }
|
|
71
|
+
* }
|
|
72
|
+
*/
|
|
73
|
+
beforeTest?: StateHandler;
|
|
74
|
+
/**
|
|
75
|
+
* Callback executed after each test
|
|
76
|
+
* Use for cleanup, logging, etc.
|
|
77
|
+
*/
|
|
78
|
+
afterTest?: StateHandler;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=test-execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-execution.d.ts","sourceRoot":"","sources":["../../src/types/test-execution.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IAE5C;;OAEG;IACH,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAE7E;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAE3D;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,YAAY,CAAC;IAE1B;;;OAGG;IACH,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-execution.js","sourceRoot":"","sources":["../../src/types/test-execution.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Header Generator
|
|
3
|
+
*
|
|
4
|
+
* Centralized utility for generating authentication headers based on OpenAPI security schemes.
|
|
5
|
+
* This is the single source of truth for auth header generation across all test generators.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/auth-generator
|
|
8
|
+
*/
|
|
9
|
+
import type { OpenAPIV3 } from 'openapi-types';
|
|
10
|
+
/**
|
|
11
|
+
* Generates authentication headers based on security schemes
|
|
12
|
+
*
|
|
13
|
+
* This function is agnostic and supports multiple auth types:
|
|
14
|
+
* - Bearer tokens
|
|
15
|
+
* - API Keys
|
|
16
|
+
* - Basic Auth
|
|
17
|
+
* - OAuth2
|
|
18
|
+
* - OpenID Connect
|
|
19
|
+
*
|
|
20
|
+
* @param securitySchemes - Array of security scheme objects from OpenAPI
|
|
21
|
+
* @returns Headers object with authentication placeholders
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const headers = generateAuthHeaders([{ type: 'http', scheme: 'bearer' }]);
|
|
26
|
+
* // Returns: { Authorization: 'Bearer {{TOKEN}}' }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function generateAuthHeaders(securitySchemes: OpenAPIV3.SecuritySchemeObject[]): Record<string, string>;
|
|
30
|
+
//# sourceMappingURL=auth-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-generator.d.ts","sourceRoot":"","sources":["../../src/utils/auth-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,SAAS,CAAC,oBAAoB,EAAE,GAChD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6CxB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Header Generator
|
|
3
|
+
*
|
|
4
|
+
* Centralized utility for generating authentication headers based on OpenAPI security schemes.
|
|
5
|
+
* This is the single source of truth for auth header generation across all test generators.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/auth-generator
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Generates authentication headers based on security schemes
|
|
11
|
+
*
|
|
12
|
+
* This function is agnostic and supports multiple auth types:
|
|
13
|
+
* - Bearer tokens
|
|
14
|
+
* - API Keys
|
|
15
|
+
* - Basic Auth
|
|
16
|
+
* - OAuth2
|
|
17
|
+
* - OpenID Connect
|
|
18
|
+
*
|
|
19
|
+
* @param securitySchemes - Array of security scheme objects from OpenAPI
|
|
20
|
+
* @returns Headers object with authentication placeholders
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const headers = generateAuthHeaders([{ type: 'http', scheme: 'bearer' }]);
|
|
25
|
+
* // Returns: { Authorization: 'Bearer {{TOKEN}}' }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function generateAuthHeaders(securitySchemes) {
|
|
29
|
+
const headers = {};
|
|
30
|
+
// If no security schemes, return empty headers
|
|
31
|
+
if (!securitySchemes || securitySchemes.length === 0) {
|
|
32
|
+
return headers;
|
|
33
|
+
}
|
|
34
|
+
// Use the first security scheme that generates a recognisable header.
|
|
35
|
+
// APIs with multiple schemes (e.g. bearer + apiKey) are supported via the
|
|
36
|
+
// first matching scheme; additional schemes are intentionally ignored because
|
|
37
|
+
// a single request can only carry one auth credential set.
|
|
38
|
+
const scheme = securitySchemes[0];
|
|
39
|
+
switch (scheme.type) {
|
|
40
|
+
case 'http':
|
|
41
|
+
if (scheme.scheme === 'bearer') {
|
|
42
|
+
// Bearer token authentication
|
|
43
|
+
headers['Authorization'] = 'Bearer {{TOKEN}}';
|
|
44
|
+
}
|
|
45
|
+
else if (scheme.scheme === 'basic') {
|
|
46
|
+
// Basic authentication
|
|
47
|
+
headers['Authorization'] = 'Basic {{CREDENTIALS}}';
|
|
48
|
+
}
|
|
49
|
+
break;
|
|
50
|
+
case 'apiKey':
|
|
51
|
+
// API Key authentication
|
|
52
|
+
if (scheme.in === 'header') {
|
|
53
|
+
headers[scheme.name] = '{{API_KEY}}';
|
|
54
|
+
}
|
|
55
|
+
// If in=query, it will be handled as query param, not header
|
|
56
|
+
break;
|
|
57
|
+
case 'oauth2':
|
|
58
|
+
// OAuth2 - use Bearer token
|
|
59
|
+
headers['Authorization'] = 'Bearer {{OAUTH_TOKEN}}';
|
|
60
|
+
break;
|
|
61
|
+
case 'openIdConnect':
|
|
62
|
+
// OpenID Connect - also uses Bearer token
|
|
63
|
+
headers['Authorization'] = 'Bearer {{OIDC_TOKEN}}';
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
return headers;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=auth-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-generator.js","sourceRoot":"","sources":["../../src/utils/auth-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,mBAAmB,CACjC,eAAiD;IAEjD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,+CAA+C;IAC/C,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,sEAAsE;IACtE,0EAA0E;IAC1E,8EAA8E;IAC9E,2DAA2D;IAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAElC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,8BAA8B;gBAC9B,OAAO,CAAC,eAAe,CAAC,GAAG,kBAAkB,CAAC;YAChD,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBACrC,uBAAuB;gBACvB,OAAO,CAAC,eAAe,CAAC,GAAG,uBAAuB,CAAC;YACrD,CAAC;YACD,MAAM;QAER,KAAK,QAAQ;YACX,yBAAyB;YACzB,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC;YACvC,CAAC;YACD,6DAA6D;YAC7D,MAAM;QAER,KAAK,QAAQ;YACX,4BAA4B;YAC5B,OAAO,CAAC,eAAe,CAAC,GAAG,wBAAwB,CAAC;YACpD,MAAM;QAER,KAAK,eAAe;YAClB,0CAA0C;YAC1C,OAAO,CAAC,eAAe,CAAC,GAAG,uBAAuB,CAAC;YACnD,MAAM;IACV,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Configuration Management
|
|
3
|
+
*
|
|
4
|
+
* Loads and validates configuration from environment variables
|
|
5
|
+
* with sensible defaults for production use.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/config
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* HTTP Client Configuration
|
|
11
|
+
*/
|
|
12
|
+
export interface HttpConfig {
|
|
13
|
+
/**
|
|
14
|
+
* Default timeout for HTTP requests in milliseconds
|
|
15
|
+
* @default 5000
|
|
16
|
+
* @env HTTP_TIMEOUT
|
|
17
|
+
*/
|
|
18
|
+
timeout: number;
|
|
19
|
+
/**
|
|
20
|
+
* Maximum number of parallel requests
|
|
21
|
+
* @default 5
|
|
22
|
+
* @env MAX_PARALLEL_REQUESTS
|
|
23
|
+
*/
|
|
24
|
+
maxParallel: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Retry Logic Configuration
|
|
28
|
+
*/
|
|
29
|
+
export interface RetryConfig {
|
|
30
|
+
/**
|
|
31
|
+
* Maximum number of retry attempts
|
|
32
|
+
* @default 3
|
|
33
|
+
* @env RETRY_MAX_ATTEMPTS
|
|
34
|
+
*/
|
|
35
|
+
maxAttempts: number;
|
|
36
|
+
/**
|
|
37
|
+
* Initial delay in milliseconds before first retry
|
|
38
|
+
* @default 1000
|
|
39
|
+
* @env RETRY_INITIAL_DELAY
|
|
40
|
+
*/
|
|
41
|
+
initialDelay: number;
|
|
42
|
+
/**
|
|
43
|
+
* Maximum delay in milliseconds between retries
|
|
44
|
+
* @default 10000
|
|
45
|
+
* @env RETRY_MAX_DELAY
|
|
46
|
+
*/
|
|
47
|
+
maxDelay: number;
|
|
48
|
+
/**
|
|
49
|
+
* Backoff multiplier for exponential backoff
|
|
50
|
+
* @default 2
|
|
51
|
+
* @env RETRY_BACKOFF_MULTIPLIER
|
|
52
|
+
*/
|
|
53
|
+
backoffMultiplier: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Circuit Breaker Configuration
|
|
57
|
+
*/
|
|
58
|
+
export interface CircuitBreakerConfig {
|
|
59
|
+
/**
|
|
60
|
+
* Number of failures before opening circuit
|
|
61
|
+
* @default 5
|
|
62
|
+
* @env CIRCUIT_BREAKER_THRESHOLD
|
|
63
|
+
*/
|
|
64
|
+
failureThreshold: number;
|
|
65
|
+
/**
|
|
66
|
+
* Time in milliseconds to wait before transitioning to HALF_OPEN
|
|
67
|
+
* @default 60000 (1 minute)
|
|
68
|
+
* @env CIRCUIT_BREAKER_TIMEOUT
|
|
69
|
+
*/
|
|
70
|
+
resetTimeout: number;
|
|
71
|
+
/**
|
|
72
|
+
* Number of successful calls in HALF_OPEN before closing circuit
|
|
73
|
+
* @default 2
|
|
74
|
+
* @env CIRCUIT_BREAKER_SUCCESS_THRESHOLD
|
|
75
|
+
*/
|
|
76
|
+
successThreshold: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Logging Configuration
|
|
80
|
+
*/
|
|
81
|
+
export interface LogConfig {
|
|
82
|
+
/**
|
|
83
|
+
* Log level (debug, info, warn, error)
|
|
84
|
+
* @default 'info'
|
|
85
|
+
* @env LOG_LEVEL
|
|
86
|
+
*/
|
|
87
|
+
level: 'debug' | 'info' | 'warn' | 'error';
|
|
88
|
+
/**
|
|
89
|
+
* Directory where logs are stored
|
|
90
|
+
* @env LOG_DIR or MCP_ROOT/logs or ~/.openapi-contract-tester/logs
|
|
91
|
+
*/
|
|
92
|
+
logDir: string;
|
|
93
|
+
/**
|
|
94
|
+
* Maximum log file size in bytes before rotation
|
|
95
|
+
* @default 10485760 (10MB)
|
|
96
|
+
* @env MAX_LOG_FILE_SIZE
|
|
97
|
+
*/
|
|
98
|
+
maxFileSize: number;
|
|
99
|
+
/**
|
|
100
|
+
* Maximum number of rotated log files to keep
|
|
101
|
+
* @default 5
|
|
102
|
+
* @env MAX_LOG_FILES
|
|
103
|
+
*/
|
|
104
|
+
maxFiles: number;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Test Execution Configuration
|
|
108
|
+
*/
|
|
109
|
+
export interface TestConfig {
|
|
110
|
+
/**
|
|
111
|
+
* Maximum number of tests to run in parallel
|
|
112
|
+
* @default 5
|
|
113
|
+
* @env MAX_PARALLEL_TESTS
|
|
114
|
+
*/
|
|
115
|
+
maxParallel: number;
|
|
116
|
+
/**
|
|
117
|
+
* Default timeout for test execution in milliseconds
|
|
118
|
+
* @default 30000 (30 seconds)
|
|
119
|
+
* @env TEST_TIMEOUT
|
|
120
|
+
*/
|
|
121
|
+
timeout: number;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Complete Application Configuration
|
|
125
|
+
*/
|
|
126
|
+
export interface AppConfig {
|
|
127
|
+
/**
|
|
128
|
+
* Root directory for all MCP-related files
|
|
129
|
+
* @env MCP_ROOT
|
|
130
|
+
*/
|
|
131
|
+
mcpRoot: string;
|
|
132
|
+
/**
|
|
133
|
+
* Whether running in MCP mode (STDIO protocol)
|
|
134
|
+
* @env MCP_MODE
|
|
135
|
+
*/
|
|
136
|
+
mcpMode: boolean;
|
|
137
|
+
/**
|
|
138
|
+
* HTTP client configuration
|
|
139
|
+
*/
|
|
140
|
+
http: HttpConfig;
|
|
141
|
+
/**
|
|
142
|
+
* Retry logic configuration
|
|
143
|
+
*/
|
|
144
|
+
retry: RetryConfig;
|
|
145
|
+
/**
|
|
146
|
+
* Circuit breaker configuration
|
|
147
|
+
*/
|
|
148
|
+
circuitBreaker: CircuitBreakerConfig;
|
|
149
|
+
/**
|
|
150
|
+
* Logging configuration
|
|
151
|
+
*/
|
|
152
|
+
log: LogConfig;
|
|
153
|
+
/**
|
|
154
|
+
* Test execution configuration
|
|
155
|
+
*/
|
|
156
|
+
test: TestConfig;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Load configuration from environment variables
|
|
160
|
+
*
|
|
161
|
+
* All values have sensible defaults and are overridable via environment variables.
|
|
162
|
+
*
|
|
163
|
+
* @returns Complete application configuration
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```typescript
|
|
167
|
+
* import { loadConfig } from './utils/config.js';
|
|
168
|
+
*
|
|
169
|
+
* const config = loadConfig();
|
|
170
|
+
* console.log(`HTTP timeout: ${config.http.timeout}ms`);
|
|
171
|
+
* console.log(`Logs directory: ${config.log.logDir}`);
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
export declare function loadConfig(): AppConfig;
|
|
175
|
+
/**
|
|
176
|
+
* Global configuration instance
|
|
177
|
+
*
|
|
178
|
+
* Loaded once at startup from environment variables.
|
|
179
|
+
*/
|
|
180
|
+
export declare const config: AppConfig;
|
|
181
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA4CH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAE3C;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,IAAI,EAAE,UAAU,CAAC;IAEjB;;OAEG;IACH,KAAK,EAAE,WAAW,CAAC;IAEnB;;OAEG;IACH,cAAc,EAAE,oBAAoB,CAAC;IAErC;;OAEG;IACH,GAAG,EAAE,SAAS,CAAC;IAEf;;OAEG;IACH,IAAI,EAAE,UAAU,CAAC;CAClB;AAgDD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAsCtC;AAED;;;;GAIG;AACH,eAAO,MAAM,MAAM,WAAe,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Configuration Management
|
|
3
|
+
*
|
|
4
|
+
* Loads and validates configuration from environment variables
|
|
5
|
+
* with sensible defaults for production use.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/config
|
|
8
|
+
*/
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Parse environment variable as integer with fallback
|
|
12
|
+
*/
|
|
13
|
+
function parseEnvInt(key, defaultValue) {
|
|
14
|
+
const value = process.env[key];
|
|
15
|
+
if (!value)
|
|
16
|
+
return defaultValue;
|
|
17
|
+
const parsed = parseInt(value, 10);
|
|
18
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse environment variable as float with fallback.
|
|
22
|
+
* Correctly handles the value 0 (unlike `parseFloat(x||default)||default`).
|
|
23
|
+
*/
|
|
24
|
+
function parseEnvFloat(key, defaultValue) {
|
|
25
|
+
const value = process.env[key];
|
|
26
|
+
if (!value)
|
|
27
|
+
return defaultValue;
|
|
28
|
+
const parsed = parseFloat(value);
|
|
29
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Parse environment variable as boolean with fallback
|
|
33
|
+
*/
|
|
34
|
+
function parseEnvBool(key, defaultValue) {
|
|
35
|
+
const value = process.env[key];
|
|
36
|
+
if (!value)
|
|
37
|
+
return defaultValue;
|
|
38
|
+
return value.toLowerCase() === 'true' || value === '1';
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get directory path with home directory expansion
|
|
42
|
+
*/
|
|
43
|
+
function expandPath(pathStr) {
|
|
44
|
+
return pathStr.replace(/^~/, process.env.HOME || process.env.USERPROFILE || '~');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get MCP root directory
|
|
48
|
+
*/
|
|
49
|
+
function getMcpRoot() {
|
|
50
|
+
if (process.env.MCP_ROOT) {
|
|
51
|
+
return expandPath(process.env.MCP_ROOT);
|
|
52
|
+
}
|
|
53
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '.';
|
|
54
|
+
return path.join(homeDir, '.openapi-contract-tester');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get log directory
|
|
58
|
+
*/
|
|
59
|
+
function getLogDirectory(mcpRoot) {
|
|
60
|
+
// 1. Explicit LOG_DIR
|
|
61
|
+
if (process.env.LOG_DIR) {
|
|
62
|
+
return expandPath(process.env.LOG_DIR);
|
|
63
|
+
}
|
|
64
|
+
// 2. MCP_ROOT/logs
|
|
65
|
+
return path.join(mcpRoot, 'logs');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Parse log level from environment
|
|
69
|
+
*/
|
|
70
|
+
function parseLogLevel(value) {
|
|
71
|
+
const normalized = value?.toLowerCase();
|
|
72
|
+
switch (normalized) {
|
|
73
|
+
case 'debug':
|
|
74
|
+
return 'debug';
|
|
75
|
+
case 'info':
|
|
76
|
+
return 'info';
|
|
77
|
+
case 'warn':
|
|
78
|
+
case 'warning':
|
|
79
|
+
return 'warn';
|
|
80
|
+
case 'error':
|
|
81
|
+
return 'error';
|
|
82
|
+
default:
|
|
83
|
+
return 'info';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Load configuration from environment variables
|
|
88
|
+
*
|
|
89
|
+
* All values have sensible defaults and are overridable via environment variables.
|
|
90
|
+
*
|
|
91
|
+
* @returns Complete application configuration
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* import { loadConfig } from './utils/config.js';
|
|
96
|
+
*
|
|
97
|
+
* const config = loadConfig();
|
|
98
|
+
* console.log(`HTTP timeout: ${config.http.timeout}ms`);
|
|
99
|
+
* console.log(`Logs directory: ${config.log.logDir}`);
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export function loadConfig() {
|
|
103
|
+
const mcpRoot = getMcpRoot();
|
|
104
|
+
const isMCPMode = parseEnvBool('MCP_MODE', !process.stdin.isTTY);
|
|
105
|
+
return {
|
|
106
|
+
mcpRoot,
|
|
107
|
+
mcpMode: isMCPMode,
|
|
108
|
+
http: {
|
|
109
|
+
timeout: parseEnvInt('HTTP_TIMEOUT', 5000),
|
|
110
|
+
maxParallel: parseEnvInt('MAX_PARALLEL_REQUESTS', 5),
|
|
111
|
+
},
|
|
112
|
+
retry: {
|
|
113
|
+
maxAttempts: parseEnvInt('RETRY_MAX_ATTEMPTS', 3),
|
|
114
|
+
initialDelay: parseEnvInt('RETRY_INITIAL_DELAY', 1000),
|
|
115
|
+
maxDelay: parseEnvInt('RETRY_MAX_DELAY', 10000),
|
|
116
|
+
backoffMultiplier: parseEnvFloat('RETRY_BACKOFF_MULTIPLIER', 2),
|
|
117
|
+
},
|
|
118
|
+
circuitBreaker: {
|
|
119
|
+
failureThreshold: parseEnvInt('CIRCUIT_BREAKER_THRESHOLD', 5),
|
|
120
|
+
resetTimeout: parseEnvInt('CIRCUIT_BREAKER_TIMEOUT', 60000),
|
|
121
|
+
successThreshold: parseEnvInt('CIRCUIT_BREAKER_SUCCESS_THRESHOLD', 2),
|
|
122
|
+
},
|
|
123
|
+
log: {
|
|
124
|
+
level: parseLogLevel(process.env.LOG_LEVEL),
|
|
125
|
+
logDir: getLogDirectory(mcpRoot),
|
|
126
|
+
maxFileSize: parseEnvInt('MAX_LOG_FILE_SIZE', 10 * 1024 * 1024), // 10MB
|
|
127
|
+
maxFiles: parseEnvInt('MAX_LOG_FILES', 5),
|
|
128
|
+
},
|
|
129
|
+
test: {
|
|
130
|
+
maxParallel: parseEnvInt('MAX_PARALLEL_TESTS', 5),
|
|
131
|
+
timeout: parseEnvInt('TEST_TIMEOUT', 30000),
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Global configuration instance
|
|
137
|
+
*
|
|
138
|
+
* Loaded once at startup from environment variables.
|
|
139
|
+
*/
|
|
140
|
+
export const config = loadConfig();
|
|
141
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage Calculator
|
|
3
|
+
*
|
|
4
|
+
* Calculates endpoint coverage from test results
|
|
5
|
+
* without generating new tests (unlike preview-test-coverage)
|
|
6
|
+
*
|
|
7
|
+
* @module utils/coverage-calculator
|
|
8
|
+
*/
|
|
9
|
+
interface TestResult {
|
|
10
|
+
method?: string;
|
|
11
|
+
path?: string;
|
|
12
|
+
endpoint?: string;
|
|
13
|
+
status: string;
|
|
14
|
+
}
|
|
15
|
+
interface CoverageResult {
|
|
16
|
+
totalEndpoints: number;
|
|
17
|
+
testedEndpoints: number;
|
|
18
|
+
coveragePercentage: string;
|
|
19
|
+
uncoveredEndpoints: Array<{
|
|
20
|
+
method: string;
|
|
21
|
+
path: string;
|
|
22
|
+
}>;
|
|
23
|
+
endpointDetails: Array<{
|
|
24
|
+
endpoint: string;
|
|
25
|
+
method: string;
|
|
26
|
+
path: string;
|
|
27
|
+
totalTests: number;
|
|
28
|
+
passedTests: number;
|
|
29
|
+
failedTests: number;
|
|
30
|
+
hasCoverage: boolean;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Calculates endpoint coverage from test results
|
|
35
|
+
*
|
|
36
|
+
* Analyzes results.json to determine which endpoints were tested
|
|
37
|
+
* and which are missing coverage
|
|
38
|
+
*
|
|
39
|
+
* @param results - Test results object with allTests array
|
|
40
|
+
* @returns Coverage statistics
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const results = JSON.parse(await fs.readFile('results.json', 'utf-8'));
|
|
45
|
+
* const coverage = calculateCoverageFromResults(results);
|
|
46
|
+
*
|
|
47
|
+
* console.log(coverage.coveragePercentage); // "85%"
|
|
48
|
+
* console.log(coverage.uncoveredEndpoints); // [{ method: "DELETE", path: "/users/{id}" }]
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function calculateCoverageFromResults(results: {
|
|
52
|
+
allTests: TestResult[];
|
|
53
|
+
}): CoverageResult;
|
|
54
|
+
/**
|
|
55
|
+
* Calculates coverage with OpenAPI spec to find truly uncovered endpoints
|
|
56
|
+
*
|
|
57
|
+
* Compares test results against OpenAPI spec to identify endpoints
|
|
58
|
+
* that exist in spec but have no tests
|
|
59
|
+
*
|
|
60
|
+
* @param results - Test results object
|
|
61
|
+
* @param specEndpoints - Parsed endpoints from OpenAPI spec
|
|
62
|
+
* @returns Coverage statistics including truly uncovered endpoints
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const spec = await parseOpenAPISpec('api.yml');
|
|
67
|
+
* const endpoints = extractEndpoints(spec);
|
|
68
|
+
* const coverage = calculateCoverageWithSpec(results, endpoints);
|
|
69
|
+
*
|
|
70
|
+
* console.log(coverage.uncoveredEndpoints);
|
|
71
|
+
* // [{ method: "DELETE", path: "/admin/logs" }]
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare function calculateCoverageWithSpec(results: {
|
|
75
|
+
allTests: TestResult[];
|
|
76
|
+
}, specEndpoints: Array<{
|
|
77
|
+
method: string;
|
|
78
|
+
path: string;
|
|
79
|
+
}>): CoverageResult;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=coverage-calculator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-calculator.d.ts","sourceRoot":"","sources":["../../src/utils/coverage-calculator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,UAAU,UAAU;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,cAAc;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,eAAe,EAAE,KAAK,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC,CAAC;CACJ;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB,GAAG,cAAc,CAwEjB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE;IAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,EACnC,aAAa,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACrD,cAAc,CAsChB"}
|