@flanksource/clicky-ui 0.1.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -2
- package/dist/api-explorer.d.ts +5 -0
- package/dist/api-explorer.d.ts.map +1 -0
- package/dist/api-explorer.js +25 -0
- package/dist/api-explorer.js.map +1 -0
- package/dist/clicky.d.ts +2 -0
- package/dist/clicky.d.ts.map +1 -0
- package/dist/clicky.js +5 -0
- package/dist/clicky.js.map +1 -0
- package/dist/components/DatePicker.d.ts +18 -0
- package/dist/components/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker.js +63 -0
- package/dist/components/DatePicker.js.map +1 -0
- package/dist/components/DateTimePicker.d.ts +18 -0
- package/dist/components/DateTimePicker.d.ts.map +1 -0
- package/dist/components/DateTimePicker.js +84 -0
- package/dist/components/DateTimePicker.js.map +1 -0
- package/dist/components/FilterBar.d.ts +180 -0
- package/dist/components/FilterBar.d.ts.map +1 -0
- package/dist/components/FilterBar.js +1685 -0
- package/dist/components/FilterBar.js.map +1 -0
- package/dist/components/MultiSelect.d.ts +19 -0
- package/dist/components/MultiSelect.d.ts.map +1 -0
- package/dist/components/MultiSelect.js +143 -0
- package/dist/components/MultiSelect.js.map +1 -0
- package/dist/components/RangeSlider.d.ts +16 -0
- package/dist/components/RangeSlider.d.ts.map +1 -0
- package/dist/components/RangeSlider.js +92 -0
- package/dist/components/RangeSlider.js.map +1 -0
- package/dist/components/button.d.ts +21 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +126 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/density-switcher.d.ts +7 -0
- package/dist/components/density-switcher.d.ts.map +1 -0
- package/dist/components/density-switcher.js +32 -0
- package/dist/components/density-switcher.js.map +1 -0
- package/dist/components/icon-menu-picker.d.ts +23 -0
- package/dist/components/icon-menu-picker.d.ts.map +1 -0
- package/dist/components/icon-menu-picker.js +192 -0
- package/dist/components/icon-menu-picker.js.map +1 -0
- package/dist/components/select.d.ts +15 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +39 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/theme-switcher.d.ts +7 -0
- package/dist/components/theme-switcher.d.ts.map +1 -0
- package/dist/components/theme-switcher.js +42 -0
- package/dist/components/theme-switcher.js.map +1 -0
- package/dist/components.d.ts +15 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +33 -0
- package/dist/components.js.map +1 -0
- package/dist/data/AnsiHtml.d.ts +7 -0
- package/dist/data/AnsiHtml.d.ts.map +1 -0
- package/dist/data/AnsiHtml.js +71 -0
- package/dist/data/AnsiHtml.js.map +1 -0
- package/dist/data/Avatar.d.ts +32 -0
- package/dist/data/Avatar.d.ts.map +1 -0
- package/dist/data/Avatar.js +201 -0
- package/dist/data/Avatar.js.map +1 -0
- package/dist/data/AvatarBadge.d.ts +26 -0
- package/dist/data/AvatarBadge.d.ts.map +1 -0
- package/dist/data/AvatarBadge.js +104 -0
- package/dist/data/AvatarBadge.js.map +1 -0
- package/dist/data/Badge.d.ts +44 -0
- package/dist/data/Badge.d.ts.map +1 -0
- package/dist/data/Badge.js +667 -0
- package/dist/data/Badge.js.map +1 -0
- package/dist/data/Clicky.d.ts +147 -0
- package/dist/data/Clicky.d.ts.map +1 -0
- package/dist/data/Clicky.fixtures.d.ts +3 -0
- package/dist/data/Clicky.fixtures.d.ts.map +1 -0
- package/dist/data/Clicky.js +1960 -0
- package/dist/data/Clicky.js.map +1 -0
- package/dist/data/DataTable.d.ts +95 -0
- package/dist/data/DataTable.d.ts.map +1 -0
- package/dist/data/DataTable.js +1464 -0
- package/dist/data/DataTable.js.map +1 -0
- package/dist/data/FilterPill.d.ts +29 -0
- package/dist/data/FilterPill.d.ts.map +1 -0
- package/dist/data/FilterPill.js +153 -0
- package/dist/data/FilterPill.js.map +1 -0
- package/dist/data/Gauge.d.ts +15 -0
- package/dist/data/Gauge.d.ts.map +1 -0
- package/dist/data/Gauge.js +63 -0
- package/dist/data/Gauge.js.map +1 -0
- package/dist/data/Icon.d.ts +53 -0
- package/dist/data/Icon.d.ts.map +1 -0
- package/dist/data/Icon.js +115 -0
- package/dist/data/Icon.js.map +1 -0
- package/dist/data/JsonView.d.ts +8 -0
- package/dist/data/JsonView.d.ts.map +1 -0
- package/dist/data/JsonView.js +74 -0
- package/dist/data/JsonView.js.map +1 -0
- package/dist/data/KeyValueList.d.ts +17 -0
- package/dist/data/KeyValueList.d.ts.map +1 -0
- package/dist/data/KeyValueList.js +33 -0
- package/dist/data/KeyValueList.js.map +1 -0
- package/dist/data/LogViewer.d.ts +10 -0
- package/dist/data/LogViewer.d.ts.map +1 -0
- package/dist/data/LogViewer.js +46 -0
- package/dist/data/LogViewer.js.map +1 -0
- package/dist/data/LogsTable.d.ts +27 -0
- package/dist/data/LogsTable.d.ts.map +1 -0
- package/dist/data/LogsTable.js +580 -0
- package/dist/data/LogsTable.js.map +1 -0
- package/dist/data/Markdown.d.ts +6 -0
- package/dist/data/Markdown.d.ts.map +1 -0
- package/dist/data/Markdown.js +59 -0
- package/dist/data/Markdown.js.map +1 -0
- package/dist/data/MatrixTable.d.ts +22 -0
- package/dist/data/MatrixTable.d.ts.map +1 -0
- package/dist/data/MatrixTable.js +164 -0
- package/dist/data/MatrixTable.js.map +1 -0
- package/dist/data/MethodBadge.d.ts +6 -0
- package/dist/data/MethodBadge.d.ts.map +1 -0
- package/dist/data/MethodBadge.js +18 -0
- package/dist/data/MethodBadge.js.map +1 -0
- package/dist/data/ProgressBar.d.ts +13 -0
- package/dist/data/ProgressBar.d.ts.map +1 -0
- package/dist/data/ProgressBar.js +34 -0
- package/dist/data/ProgressBar.js.map +1 -0
- package/dist/data/SortableHeader.d.ts +12 -0
- package/dist/data/SortableHeader.d.ts.map +1 -0
- package/dist/data/SortableHeader.js +33 -0
- package/dist/data/SortableHeader.js.map +1 -0
- package/dist/data/TabButton.d.ts +12 -0
- package/dist/data/TabButton.d.ts.map +1 -0
- package/dist/data/TabButton.js +45 -0
- package/dist/data/TabButton.js.map +1 -0
- package/dist/data/Tree.d.ts +35 -0
- package/dist/data/Tree.d.ts.map +1 -0
- package/dist/data/Tree.js +236 -0
- package/dist/data/Tree.js.map +1 -0
- package/dist/data/TreeGroupHeader.d.ts +11 -0
- package/dist/data/TreeGroupHeader.d.ts.map +1 -0
- package/dist/data/TreeGroupHeader.js +41 -0
- package/dist/data/TreeGroupHeader.js.map +1 -0
- package/dist/data/TreeNode.d.ts +43 -0
- package/dist/data/TreeNode.d.ts.map +1 -0
- package/dist/data/TreeNode.js +100 -0
- package/dist/data/TreeNode.js.map +1 -0
- package/dist/data/cells/StatusDot.d.ts +11 -0
- package/dist/data/cells/StatusDot.d.ts.map +1 -0
- package/dist/data/cells/StatusDot.js +38 -0
- package/dist/data/cells/StatusDot.js.map +1 -0
- package/dist/data/cells/TagList.d.ts +59 -0
- package/dist/data/cells/TagList.d.ts.map +1 -0
- package/dist/data/cells/TagList.js +257 -0
- package/dist/data/cells/TagList.js.map +1 -0
- package/dist/data/cells/Timestamp.d.ts +46 -0
- package/dist/data/cells/Timestamp.d.ts.map +1 -0
- package/dist/data/cells/Timestamp.js +146 -0
- package/dist/data/cells/Timestamp.js.map +1 -0
- package/dist/data/cells/status-mapping.d.ts +8 -0
- package/dist/data/cells/status-mapping.d.ts.map +1 -0
- package/dist/data/cells/status-mapping.js +44 -0
- package/dist/data/cells/status-mapping.js.map +1 -0
- package/dist/data/code-highlight.d.ts +12 -0
- package/dist/data/code-highlight.d.ts.map +1 -0
- package/dist/data/code-highlight.js +28 -0
- package/dist/data/code-highlight.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +9 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +445 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsTree.d.ts +9 -0
- package/dist/data/diagnostics/DiagnosticsTree.d.ts.map +1 -0
- package/dist/data/diagnostics/DiagnosticsTree.js +78 -0
- package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -0
- package/dist/data/diagnostics/ErrorDetails.d.ts +20 -0
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -0
- package/dist/data/diagnostics/ErrorDetails.js +157 -0
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -0
- package/dist/data/diagnostics/GoroutineCard.d.ts +10 -0
- package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -0
- package/dist/data/diagnostics/GoroutineCard.js +75 -0
- package/dist/data/diagnostics/GoroutineCard.js.map +1 -0
- package/dist/data/diagnostics/JvmStackTrace.d.ts +11 -0
- package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -0
- package/dist/data/diagnostics/JvmStackTrace.js +26 -0
- package/dist/data/diagnostics/JvmStackTrace.js.map +1 -0
- package/dist/data/diagnostics/RenderedStackTrace.d.ts +18 -0
- package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -0
- package/dist/data/diagnostics/RenderedStackTrace.js +235 -0
- package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -0
- package/dist/data/diagnostics/ThreadCard.d.ts +10 -0
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -0
- package/dist/data/diagnostics/ThreadCard.js +78 -0
- package/dist/data/diagnostics/ThreadCard.js.map +1 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts +26 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -0
- package/dist/data/diagnostics/error-diagnostics.js +108 -0
- package/dist/data/diagnostics/error-diagnostics.js.map +1 -0
- package/dist/data/diagnostics/fixtures.d.ts +3 -0
- package/dist/data/diagnostics/fixtures.d.ts.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.d.ts +34 -0
- package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.js +190 -0
- package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -0
- package/dist/data/diagnostics/stacktrace-parse.d.ts +11 -0
- package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -0
- package/dist/data/diagnostics/stacktrace-parse.js +87 -0
- package/dist/data/diagnostics/stacktrace-parse.js.map +1 -0
- package/dist/data/diagnostics/stacktrace.d.ts +38 -0
- package/dist/data/diagnostics/stacktrace.d.ts.map +1 -0
- package/dist/data/diagnostics/stacktrace.js +119 -0
- package/dist/data/diagnostics/stacktrace.js.map +1 -0
- package/dist/data/diagnostics/types.d.ts +30 -0
- package/dist/data/diagnostics/types.d.ts.map +1 -0
- package/dist/data/diagnostics/utils.d.ts +8 -0
- package/dist/data/diagnostics/utils.d.ts.map +1 -0
- package/dist/data/diagnostics/utils.js +59 -0
- package/dist/data/diagnostics/utils.js.map +1 -0
- package/dist/data/har/HarPanel.d.ts +9 -0
- package/dist/data/har/HarPanel.d.ts.map +1 -0
- package/dist/data/har/HarPanel.js +175 -0
- package/dist/data/har/HarPanel.js.map +1 -0
- package/dist/data/har/fixtures.d.ts +3 -0
- package/dist/data/har/fixtures.d.ts.map +1 -0
- package/dist/data/har/types.d.ts +47 -0
- package/dist/data/har/types.d.ts.map +1 -0
- package/dist/data.d.ts +39 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +109 -0
- package/dist/data.js.map +1 -0
- package/dist/hooks/use-density.d.ts +22 -0
- package/dist/hooks/use-density.d.ts.map +1 -0
- package/dist/hooks/use-density.js +54 -0
- package/dist/hooks/use-density.js.map +1 -0
- package/dist/hooks/use-history-route.d.ts +6 -0
- package/dist/hooks/use-history-route.d.ts.map +1 -0
- package/dist/hooks/use-history-route.js +31 -0
- package/dist/hooks/use-history-route.js.map +1 -0
- package/dist/hooks/use-sort.d.ts +17 -0
- package/dist/hooks/use-sort.d.ts.map +1 -0
- package/dist/hooks/use-sort.js +42 -0
- package/dist/hooks/use-sort.js.map +1 -0
- package/dist/hooks/use-theme.d.ts +17 -0
- package/dist/hooks/use-theme.d.ts.map +1 -0
- package/dist/hooks/use-theme.js +68 -0
- package/dist/hooks/use-theme.js.map +1 -0
- package/dist/hooks.d.ts +5 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +14 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +195 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/Section.d.ts +23 -0
- package/dist/layout/Section.d.ts.map +1 -0
- package/dist/layout/Section.js +73 -0
- package/dist/layout/Section.js.map +1 -0
- package/dist/layout/SplitPane.d.ts +13 -0
- package/dist/layout/SplitPane.d.ts.map +1 -0
- package/dist/layout/SplitPane.js +72 -0
- package/dist/layout/SplitPane.js.map +1 -0
- package/dist/lib/palette.d.ts +4 -0
- package/dist/lib/palette.d.ts.map +1 -0
- package/dist/lib/palette.js +35 -0
- package/dist/lib/palette.js.map +1 -0
- package/dist/lib/size.d.ts +6 -0
- package/dist/lib/size.d.ts.map +1 -0
- package/dist/lib/size.js +14 -0
- package/dist/lib/size.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/overlay/HoverCard.d.ts +13 -0
- package/dist/overlay/HoverCard.d.ts.map +1 -0
- package/dist/overlay/HoverCard.js +170 -0
- package/dist/overlay/HoverCard.js.map +1 -0
- package/dist/overlay/Modal.d.ts +17 -0
- package/dist/overlay/Modal.d.ts.map +1 -0
- package/dist/overlay/Modal.js +91 -0
- package/dist/overlay/Modal.js.map +1 -0
- package/dist/rpc/AcceptPicker.d.ts +52 -0
- package/dist/rpc/AcceptPicker.d.ts.map +1 -0
- package/dist/rpc/AcceptPicker.js +126 -0
- package/dist/rpc/AcceptPicker.js.map +1 -0
- package/dist/rpc/ApiExplorer.d.ts +11 -0
- package/dist/rpc/ApiExplorer.d.ts.map +1 -0
- package/dist/rpc/ApiExplorer.js +37 -0
- package/dist/rpc/ApiExplorer.js.map +1 -0
- package/dist/rpc/CommandForm.d.ts +15 -0
- package/dist/rpc/CommandForm.d.ts.map +1 -0
- package/dist/rpc/CommandForm.js +356 -0
- package/dist/rpc/CommandForm.js.map +1 -0
- package/dist/rpc/CommandOutput.d.ts +11 -0
- package/dist/rpc/CommandOutput.d.ts.map +1 -0
- package/dist/rpc/CommandOutput.js +195 -0
- package/dist/rpc/CommandOutput.js.map +1 -0
- package/dist/rpc/EndpointList.d.ts +18 -0
- package/dist/rpc/EndpointList.d.ts.map +1 -0
- package/dist/rpc/EndpointList.js +56 -0
- package/dist/rpc/EndpointList.js.map +1 -0
- package/dist/rpc/EntityExplorerApp.d.ts +15 -0
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -0
- package/dist/rpc/EntityExplorerApp.js +282 -0
- package/dist/rpc/EntityExplorerApp.js.map +1 -0
- package/dist/rpc/ExecutionResult.d.ts +14 -0
- package/dist/rpc/ExecutionResult.d.ts.map +1 -0
- package/dist/rpc/ExecutionResult.js +51 -0
- package/dist/rpc/ExecutionResult.js.map +1 -0
- package/dist/rpc/FilterForm.d.ts +22 -0
- package/dist/rpc/FilterForm.d.ts.map +1 -0
- package/dist/rpc/FilterForm.js +392 -0
- package/dist/rpc/FilterForm.js.map +1 -0
- package/dist/rpc/InlineError.d.ts +7 -0
- package/dist/rpc/InlineError.d.ts.map +1 -0
- package/dist/rpc/InlineError.js +54 -0
- package/dist/rpc/InlineError.js.map +1 -0
- package/dist/rpc/OperationActionDialog.d.ts +12 -0
- package/dist/rpc/OperationActionDialog.d.ts.map +1 -0
- package/dist/rpc/OperationActionDialog.js +105 -0
- package/dist/rpc/OperationActionDialog.js.map +1 -0
- package/dist/rpc/OperationCatalog.d.ts +21 -0
- package/dist/rpc/OperationCatalog.d.ts.map +1 -0
- package/dist/rpc/OperationCatalog.js +339 -0
- package/dist/rpc/OperationCatalog.js.map +1 -0
- package/dist/rpc/OperationCommandPage.d.ts +22 -0
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -0
- package/dist/rpc/OperationCommandPage.js +484 -0
- package/dist/rpc/OperationCommandPage.js.map +1 -0
- package/dist/rpc/OperationEntityPage.d.ts +23 -0
- package/dist/rpc/OperationEntityPage.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPage.js +218 -0
- package/dist/rpc/OperationEntityPage.js.map +1 -0
- package/dist/rpc/classify.d.ts +8 -0
- package/dist/rpc/classify.d.ts.map +1 -0
- package/dist/rpc/classify.js +76 -0
- package/dist/rpc/classify.js.map +1 -0
- package/dist/rpc/clickyMetadata.d.ts +12 -0
- package/dist/rpc/clickyMetadata.d.ts.map +1 -0
- package/dist/rpc/clickyMetadata.js +71 -0
- package/dist/rpc/clickyMetadata.js.map +1 -0
- package/dist/rpc/formMetadata.d.ts +27 -0
- package/dist/rpc/formMetadata.d.ts.map +1 -0
- package/dist/rpc/formMetadata.js +250 -0
- package/dist/rpc/formMetadata.js.map +1 -0
- package/dist/rpc/types.d.ts +109 -0
- package/dist/rpc/types.d.ts.map +1 -0
- package/dist/rpc/types.js +8 -0
- package/dist/rpc/types.js.map +1 -0
- package/dist/rpc/useOperations.d.ts +346 -0
- package/dist/rpc/useOperations.d.ts.map +1 -0
- package/dist/rpc/useOperations.js +31 -0
- package/dist/rpc/useOperations.js.map +1 -0
- package/dist/rpc.d.ts +14 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +37 -0
- package/dist/rpc.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/styles.d.ts +1 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +2 -0
- package/dist/styles.js.map +1 -0
- package/dist/tailwind-preset.d.ts +4 -0
- package/dist/tailwind-preset.d.ts.map +1 -0
- package/dist/tailwind-preset.js +69 -0
- package/dist/tailwind-preset.js.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +12 -0
- package/dist/utils.js.map +1 -0
- package/package.json +83 -40
- package/dist/index.d.mts +0 -834
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -2918
- package/dist/index.mjs.map +0 -1
- package/dist/tailwind-preset.d.mts +0 -7
- package/dist/tailwind-preset.d.mts.map +0 -1
- package/dist/tailwind-preset.mjs +0 -64
- package/dist/tailwind-preset.mjs.map +0 -1
- package/src/styles/tokens.css +0 -78
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const frameRe = /^\s*at\s+([\w$.]+)\.([\w$<>]+)\(([^)]+)\)/;
|
|
2
|
+
const headerRe = /^([\w.$]+(?:Exception|Error|Throwable))(?::\s*(.*))?$/;
|
|
3
|
+
const continuationRe = /^\.\.\.\s+\d+\s+more$/;
|
|
4
|
+
const runtimePrefixes = ["java.", "javax.", "sun.", "jdk.", "com.sun.", "oracle.jrockit."];
|
|
5
|
+
function parseJavaStackTrace(input) {
|
|
6
|
+
const out = {
|
|
7
|
+
causedBy: [],
|
|
8
|
+
frames: [],
|
|
9
|
+
language: "java"
|
|
10
|
+
};
|
|
11
|
+
if (!input || !input.trim()) return out;
|
|
12
|
+
const headerLines = [];
|
|
13
|
+
for (const raw of input.split("\n")) {
|
|
14
|
+
const trimmed = raw.trim();
|
|
15
|
+
if (!trimmed) continue;
|
|
16
|
+
if (continuationRe.test(trimmed)) continue;
|
|
17
|
+
const frameMatch = frameRe.exec(raw);
|
|
18
|
+
if (frameMatch && frameMatch[1] && frameMatch[2] && frameMatch[3] !== void 0) {
|
|
19
|
+
out.frames.push(buildFrame(frameMatch[1], frameMatch[2], frameMatch[3]));
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (trimmed.startsWith("Caused by:")) {
|
|
23
|
+
out.causedBy.push(trimmed.slice("Caused by:".length).trim());
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (trimmed.startsWith("Internal Exception:")) {
|
|
27
|
+
out.causedBy.push(trimmed.slice("Internal Exception:".length).trim());
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (!out.exceptionClass) {
|
|
31
|
+
const headerMatch = headerRe.exec(trimmed);
|
|
32
|
+
if (headerMatch && headerMatch[1]) {
|
|
33
|
+
out.exceptionClass = headerMatch[1];
|
|
34
|
+
if (headerMatch[2]) out.message = headerMatch[2];
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
headerLines.push(trimmed);
|
|
39
|
+
}
|
|
40
|
+
if (!out.message && headerLines.length > 0) {
|
|
41
|
+
out.message = headerLines.join(" ");
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
function buildFrame(cls, method, locRaw) {
|
|
46
|
+
const loc = locRaw.trim();
|
|
47
|
+
let file;
|
|
48
|
+
let line;
|
|
49
|
+
let nativeMethod = false;
|
|
50
|
+
if (loc === "Native Method") {
|
|
51
|
+
nativeMethod = true;
|
|
52
|
+
} else if (loc !== "Unknown Source") {
|
|
53
|
+
const cleaned = (loc.split(" ~[")[0] ?? loc).trim();
|
|
54
|
+
const i = cleaned.lastIndexOf(":");
|
|
55
|
+
if (i >= 0) {
|
|
56
|
+
file = cleaned.slice(0, i);
|
|
57
|
+
const n = Number(cleaned.slice(i + 1));
|
|
58
|
+
if (Number.isFinite(n)) line = n;
|
|
59
|
+
} else {
|
|
60
|
+
file = cleaned;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const functionName = `${cls}.${method}`;
|
|
64
|
+
const location = file ? line ? `${file}:${line}` : file : nativeMethod ? "Native Method" : void 0;
|
|
65
|
+
const frame = {
|
|
66
|
+
functionName,
|
|
67
|
+
displayName: shortDisplay(cls, method),
|
|
68
|
+
kind: "frame",
|
|
69
|
+
runtime: runtimePrefixes.some((p) => cls.startsWith(p)),
|
|
70
|
+
nativeMethod,
|
|
71
|
+
class: cls,
|
|
72
|
+
method
|
|
73
|
+
};
|
|
74
|
+
if (file !== void 0) frame.file = file;
|
|
75
|
+
if (line !== void 0) frame.line = line;
|
|
76
|
+
if (location !== void 0) frame.location = location;
|
|
77
|
+
return frame;
|
|
78
|
+
}
|
|
79
|
+
function shortDisplay(cls, method) {
|
|
80
|
+
const parts = cls.split(".");
|
|
81
|
+
const last = parts[parts.length - 1] ?? cls;
|
|
82
|
+
return `${last}.${method}`;
|
|
83
|
+
}
|
|
84
|
+
export {
|
|
85
|
+
parseJavaStackTrace
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=stacktrace-parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stacktrace-parse.js","sources":["../../../src/data/diagnostics/stacktrace-parse.ts"],"sourcesContent":["import type { ParsedThreadFrame } from \"./jvm-stacktrace\";\n\n// ParsedStackFrame is the React mirror of Go's clicky api.StackFrame. We reuse\n// ParsedThreadFrame so the existing JvmStackFrameRow renderer can display it.\nexport type ParsedStackFrame = ParsedThreadFrame;\n\nexport interface ParsedStackTrace {\n exceptionClass?: string;\n message?: string;\n causedBy: string[];\n frames: ParsedStackFrame[];\n language: \"java\";\n}\n\nconst frameRe = /^\\s*at\\s+([\\w$.]+)\\.([\\w$<>]+)\\(([^)]+)\\)/;\nconst headerRe = /^([\\w.$]+(?:Exception|Error|Throwable))(?::\\s*(.*))?$/;\nconst continuationRe = /^\\.\\.\\.\\s+\\d+\\s+more$/;\n\nconst runtimePrefixes = [\"java.\", \"javax.\", \"sun.\", \"jdk.\", \"com.sun.\", \"or\" + \"acle.jrockit.\"];\n\n// parseJavaStackTrace decodes a free-form Java exception dump (the body that\n// printStackTrace() emits, optionally wrapped by EclipseLink \"Internal\n// Exception:\" / \"Caused by:\" markers) into a renderable shape. It is the\n// React-side counterpart to Go's api.ParseJavaStackTrace.\nexport function parseJavaStackTrace(input: string): ParsedStackTrace {\n const out: ParsedStackTrace = {\n causedBy: [],\n frames: [],\n language: \"java\",\n };\n if (!input || !input.trim()) return out;\n\n const headerLines: string[] = [];\n for (const raw of input.split(\"\\n\")) {\n const trimmed = raw.trim();\n if (!trimmed) continue;\n if (continuationRe.test(trimmed)) continue;\n\n const frameMatch = frameRe.exec(raw);\n if (frameMatch && frameMatch[1] && frameMatch[2] && frameMatch[3] !== undefined) {\n out.frames.push(buildFrame(frameMatch[1], frameMatch[2], frameMatch[3]));\n continue;\n }\n\n if (trimmed.startsWith(\"Caused by:\")) {\n out.causedBy.push(trimmed.slice(\"Caused by:\".length).trim());\n continue;\n }\n if (trimmed.startsWith(\"Internal Exception:\")) {\n out.causedBy.push(trimmed.slice(\"Internal Exception:\".length).trim());\n continue;\n }\n\n if (!out.exceptionClass) {\n const headerMatch = headerRe.exec(trimmed);\n if (headerMatch && headerMatch[1]) {\n out.exceptionClass = headerMatch[1];\n if (headerMatch[2]) out.message = headerMatch[2];\n continue;\n }\n }\n\n headerLines.push(trimmed);\n }\n\n if (!out.message && headerLines.length > 0) {\n out.message = headerLines.join(\" \");\n }\n\n return out;\n}\n\nfunction buildFrame(cls: string, method: string, locRaw: string): ParsedStackFrame {\n const loc = locRaw.trim();\n let file: string | undefined;\n let line: number | undefined;\n let nativeMethod = false;\n if (loc === \"Native Method\") {\n nativeMethod = true;\n } else if (loc !== \"Unknown Source\") {\n const cleaned = (loc.split(\" ~[\")[0] ?? loc).trim();\n const i = cleaned.lastIndexOf(\":\");\n if (i >= 0) {\n file = cleaned.slice(0, i);\n const n = Number(cleaned.slice(i + 1));\n if (Number.isFinite(n)) line = n;\n } else {\n file = cleaned;\n }\n }\n const functionName = `${cls}.${method}`;\n const location = file\n ? line\n ? `${file}:${line}`\n : file\n : nativeMethod\n ? \"Native Method\"\n : undefined;\n const frame: ParsedStackFrame = {\n functionName,\n displayName: shortDisplay(cls, method),\n kind: \"frame\",\n runtime: runtimePrefixes.some((p) => cls.startsWith(p)),\n nativeMethod,\n class: cls,\n method,\n };\n if (file !== undefined) frame.file = file;\n if (line !== undefined) frame.line = line;\n if (location !== undefined) frame.location = location;\n return frame;\n}\n\nfunction shortDisplay(cls: string, method: string): string {\n const parts = cls.split(\".\");\n const last = parts[parts.length - 1] ?? cls;\n return `${last}.${method}`;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ParsedThread } from './jvm-stacktrace';
|
|
2
|
+
export type DumpFormat = "go" | "jvm" | "unknown";
|
|
3
|
+
export type ParsedStack = {
|
|
4
|
+
format: "go";
|
|
5
|
+
goroutines: ParsedGoroutine[];
|
|
6
|
+
} | {
|
|
7
|
+
format: "jvm";
|
|
8
|
+
threads: ParsedThread[];
|
|
9
|
+
} | {
|
|
10
|
+
format: "unknown";
|
|
11
|
+
goroutines: [];
|
|
12
|
+
threads: [];
|
|
13
|
+
};
|
|
14
|
+
export declare function detectDumpFormat(text: string): DumpFormat;
|
|
15
|
+
export declare function parseStackDump(text: string): ParsedStack;
|
|
16
|
+
export declare function countStackByState(stack: ParsedStack): Map<string, number>;
|
|
17
|
+
export interface ParsedGoroutineFrame {
|
|
18
|
+
functionName: string;
|
|
19
|
+
displayName: string;
|
|
20
|
+
file?: string;
|
|
21
|
+
location?: string;
|
|
22
|
+
line?: number;
|
|
23
|
+
kind: "frame" | "created_by";
|
|
24
|
+
runtime: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface ParsedGoroutine {
|
|
27
|
+
id: number;
|
|
28
|
+
state: string;
|
|
29
|
+
rawState: string;
|
|
30
|
+
frames: ParsedGoroutineFrame[];
|
|
31
|
+
raw: string;
|
|
32
|
+
userFrameCount: number;
|
|
33
|
+
topFunction?: string;
|
|
34
|
+
searchText: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function parseGoroutineDump(text: string): ParsedGoroutine[];
|
|
37
|
+
export declare function countGoroutinesByState(goroutines: ParsedGoroutine[]): Map<string, number>;
|
|
38
|
+
//# sourceMappingURL=stacktrace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stacktrace.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/stacktrace.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE9F,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,KAAK,GAAG,SAAS,CAAC;AAElD,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,eAAe,EAAE,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,GAC1C;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,EAAE,CAAC;IAAC,OAAO,EAAE,EAAE,CAAA;CAAE,CAAC;AAEvD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAQzD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CASxD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAIzE;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAmElE;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMzF"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { countThreadsByState, parseJvmThreadDump } from "./jvm-stacktrace.js";
|
|
2
|
+
function detectDumpFormat(text) {
|
|
3
|
+
const trimmed = text.trim();
|
|
4
|
+
if (!trimmed) return "unknown";
|
|
5
|
+
if (/^"[^"]*"[^\n]*\b(prio=|tid=|nid=)/m.test(trimmed)) return "jvm";
|
|
6
|
+
if (/^goroutine\s+\d+\s+\[[^\]]+\]:/m.test(trimmed)) return "go";
|
|
7
|
+
return "unknown";
|
|
8
|
+
}
|
|
9
|
+
function parseStackDump(text) {
|
|
10
|
+
const format = detectDumpFormat(text);
|
|
11
|
+
if (format === "jvm") {
|
|
12
|
+
return { format: "jvm", threads: parseJvmThreadDump(text) };
|
|
13
|
+
}
|
|
14
|
+
if (format === "go") {
|
|
15
|
+
return { format: "go", goroutines: parseGoroutineDump(text) };
|
|
16
|
+
}
|
|
17
|
+
return { format: "unknown", goroutines: [], threads: [] };
|
|
18
|
+
}
|
|
19
|
+
function countStackByState(stack) {
|
|
20
|
+
if (stack.format === "jvm") return countThreadsByState(stack.threads);
|
|
21
|
+
if (stack.format === "go") return countGoroutinesByState(stack.goroutines);
|
|
22
|
+
return /* @__PURE__ */ new Map();
|
|
23
|
+
}
|
|
24
|
+
const headerRe = /^goroutine\s+(\d+)\s+\[(.+?)\]:$/;
|
|
25
|
+
const fileRe = /^\s*(.+?):(\d+)(?:\s+\+0x[0-9a-f]+)?$/i;
|
|
26
|
+
const goSrcPrefixRe = /^\/usr\/local\/go[\d.]+\/src\//;
|
|
27
|
+
const goWorkspacePrefixRe = /^.*?\/go\/src\//;
|
|
28
|
+
const goPkgModPrefixRe = /^.*?\/go\/pkg\/mod\//;
|
|
29
|
+
function parseGoroutineDump(text) {
|
|
30
|
+
var _a, _b;
|
|
31
|
+
const trimmed = text.trim();
|
|
32
|
+
if (!trimmed) return [];
|
|
33
|
+
const blocks = trimmed.split(/\n\s*\n+/);
|
|
34
|
+
const goroutines = [];
|
|
35
|
+
for (const block of blocks) {
|
|
36
|
+
const lines = block.split("\n").map((line) => line.replace(/\r$/, ""));
|
|
37
|
+
const header = (_a = lines[0]) == null ? void 0 : _a.trim();
|
|
38
|
+
const match = headerRe.exec(header || "");
|
|
39
|
+
if (!match) continue;
|
|
40
|
+
const id = Number(match[1] ?? 0);
|
|
41
|
+
const rawState = match[2] ?? "";
|
|
42
|
+
const state = normalizeState(rawState);
|
|
43
|
+
const frames = [];
|
|
44
|
+
for (let i = 1; i < lines.length; i++) {
|
|
45
|
+
const line = lines[i];
|
|
46
|
+
if (line == null) continue;
|
|
47
|
+
const trimmedLine = line.trim();
|
|
48
|
+
if (!trimmedLine) continue;
|
|
49
|
+
const fileMatch = fileRe.exec(trimmedLine);
|
|
50
|
+
const previousFrame = frames[frames.length - 1];
|
|
51
|
+
if (fileMatch && previousFrame && !previousFrame.file) {
|
|
52
|
+
previousFrame.file = fileMatch[1] ?? "";
|
|
53
|
+
previousFrame.line = Number(fileMatch[2] ?? 0);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const kind = trimmedLine.startsWith("created by ") ? "created_by" : "frame";
|
|
57
|
+
const functionName = kind === "created_by" ? trimmedLine.slice("created by ".length) : trimmedLine;
|
|
58
|
+
frames.push({
|
|
59
|
+
functionName,
|
|
60
|
+
displayName: sanitizeFunctionName(functionName),
|
|
61
|
+
kind,
|
|
62
|
+
runtime: isRuntimeFrame(functionName)
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
for (const frame of frames) {
|
|
66
|
+
if (frame.file) {
|
|
67
|
+
frame.file = normalizeFilePath(frame.file);
|
|
68
|
+
frame.location = `${frame.file}${frame.line ? `:${frame.line}` : ""}`;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const topFunction = (_b = frames.find((frame) => frame.kind === "frame")) == null ? void 0 : _b.functionName;
|
|
72
|
+
goroutines.push({
|
|
73
|
+
id,
|
|
74
|
+
state,
|
|
75
|
+
rawState,
|
|
76
|
+
frames,
|
|
77
|
+
raw: block,
|
|
78
|
+
userFrameCount: frames.filter((frame) => !frame.runtime && frame.kind === "frame").length,
|
|
79
|
+
searchText: `${header}
|
|
80
|
+
${frames.map((frame) => `${frame.functionName} ${frame.file || ""}`).join("\n")}`.toLowerCase(),
|
|
81
|
+
...topFunction !== void 0 ? { topFunction } : {}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return goroutines;
|
|
85
|
+
}
|
|
86
|
+
function countGoroutinesByState(goroutines) {
|
|
87
|
+
const counts = /* @__PURE__ */ new Map();
|
|
88
|
+
for (const goroutine of goroutines) {
|
|
89
|
+
counts.set(goroutine.state, (counts.get(goroutine.state) || 0) + 1);
|
|
90
|
+
}
|
|
91
|
+
return counts;
|
|
92
|
+
}
|
|
93
|
+
function normalizeState(value) {
|
|
94
|
+
return (value.split(",")[0] ?? "").trim().toLowerCase();
|
|
95
|
+
}
|
|
96
|
+
function isRuntimeFrame(functionName) {
|
|
97
|
+
return functionName.startsWith("runtime.") || functionName.startsWith("runtime/") || functionName.startsWith("internal/") || functionName.startsWith("runtime/internal/") || functionName.startsWith("syscall.") || functionName.startsWith("reflect.");
|
|
98
|
+
}
|
|
99
|
+
function sanitizeFunctionName(functionName) {
|
|
100
|
+
let name = functionName.trim();
|
|
101
|
+
const paren = name.indexOf("(");
|
|
102
|
+
if (paren !== -1) name = name.slice(0, paren);
|
|
103
|
+
name = name.replace(/\.\(\*([^)]+)\)\./g, ".$1.");
|
|
104
|
+
return stripPackageQualifier(name);
|
|
105
|
+
}
|
|
106
|
+
function stripPackageQualifier(name) {
|
|
107
|
+
return name.replace(/^((?:[^./\s]+\/)+)([^./\s]+)\./, "$2.");
|
|
108
|
+
}
|
|
109
|
+
function normalizeFilePath(path) {
|
|
110
|
+
return path.replace(goSrcPrefixRe, "").replace(goWorkspacePrefixRe, "").replace(goPkgModPrefixRe, "");
|
|
111
|
+
}
|
|
112
|
+
export {
|
|
113
|
+
countGoroutinesByState,
|
|
114
|
+
countStackByState,
|
|
115
|
+
detectDumpFormat,
|
|
116
|
+
parseGoroutineDump,
|
|
117
|
+
parseStackDump
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=stacktrace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stacktrace.js","sources":["../../../src/data/diagnostics/stacktrace.ts"],"sourcesContent":["import { parseJvmThreadDump, countThreadsByState, type ParsedThread } from \"./jvm-stacktrace\";\n\nexport type DumpFormat = \"go\" | \"jvm\" | \"unknown\";\n\nexport type ParsedStack =\n | { format: \"go\"; goroutines: ParsedGoroutine[] }\n | { format: \"jvm\"; threads: ParsedThread[] }\n | { format: \"unknown\"; goroutines: []; threads: [] };\n\nexport function detectDumpFormat(text: string): DumpFormat {\n const trimmed = text.trim();\n if (!trimmed) return \"unknown\";\n // JVM header: `\"name\" ... prio=` OR `\"name\" ... tid=`\n if (/^\"[^\"]*\"[^\\n]*\\b(prio=|tid=|nid=)/m.test(trimmed)) return \"jvm\";\n // Go header: `goroutine N [state]:`\n if (/^goroutine\\s+\\d+\\s+\\[[^\\]]+\\]:/m.test(trimmed)) return \"go\";\n return \"unknown\";\n}\n\nexport function parseStackDump(text: string): ParsedStack {\n const format = detectDumpFormat(text);\n if (format === \"jvm\") {\n return { format: \"jvm\", threads: parseJvmThreadDump(text) };\n }\n if (format === \"go\") {\n return { format: \"go\", goroutines: parseGoroutineDump(text) };\n }\n return { format: \"unknown\", goroutines: [], threads: [] };\n}\n\nexport function countStackByState(stack: ParsedStack): Map<string, number> {\n if (stack.format === \"jvm\") return countThreadsByState(stack.threads);\n if (stack.format === \"go\") return countGoroutinesByState(stack.goroutines);\n return new Map();\n}\n\nexport interface ParsedGoroutineFrame {\n functionName: string;\n displayName: string;\n file?: string;\n location?: string;\n line?: number;\n kind: \"frame\" | \"created_by\";\n runtime: boolean;\n}\n\nexport interface ParsedGoroutine {\n id: number;\n state: string;\n rawState: string;\n frames: ParsedGoroutineFrame[];\n raw: string;\n userFrameCount: number;\n topFunction?: string;\n searchText: string;\n}\n\nconst headerRe = /^goroutine\\s+(\\d+)\\s+\\[(.+?)\\]:$/;\nconst fileRe = /^\\s*(.+?):(\\d+)(?:\\s+\\+0x[0-9a-f]+)?$/i;\nconst goSrcPrefixRe = /^\\/usr\\/local\\/go[\\d.]+\\/src\\//;\nconst goWorkspacePrefixRe = /^.*?\\/go\\/src\\//;\nconst goPkgModPrefixRe = /^.*?\\/go\\/pkg\\/mod\\//;\n\nexport function parseGoroutineDump(text: string): ParsedGoroutine[] {\n const trimmed = text.trim();\n if (!trimmed) return [];\n\n const blocks = trimmed.split(/\\n\\s*\\n+/);\n const goroutines: ParsedGoroutine[] = [];\n\n for (const block of blocks) {\n const lines = block.split(\"\\n\").map((line) => line.replace(/\\r$/, \"\"));\n const header = lines[0]?.trim();\n const match = headerRe.exec(header || \"\");\n if (!match) continue;\n\n const id = Number(match[1] ?? 0);\n const rawState = match[2] ?? \"\";\n const state = normalizeState(rawState);\n const frames: ParsedGoroutineFrame[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n if (line == null) continue;\n const trimmedLine = line.trim();\n if (!trimmedLine) continue;\n\n const fileMatch = fileRe.exec(trimmedLine);\n const previousFrame = frames[frames.length - 1];\n if (fileMatch && previousFrame && !previousFrame.file) {\n previousFrame.file = fileMatch[1] ?? \"\";\n previousFrame.line = Number(fileMatch[2] ?? 0);\n continue;\n }\n\n const kind = trimmedLine.startsWith(\"created by \") ? \"created_by\" : \"frame\";\n const functionName =\n kind === \"created_by\" ? trimmedLine.slice(\"created by \".length) : trimmedLine;\n frames.push({\n functionName,\n displayName: sanitizeFunctionName(functionName),\n kind,\n runtime: isRuntimeFrame(functionName),\n });\n }\n\n for (const frame of frames) {\n if (frame.file) {\n frame.file = normalizeFilePath(frame.file);\n frame.location = `${frame.file}${frame.line ? `:${frame.line}` : \"\"}`;\n }\n }\n\n const topFunction = frames.find((frame) => frame.kind === \"frame\")?.functionName;\n\n goroutines.push({\n id,\n state,\n rawState,\n frames,\n raw: block,\n userFrameCount: frames.filter((frame) => !frame.runtime && frame.kind === \"frame\").length,\n searchText: `${header}\\n${frames\n .map((frame) => `${frame.functionName} ${frame.file || \"\"}`)\n .join(\"\\n\")}`.toLowerCase(),\n ...(topFunction !== undefined ? { topFunction } : {}),\n });\n }\n\n return goroutines;\n}\n\nexport function countGoroutinesByState(goroutines: ParsedGoroutine[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const goroutine of goroutines) {\n counts.set(goroutine.state, (counts.get(goroutine.state) || 0) + 1);\n }\n return counts;\n}\n\nfunction normalizeState(value: string): string {\n return (value.split(\",\")[0] ?? \"\").trim().toLowerCase();\n}\n\nfunction isRuntimeFrame(functionName: string): boolean {\n return (\n functionName.startsWith(\"runtime.\") ||\n functionName.startsWith(\"runtime/\") ||\n functionName.startsWith(\"internal/\") ||\n functionName.startsWith(\"runtime/internal/\") ||\n functionName.startsWith(\"syscall.\") ||\n functionName.startsWith(\"reflect.\")\n );\n}\n\nfunction sanitizeFunctionName(functionName: string): string {\n let name = functionName.trim();\n const paren = name.indexOf(\"(\");\n if (paren !== -1) name = name.slice(0, paren);\n name = name.replace(/\\.\\(\\*([^)]+)\\)\\./g, \".$1.\");\n return stripPackageQualifier(name);\n}\n\nfunction stripPackageQualifier(name: string): string {\n return name.replace(/^((?:[^./\\s]+\\/)+)([^./\\s]+)\\./, \"$2.\");\n}\n\nfunction normalizeFilePath(path: string): string {\n return path\n .replace(goSrcPrefixRe, \"\")\n .replace(goWorkspacePrefixRe, \"\")\n .replace(goPkgModPrefixRe, \"\");\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface ProcessNode {
|
|
2
|
+
pid: number;
|
|
3
|
+
ppid?: number;
|
|
4
|
+
name?: string;
|
|
5
|
+
command?: string;
|
|
6
|
+
status?: string;
|
|
7
|
+
cpu_percent?: number;
|
|
8
|
+
rss?: number;
|
|
9
|
+
vms?: number;
|
|
10
|
+
open_files?: number;
|
|
11
|
+
is_root?: boolean;
|
|
12
|
+
children?: ProcessNode[];
|
|
13
|
+
stack_capture?: StackCapture;
|
|
14
|
+
}
|
|
15
|
+
export interface StackCapture {
|
|
16
|
+
status: "ready" | "unsupported" | "error";
|
|
17
|
+
supported?: boolean;
|
|
18
|
+
text?: string;
|
|
19
|
+
error?: string;
|
|
20
|
+
collected_at?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface RunMeta {
|
|
23
|
+
version?: string;
|
|
24
|
+
sequence: number;
|
|
25
|
+
kind?: "initial" | "rerun" | string;
|
|
26
|
+
started?: string;
|
|
27
|
+
ended?: string;
|
|
28
|
+
args?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,GAAG,aAAa,GAAG,OAAO,CAAC;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ProcessNode } from './types';
|
|
2
|
+
export declare function countProcesses(node?: ProcessNode): number;
|
|
3
|
+
export declare function findProcessByPID(node: ProcessNode | undefined, pid: number): ProcessNode | null;
|
|
4
|
+
export declare function processStateIcon(status?: string): string;
|
|
5
|
+
export declare function processStateColor(status?: string): string;
|
|
6
|
+
export declare function formatBytes(value?: number): string;
|
|
7
|
+
export declare function processLabel(node: ProcessNode): string;
|
|
8
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,CAGzD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQ/F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAOtD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
function countProcesses(node) {
|
|
2
|
+
if (!node) return 0;
|
|
3
|
+
return 1 + (node.children || []).reduce((sum, child) => sum + countProcesses(child), 0);
|
|
4
|
+
}
|
|
5
|
+
function findProcessByPID(node, pid) {
|
|
6
|
+
if (!node) return null;
|
|
7
|
+
if (node.pid === pid) return node;
|
|
8
|
+
for (const child of node.children || []) {
|
|
9
|
+
const found = findProcessByPID(child, pid);
|
|
10
|
+
if (found) return found;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
function processStateIcon(status) {
|
|
15
|
+
const value = (status || "").toLowerCase();
|
|
16
|
+
if (value.includes("run")) return "codicon:play-circle";
|
|
17
|
+
if (value.includes("sleep") || value.includes("idle")) return "codicon:clock";
|
|
18
|
+
if (value.includes("stop") || value.includes("halt")) return "codicon:debug-pause";
|
|
19
|
+
if (value.includes("zombie") || value.includes("dead")) return "codicon:error";
|
|
20
|
+
if (value.includes("wait") || value.includes("block")) return "codicon:debug-step-over";
|
|
21
|
+
return "codicon:circle-filled";
|
|
22
|
+
}
|
|
23
|
+
function processStateColor(status) {
|
|
24
|
+
const value = (status || "").toLowerCase();
|
|
25
|
+
if (value.includes("run")) return "text-green-600";
|
|
26
|
+
if (value.includes("sleep") || value.includes("idle")) return "text-amber-500";
|
|
27
|
+
if (value.includes("stop") || value.includes("halt")) return "text-orange-600";
|
|
28
|
+
if (value.includes("zombie") || value.includes("dead")) return "text-red-600";
|
|
29
|
+
if (value.includes("wait") || value.includes("block")) return "text-blue-600";
|
|
30
|
+
return "text-muted-foreground";
|
|
31
|
+
}
|
|
32
|
+
function formatBytes(value) {
|
|
33
|
+
if (!value || value <= 0) return "0 B";
|
|
34
|
+
const units = ["B", "KB", "MB", "GB", "TB"];
|
|
35
|
+
let size = value;
|
|
36
|
+
let unit = 0;
|
|
37
|
+
while (size >= 1024 && unit < units.length - 1) {
|
|
38
|
+
size /= 1024;
|
|
39
|
+
unit++;
|
|
40
|
+
}
|
|
41
|
+
return `${size >= 10 || unit === 0 ? size.toFixed(0) : size.toFixed(1)} ${units[unit]}`;
|
|
42
|
+
}
|
|
43
|
+
function processLabel(node) {
|
|
44
|
+
if (node.name) return node.name;
|
|
45
|
+
if (node.command) {
|
|
46
|
+
const [first] = node.command.split(/\s+/, 1);
|
|
47
|
+
return first || `pid ${node.pid}`;
|
|
48
|
+
}
|
|
49
|
+
return `pid ${node.pid}`;
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
countProcesses,
|
|
53
|
+
findProcessByPID,
|
|
54
|
+
formatBytes,
|
|
55
|
+
processLabel,
|
|
56
|
+
processStateColor,
|
|
57
|
+
processStateIcon
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/data/diagnostics/utils.ts"],"sourcesContent":["import type { ProcessNode } from \"./types\";\n\nexport function countProcesses(node?: ProcessNode): number {\n if (!node) return 0;\n return 1 + (node.children || []).reduce((sum, child) => sum + countProcesses(child), 0);\n}\n\nexport function findProcessByPID(node: ProcessNode | undefined, pid: number): ProcessNode | null {\n if (!node) return null;\n if (node.pid === pid) return node;\n for (const child of node.children || []) {\n const found = findProcessByPID(child, pid);\n if (found) return found;\n }\n return null;\n}\n\nexport function processStateIcon(status?: string): string {\n const value = (status || \"\").toLowerCase();\n if (value.includes(\"run\")) return \"codicon:play-circle\";\n if (value.includes(\"sleep\") || value.includes(\"idle\")) return \"codicon:clock\";\n if (value.includes(\"stop\") || value.includes(\"halt\")) return \"codicon:debug-pause\";\n if (value.includes(\"zombie\") || value.includes(\"dead\")) return \"codicon:error\";\n if (value.includes(\"wait\") || value.includes(\"block\")) return \"codicon:debug-step-over\";\n return \"codicon:circle-filled\";\n}\n\nexport function processStateColor(status?: string): string {\n const value = (status || \"\").toLowerCase();\n if (value.includes(\"run\")) return \"text-green-600\";\n if (value.includes(\"sleep\") || value.includes(\"idle\")) return \"text-amber-500\";\n if (value.includes(\"stop\") || value.includes(\"halt\")) return \"text-orange-600\";\n if (value.includes(\"zombie\") || value.includes(\"dead\")) return \"text-red-600\";\n if (value.includes(\"wait\") || value.includes(\"block\")) return \"text-blue-600\";\n return \"text-muted-foreground\";\n}\n\nexport function formatBytes(value?: number): string {\n if (!value || value <= 0) return \"0 B\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let size = value;\n let unit = 0;\n while (size >= 1024 && unit < units.length - 1) {\n size /= 1024;\n unit++;\n }\n return `${size >= 10 || unit === 0 ? size.toFixed(0) : size.toFixed(1)} ${units[unit]}`;\n}\n\nexport function processLabel(node: ProcessNode): string {\n if (node.name) return node.name;\n if (node.command) {\n const [first] = node.command.split(/\\s+/, 1);\n return first || `pid ${node.pid}`;\n }\n return `pid ${node.pid}`;\n}\n"],"names":[],"mappings":"AAEO,SAAS,eAAe,MAA4B;AACzD,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,KAAK,YAAY,CAAA,GAAI,OAAO,CAAC,KAAK,UAAU,MAAM,eAAe,KAAK,GAAG,CAAC;AACxF;AAEO,SAAS,iBAAiB,MAA+B,KAAiC;AAC/F,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,QAAQ,IAAK,QAAO;AAC7B,aAAW,SAAS,KAAK,YAAY,CAAA,GAAI;AACvC,UAAM,QAAQ,iBAAiB,OAAO,GAAG;AACzC,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,QAAyB;AACxD,QAAM,SAAS,UAAU,IAAI,YAAA;AAC7B,MAAI,MAAM,SAAS,KAAK,EAAG,QAAO;AAClC,MAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC9D,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC7D,MAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC/D,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,EAAG,QAAO;AAC9D,SAAO;AACT;AAEO,SAAS,kBAAkB,QAAyB;AACzD,QAAM,SAAS,UAAU,IAAI,YAAA;AAC7B,MAAI,MAAM,SAAS,KAAK,EAAG,QAAO;AAClC,MAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC9D,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC7D,MAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC/D,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,EAAG,QAAO;AAC9D,SAAO;AACT;AAEO,SAAS,YAAY,OAAwB;AAClD,MAAI,CAAC,SAAS,SAAS,EAAG,QAAO;AACjC,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,IAAI;AAC1C,MAAI,OAAO;AACX,MAAI,OAAO;AACX,SAAO,QAAQ,QAAQ,OAAO,MAAM,SAAS,GAAG;AAC9C,YAAQ;AACR;AAAA,EACF;AACA,SAAO,GAAG,QAAQ,MAAM,SAAS,IAAI,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC;AACvF;AAEO,SAAS,aAAa,MAA2B;AACtD,MAAI,KAAK,KAAM,QAAO,KAAK;AAC3B,MAAI,KAAK,SAAS;AAChB,UAAM,CAAC,KAAK,IAAI,KAAK,QAAQ,MAAM,OAAO,CAAC;AAC3C,WAAO,SAAS,OAAO,KAAK,GAAG;AAAA,EACjC;AACA,SAAO,OAAO,KAAK,GAAG;AACxB;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { HAREntry } from './types';
|
|
2
|
+
export type HarPanelProps = {
|
|
3
|
+
entries: HAREntry[];
|
|
4
|
+
search?: string;
|
|
5
|
+
emptyLabel?: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function HarPanel({ entries, search, emptyLabel, className, }: HarPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=HarPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HarPanel.d.ts","sourceRoot":"","sources":["../../../src/data/har/HarPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA8CF,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,MAAM,EACN,UAAuC,EACvC,SAAS,GACV,EAAE,aAAa,2CA6Bf"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { DataTable } from "../DataTable.js";
|
|
4
|
+
import { JsonView } from "../JsonView.js";
|
|
5
|
+
const COLS = [
|
|
6
|
+
{
|
|
7
|
+
key: "request.method",
|
|
8
|
+
label: "Method",
|
|
9
|
+
shrink: true
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
key: "request.url",
|
|
13
|
+
label: "URL",
|
|
14
|
+
grow: true,
|
|
15
|
+
render: (value) => /* @__PURE__ */ jsx("span", { title: String(value ?? ""), children: String(value ?? "") })
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
key: "response.status",
|
|
19
|
+
label: "Status",
|
|
20
|
+
shrink: true,
|
|
21
|
+
render: (value) => /* @__PURE__ */ jsx("span", { className: statusColor(Number(value ?? 0)), children: String(value ?? "") }),
|
|
22
|
+
sortValue: (value) => Number(value ?? 0)
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
key: "time",
|
|
26
|
+
label: "Time",
|
|
27
|
+
align: "right",
|
|
28
|
+
shrink: true,
|
|
29
|
+
render: (value) => `${Number(value ?? 0).toFixed(0)}ms`,
|
|
30
|
+
sortValue: (value) => Number(value ?? 0)
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
key: "response.bodySize",
|
|
34
|
+
label: "Size",
|
|
35
|
+
align: "right",
|
|
36
|
+
shrink: true,
|
|
37
|
+
render: (value) => formatBytes(Number(value ?? 0)),
|
|
38
|
+
sortValue: (value) => Number(value ?? 0)
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
key: "response.content.mimeType",
|
|
42
|
+
label: "Type",
|
|
43
|
+
shrink: true
|
|
44
|
+
}
|
|
45
|
+
];
|
|
46
|
+
function HarPanel({
|
|
47
|
+
entries,
|
|
48
|
+
search,
|
|
49
|
+
emptyLabel = "No HTTP traffic captured",
|
|
50
|
+
className
|
|
51
|
+
}) {
|
|
52
|
+
const filteredEntries = useMemo(() => {
|
|
53
|
+
if (search === void 0 || search.trim() === "") return entries;
|
|
54
|
+
return entries.filter((entry) => matchesSearch(search.trim().toLowerCase(), entry));
|
|
55
|
+
}, [entries, search]);
|
|
56
|
+
if (!entries || entries.length === 0) {
|
|
57
|
+
return /* @__PURE__ */ jsx("div", { className: "p-density-6 text-center text-muted-foreground text-sm", children: emptyLabel });
|
|
58
|
+
}
|
|
59
|
+
return /* @__PURE__ */ jsx("div", { className: `h-full ${className ?? ""}`, children: /* @__PURE__ */ jsx(
|
|
60
|
+
DataTable,
|
|
61
|
+
{
|
|
62
|
+
data: filteredEntries,
|
|
63
|
+
columns: COLS,
|
|
64
|
+
autoFilter: true,
|
|
65
|
+
showGlobalFilter: search === void 0,
|
|
66
|
+
globalFilterPlaceholder: "Filter URL, method, or body…",
|
|
67
|
+
defaultSort: { key: "time", dir: "asc" },
|
|
68
|
+
emptyMessage: emptyLabel,
|
|
69
|
+
getRowId: (entry, index) => `${entry.startedDateTime ?? index}-${entry.request.method}-${entry.request.url}-${entry.time}`,
|
|
70
|
+
renderExpandedRow: (entry) => /* @__PURE__ */ jsx(HarRowDetails, { entry })
|
|
71
|
+
}
|
|
72
|
+
) });
|
|
73
|
+
}
|
|
74
|
+
function HarRowDetails({ entry }) {
|
|
75
|
+
var _a, _b;
|
|
76
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
77
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-density-4", children: [
|
|
78
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
HeaderList,
|
|
81
|
+
{
|
|
82
|
+
title: "Request Headers",
|
|
83
|
+
...entry.request.headers ? { headers: entry.request.headers } : {}
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
((_a = entry.request.postData) == null ? void 0 : _a.text) && /* @__PURE__ */ jsxs("div", { className: "mt-density-2", children: [
|
|
87
|
+
/* @__PURE__ */ jsx("div", { className: "font-semibold text-foreground mb-1", children: "Request Body" }),
|
|
88
|
+
/* @__PURE__ */ jsx("div", { className: "bg-background p-density-2 rounded border border-border overflow-auto max-h-48", children: /* @__PURE__ */ jsx(
|
|
89
|
+
BodyView,
|
|
90
|
+
{
|
|
91
|
+
text: entry.request.postData.text,
|
|
92
|
+
...entry.request.postData.mimeType ? { mimeType: entry.request.postData.mimeType } : {}
|
|
93
|
+
}
|
|
94
|
+
) })
|
|
95
|
+
] })
|
|
96
|
+
] }),
|
|
97
|
+
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
|
|
98
|
+
HeaderList,
|
|
99
|
+
{
|
|
100
|
+
title: "Response Headers",
|
|
101
|
+
...entry.response.headers ? { headers: entry.response.headers } : {}
|
|
102
|
+
}
|
|
103
|
+
) })
|
|
104
|
+
] }),
|
|
105
|
+
((_b = entry.response.content) == null ? void 0 : _b.text) && /* @__PURE__ */ jsxs("div", { className: "mt-density-3", children: [
|
|
106
|
+
/* @__PURE__ */ jsx("div", { className: "font-semibold text-foreground mb-1", children: "Response Body" }),
|
|
107
|
+
/* @__PURE__ */ jsx("div", { className: "bg-background p-density-2 rounded border border-border overflow-auto max-h-64", children: /* @__PURE__ */ jsx(
|
|
108
|
+
BodyView,
|
|
109
|
+
{
|
|
110
|
+
text: entry.response.content.text,
|
|
111
|
+
...entry.response.content.mimeType ? { mimeType: entry.response.content.mimeType } : {}
|
|
112
|
+
}
|
|
113
|
+
) })
|
|
114
|
+
] })
|
|
115
|
+
] });
|
|
116
|
+
}
|
|
117
|
+
function HeaderList({
|
|
118
|
+
title,
|
|
119
|
+
headers
|
|
120
|
+
}) {
|
|
121
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
122
|
+
/* @__PURE__ */ jsx("div", { className: "font-semibold text-foreground mb-1", children: title }),
|
|
123
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: headers == null ? void 0 : headers.map((h, i) => /* @__PURE__ */ jsxs("div", { className: "whitespace-nowrap", children: [
|
|
124
|
+
/* @__PURE__ */ jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
|
|
125
|
+
h.name,
|
|
126
|
+
":"
|
|
127
|
+
] }),
|
|
128
|
+
" ",
|
|
129
|
+
h.value
|
|
130
|
+
] }, i)) })
|
|
131
|
+
] });
|
|
132
|
+
}
|
|
133
|
+
function BodyView({ text, mimeType }) {
|
|
134
|
+
if (isJsonType(mimeType)) {
|
|
135
|
+
const parsed = tryParseJson(text);
|
|
136
|
+
if (parsed !== null) return /* @__PURE__ */ jsx(JsonView, { data: parsed });
|
|
137
|
+
}
|
|
138
|
+
return /* @__PURE__ */ jsx("pre", { className: "whitespace-pre-wrap break-all", children: text });
|
|
139
|
+
}
|
|
140
|
+
function tryParseJson(text) {
|
|
141
|
+
try {
|
|
142
|
+
return JSON.parse(text);
|
|
143
|
+
} catch {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function isJsonType(mime) {
|
|
148
|
+
return !!mime && (mime.includes("json") || mime.includes("javascript"));
|
|
149
|
+
}
|
|
150
|
+
function matchesSearch(needle, entry) {
|
|
151
|
+
var _a, _b;
|
|
152
|
+
return [
|
|
153
|
+
entry.request.method,
|
|
154
|
+
entry.request.url,
|
|
155
|
+
(_a = entry.request.postData) == null ? void 0 : _a.text,
|
|
156
|
+
(_b = entry.response.content) == null ? void 0 : _b.text
|
|
157
|
+
].some((value) => !!value && value.toLowerCase().includes(needle));
|
|
158
|
+
}
|
|
159
|
+
function formatBytes(bytes) {
|
|
160
|
+
if (bytes < 0) return "";
|
|
161
|
+
if (bytes < 1024) return `${bytes}B`;
|
|
162
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;
|
|
163
|
+
return `${(bytes / 1024 / 1024).toFixed(1)}MB`;
|
|
164
|
+
}
|
|
165
|
+
function statusColor(status) {
|
|
166
|
+
if (status >= 500) return "text-red-600";
|
|
167
|
+
if (status >= 400) return "text-amber-600";
|
|
168
|
+
if (status >= 300) return "text-blue-600";
|
|
169
|
+
if (status >= 200) return "text-green-600";
|
|
170
|
+
return "text-muted-foreground";
|
|
171
|
+
}
|
|
172
|
+
export {
|
|
173
|
+
HarPanel
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=HarPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HarPanel.js","sources":["../../../src/data/har/HarPanel.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { DataTable, type DataTableColumn } from \"../DataTable\";\nimport { JsonView } from \"../JsonView\";\nimport type { HAREntry } from \"./types\";\n\nexport type HarPanelProps = {\n entries: HAREntry[];\n search?: string;\n emptyLabel?: string;\n className?: string;\n};\n\nconst COLS: DataTableColumn<HAREntry>[] = [\n {\n key: \"request.method\",\n label: \"Method\",\n shrink: true,\n },\n {\n key: \"request.url\",\n label: \"URL\",\n grow: true,\n render: (value) => <span title={String(value ?? \"\")}>{String(value ?? \"\")}</span>,\n },\n {\n key: \"response.status\",\n label: \"Status\",\n shrink: true,\n render: (value) => (\n <span className={statusColor(Number(value ?? 0))}>{String(value ?? \"\")}</span>\n ),\n sortValue: (value) => Number(value ?? 0),\n },\n {\n key: \"time\",\n label: \"Time\",\n align: \"right\",\n shrink: true,\n render: (value) => `${Number(value ?? 0).toFixed(0)}ms`,\n sortValue: (value) => Number(value ?? 0),\n },\n {\n key: \"response.bodySize\",\n label: \"Size\",\n align: \"right\",\n shrink: true,\n render: (value) => formatBytes(Number(value ?? 0)),\n sortValue: (value) => Number(value ?? 0),\n },\n {\n key: \"response.content.mimeType\",\n label: \"Type\",\n shrink: true,\n },\n];\n\nexport function HarPanel({\n entries,\n search,\n emptyLabel = \"No HTTP traffic captured\",\n className,\n}: HarPanelProps) {\n const filteredEntries = useMemo(() => {\n if (search === undefined || search.trim() === \"\") return entries;\n return entries.filter((entry) => matchesSearch(search.trim().toLowerCase(), entry));\n }, [entries, search]);\n\n if (!entries || entries.length === 0) {\n return (\n <div className=\"p-density-6 text-center text-muted-foreground text-sm\">{emptyLabel}</div>\n );\n }\n\n return (\n <div className={`h-full ${className ?? \"\"}`}>\n <DataTable\n data={filteredEntries}\n columns={COLS}\n autoFilter\n showGlobalFilter={search === undefined}\n globalFilterPlaceholder=\"Filter URL, method, or body…\"\n defaultSort={{ key: \"time\", dir: \"asc\" }}\n emptyMessage={emptyLabel}\n getRowId={(entry, index) =>\n `${entry.startedDateTime ?? index}-${entry.request.method}-${entry.request.url}-${entry.time}`\n }\n renderExpandedRow={(entry) => <HarRowDetails entry={entry} />}\n />\n </div>\n );\n}\n\nfunction HarRowDetails({ entry }: { entry: HAREntry }) {\n return (\n <>\n <div className=\"grid grid-cols-2 gap-density-4\">\n <div>\n <HeaderList\n title=\"Request Headers\"\n {...(entry.request.headers ? { headers: entry.request.headers } : {})}\n />\n {entry.request.postData?.text && (\n <div className=\"mt-density-2\">\n <div className=\"font-semibold text-foreground mb-1\">Request Body</div>\n <div className=\"bg-background p-density-2 rounded border border-border overflow-auto max-h-48\">\n <BodyView\n text={entry.request.postData.text}\n {...(entry.request.postData.mimeType\n ? { mimeType: entry.request.postData.mimeType }\n : {})}\n />\n </div>\n </div>\n )}\n </div>\n <div>\n <HeaderList\n title=\"Response Headers\"\n {...(entry.response.headers ? { headers: entry.response.headers } : {})}\n />\n </div>\n </div>\n {entry.response.content?.text && (\n <div className=\"mt-density-3\">\n <div className=\"font-semibold text-foreground mb-1\">Response Body</div>\n <div className=\"bg-background p-density-2 rounded border border-border overflow-auto max-h-64\">\n <BodyView\n text={entry.response.content.text}\n {...(entry.response.content.mimeType\n ? { mimeType: entry.response.content.mimeType }\n : {})}\n />\n </div>\n </div>\n )}\n </>\n );\n}\n\nfunction HeaderList({\n title,\n headers,\n}: {\n title: string;\n headers?: { name: string; value: string }[];\n}) {\n return (\n <>\n <div className=\"font-semibold text-foreground mb-1\">{title}</div>\n <div className=\"space-y-0.5\">\n {headers?.map((h, i) => (\n <div key={i} className=\"whitespace-nowrap\">\n <span className=\"text-purple-600 dark:text-purple-400\">{h.name}:</span> {h.value}\n </div>\n ))}\n </div>\n </>\n );\n}\n\nfunction BodyView({ text, mimeType }: { text: string; mimeType?: string }) {\n if (isJsonType(mimeType)) {\n const parsed = tryParseJson(text);\n if (parsed !== null) return <JsonView data={parsed} />;\n }\n return <pre className=\"whitespace-pre-wrap break-all\">{text}</pre>;\n}\n\nfunction tryParseJson(text: string): unknown | null {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n\nfunction isJsonType(mime?: string): boolean {\n return !!mime && (mime.includes(\"json\") || mime.includes(\"javascript\"));\n}\n\nfunction matchesSearch(needle: string, entry: HAREntry): boolean {\n return [\n entry.request.method,\n entry.request.url,\n entry.request.postData?.text,\n entry.response.content?.text,\n ].some((value) => !!value && value.toLowerCase().includes(needle));\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 0) return \"\";\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)}MB`;\n}\n\nfunction statusColor(status: number): string {\n if (status >= 500) return \"text-red-600\";\n if (status >= 400) return \"text-amber-600\";\n if (status >= 300) return \"text-blue-600\";\n if (status >= 200) return \"text-green-600\";\n return \"text-muted-foreground\";\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../../src/data/har/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,eAAO,MAAM,gBAAgB,EAAE,QAAQ,EA+EtC,CAAC"}
|