@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.
Files changed (257) hide show
  1. package/dist/components/CountryFlag.cjs +55 -0
  2. package/dist/components/CountryFlag.cjs.map +1 -0
  3. package/dist/components/CountryFlag.d.ts +8 -0
  4. package/dist/components/CountryFlag.d.ts.map +1 -0
  5. package/dist/components/CountryFlag.js +38 -0
  6. package/dist/components/CountryFlag.js.map +1 -0
  7. package/dist/components/CountryPicker.cjs +35 -0
  8. package/dist/components/CountryPicker.cjs.map +1 -0
  9. package/dist/components/CountryPicker.d.ts +4 -0
  10. package/dist/components/CountryPicker.d.ts.map +1 -0
  11. package/dist/components/CountryPicker.js +35 -0
  12. package/dist/components/CountryPicker.js.map +1 -0
  13. package/dist/components/SplitButton.cjs +3 -2
  14. package/dist/components/SplitButton.cjs.map +1 -1
  15. package/dist/components/SplitButton.d.ts +6 -1
  16. package/dist/components/SplitButton.d.ts.map +1 -1
  17. package/dist/components/SplitButton.js +3 -2
  18. package/dist/components/SplitButton.js.map +1 -1
  19. package/dist/components/country-options.cjs +34 -0
  20. package/dist/components/country-options.cjs.map +1 -0
  21. package/dist/components/country-options.d.ts +8 -0
  22. package/dist/components/country-options.d.ts.map +1 -0
  23. package/dist/components/country-options.js +34 -0
  24. package/dist/components/country-options.js.map +1 -0
  25. package/dist/components.cjs +11 -0
  26. package/dist/components.cjs.map +1 -1
  27. package/dist/components.d.ts +4 -0
  28. package/dist/components.d.ts.map +1 -1
  29. package/dist/components.js +11 -0
  30. package/dist/components.js.map +1 -1
  31. package/dist/data/Clicky.cjs +4 -1
  32. package/dist/data/Clicky.cjs.map +1 -1
  33. package/dist/data/Clicky.d.ts.map +1 -1
  34. package/dist/data/Clicky.js +4 -1
  35. package/dist/data/Clicky.js.map +1 -1
  36. package/dist/data/CodeDiff.cjs +3 -18
  37. package/dist/data/CodeDiff.cjs.map +1 -1
  38. package/dist/data/CodeDiff.d.ts.map +1 -1
  39. package/dist/data/CodeDiff.js +3 -18
  40. package/dist/data/CodeDiff.js.map +1 -1
  41. package/dist/data/DataTable.cjs +182 -64
  42. package/dist/data/DataTable.cjs.map +1 -1
  43. package/dist/data/DataTable.d.ts +9 -1
  44. package/dist/data/DataTable.d.ts.map +1 -1
  45. package/dist/data/DataTable.grouping.cjs +26 -0
  46. package/dist/data/DataTable.grouping.cjs.map +1 -1
  47. package/dist/data/DataTable.grouping.d.ts +38 -0
  48. package/dist/data/DataTable.grouping.d.ts.map +1 -1
  49. package/dist/data/DataTable.grouping.js +26 -0
  50. package/dist/data/DataTable.grouping.js.map +1 -1
  51. package/dist/data/DataTable.js +183 -65
  52. package/dist/data/DataTable.js.map +1 -1
  53. package/dist/data/DataTableGroupingControls.cjs +84 -0
  54. package/dist/data/DataTableGroupingControls.cjs.map +1 -0
  55. package/dist/data/DataTableGroupingControls.d.ts +17 -0
  56. package/dist/data/DataTableGroupingControls.d.ts.map +1 -0
  57. package/dist/data/DataTableGroupingControls.js +84 -0
  58. package/dist/data/DataTableGroupingControls.js.map +1 -0
  59. package/dist/data/HighlightedTokens.cjs +21 -0
  60. package/dist/data/HighlightedTokens.cjs.map +1 -0
  61. package/dist/data/HighlightedTokens.d.ts +6 -0
  62. package/dist/data/HighlightedTokens.d.ts.map +1 -0
  63. package/dist/data/HighlightedTokens.js +21 -0
  64. package/dist/data/HighlightedTokens.js.map +1 -0
  65. package/dist/data/ai/AdvancedChatConfig.cjs +3 -0
  66. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  67. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -1
  68. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  69. package/dist/data/ai/AdvancedChatConfig.js +3 -0
  70. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  71. package/dist/data/ai/ChatWindow.cjs +77 -4
  72. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  73. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  74. package/dist/data/ai/ChatWindow.js +78 -5
  75. package/dist/data/ai/ChatWindow.js.map +1 -1
  76. package/dist/data/ai/ChatWindow.runtime.cjs +19 -4
  77. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  78. package/dist/data/ai/ChatWindow.runtime.d.ts +2 -0
  79. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  80. package/dist/data/ai/ChatWindow.runtime.js +19 -4
  81. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  82. package/dist/data/ai/ChatWindow.test-utils.d.ts +2 -1
  83. package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
  84. package/dist/data/ai/ToolPreferences.cjs +8 -1
  85. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  86. package/dist/data/ai/ToolPreferences.d.ts +2 -1
  87. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  88. package/dist/data/ai/ToolPreferences.js +8 -1
  89. package/dist/data/ai/ToolPreferences.js.map +1 -1
  90. package/dist/data/chat/Chat.cjs +26 -3
  91. package/dist/data/chat/Chat.cjs.map +1 -1
  92. package/dist/data/chat/Chat.d.ts +9 -1
  93. package/dist/data/chat/Chat.d.ts.map +1 -1
  94. package/dist/data/chat/Chat.js +26 -3
  95. package/dist/data/chat/Chat.js.map +1 -1
  96. package/dist/data/chat/ChatRuntimeToolbar.cjs +2 -0
  97. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  98. package/dist/data/chat/ChatRuntimeToolbar.d.ts +2 -1
  99. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  100. package/dist/data/chat/ChatRuntimeToolbar.js +2 -0
  101. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  102. package/dist/data/chat/Message.cjs +36 -1
  103. package/dist/data/chat/Message.cjs.map +1 -1
  104. package/dist/data/chat/Message.d.ts +1 -1
  105. package/dist/data/chat/Message.d.ts.map +1 -1
  106. package/dist/data/chat/Message.js +37 -2
  107. package/dist/data/chat/Message.js.map +1 -1
  108. package/dist/data/chat/approval.cjs +17 -0
  109. package/dist/data/chat/approval.cjs.map +1 -1
  110. package/dist/data/chat/approval.d.ts +5 -0
  111. package/dist/data/chat/approval.d.ts.map +1 -1
  112. package/dist/data/chat/approval.js +17 -0
  113. package/dist/data/chat/approval.js.map +1 -1
  114. package/dist/data/chat/fork-seed.cjs +22 -0
  115. package/dist/data/chat/fork-seed.cjs.map +1 -0
  116. package/dist/data/chat/fork-seed.d.ts +8 -0
  117. package/dist/data/chat/fork-seed.d.ts.map +1 -0
  118. package/dist/data/chat/fork-seed.js +22 -0
  119. package/dist/data/chat/fork-seed.js.map +1 -0
  120. package/dist/data/code-highlight.cjs +0 -6
  121. package/dist/data/code-highlight.cjs.map +1 -1
  122. package/dist/data/code-highlight.d.ts +4 -3
  123. package/dist/data/code-highlight.d.ts.map +1 -1
  124. package/dist/data/code-highlight.js +1 -7
  125. package/dist/data/code-highlight.js.map +1 -1
  126. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +6 -2
  127. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  128. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +8 -1
  129. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  130. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +6 -2
  131. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  132. package/dist/data/diagnostics/ErrorDetails.cjs +29 -5
  133. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  134. package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
  135. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  136. package/dist/data/diagnostics/ErrorDetails.js +29 -5
  137. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  138. package/dist/data/diagnostics/FrameSourceWindow.cjs +54 -24
  139. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  140. package/dist/data/diagnostics/FrameSourceWindow.d.ts +2 -1
  141. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  142. package/dist/data/diagnostics/FrameSourceWindow.js +54 -24
  143. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  144. package/dist/data/diagnostics/FrameSourceWindow.utils.cjs.map +1 -1
  145. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts +3 -0
  146. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts.map +1 -1
  147. package/dist/data/diagnostics/FrameSourceWindow.utils.js.map +1 -1
  148. package/dist/data/diagnostics/JvmStackTrace.cjs +14 -30
  149. package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
  150. package/dist/data/diagnostics/JvmStackTrace.d.ts +6 -9
  151. package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
  152. package/dist/data/diagnostics/JvmStackTrace.js +15 -31
  153. package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
  154. package/dist/data/diagnostics/RenderedStackTrace.cjs +14 -144
  155. package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
  156. package/dist/data/diagnostics/RenderedStackTrace.d.ts +6 -6
  157. package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
  158. package/dist/data/diagnostics/RenderedStackTrace.js +15 -145
  159. package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
  160. package/dist/data/diagnostics/StackFrameRow.cjs +65 -0
  161. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -0
  162. package/dist/data/diagnostics/StackFrameRow.d.ts +13 -0
  163. package/dist/data/diagnostics/StackFrameRow.d.ts.map +1 -0
  164. package/dist/data/diagnostics/StackFrameRow.js +65 -0
  165. package/dist/data/diagnostics/StackFrameRow.js.map +1 -0
  166. package/dist/data/diagnostics/ThreadCard.cjs +9 -2
  167. package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
  168. package/dist/data/diagnostics/ThreadCard.d.ts +3 -1
  169. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
  170. package/dist/data/diagnostics/ThreadCard.js +9 -2
  171. package/dist/data/diagnostics/ThreadCard.js.map +1 -1
  172. package/dist/data/diagnostics/frame-heuristics.cjs +26 -0
  173. package/dist/data/diagnostics/frame-heuristics.cjs.map +1 -0
  174. package/dist/data/diagnostics/frame-heuristics.d.ts +5 -0
  175. package/dist/data/diagnostics/frame-heuristics.d.ts.map +1 -0
  176. package/dist/data/diagnostics/frame-heuristics.js +26 -0
  177. package/dist/data/diagnostics/frame-heuristics.js.map +1 -0
  178. package/dist/data/diagnostics/jvm-stacktrace.cjs +5 -7
  179. package/dist/data/diagnostics/jvm-stacktrace.cjs.map +1 -1
  180. package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -1
  181. package/dist/data/diagnostics/jvm-stacktrace.js +5 -7
  182. package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -1
  183. package/dist/data/diagnostics/stacktrace-parse.cjs +4 -9
  184. package/dist/data/diagnostics/stacktrace-parse.cjs.map +1 -1
  185. package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -1
  186. package/dist/data/diagnostics/stacktrace-parse.js +4 -9
  187. package/dist/data/diagnostics/stacktrace-parse.js.map +1 -1
  188. package/dist/data/runtime/RuntimeBar.cjs +3 -0
  189. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  190. package/dist/data/runtime/RuntimeBar.d.ts +3 -1
  191. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  192. package/dist/data/runtime/RuntimeBar.js +3 -0
  193. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  194. package/dist/data/runtime/RuntimeBarCombo.cjs +15 -1
  195. package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -1
  196. package/dist/data/runtime/RuntimeBarCombo.d.ts +2 -1
  197. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -1
  198. package/dist/data/runtime/RuntimeBarCombo.js +15 -1
  199. package/dist/data/runtime/RuntimeBarCombo.js.map +1 -1
  200. package/dist/data/runtime/RuntimeBarSegments.cjs +7 -0
  201. package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -1
  202. package/dist/data/runtime/RuntimeBarSegments.d.ts +2 -1
  203. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -1
  204. package/dist/data/runtime/RuntimeBarSegments.js +7 -0
  205. package/dist/data/runtime/RuntimeBarSegments.js.map +1 -1
  206. package/dist/data/version-info.cjs +3 -3
  207. package/dist/data/version-info.js +3 -3
  208. package/dist/data.cjs +7 -1
  209. package/dist/data.cjs.map +1 -1
  210. package/dist/data.d.ts +4 -2
  211. package/dist/data.d.ts.map +1 -1
  212. package/dist/data.js +8 -2
  213. package/dist/data.js.map +1 -1
  214. package/dist/index.cjs +18 -1
  215. package/dist/index.cjs.map +1 -1
  216. package/dist/index.js +19 -2
  217. package/dist/index.js.map +1 -1
  218. package/dist/rpc/CommandForm.cjs +8 -18
  219. package/dist/rpc/CommandForm.cjs.map +1 -1
  220. package/dist/rpc/CommandForm.d.ts +8 -2
  221. package/dist/rpc/CommandForm.d.ts.map +1 -1
  222. package/dist/rpc/CommandForm.js +9 -19
  223. package/dist/rpc/CommandForm.js.map +1 -1
  224. package/dist/rpc/OperationActionDialog.cjs +3 -3
  225. package/dist/rpc/OperationActionDialog.cjs.map +1 -1
  226. package/dist/rpc/OperationActionDialog.js +3 -3
  227. package/dist/rpc/OperationActionDialog.js.map +1 -1
  228. package/dist/rpc/OperationCommandPage.cjs +7 -7
  229. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  230. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  231. package/dist/rpc/OperationCommandPage.js +7 -7
  232. package/dist/rpc/OperationCommandPage.js.map +1 -1
  233. package/dist/rpc/apiClient.cjs +17 -3
  234. package/dist/rpc/apiClient.cjs.map +1 -1
  235. package/dist/rpc/apiClient.d.ts +4 -4
  236. package/dist/rpc/apiClient.d.ts.map +1 -1
  237. package/dist/rpc/apiClient.js +17 -3
  238. package/dist/rpc/apiClient.js.map +1 -1
  239. package/dist/rpc/formMetadata.cjs +5 -9
  240. package/dist/rpc/formMetadata.cjs.map +1 -1
  241. package/dist/rpc/formMetadata.d.ts +3 -3
  242. package/dist/rpc/formMetadata.d.ts.map +1 -1
  243. package/dist/rpc/formMetadata.js +5 -9
  244. package/dist/rpc/formMetadata.js.map +1 -1
  245. package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
  246. package/dist/rpc/types.cjs.map +1 -1
  247. package/dist/rpc/types.d.ts +1 -0
  248. package/dist/rpc/types.d.ts.map +1 -1
  249. package/dist/rpc/types.js.map +1 -1
  250. package/dist/rpc/useOperations.cjs.map +1 -1
  251. package/dist/rpc/useOperations.d.ts +4 -4
  252. package/dist/rpc/useOperations.d.ts.map +1 -1
  253. package/dist/rpc/useOperations.js.map +1 -1
  254. package/dist/rpc.d.ts +2 -2
  255. package/dist/rpc.d.ts.map +1 -1
  256. package/dist/styles.css +1 -1
  257. package/package.json +2 -1
