@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,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates JSON data against JSON Schema using AJV (Another JSON Validator).
|
|
5
|
+
* Supports OpenAPI 3.x schema extensions and provides detailed error reporting.
|
|
6
|
+
*
|
|
7
|
+
* @module validators/schema-validator
|
|
8
|
+
*/
|
|
9
|
+
import Ajv from 'ajv';
|
|
10
|
+
import type { OpenAPIV3 } from 'openapi-types';
|
|
11
|
+
import type { ValidationResult } from '../types/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Gets or creates the AJV validator instance
|
|
14
|
+
*
|
|
15
|
+
* The instance is created with:
|
|
16
|
+
* - All standard JSON Schema formats (email, uri, uuid, date-time, etc.)
|
|
17
|
+
* - Strict mode disabled to support OpenAPI extensions
|
|
18
|
+
* - All errors reported (not just the first one)
|
|
19
|
+
*
|
|
20
|
+
* @returns Configured AJV instance
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const ajv = getAjvInstance();
|
|
25
|
+
* const validate = ajv.compile(schema);
|
|
26
|
+
* const valid = validate(data);
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function getAjvInstance(): Ajv;
|
|
30
|
+
/**
|
|
31
|
+
* Validates data against a JSON Schema
|
|
32
|
+
*
|
|
33
|
+
* @param data - Data to validate
|
|
34
|
+
* @param schema - JSON Schema to validate against
|
|
35
|
+
* @returns Validation result with success status and errors
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const schema = {
|
|
40
|
+
* type: 'object',
|
|
41
|
+
* required: ['email', 'name'],
|
|
42
|
+
* properties: {
|
|
43
|
+
* email: { type: 'string', format: 'email' },
|
|
44
|
+
* name: { type: 'string', minLength: 1 }
|
|
45
|
+
* }
|
|
46
|
+
* };
|
|
47
|
+
*
|
|
48
|
+
* const result = validateSchema({ email: 'test@example.com', name: 'John' }, schema);
|
|
49
|
+
* if (result.valid) {
|
|
50
|
+
* console.log('Valid!');
|
|
51
|
+
* } else {
|
|
52
|
+
* console.error('Validation errors:', result.errors);
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function validateSchema(data: unknown, schema: OpenAPIV3.SchemaObject): ValidationResult;
|
|
57
|
+
/**
|
|
58
|
+
* Validates request body data against an endpoint's request body schema
|
|
59
|
+
*
|
|
60
|
+
* @param data - Request body data to validate
|
|
61
|
+
* @param requestBodySchema - Request body schema from OpenAPI spec
|
|
62
|
+
* @returns Validation result
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const endpoint = extractEndpoints(spec).find(e => e.path === '/users' && e.method === 'POST');
|
|
67
|
+
* const requestData = { email: 'test@example.com', name: 'John' };
|
|
68
|
+
*
|
|
69
|
+
* const result = validateRequestBody(requestData, endpoint.requestBody);
|
|
70
|
+
* if (!result.valid) {
|
|
71
|
+
* console.error('Invalid request:', result.errors);
|
|
72
|
+
* }
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare function validateRequestBody(data: unknown, requestBodySchema: OpenAPIV3.SchemaObject | undefined): ValidationResult;
|
|
76
|
+
/**
|
|
77
|
+
* Validates response data against an endpoint's response schema
|
|
78
|
+
*
|
|
79
|
+
* @param data - Response data to validate
|
|
80
|
+
* @param responseSchema - Response schema from OpenAPI spec
|
|
81
|
+
* @returns Validation result
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* const endpoint = extractEndpoints(spec).find(e => e.path === '/users' && e.method === 'GET');
|
|
86
|
+
* const responseData = [
|
|
87
|
+
* { id: 1, email: 'user1@example.com', name: 'User 1' },
|
|
88
|
+
* { id: 2, email: 'user2@example.com', name: 'User 2' }
|
|
89
|
+
* ];
|
|
90
|
+
*
|
|
91
|
+
* const result = validateResponseBody(responseData, endpoint.responses[200]);
|
|
92
|
+
* if (!result.valid) {
|
|
93
|
+
* console.error('Invalid response:', result.errors);
|
|
94
|
+
* }
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export declare function validateResponseBody(data: unknown, responseSchema: OpenAPIV3.SchemaObject | undefined): ValidationResult;
|
|
98
|
+
/**
|
|
99
|
+
* Validates path parameters against their schemas
|
|
100
|
+
*
|
|
101
|
+
* @param params - Path parameters object
|
|
102
|
+
* @param paramSchemas - Array of parameter definitions from OpenAPI spec
|
|
103
|
+
* @returns Validation result
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* const endpoint = extractEndpoints(spec).find(e => e.path === '/users/{id}');
|
|
108
|
+
* const params = { id: '123' };
|
|
109
|
+
*
|
|
110
|
+
* const result = validatePathParams(params, endpoint.pathParams);
|
|
111
|
+
* if (!result.valid) {
|
|
112
|
+
* console.error('Invalid path params:', result.errors);
|
|
113
|
+
* }
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export declare function validatePathParams(params: Record<string, string | number>, paramSchemas: OpenAPIV3.ParameterObject[]): ValidationResult;
|
|
117
|
+
/**
|
|
118
|
+
* Validates query parameters against their schemas
|
|
119
|
+
*
|
|
120
|
+
* @param params - Query parameters object
|
|
121
|
+
* @param paramSchemas - Array of query parameter definitions from OpenAPI spec
|
|
122
|
+
* @returns Validation result
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* const endpoint = extractEndpoints(spec).find(e => e.path === '/users');
|
|
127
|
+
* const queryParams = { page: 1, limit: 10, sortBy: 'name' };
|
|
128
|
+
*
|
|
129
|
+
* const result = validateQueryParams(queryParams, endpoint.queryParams);
|
|
130
|
+
* if (!result.valid) {
|
|
131
|
+
* console.error('Invalid query params:', result.errors);
|
|
132
|
+
* }
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
export declare function validateQueryParams(params: Record<string, string | number | boolean>, paramSchemas: OpenAPIV3.ParameterObject[]): ValidationResult;
|
|
136
|
+
/**
|
|
137
|
+
* Checks if a value matches the expected type
|
|
138
|
+
*
|
|
139
|
+
* @param value - Value to check
|
|
140
|
+
* @param expectedType - Expected JSON Schema type
|
|
141
|
+
* @returns True if value matches expected type
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```typescript
|
|
145
|
+
* isType(123, 'integer') // true
|
|
146
|
+
* isType('hello', 'string') // true
|
|
147
|
+
* isType([], 'array') // true
|
|
148
|
+
* isType({}, 'object') // true
|
|
149
|
+
* isType(true, 'boolean') // true
|
|
150
|
+
* isType(3.14, 'number') // true
|
|
151
|
+
* isType(123, 'string') // false
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
export declare function isType(value: unknown, expectedType: string): boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Formats validation errors into a human-readable string
|
|
157
|
+
*
|
|
158
|
+
* @param errors - Array of validation errors
|
|
159
|
+
* @returns Formatted error message
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```typescript
|
|
163
|
+
* const result = validateSchema(data, schema);
|
|
164
|
+
* if (!result.valid) {
|
|
165
|
+
* console.error(formatValidationErrors(result.errors));
|
|
166
|
+
* }
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
export declare function formatValidationErrors(errors: Array<{
|
|
170
|
+
field: string;
|
|
171
|
+
message: string;
|
|
172
|
+
code?: string;
|
|
173
|
+
}>): string;
|
|
174
|
+
//# sourceMappingURL=schema-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../src/validators/schema-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAO1D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,GAAG,CAcpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,SAAS,CAAC,YAAY,GAC7B,gBAAgB,CA0DlB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,iBAAiB,EAAE,SAAS,CAAC,YAAY,GAAG,SAAS,GACpD,gBAAgB,CAUlB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,cAAc,EAAE,SAAS,CAAC,YAAY,GAAG,SAAS,GACjD,gBAAgB,CAUlB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACvC,YAAY,EAAE,SAAS,CAAC,eAAe,EAAE,GACxC,gBAAgB,CAmClB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EACjD,YAAY,EAAE,SAAS,CAAC,eAAe,EAAE,GACxC,gBAAgB,CAmClB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAmBpE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/D,MAAM,CAQR"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates JSON data against JSON Schema using AJV (Another JSON Validator).
|
|
5
|
+
* Supports OpenAPI 3.x schema extensions and provides detailed error reporting.
|
|
6
|
+
*
|
|
7
|
+
* @module validators/schema-validator
|
|
8
|
+
*/
|
|
9
|
+
import Ajv from 'ajv';
|
|
10
|
+
import addFormats from 'ajv-formats';
|
|
11
|
+
/**
|
|
12
|
+
* Schema validator instance using AJV
|
|
13
|
+
*/
|
|
14
|
+
let ajvInstance = null;
|
|
15
|
+
/**
|
|
16
|
+
* Gets or creates the AJV validator instance
|
|
17
|
+
*
|
|
18
|
+
* The instance is created with:
|
|
19
|
+
* - All standard JSON Schema formats (email, uri, uuid, date-time, etc.)
|
|
20
|
+
* - Strict mode disabled to support OpenAPI extensions
|
|
21
|
+
* - All errors reported (not just the first one)
|
|
22
|
+
*
|
|
23
|
+
* @returns Configured AJV instance
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const ajv = getAjvInstance();
|
|
28
|
+
* const validate = ajv.compile(schema);
|
|
29
|
+
* const valid = validate(data);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export function getAjvInstance() {
|
|
33
|
+
if (!ajvInstance) {
|
|
34
|
+
ajvInstance = new Ajv({
|
|
35
|
+
allErrors: true, // Report all errors, not just the first
|
|
36
|
+
strict: false, // Allow OpenAPI extensions like 'nullable', 'discriminator'
|
|
37
|
+
validateFormats: true, // Validate format keywords
|
|
38
|
+
coerceTypes: false, // Don't coerce types (strict validation)
|
|
39
|
+
});
|
|
40
|
+
// Add format validators (email, uri, uuid, date-time, etc.)
|
|
41
|
+
addFormats(ajvInstance);
|
|
42
|
+
}
|
|
43
|
+
return ajvInstance;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validates data against a JSON Schema
|
|
47
|
+
*
|
|
48
|
+
* @param data - Data to validate
|
|
49
|
+
* @param schema - JSON Schema to validate against
|
|
50
|
+
* @returns Validation result with success status and errors
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const schema = {
|
|
55
|
+
* type: 'object',
|
|
56
|
+
* required: ['email', 'name'],
|
|
57
|
+
* properties: {
|
|
58
|
+
* email: { type: 'string', format: 'email' },
|
|
59
|
+
* name: { type: 'string', minLength: 1 }
|
|
60
|
+
* }
|
|
61
|
+
* };
|
|
62
|
+
*
|
|
63
|
+
* const result = validateSchema({ email: 'test@example.com', name: 'John' }, schema);
|
|
64
|
+
* if (result.valid) {
|
|
65
|
+
* console.log('Valid!');
|
|
66
|
+
* } else {
|
|
67
|
+
* console.error('Validation errors:', result.errors);
|
|
68
|
+
* }
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export function validateSchema(data, schema) {
|
|
72
|
+
const ajv = getAjvInstance();
|
|
73
|
+
try {
|
|
74
|
+
// Compile schema
|
|
75
|
+
const validate = ajv.compile(schema);
|
|
76
|
+
// Validate data
|
|
77
|
+
const valid = validate(data);
|
|
78
|
+
if (valid) {
|
|
79
|
+
return {
|
|
80
|
+
valid: true,
|
|
81
|
+
errors: [],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// Format errors
|
|
85
|
+
const errors = (validate.errors || []).map(error => {
|
|
86
|
+
const path = error.instancePath || 'root';
|
|
87
|
+
const message = error.message || 'Unknown error';
|
|
88
|
+
// Build detailed error message
|
|
89
|
+
let detailedMessage = `${path}: ${message}`;
|
|
90
|
+
if (error.params) {
|
|
91
|
+
// Add parameter details
|
|
92
|
+
const params = Object.entries(error.params)
|
|
93
|
+
.map(([key, value]) => `${key}=${JSON.stringify(value)}`)
|
|
94
|
+
.join(', ');
|
|
95
|
+
detailedMessage += ` (${params})`;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
field: path.replace(/^\//, '').replace(/\//g, '.') || 'root',
|
|
99
|
+
message: detailedMessage,
|
|
100
|
+
code: error.keyword,
|
|
101
|
+
value: error.data,
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
valid: false,
|
|
106
|
+
errors,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
// Schema compilation error
|
|
111
|
+
return {
|
|
112
|
+
valid: false,
|
|
113
|
+
errors: [
|
|
114
|
+
{
|
|
115
|
+
field: 'schema',
|
|
116
|
+
message: `Invalid schema: ${error instanceof Error ? error.message : String(error)}`,
|
|
117
|
+
code: 'SCHEMA_ERROR',
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validates request body data against an endpoint's request body schema
|
|
125
|
+
*
|
|
126
|
+
* @param data - Request body data to validate
|
|
127
|
+
* @param requestBodySchema - Request body schema from OpenAPI spec
|
|
128
|
+
* @returns Validation result
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```typescript
|
|
132
|
+
* const endpoint = extractEndpoints(spec).find(e => e.path === '/users' && e.method === 'POST');
|
|
133
|
+
* const requestData = { email: 'test@example.com', name: 'John' };
|
|
134
|
+
*
|
|
135
|
+
* const result = validateRequestBody(requestData, endpoint.requestBody);
|
|
136
|
+
* if (!result.valid) {
|
|
137
|
+
* console.error('Invalid request:', result.errors);
|
|
138
|
+
* }
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
export function validateRequestBody(data, requestBodySchema) {
|
|
142
|
+
if (!requestBodySchema) {
|
|
143
|
+
// No schema to validate against - consider valid
|
|
144
|
+
return {
|
|
145
|
+
valid: true,
|
|
146
|
+
errors: [],
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return validateSchema(data, requestBodySchema);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Validates response data against an endpoint's response schema
|
|
153
|
+
*
|
|
154
|
+
* @param data - Response data to validate
|
|
155
|
+
* @param responseSchema - Response schema from OpenAPI spec
|
|
156
|
+
* @returns Validation result
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```typescript
|
|
160
|
+
* const endpoint = extractEndpoints(spec).find(e => e.path === '/users' && e.method === 'GET');
|
|
161
|
+
* const responseData = [
|
|
162
|
+
* { id: 1, email: 'user1@example.com', name: 'User 1' },
|
|
163
|
+
* { id: 2, email: 'user2@example.com', name: 'User 2' }
|
|
164
|
+
* ];
|
|
165
|
+
*
|
|
166
|
+
* const result = validateResponseBody(responseData, endpoint.responses[200]);
|
|
167
|
+
* if (!result.valid) {
|
|
168
|
+
* console.error('Invalid response:', result.errors);
|
|
169
|
+
* }
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
export function validateResponseBody(data, responseSchema) {
|
|
173
|
+
if (!responseSchema) {
|
|
174
|
+
// No schema to validate against - consider valid
|
|
175
|
+
return {
|
|
176
|
+
valid: true,
|
|
177
|
+
errors: [],
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
return validateSchema(data, responseSchema);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Validates path parameters against their schemas
|
|
184
|
+
*
|
|
185
|
+
* @param params - Path parameters object
|
|
186
|
+
* @param paramSchemas - Array of parameter definitions from OpenAPI spec
|
|
187
|
+
* @returns Validation result
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```typescript
|
|
191
|
+
* const endpoint = extractEndpoints(spec).find(e => e.path === '/users/{id}');
|
|
192
|
+
* const params = { id: '123' };
|
|
193
|
+
*
|
|
194
|
+
* const result = validatePathParams(params, endpoint.pathParams);
|
|
195
|
+
* if (!result.valid) {
|
|
196
|
+
* console.error('Invalid path params:', result.errors);
|
|
197
|
+
* }
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
export function validatePathParams(params, paramSchemas) {
|
|
201
|
+
const errors = [];
|
|
202
|
+
for (const paramDef of paramSchemas) {
|
|
203
|
+
const paramName = paramDef.name;
|
|
204
|
+
const paramValue = params[paramName];
|
|
205
|
+
// Check if required parameter is present
|
|
206
|
+
if (paramDef.required && (paramValue === undefined || paramValue === null)) {
|
|
207
|
+
errors.push({
|
|
208
|
+
field: paramName,
|
|
209
|
+
message: `Required path parameter '${paramName}' is missing`,
|
|
210
|
+
code: 'REQUIRED',
|
|
211
|
+
});
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
// Validate against schema if present
|
|
215
|
+
if (paramDef.schema && !('$ref' in paramDef.schema) && paramValue !== undefined) {
|
|
216
|
+
const schema = paramDef.schema;
|
|
217
|
+
const result = validateSchema(paramValue, schema);
|
|
218
|
+
if (!result.valid) {
|
|
219
|
+
errors.push(...result.errors.map((err) => ({
|
|
220
|
+
...err,
|
|
221
|
+
field: `${paramName}.${err.field}`,
|
|
222
|
+
})));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
valid: errors.length === 0,
|
|
228
|
+
errors,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Validates query parameters against their schemas
|
|
233
|
+
*
|
|
234
|
+
* @param params - Query parameters object
|
|
235
|
+
* @param paramSchemas - Array of query parameter definitions from OpenAPI spec
|
|
236
|
+
* @returns Validation result
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* ```typescript
|
|
240
|
+
* const endpoint = extractEndpoints(spec).find(e => e.path === '/users');
|
|
241
|
+
* const queryParams = { page: 1, limit: 10, sortBy: 'name' };
|
|
242
|
+
*
|
|
243
|
+
* const result = validateQueryParams(queryParams, endpoint.queryParams);
|
|
244
|
+
* if (!result.valid) {
|
|
245
|
+
* console.error('Invalid query params:', result.errors);
|
|
246
|
+
* }
|
|
247
|
+
* ```
|
|
248
|
+
*/
|
|
249
|
+
export function validateQueryParams(params, paramSchemas) {
|
|
250
|
+
const errors = [];
|
|
251
|
+
for (const paramDef of paramSchemas) {
|
|
252
|
+
const paramName = paramDef.name;
|
|
253
|
+
const paramValue = params[paramName];
|
|
254
|
+
// Check if required parameter is present
|
|
255
|
+
if (paramDef.required && (paramValue === undefined || paramValue === null)) {
|
|
256
|
+
errors.push({
|
|
257
|
+
field: paramName,
|
|
258
|
+
message: `Required query parameter '${paramName}' is missing`,
|
|
259
|
+
code: 'REQUIRED',
|
|
260
|
+
});
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
// Validate against schema if present
|
|
264
|
+
if (paramDef.schema && !('$ref' in paramDef.schema) && paramValue !== undefined) {
|
|
265
|
+
const schema = paramDef.schema;
|
|
266
|
+
const result = validateSchema(paramValue, schema);
|
|
267
|
+
if (!result.valid) {
|
|
268
|
+
errors.push(...result.errors.map((err) => ({
|
|
269
|
+
...err,
|
|
270
|
+
field: `${paramName}.${err.field}`,
|
|
271
|
+
})));
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
valid: errors.length === 0,
|
|
277
|
+
errors,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Checks if a value matches the expected type
|
|
282
|
+
*
|
|
283
|
+
* @param value - Value to check
|
|
284
|
+
* @param expectedType - Expected JSON Schema type
|
|
285
|
+
* @returns True if value matches expected type
|
|
286
|
+
*
|
|
287
|
+
* @example
|
|
288
|
+
* ```typescript
|
|
289
|
+
* isType(123, 'integer') // true
|
|
290
|
+
* isType('hello', 'string') // true
|
|
291
|
+
* isType([], 'array') // true
|
|
292
|
+
* isType({}, 'object') // true
|
|
293
|
+
* isType(true, 'boolean') // true
|
|
294
|
+
* isType(3.14, 'number') // true
|
|
295
|
+
* isType(123, 'string') // false
|
|
296
|
+
* ```
|
|
297
|
+
*/
|
|
298
|
+
export function isType(value, expectedType) {
|
|
299
|
+
switch (expectedType) {
|
|
300
|
+
case 'string':
|
|
301
|
+
return typeof value === 'string';
|
|
302
|
+
case 'number':
|
|
303
|
+
return typeof value === 'number' && !Number.isNaN(value);
|
|
304
|
+
case 'integer':
|
|
305
|
+
return typeof value === 'number' && Number.isInteger(value);
|
|
306
|
+
case 'boolean':
|
|
307
|
+
return typeof value === 'boolean';
|
|
308
|
+
case 'array':
|
|
309
|
+
return Array.isArray(value);
|
|
310
|
+
case 'object':
|
|
311
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
312
|
+
case 'null':
|
|
313
|
+
return value === null;
|
|
314
|
+
default:
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Formats validation errors into a human-readable string
|
|
320
|
+
*
|
|
321
|
+
* @param errors - Array of validation errors
|
|
322
|
+
* @returns Formatted error message
|
|
323
|
+
*
|
|
324
|
+
* @example
|
|
325
|
+
* ```typescript
|
|
326
|
+
* const result = validateSchema(data, schema);
|
|
327
|
+
* if (!result.valid) {
|
|
328
|
+
* console.error(formatValidationErrors(result.errors));
|
|
329
|
+
* }
|
|
330
|
+
* ```
|
|
331
|
+
*/
|
|
332
|
+
export function formatValidationErrors(errors) {
|
|
333
|
+
if (errors.length === 0) {
|
|
334
|
+
return 'No errors';
|
|
335
|
+
}
|
|
336
|
+
return errors
|
|
337
|
+
.map((err, index) => `${index + 1}. ${err.field}: ${err.message}`)
|
|
338
|
+
.join('\n');
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../src/validators/schema-validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@machina.ai/openapi-contract-tester",
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "MCP Server for comprehensive AI-powered API testing from OpenAPI specifications",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"openapi-contract-tester": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist/",
|
|
13
|
+
"README.md",
|
|
14
|
+
".env.example"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"dev": "tsc --watch",
|
|
19
|
+
"test": "jest --config jest.config.cjs",
|
|
20
|
+
"test:watch": "jest --config jest.config.cjs --watch",
|
|
21
|
+
"test:coverage": "jest --config jest.config.cjs --coverage",
|
|
22
|
+
"lint": "eslint src/**/*.ts",
|
|
23
|
+
"lint:fix": "eslint src/**/*.ts --fix",
|
|
24
|
+
"format": "prettier --write \"src/**/*.ts\""
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"mcp",
|
|
28
|
+
"model-context-protocol",
|
|
29
|
+
"openapi",
|
|
30
|
+
"swagger",
|
|
31
|
+
"api-testing",
|
|
32
|
+
"ai-testing",
|
|
33
|
+
"mcp-server",
|
|
34
|
+
"playwright",
|
|
35
|
+
"rest-api",
|
|
36
|
+
"testing",
|
|
37
|
+
"automation",
|
|
38
|
+
"auto-repair"
|
|
39
|
+
],
|
|
40
|
+
"author": "Daniel Jahziel Martinez",
|
|
41
|
+
"license": "UNLICENSED",
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@apidevtools/swagger-parser": "^10.1.0",
|
|
44
|
+
"@faker-js/faker": "^9.2.0",
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
46
|
+
"@playwright/test": "^1.48.0",
|
|
47
|
+
"@toon-format/toon": "^1.0.0",
|
|
48
|
+
"@types/postman-collection": "^3.5.11",
|
|
49
|
+
"ajv": "^8.17.1",
|
|
50
|
+
"ajv-formats": "^3.0.1",
|
|
51
|
+
"chalk": "^5.3.0",
|
|
52
|
+
"cli-table3": "^0.6.5",
|
|
53
|
+
"openapi-types": "^12.1.3",
|
|
54
|
+
"papaparse": "^5.5.3",
|
|
55
|
+
"postman-collection": "^5.2.1",
|
|
56
|
+
"randexp": "^0.5.3",
|
|
57
|
+
"swagger2openapi": "^7.0.8",
|
|
58
|
+
"xlsx": "^0.18.5",
|
|
59
|
+
"yaml": "^2.6.1",
|
|
60
|
+
"zod": "^3.23.8"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@types/jest": "^29.5.14",
|
|
64
|
+
"@types/node": "^22.10.2",
|
|
65
|
+
"@types/papaparse": "^5.5.0",
|
|
66
|
+
"@typescript-eslint/eslint-plugin": "^8.19.1",
|
|
67
|
+
"@typescript-eslint/parser": "^8.19.1",
|
|
68
|
+
"eslint": "^9.17.0",
|
|
69
|
+
"jest": "^29.7.0",
|
|
70
|
+
"ts-jest": "^29.2.5",
|
|
71
|
+
"typescript": "^5.7.2"
|
|
72
|
+
},
|
|
73
|
+
"engines": {
|
|
74
|
+
"node": ">=18.0.0"
|
|
75
|
+
}
|
|
76
|
+
}
|