@flanksource/clicky-ui 0.3.22 → 0.3.23

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 (184) 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/code-highlight.cjs +0 -6
  66. package/dist/data/code-highlight.cjs.map +1 -1
  67. package/dist/data/code-highlight.d.ts +4 -3
  68. package/dist/data/code-highlight.d.ts.map +1 -1
  69. package/dist/data/code-highlight.js +1 -7
  70. package/dist/data/code-highlight.js.map +1 -1
  71. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +6 -2
  72. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  73. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +8 -1
  74. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  75. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +6 -2
  76. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  77. package/dist/data/diagnostics/ErrorDetails.cjs +29 -5
  78. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  79. package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
  80. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  81. package/dist/data/diagnostics/ErrorDetails.js +29 -5
  82. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  83. package/dist/data/diagnostics/FrameSourceWindow.cjs +54 -24
  84. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  85. package/dist/data/diagnostics/FrameSourceWindow.d.ts +2 -1
  86. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  87. package/dist/data/diagnostics/FrameSourceWindow.js +54 -24
  88. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  89. package/dist/data/diagnostics/FrameSourceWindow.utils.cjs.map +1 -1
  90. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts +3 -0
  91. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts.map +1 -1
  92. package/dist/data/diagnostics/FrameSourceWindow.utils.js.map +1 -1
  93. package/dist/data/diagnostics/JvmStackTrace.cjs +14 -30
  94. package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
  95. package/dist/data/diagnostics/JvmStackTrace.d.ts +6 -9
  96. package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
  97. package/dist/data/diagnostics/JvmStackTrace.js +15 -31
  98. package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
  99. package/dist/data/diagnostics/RenderedStackTrace.cjs +14 -144
  100. package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
  101. package/dist/data/diagnostics/RenderedStackTrace.d.ts +6 -6
  102. package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
  103. package/dist/data/diagnostics/RenderedStackTrace.js +15 -145
  104. package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
  105. package/dist/data/diagnostics/StackFrameRow.cjs +65 -0
  106. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -0
  107. package/dist/data/diagnostics/StackFrameRow.d.ts +13 -0
  108. package/dist/data/diagnostics/StackFrameRow.d.ts.map +1 -0
  109. package/dist/data/diagnostics/StackFrameRow.js +65 -0
  110. package/dist/data/diagnostics/StackFrameRow.js.map +1 -0
  111. package/dist/data/diagnostics/ThreadCard.cjs +9 -2
  112. package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
  113. package/dist/data/diagnostics/ThreadCard.d.ts +3 -1
  114. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
  115. package/dist/data/diagnostics/ThreadCard.js +9 -2
  116. package/dist/data/diagnostics/ThreadCard.js.map +1 -1
  117. package/dist/data/diagnostics/frame-heuristics.cjs +26 -0
  118. package/dist/data/diagnostics/frame-heuristics.cjs.map +1 -0
  119. package/dist/data/diagnostics/frame-heuristics.d.ts +5 -0
  120. package/dist/data/diagnostics/frame-heuristics.d.ts.map +1 -0
  121. package/dist/data/diagnostics/frame-heuristics.js +26 -0
  122. package/dist/data/diagnostics/frame-heuristics.js.map +1 -0
  123. package/dist/data/diagnostics/jvm-stacktrace.cjs +5 -7
  124. package/dist/data/diagnostics/jvm-stacktrace.cjs.map +1 -1
  125. package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -1
  126. package/dist/data/diagnostics/jvm-stacktrace.js +5 -7
  127. package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -1
  128. package/dist/data/diagnostics/stacktrace-parse.cjs +4 -9
  129. package/dist/data/diagnostics/stacktrace-parse.cjs.map +1 -1
  130. package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -1
  131. package/dist/data/diagnostics/stacktrace-parse.js +4 -9
  132. package/dist/data/diagnostics/stacktrace-parse.js.map +1 -1
  133. package/dist/data/version-info.cjs +3 -3
  134. package/dist/data/version-info.js +3 -3
  135. package/dist/data.cjs +7 -1
  136. package/dist/data.cjs.map +1 -1
  137. package/dist/data.d.ts +4 -2
  138. package/dist/data.d.ts.map +1 -1
  139. package/dist/data.js +8 -2
  140. package/dist/data.js.map +1 -1
  141. package/dist/index.cjs +18 -1
  142. package/dist/index.cjs.map +1 -1
  143. package/dist/index.js +19 -2
  144. package/dist/index.js.map +1 -1
  145. package/dist/rpc/CommandForm.cjs +8 -18
  146. package/dist/rpc/CommandForm.cjs.map +1 -1
  147. package/dist/rpc/CommandForm.d.ts +8 -2
  148. package/dist/rpc/CommandForm.d.ts.map +1 -1
  149. package/dist/rpc/CommandForm.js +9 -19
  150. package/dist/rpc/CommandForm.js.map +1 -1
  151. package/dist/rpc/OperationActionDialog.cjs +3 -3
  152. package/dist/rpc/OperationActionDialog.cjs.map +1 -1
  153. package/dist/rpc/OperationActionDialog.js +3 -3
  154. package/dist/rpc/OperationActionDialog.js.map +1 -1
  155. package/dist/rpc/OperationCommandPage.cjs +7 -7
  156. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  157. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  158. package/dist/rpc/OperationCommandPage.js +7 -7
  159. package/dist/rpc/OperationCommandPage.js.map +1 -1
  160. package/dist/rpc/apiClient.cjs +17 -3
  161. package/dist/rpc/apiClient.cjs.map +1 -1
  162. package/dist/rpc/apiClient.d.ts +4 -4
  163. package/dist/rpc/apiClient.d.ts.map +1 -1
  164. package/dist/rpc/apiClient.js +17 -3
  165. package/dist/rpc/apiClient.js.map +1 -1
  166. package/dist/rpc/formMetadata.cjs +5 -9
  167. package/dist/rpc/formMetadata.cjs.map +1 -1
  168. package/dist/rpc/formMetadata.d.ts +3 -3
  169. package/dist/rpc/formMetadata.d.ts.map +1 -1
  170. package/dist/rpc/formMetadata.js +5 -9
  171. package/dist/rpc/formMetadata.js.map +1 -1
  172. package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
  173. package/dist/rpc/types.cjs.map +1 -1
  174. package/dist/rpc/types.d.ts +1 -0
  175. package/dist/rpc/types.d.ts.map +1 -1
  176. package/dist/rpc/types.js.map +1 -1
  177. package/dist/rpc/useOperations.cjs.map +1 -1
  178. package/dist/rpc/useOperations.d.ts +4 -4
  179. package/dist/rpc/useOperations.d.ts.map +1 -1
  180. package/dist/rpc/useOperations.js.map +1 -1
  181. package/dist/rpc.d.ts +2 -2
  182. package/dist/rpc.d.ts.map +1 -1
  183. package/dist/styles.css +1 -1
  184. package/package.json +2 -1
@@ -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;"}
@@ -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 next = {
36
- ...frame,
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(FrameWithSource, { frame, index: idx }, `${frame.functionName}-${idx}`)) }),
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
- export type StackTraceSourceResolver = (frame: ParsedStackFrame, contextLines: number) => {
3
- lines: string[];
4
- startLine: number;
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;AAS5B,MAAM,MAAM,wBAAwB,GAAG,CACrC,KAAK,EAAE,gBAAgB,EACvB,YAAY,EAAE,MAAM,KAElB;IACE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACD,SAAS,CAAC;AAEd,MAAM,WAAW,eAAe;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,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,SAAS,GACV,EAAE,eAAe,kDAgGjB"}
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, useState, useEffect } from "react";
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 next = {
34
- ...frame,
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(FrameWithSource, { frame, index: idx }, `${frame.functionName}-${idx}`)) }),
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
  };