@@ -1,33 +1,63 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- function FrameSourceWindow({ frame }) {
5
- const lines = frame.sourceLines ?? [];
6
- if (lines.length === 0) return null;
4
+ const react = require("react");
5
+ const codeHighlight = require("../code-highlight.cjs");
6
+ const HighlightedTokens = require("../HighlightedTokens.cjs");
7
+ function FrameSourceWindow({
8
+ frame,
9
+ className
10
+ }) {
11
+ const lines = react.useMemo(() => frame.sourceLines ?? [], [frame.sourceLines]);
7
12
  const start = frame.sourceStartLine ?? 0;
8
13
  const numbers = frame.sourceLineNumbers;
9
14
  const focal = frame.line ?? -1;
10
- 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: lines.map((source, i) => {
11
- const lineNumber = (numbers == null ? void 0 : numbers[i]) ?? start + i;
12
- const isFocal = lineNumber === focal;
13
- return /* @__PURE__ */ jsxRuntime.jsxs(
14
- "div",
15
- {
16
- className: [
17
- "grid min-w-max grid-cols-[3.5rem_minmax(24rem,1fr)] gap-3 px-2",
18
- isFocal ? "bg-red-500/10 font-semibold text-red-800 dark:text-red-300" : "text-foreground"
19
- ].join(" "),
20
- children: [
21
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "select-none text-right text-muted-foreground", children: [
22
- isFocal ? ">" : "",
23
- lineNumber
24
- ] }),
25
- /* @__PURE__ */ jsxRuntime.jsx("code", { className: "whitespace-pre", children: source || " " })
26
- ]
27
- },
28
- `${lineNumber}-${i}`
29
- );
30
- }) });
15
+ const language = frame.sourceLanguage;
16
+ const [tokens, setTokens] = react.useState(null);
17
+ react.useEffect(() => {
18
+ if (lines.length === 0) {
19
+ setTokens(null);
20
+ return;
21
+ }
22
+ let cancelled = false;
23
+ codeHighlight.highlightToLines(lines.join("\n"), { lang: language }).then((out) => {
24
+ if (!cancelled) setTokens(out);
25
+ });
26
+ return () => {
27
+ cancelled = true;
28
+ };
29
+ }, [lines, language]);
30
+ if (lines.length === 0) return null;
31
+ return /* @__PURE__ */ jsxRuntime.jsx(
32
+ "div",
33
+ {
34
+ className: [
35
+ "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",
36
+ className
37
+ ].filter(Boolean).join(" "),
38
+ children: lines.map((source, i) => {
39
+ const lineNumber = (numbers == null ? void 0 : numbers[i]) ?? start + i;
40
+ const isFocal = lineNumber === focal;
41
+ return /* @__PURE__ */ jsxRuntime.jsxs(
42
+ "div",
43
+ {
44
+ className: [
45
+ "grid min-w-max grid-cols-[3.5rem_minmax(24rem,1fr)] gap-3 px-2",
46
+ isFocal ? "bg-red-500/10 font-semibold text-red-800 dark:text-red-300" : "text-foreground"
47
+ ].join(" "),
48
+ children: [
49
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "select-none text-right text-muted-foreground", children: [
50
+ isFocal ? ">" : "",
51
+ lineNumber
52
+ ] }),
53
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "whitespace-pre", children: source ? /* @__PURE__ */ jsxRuntime.jsx(HighlightedTokens.HighlightedTokens, { tokens: tokens == null ? void 0 : tokens[i], content: source }) : " " })
54
+ ]
55
+ },
56
+ `${lineNumber}-${i}`
57
+ );
58
+ })
59
+ }
60
+ );
31
61
  }
