@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,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assertion Generator - Smart business logic assertions
|
|
3
|
+
*
|
|
4
|
+
* Generates intelligent assertions beyond schema validation.
|
|
5
|
+
* Validates business rules like date consistency, logical constraints, state transitions.
|
|
6
|
+
*
|
|
7
|
+
* @module ai-engine/assertion-generator
|
|
8
|
+
*/
|
|
9
|
+
import { createLogger } from '../utils/logger.js';
|
|
10
|
+
import { callLLM } from '../llm/ai-client.js';
|
|
11
|
+
const log = createLogger('assertion-generator');
|
|
12
|
+
/**
|
|
13
|
+
* Generates smart assertions for a test
|
|
14
|
+
*
|
|
15
|
+
* @param method - HTTP method
|
|
16
|
+
* @param path - Endpoint path
|
|
17
|
+
* @param responseSchema - Response schema
|
|
18
|
+
* @param apiContext - API context
|
|
19
|
+
* @param aiConfig - AI configuration
|
|
20
|
+
* @returns Array of assertions
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const assertions = await generateAssertions('GET', '/users/{id}', schema, context, config);
|
|
25
|
+
* // Returns:
|
|
26
|
+
* // [
|
|
27
|
+
* // { description: 'createdAt before updatedAt', path: 'createdAt', type: 'lessThan', expected: 'updatedAt' },
|
|
28
|
+
* // { description: 'email format valid', path: 'email', type: 'matches', expected: /^.+@.+$/ }
|
|
29
|
+
* // ]
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export async function generateAssertions(method, path, responseSchema, apiContext, aiConfig) {
|
|
33
|
+
if (!aiConfig.capabilities.smartAssertions || !responseSchema) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
// Heuristic assertions (always include)
|
|
37
|
+
const heuristicAssertions = generateHeuristicAssertions(responseSchema);
|
|
38
|
+
// AI-powered assertions (if enabled)
|
|
39
|
+
if (aiConfig.level === 'smart' || aiConfig.level === 'advanced') {
|
|
40
|
+
try {
|
|
41
|
+
const aiAssertions = await generateAIAssertions(method, path, responseSchema, apiContext, aiConfig);
|
|
42
|
+
return [...heuristicAssertions, ...aiAssertions];
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
log.warn('AI assertion generation failed', {
|
|
46
|
+
error: error instanceof Error ? error.message : String(error)
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return heuristicAssertions;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Generates heuristic assertions based on schema
|
|
54
|
+
*/
|
|
55
|
+
function generateHeuristicAssertions(schema) {
|
|
56
|
+
const assertions = [];
|
|
57
|
+
const properties = schema.properties || {};
|
|
58
|
+
// Date consistency assertions
|
|
59
|
+
if ('createdAt' in properties && 'updatedAt' in properties) {
|
|
60
|
+
assertions.push({
|
|
61
|
+
description: 'createdAt should be before or equal to updatedAt',
|
|
62
|
+
path: 'createdAt',
|
|
63
|
+
type: 'custom',
|
|
64
|
+
expression: 'new Date(value.createdAt) <= new Date(value.updatedAt)'
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// Status enum validation
|
|
68
|
+
for (const [key, prop] of Object.entries(properties)) {
|
|
69
|
+
const propSchema = prop;
|
|
70
|
+
if (propSchema.enum && propSchema.enum.length > 0) {
|
|
71
|
+
assertions.push({
|
|
72
|
+
description: `${key} should be one of valid values`,
|
|
73
|
+
path: key,
|
|
74
|
+
type: 'custom',
|
|
75
|
+
expression: `[${propSchema.enum.map(v => JSON.stringify(v)).join(',')}].includes(value.${key})`
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Email format
|
|
80
|
+
for (const [key, prop] of Object.entries(properties)) {
|
|
81
|
+
const propSchema = prop;
|
|
82
|
+
if (propSchema.format === 'email' || key.toLowerCase().includes('email')) {
|
|
83
|
+
assertions.push({
|
|
84
|
+
description: `${key} should be valid email format`,
|
|
85
|
+
path: key,
|
|
86
|
+
type: 'matches',
|
|
87
|
+
expected: '^[^@]+@[^@]+\\.[^@]+$'
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Positive numbers for amounts, prices, etc.
|
|
92
|
+
for (const [key, prop] of Object.entries(properties)) {
|
|
93
|
+
const propSchema = prop;
|
|
94
|
+
if ((propSchema.type === 'number' || propSchema.type === 'integer') &&
|
|
95
|
+
(key.toLowerCase().includes('price') ||
|
|
96
|
+
key.toLowerCase().includes('amount') ||
|
|
97
|
+
key.toLowerCase().includes('cost'))) {
|
|
98
|
+
assertions.push({
|
|
99
|
+
description: `${key} should be positive`,
|
|
100
|
+
path: key,
|
|
101
|
+
type: 'greaterThan',
|
|
102
|
+
expected: 0
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return assertions;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Generates AI-powered assertions
|
|
110
|
+
*/
|
|
111
|
+
async function generateAIAssertions(method, path, responseSchema, apiContext, aiConfig) {
|
|
112
|
+
const fields = Object.entries(responseSchema.properties || {}).map(([name, prop]) => {
|
|
113
|
+
const propSchema = prop;
|
|
114
|
+
return {
|
|
115
|
+
name,
|
|
116
|
+
type: propSchema.type,
|
|
117
|
+
format: propSchema.format,
|
|
118
|
+
description: propSchema.description
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
const prompt = `Generate smart business logic assertions for this API response.
|
|
122
|
+
|
|
123
|
+
ENDPOINT: ${method} ${path}
|
|
124
|
+
DOMAIN: ${apiContext.domain || 'unknown'}
|
|
125
|
+
RESPONSE FIELDS: ${JSON.stringify(fields, null, 2)}
|
|
126
|
+
|
|
127
|
+
GENERATE ASSERTIONS FOR:
|
|
128
|
+
1. Business logic constraints (e.g., startDate < endDate)
|
|
129
|
+
2. State validity (e.g., status transitions make sense)
|
|
130
|
+
3. Data consistency (e.g., totals match sums)
|
|
131
|
+
4. Referential integrity (e.g., IDs exist)
|
|
132
|
+
|
|
133
|
+
Return JSON array:
|
|
134
|
+
[
|
|
135
|
+
{
|
|
136
|
+
"description": "assertion description",
|
|
137
|
+
"path": "field.path",
|
|
138
|
+
"type": "lessThan",
|
|
139
|
+
"expected": "otherField"
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
Types: equals, notEquals, greaterThan, lessThan, contains, matches, custom
|
|
144
|
+
For custom, provide "expression" instead of "expected".
|
|
145
|
+
|
|
146
|
+
Respond with JSON array only.`;
|
|
147
|
+
const result = await callLLM(prompt, aiConfig.llm);
|
|
148
|
+
if (!result.success || !result.text) {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
const text = result.text.trim();
|
|
153
|
+
const jsonMatch = text.match(/\[[\s\S]*?\]/);
|
|
154
|
+
if (!jsonMatch)
|
|
155
|
+
return [];
|
|
156
|
+
const assertions = JSON.parse(jsonMatch[0]);
|
|
157
|
+
return assertions.filter((a) => a.description && a.path && a.type);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
log.warn('Failed to parse AI assertions', {
|
|
161
|
+
error: error instanceof Error ? error.message : String(error)
|
|
162
|
+
});
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=assertion-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertion-generator.js","sourceRoot":"","sources":["../../src/ai-engine/assertion-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Data Generator - AI-powered contextual test data generation
|
|
3
|
+
*
|
|
4
|
+
* Generates realistic test data based on API domain context instead of random faker data.
|
|
5
|
+
* For example: banking APIs get realistic account numbers, healthcare APIs get medical codes.
|
|
6
|
+
*
|
|
7
|
+
* @module ai-engine/context-data-generator
|
|
8
|
+
*/
|
|
9
|
+
import type { OpenAPIV3 } from 'openapi-types';
|
|
10
|
+
import type { AIConfig } from '../types/ai-config.js';
|
|
11
|
+
import type { APIContext } from '../analyzers/context-analyzer.js';
|
|
12
|
+
/**
|
|
13
|
+
* Generates contextual test data using AI
|
|
14
|
+
*
|
|
15
|
+
* @param schema - OpenAPI schema object
|
|
16
|
+
* @param apiContext - Detected API context (domain, industry, etc.)
|
|
17
|
+
* @param aiConfig - AI configuration
|
|
18
|
+
* @param realData - Optional real data to merge
|
|
19
|
+
* @returns Generated data object
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const data = await generateContextualData(schema, { domain: 'banking' }, aiConfig);
|
|
24
|
+
* // Returns: { accountNumber: "1234567890", amount: 1000.50, currency: "USD" }
|
|
25
|
+
* // Instead of: { accountNumber: "xyz123", amount: 42, currency: "abc" }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function generateContextualData(schema: OpenAPIV3.SchemaObject, apiContext: APIContext, aiConfig: AIConfig, realData?: Record<string, unknown>): Promise<any>;
|
|
29
|
+
/**
|
|
30
|
+
* Generates contextual data for multiple schemas (batch)
|
|
31
|
+
*
|
|
32
|
+
* More efficient when generating data for many endpoints
|
|
33
|
+
*/
|
|
34
|
+
export declare function generateContextualDataBatch(schemas: Array<{
|
|
35
|
+
id: string;
|
|
36
|
+
schema: OpenAPIV3.SchemaObject;
|
|
37
|
+
}>, apiContext: APIContext, aiConfig: AIConfig): Promise<Record<string, any>>;
|
|
38
|
+
//# sourceMappingURL=context-data-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-data-generator.d.ts","sourceRoot":"","sources":["../../src/ai-engine/context-data-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAOnE;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,CAAC,YAAY,EAC9B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,GAAG,CAAC,CA8Bd;AA+ED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC,YAAY,CAAA;CAAE,CAAC,EAC9D,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAmB9B"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Data Generator - AI-powered contextual test data generation
|
|
3
|
+
*
|
|
4
|
+
* Generates realistic test data based on API domain context instead of random faker data.
|
|
5
|
+
* For example: banking APIs get realistic account numbers, healthcare APIs get medical codes.
|
|
6
|
+
*
|
|
7
|
+
* @module ai-engine/context-data-generator
|
|
8
|
+
*/
|
|
9
|
+
import { createLogger } from '../utils/logger.js';
|
|
10
|
+
import { callLLM } from '../llm/ai-client.js';
|
|
11
|
+
import { generateDataFromSchemaSync } from '../generators/data-generator.js';
|
|
12
|
+
const log = createLogger('context-data-generator');
|
|
13
|
+
/**
|
|
14
|
+
* Generates contextual test data using AI
|
|
15
|
+
*
|
|
16
|
+
* @param schema - OpenAPI schema object
|
|
17
|
+
* @param apiContext - Detected API context (domain, industry, etc.)
|
|
18
|
+
* @param aiConfig - AI configuration
|
|
19
|
+
* @param realData - Optional real data to merge
|
|
20
|
+
* @returns Generated data object
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const data = await generateContextualData(schema, { domain: 'banking' }, aiConfig);
|
|
25
|
+
* // Returns: { accountNumber: "1234567890", amount: 1000.50, currency: "USD" }
|
|
26
|
+
* // Instead of: { accountNumber: "xyz123", amount: 42, currency: "abc" }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export async function generateContextualData(schema, apiContext, aiConfig, realData) {
|
|
30
|
+
// If AI disabled, use standard faker
|
|
31
|
+
if (!aiConfig.capabilities.contextualData || aiConfig.level === 'off') {
|
|
32
|
+
return generateDataFromSchemaSync(schema, { realData });
|
|
33
|
+
}
|
|
34
|
+
// Merge real data first
|
|
35
|
+
if (realData && Object.keys(realData).length > 0) {
|
|
36
|
+
const fakerData = generateDataFromSchemaSync(schema, { realData });
|
|
37
|
+
return fakerData; // Real data takes precedence
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
// Use AI for contextual generation
|
|
41
|
+
const aiData = await generateWithAI(schema, apiContext, aiConfig);
|
|
42
|
+
if (aiData) {
|
|
43
|
+
log.debug('Generated contextual data with AI', {
|
|
44
|
+
domain: apiContext.domain,
|
|
45
|
+
fields: Object.keys(aiData)
|
|
46
|
+
});
|
|
47
|
+
return aiData;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
log.warn('AI data generation failed, falling back to faker', {
|
|
52
|
+
error: error instanceof Error ? error.message : String(error)
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Fallback to faker
|
|
56
|
+
return generateDataFromSchemaSync(schema, { realData });
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generates data using AI based on context
|
|
60
|
+
*/
|
|
61
|
+
async function generateWithAI(schema, apiContext, aiConfig) {
|
|
62
|
+
// Extract field information
|
|
63
|
+
const fields = Object.entries(schema.properties || {}).map(([name, prop]) => {
|
|
64
|
+
const propSchema = prop;
|
|
65
|
+
return {
|
|
66
|
+
name,
|
|
67
|
+
type: propSchema.type,
|
|
68
|
+
format: propSchema.format,
|
|
69
|
+
example: propSchema.example,
|
|
70
|
+
description: propSchema.description
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
const required = schema.required || [];
|
|
74
|
+
const prompt = `Generate realistic test data for a ${apiContext.domain || 'general'} API.
|
|
75
|
+
|
|
76
|
+
CONTEXT:
|
|
77
|
+
- Domain: ${apiContext.domain || 'unknown'}
|
|
78
|
+
- Industry: ${apiContext.industry || 'unknown'}
|
|
79
|
+
- Entity Types: ${apiContext.entityTypes?.join(', ') || 'unknown'}
|
|
80
|
+
|
|
81
|
+
FIELDS TO GENERATE:
|
|
82
|
+
${JSON.stringify(fields, null, 2)}
|
|
83
|
+
|
|
84
|
+
REQUIRED FIELDS: ${required.join(', ')}
|
|
85
|
+
|
|
86
|
+
INSTRUCTIONS:
|
|
87
|
+
1. Generate data that makes sense for ${apiContext.domain} domain
|
|
88
|
+
2. Use realistic values (e.g., for banking: real account number formats)
|
|
89
|
+
3. Respect field types and formats
|
|
90
|
+
4. Include all required fields
|
|
91
|
+
5. Make values consistent (e.g., email domain matches company context)
|
|
92
|
+
|
|
93
|
+
Return ONLY valid JSON object with field values, no markdown:
|
|
94
|
+
{ "field1": "value1", "field2": "value2" }`;
|
|
95
|
+
const result = await callLLM(prompt, {
|
|
96
|
+
...aiConfig.llm,
|
|
97
|
+
maxTokens: 1024,
|
|
98
|
+
temperature: 0.5 // Higher temp for more varied data
|
|
99
|
+
});
|
|
100
|
+
if (!result.success || !result.text) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const text = result.text.trim();
|
|
105
|
+
const jsonMatch = text.match(/\{[\s\S]*?\}/);
|
|
106
|
+
if (!jsonMatch)
|
|
107
|
+
return null;
|
|
108
|
+
const data = JSON.parse(jsonMatch[0]);
|
|
109
|
+
// Validate generated data has required fields
|
|
110
|
+
const missingRequired = required.filter(f => !(f in data));
|
|
111
|
+
if (missingRequired.length > 0) {
|
|
112
|
+
log.warn('AI generated data missing required fields', { missingRequired });
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
return data;
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
log.warn('Failed to parse AI generated data', {
|
|
119
|
+
error: error instanceof Error ? error.message : String(error)
|
|
120
|
+
});
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Generates contextual data for multiple schemas (batch)
|
|
126
|
+
*
|
|
127
|
+
* More efficient when generating data for many endpoints
|
|
128
|
+
*/
|
|
129
|
+
export async function generateContextualDataBatch(schemas, apiContext, aiConfig) {
|
|
130
|
+
const results = {};
|
|
131
|
+
// Generate in parallel (with rate limiting)
|
|
132
|
+
const batchSize = 3;
|
|
133
|
+
for (let i = 0; i < schemas.length; i += batchSize) {
|
|
134
|
+
const batch = schemas.slice(i, i + batchSize);
|
|
135
|
+
const promises = batch.map(async ({ id, schema }) => {
|
|
136
|
+
const data = await generateContextualData(schema, apiContext, aiConfig);
|
|
137
|
+
return { id, data };
|
|
138
|
+
});
|
|
139
|
+
const batchResults = await Promise.all(promises);
|
|
140
|
+
for (const { id, data } of batchResults) {
|
|
141
|
+
results[id] = data;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return results;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=context-data-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-data-generator.js","sourceRoot":"","sources":["../../src/ai-engine/context-data-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,MAAM,GAAG,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AAEnD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAA8B,EAC9B,UAAsB,EACtB,QAAkB,EAClB,QAAkC;IAElC,qCAAqC;IACrC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACtE,OAAO,0BAA0B,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,wBAAwB;IACxB,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnE,OAAO,SAAS,CAAC,CAAC,6BAA6B;IACjD,CAAC;IAED,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAClE,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE;gBAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC5B,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,kDAAkD,EAAE;YAC3D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,OAAO,0BAA0B,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,MAA8B,EAC9B,UAAsB,EACtB,QAAkB;IAElB,4BAA4B;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QAC1E,MAAM,UAAU,GAAG,IAA8B,CAAC;QAClD,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,WAAW,EAAE,UAAU,CAAC,WAAW;SACpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAG,sCAAsC,UAAU,CAAC,MAAM,IAAI,SAAS;;;YAGzE,UAAU,CAAC,MAAM,IAAI,SAAS;cAC5B,UAAU,CAAC,QAAQ,IAAI,SAAS;kBAC5B,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS;;;EAG/D,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;;mBAEd,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;;wCAGE,UAAU,CAAC,MAAM;;;;;;;2CAOd,CAAC;IAE1C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;QACnC,GAAG,QAAQ,CAAC,GAAG;QACf,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,GAAG,CAAC,mCAAmC;KACrD,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtC,8CAA8C;QAC9C,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC3D,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC,2CAA2C,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE;YAC5C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAA8D,EAC9D,UAAsB,EACtB,QAAkB;IAElB,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,4CAA4C;IAC5C,MAAM,SAAS,GAAG,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAClD,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YACxE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,KAAK,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE,CAAC;YACxC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataFlow Detector - Automatic data flow detection
|
|
3
|
+
*
|
|
4
|
+
* Automatically detects data flows between tests (extract from responses, inject into requests).
|
|
5
|
+
* Identifies patterns like token extraction from login and injection into protected endpoints.
|
|
6
|
+
*
|
|
7
|
+
* @module ai-engine/dataflow-detector
|
|
8
|
+
*/
|
|
9
|
+
import type { TestCase } from '../types/index.js';
|
|
10
|
+
import type { AIConfig } from '../types/ai-config.js';
|
|
11
|
+
/**
|
|
12
|
+
* Data flow configuration for a test
|
|
13
|
+
*/
|
|
14
|
+
export interface DataFlowConfig {
|
|
15
|
+
/** Variables to extract from response */
|
|
16
|
+
extract?: Record<string, string>;
|
|
17
|
+
/** Variables to inject into request */
|
|
18
|
+
inject?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Detects data flows between tests automatically
|
|
22
|
+
*
|
|
23
|
+
* @param tests - Array of test cases
|
|
24
|
+
* @param dependencies - Test dependencies
|
|
25
|
+
* @param aiConfig - AI configuration
|
|
26
|
+
* @returns Data flow map (testId -> flow config)
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const flows = await detectDataFlows(tests, deps, aiConfig);
|
|
31
|
+
* // Returns:
|
|
32
|
+
* // {
|
|
33
|
+
* // "login": { extract: { "token": "body.access_token" } },
|
|
34
|
+
* // "get-profile": { inject: { "token": "header.Authorization:Bearer {value}" } }
|
|
35
|
+
* // }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function detectDataFlows(tests: TestCase[], dependencies: Record<string, string[]>, aiConfig: AIConfig): Promise<Record<string, DataFlowConfig>>;
|
|
39
|
+
/**
|
|
40
|
+
* Detects data flows using heuristic rules
|
|
41
|
+
*
|
|
42
|
+
* Rules:
|
|
43
|
+
* 1. Auth endpoints extract tokens
|
|
44
|
+
* 2. Protected endpoints inject tokens from auth
|
|
45
|
+
* 3. POST endpoints extract IDs
|
|
46
|
+
* 4. GET/PUT/DELETE endpoints inject IDs from POST
|
|
47
|
+
*
|
|
48
|
+
* @param tests - Array of test cases
|
|
49
|
+
* @param dependencies - Test dependencies
|
|
50
|
+
* @returns Data flow map
|
|
51
|
+
*/
|
|
52
|
+
export declare function detectHeuristicDataFlows(tests: TestCase[], dependencies: Record<string, string[]>): Record<string, DataFlowConfig>;
|
|
53
|
+
//# sourceMappingURL=dataflow-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataflow-detector.d.ts","sourceRoot":"","sources":["../../src/ai-engine/dataflow-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMtD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,EAAE,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACtC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CA+BzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,QAAQ,EAAE,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACrC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAuEhC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataFlow Detector - Automatic data flow detection
|
|
3
|
+
*
|
|
4
|
+
* Automatically detects data flows between tests (extract from responses, inject into requests).
|
|
5
|
+
* Identifies patterns like token extraction from login and injection into protected endpoints.
|
|
6
|
+
*
|
|
7
|
+
* @module ai-engine/dataflow-detector
|
|
8
|
+
*/
|
|
9
|
+
import { createLogger } from '../utils/logger.js';
|
|
10
|
+
import { callLLM } from '../llm/ai-client.js';
|
|
11
|
+
const log = createLogger('dataflow-detector');
|
|
12
|
+
/**
|
|
13
|
+
* Detects data flows between tests automatically
|
|
14
|
+
*
|
|
15
|
+
* @param tests - Array of test cases
|
|
16
|
+
* @param dependencies - Test dependencies
|
|
17
|
+
* @param aiConfig - AI configuration
|
|
18
|
+
* @returns Data flow map (testId -> flow config)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const flows = await detectDataFlows(tests, deps, aiConfig);
|
|
23
|
+
* // Returns:
|
|
24
|
+
* // {
|
|
25
|
+
* // "login": { extract: { "token": "body.access_token" } },
|
|
26
|
+
* // "get-profile": { inject: { "token": "header.Authorization:Bearer {value}" } }
|
|
27
|
+
* // }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export async function detectDataFlows(tests, dependencies, aiConfig) {
|
|
31
|
+
log.info('Detecting data flows', {
|
|
32
|
+
testCount: tests.length,
|
|
33
|
+
aiLevel: aiConfig.level
|
|
34
|
+
});
|
|
35
|
+
// Always use heuristic detection (free, fast, reliable)
|
|
36
|
+
const heuristicFlows = detectHeuristicDataFlows(tests, dependencies);
|
|
37
|
+
log.info('Heuristic data flows detected', {
|
|
38
|
+
count: Object.keys(heuristicFlows).length
|
|
39
|
+
});
|
|
40
|
+
// If AI capabilities enabled, enhance with AI detection
|
|
41
|
+
if (aiConfig.capabilities.autoDataFlow && aiConfig.level !== 'off') {
|
|
42
|
+
try {
|
|
43
|
+
const aiFlows = await detectAIDataFlows(tests, dependencies, aiConfig);
|
|
44
|
+
log.info('AI data flows detected', {
|
|
45
|
+
count: Object.keys(aiFlows).length
|
|
46
|
+
});
|
|
47
|
+
// Merge: heuristic takes precedence
|
|
48
|
+
return { ...aiFlows, ...heuristicFlows };
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
log.warn('AI data flow detection failed, using heuristics only', {
|
|
52
|
+
error: error instanceof Error ? error.message : String(error)
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return heuristicFlows;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Detects data flows using heuristic rules
|
|
60
|
+
*
|
|
61
|
+
* Rules:
|
|
62
|
+
* 1. Auth endpoints extract tokens
|
|
63
|
+
* 2. Protected endpoints inject tokens from auth
|
|
64
|
+
* 3. POST endpoints extract IDs
|
|
65
|
+
* 4. GET/PUT/DELETE endpoints inject IDs from POST
|
|
66
|
+
*
|
|
67
|
+
* @param tests - Array of test cases
|
|
68
|
+
* @param dependencies - Test dependencies
|
|
69
|
+
* @returns Data flow map
|
|
70
|
+
*/
|
|
71
|
+
export function detectHeuristicDataFlows(tests, dependencies) {
|
|
72
|
+
const flows = {};
|
|
73
|
+
// Find auth/login test
|
|
74
|
+
const authTest = tests.find(t => t.method === 'POST' &&
|
|
75
|
+
t.category === 'happy-path' &&
|
|
76
|
+
(t.path.includes('login') ||
|
|
77
|
+
t.path.includes('auth') ||
|
|
78
|
+
t.path.includes('token') ||
|
|
79
|
+
t.path.includes('oauth')));
|
|
80
|
+
// Rule 1: Auth test extracts token
|
|
81
|
+
if (authTest) {
|
|
82
|
+
flows[authTest.id] = {
|
|
83
|
+
extract: {
|
|
84
|
+
token: 'body.access_token',
|
|
85
|
+
// Also try common token field names
|
|
86
|
+
...(detectTokenFieldFromPath(authTest.path))
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Rule 2: Protected tests inject token
|
|
91
|
+
for (const test of tests) {
|
|
92
|
+
if (test.requiresAuth && authTest && test.id !== authTest.id) {
|
|
93
|
+
flows[test.id] = flows[test.id] || {};
|
|
94
|
+
flows[test.id].inject = {
|
|
95
|
+
token: 'header.Authorization:Bearer {value}',
|
|
96
|
+
...(flows[test.id].inject || {})
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Rules 3-4: Resource ID flows
|
|
101
|
+
for (const test of tests) {
|
|
102
|
+
if (test.category !== 'happy-path')
|
|
103
|
+
continue;
|
|
104
|
+
// Rule 3: POST extracts resource ID
|
|
105
|
+
if (test.method === 'POST' && !test.path.includes('{')) {
|
|
106
|
+
const resourceName = extractResourceName(test.path);
|
|
107
|
+
if (resourceName) {
|
|
108
|
+
flows[test.id] = flows[test.id] || {};
|
|
109
|
+
flows[test.id].extract = {
|
|
110
|
+
[`${resourceName}Id`]: `body.id`,
|
|
111
|
+
...(flows[test.id].extract || {})
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Rule 4: GET/PUT/DELETE inject ID
|
|
116
|
+
if ((test.method === 'GET' || test.method === 'PUT' || test.method === 'DELETE') &&
|
|
117
|
+
test.path.includes('{')) {
|
|
118
|
+
const deps = dependencies[test.id] || [];
|
|
119
|
+
const createTest = tests.find(t => deps.includes(t.id) && t.method === 'POST');
|
|
120
|
+
if (createTest) {
|
|
121
|
+
const resourceName = extractResourceName(createTest.path);
|
|
122
|
+
if (resourceName) {
|
|
123
|
+
flows[test.id] = flows[test.id] || {};
|
|
124
|
+
flows[test.id].inject = {
|
|
125
|
+
[`${resourceName}Id`]: `path:${test.path}`,
|
|
126
|
+
...(flows[test.id].inject || {})
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return flows;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Detects data flows using AI
|
|
136
|
+
*
|
|
137
|
+
* @param tests - Array of test cases
|
|
138
|
+
* @param dependencies - Test dependencies
|
|
139
|
+
* @param aiConfig - AI configuration
|
|
140
|
+
* @returns Data flow map
|
|
141
|
+
*/
|
|
142
|
+
async function detectAIDataFlows(tests, dependencies, aiConfig) {
|
|
143
|
+
const testSummary = tests.map(t => ({
|
|
144
|
+
id: t.id,
|
|
145
|
+
method: t.method,
|
|
146
|
+
path: t.path,
|
|
147
|
+
requiresAuth: t.requiresAuth,
|
|
148
|
+
dependencies: dependencies[t.id] || []
|
|
149
|
+
}));
|
|
150
|
+
const prompt = `Analyze these API tests and identify data flows (extract/inject patterns).
|
|
151
|
+
|
|
152
|
+
TESTS:
|
|
153
|
+
${JSON.stringify(testSummary, null, 2)}
|
|
154
|
+
|
|
155
|
+
PATTERNS TO DETECT:
|
|
156
|
+
1. Login/Auth: extract token, inject into protected endpoints
|
|
157
|
+
2. Resource creation: extract ID, inject into read/update/delete
|
|
158
|
+
3. Nested resources: extract parent ID, inject into child operations
|
|
159
|
+
|
|
160
|
+
Return ONLY JSON:
|
|
161
|
+
{
|
|
162
|
+
"dataFlows": {
|
|
163
|
+
"test-id": {
|
|
164
|
+
"extract": { "varName": "body.path.to.value" },
|
|
165
|
+
"inject": { "varName": "header.Name:format" }
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
Respond with JSON only.`;
|
|
171
|
+
const result = await callLLM(prompt, aiConfig.llm);
|
|
172
|
+
if (!result.success || !result.text) {
|
|
173
|
+
return {};
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const text = result.text.trim();
|
|
177
|
+
const jsonMatch = text.match(/\{[\s\S]*\}/);
|
|
178
|
+
if (!jsonMatch)
|
|
179
|
+
return {};
|
|
180
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
181
|
+
return parsed.dataFlows || {};
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
log.warn('Failed to parse AI data flows response', {
|
|
185
|
+
error: error instanceof Error ? error.message : String(error)
|
|
186
|
+
});
|
|
187
|
+
return {};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Detects token field name from auth endpoint path
|
|
192
|
+
*/
|
|
193
|
+
function detectTokenFieldFromPath(path) {
|
|
194
|
+
if (path.includes('oauth')) {
|
|
195
|
+
return {
|
|
196
|
+
refreshToken: 'body.refresh_token',
|
|
197
|
+
expiresIn: 'body.expires_in'
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
return {};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Extracts resource name from path
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* extractResourceName('/users') // 'user'
|
|
207
|
+
* extractResourceName('/api/products') // 'product'
|
|
208
|
+
*/
|
|
209
|
+
function extractResourceName(path) {
|
|
210
|
+
const parts = path.split('/').filter(p => p && !p.startsWith('{'));
|
|
211
|
+
if (parts.length === 0)
|
|
212
|
+
return undefined;
|
|
213
|
+
// Get last part and singularize (simple heuristic)
|
|
214
|
+
const lastPart = parts[parts.length - 1];
|
|
215
|
+
return lastPart.endsWith('s') ? lastPart.slice(0, -1) : lastPart;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=dataflow-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataflow-detector.js","sourceRoot":"","sources":["../../src/ai-engine/dataflow-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,MAAM,GAAG,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAY9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAiB,EACjB,YAAsC,EACtC,QAAkB;IAElB,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE;QAC/B,SAAS,EAAE,KAAK,CAAC,MAAM;QACvB,OAAO,EAAE,QAAQ,CAAC,KAAK;KACxB,CAAC,CAAC;IAEH,wDAAwD;IACxD,MAAM,cAAc,GAAG,wBAAwB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAErE,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE;QACxC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM;KAC1C,CAAC,CAAC;IAEH,wDAAwD;IACxD,IAAI,QAAQ,CAAC,YAAY,CAAC,YAAY,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YACvE,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE;gBACjC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM;aACnC,CAAC,CAAC;YAEH,oCAAoC;YACpC,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,sDAAsD,EAAE;gBAC/D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAiB,EACjB,YAAsC;IAEtC,MAAM,KAAK,GAAmC,EAAE,CAAC;IAEjD,uBAAuB;IACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC9B,CAAC,CAAC,MAAM,KAAK,MAAM;QACnB,CAAC,CAAC,QAAQ,KAAK,YAAY;QAC3B,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAC3B,CAAC;IAEF,mCAAmC;IACnC,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG;YACnB,OAAO,EAAE;gBACP,KAAK,EAAE,mBAAmB;gBAC1B,oCAAoC;gBACpC,GAAG,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aAC7C;SACF,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,YAAY,IAAI,QAAQ,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;YAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG;gBACtB,KAAK,EAAE,qCAAqC;gBAC5C,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;aACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY;YAAE,SAAS;QAE7C,oCAAoC;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,YAAY,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG;oBACvB,CAAC,GAAG,YAAY,IAAI,CAAC,EAAE,SAAS;oBAChC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;iBAClC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC;YAC5E,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YAE/E,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC1D,IAAI,YAAY,EAAE,CAAC;oBACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;oBACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG;wBACtB,CAAC,GAAG,YAAY,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,IAAI,EAAE;wBAC1C,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;qBACjC,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,iBAAiB,CAC9B,KAAiB,EACjB,YAAsC,EACtC,QAAkB;IAElB,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE;KACvC,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAG;;;EAGf,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;wBAiBd,CAAC;IAEvB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IAEnD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,wCAAwC,EAAE;YACjD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,IAAY;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,YAAY,EAAE,oBAAoB;YAClC,SAAS,EAAE,iBAAiB;SAC7B,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACnE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzC,mDAAmD;IACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnE,CAAC"}
|