@flanksource/clicky-ui 0.1.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -2
- package/dist/api-explorer.d.ts +5 -0
- package/dist/api-explorer.d.ts.map +1 -0
- package/dist/api-explorer.js +25 -0
- package/dist/api-explorer.js.map +1 -0
- package/dist/clicky.d.ts +2 -0
- package/dist/clicky.d.ts.map +1 -0
- package/dist/clicky.js +5 -0
- package/dist/clicky.js.map +1 -0
- package/dist/components/DatePicker.d.ts +18 -0
- package/dist/components/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker.js +63 -0
- package/dist/components/DatePicker.js.map +1 -0
- package/dist/components/DateTimePicker.d.ts +18 -0
- package/dist/components/DateTimePicker.d.ts.map +1 -0
- package/dist/components/DateTimePicker.js +84 -0
- package/dist/components/DateTimePicker.js.map +1 -0
- package/dist/components/FilterBar.d.ts +180 -0
- package/dist/components/FilterBar.d.ts.map +1 -0
- package/dist/components/FilterBar.js +1685 -0
- package/dist/components/FilterBar.js.map +1 -0
- package/dist/components/MultiSelect.d.ts +19 -0
- package/dist/components/MultiSelect.d.ts.map +1 -0
- package/dist/components/MultiSelect.js +143 -0
- package/dist/components/MultiSelect.js.map +1 -0
- package/dist/components/RangeSlider.d.ts +16 -0
- package/dist/components/RangeSlider.d.ts.map +1 -0
- package/dist/components/RangeSlider.js +92 -0
- package/dist/components/RangeSlider.js.map +1 -0
- package/dist/components/button.d.ts +21 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +126 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/density-switcher.d.ts +7 -0
- package/dist/components/density-switcher.d.ts.map +1 -0
- package/dist/components/density-switcher.js +32 -0
- package/dist/components/density-switcher.js.map +1 -0
- package/dist/components/icon-menu-picker.d.ts +23 -0
- package/dist/components/icon-menu-picker.d.ts.map +1 -0
- package/dist/components/icon-menu-picker.js +192 -0
- package/dist/components/icon-menu-picker.js.map +1 -0
- package/dist/components/select.d.ts +15 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +39 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/theme-switcher.d.ts +7 -0
- package/dist/components/theme-switcher.d.ts.map +1 -0
- package/dist/components/theme-switcher.js +42 -0
- package/dist/components/theme-switcher.js.map +1 -0
- package/dist/components.d.ts +15 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +33 -0
- package/dist/components.js.map +1 -0
- package/dist/data/AnsiHtml.d.ts +7 -0
- package/dist/data/AnsiHtml.d.ts.map +1 -0
- package/dist/data/AnsiHtml.js +71 -0
- package/dist/data/AnsiHtml.js.map +1 -0
- package/dist/data/Avatar.d.ts +32 -0
- package/dist/data/Avatar.d.ts.map +1 -0
- package/dist/data/Avatar.js +201 -0
- package/dist/data/Avatar.js.map +1 -0
- package/dist/data/AvatarBadge.d.ts +26 -0
- package/dist/data/AvatarBadge.d.ts.map +1 -0
- package/dist/data/AvatarBadge.js +104 -0
- package/dist/data/AvatarBadge.js.map +1 -0
- package/dist/data/Badge.d.ts +44 -0
- package/dist/data/Badge.d.ts.map +1 -0
- package/dist/data/Badge.js +667 -0
- package/dist/data/Badge.js.map +1 -0
- package/dist/data/Clicky.d.ts +147 -0
- package/dist/data/Clicky.d.ts.map +1 -0
- package/dist/data/Clicky.fixtures.d.ts +3 -0
- package/dist/data/Clicky.fixtures.d.ts.map +1 -0
- package/dist/data/Clicky.js +1960 -0
- package/dist/data/Clicky.js.map +1 -0
- package/dist/data/DataTable.d.ts +95 -0
- package/dist/data/DataTable.d.ts.map +1 -0
- package/dist/data/DataTable.js +1464 -0
- package/dist/data/DataTable.js.map +1 -0
- package/dist/data/FilterPill.d.ts +29 -0
- package/dist/data/FilterPill.d.ts.map +1 -0
- package/dist/data/FilterPill.js +153 -0
- package/dist/data/FilterPill.js.map +1 -0
- package/dist/data/Gauge.d.ts +15 -0
- package/dist/data/Gauge.d.ts.map +1 -0
- package/dist/data/Gauge.js +63 -0
- package/dist/data/Gauge.js.map +1 -0
- package/dist/data/Icon.d.ts +53 -0
- package/dist/data/Icon.d.ts.map +1 -0
- package/dist/data/Icon.js +115 -0
- package/dist/data/Icon.js.map +1 -0
- package/dist/data/JsonView.d.ts +8 -0
- package/dist/data/JsonView.d.ts.map +1 -0
- package/dist/data/JsonView.js +74 -0
- package/dist/data/JsonView.js.map +1 -0
- package/dist/data/KeyValueList.d.ts +17 -0
- package/dist/data/KeyValueList.d.ts.map +1 -0
- package/dist/data/KeyValueList.js +33 -0
- package/dist/data/KeyValueList.js.map +1 -0
- package/dist/data/LogViewer.d.ts +10 -0
- package/dist/data/LogViewer.d.ts.map +1 -0
- package/dist/data/LogViewer.js +46 -0
- package/dist/data/LogViewer.js.map +1 -0
- package/dist/data/LogsTable.d.ts +27 -0
- package/dist/data/LogsTable.d.ts.map +1 -0
- package/dist/data/LogsTable.js +580 -0
- package/dist/data/LogsTable.js.map +1 -0
- package/dist/data/Markdown.d.ts +6 -0
- package/dist/data/Markdown.d.ts.map +1 -0
- package/dist/data/Markdown.js +59 -0
- package/dist/data/Markdown.js.map +1 -0
- package/dist/data/MatrixTable.d.ts +22 -0
- package/dist/data/MatrixTable.d.ts.map +1 -0
- package/dist/data/MatrixTable.js +164 -0
- package/dist/data/MatrixTable.js.map +1 -0
- package/dist/data/MethodBadge.d.ts +6 -0
- package/dist/data/MethodBadge.d.ts.map +1 -0
- package/dist/data/MethodBadge.js +18 -0
- package/dist/data/MethodBadge.js.map +1 -0
- package/dist/data/ProgressBar.d.ts +13 -0
- package/dist/data/ProgressBar.d.ts.map +1 -0
- package/dist/data/ProgressBar.js +34 -0
- package/dist/data/ProgressBar.js.map +1 -0
- package/dist/data/SortableHeader.d.ts +12 -0
- package/dist/data/SortableHeader.d.ts.map +1 -0
- package/dist/data/SortableHeader.js +33 -0
- package/dist/data/SortableHeader.js.map +1 -0
- package/dist/data/TabButton.d.ts +12 -0
- package/dist/data/TabButton.d.ts.map +1 -0
- package/dist/data/TabButton.js +45 -0
- package/dist/data/TabButton.js.map +1 -0
- package/dist/data/Tree.d.ts +35 -0
- package/dist/data/Tree.d.ts.map +1 -0
- package/dist/data/Tree.js +236 -0
- package/dist/data/Tree.js.map +1 -0
- package/dist/data/TreeGroupHeader.d.ts +11 -0
- package/dist/data/TreeGroupHeader.d.ts.map +1 -0
- package/dist/data/TreeGroupHeader.js +41 -0
- package/dist/data/TreeGroupHeader.js.map +1 -0
- package/dist/data/TreeNode.d.ts +43 -0
- package/dist/data/TreeNode.d.ts.map +1 -0
- package/dist/data/TreeNode.js +100 -0
- package/dist/data/TreeNode.js.map +1 -0
- package/dist/data/cells/StatusDot.d.ts +11 -0
- package/dist/data/cells/StatusDot.d.ts.map +1 -0
- package/dist/data/cells/StatusDot.js +38 -0
- package/dist/data/cells/StatusDot.js.map +1 -0
- package/dist/data/cells/TagList.d.ts +59 -0
- package/dist/data/cells/TagList.d.ts.map +1 -0
- package/dist/data/cells/TagList.js +257 -0
- package/dist/data/cells/TagList.js.map +1 -0
- package/dist/data/cells/Timestamp.d.ts +46 -0
- package/dist/data/cells/Timestamp.d.ts.map +1 -0
- package/dist/data/cells/Timestamp.js +146 -0
- package/dist/data/cells/Timestamp.js.map +1 -0
- package/dist/data/cells/status-mapping.d.ts +8 -0
- package/dist/data/cells/status-mapping.d.ts.map +1 -0
- package/dist/data/cells/status-mapping.js +44 -0
- package/dist/data/cells/status-mapping.js.map +1 -0
- package/dist/data/code-highlight.d.ts +12 -0
- package/dist/data/code-highlight.d.ts.map +1 -0
- package/dist/data/code-highlight.js +28 -0
- package/dist/data/code-highlight.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +9 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +445 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsTree.d.ts +9 -0
- package/dist/data/diagnostics/DiagnosticsTree.d.ts.map +1 -0
- package/dist/data/diagnostics/DiagnosticsTree.js +78 -0
- package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -0
- package/dist/data/diagnostics/ErrorDetails.d.ts +20 -0
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -0
- package/dist/data/diagnostics/ErrorDetails.js +157 -0
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -0
- package/dist/data/diagnostics/GoroutineCard.d.ts +10 -0
- package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -0
- package/dist/data/diagnostics/GoroutineCard.js +75 -0
- package/dist/data/diagnostics/GoroutineCard.js.map +1 -0
- package/dist/data/diagnostics/JvmStackTrace.d.ts +11 -0
- package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -0
- package/dist/data/diagnostics/JvmStackTrace.js +26 -0
- package/dist/data/diagnostics/JvmStackTrace.js.map +1 -0
- package/dist/data/diagnostics/RenderedStackTrace.d.ts +18 -0
- package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -0
- package/dist/data/diagnostics/RenderedStackTrace.js +235 -0
- package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -0
- package/dist/data/diagnostics/ThreadCard.d.ts +10 -0
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -0
- package/dist/data/diagnostics/ThreadCard.js +78 -0
- package/dist/data/diagnostics/ThreadCard.js.map +1 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts +26 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -0
- package/dist/data/diagnostics/error-diagnostics.js +108 -0
- package/dist/data/diagnostics/error-diagnostics.js.map +1 -0
- package/dist/data/diagnostics/fixtures.d.ts +3 -0
- package/dist/data/diagnostics/fixtures.d.ts.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.d.ts +34 -0
- package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.js +190 -0
- package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -0
- package/dist/data/diagnostics/stacktrace-parse.d.ts +11 -0
- package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -0
- package/dist/data/diagnostics/stacktrace-parse.js +87 -0
- package/dist/data/diagnostics/stacktrace-parse.js.map +1 -0
- package/dist/data/diagnostics/stacktrace.d.ts +38 -0
- package/dist/data/diagnostics/stacktrace.d.ts.map +1 -0
- package/dist/data/diagnostics/stacktrace.js +119 -0
- package/dist/data/diagnostics/stacktrace.js.map +1 -0
- package/dist/data/diagnostics/types.d.ts +30 -0
- package/dist/data/diagnostics/types.d.ts.map +1 -0
- package/dist/data/diagnostics/utils.d.ts +8 -0
- package/dist/data/diagnostics/utils.d.ts.map +1 -0
- package/dist/data/diagnostics/utils.js +59 -0
- package/dist/data/diagnostics/utils.js.map +1 -0
- package/dist/data/har/HarPanel.d.ts +9 -0
- package/dist/data/har/HarPanel.d.ts.map +1 -0
- package/dist/data/har/HarPanel.js +175 -0
- package/dist/data/har/HarPanel.js.map +1 -0
- package/dist/data/har/fixtures.d.ts +3 -0
- package/dist/data/har/fixtures.d.ts.map +1 -0
- package/dist/data/har/types.d.ts +47 -0
- package/dist/data/har/types.d.ts.map +1 -0
- package/dist/data.d.ts +39 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +109 -0
- package/dist/data.js.map +1 -0
- package/dist/hooks/use-density.d.ts +22 -0
- package/dist/hooks/use-density.d.ts.map +1 -0
- package/dist/hooks/use-density.js +54 -0
- package/dist/hooks/use-density.js.map +1 -0
- package/dist/hooks/use-history-route.d.ts +6 -0
- package/dist/hooks/use-history-route.d.ts.map +1 -0
- package/dist/hooks/use-history-route.js +31 -0
- package/dist/hooks/use-history-route.js.map +1 -0
- package/dist/hooks/use-sort.d.ts +17 -0
- package/dist/hooks/use-sort.d.ts.map +1 -0
- package/dist/hooks/use-sort.js +42 -0
- package/dist/hooks/use-sort.js.map +1 -0
- package/dist/hooks/use-theme.d.ts +17 -0
- package/dist/hooks/use-theme.d.ts.map +1 -0
- package/dist/hooks/use-theme.js +68 -0
- package/dist/hooks/use-theme.js.map +1 -0
- package/dist/hooks.d.ts +5 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +14 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +195 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/Section.d.ts +23 -0
- package/dist/layout/Section.d.ts.map +1 -0
- package/dist/layout/Section.js +73 -0
- package/dist/layout/Section.js.map +1 -0
- package/dist/layout/SplitPane.d.ts +13 -0
- package/dist/layout/SplitPane.d.ts.map +1 -0
- package/dist/layout/SplitPane.js +72 -0
- package/dist/layout/SplitPane.js.map +1 -0
- package/dist/lib/palette.d.ts +4 -0
- package/dist/lib/palette.d.ts.map +1 -0
- package/dist/lib/palette.js +35 -0
- package/dist/lib/palette.js.map +1 -0
- package/dist/lib/size.d.ts +6 -0
- package/dist/lib/size.d.ts.map +1 -0
- package/dist/lib/size.js +14 -0
- package/dist/lib/size.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/overlay/HoverCard.d.ts +13 -0
- package/dist/overlay/HoverCard.d.ts.map +1 -0
- package/dist/overlay/HoverCard.js +170 -0
- package/dist/overlay/HoverCard.js.map +1 -0
- package/dist/overlay/Modal.d.ts +17 -0
- package/dist/overlay/Modal.d.ts.map +1 -0
- package/dist/overlay/Modal.js +91 -0
- package/dist/overlay/Modal.js.map +1 -0
- package/dist/rpc/AcceptPicker.d.ts +52 -0
- package/dist/rpc/AcceptPicker.d.ts.map +1 -0
- package/dist/rpc/AcceptPicker.js +126 -0
- package/dist/rpc/AcceptPicker.js.map +1 -0
- package/dist/rpc/ApiExplorer.d.ts +11 -0
- package/dist/rpc/ApiExplorer.d.ts.map +1 -0
- package/dist/rpc/ApiExplorer.js +37 -0
- package/dist/rpc/ApiExplorer.js.map +1 -0
- package/dist/rpc/CommandForm.d.ts +15 -0
- package/dist/rpc/CommandForm.d.ts.map +1 -0
- package/dist/rpc/CommandForm.js +356 -0
- package/dist/rpc/CommandForm.js.map +1 -0
- package/dist/rpc/CommandOutput.d.ts +11 -0
- package/dist/rpc/CommandOutput.d.ts.map +1 -0
- package/dist/rpc/CommandOutput.js +195 -0
- package/dist/rpc/CommandOutput.js.map +1 -0
- package/dist/rpc/EndpointList.d.ts +18 -0
- package/dist/rpc/EndpointList.d.ts.map +1 -0
- package/dist/rpc/EndpointList.js +56 -0
- package/dist/rpc/EndpointList.js.map +1 -0
- package/dist/rpc/EntityExplorerApp.d.ts +15 -0
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -0
- package/dist/rpc/EntityExplorerApp.js +282 -0
- package/dist/rpc/EntityExplorerApp.js.map +1 -0
- package/dist/rpc/ExecutionResult.d.ts +14 -0
- package/dist/rpc/ExecutionResult.d.ts.map +1 -0
- package/dist/rpc/ExecutionResult.js +51 -0
- package/dist/rpc/ExecutionResult.js.map +1 -0
- package/dist/rpc/FilterForm.d.ts +22 -0
- package/dist/rpc/FilterForm.d.ts.map +1 -0
- package/dist/rpc/FilterForm.js +392 -0
- package/dist/rpc/FilterForm.js.map +1 -0
- package/dist/rpc/InlineError.d.ts +7 -0
- package/dist/rpc/InlineError.d.ts.map +1 -0
- package/dist/rpc/InlineError.js +54 -0
- package/dist/rpc/InlineError.js.map +1 -0
- package/dist/rpc/OperationActionDialog.d.ts +12 -0
- package/dist/rpc/OperationActionDialog.d.ts.map +1 -0
- package/dist/rpc/OperationActionDialog.js +105 -0
- package/dist/rpc/OperationActionDialog.js.map +1 -0
- package/dist/rpc/OperationCatalog.d.ts +21 -0
- package/dist/rpc/OperationCatalog.d.ts.map +1 -0
- package/dist/rpc/OperationCatalog.js +339 -0
- package/dist/rpc/OperationCatalog.js.map +1 -0
- package/dist/rpc/OperationCommandPage.d.ts +22 -0
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -0
- package/dist/rpc/OperationCommandPage.js +484 -0
- package/dist/rpc/OperationCommandPage.js.map +1 -0
- package/dist/rpc/OperationEntityPage.d.ts +23 -0
- package/dist/rpc/OperationEntityPage.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPage.js +218 -0
- package/dist/rpc/OperationEntityPage.js.map +1 -0
- package/dist/rpc/classify.d.ts +8 -0
- package/dist/rpc/classify.d.ts.map +1 -0
- package/dist/rpc/classify.js +76 -0
- package/dist/rpc/classify.js.map +1 -0
- package/dist/rpc/clickyMetadata.d.ts +12 -0
- package/dist/rpc/clickyMetadata.d.ts.map +1 -0
- package/dist/rpc/clickyMetadata.js +71 -0
- package/dist/rpc/clickyMetadata.js.map +1 -0
- package/dist/rpc/formMetadata.d.ts +27 -0
- package/dist/rpc/formMetadata.d.ts.map +1 -0
- package/dist/rpc/formMetadata.js +250 -0
- package/dist/rpc/formMetadata.js.map +1 -0
- package/dist/rpc/types.d.ts +109 -0
- package/dist/rpc/types.d.ts.map +1 -0
- package/dist/rpc/types.js +8 -0
- package/dist/rpc/types.js.map +1 -0
- package/dist/rpc/useOperations.d.ts +346 -0
- package/dist/rpc/useOperations.d.ts.map +1 -0
- package/dist/rpc/useOperations.js +31 -0
- package/dist/rpc/useOperations.js.map +1 -0
- package/dist/rpc.d.ts +14 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +37 -0
- package/dist/rpc.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/styles.d.ts +1 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +2 -0
- package/dist/styles.js.map +1 -0
- package/dist/tailwind-preset.d.ts +4 -0
- package/dist/tailwind-preset.d.ts.map +1 -0
- package/dist/tailwind-preset.js +69 -0
- package/dist/tailwind-preset.js.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +12 -0
- package/dist/utils.js.map +1 -0
- package/package.json +83 -40
- package/dist/index.d.mts +0 -834
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -2918
- package/dist/index.mjs.map +0 -1
- package/dist/tailwind-preset.d.mts +0 -7
- package/dist/tailwind-preset.d.mts.map +0 -1
- package/dist/tailwind-preset.mjs +0 -64
- package/dist/tailwind-preset.mjs.map +0 -1
- package/src/styles/tokens.css +0 -78
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
import { Icon } from "../Icon.js";
|
|
4
|
+
import { parseInlineJsonContextValue, parseDiagnosticsStackTrace, isApplicationStackFrame, compactStackPath } from "./error-diagnostics.js";
|
|
5
|
+
function ErrorDetails({ diagnostics, renderJsonContext }) {
|
|
6
|
+
const scalarContext = diagnostics.context.filter(
|
|
7
|
+
([, value]) => !parseInlineJsonContextValue(value)
|
|
8
|
+
);
|
|
9
|
+
const jsonContext = diagnostics.context.map(([label, value]) => ({ label, value, data: parseInlineJsonContextValue(value) })).filter(
|
|
10
|
+
(entry) => entry.data !== null
|
|
11
|
+
);
|
|
12
|
+
return /* @__PURE__ */ jsxs("details", { className: "group rounded-md border border-destructive/30 bg-destructive/5", children: [
|
|
13
|
+
/* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer list-none items-start gap-2 p-3", children: [
|
|
14
|
+
/* @__PURE__ */ jsx(Icon, { name: "lucide:triangle-alert", className: "mt-0.5 shrink-0 text-destructive" }),
|
|
15
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
16
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm font-semibold text-destructive", children: "Error" }),
|
|
17
|
+
/* @__PURE__ */ jsx("div", { className: "mt-1 whitespace-pre-wrap text-sm text-destructive", children: diagnostics.message })
|
|
18
|
+
] }),
|
|
19
|
+
/* @__PURE__ */ jsx(
|
|
20
|
+
Icon,
|
|
21
|
+
{
|
|
22
|
+
name: "lucide:chevron-right",
|
|
23
|
+
className: "mt-0.5 shrink-0 text-muted-foreground transition-transform group-open:rotate-90"
|
|
24
|
+
}
|
|
25
|
+
)
|
|
26
|
+
] }),
|
|
27
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-3 border-t border-destructive/20 p-3 pt-2", children: [
|
|
28
|
+
(diagnostics.trace || diagnostics.time) && /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-wrap gap-2", children: [
|
|
29
|
+
diagnostics.trace && /* @__PURE__ */ jsx(CopyBadge, { label: "Trace", value: diagnostics.trace, className: "max-w-full" }),
|
|
30
|
+
diagnostics.time && /* @__PURE__ */ jsxs("span", { className: "inline-flex max-w-full items-center overflow-hidden rounded-md border border-border bg-background/80 text-xs", children: [
|
|
31
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 bg-muted px-2 py-1 font-medium text-muted-foreground", children: "Time" }),
|
|
32
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 truncate px-2 py-1 font-mono text-foreground", children: diagnostics.time })
|
|
33
|
+
] })
|
|
34
|
+
] }),
|
|
35
|
+
diagnostics.context.length > 0 && /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
36
|
+
/* @__PURE__ */ jsx("div", { className: "mb-1.5 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Context" }),
|
|
37
|
+
scalarContext.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: scalarContext.map(([label, value]) => /* @__PURE__ */ jsx(CopyBadge, { label, value }, `${label}:${value}`)) }),
|
|
38
|
+
jsonContext.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-2 grid gap-2", children: jsonContext.map(
|
|
39
|
+
(entry) => renderJsonContext ? /* @__PURE__ */ jsx("span", { children: renderJsonContext(entry) }, `${entry.label}:${entry.value}`) : /* @__PURE__ */ jsx(
|
|
40
|
+
CopyBadge,
|
|
41
|
+
{
|
|
42
|
+
label: entry.label,
|
|
43
|
+
value: entry.value
|
|
44
|
+
},
|
|
45
|
+
`${entry.label}:${entry.value}`
|
|
46
|
+
)
|
|
47
|
+
) })
|
|
48
|
+
] }),
|
|
49
|
+
diagnostics.stacktrace && /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
50
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-1.5 flex min-w-0 items-center justify-between gap-3", children: [
|
|
51
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Stack trace" }),
|
|
52
|
+
/* @__PURE__ */ jsxs(
|
|
53
|
+
"button",
|
|
54
|
+
{
|
|
55
|
+
type: "button",
|
|
56
|
+
onClick: () => copyText(diagnostics.stacktrace ?? ""),
|
|
57
|
+
className: "inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground",
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsx(Icon, { name: "lucide:copy" }),
|
|
60
|
+
"copy"
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
] }),
|
|
65
|
+
/* @__PURE__ */ jsx(PrettyStackTrace, { stacktrace: diagnostics.stacktrace })
|
|
66
|
+
] })
|
|
67
|
+
] })
|
|
68
|
+
] });
|
|
69
|
+
}
|
|
70
|
+
function PrettyStackTrace({ stacktrace }) {
|
|
71
|
+
const parsed = parseDiagnosticsStackTrace(stacktrace);
|
|
72
|
+
if (parsed.frames.length === 0) {
|
|
73
|
+
return /* @__PURE__ */ jsx("pre", { className: "max-h-72 overflow-auto whitespace-pre-wrap rounded-md bg-slate-950 p-3 font-mono text-xs leading-5 text-slate-200", children: stacktrace });
|
|
74
|
+
}
|
|
75
|
+
return /* @__PURE__ */ jsxs("div", { className: "max-h-96 min-h-40 overflow-auto rounded-md border border-border bg-background p-2", children: [
|
|
76
|
+
/* @__PURE__ */ jsx("div", { className: "mb-2 flex items-center justify-between gap-2 text-[11px] text-muted-foreground", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
77
|
+
/* @__PURE__ */ jsx("span", { className: "rounded-full bg-red-100 px-2 py-0.5 text-red-700", children: "error" }),
|
|
78
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
79
|
+
parsed.frames.length,
|
|
80
|
+
" frames"
|
|
81
|
+
] })
|
|
82
|
+
] }) }),
|
|
83
|
+
parsed.headline && /* @__PURE__ */ jsx("div", { className: "mb-2 rounded-md bg-red-50 px-2 py-1.5 font-mono text-[11px] leading-4 text-red-700", children: parsed.headline }),
|
|
84
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: parsed.frames.map((frame, index) => /* @__PURE__ */ jsx(StackFrameRow, { frame, index }, `${frame.file}:${frame.line}:${index}`)) }),
|
|
85
|
+
parsed.unparsed.length > 0 && /* @__PURE__ */ jsx("pre", { className: "mt-2 whitespace-pre-wrap rounded bg-muted p-2 font-mono text-[11px] leading-4 text-muted-foreground", children: parsed.unparsed.join("\n") })
|
|
86
|
+
] });
|
|
87
|
+
}
|
|
88
|
+
function StackFrameRow({ frame, index }) {
|
|
89
|
+
const appFrame = isApplicationStackFrame(frame.file);
|
|
90
|
+
return /* @__PURE__ */ jsx(
|
|
91
|
+
"button",
|
|
92
|
+
{
|
|
93
|
+
type: "button",
|
|
94
|
+
onClick: () => copyText(frame.raw),
|
|
95
|
+
title: "Copy stack frame",
|
|
96
|
+
className: [
|
|
97
|
+
"block w-full rounded px-1.5 py-1 text-left hover:bg-accent/50",
|
|
98
|
+
appFrame ? "text-foreground" : "text-muted-foreground"
|
|
99
|
+
].join(" "),
|
|
100
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-start gap-1.5", children: [
|
|
101
|
+
/* @__PURE__ */ jsx(
|
|
102
|
+
Icon,
|
|
103
|
+
{
|
|
104
|
+
name: appFrame ? "codicon:symbol-method" : "codicon:debug-step-over",
|
|
105
|
+
className: "mt-0.5 shrink-0 text-[11px]"
|
|
106
|
+
}
|
|
107
|
+
),
|
|
108
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxs("div", { className: "break-all font-mono text-[11px] font-semibold leading-4", children: [
|
|
109
|
+
/* @__PURE__ */ jsxs("span", { className: "mr-2 text-[10px] font-normal opacity-60", children: [
|
|
110
|
+
"#",
|
|
111
|
+
index + 1
|
|
112
|
+
] }),
|
|
113
|
+
frame.functionName || "unknown function",
|
|
114
|
+
/* @__PURE__ */ jsxs("span", { className: "ml-2 text-[10px] font-normal opacity-80", children: [
|
|
115
|
+
compactStackPath(frame.file),
|
|
116
|
+
":",
|
|
117
|
+
frame.line
|
|
118
|
+
] })
|
|
119
|
+
] }) })
|
|
120
|
+
] })
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
function CopyBadge({
|
|
125
|
+
label,
|
|
126
|
+
value,
|
|
127
|
+
className = ""
|
|
128
|
+
}) {
|
|
129
|
+
return /* @__PURE__ */ jsxs(
|
|
130
|
+
"button",
|
|
131
|
+
{
|
|
132
|
+
type: "button",
|
|
133
|
+
onClick: () => copyText(value),
|
|
134
|
+
title: `Copy ${label}`,
|
|
135
|
+
className: [
|
|
136
|
+
"inline-flex max-w-full items-center overflow-hidden rounded-md border border-border bg-background/80 text-left text-xs hover:border-primary/40 hover:bg-background",
|
|
137
|
+
className
|
|
138
|
+
].filter(Boolean).join(" "),
|
|
139
|
+
children: [
|
|
140
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 bg-muted px-2 py-1 font-medium text-muted-foreground", children: label }),
|
|
141
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 truncate px-2 py-1 font-mono text-foreground", children: value }),
|
|
142
|
+
/* @__PURE__ */ jsx(Icon, { name: "lucide:copy", className: "mr-1.5 h-3 w-3 shrink-0 text-muted-foreground" })
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
function copyText(value) {
|
|
148
|
+
if (typeof navigator !== "undefined" && navigator.clipboard) {
|
|
149
|
+
void navigator.clipboard.writeText(value);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
export {
|
|
153
|
+
CopyBadge,
|
|
154
|
+
ErrorDetails,
|
|
155
|
+
PrettyStackTrace
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=ErrorDetails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorDetails.js","sources":["../../../src/data/diagnostics/ErrorDetails.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport {\n compactStackPath,\n isApplicationStackFrame,\n parseDiagnosticsStackTrace,\n parseInlineJsonContextValue,\n type ErrorDiagnostics,\n type ErrorStackFrame,\n} from \"./error-diagnostics\";\n\nexport type ErrorDetailsProps = {\n diagnostics: ErrorDiagnostics;\n // Optional renderer for context values that parse as JSON. Defaults to a\n // CopyBadge with the raw string. MC's playbook view passes a richer JsonView\n // here; smaller consumers (plugin iframes) can leave it unset.\n renderJsonContext?: (entry: { label: string; value: string; data: unknown }) => ReactNode;\n};\n\nexport function ErrorDetails({ diagnostics, renderJsonContext }: ErrorDetailsProps) {\n const scalarContext = diagnostics.context.filter(\n ([, value]) => !parseInlineJsonContextValue(value),\n );\n const jsonContext = diagnostics.context\n .map(([label, value]) => ({ label, value, data: parseInlineJsonContextValue(value) }))\n .filter(\n (entry): entry is { label: string; value: string; data: unknown } => entry.data !== null,\n );\n return (\n <details className=\"group rounded-md border border-destructive/30 bg-destructive/5\">\n <summary className=\"flex cursor-pointer list-none items-start gap-2 p-3\">\n <Icon name=\"lucide:triangle-alert\" className=\"mt-0.5 shrink-0 text-destructive\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold text-destructive\">Error</div>\n <div className=\"mt-1 whitespace-pre-wrap text-sm text-destructive\">\n {diagnostics.message}\n </div>\n </div>\n <Icon\n name=\"lucide:chevron-right\"\n className=\"mt-0.5 shrink-0 text-muted-foreground transition-transform group-open:rotate-90\"\n />\n </summary>\n <div className=\"grid gap-3 border-t border-destructive/20 p-3 pt-2\">\n {(diagnostics.trace || diagnostics.time) && (\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n {diagnostics.trace && (\n <CopyBadge label=\"Trace\" value={diagnostics.trace} className=\"max-w-full\" />\n )}\n {diagnostics.time && (\n <span className=\"inline-flex max-w-full items-center overflow-hidden rounded-md border border-border bg-background/80 text-xs\">\n <span className=\"shrink-0 bg-muted px-2 py-1 font-medium text-muted-foreground\">\n Time\n </span>\n <span className=\"min-w-0 truncate px-2 py-1 font-mono text-foreground\">\n {diagnostics.time}\n </span>\n </span>\n )}\n </div>\n )}\n {diagnostics.context.length > 0 && (\n <div className=\"min-w-0\">\n <div className=\"mb-1.5 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Context\n </div>\n {scalarContext.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {scalarContext.map(([label, value]) => (\n <CopyBadge key={`${label}:${value}`} label={label} value={value} />\n ))}\n </div>\n )}\n {jsonContext.length > 0 && (\n <div className=\"mt-2 grid gap-2\">\n {jsonContext.map((entry) =>\n renderJsonContext ? (\n <span key={`${entry.label}:${entry.value}`}>{renderJsonContext(entry)}</span>\n ) : (\n <CopyBadge\n key={`${entry.label}:${entry.value}`}\n label={entry.label}\n value={entry.value}\n />\n ),\n )}\n </div>\n )}\n </div>\n )}\n {diagnostics.stacktrace && (\n <div className=\"min-w-0\">\n <div className=\"mb-1.5 flex min-w-0 items-center justify-between gap-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Stack trace\n </div>\n <button\n type=\"button\"\n onClick={() => copyText(diagnostics.stacktrace ?? \"\")}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n <Icon name=\"lucide:copy\" />\n copy\n </button>\n </div>\n <PrettyStackTrace stacktrace={diagnostics.stacktrace} />\n </div>\n )}\n </div>\n </details>\n );\n}\n\nexport function PrettyStackTrace({ stacktrace }: { stacktrace: string }) {\n const parsed = parseDiagnosticsStackTrace(stacktrace);\n if (parsed.frames.length === 0) {\n return (\n <pre className=\"max-h-72 overflow-auto whitespace-pre-wrap rounded-md bg-slate-950 p-3 font-mono text-xs leading-5 text-slate-200\">\n {stacktrace}\n </pre>\n );\n }\n\n return (\n <div className=\"max-h-96 min-h-40 overflow-auto rounded-md border border-border bg-background p-2\">\n <div className=\"mb-2 flex items-center justify-between gap-2 text-[11px] text-muted-foreground\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"rounded-full bg-red-100 px-2 py-0.5 text-red-700\">error</span>\n <span>{parsed.frames.length} frames</span>\n </div>\n </div>\n {parsed.headline && (\n <div className=\"mb-2 rounded-md bg-red-50 px-2 py-1.5 font-mono text-[11px] leading-4 text-red-700\">\n {parsed.headline}\n </div>\n )}\n <div className=\"space-y-0.5\">\n {parsed.frames.map((frame, index) => (\n <StackFrameRow key={`${frame.file}:${frame.line}:${index}`} frame={frame} index={index} />\n ))}\n </div>\n {parsed.unparsed.length > 0 && (\n <pre className=\"mt-2 whitespace-pre-wrap rounded bg-muted p-2 font-mono text-[11px] leading-4 text-muted-foreground\">\n {parsed.unparsed.join(\"\\n\")}\n </pre>\n )}\n </div>\n );\n}\n\nfunction StackFrameRow({ frame, index }: { frame: ErrorStackFrame; index: number }) {\n const appFrame = isApplicationStackFrame(frame.file);\n return (\n <button\n type=\"button\"\n onClick={() => copyText(frame.raw)}\n title=\"Copy stack frame\"\n className={[\n \"block w-full rounded px-1.5 py-1 text-left hover:bg-accent/50\",\n appFrame ? \"text-foreground\" : \"text-muted-foreground\",\n ].join(\" \")}\n >\n <div className=\"flex min-w-0 items-start gap-1.5\">\n <Icon\n name={appFrame ? \"codicon:symbol-method\" : \"codicon:debug-step-over\"}\n className=\"mt-0.5 shrink-0 text-[11px]\"\n />\n <div className=\"min-w-0\">\n <div className=\"break-all font-mono text-[11px] font-semibold leading-4\">\n <span className=\"mr-2 text-[10px] font-normal opacity-60\">#{index + 1}</span>\n {frame.functionName || \"unknown function\"}\n <span className=\"ml-2 text-[10px] font-normal opacity-80\">\n {compactStackPath(frame.file)}:{frame.line}\n </span>\n </div>\n </div>\n </div>\n </button>\n );\n}\n\nexport function CopyBadge({\n label,\n value,\n className = \"\",\n}: {\n label: string;\n value: string;\n className?: string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={() => copyText(value)}\n title={`Copy ${label}`}\n className={[\n \"inline-flex max-w-full items-center overflow-hidden rounded-md border border-border bg-background/80 text-left text-xs hover:border-primary/40 hover:bg-background\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <span className=\"shrink-0 bg-muted px-2 py-1 font-medium text-muted-foreground\">{label}</span>\n <span className=\"min-w-0 truncate px-2 py-1 font-mono text-foreground\">{value}</span>\n <Icon name=\"lucide:copy\" className=\"mr-1.5 h-3 w-3 shrink-0 text-muted-foreground\" />\n </button>\n );\n}\n\nfunction copyText(value: string) {\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n void navigator.clipboard.writeText(value);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ParsedGoroutine } from './stacktrace';
|
|
2
|
+
export declare function goroutineStateBadge(state: string): string;
|
|
3
|
+
export declare function goroutineStateDot(state: string): string;
|
|
4
|
+
export type GoroutineCardProps = {
|
|
5
|
+
goroutine: ParsedGoroutine;
|
|
6
|
+
search: string;
|
|
7
|
+
hideRuntimeOnly: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function GoroutineCard({ goroutine, search, hideRuntimeOnly }: GoroutineCardProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=GoroutineCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GoroutineCard.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/GoroutineCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,cAAc,CAAC;AAE1E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUzD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,kBAAkB,2CAqCvF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Icon } from "../Icon.js";
|
|
3
|
+
function goroutineStateBadge(state) {
|
|
4
|
+
if (state.includes("running"))
|
|
5
|
+
return "bg-green-50 text-green-700 dark:bg-green-500/20 dark:text-green-300";
|
|
6
|
+
if (state.includes("chan") || state.includes("wait"))
|
|
7
|
+
return "bg-blue-50 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300";
|
|
8
|
+
if (state.includes("sleep"))
|
|
9
|
+
return "bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300";
|
|
10
|
+
if (state.includes("select"))
|
|
11
|
+
return "bg-violet-50 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300";
|
|
12
|
+
return "bg-muted text-muted-foreground";
|
|
13
|
+
}
|
|
14
|
+
function goroutineStateDot(state) {
|
|
15
|
+
if (state.includes("running")) return "bg-green-500";
|
|
16
|
+
if (state.includes("chan") || state.includes("wait")) return "bg-blue-500";
|
|
17
|
+
if (state.includes("sleep")) return "bg-amber-500";
|
|
18
|
+
if (state.includes("select")) return "bg-violet-500";
|
|
19
|
+
return "bg-muted-foreground/40";
|
|
20
|
+
}
|
|
21
|
+
function GoroutineCard({ goroutine, search, hideRuntimeOnly }) {
|
|
22
|
+
const frames = hideRuntimeOnly ? goroutine.frames.filter((frame) => !frame.runtime || frame.kind === "created_by") : goroutine.frames;
|
|
23
|
+
const defaultOpen = goroutine.state === "running" || !!search;
|
|
24
|
+
return /* @__PURE__ */ jsxs("details", { className: "border-0 bg-transparent", open: defaultOpen, children: [
|
|
25
|
+
/* @__PURE__ */ jsx("summary", { className: "cursor-pointer list-none px-0 py-1", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [
|
|
26
|
+
/* @__PURE__ */ jsxs("span", { className: "font-mono text-xs font-semibold text-foreground", children: [
|
|
27
|
+
"g",
|
|
28
|
+
goroutine.id
|
|
29
|
+
] }),
|
|
30
|
+
/* @__PURE__ */ jsxs(
|
|
31
|
+
"span",
|
|
32
|
+
{
|
|
33
|
+
className: `inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] ${goroutineStateBadge(
|
|
34
|
+
goroutine.state
|
|
35
|
+
)}`,
|
|
36
|
+
children: [
|
|
37
|
+
/* @__PURE__ */ jsx("span", { className: `h-2 w-2 rounded-full ${goroutineStateDot(goroutine.state)}` }),
|
|
38
|
+
goroutine.rawState
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
),
|
|
42
|
+
/* @__PURE__ */ jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
|
|
43
|
+
frames.length,
|
|
44
|
+
"f"
|
|
45
|
+
] }),
|
|
46
|
+
goroutine.userFrameCount > 0 && /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
|
|
47
|
+
goroutine.userFrameCount,
|
|
48
|
+
"u"
|
|
49
|
+
] }),
|
|
50
|
+
goroutine.topFunction && /* @__PURE__ */ jsx("span", { className: "truncate text-[11px] text-muted-foreground", children: goroutine.topFunction })
|
|
51
|
+
] }) }),
|
|
52
|
+
/* @__PURE__ */ jsx("div", { className: "pl-3 py-1 space-y-0.5", children: frames.map((frame, index) => /* @__PURE__ */ jsx(FrameRow, { frame }, `${goroutine.id}-${index}`)) })
|
|
53
|
+
] });
|
|
54
|
+
}
|
|
55
|
+
function FrameRow({ frame }) {
|
|
56
|
+
return /* @__PURE__ */ jsx("div", { className: frame.runtime ? "text-muted-foreground" : "text-foreground", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-1.5", children: [
|
|
57
|
+
/* @__PURE__ */ jsx(
|
|
58
|
+
Icon,
|
|
59
|
+
{
|
|
60
|
+
name: frame.kind === "created_by" ? "codicon:debug-restart" : frame.runtime ? "codicon:debug-step-over" : "codicon:symbol-method",
|
|
61
|
+
className: "shrink-0 mt-0.5 text-[11px]"
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxs("div", { className: "break-all font-mono text-[11px] font-semibold leading-4", children: [
|
|
65
|
+
frame.displayName,
|
|
66
|
+
frame.location && /* @__PURE__ */ jsx("span", { className: "ml-2 text-[10px] font-normal opacity-80", children: frame.location })
|
|
67
|
+
] }) })
|
|
68
|
+
] }) });
|
|
69
|
+
}
|
|
70
|
+
export {
|
|
71
|
+
GoroutineCard,
|
|
72
|
+
goroutineStateBadge,
|
|
73
|
+
goroutineStateDot
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=GoroutineCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GoroutineCard.js","sources":["../../../src/data/diagnostics/GoroutineCard.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport type { ParsedGoroutine, ParsedGoroutineFrame } from \"./stacktrace\";\n\nexport function goroutineStateBadge(state: string): string {\n if (state.includes(\"running\"))\n return \"bg-green-50 text-green-700 dark:bg-green-500/20 dark:text-green-300\";\n if (state.includes(\"chan\") || state.includes(\"wait\"))\n return \"bg-blue-50 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300\";\n if (state.includes(\"sleep\"))\n return \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300\";\n if (state.includes(\"select\"))\n return \"bg-violet-50 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300\";\n return \"bg-muted text-muted-foreground\";\n}\n\nexport function goroutineStateDot(state: string): string {\n if (state.includes(\"running\")) return \"bg-green-500\";\n if (state.includes(\"chan\") || state.includes(\"wait\")) return \"bg-blue-500\";\n if (state.includes(\"sleep\")) return \"bg-amber-500\";\n if (state.includes(\"select\")) return \"bg-violet-500\";\n return \"bg-muted-foreground/40\";\n}\n\nexport type GoroutineCardProps = {\n goroutine: ParsedGoroutine;\n search: string;\n hideRuntimeOnly: boolean;\n};\n\nexport function GoroutineCard({ goroutine, search, hideRuntimeOnly }: GoroutineCardProps) {\n const frames = hideRuntimeOnly\n ? goroutine.frames.filter((frame) => !frame.runtime || frame.kind === \"created_by\")\n : goroutine.frames;\n const defaultOpen = goroutine.state === \"running\" || !!search;\n\n return (\n <details className=\"border-0 bg-transparent\" open={defaultOpen}>\n <summary className=\"cursor-pointer list-none px-0 py-1\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-mono text-xs font-semibold text-foreground\">g{goroutine.id}</span>\n <span\n className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] ${goroutineStateBadge(\n goroutine.state,\n )}`}\n >\n <span className={`h-2 w-2 rounded-full ${goroutineStateDot(goroutine.state)}`} />\n {goroutine.rawState}\n </span>\n <span className=\"text-[11px] text-muted-foreground\">{frames.length}f</span>\n {goroutine.userFrameCount > 0 && (\n <span className=\"text-[11px] text-muted-foreground\">{goroutine.userFrameCount}u</span>\n )}\n {goroutine.topFunction && (\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {goroutine.topFunction}\n </span>\n )}\n </div>\n </summary>\n <div className=\"pl-3 py-1 space-y-0.5\">\n {frames.map((frame, index) => (\n <FrameRow key={`${goroutine.id}-${index}`} frame={frame} />\n ))}\n </div>\n </details>\n );\n}\n\nfunction FrameRow({ frame }: { frame: ParsedGoroutineFrame }) {\n return (\n <div className={frame.runtime ? \"text-muted-foreground\" : \"text-foreground\"}>\n <div className=\"flex items-start gap-1.5\">\n <Icon\n name={\n frame.kind === \"created_by\"\n ? \"codicon:debug-restart\"\n : frame.runtime\n ? \"codicon:debug-step-over\"\n : \"codicon:symbol-method\"\n }\n className=\"shrink-0 mt-0.5 text-[11px]\"\n />\n <div className=\"min-w-0\">\n <div className=\"break-all font-mono text-[11px] font-semibold leading-4\">\n {frame.displayName}\n {frame.location && (\n <span className=\"ml-2 text-[10px] font-normal opacity-80\">{frame.location}</span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;AAGO,SAAS,oBAAoB,OAAuB;AACzD,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO;AACT,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM;AACjD,WAAO;AACT,MAAI,MAAM,SAAS,OAAO;AACxB,WAAO;AACT,MAAI,MAAM,SAAS,QAAQ;AACzB,WAAO;AACT,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAuB;AACvD,MAAI,MAAM,SAAS,SAAS,EAAG,QAAO;AACtC,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC7D,MAAI,MAAM,SAAS,OAAO,EAAG,QAAO;AACpC,MAAI,MAAM,SAAS,QAAQ,EAAG,QAAO;AACrC,SAAO;AACT;AAQO,SAAS,cAAc,EAAE,WAAW,QAAQ,mBAAuC;AACxF,QAAM,SAAS,kBACX,UAAU,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,WAAW,MAAM,SAAS,YAAY,IAChF,UAAU;AACd,QAAM,cAAc,UAAU,UAAU,aAAa,CAAC,CAAC;AAEvD,SACE,qBAAC,WAAA,EAAQ,WAAU,2BAA0B,MAAM,aACjD,UAAA;AAAA,IAAA,oBAAC,aAAQ,WAAU,sCACjB,UAAA,qBAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAA,qBAAC,QAAA,EAAK,WAAU,mDAAkD,UAAA;AAAA,QAAA;AAAA,QAAE,UAAU;AAAA,MAAA,GAAG;AAAA,MACjF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,uEAAuE;AAAA,YAChF,UAAU;AAAA,UAAA,CACX;AAAA,UAED,UAAA;AAAA,YAAA,oBAAC,UAAK,WAAW,wBAAwB,kBAAkB,UAAU,KAAK,CAAC,IAAI;AAAA,YAC9E,UAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEb,qBAAC,QAAA,EAAK,WAAU,qCAAqC,UAAA;AAAA,QAAA,OAAO;AAAA,QAAO;AAAA,MAAA,GAAC;AAAA,MACnE,UAAU,iBAAiB,KAC1B,qBAAC,QAAA,EAAK,WAAU,qCAAqC,UAAA;AAAA,QAAA,UAAU;AAAA,QAAe;AAAA,MAAA,GAAC;AAAA,MAEhF,UAAU,eACT,oBAAC,UAAK,WAAU,8CACb,oBAAU,YAAA,CACb;AAAA,IAAA,EAAA,CAEJ,EAAA,CACF;AAAA,wBACC,OAAA,EAAI,WAAU,yBACZ,UAAA,OAAO,IAAI,CAAC,OAAO,8BACjB,UAAA,EAA0C,MAAA,GAA5B,GAAG,UAAU,EAAE,IAAI,KAAK,EAAkB,CAC1D,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAEA,SAAS,SAAS,EAAE,SAA0C;AAC5D,SACE,oBAAC,OAAA,EAAI,WAAW,MAAM,UAAU,0BAA0B,mBACxD,UAAA,qBAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MACE,MAAM,SAAS,eACX,0BACA,MAAM,UACJ,4BACA;AAAA,QAER,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,wBAEX,OAAA,EAAI,WAAU,WACb,UAAA,qBAAC,OAAA,EAAI,WAAU,2DACZ,UAAA;AAAA,MAAA,MAAM;AAAA,MACN,MAAM,YACL,oBAAC,UAAK,WAAU,2CAA2C,gBAAM,SAAA,CAAS;AAAA,IAAA,EAAA,CAE9E,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ParsedThreadFrame } from './jvm-stacktrace';
|
|
2
|
+
export type JvmStackTraceProps = {
|
|
3
|
+
frames: ParsedThreadFrame[];
|
|
4
|
+
hideRuntimeOnly?: boolean;
|
|
5
|
+
className?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function JvmStackTrace({ frames, hideRuntimeOnly, className }: JvmStackTraceProps): import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
export declare function JvmStackFrameRow({ frame }: {
|
|
9
|
+
frame: ParsedThreadFrame;
|
|
10
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=JvmStackTrace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JvmStackTrace.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/JvmStackTrace.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,eAAuB,EAAE,SAAS,EAAE,EAAE,kBAAkB,kDAc/F;AAED,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAA;CAAE,2CAwCvE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Icon } from "../Icon.js";
|
|
3
|
+
function JvmStackTrace({ frames, hideRuntimeOnly = false, className }) {
|
|
4
|
+
const visibleFrames = hideRuntimeOnly ? frames.filter((frame) => frame.kind !== "frame" || !frame.runtime) : frames;
|
|
5
|
+
if (visibleFrames.length === 0) return null;
|
|
6
|
+
return /* @__PURE__ */ jsx("div", { className, children: visibleFrames.map((frame, index) => /* @__PURE__ */ jsx(JvmStackFrameRow, { frame }, `${frame.functionName}-${index}`)) });
|
|
7
|
+
}
|
|
8
|
+
function JvmStackFrameRow({ frame }) {
|
|
9
|
+
const isAnno = frame.kind !== "frame";
|
|
10
|
+
const iconName = isAnno ? frame.kind === "locked" ? "codicon:lock" : frame.kind === "waiting_to_lock" ? "codicon:sync" : "codicon:watch" : frame.nativeMethod ? "codicon:chip" : frame.runtime ? "codicon:debug-step-over" : "codicon:symbol-method";
|
|
11
|
+
return /* @__PURE__ */ jsx("div", { className: frame.runtime ? "text-muted-foreground" : "text-foreground", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-1.5", children: [
|
|
12
|
+
/* @__PURE__ */ jsx(Icon, { name: iconName, className: "mt-0.5 shrink-0 text-[11px]" }),
|
|
13
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx("div", { className: "break-all font-mono text-[11px] font-semibold leading-4", children: isAnno ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
14
|
+
/* @__PURE__ */ jsx("span", { className: "opacity-70", children: frame.functionName }),
|
|
15
|
+
frame.annotationText && /* @__PURE__ */ jsx("span", { className: "ml-2 font-normal opacity-80", children: frame.annotationText })
|
|
16
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
17
|
+
frame.displayName,
|
|
18
|
+
frame.location && /* @__PURE__ */ jsx("span", { className: "ml-2 text-[10px] font-normal opacity-80", children: frame.location })
|
|
19
|
+
] }) }) })
|
|
20
|
+
] }) });
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
JvmStackFrameRow,
|
|
24
|
+
JvmStackTrace
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=JvmStackTrace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JvmStackTrace.js","sources":["../../../src/data/diagnostics/JvmStackTrace.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport type { ParsedThreadFrame } from \"./jvm-stacktrace\";\n\nexport type JvmStackTraceProps = {\n frames: ParsedThreadFrame[];\n hideRuntimeOnly?: boolean;\n className?: string;\n};\n\nexport function JvmStackTrace({ frames, hideRuntimeOnly = false, className }: JvmStackTraceProps) {\n const visibleFrames = hideRuntimeOnly\n ? frames.filter((frame) => frame.kind !== \"frame\" || !frame.runtime)\n : frames;\n\n if (visibleFrames.length === 0) return null;\n\n return (\n <div className={className}>\n {visibleFrames.map((frame, index) => (\n <JvmStackFrameRow key={`${frame.functionName}-${index}`} frame={frame} />\n ))}\n </div>\n );\n}\n\nexport function JvmStackFrameRow({ frame }: { frame: ParsedThreadFrame }) {\n const isAnno = frame.kind !== \"frame\";\n const iconName = isAnno\n ? frame.kind === \"locked\"\n ? \"codicon:lock\"\n : frame.kind === \"waiting_to_lock\"\n ? \"codicon:sync\"\n : \"codicon:watch\"\n : frame.nativeMethod\n ? \"codicon:chip\"\n : frame.runtime\n ? \"codicon:debug-step-over\"\n : \"codicon:symbol-method\";\n\n return (\n <div className={frame.runtime ? \"text-muted-foreground\" : \"text-foreground\"}>\n <div className=\"flex items-start gap-1.5\">\n <Icon name={iconName} className=\"mt-0.5 shrink-0 text-[11px]\" />\n <div className=\"min-w-0\">\n <div className=\"break-all font-mono text-[11px] font-semibold leading-4\">\n {isAnno ? (\n <>\n <span className=\"opacity-70\">{frame.functionName}</span>\n {frame.annotationText && (\n <span className=\"ml-2 font-normal opacity-80\">{frame.annotationText}</span>\n )}\n </>\n ) : (\n <>\n {frame.displayName}\n {frame.location && (\n <span className=\"ml-2 text-[10px] font-normal opacity-80\">{frame.location}</span>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;AASO,SAAS,cAAc,EAAE,QAAQ,kBAAkB,OAAO,aAAiC;AAChG,QAAM,gBAAgB,kBAClB,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,WAAW,CAAC,MAAM,OAAO,IACjE;AAEJ,MAAI,cAAc,WAAW,EAAG,QAAO;AAEvC,6BACG,OAAA,EAAI,WACF,wBAAc,IAAI,CAAC,OAAO,UACzB,oBAAC,kBAAA,EAAwD,SAAlC,GAAG,MAAM,YAAY,IAAI,KAAK,EAAkB,CACxE,GACH;AAEJ;AAEO,SAAS,iBAAiB,EAAE,SAAuC;AACxE,QAAM,SAAS,MAAM,SAAS;AAC9B,QAAM,WAAW,SACb,MAAM,SAAS,WACb,iBACA,MAAM,SAAS,oBACb,iBACA,kBACJ,MAAM,eACJ,iBACA,MAAM,UACJ,4BACA;AAER,SACE,oBAAC,OAAA,EAAI,WAAW,MAAM,UAAU,0BAA0B,mBACxD,UAAA,qBAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAA,oBAAC,MAAA,EAAK,MAAM,UAAU,WAAU,+BAA8B;AAAA,IAC9D,oBAAC,SAAI,WAAU,WACb,8BAAC,OAAA,EAAI,WAAU,2DACZ,UAAA,SACC,qBAAA,UAAA,EACE,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,cAAc,UAAA,MAAM,cAAa;AAAA,MAChD,MAAM,kBACL,oBAAC,UAAK,WAAU,+BAA+B,gBAAM,eAAA,CAAe;AAAA,IAAA,EAAA,CAExE,IAEA,qBAAA,UAAA,EACG,UAAA;AAAA,MAAA,MAAM;AAAA,MACN,MAAM,YACL,oBAAC,UAAK,WAAU,2CAA2C,gBAAM,SAAA,CAAS;AAAA,IAAA,EAAA,CAE9E,GAEJ,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ParsedStackFrame, ParsedStackTrace } from './stacktrace-parse';
|
|
2
|
+
export type StackTraceSourceResolver = (frame: ParsedStackFrame, contextLines: number) => {
|
|
3
|
+
lines: string[];
|
|
4
|
+
startLine: number;
|
|
5
|
+
language?: string;
|
|
6
|
+
} | undefined;
|
|
7
|
+
export interface StackTraceProps {
|
|
8
|
+
input: string | ParsedStackTrace;
|
|
9
|
+
language?: "java";
|
|
10
|
+
resolver?: StackTraceSourceResolver;
|
|
11
|
+
contextLines?: number;
|
|
12
|
+
hideRuntimeOnly?: boolean;
|
|
13
|
+
include?: string[];
|
|
14
|
+
exclude?: string[];
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function StackTrace({ input, language, resolver, contextLines, hideRuntimeOnly, include, exclude, className, }: StackTraceProps): import("react/jsx-runtime").JSX.Element | null;
|
|
18
|
+
//# sourceMappingURL=RenderedStackTrace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderedStackTrace.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/RenderedStackTrace.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAQ5B,MAAM,MAAM,wBAAwB,GAAG,CACrC,KAAK,EAAE,gBAAgB,EACvB,YAAY,EAAE,MAAM,KAElB;IACE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACD,SAAS,CAAC;AAEd,MAAM,WAAW,eAAe;IAG9B,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAiB,EACjB,QAAQ,EACR,YAAgB,EAChB,eAAuB,EACvB,OAAO,EACP,OAAO,EACP,SAAS,GACV,EAAE,eAAe,kDAgGjB"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState, useEffect } from "react";
|
|
3
|
+
import { parseJavaStackTrace } from "./stacktrace-parse.js";
|
|
4
|
+
import { loadShikiTransformers, highlightCode } from "../code-highlight.js";
|
|
5
|
+
import { Icon } from "../Icon.js";
|
|
6
|
+
function StackTrace({
|
|
7
|
+
input,
|
|
8
|
+
language = "java",
|
|
9
|
+
resolver,
|
|
10
|
+
contextLines = 3,
|
|
11
|
+
hideRuntimeOnly = false,
|
|
12
|
+
include,
|
|
13
|
+
exclude,
|
|
14
|
+
className
|
|
15
|
+
}) {
|
|
16
|
+
const parsed = useMemo(() => {
|
|
17
|
+
if (typeof input === "string") {
|
|
18
|
+
return parseJavaStackTrace(input);
|
|
19
|
+
}
|
|
20
|
+
return input;
|
|
21
|
+
}, [input, language]);
|
|
22
|
+
const enrichedFrames = useMemo(() => {
|
|
23
|
+
if (!resolver) return parsed.frames;
|
|
24
|
+
return parsed.frames.map((frame) => {
|
|
25
|
+
if (frame.sourceLines && frame.sourceLines.length > 0) return frame;
|
|
26
|
+
const resolved = resolver(frame, contextLines);
|
|
27
|
+
if (!resolved) return frame;
|
|
28
|
+
const next = {
|
|
29
|
+
...frame,
|
|
30
|
+
sourceLines: resolved.lines,
|
|
31
|
+
sourceStartLine: resolved.startLine
|
|
32
|
+
};
|
|
33
|
+
if (resolved.language !== void 0) next.sourceLanguage = resolved.language;
|
|
34
|
+
return next;
|
|
35
|
+
});
|
|
36
|
+
}, [parsed.frames, resolver, contextLines]);
|
|
37
|
+
const visibleFrames = useMemo(() => {
|
|
38
|
+
return enrichedFrames.filter((frame) => {
|
|
39
|
+
if (hideRuntimeOnly && frame.runtime) return false;
|
|
40
|
+
if (exclude && exclude.some((p) => {
|
|
41
|
+
var _a;
|
|
42
|
+
return (_a = frame.class) == null ? void 0 : _a.startsWith(p);
|
|
43
|
+
})) return false;
|
|
44
|
+
if (include && include.length > 0) {
|
|
45
|
+
return include.some((p) => {
|
|
46
|
+
var _a;
|
|
47
|
+
return (_a = frame.class) == null ? void 0 : _a.startsWith(p);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
});
|
|
52
|
+
}, [enrichedFrames, hideRuntimeOnly, include, exclude]);
|
|
53
|
+
if (visibleFrames.length === 0 && !parsed.exceptionClass) return null;
|
|
54
|
+
const hasFilteredFrames = visibleFrames.length !== enrichedFrames.length;
|
|
55
|
+
return /* @__PURE__ */ jsxs(
|
|
56
|
+
"div",
|
|
57
|
+
{
|
|
58
|
+
className: [
|
|
59
|
+
"overflow-hidden rounded-md border border-border bg-background text-foreground",
|
|
60
|
+
className
|
|
61
|
+
].filter(Boolean).join(" "),
|
|
62
|
+
children: [
|
|
63
|
+
(parsed.exceptionClass || parsed.message) && /* @__PURE__ */ jsx("div", { className: "border-b border-border bg-red-500/5 px-3 py-2", children: /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-start gap-2", children: [
|
|
64
|
+
/* @__PURE__ */ jsx(
|
|
65
|
+
Icon,
|
|
66
|
+
{
|
|
67
|
+
name: "codicon:error",
|
|
68
|
+
className: "mt-0.5 shrink-0 text-sm text-red-600 dark:text-red-400"
|
|
69
|
+
}
|
|
70
|
+
),
|
|
71
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
72
|
+
parsed.exceptionClass && /* @__PURE__ */ jsx("div", { className: "break-all font-mono text-xs font-semibold text-red-700 dark:text-red-300", children: parsed.exceptionClass }),
|
|
73
|
+
parsed.message && /* @__PURE__ */ jsx("div", { className: "mt-0.5 whitespace-pre-wrap break-words text-xs text-foreground", children: parsed.message })
|
|
74
|
+
] })
|
|
75
|
+
] }) }),
|
|
76
|
+
parsed.causedBy.length > 0 && /* @__PURE__ */ jsx("div", { className: "space-y-1 border-b border-border bg-orange-500/5 px-3 py-2", children: parsed.causedBy.map((cause, i) => /* @__PURE__ */ jsxs(
|
|
77
|
+
"div",
|
|
78
|
+
{
|
|
79
|
+
className: "flex min-w-0 items-start gap-2 font-mono text-[11px] text-orange-700 dark:text-orange-300",
|
|
80
|
+
children: [
|
|
81
|
+
/* @__PURE__ */ jsx(Icon, { name: "codicon:debug-stackframe-dot", className: "mt-0.5 shrink-0 text-xs" }),
|
|
82
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 opacity-75", children: "Caused by" }),
|
|
83
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 break-all", children: cause })
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
i
|
|
87
|
+
)) }),
|
|
88
|
+
/* @__PURE__ */ jsx("div", { className: "divide-y divide-border/60", children: visibleFrames.map((frame, idx) => /* @__PURE__ */ jsx(FrameWithSource, { frame, index: idx }, `${frame.functionName}-${idx}`)) }),
|
|
89
|
+
hasFilteredFrames && /* @__PURE__ */ jsxs("div", { className: "border-t border-border bg-muted/30 px-3 py-1.5 text-[11px] text-muted-foreground", children: [
|
|
90
|
+
"Showing ",
|
|
91
|
+
visibleFrames.length,
|
|
92
|
+
" of ",
|
|
93
|
+
enrichedFrames.length,
|
|
94
|
+
" frames"
|
|
95
|
+
] })
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
function FrameWithSource({ frame, index }) {
|
|
101
|
+
const hasSource = frame.sourceLines && frame.sourceLines.length > 0;
|
|
102
|
+
return /* @__PURE__ */ jsxs("div", { className: hasSource ? "bg-amber-500/[0.03]" : void 0, children: [
|
|
103
|
+
/* @__PURE__ */ jsx(StackFrameRow, { frame, index }),
|
|
104
|
+
hasSource ? /* @__PURE__ */ jsx(SourceWindow, { frame }) : null
|
|
105
|
+
] });
|
|
106
|
+
}
|
|
107
|
+
function StackFrameRow({ frame, index }) {
|
|
108
|
+
const iconName = frame.nativeMethod ? "codicon:chip" : frame.runtime ? "codicon:debug-step-over" : "codicon:symbol-method";
|
|
109
|
+
const className = frame.class;
|
|
110
|
+
const methodName = frame.displayName || frame.method || frame.functionName;
|
|
111
|
+
return /* @__PURE__ */ jsxs(
|
|
112
|
+
"div",
|
|
113
|
+
{
|
|
114
|
+
className: [
|
|
115
|
+
"grid grid-cols-[2rem_minmax(0,1fr)] gap-2 px-3 py-1.5 text-xs",
|
|
116
|
+
frame.runtime ? "text-muted-foreground" : "text-foreground"
|
|
117
|
+
].join(" "),
|
|
118
|
+
children: [
|
|
119
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground", children: [
|
|
120
|
+
/* @__PURE__ */ jsx("span", { children: index + 1 }),
|
|
121
|
+
/* @__PURE__ */ jsx(Icon, { name: iconName, className: "mt-px shrink-0 text-[11px]" })
|
|
122
|
+
] }),
|
|
123
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5", children: [
|
|
124
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 break-all font-mono font-semibold leading-4", children: methodName }),
|
|
125
|
+
className && /* @__PURE__ */ jsx("span", { className: "min-w-0 break-all font-mono text-[11px] text-muted-foreground", children: className }),
|
|
126
|
+
frame.location && /* @__PURE__ */ jsx("span", { className: "rounded border border-border bg-muted/40 px-1.5 py-px font-mono text-[10px] text-muted-foreground", children: frame.location })
|
|
127
|
+
] }) })
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
function inlineCommentPrefix(language) {
|
|
133
|
+
switch (language) {
|
|
134
|
+
case "python":
|
|
135
|
+
case "py":
|
|
136
|
+
case "bash":
|
|
137
|
+
case "sh":
|
|
138
|
+
case "shell":
|
|
139
|
+
case "ruby":
|
|
140
|
+
case "rb":
|
|
141
|
+
case "yaml":
|
|
142
|
+
case "yml":
|
|
143
|
+
case "toml":
|
|
144
|
+
return "#";
|
|
145
|
+
default:
|
|
146
|
+
return "//";
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function buildAnnotatedSource(lines, startLine, focalLine, language) {
|
|
150
|
+
const focalIdx = focalLine - startLine;
|
|
151
|
+
if (focalIdx < 0 || focalIdx >= lines.length) {
|
|
152
|
+
return lines.join("\n");
|
|
153
|
+
}
|
|
154
|
+
const prefix = inlineCommentPrefix(language);
|
|
155
|
+
return lines.map((src, i) => i === focalIdx ? `${src} ${prefix} [!code error]` : src).join("\n");
|
|
156
|
+
}
|
|
157
|
+
function SourceWindow({ frame }) {
|
|
158
|
+
const start = frame.sourceStartLine ?? 0;
|
|
159
|
+
const focal = frame.line ?? -1;
|
|
160
|
+
const lines = frame.sourceLines ?? [];
|
|
161
|
+
const lineNumbers = frame.sourceLineNumbers;
|
|
162
|
+
const language = frame.sourceLanguage ?? "java";
|
|
163
|
+
const rows = useMemo(
|
|
164
|
+
() => lines.map((src, i) => ({
|
|
165
|
+
source: src,
|
|
166
|
+
lineNumber: (lineNumbers == null ? void 0 : lineNumbers[i]) ?? start + i
|
|
167
|
+
})),
|
|
168
|
+
[lineNumbers, lines, start]
|
|
169
|
+
);
|
|
170
|
+
const hasExplicitLineNumbers = lineNumbers != null && lineNumbers.length > 0;
|
|
171
|
+
const annotatedSource = useMemo(
|
|
172
|
+
() => buildAnnotatedSource(lines, start, focal, language),
|
|
173
|
+
[lines, start, focal, language]
|
|
174
|
+
);
|
|
175
|
+
const [html, setHtml] = useState(null);
|
|
176
|
+
useEffect(() => {
|
|
177
|
+
if (!annotatedSource || hasExplicitLineNumbers) {
|
|
178
|
+
setHtml(null);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
let cancelled = false;
|
|
182
|
+
loadShikiTransformers().then(
|
|
183
|
+
({ transformerNotationErrorLevel }) => highlightCode(annotatedSource, {
|
|
184
|
+
lang: language,
|
|
185
|
+
transformers: [transformerNotationErrorLevel()]
|
|
186
|
+
})
|
|
187
|
+
).then((out) => {
|
|
188
|
+
if (!cancelled) setHtml(out);
|
|
189
|
+
});
|
|
190
|
+
return () => {
|
|
191
|
+
cancelled = true;
|
|
192
|
+
};
|
|
193
|
+
}, [annotatedSource, hasExplicitLineNumbers, language]);
|
|
194
|
+
const counterStart = start - 1;
|
|
195
|
+
if (!html || hasExplicitLineNumbers) {
|
|
196
|
+
return /* @__PURE__ */ jsx(SourceRows, { rows, focal });
|
|
197
|
+
}
|
|
198
|
+
return /* @__PURE__ */ jsx(
|
|
199
|
+
"div",
|
|
200
|
+
{
|
|
201
|
+
className: "stacktrace-source ml-6 overflow-x-auto rounded border border-border/50 bg-muted/30 p-2 text-[11px] leading-relaxed",
|
|
202
|
+
style: { ["--shiki-start"]: counterStart },
|
|
203
|
+
dangerouslySetInnerHTML: { __html: html }
|
|
204
|
+
}
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
function SourceRows({
|
|
208
|
+
rows,
|
|
209
|
+
focal
|
|
210
|
+
}) {
|
|
211
|
+
return /* @__PURE__ */ jsx("div", { className: "mx-3 mb-2 ml-12 overflow-x-auto rounded border border-border/60 bg-muted/30 py-1 font-mono text-[11px] leading-relaxed", children: rows.map((row, i) => {
|
|
212
|
+
const isFocal = row.lineNumber === focal;
|
|
213
|
+
return /* @__PURE__ */ jsxs(
|
|
214
|
+
"div",
|
|
215
|
+
{
|
|
216
|
+
className: [
|
|
217
|
+
"grid min-w-max grid-cols-[3.5rem_minmax(24rem,1fr)] gap-3 px-2",
|
|
218
|
+
isFocal ? "bg-red-500/10 font-semibold text-red-800 dark:text-red-300" : "text-foreground"
|
|
219
|
+
].join(" "),
|
|
220
|
+
children: [
|
|
221
|
+
/* @__PURE__ */ jsxs("span", { className: "select-none text-right text-muted-foreground", children: [
|
|
222
|
+
isFocal ? ">" : "",
|
|
223
|
+
row.lineNumber
|
|
224
|
+
] }),
|
|
225
|
+
/* @__PURE__ */ jsx("code", { className: "whitespace-pre", children: row.source || " " })
|
|
226
|
+
]
|
|
227
|
+
},
|
|
228
|
+
`${row.lineNumber}-${i}`
|
|
229
|
+
);
|
|
230
|
+
}) });
|
|
231
|
+
}
|
|
232
|
+
export {
|
|
233
|
+
StackTrace
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=RenderedStackTrace.js.map
|