32
62
  exports.FrameSourceWindow = FrameSourceWindow;
33
63
  //# sourceMappingURL=FrameSourceWindow.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"FrameSourceWindow.cjs","sources":["../../../src/data/diagnostics/FrameSourceWindow.tsx"],"sourcesContent":["import type { FrameSource } from \"./FrameSourceWindow.utils\";\n\n// FrameSourceWindow renders a decompiled / resolved source window beneath a\n// stack frame: a gutter of absolute line numbers with the focal line (the one\n// the frame points at) highlighted. It is the plain (non-Shiki) renderer shared\n// by the JVM thread-dump frames and the exception stack-trace frames so both\n// surfaces show inline source the same way.\nexport function FrameSourceWindow({ frame }: { frame: FrameSource }) {\n const lines = frame.sourceLines ?? [];\n if (lines.length === 0) return null;\n const start = frame.sourceStartLine ?? 0;\n const numbers = frame.sourceLineNumbers;\n const focal = frame.line ?? -1;\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 {lines.map((source, i) => {\n const lineNumber = numbers?.[i] ?? start + i;\n const isFocal = lineNumber === focal;\n return (\n <div\n key={`${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 {lineNumber}\n </span>\n <code className=\"whitespace-pre\">{source || \" \"}</code>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["jsx","jsxs"],"mappings":";;;AAOO,SAAS,kBAAkB,EAAE,SAAiC;AACnE,QAAM,QAAQ,MAAM,eAAe,CAAA;AACnC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,QAAQ,MAAM,mBAAmB;AACvC,QAAM,UAAU,MAAM;AACtB,QAAM,QAAQ,MAAM,QAAQ;AAE5B,SACEA,+BAAC,SAAI,WAAU,0HACZ,gBAAM,IAAI,CAAC,QAAQ,MAAM;AACxB,UAAM,cAAa,mCAAU,OAAM,QAAQ;AAC3C,UAAM,UAAU,eAAe;AAC/B,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAW;AAAA,UACT;AAAA,UACA,UACI,+DACA;AAAA,QAAA,EACJ,KAAK,GAAG;AAAA,QAEV,UAAA;AAAA,UAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,gDACb,UAAA;AAAA,YAAA,UAAU,MAAM;AAAA,YAChB;AAAA,UAAA,GACH;AAAA,UACAD,2BAAAA,IAAC,QAAA,EAAK,WAAU,kBAAkB,oBAAU,IAAA,CAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAZ3C,GAAG,UAAU,IAAI,CAAC;AAAA,IAAA;AAAA,EAe7B,CAAC,EAAA,CACH;AAEJ;;"}
