@flanksource/clicky-ui 0.3.55 → 0.3.56
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/NOTICE.md +6 -0
- package/dist/ai.cjs +6 -0
- package/dist/ai.js +3 -1
- package/dist/chat.cjs +2 -0
- package/dist/chat.d.ts +1 -0
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +2 -1
- package/dist/comments/CommentCard.cjs +37 -7
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts +11 -1
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +37 -7
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentCardParts.cjs +9 -4
- package/dist/comments/CommentCardParts.cjs.map +1 -1
- package/dist/comments/CommentCardParts.d.ts.map +1 -1
- package/dist/comments/CommentCardParts.js +9 -4
- package/dist/comments/CommentCardParts.js.map +1 -1
- package/dist/comments/CommentComposer.cjs +8 -8
- package/dist/comments/CommentComposer.cjs.map +1 -1
- package/dist/comments/CommentComposer.d.ts.map +1 -1
- package/dist/comments/CommentComposer.js +8 -8
- package/dist/comments/CommentComposer.js.map +1 -1
- package/dist/comments/CommentProvider.cjs +5 -1
- package/dist/comments/CommentProvider.cjs.map +1 -1
- package/dist/comments/CommentProvider.d.ts +1 -1
- package/dist/comments/CommentProvider.d.ts.map +1 -1
- package/dist/comments/CommentProvider.js +5 -1
- package/dist/comments/CommentProvider.js.map +1 -1
- package/dist/comments/CommentSidePanel.cjs +17 -11
- package/dist/comments/CommentSidePanel.cjs.map +1 -1
- package/dist/comments/CommentSidePanel.d.ts +6 -0
- package/dist/comments/CommentSidePanel.d.ts.map +1 -1
- package/dist/comments/CommentSidePanel.js +17 -11
- package/dist/comments/CommentSidePanel.js.map +1 -1
- package/dist/comments/CommentThread.cjs +4 -1
- package/dist/comments/CommentThread.cjs.map +1 -1
- package/dist/comments/CommentThread.d.ts +4 -1
- package/dist/comments/CommentThread.d.ts.map +1 -1
- package/dist/comments/CommentThread.js +4 -1
- package/dist/comments/CommentThread.js.map +1 -1
- package/dist/comments/CommentThreadList.cjs +6 -3
- package/dist/comments/CommentThreadList.cjs.map +1 -1
- package/dist/comments/CommentThreadList.d.ts +7 -2
- package/dist/comments/CommentThreadList.d.ts.map +1 -1
- package/dist/comments/CommentThreadList.js +6 -3
- package/dist/comments/CommentThreadList.js.map +1 -1
- package/dist/comments/MentionTextarea.cjs +1 -1
- package/dist/comments/MentionTextarea.cjs.map +1 -1
- package/dist/comments/MentionTextarea.d.ts.map +1 -1
- package/dist/comments/MentionTextarea.js +1 -1
- package/dist/comments/MentionTextarea.js.map +1 -1
- package/dist/comments/comment-assign.cjs +68 -0
- package/dist/comments/comment-assign.cjs.map +1 -0
- package/dist/comments/comment-assign.d.ts +31 -0
- package/dist/comments/comment-assign.d.ts.map +1 -0
- package/dist/comments/comment-assign.js +67 -0
- package/dist/comments/comment-assign.js.map +1 -0
- package/dist/comments/comment-types.cjs.map +1 -1
- package/dist/comments/comment-types.d.ts +39 -0
- package/dist/comments/comment-types.d.ts.map +1 -1
- package/dist/comments/comment-types.js.map +1 -1
- package/dist/comments/comment-utils.cjs +2 -0
- package/dist/comments/comment-utils.cjs.map +1 -1
- package/dist/comments/comment-utils.d.ts +2 -0
- package/dist/comments/comment-utils.d.ts.map +1 -1
- package/dist/comments/comment-utils.js +2 -0
- package/dist/comments/comment-utils.js.map +1 -1
- package/dist/comments.cjs +3 -0
- package/dist/comments.d.ts +1 -0
- package/dist/comments.d.ts.map +1 -1
- package/dist/comments.js +2 -1
- package/dist/components/ComboboxMenu.cjs +23 -13
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +23 -13
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/FilterBar.cjs +29 -6
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +3 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +29 -6
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/ItemActions.cjs +1 -1
- package/dist/components/ItemActions.cjs.map +1 -1
- package/dist/components/ItemActions.js +1 -1
- package/dist/components/ItemActions.js.map +1 -1
- package/dist/components/ListMenu.cjs +33 -3
- package/dist/components/ListMenu.cjs.map +1 -1
- package/dist/components/ListMenu.d.ts +4 -1
- package/dist/components/ListMenu.d.ts.map +1 -1
- package/dist/components/ListMenu.js +33 -3
- package/dist/components/ListMenu.js.map +1 -1
- package/dist/components/ListMenuItems.cjs +80 -0
- package/dist/components/ListMenuItems.cjs.map +1 -0
- package/dist/components/ListMenuItems.d.ts +8 -0
- package/dist/components/ListMenuItems.d.ts.map +1 -0
- package/dist/components/ListMenuItems.js +80 -0
- package/dist/components/ListMenuItems.js.map +1 -0
- package/dist/components/LocalPathPicker.cjs +182 -0
- package/dist/components/LocalPathPicker.cjs.map +1 -0
- package/dist/components/LocalPathPicker.d.ts +11 -0
- package/dist/components/LocalPathPicker.d.ts.map +1 -0
- package/dist/components/LocalPathPicker.js +182 -0
- package/dist/components/LocalPathPicker.js.map +1 -0
- package/dist/components/LocalPathTree.cjs +89 -0
- package/dist/components/LocalPathTree.cjs.map +1 -0
- package/dist/components/LocalPathTree.d.ts +9 -0
- package/dist/components/LocalPathTree.d.ts.map +1 -0
- package/dist/components/LocalPathTree.js +89 -0
- package/dist/components/LocalPathTree.js.map +1 -0
- package/dist/components/RangeSlider.cjs +10 -30
- package/dist/components/RangeSlider.cjs.map +1 -1
- package/dist/components/RangeSlider.d.ts.map +1 -1
- package/dist/components/RangeSlider.js +4 -24
- package/dist/components/RangeSlider.js.map +1 -1
- package/dist/components/Slider.cjs +79 -0
- package/dist/components/Slider.cjs.map +1 -0
- package/dist/components/Slider.d.ts +23 -0
- package/dist/components/Slider.d.ts.map +1 -0
- package/dist/components/Slider.js +79 -0
- package/dist/components/Slider.js.map +1 -0
- package/dist/components/combobox-types.d.ts +4 -1
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/filter-bar-field-utils.cjs +3 -5
- package/dist/components/filter-bar-field-utils.cjs.map +1 -1
- package/dist/components/filter-bar-field-utils.d.ts.map +1 -1
- package/dist/components/filter-bar-field-utils.js +3 -5
- package/dist/components/filter-bar-field-utils.js.map +1 -1
- package/dist/components/filter-bar-tree-model.cjs +22 -0
- package/dist/components/filter-bar-tree-model.cjs.map +1 -0
- package/dist/components/filter-bar-tree-model.d.ts +33 -0
- package/dist/components/filter-bar-tree-model.d.ts.map +1 -0
- package/dist/components/filter-bar-tree-model.js +21 -0
- package/dist/components/filter-bar-tree-model.js.map +1 -0
- package/dist/components/filter-bar-tree.cjs +84 -0
- package/dist/components/filter-bar-tree.cjs.map +1 -0
- package/dist/components/filter-bar-tree.d.ts +7 -0
- package/dist/components/filter-bar-tree.d.ts.map +1 -0
- package/dist/components/filter-bar-tree.js +84 -0
- package/dist/components/filter-bar-tree.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs +2 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -1
- package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -1
- package/dist/components/json-schema-form-debug-glyph-map.js +2 -0
- package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -1
- package/dist/components/json-schema-form-help-links.cjs +18 -0
- package/dist/components/json-schema-form-help-links.cjs.map +1 -0
- package/dist/components/json-schema-form-help-links.d.ts +5 -0
- package/dist/components/json-schema-form-help-links.d.ts.map +1 -0
- package/dist/components/json-schema-form-help-links.js +18 -0
- package/dist/components/json-schema-form-help-links.js.map +1 -0
- package/dist/components/json-schema-form-help-model.cjs +7 -0
- package/dist/components/json-schema-form-help-model.cjs.map +1 -0
- package/dist/components/json-schema-form-help-model.d.ts +3 -0
- package/dist/components/json-schema-form-help-model.d.ts.map +1 -0
- package/dist/components/json-schema-form-help-model.js +7 -0
- package/dist/components/json-schema-form-help-model.js.map +1 -0
- package/dist/components/json-schema-form-json.cjs +48 -0
- package/dist/components/json-schema-form-json.cjs.map +1 -0
- package/dist/components/json-schema-form-json.d.ts +7 -0
- package/dist/components/json-schema-form-json.d.ts.map +1 -0
- package/dist/components/json-schema-form-json.js +48 -0
- package/dist/components/json-schema-form-json.js.map +1 -0
- package/dist/components/json-schema-form-layout.cjs +7 -5
- package/dist/components/json-schema-form-layout.cjs.map +1 -1
- package/dist/components/json-schema-form-layout.d.ts +2 -2
- package/dist/components/json-schema-form-layout.d.ts.map +1 -1
- package/dist/components/json-schema-form-layout.js +7 -5
- package/dist/components/json-schema-form-layout.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +2 -13
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +2 -13
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-refs.cjs +1 -1
- package/dist/components/json-schema-form-refs.cjs.map +1 -1
- package/dist/components/json-schema-form-refs.d.ts.map +1 -1
- package/dist/components/json-schema-form-refs.js +1 -1
- package/dist/components/json-schema-form-refs.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +20 -6
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +20 -6
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +22 -2
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +22 -2
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +5 -1
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-union-model.cjs +46 -0
- package/dist/components/json-schema-form-union-model.cjs.map +1 -0
- package/dist/components/json-schema-form-union-model.d.ts +6 -0
- package/dist/components/json-schema-form-union-model.d.ts.map +1 -0
- package/dist/components/json-schema-form-union-model.js +43 -0
- package/dist/components/json-schema-form-union-model.js.map +1 -0
- package/dist/components/json-schema-form-union.cjs +52 -0
- package/dist/components/json-schema-form-union.cjs.map +1 -0
- package/dist/components/json-schema-form-union.d.ts +7 -0
- package/dist/components/json-schema-form-union.d.ts.map +1 -0
- package/dist/components/json-schema-form-union.js +52 -0
- package/dist/components/json-schema-form-union.js.map +1 -0
- package/dist/components/list-menu-virtual.cjs +5 -0
- package/dist/components/list-menu-virtual.cjs.map +1 -0
- package/dist/components/list-menu-virtual.d.ts +12 -0
- package/dist/components/list-menu-virtual.d.ts.map +1 -0
- package/dist/components/list-menu-virtual.js +6 -0
- package/dist/components/list-menu-virtual.js.map +1 -0
- package/dist/components/local-path.cjs +12 -0
- package/dist/components/local-path.cjs.map +1 -0
- package/dist/components/local-path.d.ts +14 -0
- package/dist/components/local-path.d.ts.map +1 -0
- package/dist/components/local-path.js +12 -0
- package/dist/components/local-path.js.map +1 -0
- package/dist/components/slider-shared.cjs +32 -0
- package/dist/components/slider-shared.cjs.map +1 -0
- package/dist/components/slider-shared.d.ts +18 -0
- package/dist/components/slider-shared.d.ts.map +1 -0
- package/dist/components/slider-shared.js +27 -0
- package/dist/components/slider-shared.js.map +1 -0
- package/dist/components.cjs +8 -0
- package/dist/components.d.ts +6 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +5 -1
- package/dist/connections/ConnectionsPage.cjs +51 -19
- package/dist/connections/ConnectionsPage.cjs.map +1 -1
- package/dist/connections/ConnectionsPage.d.ts +9 -1
- package/dist/connections/ConnectionsPage.d.ts.map +1 -1
- package/dist/connections/ConnectionsPage.js +52 -20
- package/dist/connections/ConnectionsPage.js.map +1 -1
- package/dist/connections/connectionDashboard.cjs +13 -8
- package/dist/connections/connectionDashboard.cjs.map +1 -1
- package/dist/connections/connectionDashboard.d.ts +8 -3
- package/dist/connections/connectionDashboard.d.ts.map +1 -1
- package/dist/connections/connectionDashboard.js +14 -9
- package/dist/connections/connectionDashboard.js.map +1 -1
- package/dist/connections/connectionDashboardModel.cjs.map +1 -1
- package/dist/connections/connectionDashboardModel.d.ts +4 -0
- package/dist/connections/connectionDashboardModel.d.ts.map +1 -1
- package/dist/connections/connectionDashboardModel.js.map +1 -1
- package/dist/connections/connectionDashboardRow.cjs +75 -55
- package/dist/connections/connectionDashboardRow.cjs.map +1 -1
- package/dist/connections/connectionDashboardRow.d.ts +3 -2
- package/dist/connections/connectionDashboardRow.d.ts.map +1 -1
- package/dist/connections/connectionDashboardRow.js +75 -55
- package/dist/connections/connectionDashboardRow.js.map +1 -1
- package/dist/connections/connectionNamespaceField.cjs +17 -0
- package/dist/connections/connectionNamespaceField.cjs.map +1 -0
- package/dist/connections/connectionNamespaceField.d.ts +10 -0
- package/dist/connections/connectionNamespaceField.d.ts.map +1 -0
- package/dist/connections/connectionNamespaceField.js +17 -0
- package/dist/connections/connectionNamespaceField.js.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.cjs +98 -0
- package/dist/connections/connectionSchemaFormExtensions.cjs.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.d.ts +41 -0
- package/dist/connections/connectionSchemaFormExtensions.d.ts.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.js +96 -0
- package/dist/connections/connectionSchemaFormExtensions.js.map +1 -0
- package/dist/connections/connectionsPageModel.cjs +11 -0
- package/dist/connections/connectionsPageModel.cjs.map +1 -1
- package/dist/connections/connectionsPageModel.d.ts +5 -0
- package/dist/connections/connectionsPageModel.d.ts.map +1 -1
- package/dist/connections/connectionsPageModel.js +11 -1
- package/dist/connections/connectionsPageModel.js.map +1 -1
- package/dist/connections.cjs +5 -0
- package/dist/connections.d.ts +2 -1
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +3 -2
- package/dist/data/AvatarBadge.cjs +3 -3
- package/dist/data/AvatarBadge.cjs.map +1 -1
- package/dist/data/AvatarBadge.js +3 -3
- package/dist/data/AvatarBadge.js.map +1 -1
- package/dist/data/CodeDiff.cjs +2 -0
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.js +2 -0
- package/dist/data/CodeDiff.js.map +1 -1
- package/dist/data/DataTable.cjs +3 -2
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +3 -2
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/Gauge.cjs +1 -1
- package/dist/data/Gauge.cjs.map +1 -1
- package/dist/data/Gauge.js +1 -1
- package/dist/data/Gauge.js.map +1 -1
- package/dist/data/HighlightedTokens.cjs +2 -10
- package/dist/data/HighlightedTokens.cjs.map +1 -1
- package/dist/data/HighlightedTokens.d.ts.map +1 -1
- package/dist/data/HighlightedTokens.js +1 -9
- package/dist/data/HighlightedTokens.js.map +1 -1
- package/dist/data/Markdown.cjs +38 -11
- package/dist/data/Markdown.cjs.map +1 -1
- package/dist/data/Markdown.d.ts +9 -1
- package/dist/data/Markdown.d.ts.map +1 -1
- package/dist/data/Markdown.js +39 -12
- package/dist/data/Markdown.js.map +1 -1
- package/dist/data/MultiGaugeBar.cjs +157 -0
- package/dist/data/MultiGaugeBar.cjs.map +1 -0
- package/dist/data/MultiGaugeBar.d.ts +29 -0
- package/dist/data/MultiGaugeBar.d.ts.map +1 -0
- package/dist/data/MultiGaugeBar.js +157 -0
- package/dist/data/MultiGaugeBar.js.map +1 -0
- package/dist/data/OpenInFilesLink.cjs +27 -0
- package/dist/data/OpenInFilesLink.cjs.map +1 -0
- package/dist/data/OpenInFilesLink.d.ts +15 -0
- package/dist/data/OpenInFilesLink.d.ts.map +1 -0
- package/dist/data/OpenInFilesLink.js +27 -0
- package/dist/data/OpenInFilesLink.js.map +1 -0
- package/dist/data/ProgressBar.cjs +5 -3
- package/dist/data/ProgressBar.cjs.map +1 -1
- package/dist/data/ProgressBar.d.ts +5 -1
- package/dist/data/ProgressBar.d.ts.map +1 -1
- package/dist/data/ProgressBar.js +5 -3
- package/dist/data/ProgressBar.js.map +1 -1
- package/dist/data/ProgressBars.cjs +13 -5
- package/dist/data/ProgressBars.cjs.map +1 -1
- package/dist/data/ProgressBars.d.ts +6 -1
- package/dist/data/ProgressBars.d.ts.map +1 -1
- package/dist/data/ProgressBars.js +13 -5
- package/dist/data/ProgressBars.js.map +1 -1
- package/dist/data/Properties.cjs +3 -3
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.js +3 -3
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/TaskProgress.cjs +14 -6
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +3 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +14 -6
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskPrompts.cjs +96 -0
- package/dist/data/TaskPrompts.cjs.map +1 -0
- package/dist/data/TaskPrompts.d.ts +6 -0
- package/dist/data/TaskPrompts.d.ts.map +1 -0
- package/dist/data/TaskPrompts.js +96 -0
- package/dist/data/TaskPrompts.js.map +1 -0
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +3 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/TimeseriesCoreBars.cjs +7 -3
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +8 -4
- package/dist/data/TimeseriesCoreBars.js.map +1 -1
- package/dist/data/TimeseriesGauge.cjs +12 -5
- package/dist/data/TimeseriesGauge.cjs.map +1 -1
- package/dist/data/TimeseriesGauge.d.ts.map +1 -1
- package/dist/data/TimeseriesGauge.js +13 -6
- package/dist/data/TimeseriesGauge.js.map +1 -1
- package/dist/data/TimeseriesPanel.cjs +10 -9
- package/dist/data/TimeseriesPanel.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.d.ts +1 -1
- package/dist/data/TimeseriesPanel.d.ts.map +1 -1
- package/dist/data/TimeseriesPanel.js +11 -10
- package/dist/data/TimeseriesPanel.js.map +1 -1
- package/dist/data/TimeseriesPanel.model.cjs +62 -10
- package/dist/data/TimeseriesPanel.model.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.model.d.ts +40 -1
- package/dist/data/TimeseriesPanel.model.d.ts.map +1 -1
- package/dist/data/TimeseriesPanel.model.js +62 -11
- package/dist/data/TimeseriesPanel.model.js.map +1 -1
- package/dist/data/WorkloadCard.cjs +7 -3
- package/dist/data/WorkloadCard.cjs.map +1 -1
- package/dist/data/WorkloadCard.d.ts +3 -1
- package/dist/data/WorkloadCard.d.ts.map +1 -1
- package/dist/data/WorkloadCard.js +7 -3
- package/dist/data/WorkloadCard.js.map +1 -1
- package/dist/data/WorkloadCard.model.cjs.map +1 -1
- package/dist/data/WorkloadCard.model.d.ts +2 -0
- package/dist/data/WorkloadCard.model.d.ts.map +1 -1
- package/dist/data/WorkloadCard.model.js.map +1 -1
- package/dist/data/ai/ChatWindow.placement.cjs +2 -1
- package/dist/data/ai/ChatWindow.placement.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.placement.d.ts +1 -1
- package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.placement.js +2 -1
- package/dist/data/ai/ChatWindow.placement.js.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.cjs +2 -2
- package/dist/data/ai/SpecRuntimeBar.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.d.ts +4 -1
- package/dist/data/ai/SpecRuntimeBar.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.js +2 -2
- package/dist/data/ai/SpecRuntimeBar.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.cjs +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.js +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
- package/dist/data/ai/ThreadPicker.cjs +2 -2
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.js +2 -2
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/index.d.ts +2 -0
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-prompt-run-stream.cjs +126 -0
- package/dist/data/ai/use-prompt-run-stream.cjs.map +1 -0
- package/dist/data/ai/use-prompt-run-stream.d.ts +52 -0
- package/dist/data/ai/use-prompt-run-stream.d.ts.map +1 -0
- package/dist/data/ai/use-prompt-run-stream.js +126 -0
- package/dist/data/ai/use-prompt-run-stream.js.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -1
- package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -1
- package/dist/data/cache-browser/CacheBrowser.js +1 -0
- package/dist/data/cache-browser/CacheBrowser.js.map +1 -1
- package/dist/data/charts/BarChart.cjs +194 -0
- package/dist/data/charts/BarChart.cjs.map +1 -0
- package/dist/data/charts/BarChart.d.ts +19 -0
- package/dist/data/charts/BarChart.d.ts.map +1 -0
- package/dist/data/charts/BarChart.js +194 -0
- package/dist/data/charts/BarChart.js.map +1 -0
- package/dist/data/charts/ChartLegend.cjs +54 -0
- package/dist/data/charts/ChartLegend.cjs.map +1 -0
- package/dist/data/charts/ChartLegend.d.ts +17 -0
- package/dist/data/charts/ChartLegend.d.ts.map +1 -0
- package/dist/data/charts/ChartLegend.js +54 -0
- package/dist/data/charts/ChartLegend.js.map +1 -0
- package/dist/data/charts/Sparkline.cjs +56 -0
- package/dist/data/charts/Sparkline.cjs.map +1 -0
- package/dist/data/charts/Sparkline.d.ts +15 -0
- package/dist/data/charts/Sparkline.d.ts.map +1 -0
- package/dist/data/charts/Sparkline.js +56 -0
- package/dist/data/charts/Sparkline.js.map +1 -0
- package/dist/data/charts/StackedBarChart.cjs +241 -0
- package/dist/data/charts/StackedBarChart.cjs.map +1 -0
- package/dist/data/charts/StackedBarChart.d.ts +20 -0
- package/dist/data/charts/StackedBarChart.d.ts.map +1 -0
- package/dist/data/charts/StackedBarChart.js +241 -0
- package/dist/data/charts/StackedBarChart.js.map +1 -0
- package/dist/data/charts/TrendChart.cjs +157 -0
- package/dist/data/charts/TrendChart.cjs.map +1 -0
- package/dist/data/charts/TrendChart.d.ts +20 -0
- package/dist/data/charts/TrendChart.d.ts.map +1 -0
- package/dist/data/charts/TrendChart.js +157 -0
- package/dist/data/charts/TrendChart.js.map +1 -0
- package/dist/data/charts/chart-marks.cjs +115 -0
- package/dist/data/charts/chart-marks.cjs.map +1 -0
- package/dist/data/charts/chart-marks.d.ts +39 -0
- package/dist/data/charts/chart-marks.d.ts.map +1 -0
- package/dist/data/charts/chart-marks.js +112 -0
- package/dist/data/charts/chart-marks.js.map +1 -0
- package/dist/data/charts/chart-palette.cjs +74 -0
- package/dist/data/charts/chart-palette.cjs.map +1 -0
- package/dist/data/charts/chart-palette.d.ts +58 -0
- package/dist/data/charts/chart-palette.d.ts.map +1 -0
- package/dist/data/charts/chart-palette.js +72 -0
- package/dist/data/charts/chart-palette.js.map +1 -0
- package/dist/data/charts/chart-scale.cjs +115 -0
- package/dist/data/charts/chart-scale.cjs.map +1 -0
- package/dist/data/charts/chart-scale.d.ts +41 -0
- package/dist/data/charts/chart-scale.d.ts.map +1 -0
- package/dist/data/charts/chart-scale.js +104 -0
- package/dist/data/charts/chart-scale.js.map +1 -0
- package/dist/data/charts/chart.test-utils.d.ts +7 -0
- package/dist/data/charts/chart.test-utils.d.ts.map +1 -0
- package/dist/data/charts/index.d.ts +7 -0
- package/dist/data/charts/index.d.ts.map +1 -0
- package/dist/data/chat/MessageActions.cjs +1 -1
- package/dist/data/chat/MessageActions.cjs.map +1 -1
- package/dist/data/chat/MessageActions.js +1 -1
- package/dist/data/chat/MessageActions.js.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.cjs +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.js +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +9 -2
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +9 -2
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/ProblemActions.cjs +37 -0
- package/dist/data/diagnostics/ProblemActions.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemActions.d.ts +6 -0
- package/dist/data/diagnostics/ProblemActions.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemActions.js +37 -0
- package/dist/data/diagnostics/ProblemActions.js.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.cjs +33 -0
- package/dist/data/diagnostics/ProblemFacet.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.d.ts +9 -0
- package/dist/data/diagnostics/ProblemFacet.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.js +33 -0
- package/dist/data/diagnostics/ProblemFacet.js.map +1 -0
- package/dist/data/diagnostics/ProblemRow.cjs +62 -0
- package/dist/data/diagnostics/ProblemRow.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemRow.d.ts +14 -0
- package/dist/data/diagnostics/ProblemRow.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemRow.js +62 -0
- package/dist/data/diagnostics/ProblemRow.js.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.cjs +18 -0
- package/dist/data/diagnostics/ProblemViewOptions.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.d.ts +6 -0
- package/dist/data/diagnostics/ProblemViewOptions.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.js +18 -0
- package/dist/data/diagnostics/ProblemViewOptions.js.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.cjs +1 -1
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.js +1 -1
- package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
- package/dist/data/diagnostics/diagnostic-identity.cjs +14 -0
- package/dist/data/diagnostics/diagnostic-identity.cjs.map +1 -0
- package/dist/data/diagnostics/diagnostic-identity.d.ts +3 -0
- package/dist/data/diagnostics/diagnostic-identity.d.ts.map +1 -0
- package/dist/data/diagnostics/diagnostic-identity.js +14 -0
- package/dist/data/diagnostics/diagnostic-identity.js.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.cjs +16 -0
- package/dist/data/diagnostics/use-problem-expansion.cjs.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.d.ts +3 -0
- package/dist/data/diagnostics/use-problem-expansion.d.ts.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.js +16 -0
- package/dist/data/diagnostics/use-problem-expansion.js.map +1 -0
- package/dist/data/git/GitChangeList.cjs +9 -6
- package/dist/data/git/GitChangeList.cjs.map +1 -1
- package/dist/data/git/GitChangeList.d.ts +6 -0
- package/dist/data/git/GitChangeList.d.ts.map +1 -1
- package/dist/data/git/GitChangeList.js +9 -6
- package/dist/data/git/GitChangeList.js.map +1 -1
- package/dist/data/git/pickers/GitPickersDemo.d.ts.map +1 -1
- package/dist/data/git/pickers/ReferencePicker.cjs +1 -0
- package/dist/data/git/pickers/ReferencePicker.cjs.map +1 -1
- package/dist/data/git/pickers/ReferencePicker.js +1 -0
- package/dist/data/git/pickers/ReferencePicker.js.map +1 -1
- package/dist/data/lint/LintDetail.cjs +230 -189
- package/dist/data/lint/LintDetail.cjs.map +1 -1
- package/dist/data/lint/LintDetail.d.ts +25 -3
- package/dist/data/lint/LintDetail.d.ts.map +1 -1
- package/dist/data/lint/LintDetail.js +231 -192
- package/dist/data/lint/LintDetail.js.map +1 -1
- package/dist/data/lint/LintFilterBar.cjs +78 -83
- package/dist/data/lint/LintFilterBar.cjs.map +1 -1
- package/dist/data/lint/LintFilterBar.d.ts +23 -6
- package/dist/data/lint/LintFilterBar.d.ts.map +1 -1
- package/dist/data/lint/LintFilterBar.js +78 -85
- package/dist/data/lint/LintFilterBar.js.map +1 -1
- package/dist/data/lint/LintIgnoreMenu.cjs +59 -0
- package/dist/data/lint/LintIgnoreMenu.cjs.map +1 -0
- package/dist/data/lint/LintIgnoreMenu.d.ts +20 -0
- package/dist/data/lint/LintIgnoreMenu.d.ts.map +1 -0
- package/dist/data/lint/LintIgnoreMenu.js +58 -0
- package/dist/data/lint/LintIgnoreMenu.js.map +1 -0
- package/dist/data/lint/LintResults.cjs +59 -14
- package/dist/data/lint/LintResults.cjs.map +1 -1
- package/dist/data/lint/LintResults.d.ts +25 -1
- package/dist/data/lint/LintResults.d.ts.map +1 -1
- package/dist/data/lint/LintResults.fixtures.d.ts +19 -0
- package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -1
- package/dist/data/lint/LintResults.js +60 -15
- package/dist/data/lint/LintResults.js.map +1 -1
- package/dist/data/lint/LintTable.cjs +156 -0
- package/dist/data/lint/LintTable.cjs.map +1 -0
- package/dist/data/lint/LintTable.d.ts +13 -0
- package/dist/data/lint/LintTable.d.ts.map +1 -0
- package/dist/data/lint/LintTable.js +156 -0
- package/dist/data/lint/LintTable.js.map +1 -0
- package/dist/data/lint/LintTreeNode.cjs +42 -19
- package/dist/data/lint/LintTreeNode.cjs.map +1 -1
- package/dist/data/lint/LintTreeNode.d.ts +7 -2
- package/dist/data/lint/LintTreeNode.d.ts.map +1 -1
- package/dist/data/lint/LintTreeNode.js +44 -21
- package/dist/data/lint/LintTreeNode.js.map +1 -1
- package/dist/data/lint/ViolationSnippet.cjs +113 -0
- package/dist/data/lint/ViolationSnippet.cjs.map +1 -0
- package/dist/data/lint/ViolationSnippet.d.ts +20 -0
- package/dist/data/lint/ViolationSnippet.d.ts.map +1 -0
- package/dist/data/lint/ViolationSnippet.js +112 -0
- package/dist/data/lint/ViolationSnippet.js.map +1 -0
- package/dist/data/lint/actions.cjs +44 -16
- package/dist/data/lint/actions.cjs.map +1 -1
- package/dist/data/lint/actions.d.ts +7 -3
- package/dist/data/lint/actions.d.ts.map +1 -1
- package/dist/data/lint/actions.js +44 -16
- package/dist/data/lint/actions.js.map +1 -1
- package/dist/data/lint/grouping.cjs +105 -8
- package/dist/data/lint/grouping.cjs.map +1 -1
- package/dist/data/lint/grouping.d.ts +21 -1
- package/dist/data/lint/grouping.d.ts.map +1 -1
- package/dist/data/lint/grouping.js +105 -10
- package/dist/data/lint/grouping.js.map +1 -1
- package/dist/data/lint/ignore-menu-items.cjs +18 -0
- package/dist/data/lint/ignore-menu-items.cjs.map +1 -0
- package/dist/data/lint/ignore-menu-items.d.ts +6 -0
- package/dist/data/lint/ignore-menu-items.d.ts.map +1 -0
- package/dist/data/lint/ignore-menu-items.js +17 -0
- package/dist/data/lint/ignore-menu-items.js.map +1 -0
- package/dist/data/lint/index.d.ts +7 -5
- package/dist/data/lint/index.d.ts.map +1 -1
- package/dist/data/lint/stats.cjs +19 -4
- package/dist/data/lint/stats.cjs.map +1 -1
- package/dist/data/lint/stats.d.ts +13 -3
- package/dist/data/lint/stats.d.ts.map +1 -1
- package/dist/data/lint/stats.js +17 -5
- package/dist/data/lint/stats.js.map +1 -1
- package/dist/data/lint/types.cjs +8 -0
- package/dist/data/lint/types.cjs.map +1 -1
- package/dist/data/lint/types.d.ts +47 -0
- package/dist/data/lint/types.d.ts.map +1 -1
- package/dist/data/lint/types.js +8 -1
- package/dist/data/lint/types.js.map +1 -1
- package/dist/data/lint/violation-menu-items.cjs +31 -0
- package/dist/data/lint/violation-menu-items.cjs.map +1 -0
- package/dist/data/lint/violation-menu-items.d.ts +12 -0
- package/dist/data/lint/violation-menu-items.d.ts.map +1 -0
- package/dist/data/lint/violation-menu-items.js +31 -0
- package/dist/data/lint/violation-menu-items.js.map +1 -0
- package/dist/data/markdown-source-blocks.cjs +38 -0
- package/dist/data/markdown-source-blocks.cjs.map +1 -0
- package/dist/data/markdown-source-blocks.d.ts +32 -0
- package/dist/data/markdown-source-blocks.d.ts.map +1 -0
- package/dist/data/markdown-source-blocks.js +35 -0
- package/dist/data/markdown-source-blocks.js.map +1 -0
- package/dist/data/test-runner/FilterFacet.cjs +52 -0
- package/dist/data/test-runner/FilterFacet.cjs.map +1 -0
- package/dist/data/test-runner/FilterFacet.d.ts +13 -0
- package/dist/data/test-runner/FilterFacet.d.ts.map +1 -0
- package/dist/data/test-runner/FilterFacet.js +52 -0
- package/dist/data/test-runner/FilterFacet.js.map +1 -0
- package/dist/data/test-runner/MatrixMarks.cjs +19 -29
- package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
- package/dist/data/test-runner/MatrixMarks.d.ts +4 -4
- package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
- package/dist/data/test-runner/MatrixMarks.js +19 -29
- package/dist/data/test-runner/MatrixMarks.js.map +1 -1
- package/dist/data/test-runner/TestAttemptDetail.cjs +1 -1
- package/dist/data/test-runner/TestAttemptDetail.js +1 -1
- package/dist/data/test-runner/TestDetailPanel.cjs +11 -0
- package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.js +11 -0
- package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
- package/dist/data/test-runner/TestFilterBar.cjs +3 -44
- package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
- package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
- package/dist/data/test-runner/TestFilterBar.js +3 -44
- package/dist/data/test-runner/TestFilterBar.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +3 -1
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +7 -1
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +3 -1
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/test-runner/context.cjs.map +1 -1
- package/dist/data/test-runner/context.d.ts +3 -0
- package/dist/data/test-runner/context.d.ts.map +1 -1
- package/dist/data/test-runner/context.js.map +1 -1
- package/dist/data/test-runner/types.d.ts +2 -0
- package/dist/data/test-runner/types.d.ts.map +1 -1
- package/dist/data/timeseries-query.cjs +98 -2
- package/dist/data/timeseries-query.cjs.map +1 -1
- package/dist/data/timeseries-query.d.ts +31 -5
- package/dist/data/timeseries-query.d.ts.map +1 -1
- package/dist/data/timeseries-query.js +98 -3
- package/dist/data/timeseries-query.js.map +1 -1
- package/dist/data/timeseries-stream-provider.cjs +38 -0
- package/dist/data/timeseries-stream-provider.cjs.map +1 -0
- package/dist/data/timeseries-stream-provider.d.ts +26 -0
- package/dist/data/timeseries-stream-provider.d.ts.map +1 -0
- package/dist/data/timeseries-stream-provider.js +38 -0
- package/dist/data/timeseries-stream-provider.js.map +1 -0
- package/dist/data/timeseries-stream.cjs +304 -0
- package/dist/data/timeseries-stream.cjs.map +1 -0
- package/dist/data/timeseries-stream.d.ts +81 -0
- package/dist/data/timeseries-stream.d.ts.map +1 -0
- package/dist/data/timeseries-stream.fixtures.d.ts +36 -0
- package/dist/data/timeseries-stream.fixtures.d.ts.map +1 -0
- package/dist/data/timeseries-stream.js +296 -0
- package/dist/data/timeseries-stream.js.map +1 -0
- package/dist/data/token-style.cjs +13 -0
- package/dist/data/token-style.cjs.map +1 -0
- package/dist/data/token-style.d.ts +4 -0
- package/dist/data/token-style.d.ts.map +1 -0
- package/dist/data/token-style.js +13 -0
- package/dist/data/token-style.js.map +1 -0
- package/dist/data/traces/ProcessTraceDetail.cjs +1 -1
- package/dist/data/traces/ProcessTraceDetail.js +1 -1
- package/dist/data/traces/index.d.ts +1 -1
- package/dist/data/traces/index.d.ts.map +1 -1
- package/dist/data/use-data-table-virtual.d.ts +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data/workload-panel/MemoryStack.cjs +49 -0
- package/dist/data/workload-panel/MemoryStack.cjs.map +1 -0
- package/dist/data/workload-panel/MemoryStack.d.ts +11 -0
- package/dist/data/workload-panel/MemoryStack.d.ts.map +1 -0
- package/dist/data/workload-panel/MemoryStack.js +48 -0
- package/dist/data/workload-panel/MemoryStack.js.map +1 -0
- package/dist/data/workload-panel/Metrics.cjs +197 -0
- package/dist/data/workload-panel/Metrics.cjs.map +1 -0
- package/dist/data/workload-panel/Metrics.d.ts +11 -0
- package/dist/data/workload-panel/Metrics.d.ts.map +1 -0
- package/dist/data/workload-panel/Metrics.js +196 -0
- package/dist/data/workload-panel/Metrics.js.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.cjs +66 -0
- package/dist/data/workload-panel/WorkloadPanel.cjs.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.d.ts +3 -0
- package/dist/data/workload-panel/WorkloadPanel.d.ts.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.js +66 -0
- package/dist/data/workload-panel/WorkloadPanel.js.map +1 -0
- package/dist/data/workload-panel/fixtures.d.ts +60 -0
- package/dist/data/workload-panel/fixtures.d.ts.map +1 -0
- package/dist/data/workload-panel/model.cjs +137 -0
- package/dist/data/workload-panel/model.cjs.map +1 -0
- package/dist/data/workload-panel/model.d.ts +53 -0
- package/dist/data/workload-panel/model.d.ts.map +1 -0
- package/dist/data/workload-panel/model.js +133 -0
- package/dist/data/workload-panel/model.js.map +1 -0
- package/dist/data/workload-panel/types.d.ts +56 -0
- package/dist/data/workload-panel/types.d.ts.map +1 -0
- package/dist/data.cjs +57 -6
- package/dist/data.d.ts +9 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +27 -10
- package/dist/file-findings/AnnotatedCode.cjs +243 -0
- package/dist/file-findings/AnnotatedCode.cjs.map +1 -0
- package/dist/file-findings/AnnotatedCode.d.ts +30 -0
- package/dist/file-findings/AnnotatedCode.d.ts.map +1 -0
- package/dist/file-findings/AnnotatedCode.js +243 -0
- package/dist/file-findings/AnnotatedCode.js.map +1 -0
- package/dist/file-findings/FileFindingsView.cjs +213 -0
- package/dist/file-findings/FileFindingsView.cjs.map +1 -0
- package/dist/file-findings/FileFindingsView.d.ts +35 -0
- package/dist/file-findings/FileFindingsView.d.ts.map +1 -0
- package/dist/file-findings/FileFindingsView.js +213 -0
- package/dist/file-findings/FileFindingsView.js.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.cjs +22 -0
- package/dist/file-findings/LazyAnnotatedCode.cjs.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.d.ts +5 -0
- package/dist/file-findings/LazyAnnotatedCode.d.ts.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.js +22 -0
- package/dist/file-findings/LazyAnnotatedCode.js.map +1 -0
- package/dist/file-findings/adapters.cjs +155 -0
- package/dist/file-findings/adapters.cjs.map +1 -0
- package/dist/file-findings/adapters.d.ts +24 -0
- package/dist/file-findings/adapters.d.ts.map +1 -0
- package/dist/file-findings/adapters.js +153 -0
- package/dist/file-findings/adapters.js.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.cjs +97 -0
- package/dist/file-findings/file-review/CommentDraft.cjs.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.d.ts +25 -0
- package/dist/file-findings/file-review/CommentDraft.d.ts.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.js +97 -0
- package/dist/file-findings/file-review/CommentDraft.js.map +1 -0
- package/dist/file-findings/file-review/FileReview.cjs +863 -0
- package/dist/file-findings/file-review/FileReview.cjs.map +1 -0
- package/dist/file-findings/file-review/FileReview.d.ts +79 -0
- package/dist/file-findings/file-review/FileReview.d.ts.map +1 -0
- package/dist/file-findings/file-review/FileReview.fixtures.d.ts +25 -0
- package/dist/file-findings/file-review/FileReview.fixtures.d.ts.map +1 -0
- package/dist/file-findings/file-review/FileReview.js +863 -0
- package/dist/file-findings/file-review/FileReview.js.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.cjs +77 -0
- package/dist/file-findings/file-review/InlineAuthors.cjs.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.d.ts +9 -0
- package/dist/file-findings/file-review/InlineAuthors.d.ts.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.js +77 -0
- package/dist/file-findings/file-review/InlineAuthors.js.map +1 -0
- package/dist/file-findings/file-review/InlineThread.cjs +77 -0
- package/dist/file-findings/file-review/InlineThread.cjs.map +1 -0
- package/dist/file-findings/file-review/InlineThread.d.ts +27 -0
- package/dist/file-findings/file-review/InlineThread.d.ts.map +1 -0
- package/dist/file-findings/file-review/InlineThread.js +77 -0
- package/dist/file-findings/file-review/InlineThread.js.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.cjs +164 -0
- package/dist/file-findings/file-review/ProblemsList.cjs.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.d.ts +15 -0
- package/dist/file-findings/file-review/ProblemsList.d.ts.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.js +164 -0
- package/dist/file-findings/file-review/ProblemsList.js.map +1 -0
- package/dist/file-findings/file-review/SourceView.cjs +179 -0
- package/dist/file-findings/file-review/SourceView.cjs.map +1 -0
- package/dist/file-findings/file-review/SourceView.d.ts +29 -0
- package/dist/file-findings/file-review/SourceView.d.ts.map +1 -0
- package/dist/file-findings/file-review/SourceView.js +179 -0
- package/dist/file-findings/file-review/SourceView.js.map +1 -0
- package/dist/file-findings/file-review/blame.cjs +35 -0
- package/dist/file-findings/file-review/blame.cjs.map +1 -0
- package/dist/file-findings/file-review/blame.d.ts +28 -0
- package/dist/file-findings/file-review/blame.d.ts.map +1 -0
- package/dist/file-findings/file-review/blame.js +33 -0
- package/dist/file-findings/file-review/blame.js.map +1 -0
- package/dist/file-findings/file-review/geometry.cjs +101 -0
- package/dist/file-findings/file-review/geometry.cjs.map +1 -0
- package/dist/file-findings/file-review/geometry.d.ts +45 -0
- package/dist/file-findings/file-review/geometry.d.ts.map +1 -0
- package/dist/file-findings/file-review/geometry.js +98 -0
- package/dist/file-findings/file-review/geometry.js.map +1 -0
- package/dist/file-findings/file-review/hooks.cjs +101 -0
- package/dist/file-findings/file-review/hooks.cjs.map +1 -0
- package/dist/file-findings/file-review/hooks.d.ts +22 -0
- package/dist/file-findings/file-review/hooks.d.ts.map +1 -0
- package/dist/file-findings/file-review/hooks.js +99 -0
- package/dist/file-findings/file-review/hooks.js.map +1 -0
- package/dist/file-findings/file-review/marks.cjs +52 -0
- package/dist/file-findings/file-review/marks.cjs.map +1 -0
- package/dist/file-findings/file-review/marks.d.ts +23 -0
- package/dist/file-findings/file-review/marks.d.ts.map +1 -0
- package/dist/file-findings/file-review/marks.js +47 -0
- package/dist/file-findings/file-review/marks.js.map +1 -0
- package/dist/file-findings/file-review/problem-filters.cjs +14 -0
- package/dist/file-findings/file-review/problem-filters.cjs.map +1 -0
- package/dist/file-findings/file-review/problem-filters.d.ts +10 -0
- package/dist/file-findings/file-review/problem-filters.d.ts.map +1 -0
- package/dist/file-findings/file-review/problem-filters.js +13 -0
- package/dist/file-findings/file-review/problem-filters.js.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.cjs +234 -0
- package/dist/file-findings/file-review/quote-anchor.cjs.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.d.ts +54 -0
- package/dist/file-findings/file-review/quote-anchor.d.ts.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.js +226 -0
- package/dist/file-findings/file-review/quote-anchor.js.map +1 -0
- package/dist/file-findings/file-review/source-anchor.cjs +104 -0
- package/dist/file-findings/file-review/source-anchor.cjs.map +1 -0
- package/dist/file-findings/file-review/source-anchor.d.ts +27 -0
- package/dist/file-findings/file-review/source-anchor.d.ts.map +1 -0
- package/dist/file-findings/file-review/source-anchor.js +99 -0
- package/dist/file-findings/file-review/source-anchor.js.map +1 -0
- package/dist/file-findings/file-review/source-marks.cjs +71 -0
- package/dist/file-findings/file-review/source-marks.cjs.map +1 -0
- package/dist/file-findings/file-review/source-marks.d.ts +27 -0
- package/dist/file-findings/file-review/source-marks.d.ts.map +1 -0
- package/dist/file-findings/file-review/source-marks.js +68 -0
- package/dist/file-findings/file-review/source-marks.js.map +1 -0
- package/dist/file-findings/findings-comments.cjs +136 -0
- package/dist/file-findings/findings-comments.cjs.map +1 -0
- package/dist/file-findings/findings-comments.d.ts +28 -0
- package/dist/file-findings/findings-comments.d.ts.map +1 -0
- package/dist/file-findings/findings-comments.js +131 -0
- package/dist/file-findings/findings-comments.js.map +1 -0
- package/dist/file-findings/findings-languages.cjs +53 -0
- package/dist/file-findings/findings-languages.cjs.map +1 -0
- package/dist/file-findings/findings-languages.d.ts +11 -0
- package/dist/file-findings/findings-languages.d.ts.map +1 -0
- package/dist/file-findings/findings-languages.js +53 -0
- package/dist/file-findings/findings-languages.js.map +1 -0
- package/dist/file-findings/mdx-source.cjs +48 -0
- package/dist/file-findings/mdx-source.cjs.map +1 -0
- package/dist/file-findings/mdx-source.d.ts +7 -0
- package/dist/file-findings/mdx-source.d.ts.map +1 -0
- package/dist/file-findings/mdx-source.js +48 -0
- package/dist/file-findings/mdx-source.js.map +1 -0
- package/dist/file-findings/monaco-language.cjs +73 -0
- package/dist/file-findings/monaco-language.cjs.map +1 -0
- package/dist/file-findings/monaco-language.d.ts +11 -0
- package/dist/file-findings/monaco-language.d.ts.map +1 -0
- package/dist/file-findings/monaco-language.js +72 -0
- package/dist/file-findings/monaco-language.js.map +1 -0
- package/dist/file-findings/severity-counts.cjs +20 -0
- package/dist/file-findings/severity-counts.cjs.map +1 -0
- package/dist/file-findings/severity-counts.d.ts +5 -0
- package/dist/file-findings/severity-counts.d.ts.map +1 -0
- package/dist/file-findings/severity-counts.js +19 -0
- package/dist/file-findings/severity-counts.js.map +1 -0
- package/dist/file-findings/types.cjs +12 -0
- package/dist/file-findings/types.cjs.map +1 -0
- package/dist/file-findings/types.d.ts +43 -0
- package/dist/file-findings/types.d.ts.map +1 -0
- package/dist/file-findings/types.js +11 -0
- package/dist/file-findings/types.js.map +1 -0
- package/dist/file-findings.cjs +47 -0
- package/dist/file-findings.d.ts +15 -0
- package/dist/file-findings.d.ts.map +1 -0
- package/dist/file-findings.js +15 -0
- package/dist/hooks/event-hub.cjs +22 -8
- package/dist/hooks/event-hub.cjs.map +1 -1
- package/dist/hooks/event-hub.d.ts.map +1 -1
- package/dist/hooks/event-hub.js +22 -8
- package/dist/hooks/event-hub.js.map +1 -1
- package/dist/icons/components/UiBrowser.cjs +51 -0
- package/dist/icons/components/UiBrowser.cjs.map +1 -0
- package/dist/icons/components/UiBrowser.d.ts +15 -0
- package/dist/icons/components/UiBrowser.d.ts.map +1 -0
- package/dist/icons/components/UiBrowser.js +48 -0
- package/dist/icons/components/UiBrowser.js.map +1 -0
- package/dist/icons/components/UiCreditCard.cjs +51 -0
- package/dist/icons/components/UiCreditCard.cjs.map +1 -0
- package/dist/icons/components/UiCreditCard.d.ts +15 -0
- package/dist/icons/components/UiCreditCard.d.ts.map +1 -0
- package/dist/icons/components/UiCreditCard.js +48 -0
- package/dist/icons/components/UiCreditCard.js.map +1 -0
- package/dist/icons/components/UiShoppingCart.cjs +51 -0
- package/dist/icons/components/UiShoppingCart.cjs.map +1 -0
- package/dist/icons/components/UiShoppingCart.d.ts +15 -0
- package/dist/icons/components/UiShoppingCart.d.ts.map +1 -0
- package/dist/icons/components/UiShoppingCart.js +48 -0
- package/dist/icons/components/UiShoppingCart.js.map +1 -0
- package/dist/icons/index.d.ts +6 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +6 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +6 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +9 -0
- package/dist/icons.js +4 -1
- package/dist/index.cjs +75 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -12
- package/dist/layout/AppShell.cjs +37 -21
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +13 -2
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +37 -21
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +7 -6
- package/dist/layout/AppShell.nav.cjs.map +1 -1
- package/dist/layout/AppShell.nav.d.ts.map +1 -1
- package/dist/layout/AppShell.nav.js +7 -6
- package/dist/layout/AppShell.nav.js.map +1 -1
- package/dist/layout/SplitPane.cjs +16 -6
- package/dist/layout/SplitPane.cjs.map +1 -1
- package/dist/layout/SplitPane.d.ts +12 -2
- package/dist/layout/SplitPane.d.ts.map +1 -1
- package/dist/layout/SplitPane.js +16 -6
- package/dist/layout/SplitPane.js.map +1 -1
- package/dist/layout/Workspace.cjs +37 -33
- package/dist/layout/Workspace.cjs.map +1 -1
- package/dist/layout/Workspace.d.ts.map +1 -1
- package/dist/layout/Workspace.js +37 -33
- package/dist/layout/Workspace.js.map +1 -1
- package/dist/layout/Workspace.regions.cjs +3 -3
- package/dist/layout/Workspace.regions.cjs.map +1 -1
- package/dist/layout/Workspace.regions.js +3 -3
- package/dist/layout/Workspace.regions.js.map +1 -1
- package/dist/lib/breakpoints.cjs +102 -0
- package/dist/lib/breakpoints.cjs.map +1 -0
- package/dist/lib/breakpoints.d.ts +36 -0
- package/dist/lib/breakpoints.d.ts.map +1 -0
- package/dist/lib/breakpoints.js +99 -0
- package/dist/lib/breakpoints.js.map +1 -0
- package/dist/lib/combobox.cjs +2 -1
- package/dist/lib/combobox.cjs.map +1 -1
- package/dist/lib/combobox.d.ts +1 -1
- package/dist/lib/combobox.d.ts.map +1 -1
- package/dist/lib/combobox.js +2 -1
- package/dist/lib/combobox.js.map +1 -1
- package/dist/lib/path-tree.cjs +21 -0
- package/dist/lib/path-tree.cjs.map +1 -1
- package/dist/lib/path-tree.d.ts +15 -0
- package/dist/lib/path-tree.d.ts.map +1 -1
- package/dist/lib/path-tree.js +21 -1
- package/dist/lib/path-tree.js.map +1 -1
- package/dist/overlay/Modal.cjs +2 -1
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +2 -1
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/dropdownMenuContext.d.ts +1 -1
- package/dist/profiles/editor/profileEditor.cjs +1 -1
- package/dist/profiles/editor/profileEditor.cjs.map +1 -1
- package/dist/profiles/editor/profileEditor.js +1 -1
- package/dist/profiles/editor/profileEditor.js.map +1 -1
- package/dist/profiles/editor/profileEditorSections.cjs +2 -2
- package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
- package/dist/profiles/editor/profileEditorSections.js +2 -2
- package/dist/profiles/editor/profileEditorSections.js.map +1 -1
- package/dist/profiles/query/prometheusResults.cjs +24 -36
- package/dist/profiles/query/prometheusResults.cjs.map +1 -1
- package/dist/profiles/query/prometheusResults.d.ts.map +1 -1
- package/dist/profiles/query/prometheusResults.js +24 -36
- package/dist/profiles/query/prometheusResults.js.map +1 -1
- package/dist/rpc/CommandForm.cjs +1 -1
- package/dist/rpc/CommandForm.cjs.map +1 -1
- package/dist/rpc/CommandForm.js +1 -1
- package/dist/rpc/CommandForm.js.map +1 -1
- package/dist/rpc/classify.cjs +1 -1
- package/dist/rpc/classify.cjs.map +1 -1
- package/dist/rpc/classify.d.ts.map +1 -1
- package/dist/rpc/classify.js +1 -1
- package/dist/rpc/classify.js.map +1 -1
- package/dist/rpc/useOperations.d.ts +24 -24
- package/dist/rpc.cjs +0 -2
- package/dist/rpc.d.ts +0 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +1 -2
- package/dist/styles.css +1 -1
- package/dist/utils.cjs +6 -0
- package/dist/utils.d.ts +2 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +3 -2
- package/package.json +9 -3
- package/schemas/json-schema-form.schema.json +9 -1
|
@@ -25,7 +25,7 @@ var SPLIT_MIN_WIDTH = 640;
|
|
|
25
25
|
* are exposed to sub-components through a single `TestRunnerContext`. Domain
|
|
26
26
|
* rendering is pluggable via node adapters; no fetch/SSE/routing lives here.
|
|
27
27
|
*/
|
|
28
|
-
function TestRunner({ tests, allTests, selected, filters, expandAll, done, runMeta, status, statusText, now, busy, activeTab, onTabChange, activeAttempt, onAttemptChange, onSelect, onFiltersChange, onExpandAllChange, onRerun, onStop, fetchProcessMetrics, adapters, title, showSummary = true, headerSlot, hideHeader = false, defaultSplit = 45, startTime, endTime, className }) {
|
|
28
|
+
function TestRunner({ tests, allTests, selected, filters, expandAll, done, runMeta, status, statusText, now, busy, activeTab, onTabChange, activeAttempt, onAttemptChange, onSelect, onFiltersChange, onExpandAllChange, onRerun, onStop, onOpenFile, fetchProcessMetrics, adapters, title, showSummary = true, headerSlot, hideHeader = false, defaultSplit = 45, startTime, endTime, className }) {
|
|
29
29
|
const registry = useMemo(() => toRegistry(adapters), [adapters]);
|
|
30
30
|
const ctx = useMemo(() => ({
|
|
31
31
|
tests,
|
|
@@ -46,6 +46,7 @@ function TestRunner({ tests, allTests, selected, filters, expandAll, done, runMe
|
|
|
46
46
|
onExpandAllChange,
|
|
47
47
|
onRerun,
|
|
48
48
|
onStop,
|
|
49
|
+
onOpenFile,
|
|
49
50
|
fetchProcessMetrics,
|
|
50
51
|
adapters: registry
|
|
51
52
|
}), [
|
|
@@ -67,6 +68,7 @@ function TestRunner({ tests, allTests, selected, filters, expandAll, done, runMe
|
|
|
67
68
|
onExpandAllChange,
|
|
68
69
|
onRerun,
|
|
69
70
|
onStop,
|
|
71
|
+
onOpenFile,
|
|
70
72
|
fetchProcessMetrics,
|
|
71
73
|
registry
|
|
72
74
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestRunner.js","names":[],"sources":["../../../src/data/test-runner/TestRunner.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { SplitPane } from \"../../layout/SplitPane\";\nimport { cn } from \"../../lib/utils\";\nimport { UiArrowLeft, UiBeaker } from \"../../icons\";\nimport { useContainerWiderThan } from \"../../hooks/use-container-width\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport { aggregateStatusCounts, collectFrameworks } from \"./status\";\nimport { type TestFilters } from \"./filterState\";\nimport {\n createTestRunnerRegistry,\n type TestNodeAdapter,\n TestNodeAdapterRegistry,\n} from \"./adapter\";\nimport { TestRunnerProvider, type TestRunnerContext } from \"./context\";\nimport { TestTree } from \"./TestTree\";\nimport { TestDetailPanel } from \"./TestDetailPanel\";\nimport { TestRunSummary } from \"./TestRunSummary\";\nimport { TestFilterBar } from \"./TestFilterBar\";\nimport type { FetchProcessMetrics } from \"./process-metrics\";\n\nexport type TestRunnerProps = {\n tests: Test[];\n /**\n * The full, unfiltered forest driving the filter bar's pills/counts and the\n * header summary — falls back to `tests` when omitted (every existing\n * caller pre-filters `tests` itself). Pass this explicitly when `tests` is a\n * filtered subset of a larger report, so toggling a status filter (e.g.\n * excluding the only failed node) can't make its own pill — or the whole\n * filter bar, once every pill's count reads zero — disappear.\n */\n allTests?: Test[];\n selected: Test | null;\n filters: TestFilters;\n expandAll: boolean | null;\n done: boolean;\n runMeta?: RunMeta;\n status?: SnapshotStatus;\n /** Free-form status line shown next to the title (e.g. \"Running tests...\"). */\n statusText?: string;\n now?: number;\n busy?: { rerun?: boolean; stop?: boolean };\n\n /** Controlled active detail-tab id; omit to let the detail pane own tab state. */\n activeTab?: string;\n /** Called with the picked tab id when `activeTab` is controlled. */\n onTabChange?: (tabId: string) => void;\n activeAttempt?: number;\n onAttemptChange?: (attempt: number) => void;\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n onRerun?: (node: Test) => void;\n onStop?: (node: Test) => void;\n\n /**\n * Reads a live attempt's process (CPU, RSS, open files) by pid. The detail\n * pane polls it every two seconds while the attempt runs, and stops when the\n * attempt finishes or the fetch rejects with `ProcessNotFoundError`.\n */\n fetchProcessMetrics?: FetchProcessMetrics;\n\n /** Domain node adapters, or a pre-built registry. Defaults to default-only. */\n adapters?: TestNodeAdapter[] | TestNodeAdapterRegistry;\n /**\n * Header title. Defaults (when omitted) to the \"Test Results\" beaker heading.\n * Pass `null` to render no title — e.g. a host that owns the title in its own\n * dialog/page header and embeds the runner below it.\n */\n title?: ReactNode;\n /**\n * Render the built-in run summary (counts + progress) in the header. Defaults\n * to true; pass false when the host shows the summary itself (e.g. in a dialog\n * header) to avoid duplicating it.\n */\n showSummary?: boolean;\n /** Run actions at the right end of the one-line header (e.g. re-run, export, copy). */\n headerSlot?: ReactNode;\n /**\n * Suppresses the built-in header bar (title, summary) and the status/tool\n * facets in the tree toolbar.\n * Defaults to false; pass true when a host renders its own combined header\n * (e.g. a dialog header that already embeds `TestRunSummary` and filters) so\n * the runner doesn't render a second bordered bar underneath it.\n */\n hideHeader?: boolean;\n /** Initial left-pane width percentage. */\n defaultSplit?: number;\n startTime?: number | null;\n endTime?: number | null;\n className?: string;\n};\n\nfunction toRegistry(\n adapters: TestNodeAdapter[] | TestNodeAdapterRegistry | undefined,\n): TestNodeAdapterRegistry {\n if (adapters instanceof TestNodeAdapterRegistry) return adapters;\n return createTestRunnerRegistry(adapters ?? []);\n}\n\nconst SPLIT_MIN_WIDTH = 640;\n\n/**\n * Top-level, pure-presentational test runner: a summary/filter header over a\n * resizable tree + detail split. All data and handlers flow in via props and\n * are exposed to sub-components through a single `TestRunnerContext`. Domain\n * rendering is pluggable via node adapters; no fetch/SSE/routing lives here.\n */\nexport function TestRunner({\n tests,\n allTests,\n selected,\n filters,\n expandAll,\n done,\n runMeta,\n status,\n statusText,\n now,\n busy,\n activeTab,\n onTabChange,\n activeAttempt,\n onAttemptChange,\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n fetchProcessMetrics,\n adapters,\n title,\n showSummary = true,\n headerSlot,\n hideHeader = false,\n defaultSplit = 45,\n startTime,\n endTime,\n className,\n}: TestRunnerProps) {\n const registry = useMemo(() => toRegistry(adapters), [adapters]);\n\n const ctx: TestRunnerContext = useMemo(\n () => ({\n tests,\n selected,\n runMeta,\n status,\n done,\n now,\n filters,\n expandAll,\n busy: busy ?? {},\n activeTab,\n onTabChange,\n activeAttempt,\n onAttemptChange,\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n fetchProcessMetrics,\n adapters: registry,\n }),\n [\n tests,\n selected,\n runMeta,\n status,\n done,\n now,\n filters,\n expandAll,\n busy,\n activeTab,\n onTabChange,\n activeAttempt,\n onAttemptChange,\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n fetchProcessMetrics,\n registry,\n ],\n );\n\n const summaryTests = allTests ?? tests;\n const frameworks = useMemo(() => collectFrameworks(summaryTests), [summaryTests]);\n const filterCounts = useMemo(() => aggregateStatusCounts(summaryTests), [summaryTests]);\n // A host that hides the header renders its own filters (see hideHeader).\n const filterBar =\n !hideHeader && summaryTests.length > 0 ? (\n <TestFilterBar\n filters={filters}\n onChange={onFiltersChange}\n counts={filterCounts}\n frameworks={frameworks}\n />\n ) : null;\n // Below this the split leaves both panes too narrow to read, so the runner\n // goes master/detail: the tree, then the selected test with a way back.\n const { ref, wider: roomy } = useContainerWiderThan(SPLIT_MIN_WIDTH);\n\n return (\n <TestRunnerProvider value={ctx}>\n <div ref={ref} className={cn(\"flex h-full min-h-0 flex-col bg-background\", className)}>\n {!hideHeader && (\n <div\n className=\"flex min-w-0 items-center gap-3 border-b border-border bg-card px-density-4 py-density-2\"\n data-runner-header=\"\"\n >\n <div className=\"flex min-w-0 items-center gap-3\">\n {title === undefined ? (\n <h1 className=\"inline-flex shrink-0 items-center gap-1.5 text-base font-bold\">\n <Icon icon={UiBeaker} className=\"text-primary\" />\n Test Results\n </h1>\n ) : (\n title\n )}\n {statusText && (\n <span className=\"truncate text-sm text-muted-foreground\">{statusText}</span>\n )}\n </div>\n {showSummary && (\n <TestRunSummary\n tests={summaryTests}\n startTime={startTime}\n endTime={endTime}\n done={done}\n now={now}\n runMeta={runMeta}\n compact\n className=\"ml-auto flex-nowrap\"\n />\n )}\n {headerSlot && (\n <div className={cn(\"flex shrink-0 items-center gap-1\", !showSummary && \"ml-auto\")}>\n {headerSlot}\n </div>\n )}\n </div>\n )}\n\n {roomy ? (\n <SplitPane\n className=\"min-h-0 flex-1\"\n defaultSplit={defaultSplit}\n minLeft={25}\n minRight={30}\n leftClass=\"border-r-2 border-border bg-muted/30\"\n left={<TestTree actions={filterBar} />}\n right={<TestDetailPanel />}\n />\n ) : selected ? (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <button\n type=\"button\"\n onClick={() => onSelect(null)}\n className=\"inline-flex items-center gap-1.5 border-b border-border px-density-3 py-density-2 text-left text-sm text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon icon={UiArrowLeft} />\n Back to results\n </button>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <TestDetailPanel />\n </div>\n </div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <TestTree actions={filterBar} />\n </div>\n )}\n </div>\n </TestRunnerProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA8FA,SAAS,WACP,UACyB;CACzB,IAAI,oBAAoB,yBAAyB,OAAO;CACxD,OAAO,yBAAyB,YAAY,CAAC,CAAC;AAChD;AAEA,IAAM,kBAAkB;;;;;;;AAQxB,SAAgB,WAAW,EACzB,OACA,UACA,UACA,SACA,WACA,MACA,SACA,QACA,YACA,KACA,MACA,WACA,aACA,eACA,iBACA,UACA,iBACA,mBACA,SACA,QACA,qBACA,UACA,OACA,cAAc,MACd,YACA,aAAa,OACb,eAAe,IACf,WACA,SACA,aACkB;CAClB,MAAM,WAAW,cAAc,WAAW,QAAQ,GAAG,CAAC,QAAQ,CAAC;CAE/D,MAAM,MAAyB,eACtB;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAM,QAAQ,CAAC;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;CACZ,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,MAAM,eAAe,YAAY;CACjC,MAAM,aAAa,cAAc,kBAAkB,YAAY,GAAG,CAAC,YAAY,CAAC;CAChF,MAAM,eAAe,cAAc,sBAAsB,YAAY,GAAG,CAAC,YAAY,CAAC;CAEtF,MAAM,YACJ,CAAC,cAAc,aAAa,SAAS,IACnC,oBAAC,eAAD;EACW;EACT,UAAU;EACV,QAAQ;EACI;CACb,CAAA,IACC;CAGN,MAAM,EAAE,KAAK,OAAO,UAAU,sBAAsB,eAAe;CAEnE,OACE,oBAAC,oBAAD;EAAoB,OAAO;EACzB,UAAA,qBAAC,OAAD;GAAU;GAAK,WAAW,GAAG,8CAA8C,SAAS;GAApF,UAAA,CACG,CAAC,cACA,qBAAC,OAAD;IACE,WAAU;IACV,sBAAmB;IAFrB,UAAA;KAIE,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACG,UAAU,KAAA,IACT,qBAAC,MAAD;OAAI,WAAU;OAAd,UAAA,CACE,oBAAC,MAAD;QAAM,MAAM;QAAU,WAAU;OAAgB,CAAA,GAAC,cAE/C;MAEJ,CAAA,IAAA,OAED,cACC,oBAAC,QAAD;OAAM,WAAU;OAA0C,UAAA;MAAiB,CAAA,CAE1E;;KACJ,eACC,oBAAC,gBAAD;MACE,OAAO;MACI;MACF;MACH;MACD;MACI;MACT,SAAA;MACA,WAAU;KACX,CAAA;KAEF,cACC,oBAAC,OAAD;MAAK,WAAW,GAAG,oCAAoC,CAAC,eAAe,SAAS;MAC7E,UAAA;KACE,CAAA;IAEJ;GAGN,CAAA,GAAA,QACC,oBAAC,WAAD;IACE,WAAU;IACI;IACd,SAAS;IACT,UAAU;IACV,WAAU;IACV,MAAM,oBAAC,UAAD,EAAU,SAAS,UAAY,CAAA;IACrC,OAAO,oBAAC,iBAAD,CAAkB,CAAA;GAC1B,CAAA,IACC,WACF,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,UAAD;KACE,MAAK;KACL,eAAe,SAAS,IAAI;KAC5B,WAAU;KAHZ,UAAA,CAKE,oBAAC,MAAD,EAAM,MAAM,YAAc,CAAA,GAAC,iBAErB;IACR,CAAA,GAAA,oBAAC,OAAD;KAAK,WAAU;KACb,UAAA,oBAAC,iBAAD,CAAkB,CAAA;IACf,CAAA,CACF;GAEL,CAAA,IAAA,oBAAC,OAAD;IAAK,WAAU;IACb,UAAA,oBAAC,UAAD,EAAU,SAAS,UAAY,CAAA;GAC5B,CAAA,CAEJ;;CACa,CAAA;AAExB"}
|
|
1
|
+
{"version":3,"file":"TestRunner.js","names":[],"sources":["../../../src/data/test-runner/TestRunner.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { SplitPane } from \"../../layout/SplitPane\";\nimport { cn } from \"../../lib/utils\";\nimport { UiArrowLeft, UiBeaker } from \"../../icons\";\nimport { useContainerWiderThan } from \"../../hooks/use-container-width\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport { aggregateStatusCounts, collectFrameworks } from \"./status\";\nimport { type TestFilters } from \"./filterState\";\nimport {\n createTestRunnerRegistry,\n type TestNodeAdapter,\n TestNodeAdapterRegistry,\n} from \"./adapter\";\nimport { TestRunnerProvider, type TestRunnerContext } from \"./context\";\nimport { TestTree } from \"./TestTree\";\nimport { TestDetailPanel } from \"./TestDetailPanel\";\nimport { TestRunSummary } from \"./TestRunSummary\";\nimport { TestFilterBar } from \"./TestFilterBar\";\nimport type { FetchProcessMetrics } from \"./process-metrics\";\nimport type { OpenFileTarget } from \"../OpenInFilesLink\";\n\nexport type TestRunnerProps = {\n tests: Test[];\n /**\n * The full, unfiltered forest driving the filter bar's pills/counts and the\n * header summary — falls back to `tests` when omitted (every existing\n * caller pre-filters `tests` itself). Pass this explicitly when `tests` is a\n * filtered subset of a larger report, so toggling a status filter (e.g.\n * excluding the only failed node) can't make its own pill — or the whole\n * filter bar, once every pill's count reads zero — disappear.\n */\n allTests?: Test[];\n selected: Test | null;\n filters: TestFilters;\n expandAll: boolean | null;\n done: boolean;\n runMeta?: RunMeta;\n status?: SnapshotStatus;\n /** Free-form status line shown next to the title (e.g. \"Running tests...\"). */\n statusText?: string;\n now?: number;\n busy?: { rerun?: boolean; stop?: boolean };\n\n /** Controlled active detail-tab id; omit to let the detail pane own tab state. */\n activeTab?: string;\n /** Called with the picked tab id when `activeTab` is controlled. */\n onTabChange?: (tabId: string) => void;\n activeAttempt?: number;\n onAttemptChange?: (attempt: number) => void;\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n onRerun?: (node: Test) => void;\n onStop?: (node: Test) => void;\n /**\n * Called with a test's file, work dir and line when the reader asks to open\n * it in the host's annotated file view. Omit to hide the \"Open in Files\" link.\n */\n onOpenFile?: (target: OpenFileTarget) => void;\n\n /**\n * Reads a live attempt's process (CPU, RSS, open files) by pid. The detail\n * pane polls it every two seconds while the attempt runs, and stops when the\n * attempt finishes or the fetch rejects with `ProcessNotFoundError`.\n */\n fetchProcessMetrics?: FetchProcessMetrics;\n\n /** Domain node adapters, or a pre-built registry. Defaults to default-only. */\n adapters?: TestNodeAdapter[] | TestNodeAdapterRegistry;\n /**\n * Header title. Defaults (when omitted) to the \"Test Results\" beaker heading.\n * Pass `null` to render no title — e.g. a host that owns the title in its own\n * dialog/page header and embeds the runner below it.\n */\n title?: ReactNode;\n /**\n * Render the built-in run summary (counts + progress) in the header. Defaults\n * to true; pass false when the host shows the summary itself (e.g. in a dialog\n * header) to avoid duplicating it.\n */\n showSummary?: boolean;\n /** Run actions at the right end of the one-line header (e.g. re-run, export, copy). */\n headerSlot?: ReactNode;\n /**\n * Suppresses the built-in header bar (title, summary) and the status/tool\n * facets in the tree toolbar.\n * Defaults to false; pass true when a host renders its own combined header\n * (e.g. a dialog header that already embeds `TestRunSummary` and filters) so\n * the runner doesn't render a second bordered bar underneath it.\n */\n hideHeader?: boolean;\n /** Initial left-pane width percentage. */\n defaultSplit?: number;\n startTime?: number | null;\n endTime?: number | null;\n className?: string;\n};\n\nfunction toRegistry(\n adapters: TestNodeAdapter[] | TestNodeAdapterRegistry | undefined,\n): TestNodeAdapterRegistry {\n if (adapters instanceof TestNodeAdapterRegistry) return adapters;\n return createTestRunnerRegistry(adapters ?? []);\n}\n\nconst SPLIT_MIN_WIDTH = 640;\n\n/**\n * Top-level, pure-presentational test runner: a summary/filter header over a\n * resizable tree + detail split. All data and handlers flow in via props and\n * are exposed to sub-components through a single `TestRunnerContext`. Domain\n * rendering is pluggable via node adapters; no fetch/SSE/routing lives here.\n */\nexport function TestRunner({\n tests,\n allTests,\n selected,\n filters,\n expandAll,\n done,\n runMeta,\n status,\n statusText,\n now,\n busy,\n activeTab,\n onTabChange,\n activeAttempt,\n onAttemptChange,\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n onOpenFile,\n fetchProcessMetrics,\n adapters,\n title,\n showSummary = true,\n headerSlot,\n hideHeader = false,\n defaultSplit = 45,\n startTime,\n endTime,\n className,\n}: TestRunnerProps) {\n const registry = useMemo(() => toRegistry(adapters), [adapters]);\n\n const ctx: TestRunnerContext = useMemo(\n () => ({\n tests,\n selected,\n runMeta,\n status,\n done,\n now,\n filters,\n expandAll,\n busy: busy ?? {},\n activeTab,\n onTabChange,\n activeAttempt,\n onAttemptChange,\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n onOpenFile,\n fetchProcessMetrics,\n adapters: registry,\n }),\n [\n tests,\n selected,\n runMeta,\n status,\n done,\n now,\n filters,\n expandAll,\n busy,\n activeTab,\n onTabChange,\n activeAttempt,\n onAttemptChange,\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n onOpenFile,\n fetchProcessMetrics,\n registry,\n ],\n );\n\n const summaryTests = allTests ?? tests;\n const frameworks = useMemo(() => collectFrameworks(summaryTests), [summaryTests]);\n const filterCounts = useMemo(() => aggregateStatusCounts(summaryTests), [summaryTests]);\n // A host that hides the header renders its own filters (see hideHeader).\n const filterBar =\n !hideHeader && summaryTests.length > 0 ? (\n <TestFilterBar\n filters={filters}\n onChange={onFiltersChange}\n counts={filterCounts}\n frameworks={frameworks}\n />\n ) : null;\n // Below this the split leaves both panes too narrow to read, so the runner\n // goes master/detail: the tree, then the selected test with a way back.\n const { ref, wider: roomy } = useContainerWiderThan(SPLIT_MIN_WIDTH);\n\n return (\n <TestRunnerProvider value={ctx}>\n <div ref={ref} className={cn(\"flex h-full min-h-0 flex-col bg-background\", className)}>\n {!hideHeader && (\n <div\n className=\"flex min-w-0 items-center gap-3 border-b border-border bg-card px-density-4 py-density-2\"\n data-runner-header=\"\"\n >\n <div className=\"flex min-w-0 items-center gap-3\">\n {title === undefined ? (\n <h1 className=\"inline-flex shrink-0 items-center gap-1.5 text-base font-bold\">\n <Icon icon={UiBeaker} className=\"text-primary\" />\n Test Results\n </h1>\n ) : (\n title\n )}\n {statusText && (\n <span className=\"truncate text-sm text-muted-foreground\">{statusText}</span>\n )}\n </div>\n {showSummary && (\n <TestRunSummary\n tests={summaryTests}\n startTime={startTime}\n endTime={endTime}\n done={done}\n now={now}\n runMeta={runMeta}\n compact\n className=\"ml-auto flex-nowrap\"\n />\n )}\n {headerSlot && (\n <div className={cn(\"flex shrink-0 items-center gap-1\", !showSummary && \"ml-auto\")}>\n {headerSlot}\n </div>\n )}\n </div>\n )}\n\n {roomy ? (\n <SplitPane\n className=\"min-h-0 flex-1\"\n defaultSplit={defaultSplit}\n minLeft={25}\n minRight={30}\n leftClass=\"border-r-2 border-border bg-muted/30\"\n left={<TestTree actions={filterBar} />}\n right={<TestDetailPanel />}\n />\n ) : selected ? (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <button\n type=\"button\"\n onClick={() => onSelect(null)}\n className=\"inline-flex items-center gap-1.5 border-b border-border px-density-3 py-density-2 text-left text-sm text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon icon={UiArrowLeft} />\n Back to results\n </button>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <TestDetailPanel />\n </div>\n </div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <TestTree actions={filterBar} />\n </div>\n )}\n </div>\n </TestRunnerProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAoGA,SAAS,WACP,UACyB;CACzB,IAAI,oBAAoB,yBAAyB,OAAO;CACxD,OAAO,yBAAyB,YAAY,CAAC,CAAC;AAChD;AAEA,IAAM,kBAAkB;;;;;;;AAQxB,SAAgB,WAAW,EACzB,OACA,UACA,UACA,SACA,WACA,MACA,SACA,QACA,YACA,KACA,MACA,WACA,aACA,eACA,iBACA,UACA,iBACA,mBACA,SACA,QACA,YACA,qBACA,UACA,OACA,cAAc,MACd,YACA,aAAa,OACb,eAAe,IACf,WACA,SACA,aACkB;CAClB,MAAM,WAAW,cAAc,WAAW,QAAQ,GAAG,CAAC,QAAQ,CAAC;CAE/D,MAAM,MAAyB,eACtB;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAM,QAAQ,CAAC;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;CACZ,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,MAAM,eAAe,YAAY;CACjC,MAAM,aAAa,cAAc,kBAAkB,YAAY,GAAG,CAAC,YAAY,CAAC;CAChF,MAAM,eAAe,cAAc,sBAAsB,YAAY,GAAG,CAAC,YAAY,CAAC;CAEtF,MAAM,YACJ,CAAC,cAAc,aAAa,SAAS,IACnC,oBAAC,eAAD;EACW;EACT,UAAU;EACV,QAAQ;EACI;CACb,CAAA,IACC;CAGN,MAAM,EAAE,KAAK,OAAO,UAAU,sBAAsB,eAAe;CAEnE,OACE,oBAAC,oBAAD;EAAoB,OAAO;EACzB,UAAA,qBAAC,OAAD;GAAU;GAAK,WAAW,GAAG,8CAA8C,SAAS;GAApF,UAAA,CACG,CAAC,cACA,qBAAC,OAAD;IACE,WAAU;IACV,sBAAmB;IAFrB,UAAA;KAIE,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACG,UAAU,KAAA,IACT,qBAAC,MAAD;OAAI,WAAU;OAAd,UAAA,CACE,oBAAC,MAAD;QAAM,MAAM;QAAU,WAAU;OAAgB,CAAA,GAAC,cAE/C;MAEJ,CAAA,IAAA,OAED,cACC,oBAAC,QAAD;OAAM,WAAU;OAA0C,UAAA;MAAiB,CAAA,CAE1E;;KACJ,eACC,oBAAC,gBAAD;MACE,OAAO;MACI;MACF;MACH;MACD;MACI;MACT,SAAA;MACA,WAAU;KACX,CAAA;KAEF,cACC,oBAAC,OAAD;MAAK,WAAW,GAAG,oCAAoC,CAAC,eAAe,SAAS;MAC7E,UAAA;KACE,CAAA;IAEJ;GAGN,CAAA,GAAA,QACC,oBAAC,WAAD;IACE,WAAU;IACI;IACd,SAAS;IACT,UAAU;IACV,WAAU;IACV,MAAM,oBAAC,UAAD,EAAU,SAAS,UAAY,CAAA;IACrC,OAAO,oBAAC,iBAAD,CAAkB,CAAA;GAC1B,CAAA,IACC,WACF,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,UAAD;KACE,MAAK;KACL,eAAe,SAAS,IAAI;KAC5B,WAAU;KAHZ,UAAA,CAKE,oBAAC,MAAD,EAAM,MAAM,YAAc,CAAA,GAAC,iBAErB;IACR,CAAA,GAAA,oBAAC,OAAD;KAAK,WAAU;KACb,UAAA,oBAAC,iBAAD,CAAkB,CAAA;IACf,CAAA,CACF;GAEL,CAAA,IAAA,oBAAC,OAAD;IAAK,WAAU;IACb,UAAA,oBAAC,UAAD,EAAU,SAAS,UAAY,CAAA;GAC5B,CAAA,CAEJ;;CACa,CAAA;AAExB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.cjs","names":["createContext","useContext"],"sources":["../../../src/data/test-runner/context.ts"],"sourcesContent":["// A single context object carries all runner state + handlers, provided once\n// and read by every sub-component via useTestRunner() — instead of threading\n// onRerun/onStop/selected/runMeta/... through each component's props. Matches\n// clicky's existing Provider idiom (ClickyRuntimeProvider / TagActionsProvider).\n\nimport { createContext, useContext } from \"react\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport type { TestFilters } from \"./filterState\";\nimport type { TestNodeAdapterRegistry } from \"./adapter\";\nimport type { FetchProcessMetrics } from \"./process-metrics\";\n\nexport type TestRunnerContext = {\n /** The (already filtered, host-owned) test forest to render. */\n tests: Test[];\n /** Currently selected node, or null. */\n selected: Test | null;\n runMeta?: RunMeta | undefined;\n /** Run status flags (data only — no transport lives here). */\n status?: SnapshotStatus | undefined;\n /** Whether the run has finished. */\n done: boolean;\n /**\n * Injected wall-clock epoch ms for elapsed-time display. Kept as data so the\n * summary stays pure and testable; hosts pass `Date.now()`.\n */\n now?: number | undefined;\n /** Active status/framework filters. */\n filters: TestFilters;\n /** Tri-state expand-all: true (all open), false (all closed), null (default). */\n expandAll: boolean | null;\n /** In-flight action flags driving button disabled/spinner states. */\n busy: { rerun?: boolean; stop?: boolean };\n\n /**\n * Active detail-tab id. When provided, TestDetailPanel renders this tab\n * (controlled); when omitted it keeps its own internal tab state.\n */\n activeTab?: string | undefined;\n /** Called with the picked tab id when the detail tab is controlled. */\n onTabChange?: ((tabId: string) => void) | undefined;\n activeAttempt?: number | undefined;\n onAttemptChange?: ((attempt: number) => void) | undefined;\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n /** Optional — when absent, the rerun affordance is hidden. */\n onRerun?: ((node: Test) => void) | undefined;\n /** Optional — when absent, the stop affordance is hidden. */\n onStop?: ((node: Test) => void) | undefined;\n\n /**\n * Reads a live attempt's process by pid, polled every two seconds while the\n * attempt runs. Absent: live attempts show only what the attempt recorded.\n */\n fetchProcessMetrics?: FetchProcessMetrics | undefined;\n\n /** Node adapters driving domain-specific rendering. */\n adapters: TestNodeAdapterRegistry;\n};\n\nconst Context = createContext<TestRunnerContext | null>(null);\n\nexport const TestRunnerProvider = Context.Provider;\n\nexport function useTestRunner(): TestRunnerContext {\n const ctx = useContext(Context);\n if (!ctx) {\n throw new Error(\"useTestRunner must be used within a <TestRunner> / TestRunnerProvider\");\n }\n return ctx;\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"context.cjs","names":["createContext","useContext"],"sources":["../../../src/data/test-runner/context.ts"],"sourcesContent":["// A single context object carries all runner state + handlers, provided once\n// and read by every sub-component via useTestRunner() — instead of threading\n// onRerun/onStop/selected/runMeta/... through each component's props. Matches\n// clicky's existing Provider idiom (ClickyRuntimeProvider / TagActionsProvider).\n\nimport { createContext, useContext } from \"react\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport type { TestFilters } from \"./filterState\";\nimport type { TestNodeAdapterRegistry } from \"./adapter\";\nimport type { FetchProcessMetrics } from \"./process-metrics\";\nimport type { OpenFileTarget } from \"../OpenInFilesLink\";\n\nexport type TestRunnerContext = {\n /** The (already filtered, host-owned) test forest to render. */\n tests: Test[];\n /** Currently selected node, or null. */\n selected: Test | null;\n runMeta?: RunMeta | undefined;\n /** Run status flags (data only — no transport lives here). */\n status?: SnapshotStatus | undefined;\n /** Whether the run has finished. */\n done: boolean;\n /**\n * Injected wall-clock epoch ms for elapsed-time display. Kept as data so the\n * summary stays pure and testable; hosts pass `Date.now()`.\n */\n now?: number | undefined;\n /** Active status/framework filters. */\n filters: TestFilters;\n /** Tri-state expand-all: true (all open), false (all closed), null (default). */\n expandAll: boolean | null;\n /** In-flight action flags driving button disabled/spinner states. */\n busy: { rerun?: boolean; stop?: boolean };\n\n /**\n * Active detail-tab id. When provided, TestDetailPanel renders this tab\n * (controlled); when omitted it keeps its own internal tab state.\n */\n activeTab?: string | undefined;\n /** Called with the picked tab id when the detail tab is controlled. */\n onTabChange?: ((tabId: string) => void) | undefined;\n activeAttempt?: number | undefined;\n onAttemptChange?: ((attempt: number) => void) | undefined;\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n /** Optional — when absent, the rerun affordance is hidden. */\n onRerun?: ((node: Test) => void) | undefined;\n /** Optional — when absent, the stop affordance is hidden. */\n onStop?: ((node: Test) => void) | undefined;\n /** Optional — when absent, the \"Open in Files\" link is hidden. */\n onOpenFile?: ((target: OpenFileTarget) => void) | undefined;\n\n /**\n * Reads a live attempt's process by pid, polled every two seconds while the\n * attempt runs. Absent: live attempts show only what the attempt recorded.\n */\n fetchProcessMetrics?: FetchProcessMetrics | undefined;\n\n /** Node adapters driving domain-specific rendering. */\n adapters: TestNodeAdapterRegistry;\n};\n\nconst Context = createContext<TestRunnerContext | null>(null);\n\nexport const TestRunnerProvider = Context.Provider;\n\nexport function useTestRunner(): TestRunnerContext {\n const ctx = useContext(Context);\n if (!ctx) {\n throw new Error(\"useTestRunner must be used within a <TestRunner> / TestRunnerProvider\");\n }\n return ctx;\n}\n"],"mappings":";;AAgEA,IAAM,WAAA,GAAUA,MAAAA,cAAAA,CAAwC,IAAI;AAE5D,IAAa,qBAAqB,QAAQ;AAE1C,SAAgB,gBAAmC;CACjD,MAAM,OAAA,GAAMC,MAAAA,WAAAA,CAAW,OAAO;CAC9B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,uEAAuE;CAEzF,OAAO;AACT"}
|
|
@@ -2,6 +2,7 @@ import { RunMeta, SnapshotStatus, Test } from './types.js';
|
|
|
2
2
|
import { TestFilters } from './filterState.js';
|
|
3
3
|
import { TestNodeAdapterRegistry } from './adapter.js';
|
|
4
4
|
import { FetchProcessMetrics } from './process-metrics.js';
|
|
5
|
+
import { OpenFileTarget } from '../OpenInFilesLink.js';
|
|
5
6
|
export type TestRunnerContext = {
|
|
6
7
|
/** The (already filtered, host-owned) test forest to render. */
|
|
7
8
|
tests: Test[];
|
|
@@ -42,6 +43,8 @@ export type TestRunnerContext = {
|
|
|
42
43
|
onRerun?: ((node: Test) => void) | undefined;
|
|
43
44
|
/** Optional — when absent, the stop affordance is hidden. */
|
|
44
45
|
onStop?: ((node: Test) => void) | undefined;
|
|
46
|
+
/** Optional — when absent, the "Open in Files" link is hidden. */
|
|
47
|
+
onOpenFile?: ((target: OpenFileTarget) => void) | undefined;
|
|
45
48
|
/**
|
|
46
49
|
* Reads a live attempt's process by pid, polled every two seconds while the
|
|
47
50
|
* attempt runs. Absent: live attempts show only what the attempt recorded.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/context.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/context.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gEAAgE;IAChE,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,wCAAwC;IACxC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACpC,oCAAoC;IACpC,IAAI,EAAE,OAAO,CAAC;IACd;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,uCAAuC;IACvC,OAAO,EAAE,WAAW,CAAC;IACrB,iFAAiF;IACjF,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,qEAAqE;IACrE,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAE1C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,uEAAuE;IACvE,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACpD,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,eAAe,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAE1D,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACtC,eAAe,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,8DAA8D;IAC9D,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7C,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5C,kEAAkE;IAClE,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAE5D;;;OAGG;IACH,mBAAmB,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAEtD,uDAAuD;IACvD,QAAQ,EAAE,uBAAuB,CAAC;CACnC,CAAC;AAIF,eAAO,MAAM,kBAAkB,oDAAmB,CAAC;AAEnD,wBAAgB,aAAa,IAAI,iBAAiB,CAMjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../src/data/test-runner/context.ts"],"sourcesContent":["// A single context object carries all runner state + handlers, provided once\n// and read by every sub-component via useTestRunner() — instead of threading\n// onRerun/onStop/selected/runMeta/... through each component's props. Matches\n// clicky's existing Provider idiom (ClickyRuntimeProvider / TagActionsProvider).\n\nimport { createContext, useContext } from \"react\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport type { TestFilters } from \"./filterState\";\nimport type { TestNodeAdapterRegistry } from \"./adapter\";\nimport type { FetchProcessMetrics } from \"./process-metrics\";\n\nexport type TestRunnerContext = {\n /** The (already filtered, host-owned) test forest to render. */\n tests: Test[];\n /** Currently selected node, or null. */\n selected: Test | null;\n runMeta?: RunMeta | undefined;\n /** Run status flags (data only — no transport lives here). */\n status?: SnapshotStatus | undefined;\n /** Whether the run has finished. */\n done: boolean;\n /**\n * Injected wall-clock epoch ms for elapsed-time display. Kept as data so the\n * summary stays pure and testable; hosts pass `Date.now()`.\n */\n now?: number | undefined;\n /** Active status/framework filters. */\n filters: TestFilters;\n /** Tri-state expand-all: true (all open), false (all closed), null (default). */\n expandAll: boolean | null;\n /** In-flight action flags driving button disabled/spinner states. */\n busy: { rerun?: boolean; stop?: boolean };\n\n /**\n * Active detail-tab id. When provided, TestDetailPanel renders this tab\n * (controlled); when omitted it keeps its own internal tab state.\n */\n activeTab?: string | undefined;\n /** Called with the picked tab id when the detail tab is controlled. */\n onTabChange?: ((tabId: string) => void) | undefined;\n activeAttempt?: number | undefined;\n onAttemptChange?: ((attempt: number) => void) | undefined;\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n /** Optional — when absent, the rerun affordance is hidden. */\n onRerun?: ((node: Test) => void) | undefined;\n /** Optional — when absent, the stop affordance is hidden. */\n onStop?: ((node: Test) => void) | undefined;\n\n /**\n * Reads a live attempt's process by pid, polled every two seconds while the\n * attempt runs. Absent: live attempts show only what the attempt recorded.\n */\n fetchProcessMetrics?: FetchProcessMetrics | undefined;\n\n /** Node adapters driving domain-specific rendering. */\n adapters: TestNodeAdapterRegistry;\n};\n\nconst Context = createContext<TestRunnerContext | null>(null);\n\nexport const TestRunnerProvider = Context.Provider;\n\nexport function useTestRunner(): TestRunnerContext {\n const ctx = useContext(Context);\n if (!ctx) {\n throw new Error(\"useTestRunner must be used within a <TestRunner> / TestRunnerProvider\");\n }\n return ctx;\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../src/data/test-runner/context.ts"],"sourcesContent":["// A single context object carries all runner state + handlers, provided once\n// and read by every sub-component via useTestRunner() — instead of threading\n// onRerun/onStop/selected/runMeta/... through each component's props. Matches\n// clicky's existing Provider idiom (ClickyRuntimeProvider / TagActionsProvider).\n\nimport { createContext, useContext } from \"react\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport type { TestFilters } from \"./filterState\";\nimport type { TestNodeAdapterRegistry } from \"./adapter\";\nimport type { FetchProcessMetrics } from \"./process-metrics\";\nimport type { OpenFileTarget } from \"../OpenInFilesLink\";\n\nexport type TestRunnerContext = {\n /** The (already filtered, host-owned) test forest to render. */\n tests: Test[];\n /** Currently selected node, or null. */\n selected: Test | null;\n runMeta?: RunMeta | undefined;\n /** Run status flags (data only — no transport lives here). */\n status?: SnapshotStatus | undefined;\n /** Whether the run has finished. */\n done: boolean;\n /**\n * Injected wall-clock epoch ms for elapsed-time display. Kept as data so the\n * summary stays pure and testable; hosts pass `Date.now()`.\n */\n now?: number | undefined;\n /** Active status/framework filters. */\n filters: TestFilters;\n /** Tri-state expand-all: true (all open), false (all closed), null (default). */\n expandAll: boolean | null;\n /** In-flight action flags driving button disabled/spinner states. */\n busy: { rerun?: boolean; stop?: boolean };\n\n /**\n * Active detail-tab id. When provided, TestDetailPanel renders this tab\n * (controlled); when omitted it keeps its own internal tab state.\n */\n activeTab?: string | undefined;\n /** Called with the picked tab id when the detail tab is controlled. */\n onTabChange?: ((tabId: string) => void) | undefined;\n activeAttempt?: number | undefined;\n onAttemptChange?: ((attempt: number) => void) | undefined;\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n /** Optional — when absent, the rerun affordance is hidden. */\n onRerun?: ((node: Test) => void) | undefined;\n /** Optional — when absent, the stop affordance is hidden. */\n onStop?: ((node: Test) => void) | undefined;\n /** Optional — when absent, the \"Open in Files\" link is hidden. */\n onOpenFile?: ((target: OpenFileTarget) => void) | undefined;\n\n /**\n * Reads a live attempt's process by pid, polled every two seconds while the\n * attempt runs. Absent: live attempts show only what the attempt recorded.\n */\n fetchProcessMetrics?: FetchProcessMetrics | undefined;\n\n /** Node adapters driving domain-specific rendering. */\n adapters: TestNodeAdapterRegistry;\n};\n\nconst Context = createContext<TestRunnerContext | null>(null);\n\nexport const TestRunnerProvider = Context.Provider;\n\nexport function useTestRunner(): TestRunnerContext {\n const ctx = useContext(Context);\n if (!ctx) {\n throw new Error(\"useTestRunner must be used within a <TestRunner> / TestRunnerProvider\");\n }\n return ctx;\n}\n"],"mappings":";;AAgEA,IAAM,UAAU,cAAwC,IAAI;AAE5D,IAAa,qBAAqB,QAAQ;AAE1C,SAAgB,gBAAmC;CACjD,MAAM,MAAM,WAAW,OAAO;CAC9B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,uEAAuE;CAEzF,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/types.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,WAAW,CAAC;IACvE,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;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;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wEAAwE;AACxE,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const require_timeseries_stream = require("./timeseries-stream.cjs");
|
|
2
|
+
let react = require("react");
|
|
1
3
|
let _tanstack_react_query = require("@tanstack/react-query");
|
|
2
4
|
// src/data/timeseries-query.ts
|
|
3
5
|
var defaultTimeseriesFetcher = async (url) => {
|
|
@@ -44,9 +46,102 @@ function timeseriesQueryOptions(source, { baseUrl = "", range, refreshMs, fetche
|
|
|
44
46
|
queryFn: () => fetcher(requestUrl)
|
|
45
47
|
};
|
|
46
48
|
}
|
|
47
|
-
|
|
49
|
+
var noStream = () => () => {};
|
|
50
|
+
function queryResult(id, query) {
|
|
51
|
+
const { data } = query;
|
|
52
|
+
return {
|
|
53
|
+
series: data ? [{
|
|
54
|
+
id,
|
|
55
|
+
source: id,
|
|
56
|
+
points: data.points
|
|
57
|
+
}] : void 0,
|
|
58
|
+
isLoading: query.isLoading,
|
|
59
|
+
error: query.error
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A streamed source's result, reported under the id the widget requested
|
|
64
|
+
* (which differs from the streamed id for a single-`url` panel).
|
|
65
|
+
*/
|
|
66
|
+
function streamResult(requestedId, registration, groups) {
|
|
67
|
+
const group = groups.get(require_timeseries_stream.timeseriesStreamGroupKey(registration)) ?? require_timeseries_stream.EMPTY_TIMESERIES_STREAM_GROUP;
|
|
68
|
+
const streamedId = registration.id;
|
|
69
|
+
const answered = group.answered.has(streamedId);
|
|
70
|
+
const held = group.bySource.get(streamedId) ?? [];
|
|
71
|
+
const series = requestedId === streamedId ? held : held.map((s) => ({
|
|
72
|
+
...s,
|
|
73
|
+
source: requestedId,
|
|
74
|
+
...s.id === streamedId ? { id: requestedId } : {}
|
|
75
|
+
}));
|
|
76
|
+
return {
|
|
77
|
+
series: answered ? series : void 0,
|
|
78
|
+
isLoading: !answered && group.error === null,
|
|
79
|
+
error: group.error
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
var NO_GROUPS = /* @__PURE__ */ new Map();
|
|
83
|
+
/**
|
|
84
|
+
* Reads every source; results are index-aligned with `sources`. Under a
|
|
85
|
+
* {@link TimeseriesStreamProvider} the URL-backed sources of a live widget
|
|
86
|
+
* (`refreshMs > 0`) come from their stream group (see
|
|
87
|
+
* {@link timeseriesStreamAddress}); sources with a `load`, and every source
|
|
88
|
+
* outside a provider, are fetched per source and re-polled every `refreshMs`.
|
|
89
|
+
*/
|
|
48
90
|
function useTimeseriesQueries(sources, options) {
|
|
49
|
-
|
|
91
|
+
const stream = require_timeseries_stream.useTimeseriesStream();
|
|
92
|
+
const { range } = options;
|
|
93
|
+
const interval = require_timeseries_stream.timeseriesStreamInterval(options.refreshMs);
|
|
94
|
+
const registrations = sources.map((source) => {
|
|
95
|
+
if (!stream || interval === null || source.load) return null;
|
|
96
|
+
const address = require_timeseries_stream.timeseriesStreamAddress(options.baseUrl ?? "", source.id);
|
|
97
|
+
return address ? {
|
|
98
|
+
...address,
|
|
99
|
+
range,
|
|
100
|
+
interval
|
|
101
|
+
} : null;
|
|
102
|
+
});
|
|
103
|
+
const queries = (0, _tanstack_react_query.useQueries)({ queries: sources.map((source, i) => ({
|
|
104
|
+
...timeseriesQueryOptions(source, options),
|
|
105
|
+
enabled: registrations[i] === null
|
|
106
|
+
})) });
|
|
107
|
+
const registrationsKey = JSON.stringify(registrations.filter((r) => r !== null));
|
|
108
|
+
(0, react.useEffect)(() => {
|
|
109
|
+
const active = JSON.parse(registrationsKey);
|
|
110
|
+
if (!stream || active.length === 0) return;
|
|
111
|
+
const unregister = active.map((registration) => stream.register(registration));
|
|
112
|
+
return () => unregister.forEach((off) => off());
|
|
113
|
+
}, [stream, registrationsKey]);
|
|
114
|
+
const groups = (0, react.useSyncExternalStore)(stream ? stream.subscribe : noStream, () => stream ? stream.getSnapshot() : NO_GROUPS);
|
|
115
|
+
return sources.map((source, i) => {
|
|
116
|
+
const registration = registrations[i];
|
|
117
|
+
return registration ? streamResult(source.id, registration, groups) : queryResult(source.id, queries[i]);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The one series a single-value widget (gauge, core bars) reads from a
|
|
122
|
+
* result: the series whose id is the requested id, else the only series. An
|
|
123
|
+
* id that expanded into several series has no single reading, so it is an
|
|
124
|
+
* error rather than an arbitrary pick.
|
|
125
|
+
*/
|
|
126
|
+
function soleSeries(id, result) {
|
|
127
|
+
if (!result) return {
|
|
128
|
+
data: void 0,
|
|
129
|
+
error: null
|
|
130
|
+
};
|
|
131
|
+
if (result.error) return {
|
|
132
|
+
data: void 0,
|
|
133
|
+
error: result.error
|
|
134
|
+
};
|
|
135
|
+
const list = result.series ?? [];
|
|
136
|
+
const data = list.find((s) => s.id === id) ?? (list.length === 1 ? list[0] : void 0);
|
|
137
|
+
if (!data && list.length > 1) return {
|
|
138
|
+
data: void 0,
|
|
139
|
+
error: /* @__PURE__ */ new Error(`metric ${id} expanded into ${list.length} series; this widget shows one`)
|
|
140
|
+
};
|
|
141
|
+
return {
|
|
142
|
+
data,
|
|
143
|
+
error: null
|
|
144
|
+
};
|
|
50
145
|
}
|
|
51
146
|
/** The value of the last point, or undefined when the series is empty. */
|
|
52
147
|
function latestValue(resp) {
|
|
@@ -56,6 +151,7 @@ function latestValue(resp) {
|
|
|
56
151
|
}
|
|
57
152
|
exports.defaultTimeseriesFetcher = defaultTimeseriesFetcher;
|
|
58
153
|
exports.latestValue = latestValue;
|
|
154
|
+
exports.soleSeries = soleSeries;
|
|
59
155
|
exports.timeseriesQueryOptions = timeseriesQueryOptions;
|
|
60
156
|
exports.timeseriesRequestUrl = timeseriesRequestUrl;
|
|
61
157
|
exports.useTimeseriesQueries = useTimeseriesQueries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeseries-query.cjs","names":["useQueries"],"sources":["../../src/data/timeseries-query.ts"],"sourcesContent":["import { useQueries, type UseQueryOptions, type UseQueryResult } from \"@tanstack/react-query\";\nimport type { SeriesLoader, TimeseriesResponse } from \"./TimeseriesPanel.model\";\n\n/** Loads a metric by URL; the legacy data path of the timeseries widgets. */\nexport type TimeseriesFetcher = (url: string) => Promise<TimeseriesResponse>;\n\n/** One series the widgets poll: a metric id, optionally backed by a loader. */\nexport interface TimeseriesSource {\n id: string;\n load?: SeriesLoader | undefined;\n}\n\nexport interface TimeseriesQueryOptions {\n /** Prefix for URL-backed sources; ignored by sources with a `load`. */\n baseUrl?: string;\n range: string;\n refreshMs: number;\n fetcher: TimeseriesFetcher;\n}\n\nexport const defaultTimeseriesFetcher: TimeseriesFetcher = async (url) => {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`metrics request failed: ${res.status}`);\n return res.json();\n};\n\n/** `baseUrl + id` resolved to a same-origin path with `?since=<range>`. */\nexport function timeseriesRequestUrl(url: string, range: string): string {\n const u = new URL(url, window.location.origin);\n if (range) u.searchParams.set(\"since\", range);\n return u.pathname + u.search;\n}\n\n/**\n * The react-query options for one series. URL-backed sources key on the\n * request URL (unchanged from before loaders existed); loader-backed sources\n * key on `[\"timeseries\", \"load\", id, range]`, so the id is the cache identity\n * and callers must keep it unique per data source.\n */\nexport function timeseriesQueryOptions(\n source: TimeseriesSource,\n { baseUrl = \"\", range, refreshMs, fetcher }: TimeseriesQueryOptions,\n): UseQueryOptions<TimeseriesResponse, Error, TimeseriesResponse, readonly unknown[]> {\n const shared = {\n refetchInterval: refreshMs > 0 ? refreshMs : (false as const),\n staleTime: 0,\n retry: 0,\n };\n const { load } = source;\n if (load) {\n return {\n ...shared,\n queryKey: [\"timeseries\", \"load\", source.id, range],\n queryFn: ({ signal }: { signal: AbortSignal }) => load({ range, signal }),\n };\n }\n const requestUrl = timeseriesRequestUrl(baseUrl + source.id, range);\n return {\n ...shared,\n queryKey: [\"timeseries\", requestUrl],\n queryFn: () => fetcher(requestUrl),\n };\n}\n\n/** Polls every source in parallel; results are index-aligned with `sources`. */\nexport function useTimeseriesQueries(\n sources: readonly TimeseriesSource[],\n options: TimeseriesQueryOptions,\n): UseQueryResult<TimeseriesResponse>[] {\n return useQueries({\n queries: sources.map((source) => timeseriesQueryOptions(source, options)),\n });\n}\n\n/** The value of the last point, or undefined when the series is empty. */\nexport function latestValue(resp: TimeseriesResponse | undefined): number | undefined {\n const points = resp?.points;\n if (!points || points.length === 0) return undefined;\n return points[points.length - 1]?.value;\n}\n"],"mappings":";;AAoBA,IAAa,2BAA8C,OAAO,QAAQ;CACxE,MAAM,MAAM,MAAM,MAAM,GAAG;CAC3B,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,2BAA2B,IAAI,QAAQ;CACpE,OAAO,IAAI,KAAK;AAClB;;AAGA,SAAgB,qBAAqB,KAAa,OAAuB;CACvE,MAAM,IAAI,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM;CAC7C,IAAI,OAAO,EAAE,aAAa,IAAI,SAAS,KAAK;CAC5C,OAAO,EAAE,WAAW,EAAE;AACxB;;;;;;;AAQA,SAAgB,uBACd,QACA,EAAE,UAAU,IAAI,OAAO,WAAW,WACkD;CACpF,MAAM,SAAS;EACb,iBAAiB,YAAY,IAAI,YAAa;EAC9C,WAAW;EACX,OAAO;CACT;CACA,MAAM,EAAE,SAAS;CACjB,IAAI,MACF,OAAO;EACL,GAAG;EACH,UAAU;GAAC;GAAc;GAAQ,OAAO;GAAI;EAAK;EACjD,UAAU,EAAE,aAAsC,KAAK;GAAE;GAAO;EAAO,CAAC;CAC1E;CAEF,MAAM,aAAa,qBAAqB,UAAU,OAAO,IAAI,KAAK;CAClE,OAAO;EACL,GAAG;EACH,UAAU,CAAC,cAAc,UAAU;EACnC,eAAe,QAAQ,UAAU;CACnC;AACF;;AAGA,SAAgB,qBACd,SACA,SACsC;CACtC,QAAA,GAAOA,sBAAAA,WAAAA,CAAW,EAChB,SAAS,QAAQ,KAAK,WAAW,uBAAuB,QAAQ,OAAO,CAAC,EAC1E,CAAC;AACH;;AAGA,SAAgB,YAAY,MAA0D;CACpF,MAAM,SAAS,MAAM;CACrB,IAAI,CAAC,UAAU,OAAO,WAAW,GAAG,OAAO,KAAA;CAC3C,OAAO,OAAO,OAAO,SAAS,EAAE,EAAE;AACpC"}
|
|
1
|
+
{"version":3,"file":"timeseries-query.cjs","names":["timeseriesStreamGroupKey","EMPTY_TIMESERIES_STREAM_GROUP","useTimeseriesStream","timeseriesStreamInterval","timeseriesStreamAddress","useQueries","useSyncExternalStore"],"sources":["../../src/data/timeseries-query.ts"],"sourcesContent":["import { useQueries, type UseQueryOptions, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useEffect, useSyncExternalStore } from \"react\";\nimport type { SeriesLoader, TimeseriesResponse, TimeseriesServerSeries } from \"./TimeseriesPanel.model\";\nimport {\n EMPTY_TIMESERIES_STREAM_GROUP,\n timeseriesStreamAddress,\n timeseriesStreamGroupKey,\n timeseriesStreamInterval,\n useTimeseriesStream,\n type TimeseriesStreamGroupState,\n type TimeseriesStreamRegistration,\n} from \"./timeseries-stream\";\n\n/** Loads a metric by URL; the legacy data path of the timeseries widgets. */\nexport type TimeseriesFetcher = (url: string) => Promise<TimeseriesResponse>;\n\n/** One series the widgets poll: a metric id, optionally backed by a loader. */\nexport interface TimeseriesSource {\n id: string;\n load?: SeriesLoader | undefined;\n}\n\nexport interface TimeseriesQueryOptions {\n /** Prefix for URL-backed sources; ignored by sources with a `load`. */\n baseUrl?: string;\n range: string;\n refreshMs: number;\n fetcher: TimeseriesFetcher;\n}\n\nexport const defaultTimeseriesFetcher: TimeseriesFetcher = async (url) => {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`metrics request failed: ${res.status}`);\n return res.json();\n};\n\n/** `baseUrl + id` resolved to a same-origin path with `?since=<range>`. */\nexport function timeseriesRequestUrl(url: string, range: string): string {\n const u = new URL(url, window.location.origin);\n if (range) u.searchParams.set(\"since\", range);\n return u.pathname + u.search;\n}\n\n/**\n * The react-query options for one series. URL-backed sources key on the\n * request URL (unchanged from before loaders existed); loader-backed sources\n * key on `[\"timeseries\", \"load\", id, range]`, so the id is the cache identity\n * and callers must keep it unique per data source.\n */\nexport function timeseriesQueryOptions(\n source: TimeseriesSource,\n { baseUrl = \"\", range, refreshMs, fetcher }: TimeseriesQueryOptions,\n): UseQueryOptions<TimeseriesResponse, Error, TimeseriesResponse, readonly unknown[]> {\n const shared = {\n refetchInterval: refreshMs > 0 ? refreshMs : (false as const),\n staleTime: 0,\n retry: 0,\n };\n const { load } = source;\n if (load) {\n return {\n ...shared,\n queryKey: [\"timeseries\", \"load\", source.id, range],\n queryFn: ({ signal }: { signal: AbortSignal }) => load({ range, signal }),\n };\n }\n const requestUrl = timeseriesRequestUrl(baseUrl + source.id, range);\n return {\n ...shared,\n queryKey: [\"timeseries\", requestUrl],\n queryFn: () => fetcher(requestUrl),\n };\n}\n\n/** What one requested source resolved to. */\nexport interface TimeseriesSourceResult {\n /**\n * Every series the source answered with: one for a polled or loaded id,\n * each expansion for a streamed id (possibly none). Undefined until answered.\n */\n series: readonly TimeseriesServerSeries[] | undefined;\n isLoading: boolean;\n error: Error | null;\n}\n\nconst noStream = () => () => {};\n\nfunction queryResult(id: string, query: UseQueryResult<TimeseriesResponse>): TimeseriesSourceResult {\n const { data } = query;\n return {\n series: data ? [{ id, source: id, points: data.points }] : undefined,\n isLoading: query.isLoading,\n error: query.error,\n };\n}\n\n/**\n * A streamed source's result, reported under the id the widget requested\n * (which differs from the streamed id for a single-`url` panel).\n */\nfunction streamResult(\n requestedId: string,\n registration: TimeseriesStreamRegistration,\n groups: ReadonlyMap<string, TimeseriesStreamGroupState>,\n): TimeseriesSourceResult {\n const group = groups.get(timeseriesStreamGroupKey(registration)) ?? EMPTY_TIMESERIES_STREAM_GROUP;\n const streamedId = registration.id;\n const answered = group.answered.has(streamedId);\n const held = group.bySource.get(streamedId) ?? [];\n const series =\n requestedId === streamedId\n ? held\n : held.map((s) => ({ ...s, source: requestedId, ...(s.id === streamedId ? { id: requestedId } : {}) }));\n return {\n series: answered ? series : undefined,\n isLoading: !answered && group.error === null,\n error: group.error,\n };\n}\n\nconst NO_GROUPS: ReadonlyMap<string, TimeseriesStreamGroupState> = new Map();\n\n/**\n * Reads every source; results are index-aligned with `sources`. Under a\n * {@link TimeseriesStreamProvider} the URL-backed sources of a live widget\n * (`refreshMs > 0`) come from their stream group (see\n * {@link timeseriesStreamAddress}); sources with a `load`, and every source\n * outside a provider, are fetched per source and re-polled every `refreshMs`.\n */\nexport function useTimeseriesQueries(\n sources: readonly TimeseriesSource[],\n options: TimeseriesQueryOptions,\n): TimeseriesSourceResult[] {\n const stream = useTimeseriesStream();\n const { range } = options;\n const interval = timeseriesStreamInterval(options.refreshMs);\n const registrations = sources.map((source): TimeseriesStreamRegistration | null => {\n if (!stream || interval === null || source.load) return null;\n const address = timeseriesStreamAddress(options.baseUrl ?? \"\", source.id);\n return address ? { ...address, range, interval } : null;\n });\n const queries = useQueries({\n queries: sources.map((source, i) => ({\n ...timeseriesQueryOptions(source, options),\n enabled: registrations[i] === null,\n })),\n });\n\n const registrationsKey = JSON.stringify(registrations.filter((r) => r !== null));\n useEffect(() => {\n const active = JSON.parse(registrationsKey) as TimeseriesStreamRegistration[];\n if (!stream || active.length === 0) return;\n const unregister = active.map((registration) => stream.register(registration));\n return () => unregister.forEach((off) => off());\n }, [stream, registrationsKey]);\n\n const groups = useSyncExternalStore(\n stream ? stream.subscribe : noStream,\n () => (stream ? stream.getSnapshot() : NO_GROUPS),\n );\n\n return sources.map((source, i) => {\n const registration = registrations[i];\n return registration\n ? streamResult(source.id, registration, groups)\n : queryResult(source.id, queries[i] as UseQueryResult<TimeseriesResponse>);\n });\n}\n\n/**\n * The one series a single-value widget (gauge, core bars) reads from a\n * result: the series whose id is the requested id, else the only series. An\n * id that expanded into several series has no single reading, so it is an\n * error rather than an arbitrary pick.\n */\nexport function soleSeries(\n id: string,\n result: TimeseriesSourceResult | undefined,\n): { data: TimeseriesServerSeries | undefined; error: Error | null } {\n if (!result) return { data: undefined, error: null };\n if (result.error) return { data: undefined, error: result.error };\n const list = result.series ?? [];\n const data = list.find((s) => s.id === id) ?? (list.length === 1 ? list[0] : undefined);\n if (!data && list.length > 1) {\n return { data: undefined, error: new Error(`metric ${id} expanded into ${list.length} series; this widget shows one`) };\n }\n return { data, error: null };\n}\n\n/** The value of the last point, or undefined when the series is empty. */\nexport function latestValue(resp: Pick<TimeseriesResponse, \"points\"> | undefined): number | undefined {\n const points = resp?.points;\n if (!points || points.length === 0) return undefined;\n return points[points.length - 1]?.value;\n}\n"],"mappings":";;;;AA8BA,IAAa,2BAA8C,OAAO,QAAQ;CACxE,MAAM,MAAM,MAAM,MAAM,GAAG;CAC3B,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,2BAA2B,IAAI,QAAQ;CACpE,OAAO,IAAI,KAAK;AAClB;;AAGA,SAAgB,qBAAqB,KAAa,OAAuB;CACvE,MAAM,IAAI,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM;CAC7C,IAAI,OAAO,EAAE,aAAa,IAAI,SAAS,KAAK;CAC5C,OAAO,EAAE,WAAW,EAAE;AACxB;;;;;;;AAQA,SAAgB,uBACd,QACA,EAAE,UAAU,IAAI,OAAO,WAAW,WACkD;CACpF,MAAM,SAAS;EACb,iBAAiB,YAAY,IAAI,YAAa;EAC9C,WAAW;EACX,OAAO;CACT;CACA,MAAM,EAAE,SAAS;CACjB,IAAI,MACF,OAAO;EACL,GAAG;EACH,UAAU;GAAC;GAAc;GAAQ,OAAO;GAAI;EAAK;EACjD,UAAU,EAAE,aAAsC,KAAK;GAAE;GAAO;EAAO,CAAC;CAC1E;CAEF,MAAM,aAAa,qBAAqB,UAAU,OAAO,IAAI,KAAK;CAClE,OAAO;EACL,GAAG;EACH,UAAU,CAAC,cAAc,UAAU;EACnC,eAAe,QAAQ,UAAU;CACnC;AACF;AAaA,IAAM,uBAAuB,CAAC;AAE9B,SAAS,YAAY,IAAY,OAAmE;CAClG,MAAM,EAAE,SAAS;CACjB,OAAO;EACL,QAAQ,OAAO,CAAC;GAAE;GAAI,QAAQ;GAAI,QAAQ,KAAK;EAAO,CAAC,IAAI,KAAA;EAC3D,WAAW,MAAM;EACjB,OAAO,MAAM;CACf;AACF;;;;;AAMA,SAAS,aACP,aACA,cACA,QACwB;CACxB,MAAM,QAAQ,OAAO,IAAIA,0BAAAA,yBAAyB,YAAY,CAAC,KAAKC,0BAAAA;CACpE,MAAM,aAAa,aAAa;CAChC,MAAM,WAAW,MAAM,SAAS,IAAI,UAAU;CAC9C,MAAM,OAAO,MAAM,SAAS,IAAI,UAAU,KAAK,CAAC;CAChD,MAAM,SACJ,gBAAgB,aACZ,OACA,KAAK,KAAK,OAAO;EAAE,GAAG;EAAG,QAAQ;EAAa,GAAI,EAAE,OAAO,aAAa,EAAE,IAAI,YAAY,IAAI,CAAC;CAAG,EAAE;CAC1G,OAAO;EACL,QAAQ,WAAW,SAAS,KAAA;EAC5B,WAAW,CAAC,YAAY,MAAM,UAAU;EACxC,OAAO,MAAM;CACf;AACF;AAEA,IAAM,4BAA6D,IAAI,IAAI;;;;;;;;AAS3E,SAAgB,qBACd,SACA,SAC0B;CAC1B,MAAM,SAASC,0BAAAA,oBAAoB;CACnC,MAAM,EAAE,UAAU;CAClB,MAAM,WAAWC,0BAAAA,yBAAyB,QAAQ,SAAS;CAC3D,MAAM,gBAAgB,QAAQ,KAAK,WAAgD;EACjF,IAAI,CAAC,UAAU,aAAa,QAAQ,OAAO,MAAM,OAAO;EACxD,MAAM,UAAUC,0BAAAA,wBAAwB,QAAQ,WAAW,IAAI,OAAO,EAAE;EACxE,OAAO,UAAU;GAAE,GAAG;GAAS;GAAO;EAAS,IAAI;CACrD,CAAC;CACD,MAAM,WAAA,GAAUC,sBAAAA,WAAAA,CAAW,EACzB,SAAS,QAAQ,KAAK,QAAQ,OAAO;EACnC,GAAG,uBAAuB,QAAQ,OAAO;EACzC,SAAS,cAAc,OAAO;CAChC,EAAE,EACJ,CAAC;CAED,MAAM,mBAAmB,KAAK,UAAU,cAAc,QAAQ,MAAM,MAAM,IAAI,CAAC;CAC/E,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,MAAM,SAAS,KAAK,MAAM,gBAAgB;EAC1C,IAAI,CAAC,UAAU,OAAO,WAAW,GAAG;EACpC,MAAM,aAAa,OAAO,KAAK,iBAAiB,OAAO,SAAS,YAAY,CAAC;EAC7E,aAAa,WAAW,SAAS,QAAQ,IAAI,CAAC;CAChD,GAAG,CAAC,QAAQ,gBAAgB,CAAC;CAE7B,MAAM,UAAA,GAASC,MAAAA,qBAAAA,CACb,SAAS,OAAO,YAAY,gBACrB,SAAS,OAAO,YAAY,IAAI,SACzC;CAEA,OAAO,QAAQ,KAAK,QAAQ,MAAM;EAChC,MAAM,eAAe,cAAc;EACnC,OAAO,eACH,aAAa,OAAO,IAAI,cAAc,MAAM,IAC5C,YAAY,OAAO,IAAI,QAAQ,EAAwC;CAC7E,CAAC;AACH;;;;;;;AAQA,SAAgB,WACd,IACA,QACmE;CACnE,IAAI,CAAC,QAAQ,OAAO;EAAE,MAAM,KAAA;EAAW,OAAO;CAAK;CACnD,IAAI,OAAO,OAAO,OAAO;EAAE,MAAM,KAAA;EAAW,OAAO,OAAO;CAAM;CAChE,MAAM,OAAO,OAAO,UAAU,CAAC;CAC/B,MAAM,OAAO,KAAK,MAAM,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,WAAW,IAAI,KAAK,KAAK,KAAA;CAC7E,IAAI,CAAC,QAAQ,KAAK,SAAS,GACzB,OAAO;EAAE,MAAM,KAAA;EAAW,uBAAO,IAAI,MAAM,UAAU,GAAG,iBAAiB,KAAK,OAAO,+BAA+B;CAAE;CAExH,OAAO;EAAE;EAAM,OAAO;CAAK;AAC7B;;AAGA,SAAgB,YAAY,MAA0E;CACpG,MAAM,SAAS,MAAM;CACrB,IAAI,CAAC,UAAU,OAAO,WAAW,GAAG,OAAO,KAAA;CAC3C,OAAO,OAAO,OAAO,SAAS,EAAE,EAAE;AACpC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { UseQueryOptions
|
|
2
|
-
import { SeriesLoader, TimeseriesResponse } from './TimeseriesPanel.model.js';
|
|
1
|
+
import { UseQueryOptions } from '@tanstack/react-query';
|
|
2
|
+
import { SeriesLoader, TimeseriesResponse, TimeseriesServerSeries } from './TimeseriesPanel.model.js';
|
|
3
3
|
/** Loads a metric by URL; the legacy data path of the timeseries widgets. */
|
|
4
4
|
export type TimeseriesFetcher = (url: string) => Promise<TimeseriesResponse>;
|
|
5
5
|
/** One series the widgets poll: a metric id, optionally backed by a loader. */
|
|
@@ -24,8 +24,34 @@ export declare function timeseriesRequestUrl(url: string, range: string): string
|
|
|
24
24
|
* and callers must keep it unique per data source.
|
|
25
25
|
*/
|
|
26
26
|
export declare function timeseriesQueryOptions(source: TimeseriesSource, { baseUrl, range, refreshMs, fetcher }: TimeseriesQueryOptions): UseQueryOptions<TimeseriesResponse, Error, TimeseriesResponse, readonly unknown[]>;
|
|
27
|
-
/**
|
|
28
|
-
export
|
|
27
|
+
/** What one requested source resolved to. */
|
|
28
|
+
export interface TimeseriesSourceResult {
|
|
29
|
+
/**
|
|
30
|
+
* Every series the source answered with: one for a polled or loaded id,
|
|
31
|
+
* each expansion for a streamed id (possibly none). Undefined until answered.
|
|
32
|
+
*/
|
|
33
|
+
series: readonly TimeseriesServerSeries[] | undefined;
|
|
34
|
+
isLoading: boolean;
|
|
35
|
+
error: Error | null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Reads every source; results are index-aligned with `sources`. Under a
|
|
39
|
+
* {@link TimeseriesStreamProvider} the URL-backed sources of a live widget
|
|
40
|
+
* (`refreshMs > 0`) come from their stream group (see
|
|
41
|
+
* {@link timeseriesStreamAddress}); sources with a `load`, and every source
|
|
42
|
+
* outside a provider, are fetched per source and re-polled every `refreshMs`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function useTimeseriesQueries(sources: readonly TimeseriesSource[], options: TimeseriesQueryOptions): TimeseriesSourceResult[];
|
|
45
|
+
/**
|
|
46
|
+
* The one series a single-value widget (gauge, core bars) reads from a
|
|
47
|
+
* result: the series whose id is the requested id, else the only series. An
|
|
48
|
+
* id that expanded into several series has no single reading, so it is an
|
|
49
|
+
* error rather than an arbitrary pick.
|
|
50
|
+
*/
|
|
51
|
+
export declare function soleSeries(id: string, result: TimeseriesSourceResult | undefined): {
|
|
52
|
+
data: TimeseriesServerSeries | undefined;
|
|
53
|
+
error: Error | null;
|
|
54
|
+
};
|
|
29
55
|
/** The value of the last point, or undefined when the series is empty. */
|
|
30
|
-
export declare function latestValue(resp: TimeseriesResponse | undefined): number | undefined;
|
|
56
|
+
export declare function latestValue(resp: Pick<TimeseriesResponse, "points"> | undefined): number | undefined;
|
|
31
57
|
//# sourceMappingURL=timeseries-query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeseries-query.d.ts","sourceRoot":"","sources":["../../src/data/timeseries-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"timeseries-query.d.ts","sourceRoot":"","sources":["../../src/data/timeseries-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,eAAe,EAAuB,MAAM,uBAAuB,CAAC;AAE9F,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAWxG,6EAA6E;AAC7E,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAE7E,+EAA+E;AAC/E,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,eAAO,MAAM,wBAAwB,EAAE,iBAItC,CAAC;AAEF,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIvE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,gBAAgB,EACxB,EAAE,OAAY,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,sBAAsB,GAClE,eAAe,CAAC,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE,SAAS,OAAO,EAAE,CAAC,CAoBpF;AAED,6CAA6C;AAC7C,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,MAAM,EAAE,SAAS,sBAAsB,EAAE,GAAG,SAAS,CAAC;IACtD,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAuCD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,OAAO,EAAE,sBAAsB,GAC9B,sBAAsB,EAAE,CAmC1B;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,sBAAsB,GAAG,SAAS,GACzC;IAAE,IAAI,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,CASnE;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIpG"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { EMPTY_TIMESERIES_STREAM_GROUP, timeseriesStreamAddress, timeseriesStreamGroupKey, timeseriesStreamInterval, useTimeseriesStream } from "./timeseries-stream.js";
|
|
2
|
+
import { useEffect, useSyncExternalStore } from "react";
|
|
1
3
|
import { useQueries } from "@tanstack/react-query";
|
|
2
4
|
// src/data/timeseries-query.ts
|
|
3
5
|
var defaultTimeseriesFetcher = async (url) => {
|
|
@@ -44,9 +46,102 @@ function timeseriesQueryOptions(source, { baseUrl = "", range, refreshMs, fetche
|
|
|
44
46
|
queryFn: () => fetcher(requestUrl)
|
|
45
47
|
};
|
|
46
48
|
}
|
|
47
|
-
|
|
49
|
+
var noStream = () => () => {};
|
|
50
|
+
function queryResult(id, query) {
|
|
51
|
+
const { data } = query;
|
|
52
|
+
return {
|
|
53
|
+
series: data ? [{
|
|
54
|
+
id,
|
|
55
|
+
source: id,
|
|
56
|
+
points: data.points
|
|
57
|
+
}] : void 0,
|
|
58
|
+
isLoading: query.isLoading,
|
|
59
|
+
error: query.error
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A streamed source's result, reported under the id the widget requested
|
|
64
|
+
* (which differs from the streamed id for a single-`url` panel).
|
|
65
|
+
*/
|
|
66
|
+
function streamResult(requestedId, registration, groups) {
|
|
67
|
+
const group = groups.get(timeseriesStreamGroupKey(registration)) ?? EMPTY_TIMESERIES_STREAM_GROUP;
|
|
68
|
+
const streamedId = registration.id;
|
|
69
|
+
const answered = group.answered.has(streamedId);
|
|
70
|
+
const held = group.bySource.get(streamedId) ?? [];
|
|
71
|
+
const series = requestedId === streamedId ? held : held.map((s) => ({
|
|
72
|
+
...s,
|
|
73
|
+
source: requestedId,
|
|
74
|
+
...s.id === streamedId ? { id: requestedId } : {}
|
|
75
|
+
}));
|
|
76
|
+
return {
|
|
77
|
+
series: answered ? series : void 0,
|
|
78
|
+
isLoading: !answered && group.error === null,
|
|
79
|
+
error: group.error
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
var NO_GROUPS = /* @__PURE__ */ new Map();
|
|
83
|
+
/**
|
|
84
|
+
* Reads every source; results are index-aligned with `sources`. Under a
|
|
85
|
+
* {@link TimeseriesStreamProvider} the URL-backed sources of a live widget
|
|
86
|
+
* (`refreshMs > 0`) come from their stream group (see
|
|
87
|
+
* {@link timeseriesStreamAddress}); sources with a `load`, and every source
|
|
88
|
+
* outside a provider, are fetched per source and re-polled every `refreshMs`.
|
|
89
|
+
*/
|
|
48
90
|
function useTimeseriesQueries(sources, options) {
|
|
49
|
-
|
|
91
|
+
const stream = useTimeseriesStream();
|
|
92
|
+
const { range } = options;
|
|
93
|
+
const interval = timeseriesStreamInterval(options.refreshMs);
|
|
94
|
+
const registrations = sources.map((source) => {
|
|
95
|
+
if (!stream || interval === null || source.load) return null;
|
|
96
|
+
const address = timeseriesStreamAddress(options.baseUrl ?? "", source.id);
|
|
97
|
+
return address ? {
|
|
98
|
+
...address,
|
|
99
|
+
range,
|
|
100
|
+
interval
|
|
101
|
+
} : null;
|
|
102
|
+
});
|
|
103
|
+
const queries = useQueries({ queries: sources.map((source, i) => ({
|
|
104
|
+
...timeseriesQueryOptions(source, options),
|
|
105
|
+
enabled: registrations[i] === null
|
|
106
|
+
})) });
|
|
107
|
+
const registrationsKey = JSON.stringify(registrations.filter((r) => r !== null));
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
const active = JSON.parse(registrationsKey);
|
|
110
|
+
if (!stream || active.length === 0) return;
|
|
111
|
+
const unregister = active.map((registration) => stream.register(registration));
|
|
112
|
+
return () => unregister.forEach((off) => off());
|
|
113
|
+
}, [stream, registrationsKey]);
|
|
114
|
+
const groups = useSyncExternalStore(stream ? stream.subscribe : noStream, () => stream ? stream.getSnapshot() : NO_GROUPS);
|
|
115
|
+
return sources.map((source, i) => {
|
|
116
|
+
const registration = registrations[i];
|
|
117
|
+
return registration ? streamResult(source.id, registration, groups) : queryResult(source.id, queries[i]);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The one series a single-value widget (gauge, core bars) reads from a
|
|
122
|
+
* result: the series whose id is the requested id, else the only series. An
|
|
123
|
+
* id that expanded into several series has no single reading, so it is an
|
|
124
|
+
* error rather than an arbitrary pick.
|
|
125
|
+
*/
|
|
126
|
+
function soleSeries(id, result) {
|
|
127
|
+
if (!result) return {
|
|
128
|
+
data: void 0,
|
|
129
|
+
error: null
|
|
130
|
+
};
|
|
131
|
+
if (result.error) return {
|
|
132
|
+
data: void 0,
|
|
133
|
+
error: result.error
|
|
134
|
+
};
|
|
135
|
+
const list = result.series ?? [];
|
|
136
|
+
const data = list.find((s) => s.id === id) ?? (list.length === 1 ? list[0] : void 0);
|
|
137
|
+
if (!data && list.length > 1) return {
|
|
138
|
+
data: void 0,
|
|
139
|
+
error: /* @__PURE__ */ new Error(`metric ${id} expanded into ${list.length} series; this widget shows one`)
|
|
140
|
+
};
|
|
141
|
+
return {
|
|
142
|
+
data,
|
|
143
|
+
error: null
|
|
144
|
+
};
|
|
50
145
|
}
|
|
51
146
|
/** The value of the last point, or undefined when the series is empty. */
|
|
52
147
|
function latestValue(resp) {
|
|
@@ -54,6 +149,6 @@ function latestValue(resp) {
|
|
|
54
149
|
if (!points || points.length === 0) return void 0;
|
|
55
150
|
return points[points.length - 1]?.value;
|
|
56
151
|
}
|
|
57
|
-
export { defaultTimeseriesFetcher, latestValue, timeseriesQueryOptions, timeseriesRequestUrl, useTimeseriesQueries };
|
|
152
|
+
export { defaultTimeseriesFetcher, latestValue, soleSeries, timeseriesQueryOptions, timeseriesRequestUrl, useTimeseriesQueries };
|
|
58
153
|
|
|
59
154
|
//# sourceMappingURL=timeseries-query.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeseries-query.js","names":[],"sources":["../../src/data/timeseries-query.ts"],"sourcesContent":["import { useQueries, type UseQueryOptions, type UseQueryResult } from \"@tanstack/react-query\";\nimport type { SeriesLoader, TimeseriesResponse } from \"./TimeseriesPanel.model\";\n\n/** Loads a metric by URL; the legacy data path of the timeseries widgets. */\nexport type TimeseriesFetcher = (url: string) => Promise<TimeseriesResponse>;\n\n/** One series the widgets poll: a metric id, optionally backed by a loader. */\nexport interface TimeseriesSource {\n id: string;\n load?: SeriesLoader | undefined;\n}\n\nexport interface TimeseriesQueryOptions {\n /** Prefix for URL-backed sources; ignored by sources with a `load`. */\n baseUrl?: string;\n range: string;\n refreshMs: number;\n fetcher: TimeseriesFetcher;\n}\n\nexport const defaultTimeseriesFetcher: TimeseriesFetcher = async (url) => {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`metrics request failed: ${res.status}`);\n return res.json();\n};\n\n/** `baseUrl + id` resolved to a same-origin path with `?since=<range>`. */\nexport function timeseriesRequestUrl(url: string, range: string): string {\n const u = new URL(url, window.location.origin);\n if (range) u.searchParams.set(\"since\", range);\n return u.pathname + u.search;\n}\n\n/**\n * The react-query options for one series. URL-backed sources key on the\n * request URL (unchanged from before loaders existed); loader-backed sources\n * key on `[\"timeseries\", \"load\", id, range]`, so the id is the cache identity\n * and callers must keep it unique per data source.\n */\nexport function timeseriesQueryOptions(\n source: TimeseriesSource,\n { baseUrl = \"\", range, refreshMs, fetcher }: TimeseriesQueryOptions,\n): UseQueryOptions<TimeseriesResponse, Error, TimeseriesResponse, readonly unknown[]> {\n const shared = {\n refetchInterval: refreshMs > 0 ? refreshMs : (false as const),\n staleTime: 0,\n retry: 0,\n };\n const { load } = source;\n if (load) {\n return {\n ...shared,\n queryKey: [\"timeseries\", \"load\", source.id, range],\n queryFn: ({ signal }: { signal: AbortSignal }) => load({ range, signal }),\n };\n }\n const requestUrl = timeseriesRequestUrl(baseUrl + source.id, range);\n return {\n ...shared,\n queryKey: [\"timeseries\", requestUrl],\n queryFn: () => fetcher(requestUrl),\n };\n}\n\n/** Polls every source in parallel; results are index-aligned with `sources`. */\nexport function useTimeseriesQueries(\n sources: readonly TimeseriesSource[],\n options: TimeseriesQueryOptions,\n): UseQueryResult<TimeseriesResponse>[] {\n return useQueries({\n queries: sources.map((source) => timeseriesQueryOptions(source, options)),\n });\n}\n\n/** The value of the last point, or undefined when the series is empty. */\nexport function latestValue(resp: TimeseriesResponse | undefined): number | undefined {\n const points = resp?.points;\n if (!points || points.length === 0) return undefined;\n return points[points.length - 1]?.value;\n}\n"],"mappings":";;AAoBA,IAAa,2BAA8C,OAAO,QAAQ;CACxE,MAAM,MAAM,MAAM,MAAM,GAAG;CAC3B,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,2BAA2B,IAAI,QAAQ;CACpE,OAAO,IAAI,KAAK;AAClB;;AAGA,SAAgB,qBAAqB,KAAa,OAAuB;CACvE,MAAM,IAAI,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM;CAC7C,IAAI,OAAO,EAAE,aAAa,IAAI,SAAS,KAAK;CAC5C,OAAO,EAAE,WAAW,EAAE;AACxB;;;;;;;AAQA,SAAgB,uBACd,QACA,EAAE,UAAU,IAAI,OAAO,WAAW,WACkD;CACpF,MAAM,SAAS;EACb,iBAAiB,YAAY,IAAI,YAAa;EAC9C,WAAW;EACX,OAAO;CACT;CACA,MAAM,EAAE,SAAS;CACjB,IAAI,MACF,OAAO;EACL,GAAG;EACH,UAAU;GAAC;GAAc;GAAQ,OAAO;GAAI;EAAK;EACjD,UAAU,EAAE,aAAsC,KAAK;GAAE;GAAO;EAAO,CAAC;CAC1E;CAEF,MAAM,aAAa,qBAAqB,UAAU,OAAO,IAAI,KAAK;CAClE,OAAO;EACL,GAAG;EACH,UAAU,CAAC,cAAc,UAAU;EACnC,eAAe,QAAQ,UAAU;CACnC;AACF;;AAGA,SAAgB,qBACd,SACA,SACsC;CACtC,OAAO,WAAW,EAChB,SAAS,QAAQ,KAAK,WAAW,uBAAuB,QAAQ,OAAO,CAAC,EAC1E,CAAC;AACH;;AAGA,SAAgB,YAAY,MAA0D;CACpF,MAAM,SAAS,MAAM;CACrB,IAAI,CAAC,UAAU,OAAO,WAAW,GAAG,OAAO,KAAA;CAC3C,OAAO,OAAO,OAAO,SAAS,EAAE,EAAE;AACpC"}
|
|
1
|
+
{"version":3,"file":"timeseries-query.js","names":[],"sources":["../../src/data/timeseries-query.ts"],"sourcesContent":["import { useQueries, type UseQueryOptions, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useEffect, useSyncExternalStore } from \"react\";\nimport type { SeriesLoader, TimeseriesResponse, TimeseriesServerSeries } from \"./TimeseriesPanel.model\";\nimport {\n EMPTY_TIMESERIES_STREAM_GROUP,\n timeseriesStreamAddress,\n timeseriesStreamGroupKey,\n timeseriesStreamInterval,\n useTimeseriesStream,\n type TimeseriesStreamGroupState,\n type TimeseriesStreamRegistration,\n} from \"./timeseries-stream\";\n\n/** Loads a metric by URL; the legacy data path of the timeseries widgets. */\nexport type TimeseriesFetcher = (url: string) => Promise<TimeseriesResponse>;\n\n/** One series the widgets poll: a metric id, optionally backed by a loader. */\nexport interface TimeseriesSource {\n id: string;\n load?: SeriesLoader | undefined;\n}\n\nexport interface TimeseriesQueryOptions {\n /** Prefix for URL-backed sources; ignored by sources with a `load`. */\n baseUrl?: string;\n range: string;\n refreshMs: number;\n fetcher: TimeseriesFetcher;\n}\n\nexport const defaultTimeseriesFetcher: TimeseriesFetcher = async (url) => {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`metrics request failed: ${res.status}`);\n return res.json();\n};\n\n/** `baseUrl + id` resolved to a same-origin path with `?since=<range>`. */\nexport function timeseriesRequestUrl(url: string, range: string): string {\n const u = new URL(url, window.location.origin);\n if (range) u.searchParams.set(\"since\", range);\n return u.pathname + u.search;\n}\n\n/**\n * The react-query options for one series. URL-backed sources key on the\n * request URL (unchanged from before loaders existed); loader-backed sources\n * key on `[\"timeseries\", \"load\", id, range]`, so the id is the cache identity\n * and callers must keep it unique per data source.\n */\nexport function timeseriesQueryOptions(\n source: TimeseriesSource,\n { baseUrl = \"\", range, refreshMs, fetcher }: TimeseriesQueryOptions,\n): UseQueryOptions<TimeseriesResponse, Error, TimeseriesResponse, readonly unknown[]> {\n const shared = {\n refetchInterval: refreshMs > 0 ? refreshMs : (false as const),\n staleTime: 0,\n retry: 0,\n };\n const { load } = source;\n if (load) {\n return {\n ...shared,\n queryKey: [\"timeseries\", \"load\", source.id, range],\n queryFn: ({ signal }: { signal: AbortSignal }) => load({ range, signal }),\n };\n }\n const requestUrl = timeseriesRequestUrl(baseUrl + source.id, range);\n return {\n ...shared,\n queryKey: [\"timeseries\", requestUrl],\n queryFn: () => fetcher(requestUrl),\n };\n}\n\n/** What one requested source resolved to. */\nexport interface TimeseriesSourceResult {\n /**\n * Every series the source answered with: one for a polled or loaded id,\n * each expansion for a streamed id (possibly none). Undefined until answered.\n */\n series: readonly TimeseriesServerSeries[] | undefined;\n isLoading: boolean;\n error: Error | null;\n}\n\nconst noStream = () => () => {};\n\nfunction queryResult(id: string, query: UseQueryResult<TimeseriesResponse>): TimeseriesSourceResult {\n const { data } = query;\n return {\n series: data ? [{ id, source: id, points: data.points }] : undefined,\n isLoading: query.isLoading,\n error: query.error,\n };\n}\n\n/**\n * A streamed source's result, reported under the id the widget requested\n * (which differs from the streamed id for a single-`url` panel).\n */\nfunction streamResult(\n requestedId: string,\n registration: TimeseriesStreamRegistration,\n groups: ReadonlyMap<string, TimeseriesStreamGroupState>,\n): TimeseriesSourceResult {\n const group = groups.get(timeseriesStreamGroupKey(registration)) ?? EMPTY_TIMESERIES_STREAM_GROUP;\n const streamedId = registration.id;\n const answered = group.answered.has(streamedId);\n const held = group.bySource.get(streamedId) ?? [];\n const series =\n requestedId === streamedId\n ? held\n : held.map((s) => ({ ...s, source: requestedId, ...(s.id === streamedId ? { id: requestedId } : {}) }));\n return {\n series: answered ? series : undefined,\n isLoading: !answered && group.error === null,\n error: group.error,\n };\n}\n\nconst NO_GROUPS: ReadonlyMap<string, TimeseriesStreamGroupState> = new Map();\n\n/**\n * Reads every source; results are index-aligned with `sources`. Under a\n * {@link TimeseriesStreamProvider} the URL-backed sources of a live widget\n * (`refreshMs > 0`) come from their stream group (see\n * {@link timeseriesStreamAddress}); sources with a `load`, and every source\n * outside a provider, are fetched per source and re-polled every `refreshMs`.\n */\nexport function useTimeseriesQueries(\n sources: readonly TimeseriesSource[],\n options: TimeseriesQueryOptions,\n): TimeseriesSourceResult[] {\n const stream = useTimeseriesStream();\n const { range } = options;\n const interval = timeseriesStreamInterval(options.refreshMs);\n const registrations = sources.map((source): TimeseriesStreamRegistration | null => {\n if (!stream || interval === null || source.load) return null;\n const address = timeseriesStreamAddress(options.baseUrl ?? \"\", source.id);\n return address ? { ...address, range, interval } : null;\n });\n const queries = useQueries({\n queries: sources.map((source, i) => ({\n ...timeseriesQueryOptions(source, options),\n enabled: registrations[i] === null,\n })),\n });\n\n const registrationsKey = JSON.stringify(registrations.filter((r) => r !== null));\n useEffect(() => {\n const active = JSON.parse(registrationsKey) as TimeseriesStreamRegistration[];\n if (!stream || active.length === 0) return;\n const unregister = active.map((registration) => stream.register(registration));\n return () => unregister.forEach((off) => off());\n }, [stream, registrationsKey]);\n\n const groups = useSyncExternalStore(\n stream ? stream.subscribe : noStream,\n () => (stream ? stream.getSnapshot() : NO_GROUPS),\n );\n\n return sources.map((source, i) => {\n const registration = registrations[i];\n return registration\n ? streamResult(source.id, registration, groups)\n : queryResult(source.id, queries[i] as UseQueryResult<TimeseriesResponse>);\n });\n}\n\n/**\n * The one series a single-value widget (gauge, core bars) reads from a\n * result: the series whose id is the requested id, else the only series. An\n * id that expanded into several series has no single reading, so it is an\n * error rather than an arbitrary pick.\n */\nexport function soleSeries(\n id: string,\n result: TimeseriesSourceResult | undefined,\n): { data: TimeseriesServerSeries | undefined; error: Error | null } {\n if (!result) return { data: undefined, error: null };\n if (result.error) return { data: undefined, error: result.error };\n const list = result.series ?? [];\n const data = list.find((s) => s.id === id) ?? (list.length === 1 ? list[0] : undefined);\n if (!data && list.length > 1) {\n return { data: undefined, error: new Error(`metric ${id} expanded into ${list.length} series; this widget shows one`) };\n }\n return { data, error: null };\n}\n\n/** The value of the last point, or undefined when the series is empty. */\nexport function latestValue(resp: Pick<TimeseriesResponse, \"points\"> | undefined): number | undefined {\n const points = resp?.points;\n if (!points || points.length === 0) return undefined;\n return points[points.length - 1]?.value;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const require_event_source = require("../hooks/event-source.cjs");
|
|
2
|
+
const require_timeseries_stream = require("./timeseries-stream.cjs");
|
|
3
|
+
let react = require("react");
|
|
4
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
|
+
// src/data/timeseries-stream-provider.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Streams every URL-backed TimeseriesPanel, TimeseriesGauge and
|
|
8
|
+
* TimeseriesCoreBars below it over one subscription per (baseUrl, range,
|
|
9
|
+
* interval) group — `GET {baseUrl}stream?id=…&since=…&interval=…` (clicky
|
|
10
|
+
* `metrics.RegisterStreamRoutes`) — instead of each series polling
|
|
11
|
+
* `{baseUrl}{id}`. Subscriptions open through `useEventSourceFactory()`, so
|
|
12
|
+
* place it inside an `EventSourceProvider` built with `createEventHub()` to
|
|
13
|
+
* share the tab's single hub connection. A single-`url` panel streams from
|
|
14
|
+
* its url's path prefix (see `timeseriesStreamAddress`). Series with a
|
|
15
|
+
* `load`, and widgets with `refreshMs <= 0`, keep fetching on their own.
|
|
16
|
+
*
|
|
17
|
+
* ```tsx
|
|
18
|
+
* const hub = createEventHub({ buildId });
|
|
19
|
+
* <EventSourceProvider value={hub}>
|
|
20
|
+
* <TimeseriesStreamProvider>{app}</TimeseriesStreamProvider>
|
|
21
|
+
* </EventSourceProvider>
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
function TimeseriesStreamProvider({ debounceMs, children }) {
|
|
25
|
+
const factory = require_event_source.useEventSourceFactory();
|
|
26
|
+
const stream = (0, react.useMemo)(() => require_timeseries_stream.createTimeseriesStream({
|
|
27
|
+
factory,
|
|
28
|
+
...debounceMs !== void 0 ? { debounceMs } : {}
|
|
29
|
+
}), [factory, debounceMs]);
|
|
30
|
+
(0, react.useEffect)(() => () => stream.close(), [stream]);
|
|
31
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_timeseries_stream.TimeseriesStreamContext.Provider, {
|
|
32
|
+
value: stream,
|
|
33
|
+
children
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
exports.TimeseriesStreamProvider = TimeseriesStreamProvider;
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=timeseries-stream-provider.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeseries-stream-provider.cjs","names":["useEventSourceFactory","useMemo","createTimeseriesStream","TimeseriesStreamContext"],"sources":["../../src/data/timeseries-stream-provider.tsx"],"sourcesContent":["import { useEffect, useMemo, type ReactNode } from \"react\";\nimport { useEventSourceFactory } from \"../hooks/event-source\";\nimport { createTimeseriesStream, TimeseriesStreamContext } from \"./timeseries-stream\";\n\nexport interface TimeseriesStreamProviderProps {\n /** How long widget (un)registrations coalesce before a group re-subscribes. Defaults to 50ms. */\n debounceMs?: number;\n children?: ReactNode;\n}\n\n/**\n * Streams every URL-backed TimeseriesPanel, TimeseriesGauge and\n * TimeseriesCoreBars below it over one subscription per (baseUrl, range,\n * interval) group — `GET {baseUrl}stream?id=…&since=…&interval=…` (clicky\n * `metrics.RegisterStreamRoutes`) — instead of each series polling\n * `{baseUrl}{id}`. Subscriptions open through `useEventSourceFactory()`, so\n * place it inside an `EventSourceProvider` built with `createEventHub()` to\n * share the tab's single hub connection. A single-`url` panel streams from\n * its url's path prefix (see `timeseriesStreamAddress`). Series with a\n * `load`, and widgets with `refreshMs <= 0`, keep fetching on their own.\n *\n * ```tsx\n * const hub = createEventHub({ buildId });\n * <EventSourceProvider value={hub}>\n * <TimeseriesStreamProvider>{app}</TimeseriesStreamProvider>\n * </EventSourceProvider>\n * ```\n */\nexport function TimeseriesStreamProvider({ debounceMs, children }: TimeseriesStreamProviderProps) {\n const factory = useEventSourceFactory();\n const stream = useMemo(\n () => createTimeseriesStream({ factory, ...(debounceMs !== undefined ? { debounceMs } : {}) }),\n [factory, debounceMs],\n );\n useEffect(() => () => stream.close(), [stream]);\n return <TimeseriesStreamContext.Provider value={stream}>{children}</TimeseriesStreamContext.Provider>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,yBAAyB,EAAE,YAAY,YAA2C;CAChG,MAAM,UAAUA,qBAAAA,sBAAsB;CACtC,MAAM,UAAA,GAASC,MAAAA,QAAAA,OACPC,0BAAAA,uBAAuB;EAAE;EAAS,GAAI,eAAe,KAAA,IAAY,EAAE,WAAW,IAAI,CAAC;CAAG,CAAC,GAC7F,CAAC,SAAS,UAAU,CACtB;CACA,CAAA,GAAA,MAAA,UAAA,aAAsB,OAAO,MAAM,GAAG,CAAC,MAAM,CAAC;CAC9C,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,0BAAAA,wBAAwB,UAAzB;EAAkC,OAAO;EAAS;CAA2C,CAAA;AACtG"}
|