@flanksource/clicky-ui 0.3.45 → 0.3.47
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/NOTICE.md +11 -0
- package/README.md +22 -0
- package/dist/ai.cjs +13 -8
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +7 -2
- package/dist/ai.js.map +1 -1
- package/dist/components/ErrorWrapper.cjs +2 -3
- package/dist/components/ErrorWrapper.cjs.map +1 -1
- package/dist/components/ErrorWrapper.d.ts.map +1 -1
- package/dist/components/ErrorWrapper.js +3 -4
- package/dist/components/ErrorWrapper.js.map +1 -1
- package/dist/data/AccessMark.cjs +23 -0
- package/dist/data/AccessMark.cjs.map +1 -0
- package/dist/data/AccessMark.d.ts +11 -0
- package/dist/data/AccessMark.d.ts.map +1 -0
- package/dist/data/AccessMark.js +23 -0
- package/dist/data/AccessMark.js.map +1 -0
- package/dist/data/Clicky.cjs +3 -0
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.js +3 -0
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/CodeDiff.cjs +116 -23
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.d.ts +26 -0
- package/dist/data/CodeDiff.d.ts.map +1 -1
- package/dist/data/CodeDiff.js +116 -23
- package/dist/data/CodeDiff.js.map +1 -1
- package/dist/data/FilterPill.cjs +15 -2
- package/dist/data/FilterPill.cjs.map +1 -1
- package/dist/data/FilterPill.d.ts +1 -1
- package/dist/data/FilterPill.d.ts.map +1 -1
- package/dist/data/FilterPill.js +15 -2
- package/dist/data/FilterPill.js.map +1 -1
- package/dist/data/GraphDiagram.cjs +65 -13
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +9 -2
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +66 -14
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramGroups.cjs +100 -0
- package/dist/data/GraphDiagramGroups.cjs.map +1 -0
- package/dist/data/GraphDiagramGroups.d.ts +24 -0
- package/dist/data/GraphDiagramGroups.d.ts.map +1 -0
- package/dist/data/GraphDiagramGroups.js +100 -0
- package/dist/data/GraphDiagramGroups.js.map +1 -0
- package/dist/data/GraphDiagramNodes.cjs +17 -31
- package/dist/data/GraphDiagramNodes.cjs.map +1 -1
- package/dist/data/GraphDiagramNodes.d.ts +6 -13
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
- package/dist/data/GraphDiagramNodes.js +17 -31
- package/dist/data/GraphDiagramNodes.js.map +1 -1
- package/dist/data/LogViewer.cjs +27 -8
- package/dist/data/LogViewer.cjs.map +1 -1
- package/dist/data/LogViewer.d.ts +11 -3
- package/dist/data/LogViewer.d.ts.map +1 -1
- package/dist/data/LogViewer.js +27 -8
- package/dist/data/LogViewer.js.map +1 -1
- package/dist/data/Properties.cjs +2 -15
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.d.ts +4 -0
- package/dist/data/Properties.d.ts.map +1 -1
- package/dist/data/Properties.js +2 -15
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/PropertyValue.cjs +37 -0
- package/dist/data/PropertyValue.cjs.map +1 -0
- package/dist/data/PropertyValue.d.ts +6 -0
- package/dist/data/PropertyValue.d.ts.map +1 -0
- package/dist/data/PropertyValue.js +37 -0
- package/dist/data/PropertyValue.js.map +1 -0
- package/dist/data/Tree.cjs +4 -3
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +3 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +4 -3
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/TreeNode.cjs +1 -1
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +1 -1
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/ai/ChatFab.cjs +1 -1
- package/dist/data/ai/ChatFab.cjs.map +1 -1
- package/dist/data/ai/ChatFab.js +1 -1
- package/dist/data/ai/ChatFab.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +106 -171
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +6 -2
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.header.cjs +104 -0
- package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.header.d.ts +29 -0
- package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.header.js +104 -0
- package/dist/data/ai/ChatWindow.header.js.map +1 -0
- package/dist/data/ai/ChatWindow.js +107 -172
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.placement.cjs +95 -0
- package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
- package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.placement.js +95 -0
- package/dist/data/ai/ChatWindow.placement.js.map +1 -0
- package/dist/data/ai/SessionChatComposer.cjs +3 -1
- package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
- package/dist/data/ai/SessionChatComposer.d.ts +4 -1
- package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
- package/dist/data/ai/SessionChatComposer.js +3 -1
- package/dist/data/ai/SessionChatComposer.js.map +1 -1
- package/dist/data/ai/SessionInspector.cjs +68 -72
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
- package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
- package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
- package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
- package/dist/data/ai/SessionInspector.d.ts +6 -1
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.js +69 -73
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
- package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.js +41 -42
- package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
- package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
- package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.js +14 -9
- package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote.cjs +84 -16
- package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
- package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.remote.js +86 -18
- package/dist/data/ai/SessionInspector.remote.js.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.cjs +5 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.js +5 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
- package/dist/data/ai/SessionTail.cjs +63 -0
- package/dist/data/ai/SessionTail.cjs.map +1 -0
- package/dist/data/ai/SessionTail.d.ts +14 -0
- package/dist/data/ai/SessionTail.d.ts.map +1 -0
- package/dist/data/ai/SessionTail.js +63 -0
- package/dist/data/ai/SessionTail.js.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +10 -3
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +7 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.js +10 -3
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/index.d.ts +4 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.cjs +30 -6
- package/dist/data/ai/use-session-scroll.cjs.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +7 -0
- package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.js +30 -6
- package/dist/data/ai/use-session-scroll.js.map +1 -1
- package/dist/data/call-graph/CallGraph.cjs +50 -31
- package/dist/data/call-graph/CallGraph.cjs.map +1 -1
- package/dist/data/call-graph/CallGraph.d.ts +10 -1
- package/dist/data/call-graph/CallGraph.d.ts.map +1 -1
- package/dist/data/call-graph/CallGraph.js +52 -33
- package/dist/data/call-graph/CallGraph.js.map +1 -1
- package/dist/data/call-graph/CallGraphMembers.cjs +5 -4
- package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -1
- package/dist/data/call-graph/CallGraphMembers.d.ts +1 -1
- package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -1
- package/dist/data/call-graph/CallGraphMembers.js +5 -4
- package/dist/data/call-graph/CallGraphMembers.js.map +1 -1
- package/dist/data/call-graph/CallGraphToolbar.cjs +17 -5
- package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -1
- package/dist/data/call-graph/CallGraphToolbar.d.ts +10 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -1
- package/dist/data/call-graph/CallGraphToolbar.js +18 -6
- package/dist/data/call-graph/CallGraphToolbar.js.map +1 -1
- package/dist/data/call-graph/call-graph-model.cjs +169 -18
- package/dist/data/call-graph/call-graph-model.cjs.map +1 -1
- package/dist/data/call-graph/call-graph-model.d.ts +40 -4
- package/dist/data/call-graph/call-graph-model.d.ts.map +1 -1
- package/dist/data/call-graph/call-graph-model.js +170 -19
- package/dist/data/call-graph/call-graph-model.js.map +1 -1
- package/dist/data/call-graph/call-graph-vocabulary.cjs +19 -1
- package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -1
- package/dist/data/call-graph/call-graph-vocabulary.d.ts +4 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -1
- package/dist/data/call-graph/call-graph-vocabulary.js +19 -1
- package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -1
- package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -1
- package/dist/data/call-graph/index.d.ts +2 -2
- package/dist/data/call-graph/index.d.ts.map +1 -1
- package/dist/data/call-graph/types.cjs.map +1 -1
- package/dist/data/call-graph/types.d.ts +7 -2
- package/dist/data/call-graph/types.d.ts.map +1 -1
- package/dist/data/call-graph/types.js.map +1 -1
- package/dist/data/chat/Chat.cjs +1 -1
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.js +1 -1
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +4 -4
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/PromptInput.cjs +4 -2
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +5 -1
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +4 -2
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/data-access.cjs +8 -0
- package/dist/data/data-access.cjs.map +1 -0
- package/dist/data/data-access.d.ts +5 -0
- package/dist/data/data-access.d.ts.map +1 -0
- package/dist/data/data-access.js +8 -0
- package/dist/data/data-access.js.map +1 -0
- package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
- package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.js +14 -3
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
- package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.js +6 -1
- package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
- package/dist/data/git/GitChangeList.cjs +6 -2
- package/dist/data/git/GitChangeList.cjs.map +1 -1
- package/dist/data/git/GitChangeList.d.ts +6 -1
- package/dist/data/git/GitChangeList.d.ts.map +1 -1
- package/dist/data/git/GitChangeList.js +6 -2
- package/dist/data/git/GitChangeList.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +47 -16
- package/dist/data/graph-columns-layout.cjs.map +1 -1
- package/dist/data/graph-columns-layout.d.ts +34 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -1
- package/dist/data/graph-columns-layout.js +47 -16
- package/dist/data/graph-columns-layout.js.map +1 -1
- package/dist/data/graph-diagram-model.cjs +5 -0
- package/dist/data/graph-diagram-model.cjs.map +1 -1
- package/dist/data/graph-diagram-model.d.ts +19 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -1
- package/dist/data/graph-diagram-model.js +5 -0
- package/dist/data/graph-diagram-model.js.map +1 -1
- package/dist/data/graph-group-window.cjs +60 -0
- package/dist/data/graph-group-window.cjs.map +1 -0
- package/dist/data/graph-group-window.d.ts +33 -0
- package/dist/data/graph-group-window.d.ts.map +1 -0
- package/dist/data/graph-group-window.js +60 -0
- package/dist/data/graph-group-window.js.map +1 -0
- package/dist/data/har/HarPanel.cjs +3 -1
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts +4 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +3 -1
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/test-runner/Expectation.cjs +57 -0
- package/dist/data/test-runner/Expectation.cjs.map +1 -0
- package/dist/data/test-runner/Expectation.d.ts +19 -0
- package/dist/data/test-runner/Expectation.d.ts.map +1 -0
- package/dist/data/test-runner/Expectation.js +57 -0
- package/dist/data/test-runner/Expectation.js.map +1 -0
- package/dist/data/test-runner/MarkIcons.cjs +38 -0
- package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
- package/dist/data/test-runner/MarkIcons.d.ts +15 -0
- package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
- package/dist/data/test-runner/MarkIcons.js +38 -0
- package/dist/data/test-runner/MarkIcons.js.map +1 -0
- package/dist/data/test-runner/TestDetailPanel.cjs +74 -42
- package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.js +76 -44
- package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
- package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
- package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.js +23 -27
- package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
- package/dist/data/test-runner/TestFilterBar.cjs +87 -93
- package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
- package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
- package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
- package/dist/data/test-runner/TestFilterBar.js +89 -95
- package/dist/data/test-runner/TestFilterBar.js.map +1 -1
- package/dist/data/test-runner/TestRunSummary.cjs +35 -21
- package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
- package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunSummary.js +35 -21
- package/dist/data/test-runner/TestRunSummary.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +52 -30
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +3 -2
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +52 -30
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/test-runner/TestTree.cjs +5 -2
- package/dist/data/test-runner/TestTree.cjs.map +1 -1
- package/dist/data/test-runner/TestTree.d.ts +5 -2
- package/dist/data/test-runner/TestTree.d.ts.map +1 -1
- package/dist/data/test-runner/TestTree.js +5 -2
- package/dist/data/test-runner/TestTree.js.map +1 -1
- package/dist/data/test-runner/TestTreeNode.cjs +27 -19
- package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
- package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
- package/dist/data/test-runner/TestTreeNode.js +28 -20
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +11 -0
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +18 -7
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +11 -0
- package/dist/data/test-runner/adapter.js.map +1 -1
- package/dist/data/test-runner/copy.cjs +114 -0
- package/dist/data/test-runner/copy.cjs.map +1 -0
- package/dist/data/test-runner/copy.d.ts +47 -0
- package/dist/data/test-runner/copy.d.ts.map +1 -0
- package/dist/data/test-runner/copy.js +114 -0
- package/dist/data/test-runner/copy.js.map +1 -0
- package/dist/data/test-runner/index.d.ts +5 -2
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +143 -0
- package/dist/data/test-runner/marks.cjs.map +1 -0
- package/dist/data/test-runner/marks.d.ts +30 -0
- package/dist/data/test-runner/marks.d.ts.map +1 -0
- package/dist/data/test-runner/marks.js +143 -0
- package/dist/data/test-runner/marks.js.map +1 -0
- package/dist/data/test-runner/status.cjs +27 -44
- package/dist/data/test-runner/status.cjs.map +1 -1
- package/dist/data/test-runner/status.d.ts +12 -3
- package/dist/data/test-runner/status.d.ts.map +1 -1
- package/dist/data/test-runner/status.js +27 -44
- package/dist/data/test-runner/status.js.map +1 -1
- package/dist/data/use-group-windows.cjs +50 -0
- package/dist/data/use-group-windows.cjs.map +1 -0
- package/dist/data/use-group-windows.d.ts +27 -0
- package/dist/data/use-group-windows.d.ts.map +1 -0
- package/dist/data/use-group-windows.js +50 -0
- package/dist/data/use-group-windows.js.map +1 -0
- package/dist/data/verification/adapterViews.cjs +16 -41
- package/dist/data/verification/adapterViews.cjs.map +1 -1
- package/dist/data/verification/adapterViews.d.ts.map +1 -1
- package/dist/data/verification/adapterViews.js +16 -41
- package/dist/data/verification/adapterViews.js.map +1 -1
- package/dist/data/verification/adapters.cjs +115 -3
- package/dist/data/verification/adapters.cjs.map +1 -1
- package/dist/data/verification/adapters.d.ts.map +1 -1
- package/dist/data/verification/adapters.js +115 -3
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/verification/verifyReportTests.cjs.map +1 -1
- package/dist/data/verification/verifyReportTests.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +54 -3
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +6 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +58 -7
- package/dist/data.js.map +1 -1
- package/dist/hooks/event-hub.cjs +229 -0
- package/dist/hooks/event-hub.cjs.map +1 -0
- package/dist/hooks/event-hub.d.ts +26 -0
- package/dist/hooks/event-hub.d.ts.map +1 -0
- package/dist/hooks/event-hub.js +229 -0
- package/dist/hooks/event-hub.js.map +1 -0
- package/dist/hooks.cjs +2 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +2 -0
- package/dist/hooks.js.map +1 -1
- package/dist/icons/components/UiLogoEslint.cjs +10 -0
- package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
- package/dist/icons/components/UiLogoEslint.d.ts +9 -0
- package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
- package/dist/icons/components/UiLogoEslint.js +10 -0
- package/dist/icons/components/UiLogoEslint.js.map +1 -0
- package/dist/icons/components/UiLogoGo.cjs +10 -0
- package/dist/icons/components/UiLogoGo.cjs.map +1 -0
- package/dist/icons/components/UiLogoGo.d.ts +9 -0
- package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
- package/dist/icons/components/UiLogoGo.js +10 -0
- package/dist/icons/components/UiLogoGo.js.map +1 -0
- package/dist/icons/components/UiLogoJest.cjs +10 -0
- package/dist/icons/components/UiLogoJest.cjs.map +1 -0
- package/dist/icons/components/UiLogoJest.d.ts +9 -0
- package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
- package/dist/icons/components/UiLogoJest.js +10 -0
- package/dist/icons/components/UiLogoJest.js.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
- package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
- package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.js +10 -0
- package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
- package/dist/icons/components/UiLogoOxc.cjs +10 -0
- package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
- package/dist/icons/components/UiLogoOxc.d.ts +9 -0
- package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
- package/dist/icons/components/UiLogoOxc.js +10 -0
- package/dist/icons/components/UiLogoOxc.js.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
- package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
- package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.js +10 -0
- package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
- package/dist/icons/components/UiLogoPython.cjs +10 -0
- package/dist/icons/components/UiLogoPython.cjs.map +1 -0
- package/dist/icons/components/UiLogoPython.d.ts +9 -0
- package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
- package/dist/icons/components/UiLogoPython.js +10 -0
- package/dist/icons/components/UiLogoPython.js.map +1 -0
- package/dist/icons/components/UiLogoReact.cjs +10 -0
- package/dist/icons/components/UiLogoReact.cjs.map +1 -0
- package/dist/icons/components/UiLogoReact.d.ts +9 -0
- package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
- package/dist/icons/components/UiLogoReact.js +10 -0
- package/dist/icons/components/UiLogoReact.js.map +1 -0
- package/dist/icons/components/UiLogoRuff.cjs +10 -0
- package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
- package/dist/icons/components/UiLogoRuff.d.ts +9 -0
- package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
- package/dist/icons/components/UiLogoRuff.js +10 -0
- package/dist/icons/components/UiLogoRuff.js.map +1 -0
- package/dist/icons/components/UiLogoTypescript.cjs +10 -0
- package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
- package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
- package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
- package/dist/icons/components/UiLogoTypescript.js +10 -0
- package/dist/icons/components/UiLogoTypescript.js.map +1 -0
- package/dist/icons/components/UiLogoVitest.cjs +10 -0
- package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
- package/dist/icons/components/UiLogoVitest.d.ts +9 -0
- package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
- package/dist/icons/components/UiLogoVitest.js +10 -0
- package/dist/icons/components/UiLogoVitest.js.map +1 -0
- package/dist/icons/index.d.ts +11 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +22 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +22 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +22 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +22 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +56 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +60 -7
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +4 -4
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/overlay/modalStack.cjs +13 -6
- package/dist/overlay/modalStack.cjs.map +1 -1
- package/dist/overlay/modalStack.d.ts.map +1 -1
- package/dist/overlay/modalStack.js +13 -6
- package/dist/overlay/modalStack.js.map +1 -1
- package/dist/rpc/InlineError.cjs +12 -43
- package/dist/rpc/InlineError.cjs.map +1 -1
- package/dist/rpc/InlineError.d.ts.map +1 -1
- package/dist/rpc/InlineError.js +13 -44
- package/dist/rpc/InlineError.js.map +1 -1
- package/dist/rpc/OperationScheduleDialog.cjs +63 -10
- package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
- package/dist/rpc/OperationScheduleDialog.d.ts +4 -0
- package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
- package/dist/rpc/OperationScheduleDialog.js +63 -10
- package/dist/rpc/OperationScheduleDialog.js.map +1 -1
- package/dist/rpc/OperationSchedules.cjs +12 -2
- package/dist/rpc/OperationSchedules.cjs.map +1 -1
- package/dist/rpc/OperationSchedules.d.ts.map +1 -1
- package/dist/rpc/OperationSchedules.js +12 -2
- package/dist/rpc/OperationSchedules.js.map +1 -1
- package/dist/rpc/operation-schedule-model.cjs +2 -0
- package/dist/rpc/operation-schedule-model.cjs.map +1 -1
- package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
- package/dist/rpc/operation-schedule-model.js +2 -0
- package/dist/rpc/operation-schedule-model.js.map +1 -1
- package/dist/rpc/operation-schedule-types.d.ts +7 -1
- package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/data/test-runner/frameworkIcon.cjs +0 -27
- package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
- package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
- package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
- package/dist/data/test-runner/frameworkIcon.js +0 -27
- package/dist/data/test-runner/frameworkIcon.js.map +0 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { formatTestDuration, outcomeFor } from "./status.js";
|
|
2
|
+
const OUTPUT_TITLES = /* @__PURE__ */ new Set(["stdout", "stderr"]);
|
|
3
|
+
function fact(label, value) {
|
|
4
|
+
return value ? [{ label, value }] : [];
|
|
5
|
+
}
|
|
6
|
+
function section(title, body, lang) {
|
|
7
|
+
if (!body) return [];
|
|
8
|
+
return [lang ? { title, lang, body } : { title, body }];
|
|
9
|
+
}
|
|
10
|
+
function nodeLocation(node) {
|
|
11
|
+
if (!node.file) return void 0;
|
|
12
|
+
return node.line ? `${node.file}:${node.line}` : node.file;
|
|
13
|
+
}
|
|
14
|
+
function errorBody(node) {
|
|
15
|
+
var _a;
|
|
16
|
+
const summary = (_a = node.failure_detail) == null ? void 0 : _a.summary;
|
|
17
|
+
const lines = [node.message, summary !== node.message ? summary : void 0];
|
|
18
|
+
return lines.filter(Boolean).join("\n");
|
|
19
|
+
}
|
|
20
|
+
function expectationBody(node) {
|
|
21
|
+
const failure = node.failure_detail;
|
|
22
|
+
if (!failure) return "";
|
|
23
|
+
return [
|
|
24
|
+
failure.matcher && `matcher: ${failure.matcher}`,
|
|
25
|
+
failure.expected && `expected: ${failure.expected}`,
|
|
26
|
+
failure.actual && `actual: ${failure.actual}`,
|
|
27
|
+
failure.location && `at: ${failure.location}`
|
|
28
|
+
].filter(Boolean).join("\n");
|
|
29
|
+
}
|
|
30
|
+
function genericCopySections(node) {
|
|
31
|
+
var _a;
|
|
32
|
+
const duration = node.duration ? formatTestDuration(node.duration) : void 0;
|
|
33
|
+
return {
|
|
34
|
+
facts: [
|
|
35
|
+
...fact("Result", outcomeFor(node) ?? void 0),
|
|
36
|
+
...fact("Tool", node.framework),
|
|
37
|
+
...fact("Location", nodeLocation(node)),
|
|
38
|
+
...fact("Duration", duration)
|
|
39
|
+
],
|
|
40
|
+
brief: [
|
|
41
|
+
...section("Error", errorBody(node)),
|
|
42
|
+
...section("Expectation", expectationBody(node)),
|
|
43
|
+
...section("Stack", (_a = node.failure_detail) == null ? void 0 : _a.stack),
|
|
44
|
+
...section("stdout", node.stdout),
|
|
45
|
+
...section("stderr", node.stderr)
|
|
46
|
+
],
|
|
47
|
+
items: []
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function uniqueBy(values, key) {
|
|
51
|
+
const seen = /* @__PURE__ */ new Set();
|
|
52
|
+
return values.filter((value) => {
|
|
53
|
+
const k = key(value);
|
|
54
|
+
if (seen.has(k)) return false;
|
|
55
|
+
seen.add(k);
|
|
56
|
+
return true;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function mergeCopySections(parts) {
|
|
60
|
+
return {
|
|
61
|
+
facts: uniqueBy(
|
|
62
|
+
parts.flatMap((p) => p.facts ?? []),
|
|
63
|
+
(f) => f.label
|
|
64
|
+
),
|
|
65
|
+
brief: uniqueBy(
|
|
66
|
+
parts.flatMap((p) => p.brief ?? []),
|
|
67
|
+
(s) => s.title
|
|
68
|
+
),
|
|
69
|
+
items: uniqueBy(
|
|
70
|
+
parts.flatMap((p) => p.items ?? []),
|
|
71
|
+
(i) => i.label
|
|
72
|
+
)
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function fence(body) {
|
|
76
|
+
const longest = Math.max(0, ...(body.match(/`+/g) ?? []).map((run) => run.length));
|
|
77
|
+
return "`".repeat(Math.max(3, longest + 1));
|
|
78
|
+
}
|
|
79
|
+
function buildBrief(node, sections, facts) {
|
|
80
|
+
const lines = [`# ${node.name}`];
|
|
81
|
+
if (facts.length > 0) lines.push("", ...facts.map((f) => `- **${f.label}:** ${f.value}`));
|
|
82
|
+
for (const s of sections) {
|
|
83
|
+
if (!s.body) continue;
|
|
84
|
+
lines.push("", `## ${s.title}`, "");
|
|
85
|
+
if (s.markdown) {
|
|
86
|
+
lines.push(s.body);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const marker = fence(s.body);
|
|
90
|
+
lines.push(`${marker}${s.lang ?? ""}`, s.body, marker);
|
|
91
|
+
}
|
|
92
|
+
return lines.join("\n");
|
|
93
|
+
}
|
|
94
|
+
function buildNodeBrief(node, adapter) {
|
|
95
|
+
const generic = genericCopySections(node);
|
|
96
|
+
const merged = mergeCopySections([
|
|
97
|
+
{ facts: generic.facts, brief: generic.brief.filter((s) => !OUTPUT_TITLES.has(s.title)) },
|
|
98
|
+
adapter,
|
|
99
|
+
{ brief: generic.brief.filter((s) => OUTPUT_TITLES.has(s.title)) }
|
|
100
|
+
]);
|
|
101
|
+
return buildBrief(node, merged.brief, merged.facts);
|
|
102
|
+
}
|
|
103
|
+
function buildNodeJson(node) {
|
|
104
|
+
const { children: _children, ...rest } = node;
|
|
105
|
+
return JSON.stringify(rest, null, 2);
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
buildBrief,
|
|
109
|
+
buildNodeBrief,
|
|
110
|
+
buildNodeJson,
|
|
111
|
+
genericCopySections,
|
|
112
|
+
mergeCopySections
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sources":["../../../src/data/test-runner/copy.ts"],"sourcesContent":["// Clipboard payloads for the detail header's \"Copy details\" split button. The\n// primary payload is a Markdown brief: a `# name` heading, `- **Label:** value`\n// facts, then one fenced `## Title` section per piece of evidence. The generic\n// sections here read only common `Test` fields; node adapters contribute the\n// domain sections (a command, a CEL assertion, a recording) and extra menu items\n// through `TestNodeAdapter.copy`. Pure — no React, no clipboard — so every\n// payload is unit-testable as a string.\n\nimport type { StaticIconComponent } from \"../Icon\";\nimport type { Test } from \"./types\";\nimport { formatTestDuration, outcomeFor } from \"./status\";\n\n/** One `- **label:** value` line under the brief's heading. */\nexport type BriefFact = { label: string; value: string };\n\n/**\n * One `## title` block of the brief: fenced (tagged with `lang`) by default, or\n * inserted as-is when `markdown` — for lists and links that must stay live.\n */\nexport type BriefSection = { title: string; lang?: string; markdown?: boolean; body: string };\n\ntype CopyItemBase = { label: string; icon?: StaticIconComponent | string };\n\n/** A copy menu item: the text it copies, or why there is nothing to copy. */\nexport type CopyItem = (CopyItemBase & { value: string }) | (CopyItemBase & { reason: string });\n\nexport type CopySections = {\n facts?: BriefFact[];\n brief?: BriefSection[];\n items?: CopyItem[];\n};\n\n/** Generic sections rendered after every adapter section, so evidence reads before raw output. */\nconst OUTPUT_TITLES = new Set([\"stdout\", \"stderr\"]);\n\nfunction fact(label: string, value: string | undefined): BriefFact[] {\n return value ? [{ label, value }] : [];\n}\n\nfunction section(title: string, body: string | undefined, lang?: string): BriefSection[] {\n if (!body) return [];\n return [lang ? { title, lang, body } : { title, body }];\n}\n\nfunction nodeLocation(node: Test): string | undefined {\n if (!node.file) return undefined;\n return node.line ? `${node.file}:${node.line}` : node.file;\n}\n\nfunction errorBody(node: Test): string {\n const summary = node.failure_detail?.summary;\n const lines = [node.message, summary !== node.message ? summary : undefined];\n return lines.filter(Boolean).join(\"\\n\");\n}\n\nfunction expectationBody(node: Test): string {\n const failure = node.failure_detail;\n if (!failure) return \"\";\n return [\n failure.matcher && `matcher: ${failure.matcher}`,\n failure.expected && `expected: ${failure.expected}`,\n failure.actual && `actual: ${failure.actual}`,\n failure.location && `at: ${failure.location}`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\n/** Sections every node gets, read from the common `Test` fields only. */\nexport function genericCopySections(node: Test): Required<CopySections> {\n const duration = node.duration ? formatTestDuration(node.duration) : undefined;\n return {\n facts: [\n ...fact(\"Result\", outcomeFor(node) ?? undefined),\n ...fact(\"Tool\", node.framework),\n ...fact(\"Location\", nodeLocation(node)),\n ...fact(\"Duration\", duration),\n ],\n brief: [\n ...section(\"Error\", errorBody(node)),\n ...section(\"Expectation\", expectationBody(node)),\n ...section(\"Stack\", node.failure_detail?.stack),\n ...section(\"stdout\", node.stdout),\n ...section(\"stderr\", node.stderr),\n ],\n items: [],\n };\n}\n\nfunction uniqueBy<T>(values: T[], key: (value: T) => string): T[] {\n const seen = new Set<string>();\n return values.filter((value) => {\n const k = key(value);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n}\n\n/** Concatenates sections in order, keeping the first fact/section/item per label or title. */\nexport function mergeCopySections(parts: CopySections[]): Required<CopySections> {\n return {\n facts: uniqueBy(\n parts.flatMap((p) => p.facts ?? []),\n (f) => f.label,\n ),\n brief: uniqueBy(\n parts.flatMap((p) => p.brief ?? []),\n (s) => s.title,\n ),\n items: uniqueBy(\n parts.flatMap((p) => p.items ?? []),\n (i) => i.label,\n ),\n };\n}\n\n// A fence one backtick longer than any run in the body, so captured output that\n// itself contains ``` cannot close the block early (CommonMark).\nfunction fence(body: string): string {\n const longest = Math.max(0, ...(body.match(/`+/g) ?? []).map((run) => run.length));\n return \"`\".repeat(Math.max(3, longest + 1));\n}\n\n/** The Markdown brief: `# name`, the facts as bullets, then each non-empty section (fenced unless `markdown`). */\nexport function buildBrief(node: Test, sections: BriefSection[], facts: BriefFact[]): string {\n const lines = [`# ${node.name}`];\n if (facts.length > 0) lines.push(\"\", ...facts.map((f) => `- **${f.label}:** ${f.value}`));\n for (const s of sections) {\n if (!s.body) continue;\n lines.push(\"\", `## ${s.title}`, \"\");\n if (s.markdown) {\n lines.push(s.body);\n continue;\n }\n const marker = fence(s.body);\n lines.push(`${marker}${s.lang ?? \"\"}`, s.body, marker);\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * The primary \"Copy details\" payload: generic facts and error/expectation\n * sections, then the adapters' sections, then the captured stdout/stderr.\n */\nexport function buildNodeBrief(node: Test, adapter: CopySections): string {\n const generic = genericCopySections(node);\n const merged = mergeCopySections([\n { facts: generic.facts, brief: generic.brief.filter((s) => !OUTPUT_TITLES.has(s.title)) },\n adapter,\n { brief: generic.brief.filter((s) => OUTPUT_TITLES.has(s.title)) },\n ]);\n return buildBrief(node, merged.brief, merged.facts);\n}\n\n/** \"Copy as JSON\": the node without its children subtree, 2-space indented. */\nexport function buildNodeJson(node: Test): string {\n const { children: _children, ...rest } = node;\n return JSON.stringify(rest, null, 2);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -3,12 +3,15 @@ export { TestTree } from './TestTree.js';
|
|
|
3
3
|
export { TestTreeNode } from './TestTreeNode.js';
|
|
4
4
|
export { TestDetailPanel } from './TestDetailPanel.js';
|
|
5
5
|
export { TestFailureDetail, TestOutput, TestAttempts, } from './TestFailureDetail.js';
|
|
6
|
+
export { Expectation, type ExpectationProps } from './Expectation.js';
|
|
6
7
|
export { TestRunSummary, type TestRunSummaryProps } from './TestRunSummary.js';
|
|
7
8
|
export { TestFilterBar, type TestFilterBarProps } from './TestFilterBar.js';
|
|
8
9
|
export { TestRunnerProvider, useTestRunner, type TestRunnerContext, } from './context.js';
|
|
9
10
|
export { TestNodeAdapterRegistry, createTestRunnerRegistry, type TestNodeAdapter, type AdapterContext, type DetailTab, } from './adapter.js';
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
11
|
+
export { genericCopySections, mergeCopySections, buildBrief, buildNodeBrief, buildNodeJson, type BriefFact, type BriefSection, type CopyItem, type CopySections, } from './copy.js';
|
|
12
|
+
export { type StatusCounts, type TestStatus, sum, sumNonTaskTests, aggregateStatusCounts, STATUS_LABELS, hasFailed, hasPending, testStatus, totalDuration, outcomeFor, type TestOutcome, statusToneFor, formatTestDuration, formatCount, humanizeName, collectFrameworks, collapseSingleChildChains, filterTests, } from './status.js';
|
|
13
|
+
export { TEST_OUTCOMES, LINT_SEVERITIES, TEST_TOOLS, toolMark, type ResultMark, type LintSeverity, type ToolKind, type ToolMark, } from './marks.js';
|
|
14
|
+
export { OutcomeIcon, LintSeverityIcon, ToolIcon } from './MarkIcons.js';
|
|
12
15
|
export { slugify, annotateRoutePaths, findNodeByRoutePath } from './routePath.js';
|
|
13
16
|
export { type FilterMode, type FilterState, type TestFilters, emptyTestFilters, decodeFilterState, encodeFilterState, cycleFilterState, matchesFilterState, filterStateToRecord, recordToFilterState, } from './filterState.js';
|
|
14
17
|
export type { Test, TestSummary, TestAttempt, FailureDetail, FailureKind, GoTestContext, GinkgoContext, FixtureContext, TaskContext, RunMeta, Snapshot, SnapshotGit, SnapshotStatus, } from './types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,GAAG,EACH,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,aAAa,EACb,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,YAAY,GAClB,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,GAAG,EACH,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,aAAa,EACb,UAAU,EACV,KAAK,WAAW,EAChB,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,WAAW,GACZ,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,aAAa,EACb,eAAe,EACf,UAAU,EACV,QAAQ,EACR,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,QAAQ,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,IAAI,EACJ,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const status = require("./status.cjs");
|
|
4
|
+
const UiInfo = require("../../icons/components/UiInfo.cjs");
|
|
5
|
+
const UiWarningTriangle = require("../../icons/components/UiWarningTriangle.cjs");
|
|
6
|
+
const UiCircleX = require("../../icons/components/UiCircleX.cjs");
|
|
7
|
+
const UiLoader = require("../../icons/components/UiLoader.cjs");
|
|
8
|
+
const UiCircleOutline = require("../../icons/components/UiCircleOutline.cjs");
|
|
9
|
+
const UiSkipForward = require("../../icons/components/UiSkipForward.cjs");
|
|
10
|
+
const UiPass = require("../../icons/components/UiPass.cjs");
|
|
11
|
+
const UiTimer = require("../../icons/components/UiTimer.cjs");
|
|
12
|
+
const UiProhibit = require("../../icons/components/UiProhibit.cjs");
|
|
13
|
+
const UiLogoReact = require("../../icons/components/UiLogoReact.cjs");
|
|
14
|
+
const UiCopy = require("../../icons/components/UiCopy.cjs");
|
|
15
|
+
const UiKey = require("../../icons/components/UiKey.cjs");
|
|
16
|
+
const UiLogoRuff = require("../../icons/components/UiLogoRuff.cjs");
|
|
17
|
+
const UiLogoPython = require("../../icons/components/UiLogoPython.cjs");
|
|
18
|
+
const UiLogoMarkdown = require("../../icons/components/UiLogoMarkdown.cjs");
|
|
19
|
+
const UiLogoTypescript = require("../../icons/components/UiLogoTypescript.cjs");
|
|
20
|
+
const UiLogoOxc = require("../../icons/components/UiLogoOxc.cjs");
|
|
21
|
+
const UiLogoEslint = require("../../icons/components/UiLogoEslint.cjs");
|
|
22
|
+
const UiLogoGo = require("../../icons/components/UiLogoGo.cjs");
|
|
23
|
+
const UiSealCheck = require("../../icons/components/UiSealCheck.cjs");
|
|
24
|
+
const UiDatabase = require("../../icons/components/UiDatabase.cjs");
|
|
25
|
+
const UiSparkles = require("../../icons/components/UiSparkles.cjs");
|
|
26
|
+
const UiListChecks = require("../../icons/components/UiListChecks.cjs");
|
|
27
|
+
const UiBeaker = require("../../icons/components/UiBeaker.cjs");
|
|
28
|
+
const UiTerminal = require("../../icons/components/UiTerminal.cjs");
|
|
29
|
+
const UiLogoPlaywright = require("../../icons/components/UiLogoPlaywright.cjs");
|
|
30
|
+
const UiLogoJest = require("../../icons/components/UiLogoJest.cjs");
|
|
31
|
+
const UiLogoVitest = require("../../icons/components/UiLogoVitest.cjs");
|
|
32
|
+
const LABEL = Object.fromEntries(status.STATUS_LABELS.map((s) => [s.key, s.label]));
|
|
33
|
+
const RED = "text-red-600 dark:text-red-400";
|
|
34
|
+
const AMBER = "text-amber-600 dark:text-amber-400";
|
|
35
|
+
const TEST_OUTCOMES = {
|
|
36
|
+
failed: { icon: UiCircleX.UiCircleX, label: LABEL.failed, className: RED },
|
|
37
|
+
errored: { icon: UiProhibit.UiProhibit, label: "Could not run", className: RED },
|
|
38
|
+
timedout: { icon: UiTimer.UiTimer, label: LABEL.timedout, className: AMBER },
|
|
39
|
+
warned: { icon: UiWarningTriangle.UiWarningTriangle, label: LABEL.warned, className: AMBER },
|
|
40
|
+
passed: {
|
|
41
|
+
icon: UiPass.UiPass,
|
|
42
|
+
label: LABEL.passed,
|
|
43
|
+
className: "text-emerald-600 dark:text-emerald-400"
|
|
44
|
+
},
|
|
45
|
+
skipped: { icon: UiSkipForward.UiSkipForward, label: LABEL.skipped, className: "text-slate-500" },
|
|
46
|
+
pending: {
|
|
47
|
+
icon: UiCircleOutline.UiCircleOutline,
|
|
48
|
+
label: LABEL.pending,
|
|
49
|
+
className: "text-slate-400 dark:text-slate-500"
|
|
50
|
+
},
|
|
51
|
+
running: {
|
|
52
|
+
icon: UiLoader.UiLoader,
|
|
53
|
+
label: LABEL.running,
|
|
54
|
+
className: "text-blue-600 dark:text-blue-400",
|
|
55
|
+
spin: true
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const LINT_SEVERITIES = {
|
|
59
|
+
error: { ...TEST_OUTCOMES.failed, label: "Error" },
|
|
60
|
+
warning: { ...TEST_OUTCOMES.warned, label: "Warning" },
|
|
61
|
+
info: { icon: UiInfo.UiInfo, label: "Info", className: "text-sky-600 dark:text-sky-400" }
|
|
62
|
+
};
|
|
63
|
+
const GO = "text-[#00add8]";
|
|
64
|
+
const MARKDOWN = "text-foreground";
|
|
65
|
+
const MUTED = "text-muted-foreground";
|
|
66
|
+
const TEST_TOOLS = {
|
|
67
|
+
"go test": { icon: UiLogoGo.UiLogoGo, label: "go test", kind: "test", className: GO },
|
|
68
|
+
ginkgo: { icon: UiLogoGo.UiLogoGo, label: "Ginkgo", kind: "test", className: GO },
|
|
69
|
+
vitest: { icon: UiLogoVitest.UiLogoVitest, label: "Vitest", kind: "test", className: "text-[#6e9f18]" },
|
|
70
|
+
jest: { icon: UiLogoJest.UiLogoJest, label: "Jest", kind: "test", className: "text-[#c21325] dark:text-[#e5576a]" },
|
|
71
|
+
playwright: {
|
|
72
|
+
icon: UiLogoPlaywright.UiLogoPlaywright,
|
|
73
|
+
label: "Playwright",
|
|
74
|
+
kind: "test",
|
|
75
|
+
className: "text-[#2ead33]"
|
|
76
|
+
},
|
|
77
|
+
fixture: { icon: UiLogoMarkdown.UiLogoMarkdown, label: "Markdown fixture", kind: "test", className: MARKDOWN },
|
|
78
|
+
task: { icon: UiTerminal.UiTerminal, label: "Task", kind: "runner", className: MUTED },
|
|
79
|
+
// Fixture step types (gavel fixtures FixtureResult.Type) and the
|
|
80
|
+
// "checklist" node verifyReportTests synthesizes for acceptance criteria.
|
|
81
|
+
exec: { icon: UiTerminal.UiTerminal, label: "Command", kind: "fixture", className: MUTED },
|
|
82
|
+
test: { icon: UiBeaker.UiBeaker, label: "Test step", kind: "fixture", className: MUTED },
|
|
83
|
+
lint: { icon: UiListChecks.UiListChecks, label: "Lint step", kind: "fixture", className: MUTED },
|
|
84
|
+
verify: {
|
|
85
|
+
icon: UiSparkles.UiSparkles,
|
|
86
|
+
label: "AI review",
|
|
87
|
+
kind: "fixture",
|
|
88
|
+
className: "text-violet-600 dark:text-violet-400"
|
|
89
|
+
},
|
|
90
|
+
query: { icon: UiDatabase.UiDatabase, label: "Query", kind: "fixture", className: MUTED },
|
|
91
|
+
criterion: { icon: UiSealCheck.UiSealCheck, label: "Acceptance criterion", kind: "fixture", className: MUTED },
|
|
92
|
+
checklist: { icon: UiSealCheck.UiSealCheck, label: "Acceptance criteria", kind: "fixture", className: MUTED },
|
|
93
|
+
"golangci-lint": { icon: UiLogoGo.UiLogoGo, label: "golangci-lint", kind: "lint", className: GO },
|
|
94
|
+
eslint: {
|
|
95
|
+
icon: UiLogoEslint.UiLogoEslint,
|
|
96
|
+
label: "ESLint",
|
|
97
|
+
kind: "lint",
|
|
98
|
+
className: "text-[#4b32c3] dark:text-[#8080f2]"
|
|
99
|
+
},
|
|
100
|
+
oxlint: {
|
|
101
|
+
icon: UiLogoOxc.UiLogoOxc,
|
|
102
|
+
label: "oxlint",
|
|
103
|
+
kind: "lint",
|
|
104
|
+
className: "text-[#0891b2] dark:text-[#00f7f1]"
|
|
105
|
+
},
|
|
106
|
+
tsc: {
|
|
107
|
+
icon: UiLogoTypescript.UiLogoTypescript,
|
|
108
|
+
label: "TypeScript compiler",
|
|
109
|
+
kind: "lint",
|
|
110
|
+
className: "text-[#3178c6]"
|
|
111
|
+
},
|
|
112
|
+
markdownlint: { icon: UiLogoMarkdown.UiLogoMarkdown, label: "markdownlint", kind: "lint", className: MARKDOWN },
|
|
113
|
+
vale: { icon: UiLogoMarkdown.UiLogoMarkdown, label: "Vale (prose)", kind: "lint", className: MARKDOWN },
|
|
114
|
+
pyright: {
|
|
115
|
+
icon: UiLogoPython.UiLogoPython,
|
|
116
|
+
label: "Pyright",
|
|
117
|
+
kind: "lint",
|
|
118
|
+
className: "text-[#3776ab] dark:text-[#ffd43b]"
|
|
119
|
+
},
|
|
120
|
+
ruff: {
|
|
121
|
+
icon: UiLogoRuff.UiLogoRuff,
|
|
122
|
+
label: "Ruff",
|
|
123
|
+
kind: "lint",
|
|
124
|
+
className: "text-[#261230] dark:text-[#d7ff64]"
|
|
125
|
+
},
|
|
126
|
+
// A secret scanner's finding is about a credential, not a language.
|
|
127
|
+
betterleaks: { icon: UiKey.UiKey, label: "betterleaks (secrets)", kind: "lint", className: MUTED },
|
|
128
|
+
jscpd: { icon: UiCopy.UiCopy, label: "jscpd (duplicate code)", kind: "lint", className: MUTED },
|
|
129
|
+
reactdoctor: {
|
|
130
|
+
icon: UiLogoReact.UiLogoReact,
|
|
131
|
+
label: "React Doctor",
|
|
132
|
+
kind: "lint",
|
|
133
|
+
className: "text-[#0e7490] dark:text-[#61dafb]"
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
function toolMark(tool) {
|
|
137
|
+
return tool && TEST_TOOLS[tool] || null;
|
|
138
|
+
}
|
|
139
|
+
exports.LINT_SEVERITIES = LINT_SEVERITIES;
|
|
140
|
+
exports.TEST_OUTCOMES = TEST_OUTCOMES;
|
|
141
|
+
exports.TEST_TOOLS = TEST_TOOLS;
|
|
142
|
+
exports.toolMark = toolMark;
|
|
143
|
+
//# sourceMappingURL=marks.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marks.cjs","sources":["../../../src/data/test-runner/marks.ts"],"sourcesContent":["// The shared iconography for test and lint results: what happened (outcome),\n// how bad a finding is (lint severity), and what produced it (tool).\n//\n// Every outcome has its own outline glyph, so a result never reads by colour\n// alone.\n// Tool marks are bundled Simple Icons brand glyphs (offline, no runtime icon\n// names), coloured per theme here because one brand hex can't hold up on both\n// light and dark surfaces.\n\nimport type { StaticIconComponent } from \"../Icon\";\nimport {\n UiCircleOutline,\n UiCircleX,\n UiBeaker,\n UiCopy,\n UiDatabase,\n UiInfo,\n UiKey,\n UiListChecks,\n UiLoader,\n UiLogoEslint,\n UiLogoGo,\n UiLogoJest,\n UiLogoMarkdown,\n UiLogoOxc,\n UiLogoPlaywright,\n UiLogoPython,\n UiLogoReact,\n UiLogoRuff,\n UiLogoTypescript,\n UiLogoVitest,\n UiPass,\n UiProhibit,\n UiSealCheck,\n UiSkipForward,\n UiSparkles,\n UiTerminal,\n UiTimer,\n UiWarningTriangle,\n} from \"../../icons\";\nimport { STATUS_LABELS, type TestOutcome } from \"./status\";\n\nexport type { TestOutcome } from \"./status\";\n\nexport type ResultMark = {\n icon: StaticIconComponent;\n label: string;\n /** Text colour classes for light and dark themes. */\n className: string;\n spin?: boolean;\n};\n\nconst LABEL = Object.fromEntries(STATUS_LABELS.map((s) => [s.key, s.label]));\n\nconst RED = \"text-red-600 dark:text-red-400\";\nconst AMBER = \"text-amber-600 dark:text-amber-400\";\n\nexport const TEST_OUTCOMES: Record<TestOutcome, ResultMark> = {\n failed: { icon: UiCircleX, label: LABEL.failed!, className: RED },\n errored: { icon: UiProhibit, label: \"Could not run\", className: RED },\n timedout: { icon: UiTimer, label: LABEL.timedout!, className: AMBER },\n warned: { icon: UiWarningTriangle, label: LABEL.warned!, className: AMBER },\n passed: {\n icon: UiPass,\n label: LABEL.passed!,\n className: \"text-emerald-600 dark:text-emerald-400\",\n },\n skipped: { icon: UiSkipForward, label: LABEL.skipped!, className: \"text-slate-500\" },\n pending: {\n icon: UiCircleOutline,\n label: LABEL.pending!,\n className: \"text-slate-400 dark:text-slate-500\",\n },\n running: {\n icon: UiLoader,\n label: LABEL.running!,\n className: \"text-blue-600 dark:text-blue-400\",\n spin: true,\n },\n};\n\nexport type LintSeverity = \"error\" | \"warning\" | \"info\";\n\n/** An error-severity finding fails the verdict and a warning warns it, so they share those outcomes' marks. */\nexport const LINT_SEVERITIES: Record<LintSeverity, ResultMark> = {\n error: { ...TEST_OUTCOMES.failed, label: \"Error\" },\n warning: { ...TEST_OUTCOMES.warned, label: \"Warning\" },\n info: { icon: UiInfo, label: \"Info\", className: \"text-sky-600 dark:text-sky-400\" },\n};\n\nexport type ToolKind = \"test\" | \"lint\" | \"fixture\" | \"runner\";\n\nexport type ToolMark = {\n icon: StaticIconComponent;\n label: string;\n kind: ToolKind;\n className: string;\n};\n\nconst GO = \"text-[#00add8]\";\nconst MARKDOWN = \"text-foreground\";\nconst MUTED = \"text-muted-foreground\";\n\n/**\n * Keyed by the identifiers gavel reports: testrunner/parsers Framework values\n * and each linter's Name(). A tool without a mark of its own takes its\n * language's (golangci-lint → Go, pyright → Python).\n */\nexport const TEST_TOOLS: Record<string, ToolMark> = {\n \"go test\": { icon: UiLogoGo, label: \"go test\", kind: \"test\", className: GO },\n ginkgo: { icon: UiLogoGo, label: \"Ginkgo\", kind: \"test\", className: GO },\n vitest: { icon: UiLogoVitest, label: \"Vitest\", kind: \"test\", className: \"text-[#6e9f18]\" },\n jest: { icon: UiLogoJest, label: \"Jest\", kind: \"test\", className: \"text-[#c21325] dark:text-[#e5576a]\" },\n playwright: {\n icon: UiLogoPlaywright,\n label: \"Playwright\",\n kind: \"test\",\n className: \"text-[#2ead33]\",\n },\n fixture: { icon: UiLogoMarkdown, label: \"Markdown fixture\", kind: \"test\", className: MARKDOWN },\n task: { icon: UiTerminal, label: \"Task\", kind: \"runner\", className: MUTED },\n // Fixture step types (gavel fixtures FixtureResult.Type) and the\n // \"checklist\" node verifyReportTests synthesizes for acceptance criteria.\n exec: { icon: UiTerminal, label: \"Command\", kind: \"fixture\", className: MUTED },\n test: { icon: UiBeaker, label: \"Test step\", kind: \"fixture\", className: MUTED },\n lint: { icon: UiListChecks, label: \"Lint step\", kind: \"fixture\", className: MUTED },\n verify: {\n icon: UiSparkles,\n label: \"AI review\",\n kind: \"fixture\",\n className: \"text-violet-600 dark:text-violet-400\",\n },\n query: { icon: UiDatabase, label: \"Query\", kind: \"fixture\", className: MUTED },\n criterion: { icon: UiSealCheck, label: \"Acceptance criterion\", kind: \"fixture\", className: MUTED },\n checklist: { icon: UiSealCheck, label: \"Acceptance criteria\", kind: \"fixture\", className: MUTED },\n \"golangci-lint\": { icon: UiLogoGo, label: \"golangci-lint\", kind: \"lint\", className: GO },\n eslint: {\n icon: UiLogoEslint,\n label: \"ESLint\",\n kind: \"lint\",\n className: \"text-[#4b32c3] dark:text-[#8080f2]\",\n },\n oxlint: {\n icon: UiLogoOxc,\n label: \"oxlint\",\n kind: \"lint\",\n className: \"text-[#0891b2] dark:text-[#00f7f1]\",\n },\n tsc: {\n icon: UiLogoTypescript,\n label: \"TypeScript compiler\",\n kind: \"lint\",\n className: \"text-[#3178c6]\",\n },\n markdownlint: { icon: UiLogoMarkdown, label: \"markdownlint\", kind: \"lint\", className: MARKDOWN },\n vale: { icon: UiLogoMarkdown, label: \"Vale (prose)\", kind: \"lint\", className: MARKDOWN },\n pyright: {\n icon: UiLogoPython,\n label: \"Pyright\",\n kind: \"lint\",\n className: \"text-[#3776ab] dark:text-[#ffd43b]\",\n },\n ruff: {\n icon: UiLogoRuff,\n label: \"Ruff\",\n kind: \"lint\",\n className: \"text-[#261230] dark:text-[#d7ff64]\",\n },\n // A secret scanner's finding is about a credential, not a language.\n betterleaks: { icon: UiKey, label: \"betterleaks (secrets)\", kind: \"lint\", className: MUTED },\n jscpd: { icon: UiCopy, label: \"jscpd (duplicate code)\", kind: \"lint\", className: MUTED },\n reactdoctor: {\n icon: UiLogoReact,\n label: \"React Doctor\",\n kind: \"lint\",\n className: \"text-[#0e7490] dark:text-[#61dafb]\",\n },\n};\n\n/** The tool's mark, or null for a tool the catalog doesn't know (render its name alone). */\nexport function toolMark(tool: string | undefined): ToolMark | null {\n return (tool && TEST_TOOLS[tool]) || null;\n}\n\n"],"names":["STATUS_LABELS","UiCircleX","UiProhibit","UiTimer","UiWarningTriangle","UiPass","UiSkipForward","UiCircleOutline","UiLoader","UiInfo","UiLogoGo","UiLogoVitest","UiLogoJest","UiLogoPlaywright","UiLogoMarkdown","UiTerminal","UiBeaker","UiListChecks","UiSparkles","UiDatabase","UiSealCheck","UiLogoEslint","UiLogoOxc","UiLogoTypescript","UiLogoPython","UiLogoRuff","UiKey","UiCopy","UiLogoReact"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,MAAM,QAAQ,OAAO,YAAYA,OAAAA,cAAc,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAE3E,MAAM,MAAM;AACZ,MAAM,QAAQ;AAEP,MAAM,gBAAiD;AAAA,EAC5D,QAAQ,EAAE,MAAMC,qBAAW,OAAO,MAAM,QAAS,WAAW,IAAA;AAAA,EAC5D,SAAS,EAAE,MAAMC,WAAAA,YAAY,OAAO,iBAAiB,WAAW,IAAA;AAAA,EAChE,UAAU,EAAE,MAAMC,iBAAS,OAAO,MAAM,UAAW,WAAW,MAAA;AAAA,EAC9D,QAAQ,EAAE,MAAMC,qCAAmB,OAAO,MAAM,QAAS,WAAW,MAAA;AAAA,EACpE,QAAQ;AAAA,IACN,MAAMC,OAAAA;AAAAA,IACN,OAAO,MAAM;AAAA,IACb,WAAW;AAAA,EAAA;AAAA,EAEb,SAAS,EAAE,MAAMC,6BAAe,OAAO,MAAM,SAAU,WAAW,iBAAA;AAAA,EAClE,SAAS;AAAA,IACP,MAAMC,gBAAAA;AAAAA,IACN,OAAO,MAAM;AAAA,IACb,WAAW;AAAA,EAAA;AAAA,EAEb,SAAS;AAAA,IACP,MAAMC,SAAAA;AAAAA,IACN,OAAO,MAAM;AAAA,IACb,WAAW;AAAA,IACX,MAAM;AAAA,EAAA;AAEV;AAKO,MAAM,kBAAoD;AAAA,EAC/D,OAAO,EAAE,GAAG,cAAc,QAAQ,OAAO,QAAA;AAAA,EACzC,SAAS,EAAE,GAAG,cAAc,QAAQ,OAAO,UAAA;AAAA,EAC3C,MAAM,EAAE,MAAMC,OAAAA,QAAQ,OAAO,QAAQ,WAAW,iCAAA;AAClD;AAWA,MAAM,KAAK;AACX,MAAM,WAAW;AACjB,MAAM,QAAQ;AAOP,MAAM,aAAuC;AAAA,EAClD,WAAW,EAAE,MAAMC,SAAAA,UAAU,OAAO,WAAW,MAAM,QAAQ,WAAW,GAAA;AAAA,EACxE,QAAQ,EAAE,MAAMA,SAAAA,UAAU,OAAO,UAAU,MAAM,QAAQ,WAAW,GAAA;AAAA,EACpE,QAAQ,EAAE,MAAMC,aAAAA,cAAc,OAAO,UAAU,MAAM,QAAQ,WAAW,iBAAA;AAAA,EACxE,MAAM,EAAE,MAAMC,WAAAA,YAAY,OAAO,QAAQ,MAAM,QAAQ,WAAW,qCAAA;AAAA,EAClE,YAAY;AAAA,IACV,MAAMC,iBAAAA;AAAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,EAAA;AAAA,EAEb,SAAS,EAAE,MAAMC,eAAAA,gBAAgB,OAAO,oBAAoB,MAAM,QAAQ,WAAW,SAAA;AAAA,EACrF,MAAM,EAAE,MAAMC,WAAAA,YAAY,OAAO,QAAQ,MAAM,UAAU,WAAW,MAAA;AAAA;AAAA;AAAA,EAGpE,MAAM,EAAE,MAAMA,WAAAA,YAAY,OAAO,WAAW,MAAM,WAAW,WAAW,MAAA;AAAA,EACxE,MAAM,EAAE,MAAMC,SAAAA,UAAU,OAAO,aAAa,MAAM,WAAW,WAAW,MAAA;AAAA,EACxE,MAAM,EAAE,MAAMC,aAAAA,cAAc,OAAO,aAAa,MAAM,WAAW,WAAW,MAAA;AAAA,EAC5E,QAAQ;AAAA,IACN,MAAMC,WAAAA;AAAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,EAAA;AAAA,EAEb,OAAO,EAAE,MAAMC,WAAAA,YAAY,OAAO,SAAS,MAAM,WAAW,WAAW,MAAA;AAAA,EACvE,WAAW,EAAE,MAAMC,YAAAA,aAAa,OAAO,wBAAwB,MAAM,WAAW,WAAW,MAAA;AAAA,EAC3F,WAAW,EAAE,MAAMA,YAAAA,aAAa,OAAO,uBAAuB,MAAM,WAAW,WAAW,MAAA;AAAA,EAC1F,iBAAiB,EAAE,MAAMV,SAAAA,UAAU,OAAO,iBAAiB,MAAM,QAAQ,WAAW,GAAA;AAAA,EACpF,QAAQ;AAAA,IACN,MAAMW,aAAAA;AAAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,EAAA;AAAA,EAEb,QAAQ;AAAA,IACN,MAAMC,UAAAA;AAAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,EAAA;AAAA,EAEb,KAAK;AAAA,IACH,MAAMC,iBAAAA;AAAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,EAAA;AAAA,EAEb,cAAc,EAAE,MAAMT,eAAAA,gBAAgB,OAAO,gBAAgB,MAAM,QAAQ,WAAW,SAAA;AAAA,EACtF,MAAM,EAAE,MAAMA,eAAAA,gBAAgB,OAAO,gBAAgB,MAAM,QAAQ,WAAW,SAAA;AAAA,EAC9E,SAAS;AAAA,IACP,MAAMU,aAAAA;AAAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,EAAA;AAAA,EAEb,MAAM;AAAA,IACJ,MAAMC,WAAAA;AAAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,EAAA;AAAA;AAAA,EAGb,aAAa,EAAE,MAAMC,MAAAA,OAAO,OAAO,yBAAyB,MAAM,QAAQ,WAAW,MAAA;AAAA,EACrF,OAAO,EAAE,MAAMC,OAAAA,QAAQ,OAAO,0BAA0B,MAAM,QAAQ,WAAW,MAAA;AAAA,EACjF,aAAa;AAAA,IACX,MAAMC,YAAAA;AAAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,EAAA;AAEf;AAGO,SAAS,SAAS,MAA2C;AAClE,SAAQ,QAAQ,WAAW,IAAI,KAAM;AACvC;;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { StaticIconComponent } from '../Icon.js';
|
|
2
|
+
import { TestOutcome } from './status.js';
|
|
3
|
+
export type { TestOutcome } from './status.js';
|
|
4
|
+
export type ResultMark = {
|
|
5
|
+
icon: StaticIconComponent;
|
|
6
|
+
label: string;
|
|
7
|
+
/** Text colour classes for light and dark themes. */
|
|
8
|
+
className: string;
|
|
9
|
+
spin?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare const TEST_OUTCOMES: Record<TestOutcome, ResultMark>;
|
|
12
|
+
export type LintSeverity = "error" | "warning" | "info";
|
|
13
|
+
/** An error-severity finding fails the verdict and a warning warns it, so they share those outcomes' marks. */
|
|
14
|
+
export declare const LINT_SEVERITIES: Record<LintSeverity, ResultMark>;
|
|
15
|
+
export type ToolKind = "test" | "lint" | "fixture" | "runner";
|
|
16
|
+
export type ToolMark = {
|
|
17
|
+
icon: StaticIconComponent;
|
|
18
|
+
label: string;
|
|
19
|
+
kind: ToolKind;
|
|
20
|
+
className: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Keyed by the identifiers gavel reports: testrunner/parsers Framework values
|
|
24
|
+
* and each linter's Name(). A tool without a mark of its own takes its
|
|
25
|
+
* language's (golangci-lint → Go, pyright → Python).
|
|
26
|
+
*/
|
|
27
|
+
export declare const TEST_TOOLS: Record<string, ToolMark>;
|
|
28
|
+
/** The tool's mark, or null for a tool the catalog doesn't know (render its name alone). */
|
|
29
|
+
export declare function toolMark(tool: string | undefined): ToolMark | null;
|
|
30
|
+
//# sourceMappingURL=marks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marks.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/marks.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AA+BnD,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE3D,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAOF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,CAsBzD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAExD,+GAA+G;AAC/G,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,CAI5D,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAqE/C,CAAC;AAEF,4FAA4F;AAC5F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAElE"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { STATUS_LABELS } from "./status.js";
|
|
2
|
+
import { UiInfo } from "../../icons/components/UiInfo.js";
|
|
3
|
+
import { UiWarningTriangle } from "../../icons/components/UiWarningTriangle.js";
|
|
4
|
+
import { UiCircleX } from "../../icons/components/UiCircleX.js";
|
|
5
|
+
import { UiLoader } from "../../icons/components/UiLoader.js";
|
|
6
|
+
import { UiCircleOutline } from "../../icons/components/UiCircleOutline.js";
|
|
7
|
+
import { UiSkipForward } from "../../icons/components/UiSkipForward.js";
|
|
8
|
+
import { UiPass } from "../../icons/components/UiPass.js";
|
|
9
|
+
import { UiTimer } from "../../icons/components/UiTimer.js";
|
|
10
|
+
import { UiProhibit } from "../../icons/components/UiProhibit.js";
|
|
11
|
+
import { UiLogoReact } from "../../icons/components/UiLogoReact.js";
|
|
12
|
+
import { UiCopy } from "../../icons/components/UiCopy.js";
|
|
13
|
+
import { UiKey } from "../../icons/components/UiKey.js";
|
|
14
|
+
import { UiLogoRuff } from "../../icons/components/UiLogoRuff.js";
|
|
15
|
+
import { UiLogoPython } from "../../icons/components/UiLogoPython.js";
|
|
16
|
+
import { UiLogoMarkdown } from "../../icons/components/UiLogoMarkdown.js";
|
|
17
|
+
import { UiLogoTypescript } from "../../icons/components/UiLogoTypescript.js";
|
|
18
|
+
import { UiLogoOxc } from "../../icons/components/UiLogoOxc.js";
|
|
19
|
+
import { UiLogoEslint } from "../../icons/components/UiLogoEslint.js";
|
|
20
|
+
import { UiLogoGo } from "../../icons/components/UiLogoGo.js";
|
|
21
|
+
import { UiSealCheck } from "../../icons/components/UiSealCheck.js";
|
|
22
|
+
import { UiDatabase } from "../../icons/components/UiDatabase.js";
|
|
23
|
+
import { UiSparkles } from "../../icons/components/UiSparkles.js";
|
|
24
|
+
import { UiListChecks } from "../../icons/components/UiListChecks.js";
|
|
25
|
+
import { UiBeaker } from "../../icons/components/UiBeaker.js";
|
|
26
|
+
import { UiTerminal } from "../../icons/components/UiTerminal.js";
|
|
27
|
+
import { UiLogoPlaywright } from "../../icons/components/UiLogoPlaywright.js";
|
|
28
|
+
import { UiLogoJest } from "../../icons/components/UiLogoJest.js";
|
|
29
|
+
import { UiLogoVitest } from "../../icons/components/UiLogoVitest.js";
|
|
30
|
+
const LABEL = Object.fromEntries(STATUS_LABELS.map((s) => [s.key, s.label]));
|
|
31
|
+
const RED = "text-red-600 dark:text-red-400";
|
|
32
|
+
const AMBER = "text-amber-600 dark:text-amber-400";
|
|
33
|
+
const TEST_OUTCOMES = {
|
|
34
|
+
failed: { icon: UiCircleX, label: LABEL.failed, className: RED },
|
|
35
|
+
errored: { icon: UiProhibit, label: "Could not run", className: RED },
|
|
36
|
+
timedout: { icon: UiTimer, label: LABEL.timedout, className: AMBER },
|
|
37
|
+
warned: { icon: UiWarningTriangle, label: LABEL.warned, className: AMBER },
|
|
38
|
+
passed: {
|
|
39
|
+
icon: UiPass,
|
|
40
|
+
label: LABEL.passed,
|
|
41
|
+
className: "text-emerald-600 dark:text-emerald-400"
|
|
42
|
+
},
|
|
43
|
+
skipped: { icon: UiSkipForward, label: LABEL.skipped, className: "text-slate-500" },
|
|
44
|
+
pending: {
|
|
45
|
+
icon: UiCircleOutline,
|
|
46
|
+
label: LABEL.pending,
|
|
47
|
+
className: "text-slate-400 dark:text-slate-500"
|
|
48
|
+
},
|
|
49
|
+
running: {
|
|
50
|
+
icon: UiLoader,
|
|
51
|
+
label: LABEL.running,
|
|
52
|
+
className: "text-blue-600 dark:text-blue-400",
|
|
53
|
+
spin: true
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const LINT_SEVERITIES = {
|
|
57
|
+
error: { ...TEST_OUTCOMES.failed, label: "Error" },
|
|
58
|
+
warning: { ...TEST_OUTCOMES.warned, label: "Warning" },
|
|
59
|
+
info: { icon: UiInfo, label: "Info", className: "text-sky-600 dark:text-sky-400" }
|
|
60
|
+
};
|
|
61
|
+
const GO = "text-[#00add8]";
|
|
62
|
+
const MARKDOWN = "text-foreground";
|
|
63
|
+
const MUTED = "text-muted-foreground";
|
|
64
|
+
const TEST_TOOLS = {
|
|
65
|
+
"go test": { icon: UiLogoGo, label: "go test", kind: "test", className: GO },
|
|
66
|
+
ginkgo: { icon: UiLogoGo, label: "Ginkgo", kind: "test", className: GO },
|
|
67
|
+
vitest: { icon: UiLogoVitest, label: "Vitest", kind: "test", className: "text-[#6e9f18]" },
|
|
68
|
+
jest: { icon: UiLogoJest, label: "Jest", kind: "test", className: "text-[#c21325] dark:text-[#e5576a]" },
|
|
69
|
+
playwright: {
|
|
70
|
+
icon: UiLogoPlaywright,
|
|
71
|
+
label: "Playwright",
|
|
72
|
+
kind: "test",
|
|
73
|
+
className: "text-[#2ead33]"
|
|
74
|
+
},
|
|
75
|
+
fixture: { icon: UiLogoMarkdown, label: "Markdown fixture", kind: "test", className: MARKDOWN },
|
|
76
|
+
task: { icon: UiTerminal, label: "Task", kind: "runner", className: MUTED },
|
|
77
|
+
// Fixture step types (gavel fixtures FixtureResult.Type) and the
|
|
78
|
+
// "checklist" node verifyReportTests synthesizes for acceptance criteria.
|
|
79
|
+
exec: { icon: UiTerminal, label: "Command", kind: "fixture", className: MUTED },
|
|
80
|
+
test: { icon: UiBeaker, label: "Test step", kind: "fixture", className: MUTED },
|
|
81
|
+
lint: { icon: UiListChecks, label: "Lint step", kind: "fixture", className: MUTED },
|
|
82
|
+
verify: {
|
|
83
|
+
icon: UiSparkles,
|
|
84
|
+
label: "AI review",
|
|
85
|
+
kind: "fixture",
|
|
86
|
+
className: "text-violet-600 dark:text-violet-400"
|
|
87
|
+
},
|
|
88
|
+
query: { icon: UiDatabase, label: "Query", kind: "fixture", className: MUTED },
|
|
89
|
+
criterion: { icon: UiSealCheck, label: "Acceptance criterion", kind: "fixture", className: MUTED },
|
|
90
|
+
checklist: { icon: UiSealCheck, label: "Acceptance criteria", kind: "fixture", className: MUTED },
|
|
91
|
+
"golangci-lint": { icon: UiLogoGo, label: "golangci-lint", kind: "lint", className: GO },
|
|
92
|
+
eslint: {
|
|
93
|
+
icon: UiLogoEslint,
|
|
94
|
+
label: "ESLint",
|
|
95
|
+
kind: "lint",
|
|
96
|
+
className: "text-[#4b32c3] dark:text-[#8080f2]"
|
|
97
|
+
},
|
|
98
|
+
oxlint: {
|
|
99
|
+
icon: UiLogoOxc,
|
|
100
|
+
label: "oxlint",
|
|
101
|
+
kind: "lint",
|
|
102
|
+
className: "text-[#0891b2] dark:text-[#00f7f1]"
|
|
103
|
+
},
|
|
104
|
+
tsc: {
|
|
105
|
+
icon: UiLogoTypescript,
|
|
106
|
+
label: "TypeScript compiler",
|
|
107
|
+
kind: "lint",
|
|
108
|
+
className: "text-[#3178c6]"
|
|
109
|
+
},
|
|
110
|
+
markdownlint: { icon: UiLogoMarkdown, label: "markdownlint", kind: "lint", className: MARKDOWN },
|
|
111
|
+
vale: { icon: UiLogoMarkdown, label: "Vale (prose)", kind: "lint", className: MARKDOWN },
|
|
112
|
+
pyright: {
|
|
113
|
+
icon: UiLogoPython,
|
|
114
|
+
label: "Pyright",
|
|
115
|
+
kind: "lint",
|
|
116
|
+
className: "text-[#3776ab] dark:text-[#ffd43b]"
|
|
117
|
+
},
|
|
118
|
+
ruff: {
|
|
119
|
+
icon: UiLogoRuff,
|
|
120
|
+
label: "Ruff",
|
|
121
|
+
kind: "lint",
|
|
122
|
+
className: "text-[#261230] dark:text-[#d7ff64]"
|
|
123
|
+
},
|
|
124
|
+
// A secret scanner's finding is about a credential, not a language.
|
|
125
|
+
betterleaks: { icon: UiKey, label: "betterleaks (secrets)", kind: "lint", className: MUTED },
|
|
126
|
+
jscpd: { icon: UiCopy, label: "jscpd (duplicate code)", kind: "lint", className: MUTED },
|
|
127
|
+
reactdoctor: {
|
|
128
|
+
icon: UiLogoReact,
|
|
129
|
+
label: "React Doctor",
|
|
130
|
+
kind: "lint",
|
|
131
|
+
className: "text-[#0e7490] dark:text-[#61dafb]"
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
function toolMark(tool) {
|
|
135
|
+
return tool && TEST_TOOLS[tool] || null;
|
|
136
|
+
}
|
|
137
|
+
export {
|
|
138
|
+
LINT_SEVERITIES,
|
|
139
|
+
TEST_OUTCOMES,
|
|
140
|
+
TEST_TOOLS,
|
|
141
|
+
toolMark
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=marks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marks.js","sources":["../../../src/data/test-runner/marks.ts"],"sourcesContent":["// The shared iconography for test and lint results: what happened (outcome),\n// how bad a finding is (lint severity), and what produced it (tool).\n//\n// Every outcome has its own outline glyph, so a result never reads by colour\n// alone.\n// Tool marks are bundled Simple Icons brand glyphs (offline, no runtime icon\n// names), coloured per theme here because one brand hex can't hold up on both\n// light and dark surfaces.\n\nimport type { StaticIconComponent } from \"../Icon\";\nimport {\n UiCircleOutline,\n UiCircleX,\n UiBeaker,\n UiCopy,\n UiDatabase,\n UiInfo,\n UiKey,\n UiListChecks,\n UiLoader,\n UiLogoEslint,\n UiLogoGo,\n UiLogoJest,\n UiLogoMarkdown,\n UiLogoOxc,\n UiLogoPlaywright,\n UiLogoPython,\n UiLogoReact,\n UiLogoRuff,\n UiLogoTypescript,\n UiLogoVitest,\n UiPass,\n UiProhibit,\n UiSealCheck,\n UiSkipForward,\n UiSparkles,\n UiTerminal,\n UiTimer,\n UiWarningTriangle,\n} from \"../../icons\";\nimport { STATUS_LABELS, type TestOutcome } from \"./status\";\n\nexport type { TestOutcome } from \"./status\";\n\nexport type ResultMark = {\n icon: StaticIconComponent;\n label: string;\n /** Text colour classes for light and dark themes. */\n className: string;\n spin?: boolean;\n};\n\nconst LABEL = Object.fromEntries(STATUS_LABELS.map((s) => [s.key, s.label]));\n\nconst RED = \"text-red-600 dark:text-red-400\";\nconst AMBER = \"text-amber-600 dark:text-amber-400\";\n\nexport const TEST_OUTCOMES: Record<TestOutcome, ResultMark> = {\n failed: { icon: UiCircleX, label: LABEL.failed!, className: RED },\n errored: { icon: UiProhibit, label: \"Could not run\", className: RED },\n timedout: { icon: UiTimer, label: LABEL.timedout!, className: AMBER },\n warned: { icon: UiWarningTriangle, label: LABEL.warned!, className: AMBER },\n passed: {\n icon: UiPass,\n label: LABEL.passed!,\n className: \"text-emerald-600 dark:text-emerald-400\",\n },\n skipped: { icon: UiSkipForward, label: LABEL.skipped!, className: \"text-slate-500\" },\n pending: {\n icon: UiCircleOutline,\n label: LABEL.pending!,\n className: \"text-slate-400 dark:text-slate-500\",\n },\n running: {\n icon: UiLoader,\n label: LABEL.running!,\n className: \"text-blue-600 dark:text-blue-400\",\n spin: true,\n },\n};\n\nexport type LintSeverity = \"error\" | \"warning\" | \"info\";\n\n/** An error-severity finding fails the verdict and a warning warns it, so they share those outcomes' marks. */\nexport const LINT_SEVERITIES: Record<LintSeverity, ResultMark> = {\n error: { ...TEST_OUTCOMES.failed, label: \"Error\" },\n warning: { ...TEST_OUTCOMES.warned, label: \"Warning\" },\n info: { icon: UiInfo, label: \"Info\", className: \"text-sky-600 dark:text-sky-400\" },\n};\n\nexport type ToolKind = \"test\" | \"lint\" | \"fixture\" | \"runner\";\n\nexport type ToolMark = {\n icon: StaticIconComponent;\n label: string;\n kind: ToolKind;\n className: string;\n};\n\nconst GO = \"text-[#00add8]\";\nconst MARKDOWN = \"text-foreground\";\nconst MUTED = \"text-muted-foreground\";\n\n/**\n * Keyed by the identifiers gavel reports: testrunner/parsers Framework values\n * and each linter's Name(). A tool without a mark of its own takes its\n * language's (golangci-lint → Go, pyright → Python).\n */\nexport const TEST_TOOLS: Record<string, ToolMark> = {\n \"go test\": { icon: UiLogoGo, label: \"go test\", kind: \"test\", className: GO },\n ginkgo: { icon: UiLogoGo, label: \"Ginkgo\", kind: \"test\", className: GO },\n vitest: { icon: UiLogoVitest, label: \"Vitest\", kind: \"test\", className: \"text-[#6e9f18]\" },\n jest: { icon: UiLogoJest, label: \"Jest\", kind: \"test\", className: \"text-[#c21325] dark:text-[#e5576a]\" },\n playwright: {\n icon: UiLogoPlaywright,\n label: \"Playwright\",\n kind: \"test\",\n className: \"text-[#2ead33]\",\n },\n fixture: { icon: UiLogoMarkdown, label: \"Markdown fixture\", kind: \"test\", className: MARKDOWN },\n task: { icon: UiTerminal, label: \"Task\", kind: \"runner\", className: MUTED },\n // Fixture step types (gavel fixtures FixtureResult.Type) and the\n // \"checklist\" node verifyReportTests synthesizes for acceptance criteria.\n exec: { icon: UiTerminal, label: \"Command\", kind: \"fixture\", className: MUTED },\n test: { icon: UiBeaker, label: \"Test step\", kind: \"fixture\", className: MUTED },\n lint: { icon: UiListChecks, label: \"Lint step\", kind: \"fixture\", className: MUTED },\n verify: {\n icon: UiSparkles,\n label: \"AI review\",\n kind: \"fixture\",\n className: \"text-violet-600 dark:text-violet-400\",\n },\n query: { icon: UiDatabase, label: \"Query\", kind: \"fixture\", className: MUTED },\n criterion: { icon: UiSealCheck, label: \"Acceptance criterion\", kind: \"fixture\", className: MUTED },\n checklist: { icon: UiSealCheck, label: \"Acceptance criteria\", kind: \"fixture\", className: MUTED },\n \"golangci-lint\": { icon: UiLogoGo, label: \"golangci-lint\", kind: \"lint\", className: GO },\n eslint: {\n icon: UiLogoEslint,\n label: \"ESLint\",\n kind: \"lint\",\n className: \"text-[#4b32c3] dark:text-[#8080f2]\",\n },\n oxlint: {\n icon: UiLogoOxc,\n label: \"oxlint\",\n kind: \"lint\",\n className: \"text-[#0891b2] dark:text-[#00f7f1]\",\n },\n tsc: {\n icon: UiLogoTypescript,\n label: \"TypeScript compiler\",\n kind: \"lint\",\n className: \"text-[#3178c6]\",\n },\n markdownlint: { icon: UiLogoMarkdown, label: \"markdownlint\", kind: \"lint\", className: MARKDOWN },\n vale: { icon: UiLogoMarkdown, label: \"Vale (prose)\", kind: \"lint\", className: MARKDOWN },\n pyright: {\n icon: UiLogoPython,\n label: \"Pyright\",\n kind: \"lint\",\n className: \"text-[#3776ab] dark:text-[#ffd43b]\",\n },\n ruff: {\n icon: UiLogoRuff,\n label: \"Ruff\",\n kind: \"lint\",\n className: \"text-[#261230] dark:text-[#d7ff64]\",\n },\n // A secret scanner's finding is about a credential, not a language.\n betterleaks: { icon: UiKey, label: \"betterleaks (secrets)\", kind: \"lint\", className: MUTED },\n jscpd: { icon: UiCopy, label: \"jscpd (duplicate code)\", kind: \"lint\", className: MUTED },\n reactdoctor: {\n icon: UiLogoReact,\n label: \"React Doctor\",\n kind: \"lint\",\n className: \"text-[#0e7490] dark:text-[#61dafb]\",\n },\n};\n\n/** The tool's mark, or null for a tool the catalog doesn't know (render its name alone). */\nexport function toolMark(tool: string | undefined): ToolMark | null {\n return (tool && TEST_TOOLS[tool]) || null;\n}\n\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const filterState = require("./filterState.cjs");
|
|
4
|
-
const UiHourglass = require("../../icons/components/UiHourglass.cjs");
|
|
5
|
-
const UiLoader = require("../../icons/components/UiLoader.cjs");
|
|
6
|
-
const UiPause = require("../../icons/components/UiPause.cjs");
|
|
7
|
-
const UiError = require("../../icons/components/UiError.cjs");
|
|
8
|
-
const UiWarningTriangle = require("../../icons/components/UiWarningTriangle.cjs");
|
|
9
|
-
const UiPass = require("../../icons/components/UiPass.cjs");
|
|
10
|
-
const UiClass = require("../../icons/components/UiClass.cjs");
|
|
11
4
|
const emptyCounts = () => ({
|
|
12
5
|
total: 0,
|
|
13
6
|
passed: 0,
|
|
@@ -113,44 +106,34 @@ function testStatus(t) {
|
|
|
113
106
|
if (t.passed) return "passed";
|
|
114
107
|
return null;
|
|
115
108
|
}
|
|
116
|
-
function
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (
|
|
120
|
-
if (t.
|
|
121
|
-
|
|
122
|
-
if (t
|
|
123
|
-
if (
|
|
124
|
-
if (
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if (s.running > 0) return UiLoader.UiLoader;
|
|
130
|
-
if (s.pending > 0) return UiPause.UiPause;
|
|
131
|
-
return UiPass.UiPass;
|
|
132
|
-
}
|
|
133
|
-
return UiClass.UiClass;
|
|
109
|
+
function outcomeFor(t) {
|
|
110
|
+
var _a;
|
|
111
|
+
const own = testStatus(t);
|
|
112
|
+
if (own) return own;
|
|
113
|
+
if (!((_a = t.children) == null ? void 0 : _a.length)) return null;
|
|
114
|
+
const s = sum(t);
|
|
115
|
+
if (hasTimedOutDescendant(t)) return "timedout";
|
|
116
|
+
if (s.failed > 0) return "failed";
|
|
117
|
+
if (s.warned > 0) return "warned";
|
|
118
|
+
if (s.running > 0) return "running";
|
|
119
|
+
if (s.pending > 0) return "pending";
|
|
120
|
+
if (s.total > 0 && s.skipped === s.total) return "skipped";
|
|
121
|
+
return "passed";
|
|
134
122
|
}
|
|
135
123
|
function statusToneFor(t) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
if (s.pending > 0) return "neutral";
|
|
150
|
-
return "success";
|
|
151
|
-
}
|
|
152
|
-
return "neutral";
|
|
153
|
-
}
|
|
124
|
+
const outcome = outcomeFor(t);
|
|
125
|
+
return outcome ? OUTCOME_TONE[outcome] : "neutral";
|
|
126
|
+
}
|
|
127
|
+
const OUTCOME_TONE = {
|
|
128
|
+
failed: "danger",
|
|
129
|
+
errored: "danger",
|
|
130
|
+
timedout: "warning",
|
|
131
|
+
warned: "warning",
|
|
132
|
+
skipped: "warning",
|
|
133
|
+
running: "info",
|
|
134
|
+
pending: "neutral",
|
|
135
|
+
passed: "success"
|
|
136
|
+
};
|
|
154
137
|
function formatTestDuration(ns) {
|
|
155
138
|
if (ns <= 0) return "";
|
|
156
139
|
const ms = ns / 1e6;
|
|
@@ -241,7 +224,7 @@ exports.formatTestDuration = formatTestDuration;
|
|
|
241
224
|
exports.hasFailed = hasFailed;
|
|
242
225
|
exports.hasPending = hasPending;
|
|
243
226
|
exports.humanizeName = humanizeName;
|
|
244
|
-
exports.
|
|
227
|
+
exports.outcomeFor = outcomeFor;
|
|
245
228
|
exports.statusToneFor = statusToneFor;
|
|
246
229
|
exports.sum = sum;
|
|
247
230
|
exports.sumNonTaskTests = sumNonTaskTests;
|