1
+ {"version":3,"file":"FrameSourceWindow.cjs","sources":["../../../src/data/diagnostics/FrameSourceWindow.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { highlightToLines, type HighlightedLine } from \"../code-highlight\";\nimport { HighlightedTokens } from \"../HighlightedTokens\";\nimport type { FrameSource } from \"./FrameSourceWindow.utils\";\n\n// FrameSourceWindow renders a decompiled / resolved source window beneath a\n// stack frame: a gutter of absolute line numbers with the focal line (the one\n// the frame points at) highlighted. It is the single source-window renderer,\n// shared by the JVM thread-dump frames, the exception stack-trace frames, and\n// frameless callers that have source but no stack (a template error, a single\n// decompiled class).\n//\n// The gutter is painted explicitly rather than by embedding Shiki's own `<pre>`,\n// because `sourceLineNumbers` is frequently NOT a contiguous run: arthas `jad`\n// returns bytecode-keyed line numbers with gaps. A CSS-counter gutter would\n// silently renumber those. Tokenizing via `highlightToLines` keeps the\n// highlighting while letting us own the numbering — the same trade CodeDiff makes.\nexport function FrameSourceWindow({\n frame,\n className,\n}: {\n frame: FrameSource;\n className?: string;\n}) {\n const lines = useMemo(() => frame.sourceLines ?? [], [frame.sourceLines]);\n const start = frame.sourceStartLine ?? 0;\n const numbers = frame.sourceLineNumbers;\n const focal = frame.line ?? -1;\n // No default language: this renderer is shared by JVM frames, exception frames\n // and frameless callers, so a Go dump or a template error must not be coloured\n // with Java grammar. `highlightToLines` returns null without a language and\n // `HighlightedTokens` then paints the plain source.\n const language = frame.sourceLanguage;\n\n const [tokens, setTokens] = useState<HighlightedLine[] | null>(null);\n\n useEffect(() => {\n if (lines.length === 0) {\n setTokens(null);\n return;\n }\n let cancelled = false;\n highlightToLines(lines.join(\"\\n\"), { lang: language }).then((out) => {\n if (!cancelled) setTokens(out);\n });\n return () => {\n cancelled = true;\n };\n }, [lines, language]);\n\n if (lines.length === 0) return null;\n\n return (\n <div\n className={[\n \"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 className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {lines.map((source, i) => {\n const lineNumber = numbers?.[i] ?? start + i;\n const isFocal = lineNumber === focal;\n return (\n <div\n key={`${lineNumber}-${i}`}\n className={[\n \"grid min-w-max grid-cols-[3.5rem_minmax(24rem,1fr)] gap-3 px-2\",\n isFocal ? \"bg-red-500/10 font-semibold text-red-800 dark:text-red-300\" : \"text-foreground\",\n ].join(\" \")}\n >\n <span className=\"select-none text-right text-muted-foreground\">\n {isFocal ? \">\" : \"\"}\n {lineNumber}\n </span>\n <code className=\"whitespace-pre\">\n {source ? <HighlightedTokens tokens={tokens?.[i]} content={source} /> : \" \"}\n </code>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["useMemo","useState","useEffect","highlightToLines","jsx","jsxs","HighlightedTokens"],"mappings":";;;;;;AAiBO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AACF,GAGG;AACD,QAAM,QAAQA,MAAAA,QAAQ,MAAM,MAAM,eAAe,IAAI,CAAC,MAAM,WAAW,CAAC;AACxE,QAAM,QAAQ,MAAM,mBAAmB;AACvC,QAAM,UAAU,MAAM;AACtB,QAAM,QAAQ,MAAM,QAAQ;AAK5B,QAAM,WAAW,MAAM;AAEvB,QAAM,CAAC,QAAQ,SAAS,IAAIC,MAAAA,SAAmC,IAAI;AAEnEC,QAAAA,UAAU,MAAM;AACd,QAAI,MAAM,WAAW,GAAG;AACtB,gBAAU,IAAI;AACd;AAAA,IACF;AACA,QAAI,YAAY;AAChBC,kBAAAA,iBAAiB,MAAM,KAAK,IAAI,GAAG,EAAE,MAAM,UAAU,EAAE,KAAK,CAAC,QAAQ;AACnE,UAAI,CAAC,UAAW,WAAU,GAAG;AAAA,IAC/B,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MAEV,UAAA,MAAM,IAAI,CAAC,QAAQ,MAAM;AACxB,cAAM,cAAa,mCAAU,OAAM,QAAQ;AAC3C,cAAM,UAAU,eAAe;AAC/B,eACEC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW;AAAA,cACT;AAAA,cACA,UAAU,+DAA+D;AAAA,YAAA,EACzE,KAAK,GAAG;AAAA,YAEV,UAAA;AAAA,cAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,gDACb,UAAA;AAAA,gBAAA,UAAU,MAAM;AAAA,gBAChB;AAAA,cAAA,GACH;AAAA,cACAD,2BAAAA,IAAC,QAAA,EAAK,WAAU,kBACb,mBAASA,+BAACE,kBAAAA,mBAAA,EAAkB,QAAQ,iCAAS,IAAI,SAAS,OAAA,CAAQ,IAAK,IAAA,CAC1E;AAAA,YAAA;AAAA,UAAA;AAAA,UAZK,GAAG,UAAU,IAAI,CAAC;AAAA,QAAA;AAAA,MAe7B,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;;"}
@@ -1,5 +1,6 @@
1
1
  import { FrameSource } from './FrameSourceWindow.utils';
2
- export declare function FrameSourceWindow({ frame }: {
2
+ export declare function FrameSourceWindow({ frame, className, }: {
3
3
  frame: FrameSource;
4
+ className?: string;
4
5
  }): import("react/jsx-runtime").JSX.Element | null;
5
6
  //# sourceMappingURL=FrameSourceWindow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FrameSourceWindow.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/FrameSourceWindow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,kDAgClE"}
1
+ {"version":3,"file":"FrameSourceWindow.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/FrameSourceWindow.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAc7D,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,SAAS,GACV,EAAE;IACD,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,kDA6DA"}
@@ -1,31 +1,61 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- function FrameSourceWindow({ frame }) {
3
- const lines = frame.sourceLines ?? [];
4
- if (lines.length === 0) return null;
2
+ import { useMemo, useState, useEffect } from "react";
3
+ import { highlightToLines } from "../code-highlight.js";
4
+ import { HighlightedTokens } from "../HighlightedTokens.js";
5
+ function FrameSourceWindow({
6
+ frame,
7
+ className
8
+ }) {
9
+ const lines = useMemo(() => frame.sourceLines ?? [], [frame.sourceLines]);
5
10
  const start = frame.sourceStartLine ?? 0;
6
11
  const numbers = frame.sourceLineNumbers;
7
12
  const focal = frame.line ?? -1;
8
- 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: lines.map((source, i) => {
9
- const lineNumber = (numbers == null ? void 0 : numbers[i]) ?? start + i;
10
- const isFocal = lineNumber === focal;
11
- return /* @__PURE__ */ jsxs(
12
- "div",
13
- {
14
- className: [
15
- "grid min-w-max grid-cols-[3.5rem_minmax(24rem,1fr)] gap-3 px-2",
16
- isFocal ? "bg-red-500/10 font-semibold text-red-800 dark:text-red-300" : "text-foreground"
17
- ].join(" "),
18
- children: [
19
- /* @__PURE__ */ jsxs("span", { className: "select-none text-right text-muted-foreground", children: [
20
- isFocal ? ">" : "",
21
- lineNumber
22
- ] }),
23
- /* @__PURE__ */ jsx("code", { className: "whitespace-pre", children: source || " " })
24
- ]
25
- },
26
- `${lineNumber}-${i}`
27
- );
28
- }) });
13
+ const language = frame.sourceLanguage;
14
+ const [tokens, setTokens] = useState(null);
15
+ useEffect(() => {
16
+ if (lines.length === 0) {
17
+ setTokens(null);
18
+ return;
19
+ }
20
+ let cancelled = false;
21
+ highlightToLines(lines.join("\n"), { lang: language }).then((out) => {
22
+ if (!cancelled) setTokens(out);
23
+ });
24
+ return () => {
25
+ cancelled = true;
26
+ };
27
+ }, [lines, language]);
28
+ if (lines.length === 0) return null;
29
+ return /* @__PURE__ */ jsx(
30
+ "div",
31
+ {
32
+ className: [
33
+ "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",
34
+ className
35
+ ].filter(Boolean).join(" "),
36
+ children: lines.map((source, i) => {
37
+ const lineNumber = (numbers == null ? void 0 : numbers[i]) ?? start + i;
38
+ const isFocal = lineNumber === focal;
39
+ return /* @__PURE__ */ jsxs(
40
+ "div",
41
+ {
42
+ className: [
43
+ "grid min-w-max grid-cols-[3.5rem_minmax(24rem,1fr)] gap-3 px-2",
44
+ isFocal ? "bg-red-500/10 font-semibold text-red-800 dark:text-red-300" : "text-foreground"
45
+ ].join(" "),
46
+ children: [
47
+ /* @__PURE__ */ jsxs("span", { className: "select-none text-right text-muted-foreground", children: [
48
+ isFocal ? ">" : "",
49
+ lineNumber
50
+ ] }),
51
+ /* @__PURE__ */ jsx("code", { className: "whitespace-pre", children: source ? /* @__PURE__ */ jsx(HighlightedTokens, { tokens: tokens == null ? void 0 : tokens[i], content: source }) : " " })
52
+ ]
53
+ },
54
+ `${lineNumber}-${i}`
55
+ );
56
+ })
57
+ }
58
+ );
29
59
  }
30
60
  export {
31
61
  FrameSourceWindow
@@ -1 +1 @@
1
- {"version":3,"file":"FrameSourceWindow.js","sources":["../../../src/data/diagnostics/FrameSourceWindow.tsx"],"sourcesContent":["import type { FrameSource } from \"./FrameSourceWindow.utils\";\n\n// FrameSourceWindow renders a decompiled / resolved source window beneath a\n// stack frame: a gutter of absolute line numbers with the focal line (the one\n// the frame points at) highlighted. It is the plain (non-Shiki) renderer shared\n// by the JVM thread-dump frames and the exception stack-trace frames so both\n// surfaces show inline source the same way.\nexport function FrameSourceWindow({ frame }: { frame: FrameSource }) {\n const lines = frame.sourceLines ?? [];\n if (lines.length === 0) return null;\n const start = frame.sourceStartLine ?? 0;\n const numbers = frame.sourceLineNumbers;\n const focal = frame.line ?? -1;\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 {lines.map((source, i) => {\n const lineNumber = numbers?.[i] ?? start + i;\n const isFocal = lineNumber === focal;\n return (\n <div\n key={`${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 {lineNumber}\n </span>\n <code className=\"whitespace-pre\">{source || \" \"}</code>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";AAOO,SAAS,kBAAkB,EAAE,SAAiC;AACnE,QAAM,QAAQ,MAAM,eAAe,CAAA;AACnC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,QAAQ,MAAM,mBAAmB;AACvC,QAAM,UAAU,MAAM;AACtB,QAAM,QAAQ,MAAM,QAAQ;AAE5B,SACE,oBAAC,SAAI,WAAU,0HACZ,gBAAM,IAAI,CAAC,QAAQ,MAAM;AACxB,UAAM,cAAa,mCAAU,OAAM,QAAQ;AAC3C,UAAM,UAAU,eAAe;AAC/B,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAW;AAAA,UACT;AAAA,UACA,UACI,+DACA;AAAA,QAAA,EACJ,KAAK,GAAG;AAAA,QAEV,UAAA;AAAA,UAAA,qBAAC,QAAA,EAAK,WAAU,gDACb,UAAA;AAAA,YAAA,UAAU,MAAM;AAAA,YAChB;AAAA,UAAA,GACH;AAAA,UACA,oBAAC,QAAA,EAAK,WAAU,kBAAkB,oBAAU,IAAA,CAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAZ3C,GAAG,UAAU,IAAI,CAAC;AAAA,IAAA;AAAA,EAe7B,CAAC,EAAA,CACH;AAEJ;"}
1
+ {"version":3,"file":"FrameSourceWindow.js","sources":["../../../src/data/diagnostics/FrameSourceWindow.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { highlightToLines, type HighlightedLine } from \"../code-highlight\";\nimport { HighlightedTokens } from \"../HighlightedTokens\";\nimport type { FrameSource } from \"./FrameSourceWindow.utils\";\n\n// FrameSourceWindow renders a decompiled / resolved source window beneath a\n// stack frame: a gutter of absolute line numbers with the focal line (the one\n// the frame points at) highlighted. It is the single source-window renderer,\n// shared by the JVM thread-dump frames, the exception stack-trace frames, and\n// frameless callers that have source but no stack (a template error, a single\n// decompiled class).\n//\n// The gutter is painted explicitly rather than by embedding Shiki's own `<pre>`,\n// because `sourceLineNumbers` is frequently NOT a contiguous run: arthas `jad`\n// returns bytecode-keyed line numbers with gaps. A CSS-counter gutter would\n// silently renumber those. Tokenizing via `highlightToLines` keeps the\n// highlighting while letting us own the numbering — the same trade CodeDiff makes.\nexport function FrameSourceWindow({\n frame,\n className,\n}: {\n frame: FrameSource;\n className?: string;\n}) {\n const lines = useMemo(() => frame.sourceLines ?? [], [frame.sourceLines]);\n const start = frame.sourceStartLine ?? 0;\n const numbers = frame.sourceLineNumbers;\n const focal = frame.line ?? -1;\n // No default language: this renderer is shared by JVM frames, exception frames\n // and frameless callers, so a Go dump or a template error must not be coloured\n // with Java grammar. `highlightToLines` returns null without a language and\n // `HighlightedTokens` then paints the plain source.\n const language = frame.sourceLanguage;\n\n const [tokens, setTokens] = useState<HighlightedLine[] | null>(null);\n\n useEffect(() => {\n if (lines.length === 0) {\n setTokens(null);\n return;\n }\n let cancelled = false;\n highlightToLines(lines.join(\"\\n\"), { lang: language }).then((out) => {\n if (!cancelled) setTokens(out);\n });\n return () => {\n cancelled = true;\n };\n }, [lines, language]);\n\n if (lines.length === 0) return null;\n\n return (\n <div\n className={[\n \"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 className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {lines.map((source, i) => {\n const lineNumber = numbers?.[i] ?? start + i;\n const isFocal = lineNumber === focal;\n return (\n <div\n key={`${lineNumber}-${i}`}\n className={[\n \"grid min-w-max grid-cols-[3.5rem_minmax(24rem,1fr)] gap-3 px-2\",\n isFocal ? \"bg-red-500/10 font-semibold text-red-800 dark:text-red-300\" : \"text-foreground\",\n ].join(\" \")}\n >\n <span className=\"select-none text-right text-muted-foreground\">\n {isFocal ? \">\" : \"\"}\n {lineNumber}\n </span>\n <code className=\"whitespace-pre\">\n {source ? <HighlightedTokens tokens={tokens?.[i]} content={source} /> : \" \"}\n </code>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAiBO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AACF,GAGG;AACD,QAAM,QAAQ,QAAQ,MAAM,MAAM,eAAe,IAAI,CAAC,MAAM,WAAW,CAAC;AACxE,QAAM,QAAQ,MAAM,mBAAmB;AACvC,QAAM,UAAU,MAAM;AACtB,QAAM,QAAQ,MAAM,QAAQ;AAK5B,QAAM,WAAW,MAAM;AAEvB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAmC,IAAI;AAEnE,YAAU,MAAM;AACd,QAAI,MAAM,WAAW,GAAG;AACtB,gBAAU,IAAI;AACd;AAAA,IACF;AACA,QAAI,YAAY;AAChB,qBAAiB,MAAM,KAAK,IAAI,GAAG,EAAE,MAAM,UAAU,EAAE,KAAK,CAAC,QAAQ;AACnE,UAAI,CAAC,UAAW,WAAU,GAAG;AAAA,IAC/B,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MAEV,UAAA,MAAM,IAAI,CAAC,QAAQ,MAAM;AACxB,cAAM,cAAa,mCAAU,OAAM,QAAQ;AAC3C,cAAM,UAAU,eAAe;AAC/B,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW;AAAA,cACT;AAAA,cACA,UAAU,+DAA+D;AAAA,YAAA,EACzE,KAAK,GAAG;AAAA,YAEV,UAAA;AAAA,cAAA,qBAAC,QAAA,EAAK,WAAU,gDACb,UAAA;AAAA,gBAAA,UAAU,MAAM;AAAA,gBAChB;AAAA,cAAA,GACH;AAAA,cACA,oBAAC,QAAA,EAAK,WAAU,kBACb,mBAAS,oBAAC,mBAAA,EAAkB,QAAQ,iCAAS,IAAI,SAAS,OAAA,CAAQ,IAAK,IAAA,CAC1E;AAAA,YAAA;AAAA,UAAA;AAAA,UAZK,GAAG,UAAU,IAAI,CAAC;AAAA,QAAA;AAAA,MAe7B,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -1 +1 @@
1
- {"version":3,"file":"FrameSourceWindow.utils.cjs","sources":["../../../src/data/diagnostics/FrameSourceWindow.utils.ts"],"sourcesContent":["export interface FrameSource {\n /** Source lines around the focal line. */\n sourceLines?: string[];\n /** Absolute line number for each entry in sourceLines (preferred gutter). */\n sourceLineNumbers?: number[];\n /** Line number of sourceLines[0] when sourceLineNumbers is absent. */\n sourceStartLine?: number;\n /** The frame's focal line, highlighted when it falls inside the window. */\n line?: number;\n}\n\nexport function frameHasSource(frame: FrameSource): boolean {\n return !!frame.sourceLines && frame.sourceLines.length > 0;\n}\n"],"names":[],"mappings":";;AAWO,SAAS,eAAe,OAA6B;AAC1D,SAAO,CAAC,CAAC,MAAM,eAAe,MAAM,YAAY,SAAS;AAC3D;;"}
1
+ {"version":3,"file":"FrameSourceWindow.utils.cjs","sources":["../../../src/data/diagnostics/FrameSourceWindow.utils.ts"],"sourcesContent":["export interface FrameSource {\n /** Source lines around the focal line. */\n sourceLines?: string[];\n /** Absolute line number for each entry in sourceLines (preferred gutter). */\n sourceLineNumbers?: number[];\n /** Line number of sourceLines[0] when sourceLineNumbers is absent. */\n sourceStartLine?: number;\n /** The frame's focal line, highlighted when it falls inside the window. */\n line?: number;\n /** Highlighter language for the window's contents. Omit when unknown: the\n * window then renders plain, un-tokenized source rather than guessing. */\n sourceLanguage?: string;\n}\n\nexport function frameHasSource(frame: FrameSource): boolean {\n return !!frame.sourceLines && frame.sourceLines.length > 0;\n}\n"],"names":[],"mappings":";;AAcO,SAAS,eAAe,OAA6B;AAC1D,SAAO,CAAC,CAAC,MAAM,eAAe,MAAM,YAAY,SAAS;AAC3D;;"}
@@ -7,6 +7,9 @@ export interface FrameSource {
7
7
  sourceStartLine?: number;
8
8
  /** The frame's focal line, highlighted when it falls inside the window. */
9
9
  line?: number;
10
+ /** Highlighter language for the window's contents. Omit when unknown: the
11
+ * window then renders plain, un-tokenized source rather than guessing. */
12
+ sourceLanguage?: string;
10
13
  }
11
14
  export declare function frameHasSource(frame: FrameSource): boolean;
12
15
  //# sourceMappingURL=FrameSourceWindow.utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FrameSourceWindow.utils.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/FrameSourceWindow.utils.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE1D"}
1
+ {"version":3,"file":"FrameSourceWindow.utils.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/FrameSourceWindow.utils.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;+EAC2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"FrameSourceWindow.utils.js","sources":["../../../src/data/diagnostics/FrameSourceWindow.utils.ts"],"sourcesContent":["export interface FrameSource {\n /** Source lines around the focal line. */\n sourceLines?: string[];\n /** Absolute line number for each entry in sourceLines (preferred gutter). */\n sourceLineNumbers?: number[];\n /** Line number of sourceLines[0] when sourceLineNumbers is absent. */\n sourceStartLine?: number;\n /** The frame's focal line, highlighted when it falls inside the window. */\n line?: number;\n}\n\nexport function frameHasSource(frame: FrameSource): boolean {\n return !!frame.sourceLines && frame.sourceLines.length > 0;\n}\n"],"names":[],"mappings":"AAWO,SAAS,eAAe,OAA6B;AAC1D,SAAO,CAAC,CAAC,MAAM,eAAe,MAAM,YAAY,SAAS;AAC3D;"}
1
+ {"version":3,"file":"FrameSourceWindow.utils.js","sources":["../../../src/data/diagnostics/FrameSourceWindow.utils.ts"],"sourcesContent":["export interface FrameSource {\n /** Source lines around the focal line. */\n sourceLines?: string[];\n /** Absolute line number for each entry in sourceLines (preferred gutter). */\n sourceLineNumbers?: number[];\n /** Line number of sourceLines[0] when sourceLineNumbers is absent. */\n sourceStartLine?: number;\n /** The frame's focal line, highlighted when it falls inside the window. */\n line?: number;\n /** Highlighter language for the window's contents. Omit when unknown: the\n * window then renders plain, un-tokenized source rather than guessing. */\n sourceLanguage?: string;\n}\n\nexport function frameHasSource(frame: FrameSource): boolean {\n return !!frame.sourceLines && frame.sourceLines.length > 0;\n}\n"],"names":[],"mappings":"AAcO,SAAS,eAAe,OAA6B;AAC1D,SAAO,CAAC,CAAC,MAAM,eAAe,MAAM,YAAY,SAAS;AAC3D;"}
@@ -1,46 +1,30 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
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 UiLock = require("../../icons/components/UiLock.cjs");
8
- const UiSync = require("../../icons/components/UiSync.cjs");
9
- const UiWatch = require("../../icons/components/UiWatch.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");
4
+ const StackFrameRow = require("./StackFrameRow.cjs");
13
5
  function JvmStackTrace({
14
6
  frames,
15
7
  hideRuntimeOnly = false,
16
8
  className,
17
- resolveSource
9
+ resolveSource,
10
+ frameActions
18
11
  }) {
19
12
  const visibleFrames = hideRuntimeOnly ? frames.filter((frame) => frame.kind !== "frame" || !frame.runtime) : frames;
20
13
  if (visibleFrames.length === 0) return null;
21
14
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className, children: visibleFrames.map((frame, index) => {
22
15
  const resolved = resolveSource == null ? void 0 : resolveSource(frame);
23
- const withSource = resolved ? { ...frame, ...resolved } : frame;
24
- return /* @__PURE__ */ jsxRuntime.jsx(JvmStackFrameRow, { frame: withSource }, `${frame.functionName}-${index}`);
16
+ const { line: _ignored, ...source } = resolved ?? {};
17
+ const withSource = resolved ? { ...frame, ...source } : frame;
18
+ return /* @__PURE__ */ jsxRuntime.jsx(
19
+ StackFrameRow.StackFrameRow,
20
+ {
21
+ frame: withSource,
22
+ index,
23
+ ...frameActions ? { frameActions } : {}
24
+ },
25
+ `${frame.functionName}-${index}`
26
+ );
25
27
  }) });
26
28
  }
27
- function JvmStackFrameRow({ frame }) {
28
- const isAnno = frame.kind !== "frame";
29
- const icon = isAnno ? frame.kind === "locked" ? UiLock.UiLock : frame.kind === "waiting_to_lock" ? UiSync.UiSync : UiWatch.UiWatch : frame.nativeMethod ? UiChip.UiChip : frame.runtime ? UiDebugStepOver.UiDebugStepOver : UiMethod.UiMethod;
30
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: frame.runtime ? "text-muted-foreground" : "text-foreground", children: [
31
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-1.5", children: [
32
- /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon, className: "mt-0.5 shrink-0 text-[11px]" }),
33
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "break-all font-mono text-[11px] font-semibold leading-4", children: isAnno ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
34
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "opacity-70", children: frame.functionName }),
35
- frame.annotationText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-2 font-normal opacity-80", children: frame.annotationText })
36
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
37
- frame.displayName,
38
- frame.location && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-2 text-[10px] font-normal opacity-80", children: frame.location })
39
- ] }) }) })
40
- ] }),
41
- !isAnno && FrameSourceWindow_utils.frameHasSource(frame) && /* @__PURE__ */ jsxRuntime.jsx(FrameSourceWindow.FrameSourceWindow, { frame })
42
- ] });
43
- }
44
- exports.JvmStackFrameRow = JvmStackFrameRow;
45
29
  exports.JvmStackTrace = JvmStackTrace;
