@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,450 @@
|
|
|
1
|
+
import { matchesFilterState } from "../test-runner/filterState.js";
|
|
2
|
+
import { slugify } from "../test-runner/routePath.js";
|
|
3
|
+
import { normalizeLintPath, relPath, decorateLintFile, collapsedPathSegments } from "./paths.js";
|
|
4
|
+
import { isLinterErrored, linterErrorMessage, severityOf, worstSeverity } from "./stats.js";
|
|
5
|
+
const NO_RULE = "(no rule)";
|
|
6
|
+
const SUMMARY_FILE_LIMIT = 5;
|
|
7
|
+
function ruleKeyFor(v) {
|
|
8
|
+
var _a;
|
|
9
|
+
return ((_a = v.rule) == null ? void 0 : _a.method) || NO_RULE;
|
|
10
|
+
}
|
|
11
|
+
function byLine(violations) {
|
|
12
|
+
return violations.slice().sort((a, b) => (a.line ?? 0) - (b.line ?? 0));
|
|
13
|
+
}
|
|
14
|
+
function firstLine(s) {
|
|
15
|
+
const idx = s.indexOf("\n");
|
|
16
|
+
return idx === -1 ? s : s.slice(0, idx);
|
|
17
|
+
}
|
|
18
|
+
function groupBy(items, key) {
|
|
19
|
+
const out = /* @__PURE__ */ new Map();
|
|
20
|
+
for (const item of items) {
|
|
21
|
+
const list = out.get(key(item));
|
|
22
|
+
if (list) list.push(item);
|
|
23
|
+
else out.set(key(item), [item]);
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
function sortedKeys(map) {
|
|
28
|
+
return Array.from(map.keys()).sort();
|
|
29
|
+
}
|
|
30
|
+
function flattenLint(results, filters) {
|
|
31
|
+
const visible = results.filter((r) => matchesFilterState(r.linter, filters.linter));
|
|
32
|
+
const multiRoot = new Set(visible.flatMap((r) => r.work_dir ? [normalizeLintPath(r.work_dir)] : [])).size > 1;
|
|
33
|
+
const out = [];
|
|
34
|
+
for (const result of visible) {
|
|
35
|
+
for (const v of result.violations ?? []) {
|
|
36
|
+
if (!matchesFilterState(severityOf(v), filters.severity)) continue;
|
|
37
|
+
const rawFile = relPath(v.file, result.work_dir);
|
|
38
|
+
const file = decorateLintFile(rawFile, result.work_dir, multiRoot);
|
|
39
|
+
out.push({
|
|
40
|
+
linter: result.linter,
|
|
41
|
+
result,
|
|
42
|
+
v: { ...v, raw_file: rawFile, file },
|
|
43
|
+
file,
|
|
44
|
+
rawFile,
|
|
45
|
+
workDir: result.work_dir
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
function linterMetaOf(results) {
|
|
52
|
+
const meta = /* @__PURE__ */ new Map();
|
|
53
|
+
for (const r of results) if (!meta.has(r.linter)) meta.set(r.linter, r);
|
|
54
|
+
return meta;
|
|
55
|
+
}
|
|
56
|
+
function newTrie() {
|
|
57
|
+
return { name: "", path: void 0, rawPath: "", folders: /* @__PURE__ */ new Map(), leaves: /* @__PURE__ */ new Map() };
|
|
58
|
+
}
|
|
59
|
+
function trieLeaf(root, file, rawFile, create) {
|
|
60
|
+
const segments = collapsedPathSegments(file);
|
|
61
|
+
const rawSegments = collapsedPathSegments(rawFile);
|
|
62
|
+
if (segments.length === 0 || rawSegments.length === 0) {
|
|
63
|
+
throw new Error(`lint: cannot place violation, empty path (file=${JSON.stringify(file)}, raw=${JSON.stringify(rawFile)})`);
|
|
64
|
+
}
|
|
65
|
+
const folderSegments = segments.slice(0, -1);
|
|
66
|
+
const rawFolderSegments = rawSegments.slice(0, -1);
|
|
67
|
+
const rawOffset = folderSegments.length - rawFolderSegments.length;
|
|
68
|
+
let current = root;
|
|
69
|
+
folderSegments.forEach((segment, i) => {
|
|
70
|
+
let child = current.folders.get(segment);
|
|
71
|
+
if (!child) {
|
|
72
|
+
const rawCount = Math.max(0, Math.min(rawFolderSegments.length, i + 1 - rawOffset));
|
|
73
|
+
child = {
|
|
74
|
+
name: segment,
|
|
75
|
+
path: current.path ? `${current.path}/${segment}` : segment,
|
|
76
|
+
rawPath: rawFolderSegments.slice(0, rawCount).join("/"),
|
|
77
|
+
folders: /* @__PURE__ */ new Map(),
|
|
78
|
+
leaves: /* @__PURE__ */ new Map()
|
|
79
|
+
};
|
|
80
|
+
current.folders.set(segment, child);
|
|
81
|
+
}
|
|
82
|
+
current = child;
|
|
83
|
+
});
|
|
84
|
+
const basename = segments[segments.length - 1];
|
|
85
|
+
let leaf = current.leaves.get(basename);
|
|
86
|
+
if (!leaf) {
|
|
87
|
+
leaf = create();
|
|
88
|
+
current.leaves.set(basename, leaf);
|
|
89
|
+
}
|
|
90
|
+
return leaf;
|
|
91
|
+
}
|
|
92
|
+
function container(name, kind, children) {
|
|
93
|
+
const failed = children.some((c) => c.failed);
|
|
94
|
+
return { name, kind, children, failed, passed: !failed, skipped: false };
|
|
95
|
+
}
|
|
96
|
+
function uniqueWorkDir(children) {
|
|
97
|
+
const dirs = new Set(children.flatMap((c) => c.work_dir ? [c.work_dir] : []));
|
|
98
|
+
return dirs.size === 1 ? Array.from(dirs)[0] : void 0;
|
|
99
|
+
}
|
|
100
|
+
function withNoFileViolations(node, noFile) {
|
|
101
|
+
if (noFile.length === 0) return node;
|
|
102
|
+
const failed = node.failed || worstSeverity(noFile) !== "info";
|
|
103
|
+
return { ...node, noFileViolations: byLine(noFile), failed, passed: !failed };
|
|
104
|
+
}
|
|
105
|
+
function violationLeaf(args) {
|
|
106
|
+
const failed = worstSeverity(args.violations) !== "info";
|
|
107
|
+
return {
|
|
108
|
+
name: args.name,
|
|
109
|
+
kind: args.kind,
|
|
110
|
+
file: args.file,
|
|
111
|
+
target_path: args.rawFile,
|
|
112
|
+
work_dir: args.workDir,
|
|
113
|
+
linterName: args.linterName,
|
|
114
|
+
violations: byLine(args.violations),
|
|
115
|
+
failed,
|
|
116
|
+
passed: !failed,
|
|
117
|
+
skipped: false
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function linterNode(linterName, result, children, noFile = []) {
|
|
121
|
+
return withNoFileViolations({ ...container(linterName, "linter", children), linter: result, linterName }, noFile);
|
|
122
|
+
}
|
|
123
|
+
function linterErrorNode(result) {
|
|
124
|
+
const message = linterErrorMessage(result);
|
|
125
|
+
return {
|
|
126
|
+
name: firstLine(message),
|
|
127
|
+
kind: "linter-error",
|
|
128
|
+
linterName: result.linter,
|
|
129
|
+
linter: result,
|
|
130
|
+
work_dir: result.work_dir,
|
|
131
|
+
failed: true,
|
|
132
|
+
passed: false,
|
|
133
|
+
skipped: false,
|
|
134
|
+
message
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function fileNodes(trie, linterName, ruleName) {
|
|
138
|
+
const folders = sortedKeys(trie.folders).map((key) => {
|
|
139
|
+
const folder = trie.folders.get(key);
|
|
140
|
+
const node = container(folder.name, "lint-folder", fileNodes(folder, linterName, ruleName));
|
|
141
|
+
return {
|
|
142
|
+
...node,
|
|
143
|
+
file: folder.path,
|
|
144
|
+
target_path: folder.rawPath,
|
|
145
|
+
linterName,
|
|
146
|
+
...ruleName ? { ruleName } : {},
|
|
147
|
+
work_dir: uniqueWorkDir(node.children)
|
|
148
|
+
};
|
|
149
|
+
});
|
|
150
|
+
const files = sortedKeys(trie.leaves).map((key) => {
|
|
151
|
+
const bucket = trie.leaves.get(key);
|
|
152
|
+
const fullPath = trie.path ? `${trie.path}/${key}` : key;
|
|
153
|
+
const leaf = violationLeaf({
|
|
154
|
+
name: key,
|
|
155
|
+
kind: "lint-file",
|
|
156
|
+
file: fullPath,
|
|
157
|
+
rawFile: bucket.rawFile,
|
|
158
|
+
linterName,
|
|
159
|
+
violations: bucket.violations,
|
|
160
|
+
workDir: bucket.workDir
|
|
161
|
+
});
|
|
162
|
+
return ruleName ? { ...leaf, ruleName } : leaf;
|
|
163
|
+
});
|
|
164
|
+
return [...folders, ...files];
|
|
165
|
+
}
|
|
166
|
+
function fileLinterNodes(trie, linterMeta) {
|
|
167
|
+
const folders = sortedKeys(trie.folders).map((key) => {
|
|
168
|
+
const folder = trie.folders.get(key);
|
|
169
|
+
const node = container(folder.name, "lint-folder", fileLinterNodes(folder, linterMeta));
|
|
170
|
+
return { ...node, file: folder.path, target_path: folder.rawPath, work_dir: uniqueWorkDir(node.children) };
|
|
171
|
+
});
|
|
172
|
+
const files = sortedKeys(trie.leaves).map((key) => {
|
|
173
|
+
var _a;
|
|
174
|
+
const linters = trie.leaves.get(key);
|
|
175
|
+
const fullPath = trie.path ? `${trie.path}/${key}` : key;
|
|
176
|
+
const linterDrafts = sortedKeys(linters).map((linterName) => {
|
|
177
|
+
var _a2;
|
|
178
|
+
const { workDir, rules } = linters.get(linterName);
|
|
179
|
+
const ruleLeaves = sortedKeys(rules).map((rule) => {
|
|
180
|
+
var _a3;
|
|
181
|
+
const violations = rules.get(rule);
|
|
182
|
+
return {
|
|
183
|
+
...violationLeaf({
|
|
184
|
+
name: rule,
|
|
185
|
+
kind: "lint-rule",
|
|
186
|
+
file: fullPath,
|
|
187
|
+
rawFile: ((_a3 = violations[0]) == null ? void 0 : _a3.raw_file) ?? fullPath,
|
|
188
|
+
linterName,
|
|
189
|
+
violations,
|
|
190
|
+
workDir
|
|
191
|
+
}),
|
|
192
|
+
ruleName: rule
|
|
193
|
+
};
|
|
194
|
+
});
|
|
195
|
+
return {
|
|
196
|
+
...linterNode(linterName, linterMeta.get(linterName), ruleLeaves),
|
|
197
|
+
file: fullPath,
|
|
198
|
+
target_path: (_a2 = ruleLeaves[0]) == null ? void 0 : _a2.target_path,
|
|
199
|
+
work_dir: workDir
|
|
200
|
+
};
|
|
201
|
+
});
|
|
202
|
+
return {
|
|
203
|
+
...container(key, "lint-file", linterDrafts),
|
|
204
|
+
file: fullPath,
|
|
205
|
+
target_path: (_a = linterDrafts[0]) == null ? void 0 : _a.target_path,
|
|
206
|
+
work_dir: uniqueWorkDir(linterDrafts)
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
return [...folders, ...files];
|
|
210
|
+
}
|
|
211
|
+
function fileTrieFor(flat) {
|
|
212
|
+
const trie = newTrie();
|
|
213
|
+
for (const f of flat) {
|
|
214
|
+
if (!f.file) continue;
|
|
215
|
+
trieLeaf(trie, f.file, f.rawFile ?? f.file, () => ({
|
|
216
|
+
rawFile: f.rawFile ?? f.file,
|
|
217
|
+
workDir: f.workDir,
|
|
218
|
+
violations: []
|
|
219
|
+
})).violations.push(f.v);
|
|
220
|
+
}
|
|
221
|
+
return trie;
|
|
222
|
+
}
|
|
223
|
+
function groupByLinterRuleFile(results, filters) {
|
|
224
|
+
const meta = linterMetaOf(results);
|
|
225
|
+
const byLinter = groupBy(flattenLint(results, filters), (f) => f.linter);
|
|
226
|
+
return Array.from(byLinter.keys()).sort().map((linterName) => {
|
|
227
|
+
const byRule = groupBy(byLinter.get(linterName), (f) => ruleKeyFor(f.v));
|
|
228
|
+
const ruleNodes = Array.from(byRule.keys()).sort().map((rule) => {
|
|
229
|
+
var _a;
|
|
230
|
+
const flats = byRule.get(rule);
|
|
231
|
+
const children = fileNodes(fileTrieFor(flats), linterName, rule);
|
|
232
|
+
const node = container(rule, "lint-rule-group", children);
|
|
233
|
+
return withNoFileViolations(
|
|
234
|
+
{
|
|
235
|
+
...node,
|
|
236
|
+
linterName,
|
|
237
|
+
ruleName: rule,
|
|
238
|
+
work_dir: uniqueWorkDir(children) ?? ((_a = meta.get(linterName)) == null ? void 0 : _a.work_dir)
|
|
239
|
+
},
|
|
240
|
+
flats.filter((f) => !f.file).map((f) => f.v)
|
|
241
|
+
);
|
|
242
|
+
});
|
|
243
|
+
return linterNode(linterName, meta.get(linterName), ruleNodes);
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
function groupByLinterFile(results, filters) {
|
|
247
|
+
const meta = linterMetaOf(results);
|
|
248
|
+
const byLinter = groupBy(flattenLint(results, filters), (f) => f.linter);
|
|
249
|
+
return Array.from(byLinter.keys()).sort().map((linterName) => {
|
|
250
|
+
const flats = byLinter.get(linterName);
|
|
251
|
+
return linterNode(
|
|
252
|
+
linterName,
|
|
253
|
+
meta.get(linterName),
|
|
254
|
+
fileNodes(fileTrieFor(flats), linterName),
|
|
255
|
+
flats.filter((f) => !f.file).map((f) => f.v)
|
|
256
|
+
);
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
function groupByFileLinterRule(results, filters) {
|
|
260
|
+
const meta = linterMetaOf(results);
|
|
261
|
+
const flat = flattenLint(results, filters);
|
|
262
|
+
const trie = newTrie();
|
|
263
|
+
for (const f of flat) {
|
|
264
|
+
if (!f.file) continue;
|
|
265
|
+
const linters = trieLeaf(trie, f.file, f.rawFile ?? f.file, () => /* @__PURE__ */ new Map());
|
|
266
|
+
let entry = linters.get(f.linter);
|
|
267
|
+
if (!entry) {
|
|
268
|
+
entry = { workDir: f.workDir, rules: /* @__PURE__ */ new Map() };
|
|
269
|
+
linters.set(f.linter, entry);
|
|
270
|
+
}
|
|
271
|
+
const rule = ruleKeyFor(f.v);
|
|
272
|
+
entry.rules.set(rule, [...entry.rules.get(rule) ?? [], f.v]);
|
|
273
|
+
}
|
|
274
|
+
const fileless = groupBy(flat.filter((f) => !f.file), (f) => f.linter);
|
|
275
|
+
const filelessNodes = Array.from(fileless.keys()).sort().map((linterName) => {
|
|
276
|
+
var _a;
|
|
277
|
+
const byRule = groupBy(fileless.get(linterName), (f) => ruleKeyFor(f.v));
|
|
278
|
+
const workDir = (_a = meta.get(linterName)) == null ? void 0 : _a.work_dir;
|
|
279
|
+
const leaves = Array.from(byRule.keys()).sort().map((rule) => ({
|
|
280
|
+
...violationLeaf({
|
|
281
|
+
name: rule,
|
|
282
|
+
kind: "lint-rule",
|
|
283
|
+
file: "",
|
|
284
|
+
rawFile: "",
|
|
285
|
+
linterName,
|
|
286
|
+
violations: byRule.get(rule).map((f) => f.v),
|
|
287
|
+
workDir
|
|
288
|
+
}),
|
|
289
|
+
ruleName: rule,
|
|
290
|
+
file: void 0,
|
|
291
|
+
target_path: void 0
|
|
292
|
+
}));
|
|
293
|
+
return linterNode(linterName, meta.get(linterName), leaves);
|
|
294
|
+
});
|
|
295
|
+
return [...fileLinterNodes(trie, meta), ...filelessNodes];
|
|
296
|
+
}
|
|
297
|
+
function summaryFileLabel(file, violations) {
|
|
298
|
+
if (!file) return "(no file)";
|
|
299
|
+
if (violations.length > 1) return `${file} (${violations.length})`;
|
|
300
|
+
const v = violations[0];
|
|
301
|
+
if (v == null ? void 0 : v.line) return v.column ? `${file}:${v.line}:${v.column}` : `${file}:${v.line}`;
|
|
302
|
+
return file;
|
|
303
|
+
}
|
|
304
|
+
function summaryRuleNode(rule, linterName, flats) {
|
|
305
|
+
var _a;
|
|
306
|
+
const byFile = groupBy(flats, (f) => f.file ?? "");
|
|
307
|
+
const keys = Array.from(byFile.keys());
|
|
308
|
+
const files = keys.slice(0, SUMMARY_FILE_LIMIT).map((key) => {
|
|
309
|
+
const group = byFile.get(key);
|
|
310
|
+
return {
|
|
311
|
+
...violationLeaf({
|
|
312
|
+
name: summaryFileLabel(group[0].file, group.map((f) => f.v)),
|
|
313
|
+
kind: "lint-file",
|
|
314
|
+
file: group[0].file ?? "",
|
|
315
|
+
rawFile: group[0].rawFile ?? "",
|
|
316
|
+
linterName,
|
|
317
|
+
violations: group.map((f) => f.v),
|
|
318
|
+
workDir: group[0].workDir
|
|
319
|
+
}),
|
|
320
|
+
file: group[0].file,
|
|
321
|
+
target_path: group[0].rawFile,
|
|
322
|
+
ruleName: rule
|
|
323
|
+
};
|
|
324
|
+
});
|
|
325
|
+
const remaining = keys.length - files.length;
|
|
326
|
+
if (remaining > 0) {
|
|
327
|
+
files.push({
|
|
328
|
+
name: `… ${remaining} more file${remaining === 1 ? "" : "s"}`,
|
|
329
|
+
kind: "lint-file",
|
|
330
|
+
linterName,
|
|
331
|
+
ruleName: rule,
|
|
332
|
+
failed: false,
|
|
333
|
+
passed: true,
|
|
334
|
+
skipped: false
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
const firstMessage = (_a = flats.find((f) => f.v.message)) == null ? void 0 : _a.v.message;
|
|
338
|
+
const name = firstMessage ? `${rule} (${flats.length}) — ${firstMessage}` : `${rule} (${flats.length})`;
|
|
339
|
+
return { ...container(name, "lint-rule-group", files), linterName, ruleName: rule };
|
|
340
|
+
}
|
|
341
|
+
function groupBySummary(results, filters) {
|
|
342
|
+
const meta = linterMetaOf(results);
|
|
343
|
+
const flatByLinter = groupBy(flattenLint(results, filters), (f) => f.linter);
|
|
344
|
+
const visible = results.filter((r) => matchesFilterState(r.linter, filters.linter));
|
|
345
|
+
const skipped = new Map(visible.filter((r) => r.skipped).map((r) => [r.linter, r.error || "skipped"]));
|
|
346
|
+
return Array.from(new Set(visible.map((r) => r.linter))).sort().map((linterName) => {
|
|
347
|
+
const flats = flatByLinter.get(linterName) ?? [];
|
|
348
|
+
if (flats.length === 0 && skipped.has(linterName)) {
|
|
349
|
+
return {
|
|
350
|
+
name: linterName,
|
|
351
|
+
kind: "linter",
|
|
352
|
+
linter: meta.get(linterName),
|
|
353
|
+
linterName,
|
|
354
|
+
skipped: true,
|
|
355
|
+
passed: false,
|
|
356
|
+
failed: false,
|
|
357
|
+
message: `skipped: ${skipped.get(linterName)}`
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
const byRule = groupBy(flats, (f) => ruleKeyFor(f.v));
|
|
361
|
+
const ruleOrder = Array.from(byRule.keys()).sort(
|
|
362
|
+
(a, b) => byRule.get(b).length - byRule.get(a).length || a.localeCompare(b)
|
|
363
|
+
);
|
|
364
|
+
return linterNode(
|
|
365
|
+
linterName,
|
|
366
|
+
meta.get(linterName),
|
|
367
|
+
ruleOrder.map((rule) => summaryRuleNode(rule, linterName, byRule.get(rule)))
|
|
368
|
+
);
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
function withLinterErrors(roots, results, filters) {
|
|
372
|
+
const errors = groupBy(
|
|
373
|
+
results.filter((r) => isLinterErrored(r) && matchesFilterState(r.linter, filters.linter)),
|
|
374
|
+
(r) => r.linter
|
|
375
|
+
);
|
|
376
|
+
if (errors.size === 0) return roots;
|
|
377
|
+
const linters = new Map(roots.filter((n) => n.kind === "linter").map((n) => [n.name, n]));
|
|
378
|
+
for (const [name, failed] of errors) {
|
|
379
|
+
const errorNodes = failed.map(linterErrorNode);
|
|
380
|
+
const existing = linters.get(name);
|
|
381
|
+
linters.set(
|
|
382
|
+
name,
|
|
383
|
+
existing ? { ...existing, children: [...errorNodes, ...existing.children ?? []], failed: true, passed: false } : linterNode(name, failed[0], errorNodes)
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
const others = roots.filter((n) => n.kind !== "linter");
|
|
387
|
+
return [...others, ...sortedKeys(linters).map((name) => linters.get(name))];
|
|
388
|
+
}
|
|
389
|
+
function joinChainNames(parent, child) {
|
|
390
|
+
const p = parent.trim();
|
|
391
|
+
const c = child.trim();
|
|
392
|
+
return p && c ? `${p} > ${c}` : p || c;
|
|
393
|
+
}
|
|
394
|
+
function collapseFolderChains(nodes) {
|
|
395
|
+
return nodes.map((node) => {
|
|
396
|
+
if (!node.children || node.children.length === 0) return node;
|
|
397
|
+
const children = collapseFolderChains(node.children);
|
|
398
|
+
if (children.length === 1 && node.kind === "lint-folder") {
|
|
399
|
+
const [child] = children;
|
|
400
|
+
return { ...child, name: joinChainNames(node.name, child.name) };
|
|
401
|
+
}
|
|
402
|
+
return { ...node, children };
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
function annotateRoutePaths(nodes, parentSegments = []) {
|
|
406
|
+
const slugs = nodes.map((n) => slugify(n.name));
|
|
407
|
+
const totals = groupBy(slugs, (s) => s);
|
|
408
|
+
const seen = /* @__PURE__ */ new Map();
|
|
409
|
+
return nodes.map((node, i) => {
|
|
410
|
+
const slug = slugs[i];
|
|
411
|
+
const ordinal = (seen.get(slug) ?? 0) + 1;
|
|
412
|
+
seen.set(slug, ordinal);
|
|
413
|
+
const segment = totals.get(slug).length > 1 ? `${slug}~${ordinal}` : slug;
|
|
414
|
+
const segments = [...parentSegments, segment];
|
|
415
|
+
const { children, ...rest } = node;
|
|
416
|
+
return {
|
|
417
|
+
...rest,
|
|
418
|
+
route_path: segments.join("/"),
|
|
419
|
+
...children ? { children: annotateRoutePaths(children, segments) } : {}
|
|
420
|
+
};
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
const GROUPERS = {
|
|
424
|
+
"linter-rule-file": groupByLinterRuleFile,
|
|
425
|
+
"linter-file": groupByLinterFile,
|
|
426
|
+
"file-linter-rule": groupByFileLinterRule,
|
|
427
|
+
summary: groupBySummary
|
|
428
|
+
};
|
|
429
|
+
function buildLintTree({
|
|
430
|
+
results,
|
|
431
|
+
grouping,
|
|
432
|
+
filters
|
|
433
|
+
}) {
|
|
434
|
+
const grouped = withLinterErrors(GROUPERS[grouping](results, filters), results, filters);
|
|
435
|
+
return annotateRoutePaths(grouping === "summary" ? grouped : collapseFolderChains(grouped));
|
|
436
|
+
}
|
|
437
|
+
function findLintNode(nodes, path) {
|
|
438
|
+
if (!path) return null;
|
|
439
|
+
for (const node of nodes) {
|
|
440
|
+
if (node.route_path === path) return node;
|
|
441
|
+
const found = node.children ? findLintNode(node.children, path) : null;
|
|
442
|
+
if (found) return found;
|
|
443
|
+
}
|
|
444
|
+
return null;
|
|
445
|
+
}
|
|
446
|
+
export {
|
|
447
|
+
buildLintTree,
|
|
448
|
+
findLintNode
|
|
449
|
+
};
|
|
450
|
+
//# sourceMappingURL=grouping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grouping.js","sources":["../../../src/data/lint/grouping.ts"],"sourcesContent":["// Turns raw linter results into the selectable tree for each grouping. Ported\n// from gavel's testrunner/ui utils.ts. Differences from the original:\n// - a linter that failed to run is shown under every grouping (gavel only\n// showed it in `summary`), so a broken linter never reads as a clean run;\n// - single-child folder chains are really collapsed (\"pkg > sub > a.go\");\n// gavel's collapser never fired because folder nodes always carry a\n// passed/failed flag;\n// - file-scoped rule leaves in `file-linter-rule` carry their work_dir, so\n// ignore actions on them are not sent without one.\n\nimport { matchesFilterState } from \"../test-runner/filterState\";\nimport { slugify } from \"../test-runner/routePath\";\nimport { collapsedPathSegments, decorateLintFile, normalizeLintPath, relPath } from \"./paths\";\nimport { isLinterErrored, linterErrorMessage, severityOf, worstSeverity } from \"./stats\";\nimport type {\n LintFilters,\n LintGrouping,\n LintNode,\n LinterResult,\n Violation,\n} from \"./types\";\n\ntype Draft = Omit<LintNode, \"route_path\" | \"children\"> & { children?: Draft[] };\n\ntype FlatViolation = {\n linter: string;\n result: LinterResult;\n v: Violation;\n file: string | undefined;\n rawFile: string | undefined;\n workDir: string | undefined;\n};\n\ntype FileBucket = { rawFile: string; workDir: string | undefined; violations: Violation[] };\n\ntype Trie<L> = {\n name: string;\n path: string | undefined;\n rawPath: string;\n folders: Map<string, Trie<L>>;\n leaves: Map<string, L>;\n};\n\nconst NO_RULE = \"(no rule)\";\nconst SUMMARY_FILE_LIMIT = 5;\n\nfunction ruleKeyFor(v: Violation): string {\n return v.rule?.method || NO_RULE;\n}\n\nfunction byLine(violations: readonly Violation[]): Violation[] {\n return violations.slice().sort((a, b) => (a.line ?? 0) - (b.line ?? 0));\n}\n\nfunction firstLine(s: string): string {\n const idx = s.indexOf(\"\\n\");\n return idx === -1 ? s : s.slice(0, idx);\n}\n\nfunction groupBy<T, K>(items: readonly T[], key: (item: T) => K): Map<K, T[]> {\n const out = new Map<K, T[]>();\n for (const item of items) {\n const list = out.get(key(item));\n if (list) list.push(item);\n else out.set(key(item), [item]);\n }\n return out;\n}\n\nfunction sortedKeys<V>(map: Map<string, V>): string[] {\n return Array.from(map.keys()).sort();\n}\n\n// ---------------------------------------------------------------------------\n// Flattening\n\nfunction flattenLint(results: readonly LinterResult[], filters: LintFilters): FlatViolation[] {\n const visible = results.filter((r) => matchesFilterState(r.linter, filters.linter));\n const multiRoot = new Set(visible.flatMap((r) => (r.work_dir ? [normalizeLintPath(r.work_dir)] : []))).size > 1;\n const out: FlatViolation[] = [];\n for (const result of visible) {\n for (const v of result.violations ?? []) {\n if (!matchesFilterState(severityOf(v), filters.severity)) continue;\n const rawFile = relPath(v.file, result.work_dir);\n const file = decorateLintFile(rawFile, result.work_dir, multiRoot);\n out.push({\n linter: result.linter,\n result,\n v: { ...v, raw_file: rawFile, file },\n file,\n rawFile,\n workDir: result.work_dir,\n });\n }\n }\n return out;\n}\n\nfunction linterMetaOf(results: readonly LinterResult[]): Map<string, LinterResult> {\n const meta = new Map<string, LinterResult>();\n for (const r of results) if (!meta.has(r.linter)) meta.set(r.linter, r);\n return meta;\n}\n\n// ---------------------------------------------------------------------------\n// Path trie\n\nfunction newTrie<L>(): Trie<L> {\n return { name: \"\", path: undefined, rawPath: \"\", folders: new Map(), leaves: new Map() };\n}\n\n/** The leaf for `file`, created through `create` on first sight; folders are made on the way. */\nfunction trieLeaf<L>(root: Trie<L>, file: string, rawFile: string, create: () => L): L {\n const segments = collapsedPathSegments(file);\n const rawSegments = collapsedPathSegments(rawFile);\n if (segments.length === 0 || rawSegments.length === 0) {\n throw new Error(`lint: cannot place violation, empty path (file=${JSON.stringify(file)}, raw=${JSON.stringify(rawFile)})`);\n }\n const folderSegments = segments.slice(0, -1);\n const rawFolderSegments = rawSegments.slice(0, -1);\n // The decorated path may carry extra leading segments (the work dir label)\n // that the raw, work_dir-relative path does not.\n const rawOffset = folderSegments.length - rawFolderSegments.length;\n let current = root;\n folderSegments.forEach((segment, i) => {\n let child = current.folders.get(segment);\n if (!child) {\n const rawCount = Math.max(0, Math.min(rawFolderSegments.length, i + 1 - rawOffset));\n child = {\n name: segment,\n path: current.path ? `${current.path}/${segment}` : segment,\n rawPath: rawFolderSegments.slice(0, rawCount).join(\"/\"),\n folders: new Map(),\n leaves: new Map(),\n };\n current.folders.set(segment, child);\n }\n current = child;\n });\n const basename = segments[segments.length - 1]!;\n let leaf = current.leaves.get(basename);\n if (!leaf) {\n leaf = create();\n current.leaves.set(basename, leaf);\n }\n return leaf;\n}\n\n// ---------------------------------------------------------------------------\n// Node builders\n\nfunction container(name: string, kind: Draft[\"kind\"], children: Draft[]): Draft {\n const failed = children.some((c) => c.failed);\n return { name, kind, children, failed, passed: !failed, skipped: false };\n}\n\nfunction uniqueWorkDir(children: readonly Draft[]): string | undefined {\n const dirs = new Set(children.flatMap((c) => (c.work_dir ? [c.work_dir] : [])));\n return dirs.size === 1 ? Array.from(dirs)[0] : undefined;\n}\n\nfunction withNoFileViolations(node: Draft, noFile: readonly Violation[]): Draft {\n if (noFile.length === 0) return node;\n const failed = node.failed || worstSeverity(noFile) !== \"info\";\n return { ...node, noFileViolations: byLine(noFile), failed, passed: !failed };\n}\n\nfunction violationLeaf(args: {\n name: string;\n kind: \"lint-file\" | \"lint-rule\";\n file: string;\n rawFile: string;\n linterName: string;\n violations: readonly Violation[];\n workDir: string | undefined;\n}): Draft {\n const failed = worstSeverity(args.violations) !== \"info\";\n return {\n name: args.name,\n kind: args.kind,\n file: args.file,\n target_path: args.rawFile,\n work_dir: args.workDir,\n linterName: args.linterName,\n violations: byLine(args.violations),\n failed,\n passed: !failed,\n skipped: false,\n };\n}\n\nfunction linterNode(\n linterName: string,\n result: LinterResult | undefined,\n children: Draft[],\n noFile: readonly Violation[] = [],\n): Draft {\n return withNoFileViolations({ ...container(linterName, \"linter\", children), linter: result, linterName }, noFile);\n}\n\nfunction linterErrorNode(result: LinterResult): Draft {\n const message = linterErrorMessage(result);\n return {\n name: firstLine(message),\n kind: \"linter-error\",\n linterName: result.linter,\n linter: result,\n work_dir: result.work_dir,\n failed: true,\n passed: false,\n skipped: false,\n message,\n };\n}\n\nfunction fileNodes(trie: Trie<FileBucket>, linterName: string, ruleName?: string): Draft[] {\n const folders = sortedKeys(trie.folders).map((key) => {\n const folder = trie.folders.get(key)!;\n const node = container(folder.name, \"lint-folder\", fileNodes(folder, linterName, ruleName));\n return {\n ...node,\n file: folder.path,\n target_path: folder.rawPath,\n linterName,\n ...(ruleName ? { ruleName } : {}),\n work_dir: uniqueWorkDir(node.children!),\n };\n });\n const files = sortedKeys(trie.leaves).map((key) => {\n const bucket = trie.leaves.get(key)!;\n const fullPath = trie.path ? `${trie.path}/${key}` : key;\n const leaf = violationLeaf({\n name: key,\n kind: \"lint-file\",\n file: fullPath,\n rawFile: bucket.rawFile,\n linterName,\n violations: bucket.violations,\n workDir: bucket.workDir,\n });\n return ruleName ? { ...leaf, ruleName } : leaf;\n });\n return [...folders, ...files];\n}\n\ntype FileLinters = Map<string, { workDir: string | undefined; rules: Map<string, Violation[]> }>;\n\nfunction fileLinterNodes(trie: Trie<FileLinters>, linterMeta: Map<string, LinterResult>): Draft[] {\n const folders = sortedKeys(trie.folders).map((key) => {\n const folder = trie.folders.get(key)!;\n const node = container(folder.name, \"lint-folder\", fileLinterNodes(folder, linterMeta));\n return { ...node, file: folder.path, target_path: folder.rawPath, work_dir: uniqueWorkDir(node.children!) };\n });\n const files = sortedKeys(trie.leaves).map((key) => {\n const linters = trie.leaves.get(key)!;\n const fullPath = trie.path ? `${trie.path}/${key}` : key;\n const linterDrafts = sortedKeys(linters).map((linterName) => {\n const { workDir, rules } = linters.get(linterName)!;\n const ruleLeaves = sortedKeys(rules).map((rule) => {\n const violations = rules.get(rule)!;\n return {\n ...violationLeaf({\n name: rule,\n kind: \"lint-rule\",\n file: fullPath,\n rawFile: violations[0]?.raw_file ?? fullPath,\n linterName,\n violations,\n workDir,\n }),\n ruleName: rule,\n };\n });\n return {\n ...linterNode(linterName, linterMeta.get(linterName), ruleLeaves),\n file: fullPath,\n target_path: ruleLeaves[0]?.target_path,\n work_dir: workDir,\n };\n });\n return {\n ...container(key, \"lint-file\", linterDrafts),\n file: fullPath,\n target_path: linterDrafts[0]?.target_path,\n work_dir: uniqueWorkDir(linterDrafts),\n };\n });\n return [...folders, ...files];\n}\n\n// ---------------------------------------------------------------------------\n// Groupings\n\nfunction fileTrieFor(flat: readonly FlatViolation[]): Trie<FileBucket> {\n const trie = newTrie<FileBucket>();\n for (const f of flat) {\n if (!f.file) continue;\n trieLeaf(trie, f.file, f.rawFile ?? f.file, () => ({\n rawFile: f.rawFile ?? f.file!,\n workDir: f.workDir,\n violations: [],\n })).violations.push(f.v);\n }\n return trie;\n}\n\nfunction groupByLinterRuleFile(results: readonly LinterResult[], filters: LintFilters): Draft[] {\n const meta = linterMetaOf(results);\n const byLinter = groupBy(flattenLint(results, filters), (f) => f.linter);\n return Array.from(byLinter.keys())\n .sort()\n .map((linterName) => {\n const byRule = groupBy(byLinter.get(linterName)!, (f) => ruleKeyFor(f.v));\n const ruleNodes = Array.from(byRule.keys())\n .sort()\n .map((rule) => {\n const flats = byRule.get(rule)!;\n const children = fileNodes(fileTrieFor(flats), linterName, rule);\n const node = container(rule, \"lint-rule-group\", children);\n return withNoFileViolations(\n {\n ...node,\n linterName,\n ruleName: rule,\n work_dir: uniqueWorkDir(children) ?? meta.get(linterName)?.work_dir,\n },\n flats.filter((f) => !f.file).map((f) => f.v),\n );\n });\n return linterNode(linterName, meta.get(linterName), ruleNodes);\n });\n}\n\nfunction groupByLinterFile(results: readonly LinterResult[], filters: LintFilters): Draft[] {\n const meta = linterMetaOf(results);\n const byLinter = groupBy(flattenLint(results, filters), (f) => f.linter);\n return Array.from(byLinter.keys())\n .sort()\n .map((linterName) => {\n const flats = byLinter.get(linterName)!;\n return linterNode(\n linterName,\n meta.get(linterName),\n fileNodes(fileTrieFor(flats), linterName),\n flats.filter((f) => !f.file).map((f) => f.v),\n );\n });\n}\n\nfunction groupByFileLinterRule(results: readonly LinterResult[], filters: LintFilters): Draft[] {\n const meta = linterMetaOf(results);\n const flat = flattenLint(results, filters);\n const trie = newTrie<FileLinters>();\n for (const f of flat) {\n if (!f.file) continue;\n const linters = trieLeaf(trie, f.file, f.rawFile ?? f.file, () => new Map());\n let entry = linters.get(f.linter);\n if (!entry) {\n entry = { workDir: f.workDir, rules: new Map() };\n linters.set(f.linter, entry);\n }\n const rule = ruleKeyFor(f.v);\n entry.rules.set(rule, [...(entry.rules.get(rule) ?? []), f.v]);\n }\n\n const fileless = groupBy(flat.filter((f) => !f.file), (f) => f.linter);\n const filelessNodes = Array.from(fileless.keys())\n .sort()\n .map((linterName) => {\n const byRule = groupBy(fileless.get(linterName)!, (f) => ruleKeyFor(f.v));\n const workDir = meta.get(linterName)?.work_dir;\n const leaves = Array.from(byRule.keys())\n .sort()\n .map((rule) => ({\n ...violationLeaf({\n name: rule,\n kind: \"lint-rule\",\n file: \"\",\n rawFile: \"\",\n linterName,\n violations: byRule.get(rule)!.map((f) => f.v),\n workDir,\n }),\n ruleName: rule,\n file: undefined,\n target_path: undefined,\n }));\n return linterNode(linterName, meta.get(linterName), leaves);\n });\n\n return [...fileLinterNodes(trie, meta), ...filelessNodes];\n}\n\nfunction summaryFileLabel(file: string | undefined, violations: readonly Violation[]): string {\n if (!file) return \"(no file)\";\n if (violations.length > 1) return `${file} (${violations.length})`;\n const v = violations[0];\n if (v?.line) return v.column ? `${file}:${v.line}:${v.column}` : `${file}:${v.line}`;\n return file;\n}\n\nfunction summaryRuleNode(rule: string, linterName: string, flats: readonly FlatViolation[]): Draft {\n const byFile = groupBy(flats, (f) => f.file ?? \"\");\n const keys = Array.from(byFile.keys());\n const files: Draft[] = keys.slice(0, SUMMARY_FILE_LIMIT).map((key) => {\n const group = byFile.get(key)!;\n return {\n ...violationLeaf({\n name: summaryFileLabel(group[0]!.file, group.map((f) => f.v)),\n kind: \"lint-file\",\n file: group[0]!.file ?? \"\",\n rawFile: group[0]!.rawFile ?? \"\",\n linterName,\n violations: group.map((f) => f.v),\n workDir: group[0]!.workDir,\n }),\n file: group[0]!.file,\n target_path: group[0]!.rawFile,\n ruleName: rule,\n };\n });\n const remaining = keys.length - files.length;\n if (remaining > 0) {\n files.push({\n name: `… ${remaining} more file${remaining === 1 ? \"\" : \"s\"}`,\n kind: \"lint-file\",\n linterName,\n ruleName: rule,\n failed: false,\n passed: true,\n skipped: false,\n });\n }\n const firstMessage = flats.find((f) => f.v.message)?.v.message;\n const name = firstMessage ? `${rule} (${flats.length}) — ${firstMessage}` : `${rule} (${flats.length})`;\n return { ...container(name, \"lint-rule-group\", files), linterName, ruleName: rule };\n}\n\nfunction groupBySummary(results: readonly LinterResult[], filters: LintFilters): Draft[] {\n const meta = linterMetaOf(results);\n const flatByLinter = groupBy(flattenLint(results, filters), (f) => f.linter);\n const visible = results.filter((r) => matchesFilterState(r.linter, filters.linter));\n const skipped = new Map(visible.filter((r) => r.skipped).map((r) => [r.linter, r.error || \"skipped\"]));\n // Like the CLI --summary: every linter that ran is listed, even a clean one.\n return Array.from(new Set(visible.map((r) => r.linter)))\n .sort()\n .map((linterName) => {\n const flats = flatByLinter.get(linterName) ?? [];\n if (flats.length === 0 && skipped.has(linterName)) {\n return {\n name: linterName,\n kind: \"linter\" as const,\n linter: meta.get(linterName),\n linterName,\n skipped: true,\n passed: false,\n failed: false,\n message: `skipped: ${skipped.get(linterName)}`,\n };\n }\n const byRule = groupBy(flats, (f) => ruleKeyFor(f.v));\n const ruleOrder = Array.from(byRule.keys()).sort(\n (a, b) => byRule.get(b)!.length - byRule.get(a)!.length || a.localeCompare(b),\n );\n return linterNode(\n linterName,\n meta.get(linterName),\n ruleOrder.map((rule) => summaryRuleNode(rule, linterName, byRule.get(rule)!)),\n );\n });\n}\n\n/** Linters that failed to run get an error leaf in every grouping, merged into an existing linter node. */\nfunction withLinterErrors(roots: Draft[], results: readonly LinterResult[], filters: LintFilters): Draft[] {\n const errors = groupBy(\n results.filter((r) => isLinterErrored(r) && matchesFilterState(r.linter, filters.linter)),\n (r) => r.linter,\n );\n if (errors.size === 0) return roots;\n const linters = new Map(roots.filter((n) => n.kind === \"linter\").map((n) => [n.name, n]));\n for (const [name, failed] of errors) {\n const errorNodes = failed.map(linterErrorNode);\n const existing = linters.get(name);\n linters.set(\n name,\n existing\n ? { ...existing, children: [...errorNodes, ...(existing.children ?? [])], failed: true, passed: false }\n : linterNode(name, failed[0], errorNodes),\n );\n }\n const others = roots.filter((n) => n.kind !== \"linter\");\n return [...others, ...sortedKeys(linters).map((name) => linters.get(name)!)];\n}\n\n// ---------------------------------------------------------------------------\n// Collapsing, route paths, lookup\n\nfunction joinChainNames(parent: string, child: string): string {\n const p = parent.trim();\n const c = child.trim();\n return p && c ? `${p} > ${c}` : p || c;\n}\n\n/** Folds a folder that has a single child into that child: `pkg > sub > a.go`. */\nfunction collapseFolderChains(nodes: Draft[]): Draft[] {\n return nodes.map((node) => {\n if (!node.children || node.children.length === 0) return node;\n const children = collapseFolderChains(node.children);\n if (children.length === 1 && node.kind === \"lint-folder\") {\n const [child] = children;\n return { ...child!, name: joinChainNames(node.name, child!.name) };\n }\n return { ...node, children };\n });\n}\n\n/** Stable, unique route path per node: slug segments joined by `/`, siblings with equal slugs get `~N`. */\nfunction annotateRoutePaths(nodes: Draft[], parentSegments: string[] = []): LintNode[] {\n const slugs = nodes.map((n) => slugify(n.name));\n const totals = groupBy(slugs, (s) => s);\n const seen = new Map<string, number>();\n return nodes.map((node, i) => {\n const slug = slugs[i]!;\n const ordinal = (seen.get(slug) ?? 0) + 1;\n seen.set(slug, ordinal);\n const segment = totals.get(slug)!.length > 1 ? `${slug}~${ordinal}` : slug;\n const segments = [...parentSegments, segment];\n const { children, ...rest } = node;\n return {\n ...rest,\n route_path: segments.join(\"/\"),\n ...(children ? { children: annotateRoutePaths(children, segments) } : {}),\n };\n });\n}\n\nconst GROUPERS: Record<LintGrouping, (results: readonly LinterResult[], filters: LintFilters) => Draft[]> = {\n \"linter-rule-file\": groupByLinterRuleFile,\n \"linter-file\": groupByLinterFile,\n \"file-linter-rule\": groupByFileLinterRule,\n summary: groupBySummary,\n};\n\n/** The tree for one grouping: filtered, with failed linters shown, ready for `Tree`. */\nexport function buildLintTree({\n results,\n grouping,\n filters,\n}: {\n results: readonly LinterResult[];\n grouping: LintGrouping;\n filters: LintFilters;\n}): LintNode[] {\n const grouped = withLinterErrors(GROUPERS[grouping](results, filters), results, filters);\n // Summary keeps its linter -> rule -> file branches as built.\n return annotateRoutePaths(grouping === \"summary\" ? grouped : collapseFolderChains(grouped));\n}\n\n/** Depth-first lookup of the node whose route_path equals `path`, or null. */\nexport function findLintNode(nodes: readonly LintNode[], path: string): LintNode | null {\n if (!path) return null;\n for (const node of nodes) {\n if (node.route_path === path) return node;\n const found = node.children ? findLintNode(node.children, path) : null;\n if (found) return found;\n }\n return null;\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { LintResults, type LintResultsProps } from './LintResults.js';
|
|
2
|
+
export { LintFilterBar, type LintFilterBarProps } from './LintFilterBar.js';
|
|
3
|
+
export { LintDetailPanel, type LintDetailPanelProps } from './LintDetail.js';
|
|
4
|
+
export { LintTreeNode } from './LintTreeNode.js';
|
|
5
|
+
export { LINT_GROUPING_OPTIONS } from './grouping-options.js';
|
|
6
|
+
export { buildLintTree, findLintNode } from './grouping.js';
|
|
7
|
+
export { collectLintLinters, countLintByLinter, countLintBySeverity, isLinterErrored, lintNodeCount, lintNodeSeverity, totalLintViolations, } from './stats.js';
|
|
8
|
+
export { collectFolderLintStats, folderPattern, lintFileActions, lintFolderActions, lintNodeActions, violationIgnoreAction, } from './actions.js';
|
|
9
|
+
export { DEFAULT_LINT_GROUPING, LINT_GROUPINGS, emptyLintFilters, type LintAction, type LintFilters, type LintGrouping, type LintIgnoreRequest, type LintNode, type LintNodeKind, type LinterResult, type Violation, } from './types.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/lint/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,SAAS,GACf,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
function normalizeLintPath(path) {
|
|
4
|
+
return path.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/\/$/, "");
|
|
5
|
+
}
|
|
6
|
+
function relPath(file, workDir) {
|
|
7
|
+
if (!file) return void 0;
|
|
8
|
+
const normalizedFile = normalizeLintPath(file);
|
|
9
|
+
if (!workDir) return normalizedFile;
|
|
10
|
+
const prefix = normalizeLintPath(workDir).replace(/\/?$/, "/");
|
|
11
|
+
return normalizedFile.startsWith(prefix) ? normalizedFile.slice(prefix.length) : normalizedFile;
|
|
12
|
+
}
|
|
13
|
+
function collapsedPathSegments(path) {
|
|
14
|
+
const parts = normalizeLintPath(path).split("/").filter(Boolean);
|
|
15
|
+
if (parts.length >= 3 && parts[0] === ".shell" && parts[1] === "checkout") {
|
|
16
|
+
return [`${parts[0]}/${parts[1]}/${parts[2]}`, ...parts.slice(3)];
|
|
17
|
+
}
|
|
18
|
+
return parts;
|
|
19
|
+
}
|
|
20
|
+
function workDirLabel(workDir) {
|
|
21
|
+
const parts = normalizeLintPath(workDir).split("/").filter(Boolean);
|
|
22
|
+
if (parts.length >= 2) return `${parts[parts.length - 2]}/${parts[parts.length - 1]}`;
|
|
23
|
+
if (parts.length === 1) return parts[0];
|
|
24
|
+
return normalizeLintPath(workDir);
|
|
25
|
+
}
|
|
26
|
+
function decorateLintFile(file, workDir, multiRoot) {
|
|
27
|
+
if (!file || !multiRoot || !workDir) return file;
|
|
28
|
+
return `${workDirLabel(workDir)}/${file}`;
|
|
29
|
+
}
|
|
30
|
+
exports.collapsedPathSegments = collapsedPathSegments;
|
|
31
|
+
exports.decorateLintFile = decorateLintFile;
|
|
32
|
+
exports.normalizeLintPath = normalizeLintPath;
|
|
33
|
+
exports.relPath = relPath;
|
|
34
|
+
exports.workDirLabel = workDirLabel;
|
|
35
|
+
//# sourceMappingURL=paths.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.cjs","sources":["../../../src/data/lint/paths.ts"],"sourcesContent":["// Path handling shared by the groupings and the ignore actions. Violations\n// report absolute paths; groupings and `.gavel.yaml` ignore patterns work on\n// paths relative to the linter's work_dir.\n\nexport function normalizeLintPath(path: string): string {\n return path.replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\").replace(/\\/$/, \"\");\n}\n\n/** `file` relative to `workDir` when it lives under it, else the normalised path. */\nexport function relPath(file: string | undefined, workDir: string | undefined): string | undefined {\n if (!file) return undefined;\n const normalizedFile = normalizeLintPath(file);\n if (!workDir) return normalizedFile;\n const prefix = normalizeLintPath(workDir).replace(/\\/?$/, \"/\");\n return normalizedFile.startsWith(prefix) ? normalizedFile.slice(prefix.length) : normalizedFile;\n}\n\n/**\n * Path segments of a file, with gavel's `.shell/checkout/<name>` working\n * checkout prefix kept as a single folder so it does not add two empty levels.\n */\nexport function collapsedPathSegments(path: string): string[] {\n const parts = normalizeLintPath(path).split(\"/\").filter(Boolean);\n if (parts.length >= 3 && parts[0] === \".shell\" && parts[1] === \"checkout\") {\n return [`${parts[0]}/${parts[1]}/${parts[2]}`, ...parts.slice(3)];\n }\n return parts;\n}\n\n/** The last two segments of a work dir, e.g. `/repo/gavel/web` -> `gavel/web`. */\nexport function workDirLabel(workDir: string): string {\n const parts = normalizeLintPath(workDir).split(\"/\").filter(Boolean);\n if (parts.length >= 2) return `${parts[parts.length - 2]}/${parts[parts.length - 1]}`;\n if (parts.length === 1) return parts[0]!;\n return normalizeLintPath(workDir);\n}\n\n/** Prefix a file with its work dir label when the results span several roots. */\nexport function decorateLintFile(\n file: string | undefined,\n workDir: string | undefined,\n multiRoot: boolean,\n): string | undefined {\n if (!file || !multiRoot || !workDir) return file;\n return `${workDirLabel(workDir)}/${file}`;\n}\n"],"names":[],"mappings":";;AAIO,SAAS,kBAAkB,MAAsB;AACtD,SAAO,KAAK,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,OAAO,EAAE;AACxE;AAGO,SAAS,QAAQ,MAA0B,SAAiD;AACjG,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,iBAAiB,kBAAkB,IAAI;AAC7C,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,SAAS,kBAAkB,OAAO,EAAE,QAAQ,QAAQ,GAAG;AAC7D,SAAO,eAAe,WAAW,MAAM,IAAI,eAAe,MAAM,OAAO,MAAM,IAAI;AACnF;AAMO,SAAS,sBAAsB,MAAwB;AAC5D,QAAM,QAAQ,kBAAkB,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/D,MAAI,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,MAAM,YAAY;AACzE,WAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC;AAAA,EAClE;AACA,SAAO;AACT;AAGO,SAAS,aAAa,SAAyB;AACpD,QAAM,QAAQ,kBAAkB,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAClE,MAAI,MAAM,UAAU,EAAG,QAAO,GAAG,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,MAAM,MAAM,SAAS,CAAC,CAAC;AACnF,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC;AACtC,SAAO,kBAAkB,OAAO;AAClC;AAGO,SAAS,iBACd,MACA,SACA,WACoB;AACpB,MAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAS,QAAO;AAC5C,SAAO,GAAG,aAAa,OAAO,CAAC,IAAI,IAAI;AACzC;;;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function normalizeLintPath(path: string): string;
|
|
2
|
+
/** `file` relative to `workDir` when it lives under it, else the normalised path. */
|
|
3
|
+
export declare function relPath(file: string | undefined, workDir: string | undefined): string | undefined;
|
|
4
|
+
/**
|
|
5
|
+
* Path segments of a file, with gavel's `.shell/checkout/<name>` working
|
|
6
|
+
* checkout prefix kept as a single folder so it does not add two empty levels.
|
|
7
|
+
*/
|
|
8
|
+
export declare function collapsedPathSegments(path: string): string[];
|
|
9
|
+
/** The last two segments of a work dir, e.g. `/repo/gavel/web` -> `gavel/web`. */
|
|
10
|
+
export declare function workDirLabel(workDir: string): string;
|
|
11
|
+
/** Prefix a file with its work dir label when the results span several roots. */
|
|
12
|
+
export declare function decorateLintFile(file: string | undefined, workDir: string | undefined, multiRoot: boolean): string | undefined;
|
|
13
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/data/lint/paths.ts"],"names":[],"mappings":"AAIA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAMjG;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM5D;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,SAAS,EAAE,OAAO,GACjB,MAAM,GAAG,SAAS,CAGpB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function normalizeLintPath(path) {
|
|
2
|
+
return path.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/\/$/, "");
|
|
3
|
+
}
|
|
4
|
+
function relPath(file, workDir) {
|
|
5
|
+
if (!file) return void 0;
|
|
6
|
+
const normalizedFile = normalizeLintPath(file);
|
|
7
|
+
if (!workDir) return normalizedFile;
|
|
8
|
+
const prefix = normalizeLintPath(workDir).replace(/\/?$/, "/");
|
|
9
|
+
return normalizedFile.startsWith(prefix) ? normalizedFile.slice(prefix.length) : normalizedFile;
|
|
10
|
+
}
|
|
11
|
+
function collapsedPathSegments(path) {
|
|
12
|
+
const parts = normalizeLintPath(path).split("/").filter(Boolean);
|
|
13
|
+
if (parts.length >= 3 && parts[0] === ".shell" && parts[1] === "checkout") {
|
|
14
|
+
return [`${parts[0]}/${parts[1]}/${parts[2]}`, ...parts.slice(3)];
|
|
15
|
+
}
|
|
16
|
+
return parts;
|
|
17
|
+
}
|
|
18
|
+
function workDirLabel(workDir) {
|
|
19
|
+
const parts = normalizeLintPath(workDir).split("/").filter(Boolean);
|
|
20
|
+
if (parts.length >= 2) return `${parts[parts.length - 2]}/${parts[parts.length - 1]}`;
|
|
21
|
+
if (parts.length === 1) return parts[0];
|
|
22
|
+
return normalizeLintPath(workDir);
|
|
23
|
+
}
|
|
24
|
+
function decorateLintFile(file, workDir, multiRoot) {
|
|
25
|
+
if (!file || !multiRoot || !workDir) return file;
|
|
26
|
+
return `${workDirLabel(workDir)}/${file}`;
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
collapsedPathSegments,
|
|
30
|
+
decorateLintFile,
|
|
31
|
+
normalizeLintPath,
|
|
32
|
+
relPath,
|
|
33
|
+
workDirLabel
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sources":["../../../src/data/lint/paths.ts"],"sourcesContent":["// Path handling shared by the groupings and the ignore actions. Violations\n// report absolute paths; groupings and `.gavel.yaml` ignore patterns work on\n// paths relative to the linter's work_dir.\n\nexport function normalizeLintPath(path: string): string {\n return path.replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\").replace(/\\/$/, \"\");\n}\n\n/** `file` relative to `workDir` when it lives under it, else the normalised path. */\nexport function relPath(file: string | undefined, workDir: string | undefined): string | undefined {\n if (!file) return undefined;\n const normalizedFile = normalizeLintPath(file);\n if (!workDir) return normalizedFile;\n const prefix = normalizeLintPath(workDir).replace(/\\/?$/, \"/\");\n return normalizedFile.startsWith(prefix) ? normalizedFile.slice(prefix.length) : normalizedFile;\n}\n\n/**\n * Path segments of a file, with gavel's `.shell/checkout/<name>` working\n * checkout prefix kept as a single folder so it does not add two empty levels.\n */\nexport function collapsedPathSegments(path: string): string[] {\n const parts = normalizeLintPath(path).split(\"/\").filter(Boolean);\n if (parts.length >= 3 && parts[0] === \".shell\" && parts[1] === \"checkout\") {\n return [`${parts[0]}/${parts[1]}/${parts[2]}`, ...parts.slice(3)];\n }\n return parts;\n}\n\n/** The last two segments of a work dir, e.g. `/repo/gavel/web` -> `gavel/web`. */\nexport function workDirLabel(workDir: string): string {\n const parts = normalizeLintPath(workDir).split(\"/\").filter(Boolean);\n if (parts.length >= 2) return `${parts[parts.length - 2]}/${parts[parts.length - 1]}`;\n if (parts.length === 1) return parts[0]!;\n return normalizeLintPath(workDir);\n}\n\n/** Prefix a file with its work dir label when the results span several roots. */\nexport function decorateLintFile(\n file: string | undefined,\n workDir: string | undefined,\n multiRoot: boolean,\n): string | undefined {\n if (!file || !multiRoot || !workDir) return file;\n return `${workDirLabel(workDir)}/${file}`;\n}\n"],"names":[],"mappings":"AAIO,SAAS,kBAAkB,MAAsB;AACtD,SAAO,KAAK,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,OAAO,EAAE;AACxE;AAGO,SAAS,QAAQ,MAA0B,SAAiD;AACjG,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,iBAAiB,kBAAkB,IAAI;AAC7C,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,SAAS,kBAAkB,OAAO,EAAE,QAAQ,QAAQ,GAAG;AAC7D,SAAO,eAAe,WAAW,MAAM,IAAI,eAAe,MAAM,OAAO,MAAM,IAAI;AACnF;AAMO,SAAS,sBAAsB,MAAwB;AAC5D,QAAM,QAAQ,kBAAkB,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/D,MAAI,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,MAAM,YAAY;AACzE,WAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC;AAAA,EAClE;AACA,SAAO;AACT;AAGO,SAAS,aAAa,SAAyB;AACpD,QAAM,QAAQ,kBAAkB,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAClE,MAAI,MAAM,UAAU,EAAG,QAAO,GAAG,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,MAAM,MAAM,SAAS,CAAC,CAAC;AACnF,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC;AACtC,SAAO,kBAAkB,OAAO;AAClC;AAGO,SAAS,iBACd,MACA,SACA,WACoB;AACpB,MAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAS,QAAO;AAC5C,SAAO,GAAG,aAAa,OAAO,CAAC,IAAI,IAAI;AACzC;"}
|