@flanksource/clicky-ui 0.3.22 → 0.3.24
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/components/CountryFlag.cjs +55 -0
- package/dist/components/CountryFlag.cjs.map +1 -0
- package/dist/components/CountryFlag.d.ts +8 -0
- package/dist/components/CountryFlag.d.ts.map +1 -0
- package/dist/components/CountryFlag.js +38 -0
- package/dist/components/CountryFlag.js.map +1 -0
- package/dist/components/CountryPicker.cjs +35 -0
- package/dist/components/CountryPicker.cjs.map +1 -0
- package/dist/components/CountryPicker.d.ts +4 -0
- package/dist/components/CountryPicker.d.ts.map +1 -0
- package/dist/components/CountryPicker.js +35 -0
- package/dist/components/CountryPicker.js.map +1 -0
- package/dist/components/SplitButton.cjs +3 -2
- package/dist/components/SplitButton.cjs.map +1 -1
- package/dist/components/SplitButton.d.ts +6 -1
- package/dist/components/SplitButton.d.ts.map +1 -1
- package/dist/components/SplitButton.js +3 -2
- package/dist/components/SplitButton.js.map +1 -1
- package/dist/components/country-options.cjs +34 -0
- package/dist/components/country-options.cjs.map +1 -0
- package/dist/components/country-options.d.ts +8 -0
- package/dist/components/country-options.d.ts.map +1 -0
- package/dist/components/country-options.js +34 -0
- package/dist/components/country-options.js.map +1 -0
- package/dist/components.cjs +11 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +4 -0
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +11 -0
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +4 -1
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +4 -1
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/CodeDiff.cjs +3 -18
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.d.ts.map +1 -1
- package/dist/data/CodeDiff.js +3 -18
- package/dist/data/CodeDiff.js.map +1 -1
- package/dist/data/DataTable.cjs +182 -64
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +9 -1
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.cjs +26 -0
- package/dist/data/DataTable.grouping.cjs.map +1 -1
- package/dist/data/DataTable.grouping.d.ts +38 -0
- package/dist/data/DataTable.grouping.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.js +26 -0
- package/dist/data/DataTable.grouping.js.map +1 -1
- package/dist/data/DataTable.js +183 -65
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/DataTableGroupingControls.cjs +84 -0
- package/dist/data/DataTableGroupingControls.cjs.map +1 -0
- package/dist/data/DataTableGroupingControls.d.ts +17 -0
- package/dist/data/DataTableGroupingControls.d.ts.map +1 -0
- package/dist/data/DataTableGroupingControls.js +84 -0
- package/dist/data/DataTableGroupingControls.js.map +1 -0
- package/dist/data/HighlightedTokens.cjs +21 -0
- package/dist/data/HighlightedTokens.cjs.map +1 -0
- package/dist/data/HighlightedTokens.d.ts +6 -0
- package/dist/data/HighlightedTokens.d.ts.map +1 -0
- package/dist/data/HighlightedTokens.js +21 -0
- package/dist/data/HighlightedTokens.js.map +1 -0
- package/dist/data/ai/AdvancedChatConfig.cjs +3 -0
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts +2 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.js +3 -0
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +77 -4
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +78 -5
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +19 -4
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.d.ts +2 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.js +19 -4
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
- package/dist/data/ai/ChatWindow.test-utils.d.ts +2 -1
- package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +8 -1
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +2 -1
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +8 -1
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/chat/Chat.cjs +26 -3
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +9 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +26 -3
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +2 -0
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts +2 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +2 -0
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/Message.cjs +36 -1
- package/dist/data/chat/Message.cjs.map +1 -1
- package/dist/data/chat/Message.d.ts +1 -1
- package/dist/data/chat/Message.d.ts.map +1 -1
- package/dist/data/chat/Message.js +37 -2
- package/dist/data/chat/Message.js.map +1 -1
- package/dist/data/chat/approval.cjs +17 -0
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +5 -0
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js +17 -0
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/fork-seed.cjs +22 -0
- package/dist/data/chat/fork-seed.cjs.map +1 -0
- package/dist/data/chat/fork-seed.d.ts +8 -0
- package/dist/data/chat/fork-seed.d.ts.map +1 -0
- package/dist/data/chat/fork-seed.js +22 -0
- package/dist/data/chat/fork-seed.js.map +1 -0
- package/dist/data/code-highlight.cjs +0 -6
- package/dist/data/code-highlight.cjs.map +1 -1
- package/dist/data/code-highlight.d.ts +4 -3
- package/dist/data/code-highlight.d.ts.map +1 -1
- package/dist/data/code-highlight.js +1 -7
- package/dist/data/code-highlight.js.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +6 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +8 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +6 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.cjs +29 -5
- package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.js +29 -5
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +54 -24
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts +2 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +54 -24
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts +3 -0
- package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.js.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.cjs +14 -30
- package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.d.ts +6 -9
- package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.js +15 -31
- package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.cjs +14 -144
- package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.d.ts +6 -6
- package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.js +15 -145
- package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.cjs +65 -0
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.d.ts +13 -0
- package/dist/data/diagnostics/StackFrameRow.d.ts.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.js +65 -0
- package/dist/data/diagnostics/StackFrameRow.js.map +1 -0
- package/dist/data/diagnostics/ThreadCard.cjs +9 -2
- package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
- package/dist/data/diagnostics/ThreadCard.d.ts +3 -1
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
- package/dist/data/diagnostics/ThreadCard.js +9 -2
- package/dist/data/diagnostics/ThreadCard.js.map +1 -1
- package/dist/data/diagnostics/frame-heuristics.cjs +26 -0
- package/dist/data/diagnostics/frame-heuristics.cjs.map +1 -0
- package/dist/data/diagnostics/frame-heuristics.d.ts +5 -0
- package/dist/data/diagnostics/frame-heuristics.d.ts.map +1 -0
- package/dist/data/diagnostics/frame-heuristics.js +26 -0
- package/dist/data/diagnostics/frame-heuristics.js.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.cjs +5 -7
- package/dist/data/diagnostics/jvm-stacktrace.cjs.map +1 -1
- package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -1
- package/dist/data/diagnostics/jvm-stacktrace.js +5 -7
- package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.cjs +4 -9
- package/dist/data/diagnostics/stacktrace-parse.cjs.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.js +4 -9
- package/dist/data/diagnostics/stacktrace-parse.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +3 -0
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +3 -1
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +3 -0
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.cjs +15 -1
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts +2 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.js +15 -1
- package/dist/data/runtime/RuntimeBarCombo.js.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.cjs +7 -0
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts +2 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.js +7 -0
- package/dist/data/runtime/RuntimeBarSegments.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +7 -1
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +4 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +8 -2
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +18 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/rpc/CommandForm.cjs +8 -18
- package/dist/rpc/CommandForm.cjs.map +1 -1
- package/dist/rpc/CommandForm.d.ts +8 -2
- package/dist/rpc/CommandForm.d.ts.map +1 -1
- package/dist/rpc/CommandForm.js +9 -19
- package/dist/rpc/CommandForm.js.map +1 -1
- package/dist/rpc/OperationActionDialog.cjs +3 -3
- package/dist/rpc/OperationActionDialog.cjs.map +1 -1
- package/dist/rpc/OperationActionDialog.js +3 -3
- package/dist/rpc/OperationActionDialog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs +7 -7
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js +7 -7
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/apiClient.cjs +17 -3
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts +4 -4
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +17 -3
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +5 -9
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +3 -3
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +5 -9
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +1 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc/useOperations.cjs.map +1 -1
- package/dist/rpc/useOperations.d.ts +4 -4
- package/dist/rpc/useOperations.d.ts.map +1 -1
- package/dist/rpc/useOperations.js.map +1 -1
- package/dist/rpc.d.ts +2 -2
- package/dist/rpc.d.ts.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -1
|
@@ -3,13 +3,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const react = require("react");
|
|
5
5
|
const stacktraceParse = require("./stacktrace-parse.cjs");
|
|
6
|
-
const codeHighlight = require("../code-highlight.cjs");
|
|
7
6
|
const Icon = require("../Icon.cjs");
|
|
7
|
+
const StackFrameRow = require("./StackFrameRow.cjs");
|
|
8
8
|
const UiError = require("../../icons/components/UiError.cjs");
|
|
9
9
|
const UiStackFrameDot = require("../../icons/components/UiStackFrameDot.cjs");
|
|
10
|
-
const UiChip = require("../../icons/components/UiChip.cjs");
|
|
11
|
-
const UiDebugStepOver = require("../../icons/components/UiDebugStepOver.cjs");
|
|
12
|
-
const UiMethod = require("../../icons/components/UiMethod.cjs");
|
|
13
10
|
function StackTrace({
|
|
14
11
|
input,
|
|
15
12
|
language = "java",
|
|
@@ -18,6 +15,7 @@ function StackTrace({
|
|
|
18
15
|
hideRuntimeOnly = false,
|
|
19
16
|
include,
|
|
20
17
|
exclude,
|
|
18
|
+
frameActions,
|
|
21
19
|
className
|
|
22
20
|
}) {
|
|
23
21
|
const parsed = react.useMemo(() => {
|
|
@@ -32,13 +30,8 @@ function StackTrace({
|
|
|
32
30
|
if (frame.sourceLines && frame.sourceLines.length > 0) return frame;
|
|
33
31
|
const resolved = resolver(frame, contextLines);
|
|
34
32
|
if (!resolved) return frame;
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
sourceLines: resolved.lines,
|
|
38
|
-
sourceStartLine: resolved.startLine
|
|
39
|
-
};
|
|
40
|
-
if (resolved.language !== void 0) next.sourceLanguage = resolved.language;
|
|
41
|
-
return next;
|
|
33
|
+
const { line: _ignored, ...source } = resolved;
|
|
34
|
+
return { ...frame, ...source };
|
|
42
35
|
});
|
|
43
36
|
}, [parsed.frames, resolver, contextLines]);
|
|
44
37
|
const visibleFrames = react.useMemo(() => {
|
|
@@ -92,7 +85,16 @@ function StackTrace({
|
|
|
92
85
|
},
|
|
93
86
|
i
|
|
94
87
|
)) }),
|
|
95
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "divide-y divide-border/60", children: visibleFrames.map((frame, idx) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
88
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "divide-y divide-border/60", children: visibleFrames.map((frame, idx) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
89
|
+
StackFrameRow.StackFrameRow,
|
|
90
|
+
{
|
|
91
|
+
frame,
|
|
92
|
+
index: idx,
|
|
93
|
+
showIndex: true,
|
|
94
|
+
...frameActions ? { frameActions } : {}
|
|
95
|
+
},
|
|
96
|
+
`${frame.functionName}-${idx}`
|
|
97
|
+
)) }),
|
|
96
98
|
hasFilteredFrames && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-t border-border bg-muted/30 px-3 py-1.5 text-[11px] text-muted-foreground", children: [
|
|
97
99
|
"Showing ",
|
|
98
100
|
visibleFrames.length,
|
|
@@ -104,137 +106,5 @@ function StackTrace({
|
|
|
104
106
|
}
|
|
105
107
|
);
|
|
106
108
|
}
|
|
107
|
-
function FrameWithSource({ frame, index }) {
|
|
108
|
-
const hasSource = frame.sourceLines && frame.sourceLines.length > 0;
|
|
109
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: hasSource ? "bg-amber-500/[0.03]" : void 0, children: [
|
|
110
|
-
/* @__PURE__ */ jsxRuntime.jsx(StackFrameRow, { frame, index }),
|
|
111
|
-
hasSource ? /* @__PURE__ */ jsxRuntime.jsx(SourceWindow, { frame }) : null
|
|
112
|
-
] });
|
|
113
|
-
}
|
|
114
|
-
function StackFrameRow({ frame, index }) {
|
|
115
|
-
const icon = frame.nativeMethod ? UiChip.UiChip : frame.runtime ? UiDebugStepOver.UiDebugStepOver : UiMethod.UiMethod;
|
|
116
|
-
const className = frame.class;
|
|
117
|
-
const methodName = frame.displayName || frame.method || frame.functionName;
|
|
118
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
119
|
-
"div",
|
|
120
|
-
{
|
|
121
|
-
className: [
|
|
122
|
-
"grid grid-cols-[2rem_minmax(0,1fr)] gap-2 px-3 py-1.5 text-xs",
|
|
123
|
-
frame.runtime ? "text-muted-foreground" : "text-foreground"
|
|
124
|
-
].join(" "),
|
|
125
|
-
children: [
|
|
126
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground", children: [
|
|
127
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: index + 1 }),
|
|
128
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon, className: "mt-px shrink-0 text-[11px]" })
|
|
129
|
-
] }),
|
|
130
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5", children: [
|
|
131
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 break-all font-mono font-semibold leading-4", children: methodName }),
|
|
132
|
-
className && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 break-all font-mono text-[11px] text-muted-foreground", children: className }),
|
|
133
|
-
frame.location && /* @__PURE__ */ jsxRuntime.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 })
|
|
134
|
-
] }) })
|
|
135
|
-
]
|
|
136
|
-
}
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
function inlineCommentPrefix(language) {
|
|
140
|
-
switch (language) {
|
|
141
|
-
case "python":
|
|
142
|
-
case "py":
|
|
143
|
-
case "bash":
|
|
144
|
-
case "sh":
|
|
145
|
-
case "shell":
|
|
146
|
-
case "ruby":
|
|
147
|
-
case "rb":
|
|
148
|
-
case "yaml":
|
|
149
|
-
case "yml":
|
|
150
|
-
case "toml":
|
|
151
|
-
return "#";
|
|
152
|
-
default:
|
|
153
|
-
return "//";
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
function buildAnnotatedSource(lines, startLine, focalLine, language) {
|
|
157
|
-
const focalIdx = focalLine - startLine;
|
|
158
|
-
if (focalIdx < 0 || focalIdx >= lines.length) {
|
|
159
|
-
return lines.join("\n");
|
|
160
|
-
}
|
|
161
|
-
const prefix = inlineCommentPrefix(language);
|
|
162
|
-
return lines.map((src, i) => i === focalIdx ? `${src} ${prefix} [!code error]` : src).join("\n");
|
|
163
|
-
}
|
|
164
|
-
function SourceWindow({ frame }) {
|
|
165
|
-
const start = frame.sourceStartLine ?? 0;
|
|
166
|
-
const focal = frame.line ?? -1;
|
|
167
|
-
const lines = frame.sourceLines ?? [];
|
|
168
|
-
const lineNumbers = frame.sourceLineNumbers;
|
|
169
|
-
const language = frame.sourceLanguage ?? "java";
|
|
170
|
-
const rows = react.useMemo(
|
|
171
|
-
() => lines.map((src, i) => ({
|
|
172
|
-
source: src,
|
|
173
|
-
lineNumber: (lineNumbers == null ? void 0 : lineNumbers[i]) ?? start + i
|
|
174
|
-
})),
|
|
175
|
-
[lineNumbers, lines, start]
|
|
176
|
-
);
|
|
177
|
-
const hasExplicitLineNumbers = lineNumbers != null && lineNumbers.length > 0;
|
|
178
|
-
const annotatedSource = react.useMemo(
|
|
179
|
-
() => buildAnnotatedSource(lines, start, focal, language),
|
|
180
|
-
[lines, start, focal, language]
|
|
181
|
-
);
|
|
182
|
-
const [html, setHtml] = react.useState(null);
|
|
183
|
-
react.useEffect(() => {
|
|
184
|
-
if (!annotatedSource || hasExplicitLineNumbers) {
|
|
185
|
-
setHtml(null);
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
let cancelled = false;
|
|
189
|
-
codeHighlight.loadShikiTransformers().then(
|
|
190
|
-
({ transformerNotationErrorLevel }) => codeHighlight.highlightCode(annotatedSource, {
|
|
191
|
-
lang: language,
|
|
192
|
-
transformers: [transformerNotationErrorLevel()]
|
|
193
|
-
})
|
|
194
|
-
).then((out) => {
|
|
195
|
-
if (!cancelled) setHtml(out);
|
|
196
|
-
});
|
|
197
|
-
return () => {
|
|
198
|
-
cancelled = true;
|
|
199
|
-
};
|
|
200
|
-
}, [annotatedSource, hasExplicitLineNumbers, language]);
|
|
201
|
-
const counterStart = start - 1;
|
|
202
|
-
if (!html || hasExplicitLineNumbers) {
|
|
203
|
-
return /* @__PURE__ */ jsxRuntime.jsx(SourceRows, { rows, focal });
|
|
204
|
-
}
|
|
205
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
206
|
-
"div",
|
|
207
|
-
{
|
|
208
|
-
className: "stacktrace-source ml-6 overflow-x-auto rounded border border-border/50 bg-muted/30 p-2 text-[11px] leading-relaxed",
|
|
209
|
-
style: { ["--shiki-start"]: counterStart },
|
|
210
|
-
dangerouslySetInnerHTML: { __html: html }
|
|
211
|
-
}
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
function SourceRows({
|
|
215
|
-
rows,
|
|
216
|
-
focal
|
|
217
|
-
}) {
|
|
218
|
-
return /* @__PURE__ */ jsxRuntime.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) => {
|
|
219
|
-
const isFocal = row.lineNumber === focal;
|
|
220
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
221
|
-
"div",
|
|
222
|
-
{
|
|
223
|
-
className: [
|
|
224
|
-
"grid min-w-max grid-cols-[3.5rem_minmax(24rem,1fr)] gap-3 px-2",
|
|
225
|
-
isFocal ? "bg-red-500/10 font-semibold text-red-800 dark:text-red-300" : "text-foreground"
|
|
226
|
-
].join(" "),
|
|
227
|
-
children: [
|
|
228
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "select-none text-right text-muted-foreground", children: [
|
|
229
|
-
isFocal ? ">" : "",
|
|
230
|
-
row.lineNumber
|
|
231
|
-
] }),
|
|
232
|
-
/* @__PURE__ */ jsxRuntime.jsx("code", { className: "whitespace-pre", children: row.source || " " })
|
|
233
|
-
]
|
|
234
|
-
},
|
|
235
|
-
`${row.lineNumber}-${i}`
|
|
236
|
-
);
|
|
237
|
-
}) });
|
|
238
|
-
}
|
|
239
109
|
exports.StackTrace = StackTrace;
|
|
240
110
|
//# sourceMappingURL=RenderedStackTrace.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderedStackTrace.cjs","sources":["../../../src/data/diagnostics/RenderedStackTrace.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport {\n parseJavaStackTrace,\n type ParsedStackFrame,\n type ParsedStackTrace,\n} from \"./stacktrace-parse\";\nimport { highlightCode, loadShikiTransformers } from \"../code-highlight\";\nimport { Icon } from \"../Icon\";\nimport { UiChip, UiStackFrameDot, UiDebugStepOver, UiError, UiMethod } from \"../../icons\";\n\n// SourceResolver matches the Go clicky.SourceResolver interface: given a\n// frame, return surrounding source lines so the renderer can display inline\n// context. Failures must be silent (return undefined) so a missing class\n// never blocks the rest of the trace.\nexport type StackTraceSourceResolver = (\n frame: ParsedStackFrame,\n contextLines: number,\n) =>\n | {\n lines: string[];\n startLine: number;\n language?: string;\n }\n | undefined;\n\nexport interface StackTraceProps {\n /**\n * Raw Java stack-trace string or a pre-parsed ParsedStackTrace\n * from a backend/parser.\n */\n input: string | ParsedStackTrace;\n /** Parser language. Currently Java stack traces are supported. */\n language?: \"java\";\n /** Optional source-line resolver for inline context under frames. */\n resolver?: StackTraceSourceResolver;\n /** Number of source lines to request around each frame. */\n contextLines?: number;\n /** Hide frames known to be runtime/library-only. */\n hideRuntimeOnly?: boolean;\n /** Only show frames whose class starts with one of these prefixes. */\n include?: string[];\n /** Hide frames whose class starts with one of these prefixes. */\n exclude?: string[];\n /** Classes applied to the stack-trace shell. */\n className?: string;\n}\n\n// StackTrace is the React counterpart to Go's clicky.StackTrace builder. Pass\n// a raw exception dump and it parses + renders frames; pass a SourceResolver\n// to get inline source context (±N lines) under each frame, with the focal\n// line highlighted.\nexport function StackTrace({\n input,\n language = \"java\",\n resolver,\n contextLines = 3,\n hideRuntimeOnly = false,\n include,\n exclude,\n className,\n}: StackTraceProps) {\n const parsed = useMemo<ParsedStackTrace>(() => {\n if (typeof input === \"string\") {\n return parseJavaStackTrace(input);\n }\n return input;\n }, [input, language]);\n\n const enrichedFrames = useMemo<ParsedStackFrame[]>(() => {\n if (!resolver) return parsed.frames;\n return parsed.frames.map((frame): ParsedStackFrame => {\n if (frame.sourceLines && frame.sourceLines.length > 0) return frame;\n const resolved = resolver(frame, contextLines);\n if (!resolved) return frame;\n const next: ParsedStackFrame = {\n ...frame,\n sourceLines: resolved.lines,\n sourceStartLine: resolved.startLine,\n };\n if (resolved.language !== undefined) next.sourceLanguage = resolved.language;\n return next;\n });\n }, [parsed.frames, resolver, contextLines]);\n\n const visibleFrames = useMemo(() => {\n return enrichedFrames.filter((frame) => {\n if (hideRuntimeOnly && frame.runtime) return false;\n if (exclude && exclude.some((p) => frame.class?.startsWith(p))) return false;\n if (include && include.length > 0) {\n return include.some((p) => frame.class?.startsWith(p));\n }\n return true;\n });\n }, [enrichedFrames, hideRuntimeOnly, include, exclude]);\n\n if (visibleFrames.length === 0 && !parsed.exceptionClass) return null;\n\n const hasFilteredFrames = visibleFrames.length !== enrichedFrames.length;\n\n return (\n <div\n className={[\n \"overflow-hidden rounded-md border border-border bg-background text-foreground\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {(parsed.exceptionClass || parsed.message) && (\n <div className=\"border-b border-border bg-red-500/5 px-3 py-2\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <Icon\n icon={UiError}\n className=\"mt-0.5 shrink-0 text-sm text-red-600 dark:text-red-400\"\n />\n <div className=\"min-w-0 flex-1\">\n {parsed.exceptionClass && (\n <div className=\"break-all font-mono text-xs font-semibold text-red-700 dark:text-red-300\">\n {parsed.exceptionClass}\n </div>\n )}\n {parsed.message && (\n <div className=\"mt-0.5 whitespace-pre-wrap break-words text-xs text-foreground\">\n {parsed.message}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n {parsed.causedBy.length > 0 && (\n <div className=\"space-y-1 border-b border-border bg-orange-500/5 px-3 py-2\">\n {parsed.causedBy.map((cause, i) => (\n <div\n key={i}\n className=\"flex min-w-0 items-start gap-2 font-mono text-[11px] text-orange-700 dark:text-orange-300\"\n >\n <Icon icon={UiStackFrameDot} className=\"mt-0.5 shrink-0 text-xs\" />\n <span className=\"shrink-0 opacity-75\">Caused by</span>\n <span className=\"min-w-0 break-all\">{cause}</span>\n </div>\n ))}\n </div>\n )}\n <div className=\"divide-y divide-border/60\">\n {visibleFrames.map((frame, idx) => (\n <FrameWithSource key={`${frame.functionName}-${idx}`} frame={frame} index={idx} />\n ))}\n </div>\n {hasFilteredFrames && (\n <div className=\"border-t border-border bg-muted/30 px-3 py-1.5 text-[11px] text-muted-foreground\">\n Showing {visibleFrames.length} of {enrichedFrames.length} frames\n </div>\n )}\n </div>\n );\n}\n\nfunction FrameWithSource({ frame, index }: { frame: ParsedStackFrame; index: number }) {\n const hasSource = frame.sourceLines && frame.sourceLines.length > 0;\n\n return (\n <div className={hasSource ? \"bg-amber-500/[0.03]\" : undefined}>\n <StackFrameRow frame={frame} index={index} />\n {hasSource ? <SourceWindow frame={frame} /> : null}\n </div>\n );\n}\n\nfunction StackFrameRow({ frame, index }: { frame: ParsedStackFrame; index: number }) {\n const icon = frame.nativeMethod ? UiChip : frame.runtime ? UiDebugStepOver : UiMethod;\n const className = frame.class;\n const methodName = frame.displayName || frame.method || frame.functionName;\n\n return (\n <div\n className={[\n \"grid grid-cols-[2rem_minmax(0,1fr)] gap-2 px-3 py-1.5 text-xs\",\n frame.runtime ? \"text-muted-foreground\" : \"text-foreground\",\n ].join(\" \")}\n >\n <div className=\"flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground\">\n <span>{index + 1}</span>\n <Icon icon={icon} className=\"mt-px shrink-0 text-[11px]\" />\n </div>\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n <span className=\"min-w-0 break-all font-mono font-semibold leading-4\">{methodName}</span>\n {className && (\n <span className=\"min-w-0 break-all font-mono text-[11px] text-muted-foreground\">\n {className}\n </span>\n )}\n {frame.location && (\n <span className=\"rounded border border-border bg-muted/40 px-1.5 py-px font-mono text-[10px] text-muted-foreground\">\n {frame.location}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// Picks the language-appropriate inline comment prefix for the\n// `[!code error]` marker that Shiki's transformerNotationErrorLevel\n// recognises (https://shiki.style/packages/transformers#transformernotationerrorlevel).\n// We deliberately stick to single-line markers — block comments would\n// confuse the transformer's per-line scan.\nfunction inlineCommentPrefix(language: string): string {\n switch (language) {\n case \"python\":\n case \"py\":\n case \"bash\":\n case \"sh\":\n case \"shell\":\n case \"ruby\":\n case \"rb\":\n case \"yaml\":\n case \"yml\":\n case \"toml\":\n return \"#\";\n default:\n // Java, Go, TS/JS, C/C++, C#, Rust, Kotlin, Swift, Scala, Groovy…\n return \"//\";\n }\n}\n\nfunction buildAnnotatedSource(\n lines: string[],\n startLine: number,\n focalLine: number,\n language: string,\n): string {\n const focalIdx = focalLine - startLine;\n if (focalIdx < 0 || focalIdx >= lines.length) {\n return lines.join(\"\\n\");\n }\n const prefix = inlineCommentPrefix(language);\n return lines\n .map((src, i) => (i === focalIdx ? `${src} ${prefix} [!code error]` : src))\n .join(\"\\n\");\n}\n\nfunction SourceWindow({ frame }: { frame: ParsedStackFrame }) {\n const start = frame.sourceStartLine ?? 0;\n const focal = frame.line ?? -1;\n const lines = frame.sourceLines ?? [];\n const lineNumbers = frame.sourceLineNumbers;\n const language = frame.sourceLanguage ?? \"java\";\n\n const rows = useMemo(\n () =>\n lines.map((src, i) => ({\n source: src,\n lineNumber: lineNumbers?.[i] ?? start + i,\n })),\n [lineNumbers, lines, start],\n );\n\n const hasExplicitLineNumbers = lineNumbers != null && lineNumbers.length > 0;\n\n const annotatedSource = useMemo(\n () => buildAnnotatedSource(lines, start, focal, language),\n [lines, start, focal, language],\n );\n\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n if (!annotatedSource || hasExplicitLineNumbers) {\n setHtml(null);\n return;\n }\n let cancelled = false;\n loadShikiTransformers()\n .then(({ transformerNotationErrorLevel }) =>\n highlightCode(annotatedSource, {\n lang: language,\n transformers: [transformerNotationErrorLevel()],\n }),\n )\n .then((out) => {\n if (!cancelled) setHtml(out);\n });\n return () => {\n cancelled = true;\n };\n }, [annotatedSource, hasExplicitLineNumbers, language]);\n\n // CSS-counter-driven line-number gutter: the wrapping <div> seeds a\n // counter that each rendered `.line` increments. `--shiki-start` lets\n // us start counting from the absolute frame line number rather than 1.\n // Without `start` we'd need a server-rendered `<ol start=\"...\">` which\n // would fight Shiki's own `<span class=\"line\">` markup.\n const counterStart = start - 1;\n\n if (!html || hasExplicitLineNumbers) {\n return <SourceRows rows={rows} focal={focal} />;\n }\n\n return (\n <div\n className=\"stacktrace-source ml-6 overflow-x-auto rounded border border-border/50 bg-muted/30 p-2 text-[11px] leading-relaxed\"\n style={{ [\"--shiki-start\" as string]: counterStart }}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n}\n\nfunction SourceRows({\n rows,\n focal,\n}: {\n rows: Array<{ source: string; lineNumber: number }>;\n focal: number;\n}) {\n return (\n <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\">\n {rows.map((row, i) => {\n const isFocal = row.lineNumber === focal;\n return (\n <div\n key={`${row.lineNumber}-${i}`}\n className={[\n \"grid min-w-max grid-cols-[3.5rem_minmax(24rem,1fr)] gap-3 px-2\",\n isFocal\n ? \"bg-red-500/10 font-semibold text-red-800 dark:text-red-300\"\n : \"text-foreground\",\n ].join(\" \")}\n >\n <span className=\"select-none text-right text-muted-foreground\">\n {isFocal ? \">\" : \"\"}\n {row.lineNumber}\n </span>\n <code className=\"whitespace-pre\">{row.source || \" \"}</code>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["useMemo","parseJavaStackTrace","jsxs","jsx","Icon","UiError","UiStackFrameDot","UiChip","UiDebugStepOver","UiMethod","useState","useEffect","loadShikiTransformers","highlightCode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RenderedStackTrace.cjs","sources":["../../../src/data/diagnostics/RenderedStackTrace.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport {\n parseJavaStackTrace,\n type ParsedStackFrame,\n type ParsedStackTrace,\n} from \"./stacktrace-parse\";\nimport { Icon } from \"../Icon\";\nimport { UiStackFrameDot, UiError } from \"../../icons\";\nimport { StackFrameRow, type StackFrameActions } from \"./StackFrameRow\";\nimport type { FrameSource } from \"./FrameSourceWindow.utils\";\n\n// SourceResolver matches the Go clicky.SourceResolver interface: given a\n// frame, return surrounding source lines so the renderer can display inline\n// context. Failures must be silent (return undefined) so a missing class\n// never blocks the rest of the trace.\n//\n// The return shape is `FrameSource` — the same shape the source window\n// consumes and the same one the JVM thread-dump resolver returns, so a caller\n// that can resolve source for one surface can resolve it for both.\nexport type StackTraceSourceResolver = (\n frame: ParsedStackFrame,\n contextLines: number,\n) => FrameSource | undefined;\n\nexport interface StackTraceProps {\n /**\n * Raw Java stack-trace string or a pre-parsed ParsedStackTrace\n * from a backend/parser.\n */\n input: string | ParsedStackTrace;\n /** Parser language. Currently Java stack traces are supported. */\n language?: \"java\";\n /** Optional source-line resolver for inline context under frames. */\n resolver?: StackTraceSourceResolver;\n /** Number of source lines to request around each frame. */\n contextLines?: number;\n /** Hide frames known to be runtime/library-only. */\n hideRuntimeOnly?: boolean;\n /** Only show frames whose class starts with one of these prefixes. */\n include?: string[];\n /** Hide frames whose class starts with one of these prefixes. */\n exclude?: string[];\n /** Trailing per-frame actions, revealed on hover/focus. */\n frameActions?: StackFrameActions;\n /** Classes applied to the stack-trace shell. */\n className?: string;\n}\n\n// StackTrace is the React counterpart to Go's clicky.StackTrace builder. Pass\n// a raw exception dump and it parses + renders frames; pass a SourceResolver\n// to get inline source context (±N lines) under each frame, with the focal\n// line highlighted. Frames themselves are rendered by the shared StackFrameRow.\nexport function StackTrace({\n input,\n language = \"java\",\n resolver,\n contextLines = 3,\n hideRuntimeOnly = false,\n include,\n exclude,\n frameActions,\n className,\n}: StackTraceProps) {\n const parsed = useMemo<ParsedStackTrace>(() => {\n if (typeof input === \"string\") {\n return parseJavaStackTrace(input);\n }\n return input;\n }, [input, language]);\n\n const enrichedFrames = useMemo<ParsedStackFrame[]>(() => {\n if (!resolver) return parsed.frames;\n return parsed.frames.map((frame): ParsedStackFrame => {\n if (frame.sourceLines && frame.sourceLines.length > 0) return frame;\n const resolved = resolver(frame, contextLines);\n if (!resolved) return frame;\n // `line` stays the frame's own — it is what the window highlights, and a\n // resolver returning one would silently move the focal line off the throw.\n const { line: _ignored, ...source } = resolved;\n return { ...frame, ...source };\n });\n }, [parsed.frames, resolver, contextLines]);\n\n const visibleFrames = useMemo(() => {\n return enrichedFrames.filter((frame) => {\n if (hideRuntimeOnly && frame.runtime) return false;\n if (exclude && exclude.some((p) => frame.class?.startsWith(p))) return false;\n if (include && include.length > 0) {\n return include.some((p) => frame.class?.startsWith(p));\n }\n return true;\n });\n }, [enrichedFrames, hideRuntimeOnly, include, exclude]);\n\n if (visibleFrames.length === 0 && !parsed.exceptionClass) return null;\n\n const hasFilteredFrames = visibleFrames.length !== enrichedFrames.length;\n\n return (\n <div\n className={[\n \"overflow-hidden rounded-md border border-border bg-background text-foreground\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {(parsed.exceptionClass || parsed.message) && (\n <div className=\"border-b border-border bg-red-500/5 px-3 py-2\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <Icon\n icon={UiError}\n className=\"mt-0.5 shrink-0 text-sm text-red-600 dark:text-red-400\"\n />\n <div className=\"min-w-0 flex-1\">\n {parsed.exceptionClass && (\n <div className=\"break-all font-mono text-xs font-semibold text-red-700 dark:text-red-300\">\n {parsed.exceptionClass}\n </div>\n )}\n {parsed.message && (\n <div className=\"mt-0.5 whitespace-pre-wrap break-words text-xs text-foreground\">\n {parsed.message}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n {parsed.causedBy.length > 0 && (\n <div className=\"space-y-1 border-b border-border bg-orange-500/5 px-3 py-2\">\n {parsed.causedBy.map((cause, i) => (\n <div\n key={i}\n className=\"flex min-w-0 items-start gap-2 font-mono text-[11px] text-orange-700 dark:text-orange-300\"\n >\n <Icon icon={UiStackFrameDot} className=\"mt-0.5 shrink-0 text-xs\" />\n <span className=\"shrink-0 opacity-75\">Caused by</span>\n <span className=\"min-w-0 break-all\">{cause}</span>\n </div>\n ))}\n </div>\n )}\n <div className=\"divide-y divide-border/60\">\n {visibleFrames.map((frame, idx) => (\n <StackFrameRow\n key={`${frame.functionName}-${idx}`}\n frame={frame}\n index={idx}\n showIndex\n {...(frameActions ? { frameActions } : {})}\n />\n ))}\n </div>\n {hasFilteredFrames && (\n <div className=\"border-t border-border bg-muted/30 px-3 py-1.5 text-[11px] text-muted-foreground\">\n Showing {visibleFrames.length} of {enrichedFrames.length} frames\n </div>\n )}\n </div>\n );\n}\n"],"names":["useMemo","parseJavaStackTrace","jsxs","jsx","Icon","UiError","UiStackFrameDot","StackFrameRow"],"mappings":"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"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { ParsedStackFrame, ParsedStackTrace } from './stacktrace-parse';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
language?: string;
|
|
6
|
-
} | undefined;
|
|
2
|
+
import { StackFrameActions } from './StackFrameRow';
|
|
3
|
+
import { FrameSource } from './FrameSourceWindow.utils';
|
|
4
|
+
export type StackTraceSourceResolver = (frame: ParsedStackFrame, contextLines: number) => FrameSource | undefined;
|
|
7
5
|
export interface StackTraceProps {
|
|
8
6
|
/**
|
|
9
7
|
* Raw Java stack-trace string or a pre-parsed ParsedStackTrace
|
|
@@ -22,8 +20,10 @@ export interface StackTraceProps {
|
|
|
22
20
|
include?: string[];
|
|
23
21
|
/** Hide frames whose class starts with one of these prefixes. */
|
|
24
22
|
exclude?: string[];
|
|
23
|
+
/** Trailing per-frame actions, revealed on hover/focus. */
|
|
24
|
+
frameActions?: StackFrameActions;
|
|
25
25
|
/** Classes applied to the stack-trace shell. */
|
|
26
26
|
className?: string;
|
|
27
27
|
}
|
|
28
|
-
export declare function StackTrace({ input, language, resolver, contextLines, hideRuntimeOnly, include, exclude, className, }: StackTraceProps): import("react/jsx-runtime").JSX.Element | null;
|
|
28
|
+
export declare function StackTrace({ input, language, resolver, contextLines, hideRuntimeOnly, include, exclude, frameActions, className, }: StackTraceProps): import("react/jsx-runtime").JSX.Element | null;
|
|
29
29
|
//# sourceMappingURL=RenderedStackTrace.d.ts.map
|
|
@@ -1 +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;
|
|
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;AAG5B,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAU7D,MAAM,MAAM,wBAAwB,GAAG,CACrC,KAAK,EAAE,gBAAgB,EACvB,YAAY,EAAE,MAAM,KACjB,WAAW,GAAG,SAAS,CAAC;AAE7B,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACjC,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IACpC,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,gDAAgD;IAChD,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,YAAY,EACZ,SAAS,GACV,EAAE,eAAe,kDAmGjB"}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useMemo
|
|
2
|
+
import { useMemo } from "react";
|
|
3
3
|
import { parseJavaStackTrace } from "./stacktrace-parse.js";
|
|
4
|
-
import { loadShikiTransformers, highlightCode } from "../code-highlight.js";
|
|
5
4
|
import { Icon } from "../Icon.js";
|
|
5
|
+
import { StackFrameRow } from "./StackFrameRow.js";
|
|
6
6
|
import { UiError } from "../../icons/components/UiError.js";
|
|
7
7
|
import { UiStackFrameDot } from "../../icons/components/UiStackFrameDot.js";
|
|
8
|
-
import { UiChip } from "../../icons/components/UiChip.js";
|
|
9
|
-
import { UiDebugStepOver } from "../../icons/components/UiDebugStepOver.js";
|
|
10
|
-
import { UiMethod } from "../../icons/components/UiMethod.js";
|
|
11
8
|
function StackTrace({
|
|
12
9
|
input,
|
|
13
10
|
language = "java",
|
|
@@ -16,6 +13,7 @@ function StackTrace({
|
|
|
16
13
|
hideRuntimeOnly = false,
|
|
17
14
|
include,
|
|
18
15
|
exclude,
|
|
16
|
+
frameActions,
|
|
19
17
|
className
|
|
20
18
|
}) {
|
|
21
19
|
const parsed = useMemo(() => {
|
|
@@ -30,13 +28,8 @@ function StackTrace({
|
|
|
30
28
|
if (frame.sourceLines && frame.sourceLines.length > 0) return frame;
|
|
31
29
|
const resolved = resolver(frame, contextLines);
|
|
32
30
|
if (!resolved) return frame;
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
sourceLines: resolved.lines,
|
|
36
|
-
sourceStartLine: resolved.startLine
|
|
37
|
-
};
|
|
38
|
-
if (resolved.language !== void 0) next.sourceLanguage = resolved.language;
|
|
39
|
-
return next;
|
|
31
|
+
const { line: _ignored, ...source } = resolved;
|
|
32
|
+
return { ...frame, ...source };
|
|
40
33
|
});
|
|
41
34
|
}, [parsed.frames, resolver, contextLines]);
|
|
42
35
|
const visibleFrames = useMemo(() => {
|
|
@@ -90,7 +83,16 @@ function StackTrace({
|
|
|
90
83
|
},
|
|
91
84
|
i
|
|
92
85
|
)) }),
|
|
93
|
-
/* @__PURE__ */ jsx("div", { className: "divide-y divide-border/60", children: visibleFrames.map((frame, idx) => /* @__PURE__ */ jsx(
|
|
86
|
+
/* @__PURE__ */ jsx("div", { className: "divide-y divide-border/60", children: visibleFrames.map((frame, idx) => /* @__PURE__ */ jsx(
|
|
87
|
+
StackFrameRow,
|
|
88
|
+
{
|
|
89
|
+
frame,
|
|
90
|
+
index: idx,
|
|
91
|
+
showIndex: true,
|
|
92
|
+
...frameActions ? { frameActions } : {}
|
|
93
|
+
},
|
|
94
|
+
`${frame.functionName}-${idx}`
|
|
95
|
+
)) }),
|
|
94
96
|
hasFilteredFrames && /* @__PURE__ */ jsxs("div", { className: "border-t border-border bg-muted/30 px-3 py-1.5 text-[11px] text-muted-foreground", children: [
|
|
95
97
|
"Showing ",
|
|
96
98
|
visibleFrames.length,
|
|
@@ -102,138 +104,6 @@ function StackTrace({
|
|
|
102
104
|
}
|
|
103
105
|
);
|
|
104
106
|
}
|
|
105
|
-
function FrameWithSource({ frame, index }) {
|
|
106
|
-
const hasSource = frame.sourceLines && frame.sourceLines.length > 0;
|
|
107
|
-
return /* @__PURE__ */ jsxs("div", { className: hasSource ? "bg-amber-500/[0.03]" : void 0, children: [
|
|
108
|
-
/* @__PURE__ */ jsx(StackFrameRow, { frame, index }),
|
|
109
|
-
hasSource ? /* @__PURE__ */ jsx(SourceWindow, { frame }) : null
|
|
110
|
-
] });
|
|
111
|
-
}
|
|
112
|
-
function StackFrameRow({ frame, index }) {
|
|
113
|
-
const icon = frame.nativeMethod ? UiChip : frame.runtime ? UiDebugStepOver : UiMethod;
|
|
114
|
-
const className = frame.class;
|
|
115
|
-
const methodName = frame.displayName || frame.method || frame.functionName;
|
|
116
|
-
return /* @__PURE__ */ jsxs(
|
|
117
|
-
"div",
|
|
118
|
-
{
|
|
119
|
-
className: [
|
|
120
|
-
"grid grid-cols-[2rem_minmax(0,1fr)] gap-2 px-3 py-1.5 text-xs",
|
|
121
|
-
frame.runtime ? "text-muted-foreground" : "text-foreground"
|
|
122
|
-
].join(" "),
|
|
123
|
-
children: [
|
|
124
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground", children: [
|
|
125
|
-
/* @__PURE__ */ jsx("span", { children: index + 1 }),
|
|
126
|
-
/* @__PURE__ */ jsx(Icon, { icon, className: "mt-px shrink-0 text-[11px]" })
|
|
127
|
-
] }),
|
|
128
|
-
/* @__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: [
|
|
129
|
-
/* @__PURE__ */ jsx("span", { className: "min-w-0 break-all font-mono font-semibold leading-4", children: methodName }),
|
|
130
|
-
className && /* @__PURE__ */ jsx("span", { className: "min-w-0 break-all font-mono text-[11px] text-muted-foreground", children: className }),
|
|
131
|
-
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 })
|
|
132
|
-
] }) })
|
|
133
|
-
]
|
|
134
|
-
}
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
function inlineCommentPrefix(language) {
|
|
138
|
-
switch (language) {
|
|
139
|
-
case "python":
|
|
140
|
-
case "py":
|
|
141
|
-
case "bash":
|
|
142
|
-
case "sh":
|
|
143
|
-
case "shell":
|
|
144
|
-
case "ruby":
|
|
145
|
-
case "rb":
|
|
146
|
-
case "yaml":
|
|
147
|
-
case "yml":
|
|
148
|
-
case "toml":
|
|
149
|
-
return "#";
|
|
150
|
-
default:
|
|
151
|
-
return "//";
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
function buildAnnotatedSource(lines, startLine, focalLine, language) {
|
|
155
|
-
const focalIdx = focalLine - startLine;
|
|
156
|
-
if (focalIdx < 0 || focalIdx >= lines.length) {
|
|
157
|
-
return lines.join("\n");
|
|
158
|
-
}
|
|
159
|
-
const prefix = inlineCommentPrefix(language);
|
|
160
|
-
return lines.map((src, i) => i === focalIdx ? `${src} ${prefix} [!code error]` : src).join("\n");
|
|
161
|
-
}
|
|
162
|
-
function SourceWindow({ frame }) {
|
|
163
|
-
const start = frame.sourceStartLine ?? 0;
|
|
164
|
-
const focal = frame.line ?? -1;
|
|
165
|
-
const lines = frame.sourceLines ?? [];
|
|
166
|
-
const lineNumbers = frame.sourceLineNumbers;
|
|
167
|
-
const language = frame.sourceLanguage ?? "java";
|
|
168
|
-
const rows = useMemo(
|
|
169
|
-
() => lines.map((src, i) => ({
|
|
170
|
-
source: src,
|
|
171
|
-
lineNumber: (lineNumbers == null ? void 0 : lineNumbers[i]) ?? start + i
|
|
172
|
-
})),
|
|
173
|
-
[lineNumbers, lines, start]
|
|
174
|
-
);
|
|
175
|
-
const hasExplicitLineNumbers = lineNumbers != null && lineNumbers.length > 0;
|
|
176
|
-
const annotatedSource = useMemo(
|
|
177
|
-
() => buildAnnotatedSource(lines, start, focal, language),
|
|
178
|
-
[lines, start, focal, language]
|
|
179
|
-
);
|
|
180
|
-
const [html, setHtml] = useState(null);
|
|
181
|
-
useEffect(() => {
|
|
182
|
-
if (!annotatedSource || hasExplicitLineNumbers) {
|
|
183
|
-
setHtml(null);
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
let cancelled = false;
|
|
187
|
-
loadShikiTransformers().then(
|
|
188
|
-
({ transformerNotationErrorLevel }) => highlightCode(annotatedSource, {
|
|
189
|
-
lang: language,
|
|
190
|
-
transformers: [transformerNotationErrorLevel()]
|
|
191
|
-
})
|
|
192
|
-
).then((out) => {
|
|
193
|
-
if (!cancelled) setHtml(out);
|
|
194
|
-
});
|
|
195
|
-
return () => {
|
|
196
|
-
cancelled = true;
|
|
197
|
-
};
|
|
198
|
-
}, [annotatedSource, hasExplicitLineNumbers, language]);
|
|
199
|
-
const counterStart = start - 1;
|
|
200
|
-
if (!html || hasExplicitLineNumbers) {
|
|
201
|
-
return /* @__PURE__ */ jsx(SourceRows, { rows, focal });
|
|
202
|
-
}
|
|
203
|
-
return /* @__PURE__ */ jsx(
|
|
204
|
-
"div",
|
|
205
|
-
{
|
|
206
|
-
className: "stacktrace-source ml-6 overflow-x-auto rounded border border-border/50 bg-muted/30 p-2 text-[11px] leading-relaxed",
|
|
207
|
-
style: { ["--shiki-start"]: counterStart },
|
|
208
|
-
dangerouslySetInnerHTML: { __html: html }
|
|
209
|
-
}
|
|
210
|
-
);
|
|
211
|
-
}
|
|
212
|
-
function SourceRows({
|
|
213
|
-
rows,
|
|
214
|
-
focal
|
|
215
|
-
}) {
|
|
216
|
-
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) => {
|
|
217
|
-
const isFocal = row.lineNumber === focal;
|
|
218
|
-
return /* @__PURE__ */ jsxs(
|
|
219
|
-
"div",
|
|
220
|
-
{
|
|
221
|
-
className: [
|
|
222
|
-
"grid min-w-max grid-cols-[3.5rem_minmax(24rem,1fr)] gap-3 px-2",
|
|
223
|
-
isFocal ? "bg-red-500/10 font-semibold text-red-800 dark:text-red-300" : "text-foreground"
|
|
224
|
-
].join(" "),
|
|
225
|
-
children: [
|
|
226
|
-
/* @__PURE__ */ jsxs("span", { className: "select-none text-right text-muted-foreground", children: [
|
|
227
|
-
isFocal ? ">" : "",
|
|
228
|
-
row.lineNumber
|
|
229
|
-
] }),
|
|
230
|
-
/* @__PURE__ */ jsx("code", { className: "whitespace-pre", children: row.source || " " })
|
|
231
|
-
]
|
|
232
|
-
},
|
|
233
|
-
`${row.lineNumber}-${i}`
|
|
234
|
-
);
|
|
235
|
-
}) });
|
|
236
|
-
}
|
|
237
107
|
export {
|
|
238
108
|
StackTrace
|
|
239
109
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderedStackTrace.js","sources":["../../../src/data/diagnostics/RenderedStackTrace.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport {\n parseJavaStackTrace,\n type ParsedStackFrame,\n type ParsedStackTrace,\n} from \"./stacktrace-parse\";\nimport { highlightCode, loadShikiTransformers } from \"../code-highlight\";\nimport { Icon } from \"../Icon\";\nimport { UiChip, UiStackFrameDot, UiDebugStepOver, UiError, UiMethod } from \"../../icons\";\n\n// SourceResolver matches the Go clicky.SourceResolver interface: given a\n// frame, return surrounding source lines so the renderer can display inline\n// context. Failures must be silent (return undefined) so a missing class\n// never blocks the rest of the trace.\nexport type StackTraceSourceResolver = (\n frame: ParsedStackFrame,\n contextLines: number,\n) =>\n | {\n lines: string[];\n startLine: number;\n language?: string;\n }\n | undefined;\n\nexport interface StackTraceProps {\n /**\n * Raw Java stack-trace string or a pre-parsed ParsedStackTrace\n * from a backend/parser.\n */\n input: string | ParsedStackTrace;\n /** Parser language. Currently Java stack traces are supported. */\n language?: \"java\";\n /** Optional source-line resolver for inline context under frames. */\n resolver?: StackTraceSourceResolver;\n /** Number of source lines to request around each frame. */\n contextLines?: number;\n /** Hide frames known to be runtime/library-only. */\n hideRuntimeOnly?: boolean;\n /** Only show frames whose class starts with one of these prefixes. */\n include?: string[];\n /** Hide frames whose class starts with one of these prefixes. */\n exclude?: string[];\n /** Classes applied to the stack-trace shell. */\n className?: string;\n}\n\n// StackTrace is the React counterpart to Go's clicky.StackTrace builder. Pass\n// a raw exception dump and it parses + renders frames; pass a SourceResolver\n// to get inline source context (±N lines) under each frame, with the focal\n// line highlighted.\nexport function StackTrace({\n input,\n language = \"java\",\n resolver,\n contextLines = 3,\n hideRuntimeOnly = false,\n include,\n exclude,\n className,\n}: StackTraceProps) {\n const parsed = useMemo<ParsedStackTrace>(() => {\n if (typeof input === \"string\") {\n return parseJavaStackTrace(input);\n }\n return input;\n }, [input, language]);\n\n const enrichedFrames = useMemo<ParsedStackFrame[]>(() => {\n if (!resolver) return parsed.frames;\n return parsed.frames.map((frame): ParsedStackFrame => {\n if (frame.sourceLines && frame.sourceLines.length > 0) return frame;\n const resolved = resolver(frame, contextLines);\n if (!resolved) return frame;\n const next: ParsedStackFrame = {\n ...frame,\n sourceLines: resolved.lines,\n sourceStartLine: resolved.startLine,\n };\n if (resolved.language !== undefined) next.sourceLanguage = resolved.language;\n return next;\n });\n }, [parsed.frames, resolver, contextLines]);\n\n const visibleFrames = useMemo(() => {\n return enrichedFrames.filter((frame) => {\n if (hideRuntimeOnly && frame.runtime) return false;\n if (exclude && exclude.some((p) => frame.class?.startsWith(p))) return false;\n if (include && include.length > 0) {\n return include.some((p) => frame.class?.startsWith(p));\n }\n return true;\n });\n }, [enrichedFrames, hideRuntimeOnly, include, exclude]);\n\n if (visibleFrames.length === 0 && !parsed.exceptionClass) return null;\n\n const hasFilteredFrames = visibleFrames.length !== enrichedFrames.length;\n\n return (\n <div\n className={[\n \"overflow-hidden rounded-md border border-border bg-background text-foreground\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {(parsed.exceptionClass || parsed.message) && (\n <div className=\"border-b border-border bg-red-500/5 px-3 py-2\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <Icon\n icon={UiError}\n className=\"mt-0.5 shrink-0 text-sm text-red-600 dark:text-red-400\"\n />\n <div className=\"min-w-0 flex-1\">\n {parsed.exceptionClass && (\n <div className=\"break-all font-mono text-xs font-semibold text-red-700 dark:text-red-300\">\n {parsed.exceptionClass}\n </div>\n )}\n {parsed.message && (\n <div className=\"mt-0.5 whitespace-pre-wrap break-words text-xs text-foreground\">\n {parsed.message}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n {parsed.causedBy.length > 0 && (\n <div className=\"space-y-1 border-b border-border bg-orange-500/5 px-3 py-2\">\n {parsed.causedBy.map((cause, i) => (\n <div\n key={i}\n className=\"flex min-w-0 items-start gap-2 font-mono text-[11px] text-orange-700 dark:text-orange-300\"\n >\n <Icon icon={UiStackFrameDot} className=\"mt-0.5 shrink-0 text-xs\" />\n <span className=\"shrink-0 opacity-75\">Caused by</span>\n <span className=\"min-w-0 break-all\">{cause}</span>\n </div>\n ))}\n </div>\n )}\n <div className=\"divide-y divide-border/60\">\n {visibleFrames.map((frame, idx) => (\n <FrameWithSource key={`${frame.functionName}-${idx}`} frame={frame} index={idx} />\n ))}\n </div>\n {hasFilteredFrames && (\n <div className=\"border-t border-border bg-muted/30 px-3 py-1.5 text-[11px] text-muted-foreground\">\n Showing {visibleFrames.length} of {enrichedFrames.length} frames\n </div>\n )}\n </div>\n );\n}\n\nfunction FrameWithSource({ frame, index }: { frame: ParsedStackFrame; index: number }) {\n const hasSource = frame.sourceLines && frame.sourceLines.length > 0;\n\n return (\n <div className={hasSource ? \"bg-amber-500/[0.03]\" : undefined}>\n <StackFrameRow frame={frame} index={index} />\n {hasSource ? <SourceWindow frame={frame} /> : null}\n </div>\n );\n}\n\nfunction StackFrameRow({ frame, index }: { frame: ParsedStackFrame; index: number }) {\n const icon = frame.nativeMethod ? UiChip : frame.runtime ? UiDebugStepOver : UiMethod;\n const className = frame.class;\n const methodName = frame.displayName || frame.method || frame.functionName;\n\n return (\n <div\n className={[\n \"grid grid-cols-[2rem_minmax(0,1fr)] gap-2 px-3 py-1.5 text-xs\",\n frame.runtime ? \"text-muted-foreground\" : \"text-foreground\",\n ].join(\" \")}\n >\n <div className=\"flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground\">\n <span>{index + 1}</span>\n <Icon icon={icon} className=\"mt-px shrink-0 text-[11px]\" />\n </div>\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n <span className=\"min-w-0 break-all font-mono font-semibold leading-4\">{methodName}</span>\n {className && (\n <span className=\"min-w-0 break-all font-mono text-[11px] text-muted-foreground\">\n {className}\n </span>\n )}\n {frame.location && (\n <span className=\"rounded border border-border bg-muted/40 px-1.5 py-px font-mono text-[10px] text-muted-foreground\">\n {frame.location}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// Picks the language-appropriate inline comment prefix for the\n// `[!code error]` marker that Shiki's transformerNotationErrorLevel\n// recognises (https://shiki.style/packages/transformers#transformernotationerrorlevel).\n// We deliberately stick to single-line markers — block comments would\n// confuse the transformer's per-line scan.\nfunction inlineCommentPrefix(language: string): string {\n switch (language) {\n case \"python\":\n case \"py\":\n case \"bash\":\n case \"sh\":\n case \"shell\":\n case \"ruby\":\n case \"rb\":\n case \"yaml\":\n case \"yml\":\n case \"toml\":\n return \"#\";\n default:\n // Java, Go, TS/JS, C/C++, C#, Rust, Kotlin, Swift, Scala, Groovy…\n return \"//\";\n }\n}\n\nfunction buildAnnotatedSource(\n lines: string[],\n startLine: number,\n focalLine: number,\n language: string,\n): string {\n const focalIdx = focalLine - startLine;\n if (focalIdx < 0 || focalIdx >= lines.length) {\n return lines.join(\"\\n\");\n }\n const prefix = inlineCommentPrefix(language);\n return lines\n .map((src, i) => (i === focalIdx ? `${src} ${prefix} [!code error]` : src))\n .join(\"\\n\");\n}\n\nfunction SourceWindow({ frame }: { frame: ParsedStackFrame }) {\n const start = frame.sourceStartLine ?? 0;\n const focal = frame.line ?? -1;\n const lines = frame.sourceLines ?? [];\n const lineNumbers = frame.sourceLineNumbers;\n const language = frame.sourceLanguage ?? \"java\";\n\n const rows = useMemo(\n () =>\n lines.map((src, i) => ({\n source: src,\n lineNumber: lineNumbers?.[i] ?? start + i,\n })),\n [lineNumbers, lines, start],\n );\n\n const hasExplicitLineNumbers = lineNumbers != null && lineNumbers.length > 0;\n\n const annotatedSource = useMemo(\n () => buildAnnotatedSource(lines, start, focal, language),\n [lines, start, focal, language],\n );\n\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n if (!annotatedSource || hasExplicitLineNumbers) {\n setHtml(null);\n return;\n }\n let cancelled = false;\n loadShikiTransformers()\n .then(({ transformerNotationErrorLevel }) =>\n highlightCode(annotatedSource, {\n lang: language,\n transformers: [transformerNotationErrorLevel()],\n }),\n )\n .then((out) => {\n if (!cancelled) setHtml(out);\n });\n return () => {\n cancelled = true;\n };\n }, [annotatedSource, hasExplicitLineNumbers, language]);\n\n // CSS-counter-driven line-number gutter: the wrapping <div> seeds a\n // counter that each rendered `.line` increments. `--shiki-start` lets\n // us start counting from the absolute frame line number rather than 1.\n // Without `start` we'd need a server-rendered `<ol start=\"...\">` which\n // would fight Shiki's own `<span class=\"line\">` markup.\n const counterStart = start - 1;\n\n if (!html || hasExplicitLineNumbers) {\n return <SourceRows rows={rows} focal={focal} />;\n }\n\n return (\n <div\n className=\"stacktrace-source ml-6 overflow-x-auto rounded border border-border/50 bg-muted/30 p-2 text-[11px] leading-relaxed\"\n style={{ [\"--shiki-start\" as string]: counterStart }}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n}\n\nfunction SourceRows({\n rows,\n focal,\n}: {\n rows: Array<{ source: string; lineNumber: number }>;\n focal: number;\n}) {\n return (\n <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\">\n {rows.map((row, i) => {\n const isFocal = row.lineNumber === focal;\n return (\n <div\n key={`${row.lineNumber}-${i}`}\n className={[\n \"grid min-w-max grid-cols-[3.5rem_minmax(24rem,1fr)] gap-3 px-2\",\n isFocal\n ? \"bg-red-500/10 font-semibold text-red-800 dark:text-red-300\"\n : \"text-foreground\",\n ].join(\" \")}\n >\n <span className=\"select-none text-right text-muted-foreground\">\n {isFocal ? \">\" : \"\"}\n {row.lineNumber}\n </span>\n <code className=\"whitespace-pre\">{row.source || \" \"}</code>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RenderedStackTrace.js","sources":["../../../src/data/diagnostics/RenderedStackTrace.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport {\n parseJavaStackTrace,\n type ParsedStackFrame,\n type ParsedStackTrace,\n} from \"./stacktrace-parse\";\nimport { Icon } from \"../Icon\";\nimport { UiStackFrameDot, UiError } from \"../../icons\";\nimport { StackFrameRow, type StackFrameActions } from \"./StackFrameRow\";\nimport type { FrameSource } from \"./FrameSourceWindow.utils\";\n\n// SourceResolver matches the Go clicky.SourceResolver interface: given a\n// frame, return surrounding source lines so the renderer can display inline\n// context. Failures must be silent (return undefined) so a missing class\n// never blocks the rest of the trace.\n//\n// The return shape is `FrameSource` — the same shape the source window\n// consumes and the same one the JVM thread-dump resolver returns, so a caller\n// that can resolve source for one surface can resolve it for both.\nexport type StackTraceSourceResolver = (\n frame: ParsedStackFrame,\n contextLines: number,\n) => FrameSource | undefined;\n\nexport interface StackTraceProps {\n /**\n * Raw Java stack-trace string or a pre-parsed ParsedStackTrace\n * from a backend/parser.\n */\n input: string | ParsedStackTrace;\n /** Parser language. Currently Java stack traces are supported. */\n language?: \"java\";\n /** Optional source-line resolver for inline context under frames. */\n resolver?: StackTraceSourceResolver;\n /** Number of source lines to request around each frame. */\n contextLines?: number;\n /** Hide frames known to be runtime/library-only. */\n hideRuntimeOnly?: boolean;\n /** Only show frames whose class starts with one of these prefixes. */\n include?: string[];\n /** Hide frames whose class starts with one of these prefixes. */\n exclude?: string[];\n /** Trailing per-frame actions, revealed on hover/focus. */\n frameActions?: StackFrameActions;\n /** Classes applied to the stack-trace shell. */\n className?: string;\n}\n\n// StackTrace is the React counterpart to Go's clicky.StackTrace builder. Pass\n// a raw exception dump and it parses + renders frames; pass a SourceResolver\n// to get inline source context (±N lines) under each frame, with the focal\n// line highlighted. Frames themselves are rendered by the shared StackFrameRow.\nexport function StackTrace({\n input,\n language = \"java\",\n resolver,\n contextLines = 3,\n hideRuntimeOnly = false,\n include,\n exclude,\n frameActions,\n className,\n}: StackTraceProps) {\n const parsed = useMemo<ParsedStackTrace>(() => {\n if (typeof input === \"string\") {\n return parseJavaStackTrace(input);\n }\n return input;\n }, [input, language]);\n\n const enrichedFrames = useMemo<ParsedStackFrame[]>(() => {\n if (!resolver) return parsed.frames;\n return parsed.frames.map((frame): ParsedStackFrame => {\n if (frame.sourceLines && frame.sourceLines.length > 0) return frame;\n const resolved = resolver(frame, contextLines);\n if (!resolved) return frame;\n // `line` stays the frame's own — it is what the window highlights, and a\n // resolver returning one would silently move the focal line off the throw.\n const { line: _ignored, ...source } = resolved;\n return { ...frame, ...source };\n });\n }, [parsed.frames, resolver, contextLines]);\n\n const visibleFrames = useMemo(() => {\n return enrichedFrames.filter((frame) => {\n if (hideRuntimeOnly && frame.runtime) return false;\n if (exclude && exclude.some((p) => frame.class?.startsWith(p))) return false;\n if (include && include.length > 0) {\n return include.some((p) => frame.class?.startsWith(p));\n }\n return true;\n });\n }, [enrichedFrames, hideRuntimeOnly, include, exclude]);\n\n if (visibleFrames.length === 0 && !parsed.exceptionClass) return null;\n\n const hasFilteredFrames = visibleFrames.length !== enrichedFrames.length;\n\n return (\n <div\n className={[\n \"overflow-hidden rounded-md border border-border bg-background text-foreground\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {(parsed.exceptionClass || parsed.message) && (\n <div className=\"border-b border-border bg-red-500/5 px-3 py-2\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <Icon\n icon={UiError}\n className=\"mt-0.5 shrink-0 text-sm text-red-600 dark:text-red-400\"\n />\n <div className=\"min-w-0 flex-1\">\n {parsed.exceptionClass && (\n <div className=\"break-all font-mono text-xs font-semibold text-red-700 dark:text-red-300\">\n {parsed.exceptionClass}\n </div>\n )}\n {parsed.message && (\n <div className=\"mt-0.5 whitespace-pre-wrap break-words text-xs text-foreground\">\n {parsed.message}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n {parsed.causedBy.length > 0 && (\n <div className=\"space-y-1 border-b border-border bg-orange-500/5 px-3 py-2\">\n {parsed.causedBy.map((cause, i) => (\n <div\n key={i}\n className=\"flex min-w-0 items-start gap-2 font-mono text-[11px] text-orange-700 dark:text-orange-300\"\n >\n <Icon icon={UiStackFrameDot} className=\"mt-0.5 shrink-0 text-xs\" />\n <span className=\"shrink-0 opacity-75\">Caused by</span>\n <span className=\"min-w-0 break-all\">{cause}</span>\n </div>\n ))}\n </div>\n )}\n <div className=\"divide-y divide-border/60\">\n {visibleFrames.map((frame, idx) => (\n <StackFrameRow\n key={`${frame.functionName}-${idx}`}\n frame={frame}\n index={idx}\n showIndex\n {...(frameActions ? { frameActions } : {})}\n />\n ))}\n </div>\n {hasFilteredFrames && (\n <div className=\"border-t border-border bg-muted/30 px-3 py-1.5 text-[11px] text-muted-foreground\">\n Showing {visibleFrames.length} of {enrichedFrames.length} frames\n </div>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const Icon = require("../Icon.cjs");
|
|
5
|
+
const FrameSourceWindow = require("./FrameSourceWindow.cjs");
|
|
6
|
+
const FrameSourceWindow_utils = require("./FrameSourceWindow.utils.cjs");
|
|
7
|
+
const UiWatch = require("../../icons/components/UiWatch.cjs");
|
|
8
|
+
const UiSync = require("../../icons/components/UiSync.cjs");
|
|
9
|
+
const UiLock = require("../../icons/components/UiLock.cjs");
|
|
10
|
+
const UiChip = require("../../icons/components/UiChip.cjs");
|
|
11
|
+
const UiDebugStepOver = require("../../icons/components/UiDebugStepOver.cjs");
|
|
12
|
+
const UiMethod = require("../../icons/components/UiMethod.cjs");
|
|
13
|
+
const UiStackFrameDot = require("../../icons/components/UiStackFrameDot.cjs");
|
|
14
|
+
function StackFrameRow({
|
|
15
|
+
frame,
|
|
16
|
+
index,
|
|
17
|
+
showIndex = false,
|
|
18
|
+
frameActions
|
|
19
|
+
}) {
|
|
20
|
+
const isAnnotation = frame.kind !== "frame";
|
|
21
|
+
const methodName = frame.displayName || frame.method || frame.functionName;
|
|
22
|
+
const actions = frameActions == null ? void 0 : frameActions(frame, index);
|
|
23
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
24
|
+
"div",
|
|
25
|
+
{
|
|
26
|
+
className: [
|
|
27
|
+
"group grid gap-2 px-3 py-1.5 text-xs",
|
|
28
|
+
showIndex ? "grid-cols-[2rem_minmax(0,1fr)_auto]" : "grid-cols-[1.25rem_minmax(0,1fr)_auto]",
|
|
29
|
+
frame.runtime ? "text-muted-foreground" : "text-foreground"
|
|
30
|
+
].join(" "),
|
|
31
|
+
children: [
|
|
32
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground", children: [
|
|
33
|
+
showIndex && /* @__PURE__ */ jsxRuntime.jsx("span", { children: index + 1 }),
|
|
34
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: frameIcon(frame), className: "mt-px shrink-0 text-[11px]" })
|
|
35
|
+
] }),
|
|
36
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5", children: isAnnotation ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
37
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 break-all font-mono font-semibold leading-4 opacity-70", children: frame.functionName }),
|
|
38
|
+
frame.annotationText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 break-all font-mono text-[11px] font-normal opacity-80", children: frame.annotationText })
|
|
39
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
40
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 break-all font-mono font-semibold leading-4", children: methodName }),
|
|
41
|
+
frame.class && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 break-all font-mono text-[11px] text-muted-foreground", children: frame.class }),
|
|
42
|
+
frame.location && /* @__PURE__ */ jsxRuntime.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 })
|
|
43
|
+
] }) }) }),
|
|
44
|
+
actions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-start gap-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100", children: actions }) : /* @__PURE__ */ jsxRuntime.jsx("div", {}),
|
|
45
|
+
!isAnnotation && FrameSourceWindow_utils.frameHasSource(frame) ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-3", children: /* @__PURE__ */ jsxRuntime.jsx(FrameSourceWindow.FrameSourceWindow, { frame }) }) : null
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
function frameIcon(frame) {
|
|
51
|
+
switch (frame.kind) {
|
|
52
|
+
case "locked":
|
|
53
|
+
return UiLock.UiLock;
|
|
54
|
+
case "waiting_to_lock":
|
|
55
|
+
return UiSync.UiSync;
|
|
56
|
+
case "waiting_on":
|
|
57
|
+
case "parking":
|
|
58
|
+
return UiWatch.UiWatch;
|
|
59
|
+
}
|
|
60
|
+
if (frame.nativeMethod) return UiChip.UiChip;
|
|
61
|
+
if (frame.runtime) return UiDebugStepOver.UiDebugStepOver;
|
|
62
|
+
return frame.method || frame.class ? UiMethod.UiMethod : UiStackFrameDot.UiStackFrameDot;
|
|
63
|
+
}
|
|
64
|
+
exports.StackFrameRow = StackFrameRow;
|
|
65
|
+
//# sourceMappingURL=StackFrameRow.cjs.map
|