api-tests-coverage 1.0.20 → 1.0.21
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/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/index.js +93 -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/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/package.json +3 -3
- package/dist/dashboard/assets/_baseUniq-BZHS9wTU.js +0 -1
- package/dist/dashboard/assets/arc-D4xT0thw.js +0 -1
- package/dist/dashboard/assets/architectureDiagram-VXUJARFQ-Bs48s9rH.js +0 -36
- package/dist/dashboard/assets/c4Diagram-YG6GDRKO-DuP3tG_c.js +0 -10
- 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/diagram-S2PKOQOG-Bk_jyoxg.js +0 -24
- package/dist/dashboard/assets/erDiagram-Q2GNP2WA-BbPQp6RA.js +0 -60
- package/dist/dashboard/assets/flowDiagram-NV44I4VS-1j044bLK.js +0 -162
- package/dist/dashboard/assets/gitGraphDiagram-V2S2FVAM-RgQMxxaQ.js +0 -65
- package/dist/dashboard/assets/index-Bt72YjAZ.css +0 -1
- package/dist/dashboard/assets/index-DuT2LnIf.js +0 -523
- package/dist/dashboard/assets/journeyDiagram-XKPGCS4Q-CdvZAxeA.js +0 -139
- package/dist/dashboard/assets/kanban-definition-3W4ZIXB7-DTse5xX8.js +0 -89
- package/dist/dashboard/assets/layout-CnKzeCpQ.js +0 -1
- package/dist/dashboard/assets/quadrantDiagram-AYHSOK5B-C6NljtBN.js +0 -7
- package/dist/dashboard/assets/requirementDiagram-UZGBJVZJ-Ban4o6oK.js +0 -64
- 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/treemap-GDKQZRPO-D-XpcCUD.js +0 -162
- package/dist/dashboard/assets/xychartDiagram-PRI3JC2R-BlIpbwyn.js +0 -7
- package/dist/dashboard/dist/assets/_basePickBy-C2jmWITn.js +0 -1
- 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-B-Q4nGPT.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-Bs48s9rH.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-BPw-T2eL.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-B9cIE1K2.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-BIFhHB94.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-B3IrqteW.js +0 -165
- 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-B7xHuqZu.js +0 -220
- 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-BBMfQbw1.js +0 -15
- 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-BBQ6Q-9S.js +0 -1
- 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-9uXt-06K.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-BjDMUc_L.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-DLYZ4dZA.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/cytoscape.esm-CyJtwmzi.js +0 -331
- package/dist/dashboard/dist/assets/dagre-6UL2VRFP-B8oEROJc.js +0 -4
- 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-5uki9Dw8.js +0 -24
- 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-BRNhmby2.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-BbPQp6RA.js +0 -60
- 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-BAHshMEg.js +0 -162
- 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-BS4JnN-M.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-CD7-npU0.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-D3_88Gr5.js +0 -777
- 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-BMp4C5wf.js +0 -2
- 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/katex-O9d3_IXG.js +0 -261
- package/dist/dashboard/dist/assets/layout-6njVG9Ld.js +0 -1
- 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-B7wYeLe1.js +0 -68
- 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-5pSPRGJ2.js +0 -30
- 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-BDImwZtB.js +0 -10
- 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-1d8_kyI3.js +0 -145
- 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-BWqoDymf.js +0 -1
- 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-CBR9kqeJ.js +0 -61
- 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-7aSkQtVu.js +0 -7
- 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/dist/index.html +0 -14
- package/dist/dashboard/dist/reports/business-coverage.json +0 -201
- package/dist/dashboard/dist/reports/coverage-intelligence.json +0 -728
- package/dist/dashboard/dist/reports/coverage-summary.json +0 -763
- package/dist/dashboard/dist/reports/endpoint-coverage.json +0 -336
- package/dist/dashboard/dist/reports/error-coverage.json +0 -367
- package/dist/dashboard/dist/reports/missing-tests-recommendations.json +0 -285
- package/dist/dashboard/dist/reports/risk-prioritization.json +0 -312
- package/dist/dashboard/dist/reports/security-coverage.json +0 -299
- package/dist/dashboard/dist/vite.svg +0 -1
- 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/context-builder.d.ts +0 -16
- package/dist/src/generation/context-builder.d.ts.map +0 -1
- package/dist/src/generation/context-builder.js +0 -170
- package/dist/src/generation/engine.d.ts +0 -19
- package/dist/src/generation/engine.d.ts.map +0 -1
- package/dist/src/generation/engine.js +0 -204
- package/dist/src/generation/file-router.d.ts +0 -8
- package/dist/src/generation/file-router.d.ts.map +0 -1
- package/dist/src/generation/file-router.js +0 -98
- package/dist/src/generation/gap-extractor.d.ts +0 -7
- package/dist/src/generation/gap-extractor.d.ts.map +0 -1
- package/dist/src/generation/gap-extractor.js +0 -291
- 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/src/generation/template-renderer.d.ts +0 -12
- package/dist/src/generation/template-renderer.d.ts.map +0 -1
- package/dist/src/generation/template-renderer.js +0 -546
- package/dist/src/generation/types.d.ts +0 -269
- package/dist/src/generation/types.d.ts.map +0 -1
- package/dist/src/generation/types.js +0 -6
- /package/dist/dashboard/{dist/assets → assets}/index-D_begBP0.css +0 -0
package/dist/src/index.js
CHANGED
|
@@ -63,7 +63,6 @@ const integrationFlowInference_1 = require("./inference/integrationFlowInference
|
|
|
63
63
|
const routeInference_1 = require("./inference/routeInference");
|
|
64
64
|
const scanManifest_1 = require("./inference/scanManifest");
|
|
65
65
|
const serveDashboard_1 = require("./serveDashboard");
|
|
66
|
-
const index_4 = require("./generation/index");
|
|
67
66
|
// Register all language AST analyzers at startup.
|
|
68
67
|
// This side-effect import ensures each language module's registerAnalyzer() call runs.
|
|
69
68
|
(0, astAnalysisOrchestrator_1.registerAllAnalyzers)();
|
|
@@ -1403,7 +1402,7 @@ program
|
|
|
1403
1402
|
.option('--port <port>', 'Port for the dashboard server (requires --dashboard)', parseInt)
|
|
1404
1403
|
.option('--open', 'Open the dashboard in your browser automatically (requires --dashboard)')
|
|
1405
1404
|
.action(async (options) => {
|
|
1406
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u
|
|
1405
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
|
|
1407
1406
|
const { metricsPort, serviceName } = setupObservability();
|
|
1408
1407
|
const logger = (0, observability_1.getLogger)();
|
|
1409
1408
|
const configPath = program.opts()['config'];
|
|
@@ -1456,7 +1455,7 @@ program
|
|
|
1456
1455
|
}
|
|
1457
1456
|
// ── 3. Integration flow inference ──────────────────────────────────────
|
|
1458
1457
|
if (doInferFlows) {
|
|
1459
|
-
inferredFlowsResult = (0, integrationFlowInference_1.inferIntegrationFlows)(artifacts.testFiles, warnings
|
|
1458
|
+
inferredFlowsResult = (0, integrationFlowInference_1.inferIntegrationFlows)(artifacts.testFiles, warnings);
|
|
1460
1459
|
const flowsPath = (0, integrationFlowInference_1.writeInferredIntegrationFlows)(inferredFlowsResult, reportsDir);
|
|
1461
1460
|
console.log(`\nIntegration Flow Inference`);
|
|
1462
1461
|
console.log(` Multi-step flows detected in tests: ${inferredFlowsResult.flows.length}`);
|
|
@@ -1514,13 +1513,6 @@ program
|
|
|
1514
1513
|
while ((m = TEST_DECL_RE.exec(content)) !== null) {
|
|
1515
1514
|
descriptions.push(m[2].toLowerCase());
|
|
1516
1515
|
}
|
|
1517
|
-
// Generic: extract test function/method names for Python (def test_xxx),
|
|
1518
|
-
// Ruby (def test_xxx), and similar frameworks where test names are method names.
|
|
1519
|
-
const GENERIC_TEST_FN_RE = /\bdef\s+((?:test|should|spec)_\w+)\s*\(/g;
|
|
1520
|
-
GENERIC_TEST_FN_RE.lastIndex = 0;
|
|
1521
|
-
while ((m = GENERIC_TEST_FN_RE.exec(content)) !== null) {
|
|
1522
|
-
descriptions.push(m[1].replace(/_/g, ' ').toLowerCase());
|
|
1523
|
-
}
|
|
1524
1516
|
}
|
|
1525
1517
|
return [{ file: tf, contentLower, descriptions, isJavaLike }];
|
|
1526
1518
|
});
|
|
@@ -1740,6 +1732,96 @@ program
|
|
|
1740
1732
|
allCoverageResults.push(errorResult);
|
|
1741
1733
|
console.log(` ${errorCovered}/${errorItems.length} inferred error scenarios have test coverage (${errorPct}%)`);
|
|
1742
1734
|
}
|
|
1735
|
+
// ── 4b-alt. Parameter coverage from inferred routes + body params ──
|
|
1736
|
+
// Extract path parameters (e.g. ':article', ':id') and body params
|
|
1737
|
+
// (e.g. 'req.body.email') from inferred routes and business rules.
|
|
1738
|
+
// This populates the Parameters tab even without an OpenAPI spec.
|
|
1739
|
+
console.log(`\nAnalyzing parameter coverage (from inferred routes)...`);
|
|
1740
|
+
try {
|
|
1741
|
+
const paramItems = [];
|
|
1742
|
+
// Path parameters from routes
|
|
1743
|
+
const seenParamKeys = new Set();
|
|
1744
|
+
for (const epItem of endpointItems) {
|
|
1745
|
+
const route = routeResult.routes.find((r) => `${r.method.toUpperCase()} ${r.path}` === epItem.id);
|
|
1746
|
+
if (!route)
|
|
1747
|
+
continue;
|
|
1748
|
+
const pathParams = route.path.split('/').filter((s) => s.startsWith(':'));
|
|
1749
|
+
for (const param of pathParams) {
|
|
1750
|
+
const paramName = param.slice(1); // strip ':'
|
|
1751
|
+
const key = `${paramName}@${route.method.toUpperCase()}`;
|
|
1752
|
+
if (seenParamKeys.has(key))
|
|
1753
|
+
continue;
|
|
1754
|
+
seenParamKeys.add(key);
|
|
1755
|
+
paramItems.push({
|
|
1756
|
+
id: `PATH :${paramName} @ ${epItem.id}`,
|
|
1757
|
+
covered: epItem.covered, // param is covered if the route is covered
|
|
1758
|
+
matchedTests: epItem.matchedTests,
|
|
1759
|
+
param_type: 'path',
|
|
1760
|
+
source_file: route.sourceFile,
|
|
1761
|
+
line_number: route.lineNumber,
|
|
1762
|
+
});
|
|
1763
|
+
}
|
|
1764
|
+
}
|
|
1765
|
+
// Body parameters from inferred business rules (req.body.<field>)
|
|
1766
|
+
if (inferredRulesResult) {
|
|
1767
|
+
const BODY_PARAM_RE = /req\.body\.(\w+)/g;
|
|
1768
|
+
const seenBodyParams = new Set();
|
|
1769
|
+
for (const rule of inferredRulesResult.rules) {
|
|
1770
|
+
let bm;
|
|
1771
|
+
BODY_PARAM_RE.lastIndex = 0;
|
|
1772
|
+
const combinedText = `${rule.condition} ${rule.code_snippet}`;
|
|
1773
|
+
while ((bm = BODY_PARAM_RE.exec(combinedText)) !== null) {
|
|
1774
|
+
const fieldName = bm[1];
|
|
1775
|
+
const paramKey = `body_${fieldName}_${(_q = rule.endpoint) !== null && _q !== void 0 ? _q : ''}`;
|
|
1776
|
+
if (seenBodyParams.has(paramKey))
|
|
1777
|
+
continue;
|
|
1778
|
+
seenBodyParams.add(paramKey);
|
|
1779
|
+
const endpointLabel = (_r = rule.endpoint) !== null && _r !== void 0 ? _r : 'unknown endpoint';
|
|
1780
|
+
// Match: any test description mentioning the field name
|
|
1781
|
+
const fieldNameLower = fieldName.toLowerCase();
|
|
1782
|
+
const matchedTestDescs = [];
|
|
1783
|
+
for (const { file, descriptions } of testEntries) {
|
|
1784
|
+
const hitting = descriptions.filter((desc) => desc.includes(fieldNameLower));
|
|
1785
|
+
if (hitting.length > 0) {
|
|
1786
|
+
matchedTestDescs.push(...hitting.map((d) => `[${path.basename(file)}] ${d}`));
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
const srcParts = (_t = (_s = rule.source_location) === null || _s === void 0 ? void 0 : _s.split(':')) !== null && _t !== void 0 ? _t : [];
|
|
1790
|
+
const srcFile = srcParts[0];
|
|
1791
|
+
const srcLine = srcParts[1] !== undefined ? parseInt(srcParts[1], 10) : undefined;
|
|
1792
|
+
paramItems.push({
|
|
1793
|
+
id: `BODY ${fieldName} @ ${endpointLabel}`,
|
|
1794
|
+
covered: matchedTestDescs.length > 0,
|
|
1795
|
+
matchedTests: matchedTestDescs,
|
|
1796
|
+
param_type: 'body',
|
|
1797
|
+
source_file: srcFile,
|
|
1798
|
+
line_number: srcLine && srcLine > 0 ? srcLine : undefined,
|
|
1799
|
+
});
|
|
1800
|
+
}
|
|
1801
|
+
}
|
|
1802
|
+
}
|
|
1803
|
+
if (paramItems.length > 0) {
|
|
1804
|
+
const paramCovered = paramItems.filter((i) => i.covered).length;
|
|
1805
|
+
const paramPct = Math.round((paramCovered / paramItems.length) * 100);
|
|
1806
|
+
allCoverageResults.push({
|
|
1807
|
+
type: 'parameter',
|
|
1808
|
+
totalItems: paramItems.length,
|
|
1809
|
+
coveredItems: paramCovered,
|
|
1810
|
+
coveragePercent: paramPct,
|
|
1811
|
+
details: {
|
|
1812
|
+
total: paramItems.length,
|
|
1813
|
+
covered: paramCovered,
|
|
1814
|
+
percentage: paramPct,
|
|
1815
|
+
items: paramItems,
|
|
1816
|
+
source: 'inferred',
|
|
1817
|
+
},
|
|
1818
|
+
});
|
|
1819
|
+
console.log(` ${paramCovered}/${paramItems.length} inferred parameters have test coverage (${paramPct}%)`);
|
|
1820
|
+
}
|
|
1821
|
+
}
|
|
1822
|
+
catch (paramErr) {
|
|
1823
|
+
warnings.push(`Parameter inference failed: ${paramErr instanceof Error ? paramErr.message : String(paramErr)}`);
|
|
1824
|
+
}
|
|
1743
1825
|
}
|
|
1744
1826
|
else {
|
|
1745
1827
|
warnings.push('No routes detected in service files; endpoint coverage skipped.');
|
|
@@ -1917,137 +1999,6 @@ program
|
|
|
1917
1999
|
allCoverageResults.push(flowResult);
|
|
1918
2000
|
console.log(` ${syntheticReport.complete}/${syntheticReport.total} multi-step flows detected and covered (100%)`);
|
|
1919
2001
|
}
|
|
1920
|
-
// ── 4f-perf. Performance & resilience coverage ────────────────────────────
|
|
1921
|
-
// When load-test files (JMeter/k6/Gatling) are available, use them.
|
|
1922
|
-
// When none are found, infer performance/resilience evidence from test content.
|
|
1923
|
-
{
|
|
1924
|
-
// ─ Keywords ──────────────────────────────────────────────────────────────
|
|
1925
|
-
const PERF_KEYWORDS = [
|
|
1926
|
-
'load', 'performance', 'stress', 'throughput', 'latency', 'benchmark',
|
|
1927
|
-
'concurrent', 'response time', 'response_time', 'timing', 'timed',
|
|
1928
|
-
'slow', 'fast', 'speed', 'millisecond', 'ms ', ' ms',
|
|
1929
|
-
];
|
|
1930
|
-
const RESILIENCE_KEYWORD_MAP = {
|
|
1931
|
-
'timeout': ['timeout', 'timed out', 'connection timeout', 'request timeout', 'read timeout'],
|
|
1932
|
-
'retry': ['retry', 'retries', 'retried', 'attempt', 'backoff', 'back-off'],
|
|
1933
|
-
'circuit-breaker': ['circuit breaker', 'circuit_breaker', 'circuitbreaker', 'open circuit'],
|
|
1934
|
-
'fallback': ['fallback', 'fall back', 'fall-back', 'default response', 'degraded'],
|
|
1935
|
-
'rate-limiting': ['rate limit', 'rate_limit', 'ratelimit', '429', 'too many requests', 'throttl'],
|
|
1936
|
-
'bulkhead': ['bulkhead', 'semaphore', 'queue full', 'concurrency limit'],
|
|
1937
|
-
};
|
|
1938
|
-
if (artifacts.performanceFiles.length > 0) {
|
|
1939
|
-
// ─ Explicit: JMeter / k6 / Gatling files found ─────────────────────
|
|
1940
|
-
try {
|
|
1941
|
-
console.log(`\nAnalyzing performance coverage (${artifacts.performanceFiles.length} load-test file(s))...`);
|
|
1942
|
-
const endpointItems = (_s = (_r = (_q = allCoverageResults.find((r) => r.type === 'endpoint')) === null || _q === void 0 ? void 0 : _q.details) === null || _r === void 0 ? void 0 : _r.items) !== null && _s !== void 0 ? _s : [];
|
|
1943
|
-
const endpoints = endpointItems.map((item) => {
|
|
1944
|
-
var _a, _b;
|
|
1945
|
-
const parts = item.id.split(' ');
|
|
1946
|
-
return { id: item.id, method: (_a = parts[0]) !== null && _a !== void 0 ? _a : 'GET', path: (_b = parts[1]) !== null && _b !== void 0 ? _b : item.id };
|
|
1947
|
-
});
|
|
1948
|
-
const metricsMap = (0, perfResilienceCoverage_1.parseLoadTestResults)(artifacts.performanceFiles);
|
|
1949
|
-
const perfThresholds = { responseMs: 500, errorRate: 0.05 };
|
|
1950
|
-
const perfCoverages = (0, perfResilienceCoverage_1.analyzePerformanceCoverage)(endpoints, metricsMap, perfThresholds);
|
|
1951
|
-
const scenarios = (0, perfResilienceCoverage_1.buildResilienceScenarios)(endpoints);
|
|
1952
|
-
const resilienceCoverages = await (0, perfResilienceCoverage_1.analyzeResilienceCoverage)(scenarios, testsGlob);
|
|
1953
|
-
const report = (0, perfResilienceCoverage_1.buildPerfResilienceReport)(perfCoverages, resilienceCoverages);
|
|
1954
|
-
const perfResult = {
|
|
1955
|
-
type: 'performance',
|
|
1956
|
-
totalItems: report.totalEndpoints,
|
|
1957
|
-
coveredItems: report.endpointsWithLoadData,
|
|
1958
|
-
coveragePercent: report.performanceCoveragePercent,
|
|
1959
|
-
details: report,
|
|
1960
|
-
};
|
|
1961
|
-
const resilienceResult = {
|
|
1962
|
-
type: 'resilience',
|
|
1963
|
-
totalItems: report.totalResilienceScenarios,
|
|
1964
|
-
coveredItems: report.coveredResilienceScenarios,
|
|
1965
|
-
coveragePercent: report.resilienceCoveragePercent,
|
|
1966
|
-
details: report,
|
|
1967
|
-
};
|
|
1968
|
-
allCoverageResults.push(perfResult, resilienceResult);
|
|
1969
|
-
console.log(` ${report.endpointsWithLoadData}/${report.totalEndpoints} endpoints have load-test data (${report.performanceCoveragePercent}%)`);
|
|
1970
|
-
console.log(` ${report.coveredResilienceScenarios}/${report.totalResilienceScenarios} resilience scenarios covered (${report.resilienceCoveragePercent}%)`);
|
|
1971
|
-
}
|
|
1972
|
-
catch (perfErr) {
|
|
1973
|
-
warnings.push(`Performance coverage failed: ${perfErr instanceof Error ? perfErr.message : String(perfErr)}`);
|
|
1974
|
-
}
|
|
1975
|
-
}
|
|
1976
|
-
else {
|
|
1977
|
-
// ─ Inferred: no load-test files found — scan test content for signals ─
|
|
1978
|
-
console.log(`\nPerformance & resilience coverage (inferred — no JMeter/k6/Gatling files found)...`);
|
|
1979
|
-
// Build a flat list of all known endpoints from earlier coverage results
|
|
1980
|
-
const knownEndpoints = ((_v = (_u = (_t = allCoverageResults.find((r) => r.type === 'endpoint')) === null || _t === void 0 ? void 0 : _t.details) === null || _u === void 0 ? void 0 : _u.items) !== null && _v !== void 0 ? _v : []).map((item) => item.id);
|
|
1981
|
-
const allTestContent = testEntries.map((e) => e.contentLower);
|
|
1982
|
-
const combinedTestContent = allTestContent.join('\n');
|
|
1983
|
-
// ─ Performance inference ────────────────────────────────────────────
|
|
1984
|
-
const hasPerfSignal = PERF_KEYWORDS.some((kw) => combinedTestContent.includes(kw));
|
|
1985
|
-
const perfItems = knownEndpoints.map((endpointId) => {
|
|
1986
|
-
var _a, _b;
|
|
1987
|
-
const parts = endpointId.split(' ');
|
|
1988
|
-
const epPath = ((_a = parts[1]) !== null && _a !== void 0 ? _a : endpointId).toLowerCase();
|
|
1989
|
-
const epLeaf = (_b = epPath.split('/').filter(Boolean).pop()) !== null && _b !== void 0 ? _b : epPath;
|
|
1990
|
-
const hasEvidenceInTests = testEntries.some(({ contentLower }) => {
|
|
1991
|
-
const mentionsEndpoint = epLeaf.length > 2
|
|
1992
|
-
? contentLower.includes(epLeaf)
|
|
1993
|
-
: contentLower.includes(epPath);
|
|
1994
|
-
const hasPerfKw = PERF_KEYWORDS.some((kw) => contentLower.includes(kw));
|
|
1995
|
-
return mentionsEndpoint && hasPerfKw;
|
|
1996
|
-
});
|
|
1997
|
-
return { id: endpointId, hasEvidence: hasEvidenceInTests };
|
|
1998
|
-
});
|
|
1999
|
-
const perfCoveredCount = perfItems.filter((i) => i.hasEvidence).length;
|
|
2000
|
-
const perfTotal = Math.max(perfItems.length, 1); // avoid 0-denominator
|
|
2001
|
-
const perfPct = knownEndpoints.length === 0
|
|
2002
|
-
? (hasPerfSignal ? 30 : 0) // no routes but some signal
|
|
2003
|
-
: Math.round((perfCoveredCount / perfItems.length) * 100);
|
|
2004
|
-
const perfResult = {
|
|
2005
|
-
type: 'performance',
|
|
2006
|
-
totalItems: perfItems.length || 1,
|
|
2007
|
-
coveredItems: knownEndpoints.length === 0 && hasPerfSignal ? 0 : perfCoveredCount,
|
|
2008
|
-
coveragePercent: perfPct,
|
|
2009
|
-
details: {
|
|
2010
|
-
inferred: true,
|
|
2011
|
-
note: 'No JMeter, k6, or Gatling files found. Coverage inferred from test content keywords.',
|
|
2012
|
-
totalEndpoints: perfItems.length,
|
|
2013
|
-
endpointsWithEvidence: perfCoveredCount,
|
|
2014
|
-
performanceCoveragePercent: perfPct,
|
|
2015
|
-
items: perfItems,
|
|
2016
|
-
},
|
|
2017
|
-
};
|
|
2018
|
-
allCoverageResults.push(perfResult);
|
|
2019
|
-
if (knownEndpoints.length > 0) {
|
|
2020
|
-
console.log(` ${perfCoveredCount}/${perfItems.length} endpoints have performance test evidence (${perfPct}%)`);
|
|
2021
|
-
}
|
|
2022
|
-
else {
|
|
2023
|
-
console.log(` Performance signal in tests: ${hasPerfSignal ? 'yes' : 'none'} (0% — no load-test files)`);
|
|
2024
|
-
}
|
|
2025
|
-
console.log(` [NOTE] Add JMeter .jtl/.csv, k6 .json, or Gatling simulation.log files for accurate load-test metrics.`);
|
|
2026
|
-
// ─ Resilience inference ──────────────────────────────────────────────
|
|
2027
|
-
const resilienceItems = Object.entries(RESILIENCE_KEYWORD_MAP).map(([category, keywords]) => {
|
|
2028
|
-
const covered = testEntries.some(({ contentLower }) => keywords.some((kw) => contentLower.includes(kw)));
|
|
2029
|
-
return { id: `resilience:${category}`, category, covered };
|
|
2030
|
-
});
|
|
2031
|
-
const resCoveredCount = resilienceItems.filter((i) => i.covered).length;
|
|
2032
|
-
const resPct = Math.round((resCoveredCount / resilienceItems.length) * 100);
|
|
2033
|
-
const resilienceResult = {
|
|
2034
|
-
type: 'resilience',
|
|
2035
|
-
totalItems: resilienceItems.length,
|
|
2036
|
-
coveredItems: resCoveredCount,
|
|
2037
|
-
coveragePercent: resPct,
|
|
2038
|
-
details: {
|
|
2039
|
-
inferred: true,
|
|
2040
|
-
note: 'Resilience coverage inferred from test content. No load-test files found.',
|
|
2041
|
-
totalResilienceScenarios: resilienceItems.length,
|
|
2042
|
-
coveredResilienceScenarios: resCoveredCount,
|
|
2043
|
-
resilienceCoveragePercent: resPct,
|
|
2044
|
-
items: resilienceItems,
|
|
2045
|
-
},
|
|
2046
|
-
};
|
|
2047
|
-
allCoverageResults.push(resilienceResult);
|
|
2048
|
-
console.log(` ${resCoveredCount}/${resilienceItems.length} resilience categories have test evidence (${resPct}%)`);
|
|
2049
|
-
}
|
|
2050
|
-
}
|
|
2051
2002
|
if (allCoverageResults.length > 0) {
|
|
2052
2003
|
const observabilityInfo = (0, observability_1.buildObservabilityInfo)(metricsPort);
|
|
2053
2004
|
(0, reporting_1.generateMultiFormatReports)(allCoverageResults, ['json'], reportsDir, {}, observabilityInfo);
|
|
@@ -2157,7 +2108,7 @@ program
|
|
|
2157
2108
|
if (options['dashboard']) {
|
|
2158
2109
|
(0, serveDashboard_1.serveDashboard)({
|
|
2159
2110
|
reportsDir: reportsDir,
|
|
2160
|
-
port: (
|
|
2111
|
+
port: (_u = options['port']) !== null && _u !== void 0 ? _u : 4000,
|
|
2161
2112
|
open: Boolean(options['open']),
|
|
2162
2113
|
});
|
|
2163
2114
|
// Keep the process alive — the HTTP server holds the event loop open
|
|
@@ -2183,118 +2134,6 @@ program
|
|
|
2183
2134
|
});
|
|
2184
2135
|
// Keep the process alive while the server runs
|
|
2185
2136
|
});
|
|
2186
|
-
program
|
|
2187
|
-
.command('generate-tests')
|
|
2188
|
-
.description('Generate test scaffolds for detected coverage gaps')
|
|
2189
|
-
.option('--reports-dir <dir>', 'Directory with coverage reports', 'reports/')
|
|
2190
|
-
.option('--out-dir <dir>', 'Output directory for generated tests', 'generated-tests/')
|
|
2191
|
-
.option('--language <lang>', 'Target language override (auto-detected if omitted)')
|
|
2192
|
-
.option('--framework <fw>', 'Test framework override (auto-detected if omitted)')
|
|
2193
|
-
.option('--priority <p>', 'Only generate for gaps at this priority or higher', 'P1')
|
|
2194
|
-
.option('--dry-run', 'Print generated tests to stdout, do not write files', false)
|
|
2195
|
-
.option('--overwrite', 'Overwrite existing generated files', false)
|
|
2196
|
-
.option('--gap-id <id>', 'Generate tests for a single specific gap')
|
|
2197
|
-
.option('--types <list>', 'Comma-separated gap types to generate (default: all)')
|
|
2198
|
-
.option('--no-security', 'Skip security test generation')
|
|
2199
|
-
.option('--no-cypress', 'Skip Cypress test generation')
|
|
2200
|
-
.action(async (options) => {
|
|
2201
|
-
const types = options.types
|
|
2202
|
-
? options.types.split(',').map(t => t.trim())
|
|
2203
|
-
: undefined;
|
|
2204
|
-
const result = await (0, index_4.generateTests)({
|
|
2205
|
-
reportsDir: options.reportsDir,
|
|
2206
|
-
outDir: options.outDir,
|
|
2207
|
-
language: options.language,
|
|
2208
|
-
framework: options.framework,
|
|
2209
|
-
priority: options.priority,
|
|
2210
|
-
dryRun: Boolean(options.dryRun),
|
|
2211
|
-
overwrite: Boolean(options.overwrite),
|
|
2212
|
-
gapId: options.gapId,
|
|
2213
|
-
types,
|
|
2214
|
-
noSecurity: Boolean(options.noSecurity),
|
|
2215
|
-
noCypress: Boolean(options.noCypress),
|
|
2216
|
-
});
|
|
2217
|
-
if (result.dryRun) {
|
|
2218
|
-
for (const file of result.files) {
|
|
2219
|
-
console.log(`\n${'='.repeat(60)}`);
|
|
2220
|
-
console.log(`// FILE: ${file.relativePath}`);
|
|
2221
|
-
console.log(`${'='.repeat(60)}`);
|
|
2222
|
-
console.log(file.content);
|
|
2223
|
-
}
|
|
2224
|
-
}
|
|
2225
|
-
else {
|
|
2226
|
-
console.log(`\nTest generation complete:`);
|
|
2227
|
-
console.log(` Gaps processed: ${result.totalGaps}`);
|
|
2228
|
-
console.log(` Files generated: ${result.generatedCount}`);
|
|
2229
|
-
console.log(` Errors: ${result.errors.length}`);
|
|
2230
|
-
if (result.errors.length > 0) {
|
|
2231
|
-
for (const err of result.errors) {
|
|
2232
|
-
console.error(` ERROR [${err.gapId}]: ${err.message}`);
|
|
2233
|
-
}
|
|
2234
|
-
}
|
|
2235
|
-
}
|
|
2236
|
-
});
|
|
2237
|
-
program
|
|
2238
|
-
.command('export-ai-flows')
|
|
2239
|
-
.description('Export AI-ready flow documentation for Copilot/Cursor/Claude')
|
|
2240
|
-
.option('--reports-dir <dir>', 'Directory with coverage reports', 'reports/')
|
|
2241
|
-
.option('--out-dir <dir>', 'Output directory for AI flow files', 'reports/')
|
|
2242
|
-
.option('--format <fmt>', 'Output format: markdown, json, or both', 'both')
|
|
2243
|
-
.option('--max-gaps <n>', 'Maximum number of gaps to include', '50')
|
|
2244
|
-
.option('--priority <p>', 'Only include gaps at this priority or higher', 'P3')
|
|
2245
|
-
.action(async (options) => {
|
|
2246
|
-
const flows = await (0, index_4.exportAiFlows)({
|
|
2247
|
-
reportsDir: options.reportsDir,
|
|
2248
|
-
outDir: options.outDir,
|
|
2249
|
-
format: options.format,
|
|
2250
|
-
maxGaps: parseInt(options.maxGaps, 10),
|
|
2251
|
-
priority: options.priority,
|
|
2252
|
-
});
|
|
2253
|
-
console.log(`\nAI flows export complete:`);
|
|
2254
|
-
console.log(` Gaps exported: ${flows.gaps.length}`);
|
|
2255
|
-
console.log(` Project: ${flows.project.name}`);
|
|
2256
|
-
console.log(` Language: ${flows.project.language}`);
|
|
2257
|
-
});
|
|
2258
|
-
program
|
|
2259
|
-
.command('score-tests')
|
|
2260
|
-
.description('Score quality of existing test suite on 5 dimensions (0-100)')
|
|
2261
|
-
.option('--tests <glob>', 'Glob pattern for test files to score', 'tests/**/*.test.ts')
|
|
2262
|
-
.option('--reports-dir <dir>', 'Directory to write quality score output', 'reports/')
|
|
2263
|
-
.option('--fail-below <score>', 'Exit non-zero if any file scores below this', '0')
|
|
2264
|
-
.action(async (options) => {
|
|
2265
|
-
var _a;
|
|
2266
|
-
try {
|
|
2267
|
-
const report = await (0, index_4.scoreTests)({
|
|
2268
|
-
testsGlob: options.tests,
|
|
2269
|
-
reportsDir: options.reportsDir,
|
|
2270
|
-
failBelow: parseInt(options.failBelow, 10),
|
|
2271
|
-
});
|
|
2272
|
-
console.log(`\nTest Quality Score Report:`);
|
|
2273
|
-
console.log(` Overall score: ${report.overallScore}/100`);
|
|
2274
|
-
console.log(` Files scored: ${report.byFile.length}`);
|
|
2275
|
-
if (report.lowestQualityFiles.length > 0) {
|
|
2276
|
-
console.log(`\n Lowest quality files:`);
|
|
2277
|
-
for (const f of report.lowestQualityFiles) {
|
|
2278
|
-
const entry = report.byFile.find(b => b.file === f);
|
|
2279
|
-
console.log(` ${f}: ${(_a = entry === null || entry === void 0 ? void 0 : entry.score) !== null && _a !== void 0 ? _a : '?'}/100`);
|
|
2280
|
-
}
|
|
2281
|
-
}
|
|
2282
|
-
if (report.highestRiskLowQualityGaps.length > 0) {
|
|
2283
|
-
console.log(`\n High risk + low quality:`);
|
|
2284
|
-
for (const g of report.highestRiskLowQualityGaps) {
|
|
2285
|
-
console.log(` ${g.endpoint}: quality=${g.qualityScore}, risk=${g.riskScore}`);
|
|
2286
|
-
console.log(` → ${g.primaryIssue}`);
|
|
2287
|
-
}
|
|
2288
|
-
}
|
|
2289
|
-
console.log(`\n Report written to: ${options.reportsDir}/test-quality.json`);
|
|
2290
|
-
}
|
|
2291
|
-
catch (err) {
|
|
2292
|
-
if (err instanceof Error) {
|
|
2293
|
-
console.error(err.message);
|
|
2294
|
-
}
|
|
2295
|
-
process.exit(1);
|
|
2296
|
-
}
|
|
2297
|
-
});
|
|
2298
2137
|
// Parse the command-line arguments
|
|
2299
2138
|
program.parse(process.argv);
|
|
2300
2139
|
// When invoked with no arguments (no subcommand), display help
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"businessRuleInference.d.ts","sourceRoot":"","sources":["../../../src/inference/businessRuleInference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AACjD,MAAM,MAAM,QAAQ,GAChB,YAAY,GACZ,eAAe,GACf,gBAAgB,GAChB,YAAY,CAAC;AAEjB,MAAM,WAAW,oBAAoB;IACnC,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,CAAC;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8BAA8B;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"businessRuleInference.d.ts","sourceRoot":"","sources":["../../../src/inference/businessRuleInference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AACjD,MAAM,MAAM,QAAQ,GAChB,YAAY,GACZ,eAAe,GACf,gBAAgB,GAChB,YAAY,CAAC;AAEjB,MAAM,WAAW,oBAAoB;IACnC,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,CAAC;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8BAA8B;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA2ID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,EAAE,CA4C3E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EAAE,EACtB,QAAQ,GAAE,MAAM,EAAO,GACtB,2BAA2B,CAuB7B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,MAAM,GACjB,MAAM,CAYR;AAID,eAAO,MAAM,kBAAkB,aAM7B,CAAC;AAEH;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAwCnE"}
|
|
@@ -138,104 +138,12 @@ const INFERENCE_PATTERNS = [
|
|
|
138
138
|
behaviorTemplate: (m) => `${m[1]} must not exceed ${m[2]}`,
|
|
139
139
|
conditionTemplate: (m) => `${m[1]} > ${m[2]}`,
|
|
140
140
|
},
|
|
141
|
-
// ── Flask / Python-specific patterns ──────────────────────────────────────
|
|
142
|
-
// Broader Python raise: any raise X() or raise X.y() not already ending in Exception/Error
|
|
143
|
-
// (Ordered after the existing raise patterns so deduplification by source location handles overlap)
|
|
144
|
-
{
|
|
145
|
-
type: 'business_logic',
|
|
146
|
-
pattern: /\braise\s+([\w]+(?:\.[\w]+)*)\s*(?:\(([^)]{0,60})\))?/,
|
|
147
|
-
nameTemplate: (m) => { var _a; return toSnakeCase((_a = m[1].split('.').pop()) !== null && _a !== void 0 ? _a : m[1]); },
|
|
148
|
-
behaviorTemplate: (m) => `Operation rejected: ${m[1]}`,
|
|
149
|
-
conditionTemplate: (m) => { var _a; return `raise ${m[1]}(${((_a = m[2]) !== null && _a !== void 0 ? _a : '').trim()})`; },
|
|
150
|
-
},
|
|
151
|
-
// Python `if not X:` null guard — idiomatic Python nil check
|
|
152
|
-
{
|
|
153
|
-
type: 'validation',
|
|
154
|
-
pattern: /if\s+not\s+([\w.]+)\s*(?::|and|or)/,
|
|
155
|
-
nameTemplate: (m) => `require_${toSnakeCase(m[1].replace(/\./g, '_'))}`,
|
|
156
|
-
behaviorTemplate: (m) => `${m[1]} must exist`,
|
|
157
|
-
conditionTemplate: (m) => `if not ${m[1]}`,
|
|
158
|
-
},
|
|
159
|
-
// Flask/Django auth decorators: @jwt_required, @login_required, etc.
|
|
160
|
-
{
|
|
161
|
-
type: 'authorization',
|
|
162
|
-
pattern: /@(jwt_required|login_required|require_auth|requires_auth|permission_required|auth_required|authenticated_user|require_permissions?)\b/i,
|
|
163
|
-
nameTemplate: (m) => `require_${toSnakeCase(m[1])}`,
|
|
164
|
-
behaviorTemplate: (m) => `Request requires authentication (${m[1]})`,
|
|
165
|
-
conditionTemplate: (m) => `@${m[1]}`,
|
|
166
|
-
},
|
|
167
|
-
// Flask `@use_kwargs` / `@validate_arguments` input validation
|
|
168
|
-
{
|
|
169
|
-
type: 'validation',
|
|
170
|
-
pattern: /@(use_kwargs|validate_arguments?|expects_json|validate_body)\s*\(\s*([\w]+)/i,
|
|
171
|
-
nameTemplate: (m) => { var _a; return `validate_input_${toSnakeCase((_a = m[2]) !== null && _a !== void 0 ? _a : 'schema')}`; },
|
|
172
|
-
behaviorTemplate: (m) => { var _a; return `Input validated against ${(_a = m[2]) !== null && _a !== void 0 ? _a : 'schema'}`; },
|
|
173
|
-
conditionTemplate: (m) => { var _a; return `@${m[1]}(${(_a = m[2]) !== null && _a !== void 0 ? _a : ''})`; },
|
|
174
|
-
},
|
|
175
|
-
// Python ownership / attribute comparison guard
|
|
176
|
-
{
|
|
177
|
-
type: 'authorization',
|
|
178
|
-
pattern: /if\s+[\w.]+\s*!=\s*[\w.]+\.(?:id|user_id|author_id|owner_id|profile\.id)/,
|
|
179
|
-
nameTemplate: () => 'ownership_check',
|
|
180
|
-
behaviorTemplate: () => 'Resource must belong to the requesting user',
|
|
181
|
-
conditionTemplate: (m) => m[0].trim(),
|
|
182
|
-
},
|
|
183
|
-
// ── Generic JS/TS/frontend patterns ───────────────────────────────────────
|
|
184
|
-
// Generic JS/TS `if (!expression)` null/falsy guard
|
|
185
|
-
// Matches meaningful presence checks like !JWT.get(), !User.current, !token
|
|
186
|
-
// Skips pure normalisation calls like .trim(), .length, .toLowerCase(), etc.
|
|
187
|
-
// via the skipIfGroup1Matches post-match filter.
|
|
188
|
-
{
|
|
189
|
-
type: 'validation',
|
|
190
|
-
pattern: /if\s*\(\s*!\s*([\w][\w.[\]]*(?:\.\w+\(\s*\))?)\s*\)/,
|
|
191
|
-
skipIfGroup1Matches: /\.(trim|length|split|join|toLowerCase|toUpperCase|toString|valueOf|slice|substr|substring|replace|indexOf|includes|startsWith|endsWith)\(\s*\)$/,
|
|
192
|
-
nameTemplate: (m) => `require_${toSnakeCase(m[1].replace(/[^a-zA-Z0-9]/g, '_').replace(/_+/g, '_').replace(/^_|_$/g, ''))}`,
|
|
193
|
-
behaviorTemplate: (m) => `${m[1]} must be present/truthy`,
|
|
194
|
-
conditionTemplate: (m) => `!${m[1]}`,
|
|
195
|
-
},
|
|
196
|
-
// HTTP status comparison guard (frontend interceptors): rejection.status === 401
|
|
197
|
-
{
|
|
198
|
-
type: 'validation',
|
|
199
|
-
pattern: /\.status\s*={1,3}\s*(4\d\d|5\d\d)/,
|
|
200
|
-
nameTemplate: (m) => `http_status_${m[1]}_check`,
|
|
201
|
-
behaviorTemplate: (m) => `Handle HTTP ${m[1]} error response`,
|
|
202
|
-
conditionTemplate: (m) => `status == ${m[1]}`,
|
|
203
|
-
},
|
|
204
|
-
// Ownership / identity comparison guard (username === author.username)
|
|
205
|
-
{
|
|
206
|
-
type: 'authorization',
|
|
207
|
-
pattern: /if\s*\(?\s*[\w.]+\.(?:username|userId|user_id|email|id)\s*!==?\s*[\w.]+\.(?:username|userId|user_id|email|id|author\.username)/,
|
|
208
|
-
nameTemplate: () => 'ownership_identity_check',
|
|
209
|
-
behaviorTemplate: () => 'Resource belongs to a specific user identity',
|
|
210
|
-
conditionTemplate: (m) => m[0].trim().replace(/^if\s*\(?/, '').replace(/\)?\s*$/, ''),
|
|
211
|
-
},
|
|
212
|
-
// Generic early-return guard: if (cond) return/throw on same or adjacent line
|
|
213
|
-
{
|
|
214
|
-
type: 'business_logic',
|
|
215
|
-
pattern: /if\s*\([^)]{3,80}\)\s*(?:\{[^}]{0,40}\})?\s*(?:return|throw|raise)\b/,
|
|
216
|
-
nameTemplate: () => 'guard_condition',
|
|
217
|
-
behaviorTemplate: () => 'Early return or error on condition',
|
|
218
|
-
conditionTemplate: (m) => {
|
|
219
|
-
const cond = m[0].match(/if\s*\(([^)]{3,80})\)/);
|
|
220
|
-
return cond ? cond[1].trim() : m[0].trim();
|
|
221
|
-
},
|
|
222
|
-
},
|
|
223
141
|
];
|
|
224
142
|
// ─── Endpoint heuristics ──────────────────────────────────────────────────────
|
|
225
143
|
/** Attempt to associate a rule with the nearest HTTP route/endpoint annotation. */
|
|
226
144
|
function guessEndpoint(lines, ruleLineIdx) {
|
|
227
145
|
// Search up to 40 lines above for common routing patterns
|
|
228
146
|
const lookupLines = lines.slice(Math.max(0, ruleLineIdx - 40), ruleLineIdx);
|
|
229
|
-
// Flask: @blueprint.route('/path', methods=...) / @app.route('/path', ...)
|
|
230
|
-
for (let i = lookupLines.length - 1; i >= 0; i--) {
|
|
231
|
-
const fm = lookupLines[i].match(/@\w+\.route\s*\(\s*['"]([^'"]+)['"]/);
|
|
232
|
-
if (fm) {
|
|
233
|
-
// Try to find method from same line or near
|
|
234
|
-
const methodsMatch = lookupLines[i].match(/methods\s*=\s*[\[(]['"]?([\w]+)['"]?/);
|
|
235
|
-
const method = methodsMatch ? methodsMatch[1].toUpperCase() : 'GET';
|
|
236
|
-
return `${method} ${fm[1]}`;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
147
|
// Spring: @GetMapping("/path") / @PostMapping / @RequestMapping
|
|
240
148
|
for (let i = lookupLines.length - 1; i >= 0; i--) {
|
|
241
149
|
const m = lookupLines[i].match(/@(Get|Post|Put|Patch|Delete|Request)Mapping\s*\(\s*["']([^"']+)["']/i);
|
|
@@ -283,9 +191,6 @@ function inferRulesFromFile(filePath) {
|
|
|
283
191
|
const match = line.match(ip.pattern);
|
|
284
192
|
if (!match)
|
|
285
193
|
continue;
|
|
286
|
-
// Post-match filter: skip false positives based on first captured group
|
|
287
|
-
if (ip.skipIfGroup1Matches && match[1] && ip.skipIfGroup1Matches.test(match[1]))
|
|
288
|
-
continue;
|
|
289
194
|
const condition = ip.conditionTemplate(match);
|
|
290
195
|
const sourceLocation = `${filePath}:${lineIdx + 1}`;
|
|
291
196
|
const dedupKey = `${filePath}:${lineIdx}:${condition}`;
|
|
@@ -44,20 +44,10 @@ export interface IntegrationFlowInferenceResult {
|
|
|
44
44
|
* Infer integration flows from a single test file.
|
|
45
45
|
*/
|
|
46
46
|
export declare function inferFlowsFromFile(filePath: string): InferredIntegrationFlow[];
|
|
47
|
-
/**
|
|
48
|
-
* Infer integration flows from service source files (not test files).
|
|
49
|
-
*
|
|
50
|
-
* Used as a fallback when no test files are present (e.g. frontend-only projects).
|
|
51
|
-
* Only produces flows for source files that contain 2+ HTTP calls in the same function.
|
|
52
|
-
*/
|
|
53
|
-
export declare function inferFlowsFromSourceFiles(serviceFiles: string[]): InferredIntegrationFlow[];
|
|
54
47
|
/**
|
|
55
48
|
* Run flow inference across all provided test files.
|
|
56
|
-
*
|
|
57
|
-
* When `testFiles` is empty and `serviceFiles` is provided, flows are inferred
|
|
58
|
-
* from the service source code instead and tagged accordingly.
|
|
59
49
|
*/
|
|
60
|
-
export declare function inferIntegrationFlows(testFiles: string[], warnings?: string[]
|
|
50
|
+
export declare function inferIntegrationFlows(testFiles: string[], warnings?: string[]): IntegrationFlowInferenceResult;
|
|
61
51
|
/**
|
|
62
52
|
* Write inferred integration flows to the reports directory.
|
|
63
53
|
* Returns the path of the written file.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrationFlowInference.d.ts","sourceRoot":"","sources":["../../../src/inference/integrationFlowInference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,CAAC;IACxB,+BAA+B;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,iDAAiD;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"integrationFlowInference.d.ts","sourceRoot":"","sources":["../../../src/inference/integrationFlowInference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,CAAC;IACxB,+BAA+B;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,iDAAiD;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA4KD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,uBAAuB,EAAE,CAW9E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EAAE,EACnB,QAAQ,GAAE,MAAM,EAAO,GACtB,8BAA8B,CA2BhC;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,8BAA8B,EACtC,UAAU,EAAE,MAAM,GACjB,MAAM,CAYR"}
|
|
@@ -48,7 +48,6 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
48
48
|
})();
|
|
49
49
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
50
|
exports.inferFlowsFromFile = inferFlowsFromFile;
|
|
51
|
-
exports.inferFlowsFromSourceFiles = inferFlowsFromSourceFiles;
|
|
52
51
|
exports.inferIntegrationFlows = inferIntegrationFlows;
|
|
53
52
|
exports.writeInferredIntegrationFlows = writeInferredIntegrationFlows;
|
|
54
53
|
const fs = __importStar(require("fs"));
|
|
@@ -64,11 +63,6 @@ const HTTP_CALL_PATTERNS = [
|
|
|
64
63
|
{ pattern: /\b(get|post|put|patch|delete)\s+['"`]([^'"`\s]+)['"`]/i, methodGroup: 1, pathGroup: 2 },
|
|
65
64
|
// fetch('/path', { method: 'POST' })
|
|
66
65
|
{ pattern: /fetch\s*\(\s*['"`]([^'"`]+)['"`]\s*,\s*\{[^}]*method\s*:\s*['"`](GET|POST|PUT|PATCH|DELETE|HEAD)['"`]/i, methodGroup: 2, pathGroup: 1 },
|
|
67
|
-
// WebTest TestApp: testapp.post_json(url_for('endpoint'), data)
|
|
68
|
-
// Also handles: testapp.get(url_for('endpoint')), testapp.delete_json(...)
|
|
69
|
-
{ pattern: /(?:testapp|self\.testapp)\.(get_json|post_json|put_json|patch_json|delete_json|get|post|put|patch|delete)\s*\(\s*url_for\s*\(\s*['"]([^'"]+)['"]/i, methodGroup: 1, pathGroup: 2 },
|
|
70
|
-
// WebTest without url_for: testapp.get('/path')
|
|
71
|
-
{ pattern: /(?:testapp|self\.testapp)\.(get_json|post_json|put_json|patch_json|delete_json|get|post|put|patch|delete)\s*\(\s*['"`]([^'"`]+)['"`]/i, methodGroup: 1, pathGroup: 2 },
|
|
72
66
|
];
|
|
73
67
|
/** Patterns for test function / scenario boundaries */
|
|
74
68
|
const TEST_FUNCTION_PATTERNS = [
|
|
@@ -91,8 +85,6 @@ function extractHttpCallsFromLines(lines) {
|
|
|
91
85
|
const m = line.match(p.pattern);
|
|
92
86
|
if (m) {
|
|
93
87
|
const method = m[p.methodGroup].toUpperCase();
|
|
94
|
-
// Normalize WebTest _json suffix: POST_JSON → POST, GET_JSON → GET
|
|
95
|
-
const normalizedMethod = method.replace(/_JSON$/, '');
|
|
96
88
|
const rawPath = m[p.pathGroup];
|
|
97
89
|
// Skip unlikely paths (full URLs with domain, non-path values)
|
|
98
90
|
if (rawPath.startsWith('http') && !rawPath.includes('/api'))
|
|
@@ -100,7 +92,7 @@ function extractHttpCallsFromLines(lines) {
|
|
|
100
92
|
const cleanPath = extractPathFromUrl(rawPath);
|
|
101
93
|
if (!cleanPath)
|
|
102
94
|
continue;
|
|
103
|
-
calls.push({ method
|
|
95
|
+
calls.push({ method, path: cleanPath, lineIdx: i });
|
|
104
96
|
break; // only first pattern match per line
|
|
105
97
|
}
|
|
106
98
|
}
|
|
@@ -110,9 +102,6 @@ function extractHttpCallsFromLines(lines) {
|
|
|
110
102
|
function extractPathFromUrl(raw) {
|
|
111
103
|
if (raw.startsWith('/'))
|
|
112
104
|
return raw;
|
|
113
|
-
// url_for endpoint name: 'blueprint.function' — treat as pseudo-path
|
|
114
|
-
if (/^\w+\.\w+$/.test(raw))
|
|
115
|
-
return `/${raw.replace('.', '/')}`;
|
|
116
105
|
try {
|
|
117
106
|
const u = new URL(raw);
|
|
118
107
|
return u.pathname || undefined;
|
|
@@ -214,46 +203,10 @@ function inferFlowsFromFile(filePath) {
|
|
|
214
203
|
const calls = extractHttpCallsFromLines(lines);
|
|
215
204
|
return groupCallsIntoFlows(calls, filePath, lines);
|
|
216
205
|
}
|
|
217
|
-
/**
|
|
218
|
-
* Infer integration flows from service source files (not test files).
|
|
219
|
-
*
|
|
220
|
-
* Used as a fallback when no test files are present (e.g. frontend-only projects).
|
|
221
|
-
* Only produces flows for source files that contain 2+ HTTP calls in the same function.
|
|
222
|
-
*/
|
|
223
|
-
function inferFlowsFromSourceFiles(serviceFiles) {
|
|
224
|
-
const allFlows = [];
|
|
225
|
-
for (const fp of serviceFiles) {
|
|
226
|
-
let content;
|
|
227
|
-
try {
|
|
228
|
-
content = fs.readFileSync(fp, 'utf-8');
|
|
229
|
-
}
|
|
230
|
-
catch {
|
|
231
|
-
continue;
|
|
232
|
-
}
|
|
233
|
-
const lines = content.split('\n');
|
|
234
|
-
const calls = extractHttpCallsFromLines(lines);
|
|
235
|
-
if (calls.length < 2)
|
|
236
|
-
continue;
|
|
237
|
-
const flows = groupCallsIntoFlows(calls, fp, lines);
|
|
238
|
-
allFlows.push(...flows);
|
|
239
|
-
}
|
|
240
|
-
return allFlows;
|
|
241
|
-
}
|
|
242
206
|
/**
|
|
243
207
|
* Run flow inference across all provided test files.
|
|
244
|
-
*
|
|
245
|
-
* When `testFiles` is empty and `serviceFiles` is provided, flows are inferred
|
|
246
|
-
* from the service source code instead and tagged accordingly.
|
|
247
208
|
*/
|
|
248
|
-
function inferIntegrationFlows(testFiles, warnings = []
|
|
249
|
-
if (testFiles.length === 0 && serviceFiles && serviceFiles.length > 0) {
|
|
250
|
-
warnings.push('No test files found; integration flows inferred from service source code.');
|
|
251
|
-
const flows = inferFlowsFromSourceFiles(serviceFiles);
|
|
252
|
-
if (flows.length === 0) {
|
|
253
|
-
warnings.push('No multi-step HTTP call sequences detected in service source files; integration flow inference produced no results.');
|
|
254
|
-
}
|
|
255
|
-
return { flows, filesAnalyzed: serviceFiles.length, inferred: true, warnings };
|
|
256
|
-
}
|
|
209
|
+
function inferIntegrationFlows(testFiles, warnings = []) {
|
|
257
210
|
if (testFiles.length === 0) {
|
|
258
211
|
warnings.push('No test files provided; integration flow inference skipped.');
|
|
259
212
|
return { flows: [], filesAnalyzed: 0, inferred: true, warnings };
|