api-tests-coverage 1.0.20 → 1.0.22
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/README.md +3 -7
- package/dist/dashboard/assets/{_basePickBy-DZR484hj.js → _basePickBy-DiDMiru0.js} +1 -1
- package/dist/dashboard/{dist/assets/_baseUniq-Bwm426M6.js → assets/_baseUniq-CFoKRFhS.js} +1 -1
- package/dist/dashboard/{dist/assets/arc-51ef6HeW.js → assets/arc-B2fWu2mo.js} +1 -1
- package/dist/dashboard/{dist/assets/architectureDiagram-VXUJARFQ-Boahc5dR.js → assets/architectureDiagram-VXUJARFQ-DpIe4yWB.js} +1 -1
- package/dist/dashboard/assets/{blockDiagram-VD42YOAC-BvkiW8lj.js → blockDiagram-VD42YOAC-CKAgfH2X.js} +1 -1
- package/dist/dashboard/{dist/assets/c4Diagram-YG6GDRKO-Bww0QPxL.js → assets/c4Diagram-YG6GDRKO-CUtb-R__.js} +1 -1
- package/dist/dashboard/assets/channel-B9iMjZmm.js +1 -0
- package/dist/dashboard/assets/{chunk-4BX2VUAB-BrU7mtb9.js → chunk-4BX2VUAB-C3CSqwcX.js} +1 -1
- package/dist/dashboard/assets/{chunk-55IACEB6-DwsmCNp_.js → chunk-55IACEB6-CV8VzOOp.js} +1 -1
- package/dist/dashboard/{dist/assets/chunk-B4BG7PRW-B7YfMggR.js → assets/chunk-B4BG7PRW-URwnN3Q_.js} +1 -1
- package/dist/dashboard/{dist/assets/chunk-DI55MBZ5-B-xsiGYI.js → assets/chunk-DI55MBZ5-CV_d-z8j.js} +1 -1
- package/dist/dashboard/assets/{chunk-FMBD7UC4-DRb5NEMr.js → chunk-FMBD7UC4-8DJI9OkS.js} +1 -1
- package/dist/dashboard/assets/{chunk-QN33PNHL-BRSlHScq.js → chunk-QN33PNHL-pVzUBBoU.js} +1 -1
- package/dist/dashboard/assets/{chunk-QZHKN3VN-Cix7nLqx.js → chunk-QZHKN3VN-DCGN273N.js} +1 -1
- package/dist/dashboard/assets/{chunk-TZMSLE5B-BtXpcWN4.js → chunk-TZMSLE5B-D0wY-rJ0.js} +1 -1
- package/dist/dashboard/assets/classDiagram-2ON5EDUG-BNi5TogT.js +1 -0
- package/dist/dashboard/assets/classDiagram-v2-WZHVMYZB-BNi5TogT.js +1 -0
- package/dist/dashboard/assets/clone-m2eeeKVa.js +1 -0
- package/dist/dashboard/{dist/assets/cose-bilkent-S5V4N54A-BUkL7Wtq.js → assets/cose-bilkent-S5V4N54A-BIRyRYk0.js} +1 -1
- package/dist/dashboard/assets/{dagre-6UL2VRFP-DgEqrxGj.js → dagre-6UL2VRFP-KVIfxT9V.js} +1 -1
- package/dist/dashboard/assets/{diagram-PSM6KHXK-Y-M5J_PO.js → diagram-PSM6KHXK-VUmdxoiM.js} +1 -1
- package/dist/dashboard/assets/{diagram-QEK2KX5R-BXMS0hEZ.js → diagram-QEK2KX5R-LQ9k2vBy.js} +1 -1
- package/dist/dashboard/{dist/assets/diagram-S2PKOQOG--oRtrIMC.js → assets/diagram-S2PKOQOG-DIDe2of5.js} +1 -1
- package/dist/dashboard/{dist/assets/erDiagram-Q2GNP2WA-D0MbudeO.js → assets/erDiagram-Q2GNP2WA-CpMIyDcr.js} +1 -1
- package/dist/dashboard/{dist/assets/flowDiagram-NV44I4VS-1j044bLK.js → assets/flowDiagram-NV44I4VS-DR2nUASu.js} +1 -1
- package/dist/dashboard/assets/{ganttDiagram-JELNMOA3-Cjy_BOl2.js → ganttDiagram-JELNMOA3-C3J3WvDp.js} +1 -1
- package/dist/dashboard/{dist/assets/gitGraphDiagram-V2S2FVAM-CuJ5l3TK.js → assets/gitGraphDiagram-V2S2FVAM-C5V2Xlzu.js} +1 -1
- package/dist/dashboard/assets/{graph-BVGuJ5gs.js → graph-GSdi8Xy9.js} +1 -1
- package/dist/dashboard/{dist/assets/index-D3sRJga7.js → assets/index-Bhd7ZvcY.js} +82 -82
- package/dist/dashboard/assets/{infoDiagram-HS3SLOUP-CxmZGT-4.js → infoDiagram-HS3SLOUP-DVP1dWh4.js} +1 -1
- package/dist/dashboard/{dist/assets/journeyDiagram-XKPGCS4Q-8hUcTxo0.js → assets/journeyDiagram-XKPGCS4Q-CNHD7swq.js} +1 -1
- package/dist/dashboard/{dist/assets/kanban-definition-3W4ZIXB7-BvWm-0QQ.js → assets/kanban-definition-3W4ZIXB7-C-Jc4Ozy.js} +1 -1
- package/dist/dashboard/{dist/assets/layout-BFZ0bRU2.js → assets/layout-B0rNqEfo.js} +1 -1
- package/dist/dashboard/assets/{mindmap-definition-VGOIOE7T-BVsYbH_c.js → mindmap-definition-VGOIOE7T-hlQXiFXa.js} +1 -1
- package/dist/dashboard/assets/{pieDiagram-ADFJNKIX-BpwMMFZ3.js → pieDiagram-ADFJNKIX-CutZB3jG.js} +1 -1
- package/dist/dashboard/{dist/assets/quadrantDiagram-AYHSOK5B-C6NljtBN.js → assets/quadrantDiagram-AYHSOK5B-Bv6m-3mt.js} +1 -1
- package/dist/dashboard/{dist/assets/requirementDiagram-UZGBJVZJ-B3VaAf8y.js → assets/requirementDiagram-UZGBJVZJ-BQkld-bF.js} +1 -1
- package/dist/dashboard/{dist/assets/sankeyDiagram-TZEHDZUN-2ZhiU1NT.js → assets/sankeyDiagram-TZEHDZUN-DCWiCVGp.js} +1 -1
- package/dist/dashboard/assets/{sequenceDiagram-WL72ISMW-nMYJrjDT.js → sequenceDiagram-WL72ISMW-Dq_0SNSh.js} +1 -1
- package/dist/dashboard/{dist/assets/stateDiagram-FKZM4ZOC-0Wd-KmOv.js → assets/stateDiagram-FKZM4ZOC-BAd-cwxt.js} +1 -1
- package/dist/dashboard/assets/stateDiagram-v2-4FDKWEC3-DXlj7mrF.js +1 -0
- package/dist/dashboard/{dist/assets/timeline-definition-IT6M3QCI-CAmQOjBu.js → assets/timeline-definition-IT6M3QCI-BlMKo2bz.js} +1 -1
- package/dist/dashboard/{dist/assets/treemap-GDKQZRPO-CRP-WvE-.js → assets/treemap-GDKQZRPO-Cn6SBC6j.js} +1 -1
- package/dist/dashboard/{dist/assets/xychartDiagram-PRI3JC2R-5DoR2_q5.js → assets/xychartDiagram-PRI3JC2R-DlBeMjr8.js} +1 -1
- package/dist/dashboard/dist/assets/{_basePickBy-C2jmWITn.js → _basePickBy-BKGHUeDJ.js} +1 -1
- package/dist/dashboard/{assets/_baseUniq-BZHS9wTU.js → dist/assets/_baseUniq-CtA-DQF7.js} +1 -1
- package/dist/dashboard/dist/assets/{arc-B-Q4nGPT.js → arc-CbXP3Mc9.js} +1 -1
- package/dist/dashboard/dist/assets/{architectureDiagram-VXUJARFQ-Bs48s9rH.js → architectureDiagram-VXUJARFQ-n7QxasMM.js} +1 -1
- package/dist/dashboard/dist/assets/{blockDiagram-VD42YOAC-BPw-T2eL.js → blockDiagram-VD42YOAC-MXnGwKRn.js} +1 -1
- package/dist/dashboard/{assets/c4Diagram-YG6GDRKO-DuP3tG_c.js → dist/assets/c4Diagram-YG6GDRKO-B3yZ5P9k.js} +1 -1
- package/dist/dashboard/dist/assets/channel-C7QwX7U8.js +1 -0
- package/dist/dashboard/dist/assets/{chunk-4BX2VUAB-B9cIE1K2.js → chunk-4BX2VUAB-Dw3El5KF.js} +1 -1
- package/dist/dashboard/dist/assets/{chunk-55IACEB6-BIFhHB94.js → chunk-55IACEB6-T8Jf00IL.js} +1 -1
- package/dist/dashboard/dist/assets/{chunk-B4BG7PRW-B3IrqteW.js → chunk-B4BG7PRW-DAJalKYJ.js} +1 -1
- package/dist/dashboard/dist/assets/{chunk-DI55MBZ5-B7xHuqZu.js → chunk-DI55MBZ5-p7o_KuDF.js} +1 -1
- package/dist/dashboard/dist/assets/{chunk-FMBD7UC4-BBMfQbw1.js → chunk-FMBD7UC4-B0wUAfQR.js} +1 -1
- package/dist/dashboard/dist/assets/{chunk-QN33PNHL-BBQ6Q-9S.js → chunk-QN33PNHL-BTFwTEw8.js} +1 -1
- package/dist/dashboard/dist/assets/{chunk-QZHKN3VN-9uXt-06K.js → chunk-QZHKN3VN-CNXHnjkC.js} +1 -1
- package/dist/dashboard/dist/assets/{chunk-TZMSLE5B-BjDMUc_L.js → chunk-TZMSLE5B-BIVywBYp.js} +1 -1
- package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-Dkb-G0UK.js +1 -0
- package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-Dkb-G0UK.js +1 -0
- package/dist/dashboard/dist/assets/clone-BSdXhKmH.js +1 -0
- package/dist/dashboard/dist/assets/{cose-bilkent-S5V4N54A-DLYZ4dZA.js → cose-bilkent-S5V4N54A-DuALhY5a.js} +1 -1
- package/dist/dashboard/dist/assets/{dagre-6UL2VRFP-B8oEROJc.js → dagre-6UL2VRFP-w6endfy9.js} +1 -1
- package/dist/dashboard/dist/assets/{diagram-PSM6KHXK-5uki9Dw8.js → diagram-PSM6KHXK-BDnUwPQC.js} +1 -1
- package/dist/dashboard/dist/assets/{diagram-QEK2KX5R-BRNhmby2.js → diagram-QEK2KX5R-Cbb7ctAo.js} +1 -1
- package/dist/dashboard/{assets/diagram-S2PKOQOG-Bk_jyoxg.js → dist/assets/diagram-S2PKOQOG-76ascveh.js} +1 -1
- package/dist/dashboard/dist/assets/{erDiagram-Q2GNP2WA-BbPQp6RA.js → erDiagram-Q2GNP2WA-BQQnVF0J.js} +1 -1
- package/dist/dashboard/dist/assets/{flowDiagram-NV44I4VS-BAHshMEg.js → flowDiagram-NV44I4VS-dKukiSxD.js} +1 -1
- package/dist/dashboard/dist/assets/{ganttDiagram-JELNMOA3-BS4JnN-M.js → ganttDiagram-JELNMOA3-BqnazZuZ.js} +1 -1
- package/dist/dashboard/{assets/gitGraphDiagram-V2S2FVAM-RgQMxxaQ.js → dist/assets/gitGraphDiagram-V2S2FVAM-BUFcnXCj.js} +1 -1
- package/dist/dashboard/dist/assets/{graph-CD7-npU0.js → graph-CGQIvL3r.js} +1 -1
- package/dist/dashboard/dist/assets/index-CadOHtae.css +1 -0
- package/dist/dashboard/dist/assets/{index-D3_88Gr5.js → index-DwqfA4mc.js} +115 -115
- package/dist/dashboard/dist/assets/{infoDiagram-HS3SLOUP-BMp4C5wf.js → infoDiagram-HS3SLOUP-BdylFPLI.js} +1 -1
- package/dist/dashboard/{assets/journeyDiagram-XKPGCS4Q-CdvZAxeA.js → dist/assets/journeyDiagram-XKPGCS4Q-BzJTBkhp.js} +1 -1
- package/dist/dashboard/{assets/kanban-definition-3W4ZIXB7-DTse5xX8.js → dist/assets/kanban-definition-3W4ZIXB7-StKomgio.js} +1 -1
- package/dist/dashboard/dist/assets/{layout-6njVG9Ld.js → layout-BnsX73QS.js} +1 -1
- package/dist/dashboard/dist/assets/{mindmap-definition-VGOIOE7T-B7wYeLe1.js → mindmap-definition-VGOIOE7T-HqFRhVFX.js} +1 -1
- package/dist/dashboard/dist/assets/{pieDiagram-ADFJNKIX-5pSPRGJ2.js → pieDiagram-ADFJNKIX-2I2tFH0C.js} +1 -1
- package/dist/dashboard/{assets/quadrantDiagram-AYHSOK5B-C6NljtBN.js → dist/assets/quadrantDiagram-AYHSOK5B-PlELkdBW.js} +1 -1
- package/dist/dashboard/{assets/requirementDiagram-UZGBJVZJ-Ban4o6oK.js → dist/assets/requirementDiagram-UZGBJVZJ-_9eLQNcZ.js} +1 -1
- package/dist/dashboard/dist/assets/{sankeyDiagram-TZEHDZUN-BDImwZtB.js → sankeyDiagram-TZEHDZUN-DHl1Ss7O.js} +1 -1
- package/dist/dashboard/dist/assets/{sequenceDiagram-WL72ISMW-1d8_kyI3.js → sequenceDiagram-WL72ISMW-B9p0m3Uf.js} +1 -1
- package/dist/dashboard/dist/assets/{stateDiagram-FKZM4ZOC-BWqoDymf.js → stateDiagram-FKZM4ZOC--rpDODjT.js} +1 -1
- package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-Ca9uGk46.js +1 -0
- package/dist/dashboard/dist/assets/{timeline-definition-IT6M3QCI-CBR9kqeJ.js → timeline-definition-IT6M3QCI-BCHaGBHB.js} +1 -1
- package/dist/dashboard/{assets/treemap-GDKQZRPO-D-XpcCUD.js → dist/assets/treemap-GDKQZRPO-CgiqDY8M.js} +1 -1
- package/dist/dashboard/dist/assets/{xychartDiagram-PRI3JC2R-7aSkQtVu.js → xychartDiagram-PRI3JC2R-BMvBBbeV.js} +1 -1
- package/dist/dashboard/dist/index.html +2 -2
- package/dist/dashboard/dist/reports/coverage-summary.json +848 -616
- package/dist/dashboard/index.html +2 -2
- package/dist/src/config/defaultConfig.d.ts.map +1 -1
- package/dist/src/config/defaultConfig.js +0 -37
- package/dist/src/config/types.d.ts +0 -42
- package/dist/src/config/types.d.ts.map +1 -1
- package/dist/src/config/validateConfig.d.ts.map +1 -1
- package/dist/src/config/validateConfig.js +0 -3
- package/dist/src/discovery/fileClassifier.d.ts.map +1 -1
- package/dist/src/discovery/fileClassifier.js +16 -15
- package/dist/src/discovery/projectDiscovery.d.ts.map +1 -1
- package/dist/src/discovery/projectDiscovery.js +1 -4
- package/dist/src/generation/context-builder.d.ts +3 -13
- package/dist/src/generation/context-builder.d.ts.map +1 -1
- package/dist/src/generation/context-builder.js +151 -119
- package/dist/src/generation/engine.d.ts +34 -13
- package/dist/src/generation/engine.d.ts.map +1 -1
- package/dist/src/generation/engine.js +317 -143
- package/dist/src/generation/file-router.d.ts +4 -5
- package/dist/src/generation/file-router.d.ts.map +1 -1
- package/dist/src/generation/file-router.js +39 -58
- package/dist/src/generation/gap-extractor.d.ts +9 -4
- package/dist/src/generation/gap-extractor.d.ts.map +1 -1
- package/dist/src/generation/gap-extractor.js +230 -240
- package/dist/src/generation/template-renderer.d.ts +9 -11
- package/dist/src/generation/template-renderer.d.ts.map +1 -1
- package/dist/src/generation/template-renderer.js +499 -519
- package/dist/src/generation/types.d.ts +48 -244
- package/dist/src/generation/types.d.ts.map +1 -1
- package/dist/src/generation/types.js +0 -4
- package/dist/src/index.js +247 -254
- package/dist/src/inference/businessRuleInference.d.ts.map +1 -1
- package/dist/src/inference/businessRuleInference.js +0 -95
- package/dist/src/inference/integrationFlowInference.d.ts +1 -11
- package/dist/src/inference/integrationFlowInference.d.ts.map +1 -1
- package/dist/src/inference/integrationFlowInference.js +2 -49
- package/dist/src/inference/routeInference.d.ts.map +1 -1
- package/dist/src/inference/routeInference.js +8 -54
- package/dist/src/languages/java/semanticBuilder.d.ts.map +1 -1
- package/dist/src/languages/java/semanticBuilder.js +12 -69
- package/dist/src/languages/javascript/angularDetector.d.ts.map +1 -1
- package/dist/src/languages/javascript/angularDetector.js +17 -50
- package/dist/src/languages/javascript/assertionResolver.js +4 -6
- package/dist/src/languages/javascript/hapiDetector.d.ts.map +1 -1
- package/dist/src/languages/javascript/hapiDetector.js +5 -48
- package/dist/src/languages/javascript/vueDetector.d.ts +0 -2
- package/dist/src/languages/javascript/vueDetector.d.ts.map +1 -1
- package/dist/src/languages/javascript/vueDetector.js +0 -22
- package/dist/src/languages/python/index.d.ts +1 -1
- package/dist/src/languages/python/index.d.ts.map +1 -1
- package/dist/src/languages/python/index.js +3 -33
- package/dist/src/pipeline/confidence.d.ts +1 -6
- package/dist/src/pipeline/confidence.d.ts.map +1 -1
- package/dist/src/pipeline/confidence.js +3 -8
- package/dist/src/pipeline/detectors/expressMiddlewareDetector.d.ts +21 -0
- package/dist/src/pipeline/detectors/expressMiddlewareDetector.d.ts.map +1 -0
- package/dist/src/pipeline/detectors/expressMiddlewareDetector.js +201 -0
- package/dist/src/pipeline/detectors/flaskBlueprintDetector.d.ts +23 -0
- package/dist/src/pipeline/detectors/flaskBlueprintDetector.d.ts.map +1 -0
- package/dist/src/pipeline/detectors/flaskBlueprintDetector.js +263 -0
- package/dist/src/pipeline/detectors/springDddDetector.d.ts +23 -0
- package/dist/src/pipeline/detectors/springDddDetector.d.ts.map +1 -0
- package/dist/src/pipeline/detectors/springDddDetector.js +237 -0
- package/dist/src/pipeline/detectors/types.d.ts +97 -0
- package/dist/src/pipeline/detectors/types.d.ts.map +1 -0
- package/dist/src/pipeline/detectors/types.js +15 -0
- package/dist/src/pipeline/graph.d.ts.map +1 -1
- package/dist/src/pipeline/graph.js +4 -16
- package/dist/src/pipeline/stages/ast/astStage.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/astStage.js +2 -46
- package/dist/src/pipeline/stages/ast/baseUrlComposer.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/baseUrlComposer.js +4 -18
- package/dist/src/pipeline/stages/ast/crossFileResolver.js +0 -29
- package/dist/src/pipeline/stages/ast/graphBuilder.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/graphBuilder.js +0 -81
- package/dist/src/pipeline/stages/ast/optionalAuthUnifier.d.ts +1 -3
- package/dist/src/pipeline/stages/ast/optionalAuthUnifier.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/optionalAuthUnifier.js +14 -34
- package/dist/src/pipeline/stages/ast/resolvers/angularInjectionResolver.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/resolvers/angularInjectionResolver.js +3 -22
- package/dist/src/pipeline/stages/ast/resolvers/dddLayerResolver.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/resolvers/dddLayerResolver.js +28 -104
- package/dist/src/pipeline/stages/ast/resolvers/mybatisResolver.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/resolvers/mybatisResolver.js +0 -56
- package/dist/src/pipeline/stages/ast/resolvers/vuexActionResolver.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/resolvers/vuexActionResolver.js +18 -43
- package/dist/src/pipeline/stages/ast/rulesEnforcer.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/rulesEnforcer.js +45 -336
- package/dist/src/pipeline/stages/merge/conflictDetector.d.ts +0 -2
- package/dist/src/pipeline/stages/merge/conflictDetector.d.ts.map +1 -1
- package/dist/src/pipeline/stages/merge/conflictDetector.js +2 -54
- package/dist/src/pipeline/stages/merge/coverageMappingBuilder.d.ts.map +1 -1
- package/dist/src/pipeline/stages/merge/coverageMappingBuilder.js +3 -67
- package/dist/src/pipeline/stages/tia/mockBoundaryDetector.d.ts.map +1 -1
- package/dist/src/pipeline/stages/tia/mockBoundaryDetector.js +1 -8
- package/dist/src/pipeline/stages/tia/parameterizedTestExpander.js +4 -8
- package/dist/src/pipeline/stages/tia/testLayerClassifier.d.ts.map +1 -1
- package/dist/src/pipeline/stages/tia/testLayerClassifier.js +10 -36
- package/dist/src/pipeline/types.d.ts +1 -1
- package/dist/src/pipeline/types.d.ts.map +1 -1
- package/dist/src/reporting.d.ts.map +1 -1
- package/dist/src/reporting.js +2 -1
- package/dist/src/streaming/detectors/eventBridgeDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/eventBridgeDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/eventBridgeDetector.js +82 -0
- package/dist/src/streaming/detectors/kafkaDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/kafkaDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/kafkaDetector.js +97 -0
- package/dist/src/streaming/detectors/natsDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/natsDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/natsDetector.js +96 -0
- package/dist/src/streaming/detectors/pubsubDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/pubsubDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/pubsubDetector.js +82 -0
- package/dist/src/streaming/detectors/rabbitmqDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/rabbitmqDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/rabbitmqDetector.js +103 -0
- package/dist/src/streaming/detectors/redisPubsubDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/redisPubsubDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/redisPubsubDetector.js +81 -0
- package/dist/src/streaming/detectors/snsDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/snsDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/snsDetector.js +81 -0
- package/dist/src/streaming/detectors/sqsDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/sqsDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/sqsDetector.js +81 -0
- package/dist/src/streaming/eventCoverage.d.ts +46 -0
- package/dist/src/streaming/eventCoverage.d.ts.map +1 -0
- package/dist/src/streaming/eventCoverage.js +270 -0
- package/dist/src/streaming/types.d.ts +34 -0
- package/dist/src/streaming/types.d.ts.map +1 -0
- package/dist/src/streaming/types.js +2 -0
- package/dist/src/summary/markdownRenderer.d.ts.map +1 -1
- package/dist/src/summary/markdownRenderer.js +1 -0
- package/dist/src/summary/summaryTypes.d.ts.map +1 -1
- package/dist/src/summary/summaryTypes.js +1 -0
- package/package.json +3 -3
- package/dist/dashboard/assets/arc-D4xT0thw.js +0 -1
- package/dist/dashboard/assets/architectureDiagram-VXUJARFQ-Bs48s9rH.js +0 -36
- package/dist/dashboard/assets/channel-YFEOkJua.js +0 -1
- package/dist/dashboard/assets/chunk-B4BG7PRW-D5WlZonc.js +0 -165
- package/dist/dashboard/assets/chunk-DI55MBZ5-B-xsiGYI.js +0 -220
- package/dist/dashboard/assets/classDiagram-2ON5EDUG-CE9rmEXI.js +0 -1
- package/dist/dashboard/assets/classDiagram-v2-WZHVMYZB-CE9rmEXI.js +0 -1
- package/dist/dashboard/assets/clone-BAVNftx6.js +0 -1
- package/dist/dashboard/assets/cose-bilkent-S5V4N54A-DrNDePwE.js +0 -1
- package/dist/dashboard/assets/erDiagram-Q2GNP2WA-BbPQp6RA.js +0 -60
- package/dist/dashboard/assets/flowDiagram-NV44I4VS-1j044bLK.js +0 -162
- package/dist/dashboard/assets/index-Bt72YjAZ.css +0 -1
- package/dist/dashboard/assets/index-DuT2LnIf.js +0 -523
- package/dist/dashboard/assets/layout-CnKzeCpQ.js +0 -1
- package/dist/dashboard/assets/sankeyDiagram-TZEHDZUN-BDImwZtB.js +0 -10
- package/dist/dashboard/assets/stateDiagram-FKZM4ZOC-DkBAMCJV.js +0 -1
- package/dist/dashboard/assets/stateDiagram-v2-4FDKWEC3-CtkfyoSn.js +0 -1
- package/dist/dashboard/assets/timeline-definition-IT6M3QCI-CGUDCWFx.js +0 -61
- package/dist/dashboard/assets/xychartDiagram-PRI3JC2R-BlIpbwyn.js +0 -7
- package/dist/dashboard/dist/assets/_basePickBy-CErN2e4K.js +0 -1
- package/dist/dashboard/dist/assets/_basePickBy-CYB1KXah.js +0 -1
- package/dist/dashboard/dist/assets/_basePickBy-D4ml7gdd.js +0 -1
- package/dist/dashboard/dist/assets/_basePickBy-D7SXdoHL.js +0 -1
- package/dist/dashboard/dist/assets/_basePickBy-DUQHbXda.js +0 -1
- package/dist/dashboard/dist/assets/_basePickBy-DZR484hj.js +0 -1
- package/dist/dashboard/dist/assets/_basePickBy-_zJIZmFM.js +0 -1
- package/dist/dashboard/dist/assets/_baseUniq-BZHS9wTU.js +0 -1
- package/dist/dashboard/dist/assets/_baseUniq-BzwtoVZI.js +0 -1
- package/dist/dashboard/dist/assets/_baseUniq-C2oBAxY3.js +0 -1
- package/dist/dashboard/dist/assets/_baseUniq-CUKBQ2bc.js +0 -1
- package/dist/dashboard/dist/assets/_baseUniq-Ct8XEXnH.js +0 -1
- package/dist/dashboard/dist/assets/_baseUniq-DE6cyzJb.js +0 -1
- package/dist/dashboard/dist/assets/_baseUniq-DzHorfx6.js +0 -1
- package/dist/dashboard/dist/assets/arc-B7p8x22e.js +0 -1
- package/dist/dashboard/dist/assets/arc-BDOeMmjX.js +0 -1
- package/dist/dashboard/dist/assets/arc-BaDRUN_n.js +0 -1
- package/dist/dashboard/dist/assets/arc-CjFGY63A.js +0 -1
- package/dist/dashboard/dist/assets/arc-D4xT0thw.js +0 -1
- package/dist/dashboard/dist/assets/arc-g03p1JXB.js +0 -1
- package/dist/dashboard/dist/assets/architectureDiagram-VXUJARFQ-BUdFGrlT.js +0 -36
- package/dist/dashboard/dist/assets/architectureDiagram-VXUJARFQ-CLCqS7Lv.js +0 -36
- package/dist/dashboard/dist/assets/architectureDiagram-VXUJARFQ-C_5dqWCI.js +0 -36
- package/dist/dashboard/dist/assets/architectureDiagram-VXUJARFQ-WnVycqnT.js +0 -36
- package/dist/dashboard/dist/assets/architectureDiagram-VXUJARFQ-mH7lInv5.js +0 -36
- package/dist/dashboard/dist/assets/architectureDiagram-VXUJARFQ-wVr1_uNB.js +0 -36
- package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-BBXc88fn.js +0 -122
- package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-BvkiW8lj.js +0 -122
- package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-CavSRNuP.js +0 -122
- package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-D-TzNNzc.js +0 -122
- package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-DK0YAM7_.js +0 -122
- package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-DbGIO6Kt.js +0 -122
- package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-V4vxrfzX.js +0 -122
- package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-Bs4R4b6P.js +0 -10
- package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-BsgzPfQ3.js +0 -10
- package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-CAFpcejP.js +0 -10
- package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-DVnWnYOL.js +0 -10
- package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-DuP3tG_c.js +0 -10
- package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-ZEVciqTW.js +0 -10
- package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-w18S5AEN.js +0 -10
- package/dist/dashboard/dist/assets/channel-BSnIwwuG.js +0 -1
- package/dist/dashboard/dist/assets/channel-BgeGdqQG.js +0 -1
- package/dist/dashboard/dist/assets/channel-CyXkK5KC.js +0 -1
- package/dist/dashboard/dist/assets/channel-D5Cq9giL.js +0 -1
- package/dist/dashboard/dist/assets/channel-DbeZpf5T.js +0 -1
- package/dist/dashboard/dist/assets/channel-Di9el3wE.js +0 -1
- package/dist/dashboard/dist/assets/channel-YFEOkJua.js +0 -1
- package/dist/dashboard/dist/assets/channel-psxgcQ_j.js +0 -1
- package/dist/dashboard/dist/assets/chunk-4BX2VUAB-BDYDsvGv.js +0 -1
- package/dist/dashboard/dist/assets/chunk-4BX2VUAB-BF8loPLD.js +0 -1
- package/dist/dashboard/dist/assets/chunk-4BX2VUAB-BrU7mtb9.js +0 -1
- package/dist/dashboard/dist/assets/chunk-4BX2VUAB-CSJ8KLGx.js +0 -1
- package/dist/dashboard/dist/assets/chunk-4BX2VUAB-DY1boKsq.js +0 -1
- package/dist/dashboard/dist/assets/chunk-4BX2VUAB-IN53WLTx.js +0 -1
- package/dist/dashboard/dist/assets/chunk-4BX2VUAB-oleArqPu.js +0 -1
- package/dist/dashboard/dist/assets/chunk-55IACEB6-BSL35gyW.js +0 -1
- package/dist/dashboard/dist/assets/chunk-55IACEB6-BzCzmNUn.js +0 -1
- package/dist/dashboard/dist/assets/chunk-55IACEB6-C3HNF-UF.js +0 -1
- package/dist/dashboard/dist/assets/chunk-55IACEB6-CiEoroXY.js +0 -1
- package/dist/dashboard/dist/assets/chunk-55IACEB6-DV6VmXIy.js +0 -1
- package/dist/dashboard/dist/assets/chunk-55IACEB6-DwsmCNp_.js +0 -1
- package/dist/dashboard/dist/assets/chunk-55IACEB6-kJkjQYxk.js +0 -1
- package/dist/dashboard/dist/assets/chunk-B4BG7PRW-BChq1Wly.js +0 -165
- package/dist/dashboard/dist/assets/chunk-B4BG7PRW-BiYJ9gu_.js +0 -165
- package/dist/dashboard/dist/assets/chunk-B4BG7PRW-CCMwwYCe.js +0 -165
- package/dist/dashboard/dist/assets/chunk-B4BG7PRW-D5WlZonc.js +0 -165
- package/dist/dashboard/dist/assets/chunk-B4BG7PRW-eTDXrKrv.js +0 -165
- package/dist/dashboard/dist/assets/chunk-B4BG7PRW-wQ6TCEMq.js +0 -165
- package/dist/dashboard/dist/assets/chunk-DI55MBZ5-BD9C9H7Y.js +0 -220
- package/dist/dashboard/dist/assets/chunk-DI55MBZ5-BTfzxsg4.js +0 -220
- package/dist/dashboard/dist/assets/chunk-DI55MBZ5-CSRqV3_6.js +0 -220
- package/dist/dashboard/dist/assets/chunk-DI55MBZ5-D7eiRvhB.js +0 -220
- package/dist/dashboard/dist/assets/chunk-DI55MBZ5-DfslhtXS.js +0 -220
- package/dist/dashboard/dist/assets/chunk-DI55MBZ5-M-8I3jEy.js +0 -220
- package/dist/dashboard/dist/assets/chunk-FMBD7UC4-BgEzYy_c.js +0 -15
- package/dist/dashboard/dist/assets/chunk-FMBD7UC4-CtTcDWZJ.js +0 -15
- package/dist/dashboard/dist/assets/chunk-FMBD7UC4-CyF99olo.js +0 -15
- package/dist/dashboard/dist/assets/chunk-FMBD7UC4-DRb5NEMr.js +0 -15
- package/dist/dashboard/dist/assets/chunk-FMBD7UC4-K3PC79JF.js +0 -15
- package/dist/dashboard/dist/assets/chunk-FMBD7UC4-V0V2L4Gq.js +0 -15
- package/dist/dashboard/dist/assets/chunk-FMBD7UC4-bSA0XiS0.js +0 -15
- package/dist/dashboard/dist/assets/chunk-QN33PNHL-BNX7uRa_.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QN33PNHL-BRSlHScq.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QN33PNHL-BrOIYUBs.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QN33PNHL-CCuhlE1C.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QN33PNHL-CmeZ1h1Z.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QN33PNHL-DFgUs0T8.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QN33PNHL-JcQZ0Q-Q.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QZHKN3VN-Cix7nLqx.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QZHKN3VN-CliaQGD4.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QZHKN3VN-Cyg7Km90.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QZHKN3VN-DKgOcPif.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QZHKN3VN-MNv3v4He.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QZHKN3VN-T5hoQANf.js +0 -1
- package/dist/dashboard/dist/assets/chunk-QZHKN3VN-mq-zucvn.js +0 -1
- package/dist/dashboard/dist/assets/chunk-TZMSLE5B-BoJFBewj.js +0 -1
- package/dist/dashboard/dist/assets/chunk-TZMSLE5B-BtXpcWN4.js +0 -1
- package/dist/dashboard/dist/assets/chunk-TZMSLE5B-C8KNXDi7.js +0 -1
- package/dist/dashboard/dist/assets/chunk-TZMSLE5B-CyhcxGB1.js +0 -1
- package/dist/dashboard/dist/assets/chunk-TZMSLE5B-DGTVcqTS.js +0 -1
- package/dist/dashboard/dist/assets/chunk-TZMSLE5B-DqMNcR7I.js +0 -1
- package/dist/dashboard/dist/assets/chunk-TZMSLE5B-F1fppg7C.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-AMwn99HP.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-BbkwHRko.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-Be0F7AG8.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-BkGN4Cpz.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-CE9rmEXI.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-CM6Qs-Qs.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-D3VDjeKC.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-o8p5Y0H9.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-AMwn99HP.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-BbkwHRko.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-Be0F7AG8.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-BkGN4Cpz.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-CE9rmEXI.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-CM6Qs-Qs.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-D3VDjeKC.js +0 -1
- package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-o8p5Y0H9.js +0 -1
- package/dist/dashboard/dist/assets/clone-B5PF81Z3.js +0 -1
- package/dist/dashboard/dist/assets/clone-BAVNftx6.js +0 -1
- package/dist/dashboard/dist/assets/clone-BmpQ0ely.js +0 -1
- package/dist/dashboard/dist/assets/clone-CKIuLE_W.js +0 -1
- package/dist/dashboard/dist/assets/clone-Cv0cxIIi.js +0 -1
- package/dist/dashboard/dist/assets/clone-Cvq8JuOb.js +0 -1
- package/dist/dashboard/dist/assets/clone-DEYRVSAn.js +0 -1
- package/dist/dashboard/dist/assets/clone-KEkbvJY9.js +0 -1
- package/dist/dashboard/dist/assets/cose-bilkent-S5V4N54A-DMGRGhwB.js +0 -1
- package/dist/dashboard/dist/assets/cose-bilkent-S5V4N54A-DrNDePwE.js +0 -1
- package/dist/dashboard/dist/assets/cose-bilkent-S5V4N54A-GjySlYac.js +0 -1
- package/dist/dashboard/dist/assets/cose-bilkent-S5V4N54A-UX3RfzXW.js +0 -1
- package/dist/dashboard/dist/assets/cose-bilkent-S5V4N54A-YL9kFxCl.js +0 -1
- package/dist/dashboard/dist/assets/cose-bilkent-S5V4N54A-xVw-THr_.js +0 -1
- package/dist/dashboard/dist/assets/dagre-6UL2VRFP-BO79zHpJ.js +0 -4
- package/dist/dashboard/dist/assets/dagre-6UL2VRFP-Bjadb8g_.js +0 -4
- package/dist/dashboard/dist/assets/dagre-6UL2VRFP-CJT7lofP.js +0 -4
- package/dist/dashboard/dist/assets/dagre-6UL2VRFP-CUx6EwnW.js +0 -4
- package/dist/dashboard/dist/assets/dagre-6UL2VRFP-D03qnh38.js +0 -4
- package/dist/dashboard/dist/assets/dagre-6UL2VRFP-DgEqrxGj.js +0 -4
- package/dist/dashboard/dist/assets/dagre-6UL2VRFP-NZWnQN_Y.js +0 -4
- package/dist/dashboard/dist/assets/diagram-PSM6KHXK-BPFtplp4.js +0 -24
- package/dist/dashboard/dist/assets/diagram-PSM6KHXK-BgOmComt.js +0 -24
- package/dist/dashboard/dist/assets/diagram-PSM6KHXK-DGtyS7lD.js +0 -24
- package/dist/dashboard/dist/assets/diagram-PSM6KHXK-D__FKIzE.js +0 -24
- package/dist/dashboard/dist/assets/diagram-PSM6KHXK-DtE0cTIs.js +0 -24
- package/dist/dashboard/dist/assets/diagram-PSM6KHXK-JEfxbZj6.js +0 -24
- package/dist/dashboard/dist/assets/diagram-PSM6KHXK-Y-M5J_PO.js +0 -24
- package/dist/dashboard/dist/assets/diagram-QEK2KX5R-1hjfopmw.js +0 -43
- package/dist/dashboard/dist/assets/diagram-QEK2KX5R-BHyZd544.js +0 -43
- package/dist/dashboard/dist/assets/diagram-QEK2KX5R-BXMS0hEZ.js +0 -43
- package/dist/dashboard/dist/assets/diagram-QEK2KX5R-BtOA2yYh.js +0 -43
- package/dist/dashboard/dist/assets/diagram-QEK2KX5R-CSCGZUfr.js +0 -43
- package/dist/dashboard/dist/assets/diagram-QEK2KX5R-CYK-aLR5.js +0 -43
- package/dist/dashboard/dist/assets/diagram-QEK2KX5R-CYxueP7U.js +0 -43
- package/dist/dashboard/dist/assets/diagram-S2PKOQOG-Bk_jyoxg.js +0 -24
- package/dist/dashboard/dist/assets/diagram-S2PKOQOG-CRUXUQeh.js +0 -24
- package/dist/dashboard/dist/assets/diagram-S2PKOQOG-CzytkAcm.js +0 -24
- package/dist/dashboard/dist/assets/diagram-S2PKOQOG-D-ku_X8U.js +0 -24
- package/dist/dashboard/dist/assets/diagram-S2PKOQOG-DdqZVGN1.js +0 -24
- package/dist/dashboard/dist/assets/diagram-S2PKOQOG-Gj3ANjIG.js +0 -24
- package/dist/dashboard/dist/assets/diagram-S2PKOQOG-qvXlTDud.js +0 -24
- package/dist/dashboard/dist/assets/erDiagram-Q2GNP2WA-DDk1KpRF.js +0 -60
- package/dist/dashboard/dist/assets/erDiagram-Q2GNP2WA-DGl6gPe2.js +0 -60
- package/dist/dashboard/dist/assets/erDiagram-Q2GNP2WA-DSC5VPcF.js +0 -60
- package/dist/dashboard/dist/assets/erDiagram-Q2GNP2WA-DZpjLrp5.js +0 -60
- package/dist/dashboard/dist/assets/erDiagram-Q2GNP2WA-Dhb_VQMS.js +0 -60
- package/dist/dashboard/dist/assets/erDiagram-Q2GNP2WA-DvI8ycM6.js +0 -60
- package/dist/dashboard/dist/assets/flowDiagram-NV44I4VS-CBnhpWKd.js +0 -162
- package/dist/dashboard/dist/assets/flowDiagram-NV44I4VS-CYXUqE3L.js +0 -162
- package/dist/dashboard/dist/assets/flowDiagram-NV44I4VS-Co89qYBD.js +0 -162
- package/dist/dashboard/dist/assets/flowDiagram-NV44I4VS-DRAD4OG7.js +0 -162
- package/dist/dashboard/dist/assets/flowDiagram-NV44I4VS-PVleScVK.js +0 -162
- package/dist/dashboard/dist/assets/flowDiagram-NV44I4VS-gKUH-GJ2.js +0 -162
- package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-2r3WpWQC.js +0 -267
- package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-BA65eVi0.js +0 -267
- package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-Cjy_BOl2.js +0 -267
- package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-CsUMU5Ws.js +0 -267
- package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-DK_45K6s.js +0 -267
- package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-DX-lROHt.js +0 -267
- package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-Dm_lLo9y.js +0 -267
- package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-C9NpbucY.js +0 -65
- package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-CWo2OK69.js +0 -65
- package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-DM9AW1aP.js +0 -65
- package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-DYrdM8tK.js +0 -65
- package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-RgQMxxaQ.js +0 -65
- package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-Uz3nRdju.js +0 -65
- package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-bYKe_efj.js +0 -65
- package/dist/dashboard/dist/assets/graph-BP2ns4se.js +0 -1
- package/dist/dashboard/dist/assets/graph-BVGuJ5gs.js +0 -1
- package/dist/dashboard/dist/assets/graph-Clj85F2M.js +0 -1
- package/dist/dashboard/dist/assets/graph-CpRVMcWW.js +0 -1
- package/dist/dashboard/dist/assets/graph-Cwn7jgQS.js +0 -1
- package/dist/dashboard/dist/assets/graph-ZtgwAPQj.js +0 -1
- package/dist/dashboard/dist/assets/graph-gV0gk5Dq.js +0 -1
- package/dist/dashboard/dist/assets/index-Bt72YjAZ.css +0 -1
- package/dist/dashboard/dist/assets/index-ByH_nEhG.js +0 -523
- package/dist/dashboard/dist/assets/index-C302ingQ.css +0 -1
- package/dist/dashboard/dist/assets/index-CqEIqNus.js +0 -781
- package/dist/dashboard/dist/assets/index-D-AtVpd2.js +0 -523
- package/dist/dashboard/dist/assets/index-DEXwnExZ.js +0 -523
- package/dist/dashboard/dist/assets/index-DbUdNJca.js +0 -781
- package/dist/dashboard/dist/assets/index-DuT2LnIf.js +0 -523
- package/dist/dashboard/dist/assets/index-xecKLQ58.css +0 -1
- package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-BjChBCME.js +0 -2
- package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-BxoN3QPh.js +0 -2
- package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-CxmZGT-4.js +0 -2
- package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-D3SFXNAS.js +0 -2
- package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-DyT5Fs8R.js +0 -2
- package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-HLwGZBHJ.js +0 -2
- package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-ujnMqVz3.js +0 -2
- package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-BC0GSZ7W.js +0 -139
- package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-Bv1IeJ8A.js +0 -139
- package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-CFgbI9OH.js +0 -139
- package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-CdvZAxeA.js +0 -139
- package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-CiMM9buE.js +0 -139
- package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-DQzfeBIo.js +0 -139
- package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-nYZBlgTD.js +0 -139
- package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-AkiB-BRk.js +0 -89
- package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-BjYw_9v5.js +0 -89
- package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-COTfX74l.js +0 -89
- package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-D3u5Ov-5.js +0 -89
- package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-D6aRd_q1.js +0 -89
- package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-DTse5xX8.js +0 -89
- package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-ueIaoeks.js +0 -89
- package/dist/dashboard/dist/assets/layout-B1fTYUMj.js +0 -1
- package/dist/dashboard/dist/assets/layout-BbJNDkTr.js +0 -1
- package/dist/dashboard/dist/assets/layout-BwmMaJCx.js +0 -1
- package/dist/dashboard/dist/assets/layout-CnKzeCpQ.js +0 -1
- package/dist/dashboard/dist/assets/layout-DgtRACDS.js +0 -1
- package/dist/dashboard/dist/assets/layout-JbkTCGhr.js +0 -1
- package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-B93XW27v.js +0 -68
- package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-BJ5xCmsL.js +0 -68
- package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-BVsYbH_c.js +0 -68
- package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-CkyYtMaD.js +0 -68
- package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-CmcASbkx.js +0 -68
- package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-D001Ygrx.js +0 -68
- package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-QDZ_z8OE.js +0 -68
- package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-9G1tEuaq.js +0 -30
- package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-BIOVbZG_.js +0 -30
- package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-Bf8vKEOf.js +0 -30
- package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-BpwMMFZ3.js +0 -30
- package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-DOXOzepj.js +0 -30
- package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-EeNihpUP.js +0 -30
- package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-uWFQFMEe.js +0 -30
- package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-Bwppivuy.js +0 -7
- package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-CM8qiFLR.js +0 -7
- package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-Crgu5WqK.js +0 -7
- package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-CtbMtM_F.js +0 -7
- package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-i3-JTN3e.js +0 -7
- package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-jDtdB4Ws.js +0 -7
- package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-o21Z8BWo.js +0 -7
- package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-Ban4o6oK.js +0 -64
- package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-BfAcJrqc.js +0 -64
- package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-CgXxZ2rH.js +0 -64
- package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-ClNSNeYe.js +0 -64
- package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-DPTtP4Ve.js +0 -64
- package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-Dw260IiT.js +0 -64
- package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-WIJ0qiJG.js +0 -64
- package/dist/dashboard/dist/assets/sankeyDiagram-TZEHDZUN-BFNTuDV7.js +0 -10
- package/dist/dashboard/dist/assets/sankeyDiagram-TZEHDZUN-Cb4WB9UB.js +0 -10
- package/dist/dashboard/dist/assets/sankeyDiagram-TZEHDZUN-D2OGoxU5.js +0 -10
- package/dist/dashboard/dist/assets/sankeyDiagram-TZEHDZUN-DEVTdH0h.js +0 -10
- package/dist/dashboard/dist/assets/sankeyDiagram-TZEHDZUN-LR8T4Hv0.js +0 -10
- package/dist/dashboard/dist/assets/sankeyDiagram-TZEHDZUN-VcdyPlVE.js +0 -10
- package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-97qjzqIO.js +0 -145
- package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-Bjr5wgXg.js +0 -145
- package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-BqGJWVUS.js +0 -145
- package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-C5h60fvZ.js +0 -145
- package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-DBqchhlr.js +0 -145
- package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-DOr6An-q.js +0 -145
- package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-nMYJrjDT.js +0 -145
- package/dist/dashboard/dist/assets/stateDiagram-FKZM4ZOC-Bl16d4W5.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-FKZM4ZOC-C1KYr7Wj.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-FKZM4ZOC-DDrhZYly.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-FKZM4ZOC-DKkWVu_K.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-FKZM4ZOC-DkBAMCJV.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-FKZM4ZOC-DlLDy54e.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-B05ygO34.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-B0euQu1p.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-BlwaoFEG.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-CtkfyoSn.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-DRV_IYr6.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-Im6pH8C-.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-K_qkvHaB.js +0 -1
- package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-pZ_Rrx6C.js +0 -1
- package/dist/dashboard/dist/assets/timeline-definition-IT6M3QCI-CGUDCWFx.js +0 -61
- package/dist/dashboard/dist/assets/timeline-definition-IT6M3QCI-CLdinkid.js +0 -61
- package/dist/dashboard/dist/assets/timeline-definition-IT6M3QCI-CsRS0WGC.js +0 -61
- package/dist/dashboard/dist/assets/timeline-definition-IT6M3QCI-D6JNee_P.js +0 -61
- package/dist/dashboard/dist/assets/timeline-definition-IT6M3QCI-DAT3r9va.js +0 -61
- package/dist/dashboard/dist/assets/timeline-definition-IT6M3QCI-DR6HNny6.js +0 -61
- package/dist/dashboard/dist/assets/treemap-GDKQZRPO-BlA8rg0m.js +0 -162
- package/dist/dashboard/dist/assets/treemap-GDKQZRPO-CBle3d0d.js +0 -162
- package/dist/dashboard/dist/assets/treemap-GDKQZRPO-CCvvSJBX.js +0 -162
- package/dist/dashboard/dist/assets/treemap-GDKQZRPO-Cw9mkiYN.js +0 -162
- package/dist/dashboard/dist/assets/treemap-GDKQZRPO-D-XpcCUD.js +0 -162
- package/dist/dashboard/dist/assets/treemap-GDKQZRPO-MpQr6tee.js +0 -162
- package/dist/dashboard/dist/assets/treemap-GDKQZRPO-vW7FSd7C.js +0 -162
- package/dist/dashboard/dist/assets/xychartDiagram-PRI3JC2R-B72UwDAP.js +0 -7
- package/dist/dashboard/dist/assets/xychartDiagram-PRI3JC2R-BceejIon.js +0 -7
- package/dist/dashboard/dist/assets/xychartDiagram-PRI3JC2R-BlIpbwyn.js +0 -7
- package/dist/dashboard/dist/assets/xychartDiagram-PRI3JC2R-ByLRWyI2.js +0 -7
- package/dist/dashboard/dist/assets/xychartDiagram-PRI3JC2R-DjyK-sw-.js +0 -7
- package/dist/dashboard/dist/assets/xychartDiagram-PRI3JC2R-bS40I4IT.js +0 -7
- package/dist/dashboard/reports/coverage-summary.json +0 -763
- package/dist/src/generation/ai-flow-exporter.d.ts +0 -7
- package/dist/src/generation/ai-flow-exporter.d.ts.map +0 -1
- package/dist/src/generation/ai-flow-exporter.js +0 -260
- package/dist/src/generation/index.d.ts +0 -9
- package/dist/src/generation/index.d.ts.map +0 -1
- package/dist/src/generation/index.js +0 -15
- package/dist/src/generation/quality-scorer.d.ts +0 -15
- package/dist/src/generation/quality-scorer.d.ts.map +0 -1
- package/dist/src/generation/quality-scorer.js +0 -273
- /package/dist/dashboard/{dist/assets → assets}/index-D_begBP0.css +0 -0
|
@@ -1,546 +1,526 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Feature 28 — TemplateRenderer
|
|
4
|
-
* Renders test scaffolds from GenerationContext.
|
|
5
|
-
* Uses string-based templates (no external dependency required).
|
|
6
|
-
*/
|
|
7
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OWASP_INJECTION_STRINGS = void 0;
|
|
4
|
+
exports.renderFileHeader = renderFileHeader;
|
|
8
5
|
exports.renderTemplate = renderTemplate;
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
exports.getTemplateName = getTemplateName;
|
|
7
|
+
/** Common OWASP injection strings for security tests */
|
|
8
|
+
exports.OWASP_INJECTION_STRINGS = [
|
|
9
|
+
"' OR '1'='1",
|
|
10
|
+
"'; DROP TABLE users; --",
|
|
11
|
+
'<script>alert("xss")</script>',
|
|
12
|
+
'../../../etc/passwd',
|
|
13
|
+
'${7*7}',
|
|
14
|
+
'{{7*7}}',
|
|
15
|
+
'; ls -la',
|
|
16
|
+
'\\x00',
|
|
17
|
+
'%00',
|
|
18
|
+
'<img src=x onerror=alert(1)>',
|
|
19
|
+
];
|
|
20
|
+
/** Standard file header injected into every generated test file */
|
|
21
|
+
function renderFileHeader(gapId, gapType) {
|
|
11
22
|
return [
|
|
12
|
-
|
|
13
|
-
`// Gap
|
|
14
|
-
|
|
15
|
-
|
|
23
|
+
'// AUTO-GENERATED by api-test-coverage-analyzer',
|
|
24
|
+
`// Gap ID: ${gapId} | Type: ${gapType}`,
|
|
25
|
+
'// DO NOT EDIT — regenerate with: node dist/src/index.js generate-tests',
|
|
26
|
+
'// TODO: Review and adjust before committing',
|
|
27
|
+
'',
|
|
16
28
|
].join('\n');
|
|
17
29
|
}
|
|
18
|
-
|
|
19
|
-
function
|
|
30
|
+
/** Simple string interpolation — replaces {{key}} tokens with values */
|
|
31
|
+
function interpolate(template, vars) {
|
|
32
|
+
return template.replace(/\{\{(\w+)\}\}/g, (_, key) => { var _a; return (_a = vars[key]) !== null && _a !== void 0 ? _a : `{{${key}}}`; });
|
|
33
|
+
}
|
|
34
|
+
// ─── TypeScript / Jest templates ─────────────────────────────────────────────
|
|
35
|
+
function renderEndpointMissing(gap, ctx) {
|
|
20
36
|
var _a, _b, _c, _d;
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
lines.push(` const response = await request(app)`);
|
|
47
|
-
lines.push(` .${method}('${endpoint.pathNormalized}')`);
|
|
48
|
-
if (authRequired) {
|
|
49
|
-
lines.push(` .set('Authorization', VALID_AUTH_TOKEN)`);
|
|
50
|
-
}
|
|
51
|
-
if (Object.keys(fixtures.validPayload).length > 0) {
|
|
52
|
-
lines.push(` .send(payload);`);
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
lines.push(` ;`);
|
|
56
|
-
}
|
|
57
|
-
lines.push(``);
|
|
58
|
-
// Find success status code
|
|
59
|
-
const successStatus = (_d = (_c = ctx.responses.find(r => r.statusCode >= 200 && r.statusCode < 300)) === null || _c === void 0 ? void 0 : _c.statusCode) !== null && _d !== void 0 ? _d : 200;
|
|
60
|
-
lines.push(` expect(response.status).toBe(${successStatus});`);
|
|
61
|
-
lines.push(` expect(response.body).toBeDefined();`);
|
|
62
|
-
lines.push(` });`);
|
|
63
|
-
lines.push(` });`);
|
|
64
|
-
lines.push(``);
|
|
65
|
-
// Auth tests (RULE-GEN03)
|
|
66
|
-
if (authRequired) {
|
|
67
|
-
lines.push(` describe('authentication', () => {`);
|
|
68
|
-
lines.push(` it('should return 401 when no auth token is provided', async () => {`);
|
|
69
|
-
lines.push(` const response = await request(app)`);
|
|
70
|
-
lines.push(` .${method}('${endpoint.pathNormalized}');`);
|
|
71
|
-
lines.push(``);
|
|
72
|
-
lines.push(` expect(response.status).toBe(401);`);
|
|
73
|
-
lines.push(` });`);
|
|
74
|
-
lines.push(``);
|
|
75
|
-
lines.push(` it('should return 401 when an invalid auth token is provided', async () => {`);
|
|
76
|
-
lines.push(` const response = await request(app)`);
|
|
77
|
-
lines.push(` .${method}('${endpoint.pathNormalized}')`);
|
|
78
|
-
lines.push(` .set('Authorization', '${scheme} invalid-token-value');`);
|
|
79
|
-
lines.push(``);
|
|
80
|
-
lines.push(` expect(response.status).toBe(401);`);
|
|
81
|
-
lines.push(` });`);
|
|
82
|
-
lines.push(` });`);
|
|
83
|
-
lines.push(``);
|
|
84
|
-
}
|
|
85
|
-
// Validation / error tests
|
|
86
|
-
const requiredParams = ctx.parameters.filter(p => p.required && p.in === 'body');
|
|
87
|
-
if (requiredParams.length > 0) {
|
|
88
|
-
lines.push(` describe('validation', () => {`);
|
|
89
|
-
for (const param of requiredParams.slice(0, 3)) {
|
|
90
|
-
lines.push(` it('should return 422 when ${param.name} is missing', async () => {`);
|
|
91
|
-
const partialPayload = {};
|
|
92
|
-
for (const other of requiredParams) {
|
|
93
|
-
if (other.name !== param.name) {
|
|
94
|
-
partialPayload[other.name] = 'test-value';
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
lines.push(` const response = await request(app)`);
|
|
98
|
-
lines.push(` .${method}('${endpoint.pathNormalized}')`);
|
|
99
|
-
if (authRequired) {
|
|
100
|
-
lines.push(` .set('Authorization', VALID_AUTH_TOKEN)`);
|
|
101
|
-
}
|
|
102
|
-
lines.push(` .send(${JSON.stringify(partialPayload)});`);
|
|
103
|
-
lines.push(``);
|
|
104
|
-
lines.push(` expect(response.status).toBe(422);`);
|
|
105
|
-
lines.push(` expect(response.body).toHaveProperty('errors');`);
|
|
106
|
-
lines.push(` });`);
|
|
107
|
-
lines.push(``);
|
|
108
|
-
}
|
|
109
|
-
lines.push(` });`);
|
|
110
|
-
}
|
|
111
|
-
lines.push(`});`);
|
|
112
|
-
lines.push(``);
|
|
113
|
-
return lines.join('\n');
|
|
37
|
+
const method = (_b = (_a = gap.endpoint) === null || _a === void 0 ? void 0 : _a.method) !== null && _b !== void 0 ? _b : 'GET';
|
|
38
|
+
const endpointPath = (_d = (_c = gap.endpoint) === null || _c === void 0 ? void 0 : _c.path) !== null && _d !== void 0 ? _d : '/unknown';
|
|
39
|
+
const methodLower = method.toLowerCase();
|
|
40
|
+
const header = renderFileHeader(gap.id, gap.type);
|
|
41
|
+
const body = `
|
|
42
|
+
import request from 'supertest'; // TODO: adjust import path
|
|
43
|
+
import app from '../../../src/app'; // TODO: adjust import path
|
|
44
|
+
|
|
45
|
+
describe('${method} ${endpointPath}', () => {
|
|
46
|
+
it('should return 200 with valid response', async () => {
|
|
47
|
+
const response = await request(app)
|
|
48
|
+
.${methodLower}('${endpointPath}')
|
|
49
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN'); // TODO: add valid token
|
|
50
|
+
|
|
51
|
+
expect(response.status).toBe(200);
|
|
52
|
+
expect(response.body).toMatchObject({}); // TODO: add expected shape
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('should return 401 when not authenticated', async () => {
|
|
56
|
+
const response = await request(app).${methodLower}('${endpointPath}');
|
|
57
|
+
expect(response.status).toBe(401);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
`;
|
|
61
|
+
return header + body.trimStart();
|
|
114
62
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
const
|
|
120
|
-
const
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
`
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
` const response = await request(app)`,
|
|
161
|
-
` .${method}('${endpoint.pathNormalized}')`,
|
|
162
|
-
` .set('Authorization', lowPrivToken);`,
|
|
163
|
-
``,
|
|
164
|
-
` // Expect either 401 (unauthenticated) or 403 (unauthorized)`,
|
|
165
|
-
` expect([401, 403]).toContain(response.status);`,
|
|
166
|
-
` });`,
|
|
167
|
-
`});`,
|
|
168
|
-
``,
|
|
169
|
-
`describe('Security: ${endpoint.method} ${endpoint.path} — Injection Prevention', () => {`,
|
|
170
|
-
` it('[SEC-INJ-01] should not execute SQL injection in request body', async () => {`,
|
|
171
|
-
` const response = await request(app)`,
|
|
172
|
-
` .${method}('${endpoint.pathNormalized}')`,
|
|
173
|
-
` .set('Authorization', VALID_AUTH_TOKEN)`,
|
|
174
|
-
` .send({ title: "'; DROP TABLE articles; --", body: 'Body', description: 'Desc' });`,
|
|
175
|
-
``,
|
|
176
|
-
` // Should either succeed (sanitized) or return 422 (rejected) — never 500`,
|
|
177
|
-
` expect(response.status).not.toBe(500);`,
|
|
178
|
-
` expect(response.status).not.toBe(503);`,
|
|
179
|
-
` });`,
|
|
180
|
-
``,
|
|
181
|
-
` it('[SEC-INJ-02] should not execute XSS in request fields', async () => {`,
|
|
182
|
-
` const response = await request(app)`,
|
|
183
|
-
` .${method}('${endpoint.pathNormalized}')`,
|
|
184
|
-
` .set('Authorization', VALID_AUTH_TOKEN)`,
|
|
185
|
-
` .send({ title: '<script>alert("xss")</script>', body: 'Body', description: 'Desc' });`,
|
|
186
|
-
``,
|
|
187
|
-
` expect(response.status).not.toBe(500);`,
|
|
188
|
-
``,
|
|
189
|
-
` if (response.status >= 200 && response.status < 300) {`,
|
|
190
|
-
` // If the server accepted it, it must have been sanitized`,
|
|
191
|
-
` const body = JSON.stringify(response.body);`,
|
|
192
|
-
` expect(body).not.toContain('<script>');`,
|
|
193
|
-
` }`,
|
|
194
|
-
` });`,
|
|
195
|
-
``,
|
|
196
|
-
` it('[SEC-INJ-03] should handle oversized payload gracefully', async () => {`,
|
|
197
|
-
` const oversizedBody = 'x'.repeat(10_000_000); // 10 MB`,
|
|
198
|
-
``,
|
|
199
|
-
` const response = await request(app)`,
|
|
200
|
-
` .${method}('${endpoint.pathNormalized}')`,
|
|
201
|
-
` .set('Authorization', VALID_AUTH_TOKEN)`,
|
|
202
|
-
` .send({ title: 'Test', body: oversizedBody, description: 'Desc' });`,
|
|
203
|
-
``,
|
|
204
|
-
` // Must not crash — 413 or 422 are acceptable`,
|
|
205
|
-
` expect([413, 422, 400]).toContain(response.status);`,
|
|
206
|
-
` });`,
|
|
207
|
-
`});`,
|
|
208
|
-
``,
|
|
209
|
-
];
|
|
210
|
-
return lines.join('\n');
|
|
63
|
+
function renderParameterMissing(gap, ctx) {
|
|
64
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
65
|
+
const paramName = (_b = (_a = gap.parameter) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : 'param';
|
|
66
|
+
const paramIn = (_d = (_c = gap.parameter) === null || _c === void 0 ? void 0 : _c.in) !== null && _d !== void 0 ? _d : 'query';
|
|
67
|
+
const required = (_f = (_e = gap.parameter) === null || _e === void 0 ? void 0 : _e.required) !== null && _f !== void 0 ? _f : false;
|
|
68
|
+
const endpointPath = (_h = (_g = gap.endpoint) === null || _g === void 0 ? void 0 : _g.path) !== null && _h !== void 0 ? _h : '/api/endpoint';
|
|
69
|
+
const method = (_k = (_j = gap.endpoint) === null || _j === void 0 ? void 0 : _j.method) !== null && _k !== void 0 ? _k : 'GET';
|
|
70
|
+
const methodLower = method.toLowerCase();
|
|
71
|
+
const header = renderFileHeader(gap.id, gap.type);
|
|
72
|
+
const body = `
|
|
73
|
+
import request from 'supertest'; // TODO: adjust import path
|
|
74
|
+
import app from '../../../src/app'; // TODO: adjust import path
|
|
75
|
+
|
|
76
|
+
describe('${method} ${endpointPath} — parameter: ${paramName}', () => {
|
|
77
|
+
it('should accept a valid ${paramName} ${paramIn} parameter', async () => {
|
|
78
|
+
const response = await request(app)
|
|
79
|
+
.${methodLower}('${endpointPath}')
|
|
80
|
+
${paramIn === 'query' ? `.query({ ${paramName}: 'valid-value' }) // TODO: provide valid value` : `.send({ ${paramName}: 'valid-value' }) // TODO: provide valid value`}
|
|
81
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN'); // TODO: add valid token
|
|
82
|
+
|
|
83
|
+
expect(response.status).toBe(200);
|
|
84
|
+
expect(response.body).toMatchObject({}); // TODO: add expected shape
|
|
85
|
+
});
|
|
86
|
+
${required
|
|
87
|
+
? `
|
|
88
|
+
it('should return 400 when ${paramName} is missing', async () => {
|
|
89
|
+
const response = await request(app)
|
|
90
|
+
.${methodLower}('${endpointPath}')
|
|
91
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN'); // TODO: add valid token
|
|
92
|
+
|
|
93
|
+
expect(response.status).toBe(400);
|
|
94
|
+
});
|
|
95
|
+
`
|
|
96
|
+
: ''}
|
|
97
|
+
it('should return 400 when ${paramName} is invalid', async () => {
|
|
98
|
+
const response = await request(app)
|
|
99
|
+
.${methodLower}('${endpointPath}')
|
|
100
|
+
${paramIn === 'query' ? `.query({ ${paramName}: 'INVALID_VALUE' }) // TODO: provide invalid value` : `.send({ ${paramName}: 'INVALID_VALUE' }) // TODO: provide invalid value`}
|
|
101
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN'); // TODO: add valid token
|
|
102
|
+
|
|
103
|
+
expect(response.status).toBe(400);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
`;
|
|
107
|
+
return header + body.trimStart();
|
|
211
108
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
const
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
}
|
|
246
|
-
lines.push(` it('Step ${i + 1}: ${step.description}${isMissing ? ' (MISSING COVERAGE)' : ''}', async () => {`);
|
|
247
|
-
if (isMissing) {
|
|
248
|
-
lines.push(` // TODO: This step was identified as missing. Implement the test.`);
|
|
249
|
-
}
|
|
250
|
-
lines.push(` const response = await request(app)`);
|
|
251
|
-
lines.push(` .${stepMethod}('${stepPath}')`);
|
|
252
|
-
lines.push(` .set('Authorization', authToken);`);
|
|
253
|
-
lines.push(``);
|
|
254
|
-
lines.push(` expect(response.status).toBe(200);`);
|
|
255
|
-
lines.push(` });`);
|
|
256
|
-
lines.push(``);
|
|
257
|
-
}
|
|
258
|
-
lines.push(`});`);
|
|
259
|
-
lines.push(``);
|
|
260
|
-
return lines.join('\n');
|
|
109
|
+
function renderParameterNotValidated(gap, ctx) {
|
|
110
|
+
var _a, _b, _c, _d, _e, _f;
|
|
111
|
+
const paramName = (_b = (_a = gap.parameter) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : 'param';
|
|
112
|
+
const endpointPath = (_d = (_c = gap.endpoint) === null || _c === void 0 ? void 0 : _c.path) !== null && _d !== void 0 ? _d : '/api/endpoint';
|
|
113
|
+
const method = (_f = (_e = gap.endpoint) === null || _e === void 0 ? void 0 : _e.method) !== null && _f !== void 0 ? _f : 'GET';
|
|
114
|
+
const methodLower = method.toLowerCase();
|
|
115
|
+
const header = renderFileHeader(gap.id, gap.type);
|
|
116
|
+
const body = `
|
|
117
|
+
import request from 'supertest'; // TODO: adjust import path
|
|
118
|
+
import app from '../../../src/app'; // TODO: adjust import path
|
|
119
|
+
|
|
120
|
+
describe('${method} ${endpointPath} — validation: ${paramName}', () => {
|
|
121
|
+
it('should reject empty ${paramName}', async () => {
|
|
122
|
+
const response = await request(app)
|
|
123
|
+
.${methodLower}('${endpointPath}')
|
|
124
|
+
.send({ ${paramName}: '' }) // TODO: adjust payload location
|
|
125
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
126
|
+
|
|
127
|
+
expect(response.status).toBe(400);
|
|
128
|
+
expect(response.body).toMatchObject({ error: expect.any(String) }); // TODO: match actual error shape
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('should reject ${paramName} exceeding max length', async () => {
|
|
132
|
+
const response = await request(app)
|
|
133
|
+
.${methodLower}('${endpointPath}')
|
|
134
|
+
.send({ ${paramName}: 'x'.repeat(1000) }) // TODO: adjust max length
|
|
135
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
136
|
+
|
|
137
|
+
expect(response.status).toBe(400);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
`;
|
|
141
|
+
return header + body.trimStart();
|
|
261
142
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
const
|
|
266
|
-
const
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
143
|
+
function renderBusinessMissing(gap, ctx) {
|
|
144
|
+
var _a, _b, _c, _d;
|
|
145
|
+
const ruleId = (_b = (_a = gap.businessRule) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : 'BR-XXX';
|
|
146
|
+
const description = (_d = (_c = gap.businessRule) === null || _c === void 0 ? void 0 : _c.description) !== null && _d !== void 0 ? _d : 'Business rule';
|
|
147
|
+
const header = renderFileHeader(gap.id, gap.type);
|
|
148
|
+
const body = `
|
|
149
|
+
import request from 'supertest'; // TODO: adjust import path
|
|
150
|
+
import app from '../../../src/app'; // TODO: adjust import path
|
|
151
|
+
|
|
152
|
+
// Business Rule: ${ruleId} — ${description}
|
|
153
|
+
describe('Business Rule ${ruleId}: ${description}', () => {
|
|
154
|
+
it('should enforce rule when conditions are met', async () => {
|
|
155
|
+
// TODO: set up test data that triggers the business rule
|
|
156
|
+
const response = await request(app)
|
|
157
|
+
.post('/api/TODO_ENDPOINT') // TODO: replace with actual endpoint
|
|
158
|
+
.send({
|
|
159
|
+
// TODO: add request body that triggers the rule
|
|
160
|
+
})
|
|
161
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
162
|
+
|
|
163
|
+
expect(response.status).toBe(422); // TODO: adjust expected status
|
|
164
|
+
expect(response.body).toMatchObject({
|
|
165
|
+
error: expect.any(String), // TODO: match actual error shape
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('should allow the operation when the rule is satisfied', async () => {
|
|
170
|
+
const response = await request(app)
|
|
171
|
+
.post('/api/TODO_ENDPOINT') // TODO: replace with actual endpoint
|
|
172
|
+
.send({
|
|
173
|
+
// TODO: add request body that satisfies the rule
|
|
174
|
+
})
|
|
175
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
176
|
+
|
|
177
|
+
expect(response.status).toBe(200); // TODO: adjust expected status
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
`;
|
|
181
|
+
return header + body.trimStart();
|
|
294
182
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
const
|
|
299
|
-
const
|
|
300
|
-
const
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
lines.push(``);
|
|
327
|
-
}
|
|
328
|
-
lines.push(`});`);
|
|
329
|
-
lines.push(``);
|
|
330
|
-
return lines.join('\n');
|
|
183
|
+
function renderIntegrationMissingStep(gap, ctx) {
|
|
184
|
+
var _a, _b, _c, _d, _e, _f;
|
|
185
|
+
const flowId = (_b = (_a = gap.integrationFlow) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : 'flow-001';
|
|
186
|
+
const flowName = (_d = (_c = gap.integrationFlow) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : 'Integration Flow';
|
|
187
|
+
const missingStep = (_f = (_e = gap.integrationFlow) === null || _e === void 0 ? void 0 : _e.missingStep) !== null && _f !== void 0 ? _f : 'step';
|
|
188
|
+
const header = renderFileHeader(gap.id, gap.type);
|
|
189
|
+
const body = `
|
|
190
|
+
import request from 'supertest'; // TODO: adjust import path
|
|
191
|
+
import app from '../../../src/app'; // TODO: adjust import path
|
|
192
|
+
|
|
193
|
+
// Integration Flow: ${flowId} — ${flowName}
|
|
194
|
+
describe('Integration Flow ${flowId}: ${flowName}', () => {
|
|
195
|
+
it('should complete the full flow including: ${missingStep}', async () => {
|
|
196
|
+
// Step 1: TODO — describe step 1
|
|
197
|
+
const step1 = await request(app)
|
|
198
|
+
.post('/api/TODO_STEP_1') // TODO: replace with actual endpoint
|
|
199
|
+
.send({}) // TODO: add step 1 body
|
|
200
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
201
|
+
expect(step1.status).toBe(200);
|
|
202
|
+
|
|
203
|
+
// Step 2: ${missingStep} (this was the missing step)
|
|
204
|
+
const step2 = await request(app)
|
|
205
|
+
.post('/api/TODO_STEP_2') // TODO: replace with actual endpoint
|
|
206
|
+
.send({}) // TODO: add step 2 body
|
|
207
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
208
|
+
expect(step2.status).toBe(200);
|
|
209
|
+
expect(step2.body).toMatchObject({}); // TODO: verify step 2 result
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
`;
|
|
213
|
+
return header + body.trimStart();
|
|
331
214
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
const
|
|
336
|
-
const
|
|
337
|
-
const
|
|
338
|
-
const
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
lines.push(` def test_requires_auth(self, client):`);
|
|
379
|
-
lines.push(` """Should return 401 when no auth token is provided."""`);
|
|
380
|
-
lines.push(` response = client.${method}('${endpoint.path}', json={})`);
|
|
381
|
-
lines.push(``);
|
|
382
|
-
lines.push(` assert response.status_code == 401`);
|
|
383
|
-
lines.push(``);
|
|
384
|
-
lines.push(` def test_invalid_token(self, client):`);
|
|
385
|
-
lines.push(` """Should return 401 when an invalid token is provided."""`);
|
|
386
|
-
lines.push(` response = client.${method}(`);
|
|
387
|
-
lines.push(` '${endpoint.path}',`);
|
|
388
|
-
lines.push(` json={},`);
|
|
389
|
-
lines.push(` headers={'Authorization': 'Token invalid-token'},`);
|
|
390
|
-
lines.push(` )`);
|
|
391
|
-
lines.push(``);
|
|
392
|
-
lines.push(` assert response.status_code == 401`);
|
|
393
|
-
lines.push(``);
|
|
394
|
-
}
|
|
395
|
-
return lines.join('\n');
|
|
215
|
+
function renderErrorMissingStatus(gap, ctx) {
|
|
216
|
+
var _a, _b, _c, _d;
|
|
217
|
+
const endpointPath = (_b = (_a = gap.endpoint) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : '/api/endpoint';
|
|
218
|
+
const method = (_d = (_c = gap.endpoint) === null || _c === void 0 ? void 0 : _c.method) !== null && _d !== void 0 ? _d : 'GET';
|
|
219
|
+
const methodLower = method.toLowerCase();
|
|
220
|
+
const header = renderFileHeader(gap.id, gap.type);
|
|
221
|
+
const body = `
|
|
222
|
+
import request from 'supertest'; // TODO: adjust import path
|
|
223
|
+
import app from '../../../src/app'; // TODO: adjust import path
|
|
224
|
+
|
|
225
|
+
describe('${method} ${endpointPath} — error handling', () => {
|
|
226
|
+
it('should return 400 for invalid request body', async () => {
|
|
227
|
+
const response = await request(app)
|
|
228
|
+
.${methodLower}('${endpointPath}')
|
|
229
|
+
.send({ invalidField: 'bad-value' }) // TODO: craft invalid payload
|
|
230
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
231
|
+
|
|
232
|
+
expect(response.status).toBe(400);
|
|
233
|
+
expect(response.body).toMatchObject({ error: expect.any(String) }); // TODO: match error shape
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('should return 401 when unauthenticated', async () => {
|
|
237
|
+
const response = await request(app).${methodLower}('${endpointPath}');
|
|
238
|
+
expect(response.status).toBe(401);
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it('should return 404 for non-existent resource', async () => {
|
|
242
|
+
const response = await request(app)
|
|
243
|
+
.${methodLower}('${endpointPath.replace('{id}', 'nonexistent-99999')}')
|
|
244
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
245
|
+
expect(response.status).toBe(404);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
it('should return 500 when the service fails', async () => {
|
|
249
|
+
// TODO: mock the service to throw an error
|
|
250
|
+
// Example with jest.spyOn:
|
|
251
|
+
// jest.spyOn(someService, 'someMethod').mockRejectedValueOnce(new Error('Service error'));
|
|
252
|
+
const response = await request(app)
|
|
253
|
+
.${methodLower}('${endpointPath}')
|
|
254
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
255
|
+
// TODO: trigger 500 condition
|
|
256
|
+
expect(response.status).toBeGreaterThanOrEqual(500);
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
`;
|
|
260
|
+
return header + body.trimStart();
|
|
396
261
|
}
|
|
397
|
-
function
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
262
|
+
function renderSecurityMissingAuth(gap, ctx) {
|
|
263
|
+
var _a, _b, _c, _d;
|
|
264
|
+
const endpointPath = (_b = (_a = gap.endpoint) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : '/api/endpoint';
|
|
265
|
+
const method = (_d = (_c = gap.endpoint) === null || _c === void 0 ? void 0 : _c.method) !== null && _d !== void 0 ? _d : 'GET';
|
|
266
|
+
const methodLower = method.toLowerCase();
|
|
267
|
+
const header = renderFileHeader(gap.id, gap.type);
|
|
268
|
+
const body = `
|
|
269
|
+
import request from 'supertest'; // TODO: adjust import path
|
|
270
|
+
import app from '../../../src/app'; // TODO: adjust import path
|
|
271
|
+
|
|
272
|
+
describe('${method} ${endpointPath} — authentication', () => {
|
|
273
|
+
it('should return 401 when no token is provided', async () => {
|
|
274
|
+
const response = await request(app).${methodLower}('${endpointPath}');
|
|
275
|
+
expect(response.status).toBe(401);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it('should return 401 when an invalid token is provided', async () => {
|
|
279
|
+
const response = await request(app)
|
|
280
|
+
.${methodLower}('${endpointPath}')
|
|
281
|
+
.set('Authorization', 'Bearer invalid-token-here');
|
|
282
|
+
expect(response.status).toBe(401);
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
it('should return 403 when the user lacks required permissions', async () => {
|
|
286
|
+
const response = await request(app)
|
|
287
|
+
.${methodLower}('${endpointPath}')
|
|
288
|
+
.set('Authorization', 'Bearer TODO_LOW_PRIVILEGE_TOKEN'); // TODO: provide a low-privilege token
|
|
289
|
+
expect(response.status).toBe(403);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it('should succeed when a valid authorized token is provided', async () => {
|
|
293
|
+
const response = await request(app)
|
|
294
|
+
.${methodLower}('${endpointPath}')
|
|
295
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN'); // TODO: provide valid token
|
|
296
|
+
expect(response.status).toBe(200);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
`;
|
|
300
|
+
return header + body.trimStart();
|
|
401
301
|
}
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
const
|
|
406
|
-
const
|
|
407
|
-
const
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
302
|
+
function renderSecurityInjection(gap, ctx) {
|
|
303
|
+
var _a, _b, _c, _d;
|
|
304
|
+
const endpointPath = (_b = (_a = gap.endpoint) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : '/api/endpoint';
|
|
305
|
+
const method = (_d = (_c = gap.endpoint) === null || _c === void 0 ? void 0 : _c.method) !== null && _d !== void 0 ? _d : 'POST';
|
|
306
|
+
const methodLower = method.toLowerCase();
|
|
307
|
+
const injectionCases = exports.OWASP_INJECTION_STRINGS.slice(0, 4)
|
|
308
|
+
.map((s) => ` { input: ${JSON.stringify(s)}, label: 'injection: ${s.slice(0, 20)}...' },`)
|
|
309
|
+
.join('\n');
|
|
310
|
+
const header = renderFileHeader(gap.id, gap.type);
|
|
311
|
+
const body = `
|
|
312
|
+
import request from 'supertest'; // TODO: adjust import path
|
|
313
|
+
import app from '../../../src/app'; // TODO: adjust import path
|
|
314
|
+
|
|
315
|
+
describe('${method} ${endpointPath} — injection security', () => {
|
|
316
|
+
const injectionPayloads = [
|
|
317
|
+
${injectionCases}
|
|
318
|
+
];
|
|
319
|
+
|
|
320
|
+
it.each(injectionPayloads)('should reject $label', async ({ input }) => {
|
|
321
|
+
const response = await request(app)
|
|
322
|
+
.${methodLower}('${endpointPath}')
|
|
323
|
+
.send({ field: input }) // TODO: replace 'field' with actual vulnerable field name
|
|
324
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
325
|
+
|
|
326
|
+
expect(response.status).toBe(400); // TODO: adjust — may be 422 or 200 with sanitised output
|
|
327
|
+
expect(response.body).not.toMatchObject({ data: input }); // TODO: verify injection is blocked
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
`;
|
|
331
|
+
return header + body.trimStart();
|
|
332
|
+
}
|
|
333
|
+
function renderPerformanceMissingSla(gap, ctx) {
|
|
334
|
+
var _a, _b, _c, _d;
|
|
335
|
+
const endpointPath = (_b = (_a = gap.endpoint) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : '/api/endpoint';
|
|
336
|
+
const method = (_d = (_c = gap.endpoint) === null || _c === void 0 ? void 0 : _c.method) !== null && _d !== void 0 ? _d : 'GET';
|
|
337
|
+
const methodLower = method.toLowerCase();
|
|
338
|
+
const header = renderFileHeader(gap.id, gap.type);
|
|
339
|
+
const body = `
|
|
340
|
+
import request from 'supertest'; // TODO: adjust import path
|
|
341
|
+
import app from '../../../src/app'; // TODO: adjust import path
|
|
342
|
+
|
|
343
|
+
const SLA_RESPONSE_MS = 500; // TODO: adjust SLA threshold
|
|
344
|
+
|
|
345
|
+
describe('${method} ${endpointPath} — performance SLA', () => {
|
|
346
|
+
it('should respond within SLA threshold', async () => {
|
|
347
|
+
const start = Date.now();
|
|
348
|
+
const response = await request(app)
|
|
349
|
+
.${methodLower}('${endpointPath}')
|
|
350
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
351
|
+
const elapsed = Date.now() - start;
|
|
352
|
+
|
|
353
|
+
expect(response.status).toBe(200);
|
|
354
|
+
expect(elapsed).toBeLessThan(SLA_RESPONSE_MS);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
it('should handle concurrent requests within SLA', async () => {
|
|
358
|
+
const concurrency = 5; // TODO: adjust concurrency level
|
|
359
|
+
const start = Date.now();
|
|
360
|
+
const responses = await Promise.all(
|
|
361
|
+
Array.from({ length: concurrency }, () =>
|
|
362
|
+
request(app)
|
|
363
|
+
.${methodLower}('${endpointPath}')
|
|
364
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN'),
|
|
365
|
+
),
|
|
366
|
+
);
|
|
367
|
+
const elapsed = Date.now() - start;
|
|
368
|
+
|
|
369
|
+
for (const response of responses) {
|
|
370
|
+
expect(response.status).toBe(200);
|
|
456
371
|
}
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
372
|
+
expect(elapsed / concurrency).toBeLessThan(SLA_RESPONSE_MS);
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
`;
|
|
376
|
+
return header + body.trimStart();
|
|
460
377
|
}
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
const
|
|
465
|
-
const
|
|
466
|
-
const
|
|
467
|
-
const
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
lines.push(` expect(response.status).to.eq(200);`);
|
|
484
|
-
lines.push(` authToken = \`Token \${response.body.user.token}\`;`);
|
|
485
|
-
lines.push(` });`);
|
|
486
|
-
lines.push(` });`);
|
|
487
|
-
lines.push(``);
|
|
378
|
+
function renderResilienceMissingRetry(gap, ctx) {
|
|
379
|
+
var _a, _b, _c, _d;
|
|
380
|
+
const endpointPath = (_b = (_a = gap.endpoint) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : '/api/endpoint';
|
|
381
|
+
const method = (_d = (_c = gap.endpoint) === null || _c === void 0 ? void 0 : _c.method) !== null && _d !== void 0 ? _d : 'GET';
|
|
382
|
+
const methodLower = method.toLowerCase();
|
|
383
|
+
const header = renderFileHeader(gap.id, gap.type);
|
|
384
|
+
const body = `
|
|
385
|
+
import request from 'supertest'; // TODO: adjust import path
|
|
386
|
+
import app from '../../../src/app'; // TODO: adjust import path
|
|
387
|
+
|
|
388
|
+
describe('${method} ${endpointPath} — resilience / retry', () => {
|
|
389
|
+
it('should return 503 or retry-after header when service is unavailable', async () => {
|
|
390
|
+
// TODO: mock downstream dependency to simulate failure
|
|
391
|
+
// jest.spyOn(downstreamService, 'call').mockRejectedValueOnce(new Error('Downstream unavailable'));
|
|
392
|
+
const response = await request(app)
|
|
393
|
+
.${methodLower}('${endpointPath}')
|
|
394
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
395
|
+
|
|
396
|
+
// Either the service retries successfully (200) or signals unavailability (503)
|
|
397
|
+
expect([200, 503]).toContain(response.status);
|
|
398
|
+
if (response.status === 503) {
|
|
399
|
+
expect(response.headers).toHaveProperty('retry-after'); // TODO: check actual header name
|
|
488
400
|
}
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
it('should handle circuit-breaker open state gracefully', async () => {
|
|
404
|
+
// TODO: trigger circuit breaker open state
|
|
405
|
+
const response = await request(app)
|
|
406
|
+
.${methodLower}('${endpointPath}')
|
|
407
|
+
.set('Authorization', 'Bearer TODO_VALID_TOKEN');
|
|
408
|
+
|
|
409
|
+
expect(response.status).toBe(503); // TODO: adjust expected status
|
|
410
|
+
expect(response.body).toMatchObject({ error: expect.any(String) });
|
|
411
|
+
});
|
|
412
|
+
});
|
|
413
|
+
`;
|
|
414
|
+
return header + body.trimStart();
|
|
415
|
+
}
|
|
416
|
+
// ─── Python / pytest templates ────────────────────────────────────────────────
|
|
417
|
+
function renderPythonEndpoint(gap, ctx) {
|
|
418
|
+
var _a, _b, _c, _d;
|
|
419
|
+
const method = (_b = (_a = gap.endpoint) === null || _a === void 0 ? void 0 : _a.method) !== null && _b !== void 0 ? _b : 'GET';
|
|
420
|
+
const endpointPath = (_d = (_c = gap.endpoint) === null || _c === void 0 ? void 0 : _c.path) !== null && _d !== void 0 ? _d : '/api/endpoint';
|
|
421
|
+
const methodLower = method.toLowerCase();
|
|
422
|
+
const header = renderFileHeader(gap.id, gap.type).replace(/\/\//g, '#');
|
|
423
|
+
const body = `
|
|
424
|
+
import pytest
|
|
425
|
+
import requests # TODO: adjust import path
|
|
426
|
+
|
|
427
|
+
BASE_URL = "${ctx.baseUrl}" # TODO: adjust base URL
|
|
428
|
+
AUTH_TOKEN = "TODO_VALID_TOKEN" # TODO: add valid token
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
class Test${method.charAt(0) + method.slice(1).toLowerCase()}${endpointPath.replace(/[^a-zA-Z0-9]/g, '_')}:
|
|
432
|
+
def test_returns_200_with_valid_request(self):
|
|
433
|
+
response = requests.${methodLower}(
|
|
434
|
+
f"{BASE_URL}${endpointPath}",
|
|
435
|
+
headers={"Authorization": f"Bearer {AUTH_TOKEN}"},
|
|
436
|
+
)
|
|
437
|
+
assert response.status_code == 200
|
|
438
|
+
assert response.json() is not None # TODO: replace with specific assertion
|
|
439
|
+
|
|
440
|
+
def test_returns_401_when_unauthenticated(self):
|
|
441
|
+
response = requests.${methodLower}(f"{BASE_URL}${endpointPath}")
|
|
442
|
+
assert response.status_code == 401
|
|
443
|
+
`;
|
|
444
|
+
return header + body.trimStart();
|
|
445
|
+
}
|
|
446
|
+
// ─── Java / JUnit5 templates ──────────────────────────────────────────────────
|
|
447
|
+
function renderJavaEndpoint(gap, ctx) {
|
|
448
|
+
var _a, _b, _c, _d;
|
|
449
|
+
const method = (_b = (_a = gap.endpoint) === null || _a === void 0 ? void 0 : _a.method) !== null && _b !== void 0 ? _b : 'GET';
|
|
450
|
+
const endpointPath = (_d = (_c = gap.endpoint) === null || _c === void 0 ? void 0 : _c.path) !== null && _d !== void 0 ? _d : '/api/endpoint';
|
|
451
|
+
const className = `Test${gap.id.split('-').map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('')}`;
|
|
452
|
+
const header = renderFileHeader(gap.id, gap.type).replace(/\/\//g, '//');
|
|
453
|
+
const body = `
|
|
454
|
+
package generated;
|
|
455
|
+
|
|
456
|
+
import org.junit.jupiter.api.Test;
|
|
457
|
+
import org.springframework.boot.test.context.SpringBootTest;
|
|
458
|
+
import org.springframework.beans.factory.annotation.Autowired;
|
|
459
|
+
import org.springframework.test.web.servlet.MockMvc;
|
|
460
|
+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
|
461
|
+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
|
462
|
+
|
|
463
|
+
// TODO: Add @SpringBootTest or @WebMvcTest and adjust imports
|
|
464
|
+
@SpringBootTest
|
|
465
|
+
class ${className} {
|
|
466
|
+
|
|
467
|
+
@Autowired
|
|
468
|
+
private MockMvc mockMvc; // TODO: inject MockMvc
|
|
469
|
+
|
|
470
|
+
@Test
|
|
471
|
+
void shouldReturn200WithValidRequest() throws Exception {
|
|
472
|
+
mockMvc.perform(${method.toLowerCase()}("${endpointPath}")
|
|
473
|
+
.header("Authorization", "Bearer TODO_VALID_TOKEN")) // TODO: add valid token
|
|
474
|
+
.andExpect(status().isOk())
|
|
475
|
+
.andExpect(jsonPath("$").isNotEmpty()); // TODO: replace with specific assertion
|
|
495
476
|
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
lines.push(` });`);
|
|
502
|
-
lines.push(``);
|
|
503
|
-
if (authRequired) {
|
|
504
|
-
lines.push(` it('should return 401 without auth token', () => {`);
|
|
505
|
-
lines.push(` cy.request({`);
|
|
506
|
-
lines.push(` method: '${method}',`);
|
|
507
|
-
lines.push(` url: '${endpoint.path}',`);
|
|
508
|
-
lines.push(` body: {},`);
|
|
509
|
-
lines.push(` failOnStatusCode: false, // RULE-CY03`);
|
|
510
|
-
lines.push(` }).then((response) => {`);
|
|
511
|
-
lines.push(` expect(response.status).to.eq(401);`);
|
|
512
|
-
lines.push(` });`);
|
|
513
|
-
lines.push(` });`);
|
|
477
|
+
|
|
478
|
+
@Test
|
|
479
|
+
void shouldReturn401WhenUnauthenticated() throws Exception {
|
|
480
|
+
mockMvc.perform(${method.toLowerCase()}("${endpointPath}"))
|
|
481
|
+
.andExpect(status().isUnauthorized());
|
|
514
482
|
}
|
|
515
|
-
lines.push(`});`);
|
|
516
|
-
lines.push(``);
|
|
517
|
-
return lines.join('\n');
|
|
518
483
|
}
|
|
519
|
-
|
|
520
|
-
|
|
484
|
+
`;
|
|
485
|
+
return header + body.trimStart();
|
|
486
|
+
}
|
|
487
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
488
|
+
/** Render test file content for a given gap and context */
|
|
489
|
+
function renderTemplate(gap, ctx) {
|
|
490
|
+
const { language } = ctx;
|
|
521
491
|
if (language === 'python') {
|
|
522
|
-
return
|
|
492
|
+
return renderPythonEndpoint(gap, ctx);
|
|
523
493
|
}
|
|
524
494
|
if (language === 'java' || language === 'kotlin') {
|
|
525
|
-
return
|
|
495
|
+
return renderJavaEndpoint(gap, ctx);
|
|
526
496
|
}
|
|
527
|
-
//
|
|
528
|
-
switch (
|
|
529
|
-
case '
|
|
530
|
-
return
|
|
531
|
-
case '
|
|
532
|
-
return
|
|
533
|
-
case '
|
|
534
|
-
return
|
|
497
|
+
// TypeScript / JavaScript (Jest, Cypress, Playwright)
|
|
498
|
+
switch (gap.type) {
|
|
499
|
+
case 'endpoint:missing':
|
|
500
|
+
return renderEndpointMissing(gap, ctx);
|
|
501
|
+
case 'parameter:missing':
|
|
502
|
+
return renderParameterMissing(gap, ctx);
|
|
503
|
+
case 'parameter:not-validated':
|
|
504
|
+
return renderParameterNotValidated(gap, ctx);
|
|
505
|
+
case 'business:missing':
|
|
506
|
+
return renderBusinessMissing(gap, ctx);
|
|
507
|
+
case 'integration:missing-step':
|
|
508
|
+
return renderIntegrationMissingStep(gap, ctx);
|
|
509
|
+
case 'error:missing-status':
|
|
510
|
+
return renderErrorMissingStatus(gap, ctx);
|
|
511
|
+
case 'security:missing-auth':
|
|
512
|
+
return renderSecurityMissingAuth(gap, ctx);
|
|
513
|
+
case 'security:injection':
|
|
514
|
+
return renderSecurityInjection(gap, ctx);
|
|
515
|
+
case 'performance:missing-sla':
|
|
516
|
+
return renderPerformanceMissingSla(gap, ctx);
|
|
517
|
+
case 'resilience:missing-retry':
|
|
518
|
+
return renderResilienceMissingRetry(gap, ctx);
|
|
535
519
|
default:
|
|
536
|
-
|
|
537
|
-
switch (ctx.gap.type) {
|
|
538
|
-
case 'error':
|
|
539
|
-
return renderTypescriptJestErrorScenario(ctx);
|
|
540
|
-
case 'business':
|
|
541
|
-
return renderTypescriptJestBusinessRule(ctx);
|
|
542
|
-
default:
|
|
543
|
-
return renderTypescriptJestUnit(ctx);
|
|
544
|
-
}
|
|
520
|
+
return renderEndpointMissing(gap, ctx);
|
|
545
521
|
}
|
|
546
522
|
}
|
|
523
|
+
/** Returns the template name used for a given gap type */
|
|
524
|
+
function getTemplateName(gap, ctx) {
|
|
525
|
+
return `${ctx.language}/${ctx.framework}/${gap.type}`;
|
|
526
|
+
}
|