@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,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Business Rule Generator from User Stories
|
|
3
|
+
*
|
|
4
|
+
* Converts user stories (natural language) into executable test cases
|
|
5
|
+
* using AI to interpret the business rules and map them to API endpoints.
|
|
6
|
+
*
|
|
7
|
+
* @module generators/business-rule-from-stories-generator
|
|
8
|
+
*/
|
|
9
|
+
import { callLLM } from '../llm/ai-client.js';
|
|
10
|
+
import { HeuristicDataGenerator } from './data/heuristic-data-generator.js';
|
|
11
|
+
import { generateAuthHeaders } from '../utils/auth-generator.js';
|
|
12
|
+
import { createLogger } from '../utils/logger.js';
|
|
13
|
+
const log = createLogger('business-rule-generator');
|
|
14
|
+
/**
|
|
15
|
+
* Generates test cases from user stories using AI
|
|
16
|
+
*
|
|
17
|
+
* @param userStories - Plain text user stories or business rules
|
|
18
|
+
* @param endpoints - Available API endpoints
|
|
19
|
+
* @param options - Generation options
|
|
20
|
+
* @returns Array of test cases validating the business rules
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const tests = await generateFromUserStories(
|
|
25
|
+
* "Usuario no puede transferir más de $1,000 sin 2FA",
|
|
26
|
+
* endpoints,
|
|
27
|
+
* { aiLevel: 'smart' }
|
|
28
|
+
* );
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export async function generateFromUserStories(userStories, endpoints, options = { aiLevel: 'smart' }) {
|
|
32
|
+
log.info('Generating business rule tests from user stories', {
|
|
33
|
+
userStoriesLength: userStories.length,
|
|
34
|
+
endpointCount: endpoints.length,
|
|
35
|
+
aiLevel: options.aiLevel
|
|
36
|
+
});
|
|
37
|
+
try {
|
|
38
|
+
// Build AI prompt
|
|
39
|
+
const prompt = buildUserStoryPrompt(userStories, endpoints);
|
|
40
|
+
// Call LLM
|
|
41
|
+
const result = await callLLM(prompt, {
|
|
42
|
+
maxTokens: 2048,
|
|
43
|
+
temperature: 0.3
|
|
44
|
+
});
|
|
45
|
+
if (!result.success || !result.text) {
|
|
46
|
+
log.warn('AI call failed, returning empty test array', {
|
|
47
|
+
error: result.error
|
|
48
|
+
});
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
// Parse AI response
|
|
52
|
+
const suggestions = parseAIResponse(result.text);
|
|
53
|
+
if (suggestions.length === 0) {
|
|
54
|
+
log.warn('No business rule suggestions generated');
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
// Convert suggestions to TestCase[]
|
|
58
|
+
const tests = suggestionsToTests(suggestions, endpoints);
|
|
59
|
+
log.info('Business rule tests generated', {
|
|
60
|
+
suggestionsCount: suggestions.length,
|
|
61
|
+
testsCount: tests.length
|
|
62
|
+
});
|
|
63
|
+
return tests;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
log.error('Business rule generation failed', {
|
|
67
|
+
error: error instanceof Error ? error.message : String(error)
|
|
68
|
+
});
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Builds the AI prompt for user story interpretation
|
|
74
|
+
*/
|
|
75
|
+
function buildUserStoryPrompt(userStories, endpoints) {
|
|
76
|
+
const endpointSummary = endpoints.slice(0, 20).map(e => ({
|
|
77
|
+
method: e.method,
|
|
78
|
+
path: e.path,
|
|
79
|
+
summary: e.operation?.summary || e.operation?.description,
|
|
80
|
+
hasRequestBody: !!e.requestBody,
|
|
81
|
+
requiredFields: extractRequiredFields(e)
|
|
82
|
+
}));
|
|
83
|
+
return `Map user stories to API test cases that validate business rules.
|
|
84
|
+
|
|
85
|
+
USER STORIES:
|
|
86
|
+
${userStories}
|
|
87
|
+
|
|
88
|
+
AVAILABLE ENDPOINTS:
|
|
89
|
+
${JSON.stringify(endpointSummary, null, 2)}
|
|
90
|
+
|
|
91
|
+
INSTRUCTIONS:
|
|
92
|
+
For each business rule in the user stories, create test cases that validate it.
|
|
93
|
+
|
|
94
|
+
Guidelines:
|
|
95
|
+
1. Identify which endpoint(s) the rule applies to
|
|
96
|
+
2. Create specific test scenarios (both valid and invalid cases)
|
|
97
|
+
3. Include bodyHints with concrete values that trigger the rule
|
|
98
|
+
4. Specify the expected HTTP status code and error message
|
|
99
|
+
5. Explain why this test validates the business rule
|
|
100
|
+
|
|
101
|
+
Return JSON array:
|
|
102
|
+
[
|
|
103
|
+
{
|
|
104
|
+
"storyId": "rule-001",
|
|
105
|
+
"testName": "Transfer over $1000 without 2FA should fail",
|
|
106
|
+
"endpoint": { "method": "POST", "path": "/api/transfers" },
|
|
107
|
+
"bodyHints": { "amount": 1001, "twoFactorCode": null },
|
|
108
|
+
"expectedStatus": 403,
|
|
109
|
+
"expectedError": "2FA required for amounts over $1,000",
|
|
110
|
+
"rationale": "Validates transfer limit security rule"
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
Respond with ONLY the JSON array, no markdown formatting.`;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Extracts required fields from an endpoint's request body
|
|
118
|
+
*/
|
|
119
|
+
function extractRequiredFields(endpoint) {
|
|
120
|
+
if (!endpoint.requestBody || endpoint.requestBody.type !== 'object') {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
return endpoint.requestBody.required || [];
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Parses the AI response text into BusinessRuleSuggestion[]
|
|
127
|
+
*/
|
|
128
|
+
function parseAIResponse(text) {
|
|
129
|
+
try {
|
|
130
|
+
// Remove markdown code blocks if present
|
|
131
|
+
const cleanText = text
|
|
132
|
+
.replace(/```json\s*/g, '')
|
|
133
|
+
.replace(/```\s*/g, '')
|
|
134
|
+
.trim();
|
|
135
|
+
// Extract JSON array
|
|
136
|
+
const jsonMatch = cleanText.match(/\[[\s\S]*?\]/);
|
|
137
|
+
if (!jsonMatch) {
|
|
138
|
+
log.warn('No JSON array found in AI response');
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
const suggestions = JSON.parse(jsonMatch[0]);
|
|
142
|
+
if (!Array.isArray(suggestions)) {
|
|
143
|
+
log.warn('AI response is not an array');
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
// Validate suggestions
|
|
147
|
+
return suggestions.filter(s => s.storyId &&
|
|
148
|
+
s.testName &&
|
|
149
|
+
s.endpoint?.method &&
|
|
150
|
+
s.endpoint?.path &&
|
|
151
|
+
s.expectedStatus);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
log.error('Failed to parse AI response', {
|
|
155
|
+
error: error instanceof Error ? error.message : String(error)
|
|
156
|
+
});
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Converts AI suggestions into executable TestCase objects
|
|
162
|
+
*/
|
|
163
|
+
function suggestionsToTests(suggestions, endpoints) {
|
|
164
|
+
const dataGen = new HeuristicDataGenerator();
|
|
165
|
+
const tests = [];
|
|
166
|
+
for (let i = 0; i < suggestions.length; i++) {
|
|
167
|
+
const suggestion = suggestions[i];
|
|
168
|
+
// Find matching endpoint
|
|
169
|
+
const endpoint = endpoints.find(e => e.method.toUpperCase() === suggestion.endpoint.method.toUpperCase() &&
|
|
170
|
+
e.path === suggestion.endpoint.path);
|
|
171
|
+
if (!endpoint) {
|
|
172
|
+
log.warn('Endpoint not found for suggestion', {
|
|
173
|
+
method: suggestion.endpoint.method,
|
|
174
|
+
path: suggestion.endpoint.path
|
|
175
|
+
});
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
// Generate base body from schema
|
|
179
|
+
let body = undefined;
|
|
180
|
+
if (endpoint.requestBody) {
|
|
181
|
+
try {
|
|
182
|
+
body = dataGen.generateSync(endpoint.requestBody);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
log.warn('Failed to generate base body', {
|
|
186
|
+
endpoint: endpoint.path,
|
|
187
|
+
error: error instanceof Error ? error.message : String(error)
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Apply AI bodyHints to override specific fields
|
|
192
|
+
if (suggestion.bodyHints && typeof body === 'object' && body !== null) {
|
|
193
|
+
body = { ...body, ...suggestion.bodyHints };
|
|
194
|
+
}
|
|
195
|
+
else if (suggestion.bodyHints) {
|
|
196
|
+
body = suggestion.bodyHints;
|
|
197
|
+
}
|
|
198
|
+
// Generate auth headers
|
|
199
|
+
const headers = generateAuthHeaders(endpoint.securitySchemes || []);
|
|
200
|
+
// Create test case
|
|
201
|
+
const testCase = {
|
|
202
|
+
id: `business-rule-${i + 1}`,
|
|
203
|
+
name: suggestion.testName,
|
|
204
|
+
description: suggestion.rationale,
|
|
205
|
+
category: 'business-rule',
|
|
206
|
+
method: endpoint.method,
|
|
207
|
+
path: endpoint.path,
|
|
208
|
+
pathParams: {},
|
|
209
|
+
queryParams: (suggestion.queryParams || {}),
|
|
210
|
+
headers,
|
|
211
|
+
body,
|
|
212
|
+
expectedStatus: suggestion.expectedStatus,
|
|
213
|
+
validateSchema: false, // Business rules may intentionally violate schema
|
|
214
|
+
origin: 'ai',
|
|
215
|
+
confidence: 'low'
|
|
216
|
+
};
|
|
217
|
+
// Add expected error if provided
|
|
218
|
+
if (suggestion.expectedError) {
|
|
219
|
+
testCase.expectedError = {
|
|
220
|
+
message: suggestion.expectedError
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
tests.push(testCase);
|
|
224
|
+
}
|
|
225
|
+
return tests;
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=business-rule-from-stories-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"business-rule-from-stories-generator.js","sourceRoot":"","sources":["../../src/generators/business-rule-from-stories-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AAmBpD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,WAAmB,EACnB,SAA2B,EAC3B,UAA+B,EAAE,OAAO,EAAE,OAAO,EAAE;IAEnD,GAAG,CAAC,IAAI,CAAC,kDAAkD,EAAE;QAC3D,iBAAiB,EAAE,WAAW,CAAC,MAAM;QACrC,aAAa,EAAE,SAAS,CAAC,MAAM;QAC/B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,kBAAkB;QAClB,MAAM,MAAM,GAAG,oBAAoB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAE5D,WAAW;QACX,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;YACnC,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,GAAG;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,4CAA4C,EAAE;gBACrD,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,oBAAoB;QACpB,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,oCAAoC;QACpC,MAAM,KAAK,GAAG,kBAAkB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEzD,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE;YACxC,gBAAgB,EAAE,WAAW,CAAC,MAAM;YACpC,UAAU,EAAE,KAAK,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE;YAC3C,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,oBAAoB,CAC3B,WAAmB,EACnB,SAA2B;IAE3B,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW;QACzD,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW;QAC/B,cAAc,EAAE,qBAAqB,CAAC,CAAC,CAAC;KACzC,CAAC,CAAC,CAAC;IAEJ,OAAO;;;EAGP,WAAW;;;EAGX,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;0DAyBgB,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,QAAwB;IACrD,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,yCAAyC;QACzC,MAAM,SAAS,GAAG,IAAI;aACnB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;aAC1B,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;aACtB,IAAI,EAAE,CAAC;QAEV,qBAAqB;QACrB,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAC/C,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACxC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,uBAAuB;QACvB,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC5B,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,QAAQ,EAAE,MAAM;YAClB,CAAC,CAAC,QAAQ,EAAE,IAAI;YAChB,CAAC,CAAC,cAAc,CACjB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE;YACvC,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,kBAAkB,CACzB,WAAqC,EACrC,SAA2B;IAE3B,MAAM,OAAO,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAElC,yBAAyB;QACzB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,CACF,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE;YACnE,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,QAAQ,CAAC,IAAI,CACtC,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE;gBAC5C,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM;gBAClC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI;aAC/B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,iCAAiC;QACjC,IAAI,IAAI,GAAY,SAAS,CAAC;QAC9B,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE;oBACvC,QAAQ,EAAE,QAAQ,CAAC,IAAI;oBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,iDAAiD;QACjD,IAAI,UAAU,CAAC,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACtE,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;QAC9C,CAAC;aAAM,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC;QAC9B,CAAC;QAED,wBAAwB;QACxB,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;QAEpE,mBAAmB;QACnB,MAAM,QAAQ,GAAa;YACzB,EAAE,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE;YAC5B,IAAI,EAAE,UAAU,CAAC,QAAQ;YACzB,WAAW,EAAE,UAAU,CAAC,SAAS;YACjC,QAAQ,EAAE,eAAe;YACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,UAAU,EAAE,EAAE;YACd,WAAW,EAAE,CAAC,UAAU,CAAC,WAAW,IAAI,EAAE,CAA8C;YACxF,OAAO;YACP,IAAI;YACJ,cAAc,EAAE,UAAU,CAAC,cAAc;YACzC,cAAc,EAAE,KAAK,EAAE,kDAAkD;YACzE,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,KAAK;SAClB,CAAC;QAEF,iCAAiC;QACjC,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;YAC7B,QAAQ,CAAC,aAAa,GAAG;gBACvB,OAAO,EAAE,UAAU,CAAC,aAAa;aAClC,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI-Powered Data Generator
|
|
3
|
+
*
|
|
4
|
+
* Extends heuristic generation with LLM calls for critical fields.
|
|
5
|
+
* Falls back to Faker when AI is unavailable or fails.
|
|
6
|
+
*
|
|
7
|
+
* @module generators/data/ai-data-generator
|
|
8
|
+
*/
|
|
9
|
+
import type { OpenAPIV3 } from 'openapi-types';
|
|
10
|
+
import { HeuristicDataGenerator } from './heuristic-data-generator.js';
|
|
11
|
+
import type { GeneratorOptions } from './base-generator.js';
|
|
12
|
+
/**
|
|
13
|
+
* AI-enhanced data generator.
|
|
14
|
+
* Uses LLM for critical endpoint properties; Faker otherwise.
|
|
15
|
+
*/
|
|
16
|
+
export declare class AIDataGenerator extends HeuristicDataGenerator {
|
|
17
|
+
constructor(seed?: number);
|
|
18
|
+
/**
|
|
19
|
+
* Override hook to inject AI-generated values
|
|
20
|
+
*/
|
|
21
|
+
protected tryAIGeneration(schema: OpenAPIV3.SchemaObject, options: GeneratorOptions, propertyName?: string): Promise<unknown>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=ai-data-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-data-generator.d.ts","sourceRoot":"","sources":["../../../src/generators/data/ai-data-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,sBAAsB;gBAC7C,IAAI,CAAC,EAAE,MAAM;IAIzB;;OAEG;cACsB,eAAe,CACtC,MAAM,EAAE,SAAS,CAAC,YAAY,EAC9B,OAAO,EAAE,gBAAgB,EACzB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC;CAoBpB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI-Powered Data Generator
|
|
3
|
+
*
|
|
4
|
+
* Extends heuristic generation with LLM calls for critical fields.
|
|
5
|
+
* Falls back to Faker when AI is unavailable or fails.
|
|
6
|
+
*
|
|
7
|
+
* @module generators/data/ai-data-generator
|
|
8
|
+
*/
|
|
9
|
+
import { HeuristicDataGenerator } from './heuristic-data-generator.js';
|
|
10
|
+
import { generateValueWithAI, isCriticalEndpoint } from '../../llm/data-generator-ai.js';
|
|
11
|
+
/**
|
|
12
|
+
* AI-enhanced data generator.
|
|
13
|
+
* Uses LLM for critical endpoint properties; Faker otherwise.
|
|
14
|
+
*/
|
|
15
|
+
export class AIDataGenerator extends HeuristicDataGenerator {
|
|
16
|
+
constructor(seed) {
|
|
17
|
+
super(seed);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Override hook to inject AI-generated values
|
|
21
|
+
*/
|
|
22
|
+
async tryAIGeneration(schema, options, propertyName) {
|
|
23
|
+
const { aiMode = 'faker', apiContext } = options;
|
|
24
|
+
if (aiMode === 'faker' || !propertyName)
|
|
25
|
+
return undefined;
|
|
26
|
+
const shouldUseAI = aiMode === 'ai-only' ||
|
|
27
|
+
(aiMode === 'hybrid' && isCriticalEndpoint(apiContext));
|
|
28
|
+
if (!shouldUseAI)
|
|
29
|
+
return undefined;
|
|
30
|
+
try {
|
|
31
|
+
const aiValue = await generateValueWithAI(schema, propertyName, apiContext);
|
|
32
|
+
if (aiValue !== null)
|
|
33
|
+
return aiValue;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// AI failed, fall through to faker
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ai-data-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-data-generator.js","sourceRoot":"","sources":["../../../src/generators/data/ai-data-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzF;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,sBAAsB;IACzD,YAAY,IAAa;QACvB,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAED;;OAEG;IACgB,KAAK,CAAC,eAAe,CACtC,MAA8B,EAC9B,OAAyB,EACzB,YAAqB;QAErB,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAEjD,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,YAAY;YAAE,OAAO,SAAS,CAAC;QAE1D,MAAM,WAAW,GACf,MAAM,KAAK,SAAS;YACpB,CAAC,MAAM,KAAK,QAAQ,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;QAE1D,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YAC5E,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,OAAO,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Data Generator - Template Method Pattern
|
|
3
|
+
*
|
|
4
|
+
* Defines the skeleton algorithm for data generation.
|
|
5
|
+
* Subclasses implement specific generation strategies.
|
|
6
|
+
*
|
|
7
|
+
* @module generators/data/base-generator
|
|
8
|
+
*/
|
|
9
|
+
import type { OpenAPIV3 } from 'openapi-types';
|
|
10
|
+
import type { AILevel } from '../../types/ai-config.js';
|
|
11
|
+
import type { APIContext } from '../../llm/data-generator-ai.js';
|
|
12
|
+
/**
|
|
13
|
+
* Options for data generation
|
|
14
|
+
*/
|
|
15
|
+
export interface GeneratorOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Whether to include optional fields
|
|
18
|
+
* @default true
|
|
19
|
+
*/
|
|
20
|
+
includeOptional?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Seed for reproducible random data generation
|
|
23
|
+
*/
|
|
24
|
+
seed?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Real test data to use instead of faker (for valid/happy path tests)
|
|
27
|
+
* If provided, will use these values for matching property names
|
|
28
|
+
*/
|
|
29
|
+
realData?: Record<string, unknown>;
|
|
30
|
+
/**
|
|
31
|
+
* Whether to prefer examples from schema over faker
|
|
32
|
+
* @default true
|
|
33
|
+
*/
|
|
34
|
+
useExamples?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* AI generation mode
|
|
37
|
+
* - 'faker': Only use Faker.js (default, fast)
|
|
38
|
+
* - 'hybrid': Use AI for critical endpoints, Faker for others (recommended)
|
|
39
|
+
* - 'ai-only': Always use AI (slow, most realistic)
|
|
40
|
+
* @default 'faker'
|
|
41
|
+
*/
|
|
42
|
+
aiMode?: 'faker' | 'hybrid' | 'ai-only';
|
|
43
|
+
/**
|
|
44
|
+
* API context for intelligent data generation
|
|
45
|
+
* Used when aiMode is 'hybrid' or 'ai-only'
|
|
46
|
+
*/
|
|
47
|
+
apiContext?: APIContext;
|
|
48
|
+
/**
|
|
49
|
+
* AI level for test generation
|
|
50
|
+
* Maps to aiMode: off→faker, basic/smart→hybrid, advanced→ai-only
|
|
51
|
+
*/
|
|
52
|
+
aiLevel?: AILevel;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Converts aiLevel to aiMode for data generation
|
|
56
|
+
* Mapping: off→faker, basic/smart→hybrid, advanced→ai-only
|
|
57
|
+
*
|
|
58
|
+
* @param aiLevel - AI level from configuration
|
|
59
|
+
* @param aiMode - Explicit AI mode (takes precedence if provided)
|
|
60
|
+
* @returns Effective AI mode to use for generation
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* aiLevelToMode('advanced') // Returns 'ai-only'
|
|
65
|
+
* aiLevelToMode('smart') // Returns 'hybrid'
|
|
66
|
+
* aiLevelToMode('off') // Returns 'faker'
|
|
67
|
+
* aiLevelToMode('smart', 'ai-only') // Returns 'ai-only' (explicit mode wins)
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare function aiLevelToMode(aiLevel?: AILevel, aiMode?: GeneratorOptions['aiMode']): GeneratorOptions['aiMode'];
|
|
71
|
+
/**
|
|
72
|
+
* Strategy interface for type-specific value generation
|
|
73
|
+
*/
|
|
74
|
+
export interface TypeGenerationStrategy {
|
|
75
|
+
/**
|
|
76
|
+
* Generate a value for the given schema
|
|
77
|
+
*/
|
|
78
|
+
generate(schema: OpenAPIV3.SchemaObject, includeOptional: boolean, options: GeneratorOptions, propertyName?: string): Promise<unknown>;
|
|
79
|
+
/**
|
|
80
|
+
* Generate synchronously (faker only, no AI)
|
|
81
|
+
*/
|
|
82
|
+
generateSync(schema: OpenAPIV3.SchemaObject, includeOptional: boolean, options: GeneratorOptions, propertyName?: string): unknown;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Template Method base class for data generation.
|
|
86
|
+
* Defines the algorithm skeleton; subclasses provide strategies.
|
|
87
|
+
*/
|
|
88
|
+
export declare abstract class BaseDataGenerator {
|
|
89
|
+
protected strategies: Map<string, TypeGenerationStrategy>;
|
|
90
|
+
/**
|
|
91
|
+
* Template method - generates a value for a schema (async)
|
|
92
|
+
*/
|
|
93
|
+
generateValue(schema: OpenAPIV3.SchemaObject, includeOptional: boolean, options: GeneratorOptions, propertyName?: string): Promise<unknown>;
|
|
94
|
+
/**
|
|
95
|
+
* Template method - generates a value synchronously (faker only)
|
|
96
|
+
*/
|
|
97
|
+
generateValueSync(schema: OpenAPIV3.SchemaObject, includeOptional: boolean, options: GeneratorOptions, propertyName?: string): unknown;
|
|
98
|
+
/**
|
|
99
|
+
* Hook method - AI generation. Override in AI-capable subclasses.
|
|
100
|
+
* Returns undefined to fall through to faker generation.
|
|
101
|
+
*/
|
|
102
|
+
protected tryAIGeneration(_schema: OpenAPIV3.SchemaObject, _options: GeneratorOptions, _propertyName?: string): Promise<unknown>;
|
|
103
|
+
/**
|
|
104
|
+
* Handle enum generation (shared between sync/async)
|
|
105
|
+
*/
|
|
106
|
+
protected generateEnum(schema: OpenAPIV3.SchemaObject): unknown;
|
|
107
|
+
/**
|
|
108
|
+
* Handle composite schemas (allOf, oneOf, anyOf) - async
|
|
109
|
+
*/
|
|
110
|
+
protected handleCompositeSchema(schema: OpenAPIV3.SchemaObject, includeOptional: boolean, options: GeneratorOptions, propertyName?: string): Promise<unknown>;
|
|
111
|
+
/**
|
|
112
|
+
* Handle composite schemas (allOf, oneOf, anyOf) - sync
|
|
113
|
+
*/
|
|
114
|
+
protected handleCompositeSchemaSync(schema: OpenAPIV3.SchemaObject, includeOptional: boolean, options: GeneratorOptions, propertyName?: string): unknown;
|
|
115
|
+
/**
|
|
116
|
+
* Dispatch to appropriate type strategy
|
|
117
|
+
*/
|
|
118
|
+
protected dispatchByType(schema: OpenAPIV3.SchemaObject, includeOptional: boolean, options: GeneratorOptions, propertyName: string | undefined, sync: true): unknown;
|
|
119
|
+
protected dispatchByType(schema: OpenAPIV3.SchemaObject, includeOptional: boolean, options: GeneratorOptions, propertyName: string | undefined, sync: false): Promise<unknown>;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=base-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-generator.d.ts","sourceRoot":"","sources":["../../../src/generators/data/base-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Data Generator - Template Method Pattern
|
|
3
|
+
*
|
|
4
|
+
* Defines the skeleton algorithm for data generation.
|
|
5
|
+
* Subclasses implement specific generation strategies.
|
|
6
|
+
*
|
|
7
|
+
* @module generators/data/base-generator
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Converts aiLevel to aiMode for data generation
|
|
11
|
+
* Mapping: off→faker, basic/smart→hybrid, advanced→ai-only
|
|
12
|
+
*
|
|
13
|
+
* @param aiLevel - AI level from configuration
|
|
14
|
+
* @param aiMode - Explicit AI mode (takes precedence if provided)
|
|
15
|
+
* @returns Effective AI mode to use for generation
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* aiLevelToMode('advanced') // Returns 'ai-only'
|
|
20
|
+
* aiLevelToMode('smart') // Returns 'hybrid'
|
|
21
|
+
* aiLevelToMode('off') // Returns 'faker'
|
|
22
|
+
* aiLevelToMode('smart', 'ai-only') // Returns 'ai-only' (explicit mode wins)
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function aiLevelToMode(aiLevel, aiMode) {
|
|
26
|
+
if (aiMode)
|
|
27
|
+
return aiMode;
|
|
28
|
+
if (!aiLevel || aiLevel === 'off')
|
|
29
|
+
return 'faker';
|
|
30
|
+
switch (aiLevel) {
|
|
31
|
+
case 'basic':
|
|
32
|
+
case 'smart':
|
|
33
|
+
return 'hybrid';
|
|
34
|
+
case 'advanced':
|
|
35
|
+
return 'ai-only';
|
|
36
|
+
default:
|
|
37
|
+
return 'faker';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Template Method base class for data generation.
|
|
42
|
+
* Defines the algorithm skeleton; subclasses provide strategies.
|
|
43
|
+
*/
|
|
44
|
+
export class BaseDataGenerator {
|
|
45
|
+
strategies = new Map();
|
|
46
|
+
/**
|
|
47
|
+
* Template method - generates a value for a schema (async)
|
|
48
|
+
*/
|
|
49
|
+
async generateValue(schema, includeOptional, options, propertyName) {
|
|
50
|
+
const { realData, useExamples = true } = options;
|
|
51
|
+
// Priority 1: Use realData if provided and property name matches
|
|
52
|
+
if (realData && propertyName && propertyName in realData) {
|
|
53
|
+
return realData[propertyName];
|
|
54
|
+
}
|
|
55
|
+
// Priority 2: Use example from schema if available and useExamples is true
|
|
56
|
+
if (useExamples && schema.example !== undefined) {
|
|
57
|
+
return schema.example;
|
|
58
|
+
}
|
|
59
|
+
// Priority 3: AI generation hook (override in subclasses)
|
|
60
|
+
const aiValue = await this.tryAIGeneration(schema, options, propertyName);
|
|
61
|
+
if (aiValue !== undefined) {
|
|
62
|
+
return aiValue;
|
|
63
|
+
}
|
|
64
|
+
// Priority 4: Handle enum
|
|
65
|
+
if (schema.enum) {
|
|
66
|
+
return this.generateEnum(schema);
|
|
67
|
+
}
|
|
68
|
+
// Handle oneOf, anyOf, allOf
|
|
69
|
+
const compositeValue = await this.handleCompositeSchema(schema, includeOptional, options, propertyName);
|
|
70
|
+
if (compositeValue !== undefined) {
|
|
71
|
+
return compositeValue;
|
|
72
|
+
}
|
|
73
|
+
// Handle type-specific generation
|
|
74
|
+
return this.dispatchByType(schema, includeOptional, options, propertyName, false);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Template method - generates a value synchronously (faker only)
|
|
78
|
+
*/
|
|
79
|
+
generateValueSync(schema, includeOptional, options, propertyName) {
|
|
80
|
+
const { realData, useExamples = true } = options;
|
|
81
|
+
// Priority 1: Use realData if provided and property name matches
|
|
82
|
+
if (realData && propertyName && propertyName in realData) {
|
|
83
|
+
return realData[propertyName];
|
|
84
|
+
}
|
|
85
|
+
// Priority 2: Use example from schema if available and useExamples is true
|
|
86
|
+
if (useExamples && schema.example !== undefined) {
|
|
87
|
+
return schema.example;
|
|
88
|
+
}
|
|
89
|
+
// Handle enum
|
|
90
|
+
if (schema.enum) {
|
|
91
|
+
return this.generateEnum(schema);
|
|
92
|
+
}
|
|
93
|
+
// Handle oneOf, anyOf, allOf (sync)
|
|
94
|
+
const compositeValue = this.handleCompositeSchemaSync(schema, includeOptional, options, propertyName);
|
|
95
|
+
if (compositeValue !== undefined) {
|
|
96
|
+
return compositeValue;
|
|
97
|
+
}
|
|
98
|
+
// Handle type-specific generation
|
|
99
|
+
return this.dispatchByType(schema, includeOptional, options, propertyName, true);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Hook method - AI generation. Override in AI-capable subclasses.
|
|
103
|
+
* Returns undefined to fall through to faker generation.
|
|
104
|
+
*/
|
|
105
|
+
async tryAIGeneration(_schema, _options, _propertyName) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Handle enum generation (shared between sync/async)
|
|
110
|
+
*/
|
|
111
|
+
generateEnum(schema) {
|
|
112
|
+
const strategy = this.strategies.get('enum');
|
|
113
|
+
if (strategy) {
|
|
114
|
+
return strategy.generateSync(schema, true, {});
|
|
115
|
+
}
|
|
116
|
+
// Fallback
|
|
117
|
+
if (schema.enum && schema.enum.length > 0) {
|
|
118
|
+
const idx = Math.floor(Math.random() * schema.enum.length);
|
|
119
|
+
return schema.enum[idx];
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Handle composite schemas (allOf, oneOf, anyOf) - async
|
|
125
|
+
*/
|
|
126
|
+
async handleCompositeSchema(schema, includeOptional, options, propertyName) {
|
|
127
|
+
if (schema.oneOf && schema.oneOf.length > 0) {
|
|
128
|
+
const subSchema = schema.oneOf[0];
|
|
129
|
+
if ('$ref' in subSchema)
|
|
130
|
+
throw new Error('$ref in oneOf not supported - spec should be dereferenced');
|
|
131
|
+
return await this.generateValue(subSchema, includeOptional, options, propertyName);
|
|
132
|
+
}
|
|
133
|
+
if (schema.anyOf && schema.anyOf.length > 0) {
|
|
134
|
+
const subSchema = schema.anyOf[0];
|
|
135
|
+
if ('$ref' in subSchema)
|
|
136
|
+
throw new Error('$ref in anyOf not supported - spec should be dereferenced');
|
|
137
|
+
return await this.generateValue(subSchema, includeOptional, options, propertyName);
|
|
138
|
+
}
|
|
139
|
+
if (schema.allOf) {
|
|
140
|
+
const merged = {};
|
|
141
|
+
for (const subSchema of schema.allOf) {
|
|
142
|
+
if ('$ref' in subSchema)
|
|
143
|
+
throw new Error('$ref in allOf not supported - spec should be dereferenced');
|
|
144
|
+
Object.assign(merged, subSchema);
|
|
145
|
+
}
|
|
146
|
+
return await this.generateValue(merged, includeOptional, options, propertyName);
|
|
147
|
+
}
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Handle composite schemas (allOf, oneOf, anyOf) - sync
|
|
152
|
+
*/
|
|
153
|
+
handleCompositeSchemaSync(schema, includeOptional, options, propertyName) {
|
|
154
|
+
if (schema.oneOf && schema.oneOf.length > 0) {
|
|
155
|
+
const subSchema = schema.oneOf[0];
|
|
156
|
+
if ('$ref' in subSchema)
|
|
157
|
+
throw new Error('$ref in oneOf not supported - spec should be dereferenced');
|
|
158
|
+
return this.generateValueSync(subSchema, includeOptional, options, propertyName);
|
|
159
|
+
}
|
|
160
|
+
if (schema.anyOf && schema.anyOf.length > 0) {
|
|
161
|
+
const subSchema = schema.anyOf[0];
|
|
162
|
+
if ('$ref' in subSchema)
|
|
163
|
+
throw new Error('$ref in anyOf not supported - spec should be dereferenced');
|
|
164
|
+
return this.generateValueSync(subSchema, includeOptional, options, propertyName);
|
|
165
|
+
}
|
|
166
|
+
if (schema.allOf) {
|
|
167
|
+
const merged = {};
|
|
168
|
+
for (const subSchema of schema.allOf) {
|
|
169
|
+
if ('$ref' in subSchema)
|
|
170
|
+
throw new Error('$ref in allOf not supported - spec should be dereferenced');
|
|
171
|
+
Object.assign(merged, subSchema);
|
|
172
|
+
}
|
|
173
|
+
return this.generateValueSync(merged, includeOptional, options, propertyName);
|
|
174
|
+
}
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
dispatchByType(schema, includeOptional, options, propertyName, sync) {
|
|
178
|
+
if (!schema.type) {
|
|
179
|
+
const strategy = this.strategies.get('string');
|
|
180
|
+
if (!strategy)
|
|
181
|
+
return sync ? '' : Promise.resolve('');
|
|
182
|
+
return sync
|
|
183
|
+
? strategy.generateSync(schema, includeOptional, options, propertyName)
|
|
184
|
+
: strategy.generate(schema, includeOptional, options, propertyName);
|
|
185
|
+
}
|
|
186
|
+
const strategy = this.strategies.get(schema.type);
|
|
187
|
+
if (!strategy) {
|
|
188
|
+
const fallback = this.strategies.get('string');
|
|
189
|
+
if (!fallback)
|
|
190
|
+
return sync ? '' : Promise.resolve('');
|
|
191
|
+
return sync
|
|
192
|
+
? fallback.generateSync(schema, includeOptional, options, propertyName)
|
|
193
|
+
: fallback.generate(schema, includeOptional, options, propertyName);
|
|
194
|
+
}
|
|
195
|
+
return sync
|
|
196
|
+
? strategy.generateSync(schema, includeOptional, options, propertyName)
|
|
197
|
+
: strategy.generate(schema, includeOptional, options, propertyName);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=base-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-generator.js","sourceRoot":"","sources":["../../../src/generators/data/base-generator.ts"],"names":[],"mappings":"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"}
|