46
30
  //# sourceMappingURL=JvmStackTrace.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"JvmStackTrace.cjs","sources":["../../../src/data/diagnostics/JvmStackTrace.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport { UiChip, UiDebugStepOver, UiLock, UiSync, UiMethod, UiWatch } from \"../../icons\";\nimport type { ParsedThreadFrame } from \"./jvm-stacktrace\";\nimport { FrameSourceWindow } from \"./FrameSourceWindow\";\nimport { frameHasSource } from \"./FrameSourceWindow.utils\";\n\n// JvmFrameSourceResolver returns a source window for a frame, or undefined when\n// no source is available (a missing class must never blank out the frame). Used\n// to augment the rendered thread dump with decompiled source in place.\nexport type JvmFrameSourceResolver = (frame: ParsedThreadFrame) =>\n | { sourceLines: string[]; sourceLineNumbers?: number[]; sourceStartLine?: number }\n | undefined;\n\nexport type JvmStackTraceProps = {\n frames: ParsedThreadFrame[];\n hideRuntimeOnly?: boolean;\n className?: string;\n /** Optional resolver that supplies inline source under each frame. */\n resolveSource?: JvmFrameSourceResolver;\n};\n\nexport function JvmStackTrace({\n frames,\n hideRuntimeOnly = false,\n className,\n resolveSource,\n}: 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 const resolved = resolveSource?.(frame);\n const withSource = resolved ? { ...frame, ...resolved } : frame;\n return (\n <JvmStackFrameRow key={`${frame.functionName}-${index}`} frame={withSource} />\n );\n })}\n </div>\n );\n}\n\nexport function JvmStackFrameRow({ frame }: { frame: ParsedThreadFrame }) {\n const isAnno = frame.kind !== \"frame\";\n const icon = isAnno\n ? frame.kind === \"locked\"\n ? UiLock\n : frame.kind === \"waiting_to_lock\"\n ? UiSync\n : UiWatch\n : frame.nativeMethod\n ? UiChip\n : frame.runtime\n ? UiDebugStepOver\n : UiMethod;\n\n return (\n <div className={frame.runtime ? \"text-muted-foreground\" : \"text-foreground\"}>\n <div className=\"flex items-start gap-1.5\">\n <Icon icon={icon} 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 {!isAnno && frameHasSource(frame) && <FrameSourceWindow frame={frame} />}\n </div>\n );\n}\n"],"names":["jsx","UiLock","UiSync","UiWatch","UiChip","UiDebugStepOver","UiMethod","jsxs","Icon","Fragment","frameHasSource","FrameSourceWindow"],"mappings":";;;;;;;;;;;;AAqBO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,gBAAgB,kBAClB,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,WAAW,CAAC,MAAM,OAAO,IACjE;AAEJ,MAAI,cAAc,WAAW,EAAG,QAAO;AAEvC,wCACG,OAAA,EAAI,WACF,wBAAc,IAAI,CAAC,OAAO,UAAU;AACnC,UAAM,WAAW,+CAAgB;AACjC,UAAM,aAAa,WAAW,EAAE,GAAG,OAAO,GAAG,aAAa;AAC1D,WACEA,+BAAC,oBAAwD,OAAO,WAAA,GAAzC,GAAG,MAAM,YAAY,IAAI,KAAK,EAAuB;AAAA,EAEhF,CAAC,EAAA,CACH;AAEJ;AAEO,SAAS,iBAAiB,EAAE,SAAuC;AACxE,QAAM,SAAS,MAAM,SAAS;AAC9B,QAAM,OAAO,SACT,MAAM,SAAS,WACbC,OAAAA,SACA,MAAM,SAAS,oBACbC,gBACAC,QAAAA,UACJ,MAAM,eACJC,OAAAA,SACA,MAAM,UACJC,gBAAAA,kBACAC,SAAAA;AAER,yCACG,OAAA,EAAI,WAAW,MAAM,UAAU,0BAA0B,mBACxD,UAAA;AAAA,IAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,MAAAP,2BAAAA,IAACQ,KAAAA,MAAA,EAAK,MAAY,WAAU,8BAAA,CAA8B;AAAA,MAC1DR,2BAAAA,IAAC,SAAI,WAAU,WACb,yCAAC,OAAA,EAAI,WAAU,2DACZ,UAAA,SACCO,2BAAAA,KAAAE,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAT,2BAAAA,IAAC,QAAA,EAAK,WAAU,cAAc,UAAA,MAAM,cAAa;AAAA,QAChD,MAAM,kBACLA,2BAAAA,IAAC,UAAK,WAAU,+BAA+B,gBAAM,eAAA,CAAe;AAAA,MAAA,EAAA,CAExE,IAEAO,2BAAAA,KAAAE,WAAAA,UAAA,EACG,UAAA;AAAA,QAAA,MAAM;AAAA,QACN,MAAM,YACLT,2BAAAA,IAAC,UAAK,WAAU,2CAA2C,gBAAM,SAAA,CAAS;AAAA,MAAA,EAAA,CAE9E,GAEJ,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IACC,CAAC,UAAUU,wBAAAA,eAAe,KAAK,KAAKV,2BAAAA,IAACW,kBAAAA,qBAAkB,MAAA,CAAc;AAAA,EAAA,GACxE;AAEJ;;;"}
