@flanksource/clicky-ui 0.3.48 → 0.3.50
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/dist/connections/ConnectionsPage.cjs +219 -0
- package/dist/connections/ConnectionsPage.cjs.map +1 -0
- package/dist/connections/ConnectionsPage.d.ts +23 -0
- package/dist/connections/ConnectionsPage.d.ts.map +1 -0
- package/dist/connections/ConnectionsPage.js +219 -0
- package/dist/connections/ConnectionsPage.js.map +1 -0
- package/dist/connections/connectionActionStatus.cjs +43 -0
- package/dist/connections/connectionActionStatus.cjs.map +1 -0
- package/dist/connections/connectionActionStatus.d.ts +5 -0
- package/dist/connections/connectionActionStatus.d.ts.map +1 -0
- package/dist/connections/connectionActionStatus.js +43 -0
- package/dist/connections/connectionActionStatus.js.map +1 -0
- package/dist/connections/connectionActionTypes.cjs +24 -0
- package/dist/connections/connectionActionTypes.cjs.map +1 -0
- package/dist/connections/connectionActionTypes.d.ts +36 -0
- package/dist/connections/connectionActionTypes.d.ts.map +1 -0
- package/dist/connections/connectionActionTypes.js +24 -0
- package/dist/connections/connectionActionTypes.js.map +1 -0
- package/dist/connections/connectionActions.cjs +11 -0
- package/dist/connections/connectionActions.cjs.map +1 -0
- package/dist/connections/connectionActions.d.ts +15 -0
- package/dist/connections/connectionActions.d.ts.map +1 -0
- package/dist/connections/connectionActions.js +11 -0
- package/dist/connections/connectionActions.js.map +1 -0
- package/dist/connections/connectionDashboard.cjs +185 -0
- package/dist/connections/connectionDashboard.cjs.map +1 -0
- package/dist/connections/connectionDashboard.d.ts +25 -0
- package/dist/connections/connectionDashboard.d.ts.map +1 -0
- package/dist/connections/connectionDashboard.js +185 -0
- package/dist/connections/connectionDashboard.js.map +1 -0
- package/dist/connections/connectionDashboardModel.cjs +43 -0
- package/dist/connections/connectionDashboardModel.cjs.map +1 -0
- package/dist/connections/connectionDashboardModel.d.ts +75 -0
- package/dist/connections/connectionDashboardModel.d.ts.map +1 -0
- package/dist/connections/connectionDashboardModel.js +43 -0
- package/dist/connections/connectionDashboardModel.js.map +1 -0
- package/dist/connections/connectionDashboardRenderer.cjs +21 -0
- package/dist/connections/connectionDashboardRenderer.cjs.map +1 -0
- package/dist/connections/connectionDashboardRenderer.d.ts +15 -0
- package/dist/connections/connectionDashboardRenderer.d.ts.map +1 -0
- package/dist/connections/connectionDashboardRenderer.js +21 -0
- package/dist/connections/connectionDashboardRenderer.js.map +1 -0
- package/dist/connections/connectionDashboardRow.cjs +169 -0
- package/dist/connections/connectionDashboardRow.cjs.map +1 -0
- package/dist/connections/connectionDashboardRow.d.ts +12 -0
- package/dist/connections/connectionDashboardRow.d.ts.map +1 -0
- package/dist/connections/connectionDashboardRow.js +169 -0
- package/dist/connections/connectionDashboardRow.js.map +1 -0
- package/dist/connections/connectionErrorView.cjs +8 -0
- package/dist/connections/connectionErrorView.cjs.map +1 -0
- package/dist/connections/connectionErrorView.d.ts +4 -0
- package/dist/connections/connectionErrorView.d.ts.map +1 -0
- package/dist/connections/connectionErrorView.js +8 -0
- package/dist/connections/connectionErrorView.js.map +1 -0
- package/dist/connections/connectionHealth.cjs +82 -0
- package/dist/connections/connectionHealth.cjs.map +1 -0
- package/dist/connections/connectionHealth.d.ts +33 -0
- package/dist/connections/connectionHealth.d.ts.map +1 -0
- package/dist/connections/connectionHealth.js +82 -0
- package/dist/connections/connectionHealth.js.map +1 -0
- package/dist/connections/connectionLogging.cjs +29 -0
- package/dist/connections/connectionLogging.cjs.map +1 -0
- package/dist/connections/connectionLogging.d.ts +11 -0
- package/dist/connections/connectionLogging.d.ts.map +1 -0
- package/dist/connections/connectionLogging.js +29 -0
- package/dist/connections/connectionLogging.js.map +1 -0
- package/dist/connections/connectionLoggingField.cjs +37 -0
- package/dist/connections/connectionLoggingField.cjs.map +1 -0
- package/dist/connections/connectionLoggingField.d.ts +12 -0
- package/dist/connections/connectionLoggingField.d.ts.map +1 -0
- package/dist/connections/connectionLoggingField.js +37 -0
- package/dist/connections/connectionLoggingField.js.map +1 -0
- package/dist/connections/connectionLoggingModel.cjs +16 -0
- package/dist/connections/connectionLoggingModel.cjs.map +1 -0
- package/dist/connections/connectionLoggingModel.d.ts +6 -0
- package/dist/connections/connectionLoggingModel.d.ts.map +1 -0
- package/dist/connections/connectionLoggingModel.js +16 -0
- package/dist/connections/connectionLoggingModel.js.map +1 -0
- package/dist/connections/connectionResolveView.cjs +24 -0
- package/dist/connections/connectionResolveView.cjs.map +1 -0
- package/dist/connections/connectionResolveView.d.ts +5 -0
- package/dist/connections/connectionResolveView.d.ts.map +1 -0
- package/dist/connections/connectionResolveView.js +24 -0
- package/dist/connections/connectionResolveView.js.map +1 -0
- package/dist/connections/connectionTestButton.cjs +58 -0
- package/dist/connections/connectionTestButton.cjs.map +1 -0
- package/dist/connections/connectionTestButton.d.ts +6 -0
- package/dist/connections/connectionTestButton.d.ts.map +1 -0
- package/dist/connections/connectionTestButton.js +58 -0
- package/dist/connections/connectionTestButton.js.map +1 -0
- package/dist/connections/connectionTestView.cjs +12 -0
- package/dist/connections/connectionTestView.cjs.map +1 -0
- package/dist/connections/connectionTestView.d.ts +5 -0
- package/dist/connections/connectionTestView.d.ts.map +1 -0
- package/dist/connections/connectionTestView.js +12 -0
- package/dist/connections/connectionTestView.js.map +1 -0
- package/dist/connections/connectionsPageModel.cjs +33 -0
- package/dist/connections/connectionsPageModel.cjs.map +1 -0
- package/dist/connections/connectionsPageModel.d.ts +24 -0
- package/dist/connections/connectionsPageModel.d.ts.map +1 -0
- package/dist/connections/connectionsPageModel.js +33 -0
- package/dist/connections/connectionsPageModel.js.map +1 -0
- package/dist/connections/iconProvider.cjs +20 -0
- package/dist/connections/iconProvider.cjs.map +1 -0
- package/dist/connections/iconProvider.d.ts +7 -0
- package/dist/connections/iconProvider.d.ts.map +1 -0
- package/dist/connections/iconProvider.js +20 -0
- package/dist/connections/iconProvider.js.map +1 -0
- package/dist/connections.cjs +45 -0
- package/dist/connections.cjs.map +1 -0
- package/dist/connections.d.ts +34 -0
- package/dist/connections.d.ts.map +1 -0
- package/dist/connections.js +45 -0
- package/dist/connections.js.map +1 -0
- package/dist/data/DataTable.cjs +18 -8
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +4 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +18 -8
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/TaskManager.cjs +183 -159
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts +3 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +185 -161
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskManagerButton.cjs +1 -0
- package/dist/data/TaskManagerButton.cjs.map +1 -1
- package/dist/data/TaskManagerButton.js +1 -0
- package/dist/data/TaskManagerButton.js.map +1 -1
- package/dist/data/TaskProgress.cjs +13 -7
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +3 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +13 -7
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +52 -295
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +47 -290
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/MetricTile.cjs +44 -0
- package/dist/data/diagnostics/MetricTile.cjs.map +1 -0
- package/dist/data/diagnostics/MetricTile.d.ts +13 -0
- package/dist/data/diagnostics/MetricTile.d.ts.map +1 -0
- package/dist/data/diagnostics/MetricTile.js +44 -0
- package/dist/data/diagnostics/MetricTile.js.map +1 -0
- package/dist/data/diagnostics/StackDumpView.cjs +227 -0
- package/dist/data/diagnostics/StackDumpView.cjs.map +1 -0
- package/dist/data/diagnostics/StackDumpView.d.ts +53 -0
- package/dist/data/diagnostics/StackDumpView.d.ts.map +1 -0
- package/dist/data/diagnostics/StackDumpView.js +227 -0
- package/dist/data/diagnostics/StackDumpView.js.map +1 -0
- package/dist/data/diagnostics/fixtures.d.ts +1 -0
- package/dist/data/diagnostics/fixtures.d.ts.map +1 -1
- package/dist/data/diagnostics/metric-tone.cjs +18 -0
- package/dist/data/diagnostics/metric-tone.cjs.map +1 -0
- package/dist/data/diagnostics/metric-tone.d.ts +6 -0
- package/dist/data/diagnostics/metric-tone.d.ts.map +1 -0
- package/dist/data/diagnostics/metric-tone.js +18 -0
- package/dist/data/diagnostics/metric-tone.js.map +1 -0
- package/dist/data/diagnostics/stacktrace.cjs +44 -0
- package/dist/data/diagnostics/stacktrace.cjs.map +1 -1
- package/dist/data/diagnostics/stacktrace.d.ts +7 -0
- package/dist/data/diagnostics/stacktrace.d.ts.map +1 -1
- package/dist/data/diagnostics/stacktrace.js +44 -0
- package/dist/data/diagnostics/stacktrace.js.map +1 -1
- package/dist/data/diagnostics/types.d.ts +2 -8
- package/dist/data/diagnostics/types.d.ts.map +1 -1
- package/dist/data/lint/LintDetail.cjs +339 -0
- package/dist/data/lint/LintDetail.cjs.map +1 -0
- package/dist/data/lint/LintDetail.d.ts +17 -0
- package/dist/data/lint/LintDetail.d.ts.map +1 -0
- package/dist/data/lint/LintDetail.js +339 -0
- package/dist/data/lint/LintDetail.js.map +1 -0
- package/dist/data/lint/LintFilterBar.cjs +103 -0
- package/dist/data/lint/LintFilterBar.cjs.map +1 -0
- package/dist/data/lint/LintFilterBar.d.ts +16 -0
- package/dist/data/lint/LintFilterBar.d.ts.map +1 -0
- package/dist/data/lint/LintFilterBar.js +103 -0
- package/dist/data/lint/LintFilterBar.js.map +1 -0
- package/dist/data/lint/LintResults.cjs +144 -0
- package/dist/data/lint/LintResults.cjs.map +1 -0
- package/dist/data/lint/LintResults.d.ts +39 -0
- package/dist/data/lint/LintResults.d.ts.map +1 -0
- package/dist/data/lint/LintResults.fixtures.d.ts +10 -0
- package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -0
- package/dist/data/lint/LintResults.js +144 -0
- package/dist/data/lint/LintResults.js.map +1 -0
- package/dist/data/lint/LintTreeNode.cjs +66 -0
- package/dist/data/lint/LintTreeNode.cjs.map +1 -0
- package/dist/data/lint/LintTreeNode.d.ts +7 -0
- package/dist/data/lint/LintTreeNode.d.ts.map +1 -0
- package/dist/data/lint/LintTreeNode.js +66 -0
- package/dist/data/lint/LintTreeNode.js.map +1 -0
- package/dist/data/lint/actions.cjs +195 -0
- package/dist/data/lint/actions.cjs.map +1 -0
- package/dist/data/lint/actions.d.ts +29 -0
- package/dist/data/lint/actions.d.ts.map +1 -0
- package/dist/data/lint/actions.js +195 -0
- package/dist/data/lint/actions.js.map +1 -0
- package/dist/data/lint/grouping-options.cjs +14 -0
- package/dist/data/lint/grouping-options.cjs.map +1 -0
- package/dist/data/lint/grouping-options.d.ts +9 -0
- package/dist/data/lint/grouping-options.d.ts.map +1 -0
- package/dist/data/lint/grouping-options.js +14 -0
- package/dist/data/lint/grouping-options.js.map +1 -0
- package/dist/data/lint/grouping.cjs +450 -0
- package/dist/data/lint/grouping.cjs.map +1 -0
- package/dist/data/lint/grouping.d.ts +10 -0
- package/dist/data/lint/grouping.d.ts.map +1 -0
- package/dist/data/lint/grouping.js +450 -0
- package/dist/data/lint/grouping.js.map +1 -0
- package/dist/data/lint/index.d.ts +10 -0
- package/dist/data/lint/index.d.ts.map +1 -0
- package/dist/data/lint/paths.cjs +35 -0
- package/dist/data/lint/paths.cjs.map +1 -0
- package/dist/data/lint/paths.d.ts +13 -0
- package/dist/data/lint/paths.d.ts.map +1 -0
- package/dist/data/lint/paths.js +35 -0
- package/dist/data/lint/paths.js.map +1 -0
- package/dist/data/lint/stats.cjs +76 -0
- package/dist/data/lint/stats.cjs.map +1 -0
- package/dist/data/lint/stats.d.ts +19 -0
- package/dist/data/lint/stats.d.ts.map +1 -0
- package/dist/data/lint/stats.js +76 -0
- package/dist/data/lint/stats.js.map +1 -0
- package/dist/data/lint/types.cjs +16 -0
- package/dist/data/lint/types.cjs.map +1 -0
- package/dist/data/lint/types.d.ts +93 -0
- package/dist/data/lint/types.d.ts.map +1 -0
- package/dist/data/lint/types.js +16 -0
- package/dist/data/lint/types.js.map +1 -0
- package/dist/data/test-runner/TestAttemptDetail.cjs +113 -0
- package/dist/data/test-runner/TestAttemptDetail.cjs.map +1 -0
- package/dist/data/test-runner/TestAttemptDetail.d.ts +19 -0
- package/dist/data/test-runner/TestAttemptDetail.d.ts.map +1 -0
- package/dist/data/test-runner/TestAttemptDetail.js +113 -0
- package/dist/data/test-runner/TestAttemptDetail.js.map +1 -0
- package/dist/data/test-runner/TestAttempts.cjs +36 -0
- package/dist/data/test-runner/TestAttempts.cjs.map +1 -0
- package/dist/data/test-runner/TestAttempts.d.ts +5 -0
- package/dist/data/test-runner/TestAttempts.d.ts.map +1 -0
- package/dist/data/test-runner/TestAttempts.js +36 -0
- package/dist/data/test-runner/TestAttempts.js.map +1 -0
- package/dist/data/test-runner/TestDetailPanel.cjs +13 -3
- 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 +14 -4
- package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.cjs +9 -29
- package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.d.ts +6 -6
- package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.js +9 -29
- package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
- package/dist/data/test-runner/TestRunSummary.cjs +33 -0
- 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 +34 -1
- package/dist/data/test-runner/TestRunSummary.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +3 -0
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +8 -1
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +3 -0
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/test-runner/TestTreeNode.cjs +3 -1
- 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 +3 -1
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +9 -1
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +5 -0
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +9 -1
- package/dist/data/test-runner/adapter.js.map +1 -1
- package/dist/data/test-runner/attempts.cjs +62 -0
- package/dist/data/test-runner/attempts.cjs.map +1 -0
- package/dist/data/test-runner/attempts.d.ts +13 -0
- package/dist/data/test-runner/attempts.d.ts.map +1 -0
- package/dist/data/test-runner/attempts.js +62 -0
- package/dist/data/test-runner/attempts.js.map +1 -0
- package/dist/data/test-runner/context.cjs.map +1 -1
- package/dist/data/test-runner/context.d.ts +6 -0
- package/dist/data/test-runner/context.d.ts.map +1 -1
- package/dist/data/test-runner/context.js.map +1 -1
- package/dist/data/test-runner/index.d.ts +5 -1
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +2 -0
- package/dist/data/test-runner/marks.cjs.map +1 -1
- package/dist/data/test-runner/marks.d.ts.map +1 -1
- package/dist/data/test-runner/marks.js +2 -0
- package/dist/data/test-runner/marks.js.map +1 -1
- package/dist/data/test-runner/process-metrics.cjs +15 -0
- package/dist/data/test-runner/process-metrics.cjs.map +1 -0
- package/dist/data/test-runner/process-metrics.d.ts +22 -0
- package/dist/data/test-runner/process-metrics.d.ts.map +1 -0
- package/dist/data/test-runner/process-metrics.js +15 -0
- package/dist/data/test-runner/process-metrics.js.map +1 -0
- package/dist/data/test-runner/status.cjs +11 -3
- package/dist/data/test-runner/status.cjs.map +1 -1
- package/dist/data/test-runner/status.d.ts +3 -1
- package/dist/data/test-runner/status.d.ts.map +1 -1
- package/dist/data/test-runner/status.js +11 -3
- package/dist/data/test-runner/status.js.map +1 -1
- package/dist/data/test-runner/types.d.ts +14 -0
- package/dist/data/test-runner/types.d.ts.map +1 -1
- package/dist/data/traces/GoProfileView.cjs +176 -0
- package/dist/data/traces/GoProfileView.cjs.map +1 -0
- package/dist/data/traces/GoProfileView.d.ts +30 -0
- package/dist/data/traces/GoProfileView.d.ts.map +1 -0
- package/dist/data/traces/GoProfileView.js +176 -0
- package/dist/data/traces/GoProfileView.js.map +1 -0
- package/dist/data/traces/ProcessFacetTable.cjs +79 -0
- package/dist/data/traces/ProcessFacetTable.cjs.map +1 -0
- package/dist/data/traces/ProcessFacetTable.d.ts +21 -0
- package/dist/data/traces/ProcessFacetTable.d.ts.map +1 -0
- package/dist/data/traces/ProcessFacetTable.js +79 -0
- package/dist/data/traces/ProcessFacetTable.js.map +1 -0
- package/dist/data/traces/ProcessRecordViews.cjs +41 -0
- package/dist/data/traces/ProcessRecordViews.cjs.map +1 -0
- package/dist/data/traces/ProcessRecordViews.d.ts +16 -0
- package/dist/data/traces/ProcessRecordViews.d.ts.map +1 -0
- package/dist/data/traces/ProcessRecordViews.js +41 -0
- package/dist/data/traces/ProcessRecordViews.js.map +1 -0
- package/dist/data/traces/ProcessTraceDetail.cjs +316 -0
- package/dist/data/traces/ProcessTraceDetail.cjs.map +1 -0
- package/dist/data/traces/ProcessTraceDetail.d.ts +39 -0
- package/dist/data/traces/ProcessTraceDetail.d.ts.map +1 -0
- package/dist/data/traces/ProcessTraceDetail.js +316 -0
- package/dist/data/traces/ProcessTraceDetail.js.map +1 -0
- package/dist/data/traces/ProcessTraceTree.cjs +135 -0
- package/dist/data/traces/ProcessTraceTree.cjs.map +1 -0
- package/dist/data/traces/ProcessTraceTree.d.ts +41 -0
- package/dist/data/traces/ProcessTraceTree.d.ts.map +1 -0
- package/dist/data/traces/ProcessTraceTree.js +135 -0
- package/dist/data/traces/ProcessTraceTree.js.map +1 -0
- package/dist/data/traces/Sparkline.cjs +45 -0
- package/dist/data/traces/Sparkline.cjs.map +1 -0
- package/dist/data/traces/Sparkline.d.ts +29 -0
- package/dist/data/traces/Sparkline.d.ts.map +1 -0
- package/dist/data/traces/Sparkline.js +45 -0
- package/dist/data/traces/Sparkline.js.map +1 -0
- package/dist/data/traces/SqlTraceTable.cjs +104 -0
- package/dist/data/traces/SqlTraceTable.cjs.map +1 -0
- package/dist/data/traces/SqlTraceTable.d.ts +19 -0
- package/dist/data/traces/SqlTraceTable.d.ts.map +1 -0
- package/dist/data/traces/SqlTraceTable.js +104 -0
- package/dist/data/traces/SqlTraceTable.js.map +1 -0
- package/dist/data/traces/TerminalCastPlayer.cjs +162 -0
- package/dist/data/traces/TerminalCastPlayer.cjs.map +1 -0
- package/dist/data/traces/TerminalCastPlayer.js +162 -0
- package/dist/data/traces/TerminalCastPlayer.js.map +1 -0
- package/dist/data/traces/TraceHarView.cjs +15 -0
- package/dist/data/traces/TraceHarView.cjs.map +1 -0
- package/dist/data/traces/TraceHarView.js +15 -0
- package/dist/data/traces/TraceHarView.js.map +1 -0
- package/dist/data/traces/TraceView.cjs +63 -0
- package/dist/data/traces/TraceView.cjs.map +1 -0
- package/dist/data/traces/TraceView.d.ts +20 -0
- package/dist/data/traces/TraceView.d.ts.map +1 -0
- package/dist/data/traces/TraceView.js +63 -0
- package/dist/data/traces/TraceView.js.map +1 -0
- package/dist/data/traces/TraceWindowList.cjs +117 -0
- package/dist/data/traces/TraceWindowList.cjs.map +1 -0
- package/dist/data/traces/TraceWindowList.d.ts +48 -0
- package/dist/data/traces/TraceWindowList.d.ts.map +1 -0
- package/dist/data/traces/TraceWindowList.js +117 -0
- package/dist/data/traces/TraceWindowList.js.map +1 -0
- package/dist/data/traces/cast.cjs +81 -0
- package/dist/data/traces/cast.cjs.map +1 -0
- package/dist/data/traces/cast.js +81 -0
- package/dist/data/traces/cast.js.map +1 -0
- package/dist/data/traces/fixtures.d.ts +25 -1
- package/dist/data/traces/fixtures.d.ts.map +1 -1
- package/dist/data/traces/har-adapter.cjs +83 -0
- package/dist/data/traces/har-adapter.cjs.map +1 -0
- package/dist/data/traces/har-adapter.js +83 -0
- package/dist/data/traces/har-adapter.js.map +1 -0
- package/dist/data/traces/index.d.ts +19 -0
- package/dist/data/traces/index.d.ts.map +1 -0
- package/dist/data/traces/process-facets.cjs +48 -0
- package/dist/data/traces/process-facets.cjs.map +1 -0
- package/dist/data/traces/process-facets.d.ts +38 -0
- package/dist/data/traces/process-facets.d.ts.map +1 -0
- package/dist/data/traces/process-facets.js +48 -0
- package/dist/data/traces/process-facets.js.map +1 -0
- package/dist/data/traces/process-tree.cjs +85 -0
- package/dist/data/traces/process-tree.cjs.map +1 -0
- package/dist/data/traces/process-tree.d.ts +40 -0
- package/dist/data/traces/process-tree.d.ts.map +1 -0
- package/dist/data/traces/process-tree.js +85 -0
- package/dist/data/traces/process-tree.js.map +1 -0
- package/dist/data/traces/profile-aggregate.cjs +78 -0
- package/dist/data/traces/profile-aggregate.cjs.map +1 -0
- package/dist/data/traces/profile-aggregate.d.ts +41 -0
- package/dist/data/traces/profile-aggregate.d.ts.map +1 -0
- package/dist/data/traces/profile-aggregate.js +78 -0
- package/dist/data/traces/profile-aggregate.js.map +1 -0
- package/dist/data/traces/sql-trace.cjs +39 -0
- package/dist/data/traces/sql-trace.cjs.map +1 -0
- package/dist/data/traces/sql-trace.d.ts +31 -0
- package/dist/data/traces/sql-trace.d.ts.map +1 -0
- package/dist/data/traces/sql-trace.js +39 -0
- package/dist/data/traces/sql-trace.js.map +1 -0
- package/dist/data/traces/stack-checkpoints.cjs +22 -0
- package/dist/data/traces/stack-checkpoints.cjs.map +1 -0
- package/dist/data/traces/stack-checkpoints.d.ts +18 -0
- package/dist/data/traces/stack-checkpoints.d.ts.map +1 -0
- package/dist/data/traces/stack-checkpoints.js +22 -0
- package/dist/data/traces/stack-checkpoints.js.map +1 -0
- package/dist/data/traces/terminal-screen.cjs +270 -0
- package/dist/data/traces/terminal-screen.cjs.map +1 -0
- package/dist/data/traces/terminal-screen.js +270 -0
- package/dist/data/traces/terminal-screen.js.map +1 -0
- package/dist/data/traces/terminal-timeline.cjs +48 -0
- package/dist/data/traces/terminal-timeline.cjs.map +1 -0
- package/dist/data/traces/terminal-timeline.js +48 -0
- package/dist/data/traces/terminal-timeline.js.map +1 -0
- package/dist/data/traces/types.d.ts +121 -8
- package/dist/data/traces/types.d.ts.map +1 -1
- package/dist/data/verification/adapters.cjs +1 -0
- 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 +1 -0
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.cjs.map +1 -1
- package/dist/data/version-info.js +3 -3
- package/dist/data/version-info.js.map +1 -1
- package/dist/data.cjs +105 -5
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +5 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +101 -1
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +107 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +101 -1
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../lib/utils.js";
|
|
3
|
+
import { FilterPill } from "../FilterPill.js";
|
|
4
|
+
import { LINT_GROUPING_OPTIONS } from "./grouping-options.js";
|
|
5
|
+
import { cycleFilterState } from "../test-runner/filterState.js";
|
|
6
|
+
import { LINT_SEVERITIES, toolMark } from "../test-runner/marks.js";
|
|
7
|
+
import { LintSeverityIcon, ToolIcon } from "../test-runner/MarkIcons.js";
|
|
8
|
+
import { formatCount } from "../test-runner/status.js";
|
|
9
|
+
import { countLintBySeverity, countLintByLinter, collectLintLinters } from "./stats.js";
|
|
10
|
+
const SEVERITY_ORDER = ["error", "warning", "info"];
|
|
11
|
+
const SEVERITY_BADGE = {
|
|
12
|
+
error: "bg-red-600",
|
|
13
|
+
warning: "bg-amber-600",
|
|
14
|
+
info: "bg-sky-600"
|
|
15
|
+
};
|
|
16
|
+
function triStateTitle(label, mode) {
|
|
17
|
+
if (mode === "include") return `${label}: included. Click to exclude`;
|
|
18
|
+
if (mode === "exclude") return `${label}: excluded. Click to clear`;
|
|
19
|
+
return `${label}: neutral. Click to include`;
|
|
20
|
+
}
|
|
21
|
+
function LintFilterBar({
|
|
22
|
+
results,
|
|
23
|
+
grouping,
|
|
24
|
+
onGroupingChange,
|
|
25
|
+
filters,
|
|
26
|
+
onFiltersChange,
|
|
27
|
+
className
|
|
28
|
+
}) {
|
|
29
|
+
const severityCounts = countLintBySeverity(results, filters.linter);
|
|
30
|
+
const linterCounts = countLintByLinter(results, filters.severity);
|
|
31
|
+
const linters = collectLintLinters(results);
|
|
32
|
+
const hasActive = filters.severity.size > 0 || filters.linter.size > 0;
|
|
33
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-wrap items-center gap-1.5", className), "data-lint-filter-bar": "", children: [
|
|
34
|
+
/* @__PURE__ */ jsx("div", { role: "group", "aria-label": "Group by", className: "flex flex-wrap items-center gap-1.5", children: LINT_GROUPING_OPTIONS.map((opt) => /* @__PURE__ */ jsx(
|
|
35
|
+
FilterPill,
|
|
36
|
+
{
|
|
37
|
+
mode: opt.key === grouping ? "active" : "neutral",
|
|
38
|
+
label: opt.label,
|
|
39
|
+
icon: opt.icon,
|
|
40
|
+
title: `Group by ${opt.label}`,
|
|
41
|
+
onClick: () => onGroupingChange(opt.key)
|
|
42
|
+
},
|
|
43
|
+
opt.key
|
|
44
|
+
)) }),
|
|
45
|
+
/* @__PURE__ */ jsx("span", { className: "mx-0.5 text-border", "aria-hidden": true, children: "|" }),
|
|
46
|
+
SEVERITY_ORDER.map((severity) => {
|
|
47
|
+
const count = severityCounts[severity];
|
|
48
|
+
if (count === 0 && filters.severity.size === 0) return null;
|
|
49
|
+
const mode = filters.severity.get(severity);
|
|
50
|
+
const label = LINT_SEVERITIES[severity].label;
|
|
51
|
+
return /* @__PURE__ */ jsx(
|
|
52
|
+
FilterPill,
|
|
53
|
+
{
|
|
54
|
+
mode: mode ?? "neutral",
|
|
55
|
+
count,
|
|
56
|
+
badge: SEVERITY_BADGE[severity],
|
|
57
|
+
label: /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
58
|
+
/* @__PURE__ */ jsx(LintSeverityIcon, { severity }),
|
|
59
|
+
label
|
|
60
|
+
] }),
|
|
61
|
+
title: triStateTitle(label, mode),
|
|
62
|
+
onClick: () => onFiltersChange({ ...filters, severity: cycleFilterState(filters.severity, severity) })
|
|
63
|
+
},
|
|
64
|
+
severity
|
|
65
|
+
);
|
|
66
|
+
}),
|
|
67
|
+
linters.length > 1 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
68
|
+
/* @__PURE__ */ jsx("span", { className: "mx-0.5 text-border", "aria-hidden": true, children: "|" }),
|
|
69
|
+
linters.map((linter) => {
|
|
70
|
+
var _a;
|
|
71
|
+
const mode = filters.linter.get(linter);
|
|
72
|
+
const name = ((_a = toolMark(linter)) == null ? void 0 : _a.label) ?? linter;
|
|
73
|
+
return /* @__PURE__ */ jsx(
|
|
74
|
+
FilterPill,
|
|
75
|
+
{
|
|
76
|
+
mode: mode ?? "neutral",
|
|
77
|
+
label: /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
78
|
+
/* @__PURE__ */ jsx(ToolIcon, { tool: linter }),
|
|
79
|
+
name,
|
|
80
|
+
/* @__PURE__ */ jsx("span", { className: "text-[10px] tabular-nums opacity-70", title: String(linterCounts[linter] ?? 0), children: formatCount(linterCounts[linter] ?? 0) })
|
|
81
|
+
] }),
|
|
82
|
+
title: triStateTitle(linter, mode),
|
|
83
|
+
onClick: () => onFiltersChange({ ...filters, linter: cycleFilterState(filters.linter, linter) })
|
|
84
|
+
},
|
|
85
|
+
linter
|
|
86
|
+
);
|
|
87
|
+
})
|
|
88
|
+
] }),
|
|
89
|
+
hasActive && /* @__PURE__ */ jsx(
|
|
90
|
+
"button",
|
|
91
|
+
{
|
|
92
|
+
type: "button",
|
|
93
|
+
className: "ml-1 inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
94
|
+
onClick: () => onFiltersChange({ severity: /* @__PURE__ */ new Map(), linter: /* @__PURE__ */ new Map() }),
|
|
95
|
+
children: "Clear"
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
] });
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
LintFilterBar
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=LintFilterBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LintFilterBar.js","sources":["../../../src/data/lint/LintFilterBar.tsx"],"sourcesContent":["import { cn } from \"../../lib/utils\";\nimport { FilterPill } from \"../FilterPill\";\nimport { LINT_GROUPING_OPTIONS } from \"./grouping-options\";\nimport { cycleFilterState, type FilterMode } from \"../test-runner/filterState\";\nimport { LINT_SEVERITIES, toolMark } from \"../test-runner/marks\";\nimport { LintSeverityIcon, ToolIcon } from \"../test-runner/MarkIcons\";\nimport { formatCount } from \"../test-runner/status\";\nimport { collectLintLinters, countLintByLinter, countLintBySeverity } from \"./stats\";\nimport type { LintFilters, LintGrouping, LintSeverity, LinterResult } from \"./types\";\n\nexport type LintFilterBarProps = {\n results: readonly LinterResult[];\n grouping: LintGrouping;\n onGroupingChange: (next: LintGrouping) => void;\n filters: LintFilters;\n onFiltersChange: (next: LintFilters) => void;\n className?: string;\n};\n\nconst SEVERITY_ORDER: readonly LintSeverity[] = [\"error\", \"warning\", \"info\"];\n\nconst SEVERITY_BADGE: Record<LintSeverity, string> = {\n error: \"bg-red-600\",\n warning: \"bg-amber-600\",\n info: \"bg-sky-600\",\n};\n\nfunction triStateTitle(label: string, mode: FilterMode | undefined): string {\n if (mode === \"include\") return `${label}: included. Click to exclude`;\n if (mode === \"exclude\") return `${label}: excluded. Click to clear`;\n return `${label}: neutral. Click to include`;\n}\n\n/**\n * Grouping picker plus tri-state severity and linter filters for the lint\n * tree. Controlled: the host owns grouping and filters (typically in the URL).\n * Counts follow the other filter, so each pill shows what picking it would leave.\n */\nexport function LintFilterBar({\n results,\n grouping,\n onGroupingChange,\n filters,\n onFiltersChange,\n className,\n}: LintFilterBarProps) {\n const severityCounts = countLintBySeverity(results, filters.linter);\n const linterCounts = countLintByLinter(results, filters.severity);\n const linters = collectLintLinters(results);\n const hasActive = filters.severity.size > 0 || filters.linter.size > 0;\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-1.5\", className)} data-lint-filter-bar=\"\">\n <div role=\"group\" aria-label=\"Group by\" className=\"flex flex-wrap items-center gap-1.5\">\n {LINT_GROUPING_OPTIONS.map((opt) => (\n <FilterPill\n key={opt.key}\n mode={opt.key === grouping ? \"active\" : \"neutral\"}\n label={opt.label}\n icon={opt.icon}\n title={`Group by ${opt.label}`}\n onClick={() => onGroupingChange(opt.key)}\n />\n ))}\n </div>\n\n <span className=\"mx-0.5 text-border\" aria-hidden>\n |\n </span>\n\n {SEVERITY_ORDER.map((severity) => {\n const count = severityCounts[severity];\n if (count === 0 && filters.severity.size === 0) return null;\n const mode = filters.severity.get(severity);\n const label = LINT_SEVERITIES[severity].label;\n return (\n <FilterPill\n key={severity}\n mode={mode ?? \"neutral\"}\n count={count}\n badge={SEVERITY_BADGE[severity]}\n label={\n <span className=\"inline-flex items-center gap-1\">\n <LintSeverityIcon severity={severity} />\n {label}\n </span>\n }\n title={triStateTitle(label, mode)}\n onClick={() =>\n onFiltersChange({ ...filters, severity: cycleFilterState(filters.severity, severity) })\n }\n />\n );\n })}\n\n {linters.length > 1 && (\n <>\n <span className=\"mx-0.5 text-border\" aria-hidden>\n |\n </span>\n {linters.map((linter) => {\n const mode = filters.linter.get(linter);\n const name = toolMark(linter)?.label ?? linter;\n return (\n <FilterPill\n key={linter}\n mode={mode ?? \"neutral\"}\n label={\n <span className=\"inline-flex items-center gap-1\">\n <ToolIcon tool={linter} />\n {name}\n <span className=\"text-[10px] tabular-nums opacity-70\" title={String(linterCounts[linter] ?? 0)}>\n {formatCount(linterCounts[linter] ?? 0)}\n </span>\n </span>\n }\n title={triStateTitle(linter, mode)}\n onClick={() =>\n onFiltersChange({ ...filters, linter: cycleFilterState(filters.linter, linter) })\n }\n />\n );\n })}\n </>\n )}\n\n {hasActive && (\n <button\n type=\"button\"\n className=\"ml-1 inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => onFiltersChange({ severity: new Map(), linter: new Map() })}\n >\n Clear\n </button>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const Icon = require("../Icon.cjs");
|
|
6
|
+
const Tree = require("../Tree.cjs");
|
|
7
|
+
const SplitPane = require("../../layout/SplitPane.cjs");
|
|
8
|
+
const useContainerWidth = require("../../hooks/use-container-width.cjs");
|
|
9
|
+
const utils = require("../../lib/utils.cjs");
|
|
10
|
+
const MarkIcons = require("../test-runner/MarkIcons.cjs");
|
|
11
|
+
const LintDetail = require("./LintDetail.cjs");
|
|
12
|
+
const LintFilterBar = require("./LintFilterBar.cjs");
|
|
13
|
+
const LintTreeNode = require("./LintTreeNode.cjs");
|
|
14
|
+
const grouping = require("./grouping.cjs");
|
|
15
|
+
const stats = require("./stats.cjs");
|
|
16
|
+
const UiListChecks = require("../../icons/components/UiListChecks.cjs");
|
|
17
|
+
const UiArrowLeft = require("../../icons/components/UiArrowLeft.cjs");
|
|
18
|
+
const SPLIT_MIN_WIDTH = 640;
|
|
19
|
+
const SEVERITIES = ["error", "warning", "info"];
|
|
20
|
+
function Summary({ results }) {
|
|
21
|
+
const counts = stats.countLintBySeverity(results, /* @__PURE__ */ new Map());
|
|
22
|
+
const failedToRun = results.filter(stats.isLinterErrored).length;
|
|
23
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-3 text-xs text-muted-foreground", "data-lint-summary": "", children: [
|
|
24
|
+
SEVERITIES.filter((s) => counts[s] > 0).map((s) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
25
|
+
/* @__PURE__ */ jsxRuntime.jsx(MarkIcons.LintSeverityIcon, { severity: s }),
|
|
26
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: counts[s] })
|
|
27
|
+
] }, s)),
|
|
28
|
+
failedToRun > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-red-600 dark:text-red-400", children: [
|
|
29
|
+
failedToRun,
|
|
30
|
+
" linter",
|
|
31
|
+
failedToRun === 1 ? "" : "s",
|
|
32
|
+
" failed to run"
|
|
33
|
+
] })
|
|
34
|
+
] });
|
|
35
|
+
}
|
|
36
|
+
function emptyMessage(results, filters) {
|
|
37
|
+
if (results.length === 0) return "No lint results";
|
|
38
|
+
if (filters.severity.size > 0 || filters.linter.size > 0) return "No violations match the current filters";
|
|
39
|
+
return "No lint violations";
|
|
40
|
+
}
|
|
41
|
+
function LintResults({
|
|
42
|
+
results,
|
|
43
|
+
grouping: grouping$1,
|
|
44
|
+
onGroupingChange,
|
|
45
|
+
filters,
|
|
46
|
+
onFiltersChange,
|
|
47
|
+
selected,
|
|
48
|
+
onSelect,
|
|
49
|
+
expandAll,
|
|
50
|
+
onExpandAllChange,
|
|
51
|
+
onIgnore,
|
|
52
|
+
ignoreBusy,
|
|
53
|
+
headerSlot,
|
|
54
|
+
title,
|
|
55
|
+
defaultSplit = 45,
|
|
56
|
+
className
|
|
57
|
+
}) {
|
|
58
|
+
const tree = react.useMemo(() => grouping.buildLintTree({ results, grouping: grouping$1, filters }), [results, grouping$1, filters]);
|
|
59
|
+
const selectedNode = react.useMemo(() => selected ? grouping.findLintNode(tree, selected) : null, [tree, selected]);
|
|
60
|
+
const { ref, wider: roomy } = useContainerWidth.useContainerWiderThan(SPLIT_MIN_WIDTH);
|
|
61
|
+
const filterBar = results.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
62
|
+
LintFilterBar.LintFilterBar,
|
|
63
|
+
{
|
|
64
|
+
results,
|
|
65
|
+
grouping: grouping$1,
|
|
66
|
+
onGroupingChange,
|
|
67
|
+
filters,
|
|
68
|
+
onFiltersChange,
|
|
69
|
+
className: "border-b border-border bg-card px-density-4 py-density-2"
|
|
70
|
+
}
|
|
71
|
+
) : null;
|
|
72
|
+
const treePane = /* @__PURE__ */ jsxRuntime.jsx(
|
|
73
|
+
Tree.Tree,
|
|
74
|
+
{
|
|
75
|
+
className: "min-h-0",
|
|
76
|
+
roots: tree,
|
|
77
|
+
getKey: (node) => node.route_path,
|
|
78
|
+
getChildren: (node) => node.children,
|
|
79
|
+
selected: selectedNode,
|
|
80
|
+
onSelect: (node) => onSelect(node.route_path === selected ? null : node.route_path),
|
|
81
|
+
expandAll,
|
|
82
|
+
onExpandAllChange,
|
|
83
|
+
defaultOpen: (node, depth) => depth < 1 || node.failed,
|
|
84
|
+
showSearch: true,
|
|
85
|
+
searchLabel: "Filter findings",
|
|
86
|
+
getSearchText: (node) => `${node.name} ${node.linterName ?? ""} ${node.ruleName ?? ""}`,
|
|
87
|
+
empty: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-8 text-center text-sm text-muted-foreground", children: emptyMessage(results, filters) }),
|
|
88
|
+
renderRow: ({ node, selected: isSelected }) => /* @__PURE__ */ jsxRuntime.jsx(LintTreeNode.LintTreeNode, { node, selected: isSelected })
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
const detailPane = /* @__PURE__ */ jsxRuntime.jsx(LintDetail.LintDetailPanel, { node: selectedNode, results, onIgnore, ignoreBusy });
|
|
92
|
+
const showHeader = title !== null || results.length > 0 || headerSlot != null;
|
|
93
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: utils.cn("flex h-full min-h-0 flex-col bg-background", className), "data-lint-results": "", children: [
|
|
94
|
+
showHeader && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
95
|
+
"div",
|
|
96
|
+
{
|
|
97
|
+
className: "flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 border-b border-border bg-card px-density-4 py-density-2",
|
|
98
|
+
"data-lint-header": "",
|
|
99
|
+
children: [
|
|
100
|
+
title === void 0 ? /* @__PURE__ */ jsxRuntime.jsxs("h1", { className: "inline-flex shrink-0 items-center gap-1.5 text-base font-bold", children: [
|
|
101
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiListChecks.UiListChecks, className: "text-primary" }),
|
|
102
|
+
"Lint Results"
|
|
103
|
+
] }) : title,
|
|
104
|
+
/* @__PURE__ */ jsxRuntime.jsx(Summary, { results }),
|
|
105
|
+
headerSlot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center gap-1", children: headerSlot })
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
roomy ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
110
|
+
filterBar,
|
|
111
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
112
|
+
SplitPane.SplitPane,
|
|
113
|
+
{
|
|
114
|
+
className: "min-h-0 flex-1",
|
|
115
|
+
defaultSplit,
|
|
116
|
+
minLeft: 25,
|
|
117
|
+
minRight: 30,
|
|
118
|
+
leftClass: "border-r-2 border-border bg-muted/30",
|
|
119
|
+
left: treePane,
|
|
120
|
+
right: detailPane
|
|
121
|
+
}
|
|
122
|
+
)
|
|
123
|
+
] }) : selectedNode ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [
|
|
124
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
125
|
+
"button",
|
|
126
|
+
{
|
|
127
|
+
type: "button",
|
|
128
|
+
onClick: () => onSelect(null),
|
|
129
|
+
className: "inline-flex items-center gap-1.5 border-b border-border px-density-3 py-density-2 text-left text-sm text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
130
|
+
children: [
|
|
131
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiArrowLeft.UiArrowLeft }),
|
|
132
|
+
"Back to results"
|
|
133
|
+
]
|
|
134
|
+
}
|
|
135
|
+
),
|
|
136
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: detailPane })
|
|
137
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
138
|
+
filterBar,
|
|
139
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: treePane })
|
|
140
|
+
] })
|
|
141
|
+
] });
|
|
142
|
+
}
|
|
143
|
+
exports.LintResults = LintResults;
|
|
144
|
+
//# sourceMappingURL=LintResults.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LintResults.cjs","sources":["../../../src/data/lint/LintResults.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { Tree } from \"../Tree\";\nimport { SplitPane } from \"../../layout/SplitPane\";\nimport { useContainerWiderThan } from \"../../hooks/use-container-width\";\nimport { cn } from \"../../lib/utils\";\nimport { UiArrowLeft, UiListChecks } from \"../../icons\";\nimport { LintSeverityIcon } from \"../test-runner/MarkIcons\";\nimport { LintDetailPanel } from \"./LintDetail\";\nimport { LintFilterBar } from \"./LintFilterBar\";\nimport { LintTreeNode } from \"./LintTreeNode\";\nimport { buildLintTree, findLintNode } from \"./grouping\";\nimport { countLintBySeverity, isLinterErrored } from \"./stats\";\nimport type { LintAction, LintFilters, LintGrouping, LintNode, LinterResult, LintSeverity } from \"./types\";\n\nexport type LintResultsProps = {\n results: readonly LinterResult[];\n grouping: LintGrouping;\n onGroupingChange: (next: LintGrouping) => void;\n /** Tri-state severity and linter filters; the host owns them (typically in the URL). */\n filters: LintFilters;\n onFiltersChange: (next: LintFilters) => void;\n /** The selected node's `route_path`, or null. Paths are stable across rebuilds, so they can live in a URL. */\n selected: string | null;\n onSelect: (routePath: string | null) => void;\n /** Tri-state expand-all: true (all open), false (all closed), null (default). */\n expandAll: boolean | null;\n onExpandAllChange: (next: boolean | null) => void;\n /**\n * Called with the chosen ignore action; `action.req` is the entry to add to\n * `.gavel.yaml`. Omit to hide every ignore button.\n */\n onIgnore?: (action: LintAction) => void | Promise<void>;\n /** Disables the ignore buttons while the host applies an action. */\n ignoreBusy?: boolean;\n /** Actions at the right end of the header bar (e.g. re-run, export). */\n headerSlot?: ReactNode;\n /** Header title. Defaults to a \"Lint Results\" heading; pass `null` for none. */\n title?: ReactNode;\n /** Initial left-pane width percentage. */\n defaultSplit?: number;\n className?: string;\n};\n\nconst SPLIT_MIN_WIDTH = 640;\nconst SEVERITIES: readonly LintSeverity[] = [\"error\", \"warning\", \"info\"];\n\nfunction Summary({ results }: { results: readonly LinterResult[] }) {\n const counts = countLintBySeverity(results, new Map());\n const failedToRun = results.filter(isLinterErrored).length;\n return (\n <div className=\"ml-auto flex shrink-0 items-center gap-3 text-xs text-muted-foreground\" data-lint-summary=\"\">\n {SEVERITIES.filter((s) => counts[s] > 0).map((s) => (\n <span key={s} className=\"inline-flex items-center gap-1\">\n <LintSeverityIcon severity={s} />\n <span className=\"tabular-nums\">{counts[s]}</span>\n </span>\n ))}\n {failedToRun > 0 && (\n <span className=\"text-red-600 dark:text-red-400\">\n {failedToRun} linter{failedToRun === 1 ? \"\" : \"s\"} failed to run\n </span>\n )}\n </div>\n );\n}\n\nfunction emptyMessage(results: readonly LinterResult[], filters: LintFilters): string {\n if (results.length === 0) return \"No lint results\";\n if (filters.severity.size > 0 || filters.linter.size > 0) return \"No violations match the current filters\";\n return \"No lint violations\";\n}\n\n/**\n * Lint results as a filterable, groupable tree beside a detail pane, with\n * optional ignore actions. Pure presentation: results, grouping, filters,\n * selection and expand state all flow in through props, so the host can keep\n * them in its URL. A linter that failed to run is shown under its name rather\n * than dropped.\n */\nexport function LintResults({\n results,\n grouping,\n onGroupingChange,\n filters,\n onFiltersChange,\n selected,\n onSelect,\n expandAll,\n onExpandAllChange,\n onIgnore,\n ignoreBusy,\n headerSlot,\n title,\n defaultSplit = 45,\n className,\n}: LintResultsProps) {\n const tree = useMemo(() => buildLintTree({ results, grouping, filters }), [results, grouping, filters]);\n const selectedNode = useMemo(() => (selected ? findLintNode(tree, selected) : null), [tree, selected]);\n const { ref, wider: roomy } = useContainerWiderThan(SPLIT_MIN_WIDTH);\n\n const filterBar =\n results.length > 0 ? (\n <LintFilterBar\n results={results}\n grouping={grouping}\n onGroupingChange={onGroupingChange}\n filters={filters}\n onFiltersChange={onFiltersChange}\n className=\"border-b border-border bg-card px-density-4 py-density-2\"\n />\n ) : null;\n\n const treePane = (\n <Tree<LintNode>\n className=\"min-h-0\"\n roots={tree}\n getKey={(node) => node.route_path}\n getChildren={(node) => node.children}\n selected={selectedNode}\n onSelect={(node) => onSelect(node.route_path === selected ? null : node.route_path)}\n expandAll={expandAll}\n onExpandAllChange={onExpandAllChange}\n defaultOpen={(node, depth) => depth < 1 || node.failed}\n showSearch\n searchLabel=\"Filter findings\"\n getSearchText={(node) => `${node.name} ${node.linterName ?? \"\"} ${node.ruleName ?? \"\"}`}\n empty={<div className=\"p-8 text-center text-sm text-muted-foreground\">{emptyMessage(results, filters)}</div>}\n renderRow={({ node, selected: isSelected }) => <LintTreeNode node={node} selected={isSelected} />}\n />\n );\n const detailPane = (\n <LintDetailPanel node={selectedNode} results={results} onIgnore={onIgnore} ignoreBusy={ignoreBusy} />\n );\n const showHeader = title !== null || results.length > 0 || headerSlot != null;\n\n return (\n <div ref={ref} className={cn(\"flex h-full min-h-0 flex-col bg-background\", className)} data-lint-results=\"\">\n {showHeader && (\n <div\n className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 border-b border-border bg-card px-density-4 py-density-2\"\n data-lint-header=\"\"\n >\n {title === undefined ? (\n <h1 className=\"inline-flex shrink-0 items-center gap-1.5 text-base font-bold\">\n <Icon icon={UiListChecks} className=\"text-primary\" />\n Lint Results\n </h1>\n ) : (\n title\n )}\n <Summary results={results} />\n {headerSlot && <div className=\"flex shrink-0 items-center gap-1\">{headerSlot}</div>}\n </div>\n )}\n\n {roomy ? (\n <>\n {filterBar}\n <SplitPane\n className=\"min-h-0 flex-1\"\n defaultSplit={defaultSplit}\n minLeft={25}\n minRight={30}\n leftClass=\"border-r-2 border-border bg-muted/30\"\n left={treePane}\n right={detailPane}\n />\n </>\n ) : selectedNode ? (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <button\n type=\"button\"\n onClick={() => onSelect(null)}\n className=\"inline-flex items-center gap-1.5 border-b border-border px-density-3 py-density-2 text-left text-sm text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon icon={UiArrowLeft} />\n Back to results\n </button>\n <div className=\"min-h-0 flex-1 overflow-hidden\">{detailPane}</div>\n </div>\n ) : (\n <>\n {filterBar}\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{treePane}</div>\n </>\n )}\n </div>\n );\n}\n"],"names":["countLintBySeverity","isLinterErrored","jsxs","jsx","LintSeverityIcon","grouping","useMemo","buildLintTree","findLintNode","useContainerWiderThan","LintFilterBar","Tree","LintTreeNode","LintDetailPanel","cn","Icon","UiListChecks","Fragment","SplitPane","UiArrowLeft"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { LintAction, LintFilters, LintGrouping, LinterResult } from './types.js';
|
|
3
|
+
export type LintResultsProps = {
|
|
4
|
+
results: readonly LinterResult[];
|
|
5
|
+
grouping: LintGrouping;
|
|
6
|
+
onGroupingChange: (next: LintGrouping) => void;
|
|
7
|
+
/** Tri-state severity and linter filters; the host owns them (typically in the URL). */
|
|
8
|
+
filters: LintFilters;
|
|
9
|
+
onFiltersChange: (next: LintFilters) => void;
|
|
10
|
+
/** The selected node's `route_path`, or null. Paths are stable across rebuilds, so they can live in a URL. */
|
|
11
|
+
selected: string | null;
|
|
12
|
+
onSelect: (routePath: string | null) => void;
|
|
13
|
+
/** Tri-state expand-all: true (all open), false (all closed), null (default). */
|
|
14
|
+
expandAll: boolean | null;
|
|
15
|
+
onExpandAllChange: (next: boolean | null) => void;
|
|
16
|
+
/**
|
|
17
|
+
* Called with the chosen ignore action; `action.req` is the entry to add to
|
|
18
|
+
* `.gavel.yaml`. Omit to hide every ignore button.
|
|
19
|
+
*/
|
|
20
|
+
onIgnore?: (action: LintAction) => void | Promise<void>;
|
|
21
|
+
/** Disables the ignore buttons while the host applies an action. */
|
|
22
|
+
ignoreBusy?: boolean;
|
|
23
|
+
/** Actions at the right end of the header bar (e.g. re-run, export). */
|
|
24
|
+
headerSlot?: ReactNode;
|
|
25
|
+
/** Header title. Defaults to a "Lint Results" heading; pass `null` for none. */
|
|
26
|
+
title?: ReactNode;
|
|
27
|
+
/** Initial left-pane width percentage. */
|
|
28
|
+
defaultSplit?: number;
|
|
29
|
+
className?: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Lint results as a filterable, groupable tree beside a detail pane, with
|
|
33
|
+
* optional ignore actions. Pure presentation: results, grouping, filters,
|
|
34
|
+
* selection and expand state all flow in through props, so the host can keep
|
|
35
|
+
* them in its URL. A linter that failed to run is shown under its name rather
|
|
36
|
+
* than dropped.
|
|
37
|
+
*/
|
|
38
|
+
export declare function LintResults({ results, grouping, onGroupingChange, filters, onFiltersChange, selected, onSelect, expandAll, onExpandAllChange, onIgnore, ignoreBusy, headerSlot, title, defaultSplit, className, }: LintResultsProps): import("react").JSX.Element;
|
|
39
|
+
//# sourceMappingURL=LintResults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LintResults.d.ts","sourceRoot":"","sources":["../../../src/data/lint/LintResults.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAahD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAY,YAAY,EAAgB,MAAM,SAAS,CAAC;AAE3G,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,gBAAgB,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C,wFAAwF;IACxF,OAAO,EAAE,WAAW,CAAC;IACrB,eAAe,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,8GAA8G;IAC9G,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,iFAAiF;IACjF,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,oEAAoE;IACpE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,gFAAgF;IAChF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA+BF;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,QAAQ,EACR,gBAAgB,EAChB,OAAO,EACP,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,UAAU,EACV,KAAK,EACL,YAAiB,EACjB,SAAS,GACV,EAAE,gBAAgB,+BA6FlB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LinterResult } from './types.js';
|
|
2
|
+
export declare const golangci: LinterResult;
|
|
3
|
+
export declare const eslint: LinterResult;
|
|
4
|
+
export declare const betterleaks: LinterResult;
|
|
5
|
+
/** The linter binary exited with a config error: no violations, only an error. */
|
|
6
|
+
export declare const pyrightFailed: LinterResult;
|
|
7
|
+
export declare const valeSkipped: LinterResult;
|
|
8
|
+
export declare const markdownlintClean: LinterResult;
|
|
9
|
+
export declare const allLintResults: LinterResult[];
|
|
10
|
+
//# sourceMappingURL=LintResults.fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LintResults.fixtures.d.ts","sourceRoot":"","sources":["../../../src/data/lint/LintResults.fixtures.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,eAAO,MAAM,QAAQ,EAAE,YAyCtB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,YAyBpB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,YAazB,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,aAAa,EAAE,YAS3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,YAQzB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,YAM/B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,YAAY,EAOxC,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { Icon } from "../Icon.js";
|
|
4
|
+
import { Tree } from "../Tree.js";
|
|
5
|
+
import { SplitPane } from "../../layout/SplitPane.js";
|
|
6
|
+
import { useContainerWiderThan } from "../../hooks/use-container-width.js";
|
|
7
|
+
import { cn } from "../../lib/utils.js";
|
|
8
|
+
import { LintSeverityIcon } from "../test-runner/MarkIcons.js";
|
|
9
|
+
import { LintDetailPanel } from "./LintDetail.js";
|
|
10
|
+
import { LintFilterBar } from "./LintFilterBar.js";
|
|
11
|
+
import { LintTreeNode } from "./LintTreeNode.js";
|
|
12
|
+
import { buildLintTree, findLintNode } from "./grouping.js";
|
|
13
|
+
import { countLintBySeverity, isLinterErrored } from "./stats.js";
|
|
14
|
+
import { UiListChecks } from "../../icons/components/UiListChecks.js";
|
|
15
|
+
import { UiArrowLeft } from "../../icons/components/UiArrowLeft.js";
|
|
16
|
+
const SPLIT_MIN_WIDTH = 640;
|
|
17
|
+
const SEVERITIES = ["error", "warning", "info"];
|
|
18
|
+
function Summary({ results }) {
|
|
19
|
+
const counts = countLintBySeverity(results, /* @__PURE__ */ new Map());
|
|
20
|
+
const failedToRun = results.filter(isLinterErrored).length;
|
|
21
|
+
return /* @__PURE__ */ jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-3 text-xs text-muted-foreground", "data-lint-summary": "", children: [
|
|
22
|
+
SEVERITIES.filter((s) => counts[s] > 0).map((s) => /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
23
|
+
/* @__PURE__ */ jsx(LintSeverityIcon, { severity: s }),
|
|
24
|
+
/* @__PURE__ */ jsx("span", { className: "tabular-nums", children: counts[s] })
|
|
25
|
+
] }, s)),
|
|
26
|
+
failedToRun > 0 && /* @__PURE__ */ jsxs("span", { className: "text-red-600 dark:text-red-400", children: [
|
|
27
|
+
failedToRun,
|
|
28
|
+
" linter",
|
|
29
|
+
failedToRun === 1 ? "" : "s",
|
|
30
|
+
" failed to run"
|
|
31
|
+
] })
|
|
32
|
+
] });
|
|
33
|
+
}
|
|
34
|
+
function emptyMessage(results, filters) {
|
|
35
|
+
if (results.length === 0) return "No lint results";
|
|
36
|
+
if (filters.severity.size > 0 || filters.linter.size > 0) return "No violations match the current filters";
|
|
37
|
+
return "No lint violations";
|
|
38
|
+
}
|
|
39
|
+
function LintResults({
|
|
40
|
+
results,
|
|
41
|
+
grouping,
|
|
42
|
+
onGroupingChange,
|
|
43
|
+
filters,
|
|
44
|
+
onFiltersChange,
|
|
45
|
+
selected,
|
|
46
|
+
onSelect,
|
|
47
|
+
expandAll,
|
|
48
|
+
onExpandAllChange,
|
|
49
|
+
onIgnore,
|
|
50
|
+
ignoreBusy,
|
|
51
|
+
headerSlot,
|
|
52
|
+
title,
|
|
53
|
+
defaultSplit = 45,
|
|
54
|
+
className
|
|
55
|
+
}) {
|
|
56
|
+
const tree = useMemo(() => buildLintTree({ results, grouping, filters }), [results, grouping, filters]);
|
|
57
|
+
const selectedNode = useMemo(() => selected ? findLintNode(tree, selected) : null, [tree, selected]);
|
|
58
|
+
const { ref, wider: roomy } = useContainerWiderThan(SPLIT_MIN_WIDTH);
|
|
59
|
+
const filterBar = results.length > 0 ? /* @__PURE__ */ jsx(
|
|
60
|
+
LintFilterBar,
|
|
61
|
+
{
|
|
62
|
+
results,
|
|
63
|
+
grouping,
|
|
64
|
+
onGroupingChange,
|
|
65
|
+
filters,
|
|
66
|
+
onFiltersChange,
|
|
67
|
+
className: "border-b border-border bg-card px-density-4 py-density-2"
|
|
68
|
+
}
|
|
69
|
+
) : null;
|
|
70
|
+
const treePane = /* @__PURE__ */ jsx(
|
|
71
|
+
Tree,
|
|
72
|
+
{
|
|
73
|
+
className: "min-h-0",
|
|
74
|
+
roots: tree,
|
|
75
|
+
getKey: (node) => node.route_path,
|
|
76
|
+
getChildren: (node) => node.children,
|
|
77
|
+
selected: selectedNode,
|
|
78
|
+
onSelect: (node) => onSelect(node.route_path === selected ? null : node.route_path),
|
|
79
|
+
expandAll,
|
|
80
|
+
onExpandAllChange,
|
|
81
|
+
defaultOpen: (node, depth) => depth < 1 || node.failed,
|
|
82
|
+
showSearch: true,
|
|
83
|
+
searchLabel: "Filter findings",
|
|
84
|
+
getSearchText: (node) => `${node.name} ${node.linterName ?? ""} ${node.ruleName ?? ""}`,
|
|
85
|
+
empty: /* @__PURE__ */ jsx("div", { className: "p-8 text-center text-sm text-muted-foreground", children: emptyMessage(results, filters) }),
|
|
86
|
+
renderRow: ({ node, selected: isSelected }) => /* @__PURE__ */ jsx(LintTreeNode, { node, selected: isSelected })
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
const detailPane = /* @__PURE__ */ jsx(LintDetailPanel, { node: selectedNode, results, onIgnore, ignoreBusy });
|
|
90
|
+
const showHeader = title !== null || results.length > 0 || headerSlot != null;
|
|
91
|
+
return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex h-full min-h-0 flex-col bg-background", className), "data-lint-results": "", children: [
|
|
92
|
+
showHeader && /* @__PURE__ */ jsxs(
|
|
93
|
+
"div",
|
|
94
|
+
{
|
|
95
|
+
className: "flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 border-b border-border bg-card px-density-4 py-density-2",
|
|
96
|
+
"data-lint-header": "",
|
|
97
|
+
children: [
|
|
98
|
+
title === void 0 ? /* @__PURE__ */ jsxs("h1", { className: "inline-flex shrink-0 items-center gap-1.5 text-base font-bold", children: [
|
|
99
|
+
/* @__PURE__ */ jsx(Icon, { icon: UiListChecks, className: "text-primary" }),
|
|
100
|
+
"Lint Results"
|
|
101
|
+
] }) : title,
|
|
102
|
+
/* @__PURE__ */ jsx(Summary, { results }),
|
|
103
|
+
headerSlot && /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-1", children: headerSlot })
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
),
|
|
107
|
+
roomy ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
108
|
+
filterBar,
|
|
109
|
+
/* @__PURE__ */ jsx(
|
|
110
|
+
SplitPane,
|
|
111
|
+
{
|
|
112
|
+
className: "min-h-0 flex-1",
|
|
113
|
+
defaultSplit,
|
|
114
|
+
minLeft: 25,
|
|
115
|
+
minRight: 30,
|
|
116
|
+
leftClass: "border-r-2 border-border bg-muted/30",
|
|
117
|
+
left: treePane,
|
|
118
|
+
right: detailPane
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
] }) : selectedNode ? /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [
|
|
122
|
+
/* @__PURE__ */ jsxs(
|
|
123
|
+
"button",
|
|
124
|
+
{
|
|
125
|
+
type: "button",
|
|
126
|
+
onClick: () => onSelect(null),
|
|
127
|
+
className: "inline-flex items-center gap-1.5 border-b border-border px-density-3 py-density-2 text-left text-sm text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
128
|
+
children: [
|
|
129
|
+
/* @__PURE__ */ jsx(Icon, { icon: UiArrowLeft }),
|
|
130
|
+
"Back to results"
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
),
|
|
134
|
+
/* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: detailPane })
|
|
135
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
136
|
+
filterBar,
|
|
137
|
+
/* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: treePane })
|
|
138
|
+
] })
|
|
139
|
+
] });
|
|
140
|
+
}
|
|
141
|
+
export {
|
|
142
|
+
LintResults
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=LintResults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LintResults.js","sources":["../../../src/data/lint/LintResults.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { Tree } from \"../Tree\";\nimport { SplitPane } from \"../../layout/SplitPane\";\nimport { useContainerWiderThan } from \"../../hooks/use-container-width\";\nimport { cn } from \"../../lib/utils\";\nimport { UiArrowLeft, UiListChecks } from \"../../icons\";\nimport { LintSeverityIcon } from \"../test-runner/MarkIcons\";\nimport { LintDetailPanel } from \"./LintDetail\";\nimport { LintFilterBar } from \"./LintFilterBar\";\nimport { LintTreeNode } from \"./LintTreeNode\";\nimport { buildLintTree, findLintNode } from \"./grouping\";\nimport { countLintBySeverity, isLinterErrored } from \"./stats\";\nimport type { LintAction, LintFilters, LintGrouping, LintNode, LinterResult, LintSeverity } from \"./types\";\n\nexport type LintResultsProps = {\n results: readonly LinterResult[];\n grouping: LintGrouping;\n onGroupingChange: (next: LintGrouping) => void;\n /** Tri-state severity and linter filters; the host owns them (typically in the URL). */\n filters: LintFilters;\n onFiltersChange: (next: LintFilters) => void;\n /** The selected node's `route_path`, or null. Paths are stable across rebuilds, so they can live in a URL. */\n selected: string | null;\n onSelect: (routePath: string | null) => void;\n /** Tri-state expand-all: true (all open), false (all closed), null (default). */\n expandAll: boolean | null;\n onExpandAllChange: (next: boolean | null) => void;\n /**\n * Called with the chosen ignore action; `action.req` is the entry to add to\n * `.gavel.yaml`. Omit to hide every ignore button.\n */\n onIgnore?: (action: LintAction) => void | Promise<void>;\n /** Disables the ignore buttons while the host applies an action. */\n ignoreBusy?: boolean;\n /** Actions at the right end of the header bar (e.g. re-run, export). */\n headerSlot?: ReactNode;\n /** Header title. Defaults to a \"Lint Results\" heading; pass `null` for none. */\n title?: ReactNode;\n /** Initial left-pane width percentage. */\n defaultSplit?: number;\n className?: string;\n};\n\nconst SPLIT_MIN_WIDTH = 640;\nconst SEVERITIES: readonly LintSeverity[] = [\"error\", \"warning\", \"info\"];\n\nfunction Summary({ results }: { results: readonly LinterResult[] }) {\n const counts = countLintBySeverity(results, new Map());\n const failedToRun = results.filter(isLinterErrored).length;\n return (\n <div className=\"ml-auto flex shrink-0 items-center gap-3 text-xs text-muted-foreground\" data-lint-summary=\"\">\n {SEVERITIES.filter((s) => counts[s] > 0).map((s) => (\n <span key={s} className=\"inline-flex items-center gap-1\">\n <LintSeverityIcon severity={s} />\n <span className=\"tabular-nums\">{counts[s]}</span>\n </span>\n ))}\n {failedToRun > 0 && (\n <span className=\"text-red-600 dark:text-red-400\">\n {failedToRun} linter{failedToRun === 1 ? \"\" : \"s\"} failed to run\n </span>\n )}\n </div>\n );\n}\n\nfunction emptyMessage(results: readonly LinterResult[], filters: LintFilters): string {\n if (results.length === 0) return \"No lint results\";\n if (filters.severity.size > 0 || filters.linter.size > 0) return \"No violations match the current filters\";\n return \"No lint violations\";\n}\n\n/**\n * Lint results as a filterable, groupable tree beside a detail pane, with\n * optional ignore actions. Pure presentation: results, grouping, filters,\n * selection and expand state all flow in through props, so the host can keep\n * them in its URL. A linter that failed to run is shown under its name rather\n * than dropped.\n */\nexport function LintResults({\n results,\n grouping,\n onGroupingChange,\n filters,\n onFiltersChange,\n selected,\n onSelect,\n expandAll,\n onExpandAllChange,\n onIgnore,\n ignoreBusy,\n headerSlot,\n title,\n defaultSplit = 45,\n className,\n}: LintResultsProps) {\n const tree = useMemo(() => buildLintTree({ results, grouping, filters }), [results, grouping, filters]);\n const selectedNode = useMemo(() => (selected ? findLintNode(tree, selected) : null), [tree, selected]);\n const { ref, wider: roomy } = useContainerWiderThan(SPLIT_MIN_WIDTH);\n\n const filterBar =\n results.length > 0 ? (\n <LintFilterBar\n results={results}\n grouping={grouping}\n onGroupingChange={onGroupingChange}\n filters={filters}\n onFiltersChange={onFiltersChange}\n className=\"border-b border-border bg-card px-density-4 py-density-2\"\n />\n ) : null;\n\n const treePane = (\n <Tree<LintNode>\n className=\"min-h-0\"\n roots={tree}\n getKey={(node) => node.route_path}\n getChildren={(node) => node.children}\n selected={selectedNode}\n onSelect={(node) => onSelect(node.route_path === selected ? null : node.route_path)}\n expandAll={expandAll}\n onExpandAllChange={onExpandAllChange}\n defaultOpen={(node, depth) => depth < 1 || node.failed}\n showSearch\n searchLabel=\"Filter findings\"\n getSearchText={(node) => `${node.name} ${node.linterName ?? \"\"} ${node.ruleName ?? \"\"}`}\n empty={<div className=\"p-8 text-center text-sm text-muted-foreground\">{emptyMessage(results, filters)}</div>}\n renderRow={({ node, selected: isSelected }) => <LintTreeNode node={node} selected={isSelected} />}\n />\n );\n const detailPane = (\n <LintDetailPanel node={selectedNode} results={results} onIgnore={onIgnore} ignoreBusy={ignoreBusy} />\n );\n const showHeader = title !== null || results.length > 0 || headerSlot != null;\n\n return (\n <div ref={ref} className={cn(\"flex h-full min-h-0 flex-col bg-background\", className)} data-lint-results=\"\">\n {showHeader && (\n <div\n className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 border-b border-border bg-card px-density-4 py-density-2\"\n data-lint-header=\"\"\n >\n {title === undefined ? (\n <h1 className=\"inline-flex shrink-0 items-center gap-1.5 text-base font-bold\">\n <Icon icon={UiListChecks} className=\"text-primary\" />\n Lint Results\n </h1>\n ) : (\n title\n )}\n <Summary results={results} />\n {headerSlot && <div className=\"flex shrink-0 items-center gap-1\">{headerSlot}</div>}\n </div>\n )}\n\n {roomy ? (\n <>\n {filterBar}\n <SplitPane\n className=\"min-h-0 flex-1\"\n defaultSplit={defaultSplit}\n minLeft={25}\n minRight={30}\n leftClass=\"border-r-2 border-border bg-muted/30\"\n left={treePane}\n right={detailPane}\n />\n </>\n ) : selectedNode ? (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <button\n type=\"button\"\n onClick={() => onSelect(null)}\n className=\"inline-flex items-center gap-1.5 border-b border-border px-density-3 py-density-2 text-left text-sm text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon icon={UiArrowLeft} />\n Back to results\n </button>\n <div className=\"min-h-0 flex-1 overflow-hidden\">{detailPane}</div>\n </div>\n ) : (\n <>\n {filterBar}\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{treePane}</div>\n </>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const Icon = require("../Icon.cjs");
|
|
5
|
+
const Badge = require("../Badge.cjs");
|
|
6
|
+
const utils = require("../../lib/utils.cjs");
|
|
7
|
+
const MarkIcons = require("../test-runner/MarkIcons.cjs");
|
|
8
|
+
const marks = require("../test-runner/marks.cjs");
|
|
9
|
+
const stats = require("./stats.cjs");
|
|
10
|
+
const UiTag = require("../../icons/components/UiTag.cjs");
|
|
11
|
+
const UiFileCode = require("../../icons/components/UiFileCode.cjs");
|
|
12
|
+
const UiFolder = require("../../icons/components/UiFolder.cjs");
|
|
13
|
+
const UiWrench = require("../../icons/components/UiWrench.cjs");
|
|
14
|
+
const COUNT_TONE = { error: "danger", warning: "warning", info: "info" };
|
|
15
|
+
function NodeIcon({ node }) {
|
|
16
|
+
switch (node.kind) {
|
|
17
|
+
case "linter":
|
|
18
|
+
return marks.toolMark(node.linterName) ? /* @__PURE__ */ jsxRuntime.jsx(MarkIcons.ToolIcon, { tool: node.linterName }) : /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiWrench.UiWrench, className: "shrink-0 text-muted-foreground" });
|
|
19
|
+
case "lint-folder":
|
|
20
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiFolder.UiFolder, className: "shrink-0 text-muted-foreground" });
|
|
21
|
+
case "lint-file":
|
|
22
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiFileCode.UiFileCode, className: "shrink-0 text-muted-foreground" });
|
|
23
|
+
case "lint-rule":
|
|
24
|
+
case "lint-rule-group":
|
|
25
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiTag.UiTag, className: "shrink-0 text-muted-foreground" });
|
|
26
|
+
case "linter-error":
|
|
27
|
+
return /* @__PURE__ */ jsxRuntime.jsx(MarkIcons.LintSeverityIcon, { severity: "error" });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function LintTreeNode({ node, selected }) {
|
|
31
|
+
var _a;
|
|
32
|
+
const count = node.kind === "linter-error" ? 0 : stats.lintNodeCount(node);
|
|
33
|
+
const failedToRun = node.kind === "linter" && ((_a = node.children) == null ? void 0 : _a.some((c) => c.kind === "linter-error"));
|
|
34
|
+
const note = node.skipped ? node.message : failedToRun ? "failed to run" : void 0;
|
|
35
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
36
|
+
/* @__PURE__ */ jsxRuntime.jsx(NodeIcon, { node }),
|
|
37
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
38
|
+
"span",
|
|
39
|
+
{
|
|
40
|
+
className: utils.cn(
|
|
41
|
+
"min-w-0 truncate",
|
|
42
|
+
selected ? "font-semibold" : "font-medium",
|
|
43
|
+
node.kind === "linter-error" ? "text-red-600 dark:text-red-400" : "text-foreground",
|
|
44
|
+
node.skipped && "text-muted-foreground"
|
|
45
|
+
),
|
|
46
|
+
title: node.name,
|
|
47
|
+
children: node.name
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1" }),
|
|
51
|
+
note && /* @__PURE__ */ jsxRuntime.jsx(
|
|
52
|
+
"span",
|
|
53
|
+
{
|
|
54
|
+
className: utils.cn(
|
|
55
|
+
"min-w-0 shrink-[100] truncate text-xs",
|
|
56
|
+
failedToRun ? "text-red-600 dark:text-red-400" : "text-muted-foreground"
|
|
57
|
+
),
|
|
58
|
+
title: note,
|
|
59
|
+
children: note
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
count > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0", title: `${count} violation${count === 1 ? "" : "s"}`, children: /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { tone: COUNT_TONE[stats.lintNodeSeverity(node)], variant: "solid", size: "xxs", count }) })
|
|
63
|
+
] });
|
|
64
|
+
}
|
|
65
|
+
exports.LintTreeNode = LintTreeNode;
|
|
66
|
+
//# sourceMappingURL=LintTreeNode.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LintTreeNode.cjs","sources":["../../../src/data/lint/LintTreeNode.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport { Badge } from \"../Badge\";\nimport { cn } from \"../../lib/utils\";\nimport { UiFileCode, UiFolder, UiTag, UiWrench } from \"../../icons\";\nimport { LintSeverityIcon, ToolIcon } from \"../test-runner/MarkIcons\";\nimport { toolMark } from \"../test-runner/marks\";\nimport { lintNodeCount, lintNodeSeverity } from \"./stats\";\nimport type { LintNode, LintSeverity } from \"./types\";\n\nconst COUNT_TONE = { error: \"danger\", warning: \"warning\", info: \"info\" } as const satisfies Record<\n LintSeverity,\n \"danger\" | \"warning\" | \"info\"\n>;\n\nfunction NodeIcon({ node }: { node: LintNode }) {\n switch (node.kind) {\n case \"linter\":\n return toolMark(node.linterName) ? (\n <ToolIcon tool={node.linterName} />\n ) : (\n <Icon icon={UiWrench} className=\"shrink-0 text-muted-foreground\" />\n );\n case \"lint-folder\":\n return <Icon icon={UiFolder} className=\"shrink-0 text-muted-foreground\" />;\n case \"lint-file\":\n return <Icon icon={UiFileCode} className=\"shrink-0 text-muted-foreground\" />;\n case \"lint-rule\":\n case \"lint-rule-group\":\n return <Icon icon={UiTag} className=\"shrink-0 text-muted-foreground\" />;\n case \"linter-error\":\n return <LintSeverityIcon severity=\"error\" />;\n }\n}\n\n/** One lint tree row: kind glyph, name, trailing note, and a violation count coloured by worst severity. */\nexport function LintTreeNode({ node, selected }: { node: LintNode; selected: boolean }) {\n const count = node.kind === \"linter-error\" ? 0 : lintNodeCount(node);\n const failedToRun = node.kind === \"linter\" && node.children?.some((c) => c.kind === \"linter-error\");\n const note = node.skipped ? node.message : failedToRun ? \"failed to run\" : undefined;\n return (\n <>\n <NodeIcon node={node} />\n <span\n className={cn(\n \"min-w-0 truncate\",\n selected ? \"font-semibold\" : \"font-medium\",\n node.kind === \"linter-error\" ? \"text-red-600 dark:text-red-400\" : \"text-foreground\",\n node.skipped && \"text-muted-foreground\",\n )}\n title={node.name}\n >\n {node.name}\n </span>\n <span className=\"flex-1\" />\n {note && (\n <span\n className={cn(\n \"min-w-0 shrink-[100] truncate text-xs\",\n failedToRun ? \"text-red-600 dark:text-red-400\" : \"text-muted-foreground\",\n )}\n title={note}\n >\n {note}\n </span>\n )}\n {count > 0 && (\n <span className=\"flex shrink-0\" title={`${count} violation${count === 1 ? \"\" : \"s\"}`}>\n <Badge tone={COUNT_TONE[lintNodeSeverity(node)]} variant=\"solid\" size=\"xxs\" count={count} />\n </span>\n )}\n </>\n );\n}\n"],"names":["toolMark","ToolIcon","jsx","Icon","UiWrench","UiFolder","UiFileCode","UiTag","LintSeverityIcon","lintNodeCount","jsxs","Fragment","cn","Badge","lintNodeSeverity"],"mappings":";;;;;;;;;;;;;AASA,MAAM,aAAa,EAAE,OAAO,UAAU,SAAS,WAAW,MAAM,OAAA;AAKhE,SAAS,SAAS,EAAE,QAA4B;AAC9C,UAAQ,KAAK,MAAA;AAAA,IACX,KAAK;AACH,aAAOA,MAAAA,SAAS,KAAK,UAAU,mCAC5BC,UAAAA,UAAA,EAAS,MAAM,KAAK,WAAA,CAAY,IAEjCC,2BAAAA,IAACC,WAAA,EAAK,MAAMC,mBAAU,WAAU,kCAAiC;AAAA,IAErE,KAAK;AACH,aAAOF,2BAAAA,IAACC,KAAAA,MAAA,EAAK,MAAME,SAAAA,UAAU,WAAU,kCAAiC;AAAA,IAC1E,KAAK;AACH,aAAOH,2BAAAA,IAACC,KAAAA,MAAA,EAAK,MAAMG,WAAAA,YAAY,WAAU,kCAAiC;AAAA,IAC5E,KAAK;AAAA,IACL,KAAK;AACH,aAAOJ,2BAAAA,IAACC,KAAAA,MAAA,EAAK,MAAMI,MAAAA,OAAO,WAAU,kCAAiC;AAAA,IACvE,KAAK;AACH,aAAOL,2BAAAA,IAACM,UAAAA,kBAAA,EAAiB,UAAS,QAAA,CAAQ;AAAA,EAAA;AAEhD;AAGO,SAAS,aAAa,EAAE,MAAM,YAAmD;;AACtF,QAAM,QAAQ,KAAK,SAAS,iBAAiB,IAAIC,MAAAA,cAAc,IAAI;AACnE,QAAM,cAAc,KAAK,SAAS,cAAY,UAAK,aAAL,mBAAe,KAAK,CAAC,MAAM,EAAE,SAAS;AACpF,QAAM,OAAO,KAAK,UAAU,KAAK,UAAU,cAAc,kBAAkB;AAC3E,SACEC,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,IAAAT,+BAAC,YAAS,MAAY;AAAA,IACtBA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWU,MAAAA;AAAAA,UACT;AAAA,UACA,WAAW,kBAAkB;AAAA,UAC7B,KAAK,SAAS,iBAAiB,mCAAmC;AAAA,UAClE,KAAK,WAAW;AAAA,QAAA;AAAA,QAElB,OAAO,KAAK;AAAA,QAEX,UAAA,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,IAERV,2BAAAA,IAAC,QAAA,EAAK,WAAU,SAAA,CAAS;AAAA,IACxB,QACCA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWU,MAAAA;AAAAA,UACT;AAAA,UACA,cAAc,mCAAmC;AAAA,QAAA;AAAA,QAEnD,OAAO;AAAA,QAEN,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGJ,QAAQ,KACPV,2BAAAA,IAAC,QAAA,EAAK,WAAU,iBAAgB,OAAO,GAAG,KAAK,aAAa,UAAU,IAAI,KAAK,GAAG,IAChF,UAAAA,2BAAAA,IAACW,MAAAA,OAAA,EAAM,MAAM,WAAWC,MAAAA,iBAAiB,IAAI,CAAC,GAAG,SAAQ,SAAQ,MAAK,OAAM,MAAA,CAAc,EAAA,CAC5F;AAAA,EAAA,GAEJ;AAEJ;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { LintNode } from './types.js';
|
|
2
|
+
/** One lint tree row: kind glyph, name, trailing note, and a violation count coloured by worst severity. */
|
|
3
|
+
export declare function LintTreeNode({ node, selected }: {
|
|
4
|
+
node: LintNode;
|
|
5
|
+
selected: boolean;
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=LintTreeNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LintTreeNode.d.ts","sourceRoot":"","sources":["../../../src/data/lint/LintTreeNode.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,SAAS,CAAC;AA2BtD,4GAA4G;AAC5G,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,+BAqCrF"}
|