1
+ {"version":3,"file":"JvmStackTrace.cjs","sources":["../../../src/data/diagnostics/JvmStackTrace.tsx"],"sourcesContent":["import type { ParsedThreadFrame } from \"./jvm-stacktrace\";\nimport type { FrameSource } from \"./FrameSourceWindow.utils\";\nimport { StackFrameRow, type StackFrameActions } from \"./StackFrameRow\";\n\n// JvmFrameSourceResolver returns a source window for a frame, or undefined when\n// no source is available (a missing class must never blank out the frame). Used\n// to augment the rendered thread dump with decompiled source in place. Shares\n// its return shape with StackTraceSourceResolver so one resolver can serve both\n// the thread-dump and the exception surfaces.\nexport type JvmFrameSourceResolver = (frame: ParsedThreadFrame) => FrameSource | undefined;\n\nexport type JvmStackTraceProps = {\n frames: ParsedThreadFrame[];\n hideRuntimeOnly?: boolean;\n className?: string;\n /** Optional resolver that supplies inline source under each frame. */\n resolveSource?: JvmFrameSourceResolver;\n /** Trailing per-frame actions, revealed on hover/focus. */\n frameActions?: StackFrameActions;\n};\n\n// JvmStackTrace renders a parsed thread dump: frames plus the lock/monitor\n// annotation entries interleaved with them. It is a bare frame list — the\n// thread's own header, state badge and controls belong to the surrounding card\n// (see ThreadCard / DiagnosticsDetailPanel). Frames render through the shared\n// StackFrameRow, so they match an exception stack trace exactly.\nexport function JvmStackTrace({\n frames,\n hideRuntimeOnly = false,\n className,\n resolveSource,\n frameActions,\n}: 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 const resolved = resolveSource?.(frame);\n // `line` stays the frame's own see the note in RenderedStackTrace.\n const { line: _ignored, ...source } = resolved ?? {};\n const withSource = resolved ? { ...frame, ...source } : frame;\n return (\n <StackFrameRow\n key={`${frame.functionName}-${index}`}\n frame={withSource}\n index={index}\n {...(frameActions ? { frameActions } : {})}\n />\n );\n })}\n </div>\n );\n}\n"],"names":["jsx","StackFrameRow"],"mappings":";;;;AA0BO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,gBAAgB,kBAClB,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,WAAW,CAAC,MAAM,OAAO,IACjE;AAEJ,MAAI,cAAc,WAAW,EAAG,QAAO;AAEvC,wCACG,OAAA,EAAI,WACF,wBAAc,IAAI,CAAC,OAAO,UAAU;AACnC,UAAM,WAAW,+CAAgB;AAEjC,UAAM,EAAE,MAAM,UAAU,GAAG,OAAA,IAAW,YAAY,CAAA;AAClD,UAAM,aAAa,WAAW,EAAE,GAAG,OAAO,GAAG,WAAW;AACxD,WACEA,2BAAAA;AAAAA,MAACC,cAAAA;AAAAA,MAAA;AAAA,QAEC,OAAO;AAAA,QACP;AAAA,QACC,GAAI,eAAe,EAAE,iBAAiB,CAAA;AAAA,MAAC;AAAA,MAHnC,GAAG,MAAM,YAAY,IAAI,KAAK;AAAA,IAAA;AAAA,EAMzC,CAAC,EAAA,CACH;AAEJ;;"}
@@ -1,18 +1,15 @@
1
1
  import { ParsedThreadFrame } from './jvm-stacktrace';
2
- export type JvmFrameSourceResolver = (frame: ParsedThreadFrame) => {
3
- sourceLines: string[];
4
- sourceLineNumbers?: number[];
5
- sourceStartLine?: number;
6
- } | undefined;
2
+ import { FrameSource } from './FrameSourceWindow.utils';
3
+ import { StackFrameActions } from './StackFrameRow';
4
+ export type JvmFrameSourceResolver = (frame: ParsedThreadFrame) => FrameSource | undefined;
7
5
  export type JvmStackTraceProps = {
8
6
  frames: ParsedThreadFrame[];
9
7
  hideRuntimeOnly?: boolean;
10
8
  className?: string;
11
9
  /** Optional resolver that supplies inline source under each frame. */
12
10
  resolveSource?: JvmFrameSourceResolver;
11
+ /** Trailing per-frame actions, revealed on hover/focus. */
12
+ frameActions?: StackFrameActions;
13
13
  };
14
- export declare function JvmStackTrace({ frames, hideRuntimeOnly, className, resolveSource, }: JvmStackTraceProps): import("react/jsx-runtime").JSX.Element | null;
15
- export declare function JvmStackFrameRow({ frame }: {
16
- frame: ParsedThreadFrame;
17
- }): import("react/jsx-runtime").JSX.Element;
14
+ export declare function JvmStackTrace({ frames, hideRuntimeOnly, className, resolveSource, frameActions, }: JvmStackTraceProps): import("react/jsx-runtime").JSX.Element | null;
18
15
  //# sourceMappingURL=JvmStackTrace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"JvmStackTrace.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/JvmStackTrace.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAO1D,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAC1D;IAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GACjF,SAAS,CAAC;AAEd,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACxC,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,eAAuB,EACvB,SAAS,EACT,aAAa,GACd,EAAE,kBAAkB,kDAkBpB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAA;CAAE,2CAyCvE"}
1
+ {"version":3,"file":"JvmStackTrace.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/JvmStackTrace.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAOxE,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,WAAW,GAAG,SAAS,CAAC;AAE3F,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,2DAA2D;IAC3D,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAClC,CAAC;AAOF,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,eAAuB,EACvB,SAAS,EACT,aAAa,EACb,YAAY,GACb,EAAE,kBAAkB,kDAyBpB"}
@@ -1,46 +1,30 @@
1
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
- import { Icon } from "../Icon.js";
3
- import { FrameSourceWindow } from "./FrameSourceWindow.js";
4
- import { frameHasSource } from "./FrameSourceWindow.utils.js";
5
- import { UiLock } from "../../icons/components/UiLock.js";
6
- import { UiSync } from "../../icons/components/UiSync.js";
7
- import { UiWatch } from "../../icons/components/UiWatch.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";
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { StackFrameRow } from "./StackFrameRow.js";
11
3
  function JvmStackTrace({
12
4
  frames,
13
5
  hideRuntimeOnly = false,
14
6
  className,
15
- resolveSource
7
+ resolveSource,
8
+ frameActions
16
9
  }) {
17
10
  const visibleFrames = hideRuntimeOnly ? frames.filter((frame) => frame.kind !== "frame" || !frame.runtime) : frames;
18
11
  if (visibleFrames.length === 0) return null;
19
12
  return /* @__PURE__ */ jsx("div", { className, children: visibleFrames.map((frame, index) => {
20
13
  const resolved = resolveSource == null ? void 0 : resolveSource(frame);
21
- const withSource = resolved ? { ...frame, ...resolved } : frame;
22
- return /* @__PURE__ */ jsx(JvmStackFrameRow, { frame: withSource }, `${frame.functionName}-${index}`);
14
+ const { line: _ignored, ...source } = resolved ?? {};
15
+ const withSource = resolved ? { ...frame, ...source } : frame;
16
+ return /* @__PURE__ */ jsx(
17
+ StackFrameRow,
18
+ {
19
+ frame: withSource,
20
+ index,
21
+ ...frameActions ? { frameActions } : {}
22
+ },
23
+ `${frame.functionName}-${index}`
24
+ );
23
25
  }) });
24
26
  }
25
- function JvmStackFrameRow({ frame }) {
26
- const isAnno = frame.kind !== "frame";
27
- const icon = isAnno ? frame.kind === "locked" ? UiLock : frame.kind === "waiting_to_lock" ? UiSync : UiWatch : frame.nativeMethod ? UiChip : frame.runtime ? UiDebugStepOver : UiMethod;
28
- return /* @__PURE__ */ jsxs("div", { className: frame.runtime ? "text-muted-foreground" : "text-foreground", children: [
29
- /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-1.5", children: [
30
- /* @__PURE__ */ jsx(Icon, { icon, className: "mt-0.5 shrink-0 text-[11px]" }),
31
- /* @__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: [
32
- /* @__PURE__ */ jsx("span", { className: "opacity-70", children: frame.functionName }),
33
- frame.annotationText && /* @__PURE__ */ jsx("span", { className: "ml-2 font-normal opacity-80", children: frame.annotationText })
34
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
35
- frame.displayName,
36
- frame.location && /* @__PURE__ */ jsx("span", { className: "ml-2 text-[10px] font-normal opacity-80", children: frame.location })
37
- ] }) }) })
38
- ] }),
39
- !isAnno && frameHasSource(frame) && /* @__PURE__ */ jsx(FrameSourceWindow, { frame })
40
- ] });
41
- }
42
27
  export {
43
- JvmStackFrameRow,
44
28
  JvmStackTrace
45
29
  };
46
30
  //# sourceMappingURL=JvmStackTrace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JvmStackTrace.js","sources":["../../../src/data/diagnostics/JvmStackTrace.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport { UiChip, UiDebugStepOver, UiLock, UiSync, UiMethod, UiWatch } from \"../../icons\";\nimport type { ParsedThreadFrame } from \"./jvm-stacktrace\";\nimport { FrameSourceWindow } from \"./FrameSourceWindow\";\nimport { frameHasSource } from \"./FrameSourceWindow.utils\";\n\n// JvmFrameSourceResolver returns a source window for a frame, or undefined when\n// no source is available (a missing class must never blank out the frame). Used\n// to augment the rendered thread dump with decompiled source in place.\nexport type JvmFrameSourceResolver = (frame: ParsedThreadFrame) =>\n | { sourceLines: string[]; sourceLineNumbers?: number[]; sourceStartLine?: number }\n | undefined;\n\nexport type JvmStackTraceProps = {\n frames: ParsedThreadFrame[];\n hideRuntimeOnly?: boolean;\n className?: string;\n /** Optional resolver that supplies inline source under each frame. */\n resolveSource?: JvmFrameSourceResolver;\n};\n\nexport function JvmStackTrace({\n frames,\n hideRuntimeOnly = false,\n className,\n resolveSource,\n}: 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 const resolved = resolveSource?.(frame);\n const withSource = resolved ? { ...frame, ...resolved } : frame;\n return (\n <JvmStackFrameRow key={`${frame.functionName}-${index}`} frame={withSource} />\n );\n })}\n </div>\n );\n}\n\nexport function JvmStackFrameRow({ frame }: { frame: ParsedThreadFrame }) {\n const isAnno = frame.kind !== \"frame\";\n const icon = isAnno\n ? frame.kind === \"locked\"\n ? UiLock\n : frame.kind === \"waiting_to_lock\"\n ? UiSync\n : UiWatch\n : frame.nativeMethod\n ? UiChip\n : frame.runtime\n ? UiDebugStepOver\n : UiMethod;\n\n return (\n <div className={frame.runtime ? \"text-muted-foreground\" : \"text-foreground\"}>\n <div className=\"flex items-start gap-1.5\">\n <Icon icon={icon} 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 {!isAnno && frameHasSource(frame) && <FrameSourceWindow frame={frame} />}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAqBO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AACF,GAAuB;AACrB,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,UAAU;AACnC,UAAM,WAAW,+CAAgB;AACjC,UAAM,aAAa,WAAW,EAAE,GAAG,OAAO,GAAG,aAAa;AAC1D,WACE,oBAAC,oBAAwD,OAAO,WAAA,GAAzC,GAAG,MAAM,YAAY,IAAI,KAAK,EAAuB;AAAA,EAEhF,CAAC,EAAA,CACH;AAEJ;AAEO,SAAS,iBAAiB,EAAE,SAAuC;AACxE,QAAM,SAAS,MAAM,SAAS;AAC9B,QAAM,OAAO,SACT,MAAM,SAAS,WACb,SACA,MAAM,SAAS,oBACb,SACA,UACJ,MAAM,eACJ,SACA,MAAM,UACJ,kBACA;AAER,8BACG,OAAA,EAAI,WAAW,MAAM,UAAU,0BAA0B,mBACxD,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAK,MAAY,WAAU,8BAAA,CAA8B;AAAA,MAC1D,oBAAC,SAAI,WAAU,WACb,8BAAC,OAAA,EAAI,WAAU,2DACZ,UAAA,SACC,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,cAAc,UAAA,MAAM,cAAa;AAAA,QAChD,MAAM,kBACL,oBAAC,UAAK,WAAU,+BAA+B,gBAAM,eAAA,CAAe;AAAA,MAAA,EAAA,CAExE,IAEA,qBAAA,UAAA,EACG,UAAA;AAAA,QAAA,MAAM;AAAA,QACN,MAAM,YACL,oBAAC,UAAK,WAAU,2CAA2C,gBAAM,SAAA,CAAS;AAAA,MAAA,EAAA,CAE9E,GAEJ,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IACC,CAAC,UAAU,eAAe,KAAK,KAAK,oBAAC,qBAAkB,MAAA,CAAc;AAAA,EAAA,GACxE;AAEJ;"}
1
+ {"version":3,"file":"JvmStackTrace.js","sources":["../../../src/data/diagnostics/JvmStackTrace.tsx"],"sourcesContent":["import type { ParsedThreadFrame } from \"./jvm-stacktrace\";\nimport type { FrameSource } from \"./FrameSourceWindow.utils\";\nimport { StackFrameRow, type StackFrameActions } from \"./StackFrameRow\";\n\n// JvmFrameSourceResolver returns a source window for a frame, or undefined when\n// no source is available (a missing class must never blank out the frame). Used\n// to augment the rendered thread dump with decompiled source in place. Shares\n// its return shape with StackTraceSourceResolver so one resolver can serve both\n// the thread-dump and the exception surfaces.\nexport type JvmFrameSourceResolver = (frame: ParsedThreadFrame) => FrameSource | undefined;\n\nexport type JvmStackTraceProps = {\n frames: ParsedThreadFrame[];\n hideRuntimeOnly?: boolean;\n className?: string;\n /** Optional resolver that supplies inline source under each frame. */\n resolveSource?: JvmFrameSourceResolver;\n /** Trailing per-frame actions, revealed on hover/focus. */\n frameActions?: StackFrameActions;\n};\n\n// JvmStackTrace renders a parsed thread dump: frames plus the lock/monitor\n// annotation entries interleaved with them. It is a bare frame list — the\n// thread's own header, state badge and controls belong to the surrounding card\n// (see ThreadCard / DiagnosticsDetailPanel). Frames render through the shared\n// StackFrameRow, so they match an exception stack trace exactly.\nexport function JvmStackTrace({\n frames,\n hideRuntimeOnly = false,\n className,\n resolveSource,\n frameActions,\n}: 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 const resolved = resolveSource?.(frame);\n // `line` stays the frame's own see the note in RenderedStackTrace.\n const { line: _ignored, ...source } = resolved ?? {};\n const withSource = resolved ? { ...frame, ...source } : frame;\n return (\n <StackFrameRow\n key={`${frame.functionName}-${index}`}\n frame={withSource}\n index={index}\n {...(frameActions ? { frameActions } : {})}\n />\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";;AA0BO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,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,UAAU;AACnC,UAAM,WAAW,+CAAgB;AAEjC,UAAM,EAAE,MAAM,UAAU,GAAG,OAAA,IAAW,YAAY,CAAA;AAClD,UAAM,aAAa,WAAW,EAAE,GAAG,OAAO,GAAG,WAAW;AACxD,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,OAAO;AAAA,QACP;AAAA,QACC,GAAI,eAAe,EAAE,iBAAiB,CAAA;AAAA,MAAC;AAAA,MAHnC,GAAG,MAAM,YAAY,IAAI,KAAK;AAAA,IAAA;AAAA,EAMzC,CAAC,EAAA,CACH;AAEJ;"}