@osdk/react-devtools 0.5.0
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/CHANGELOG.md +79 -0
- package/build/esm/DevToolsContext.js +19 -0
- package/build/esm/DevToolsContext.js.map +1 -0
- package/build/esm/components/ActionMetrics.js +89 -0
- package/build/esm/components/ActionMetrics.js.map +1 -0
- package/build/esm/components/BubbleChart.js +175 -0
- package/build/esm/components/BubbleChart.js.map +1 -0
- package/build/esm/components/BubbleChart.module.scss.js +6 -0
- package/build/esm/components/CacheInspectorTab.js +291 -0
- package/build/esm/components/CacheInspectorTab.js.map +1 -0
- package/build/esm/components/CacheInspectorTab.module.scss.js +39 -0
- package/build/esm/components/CacheMetrics.js +55 -0
- package/build/esm/components/CacheMetrics.js.map +1 -0
- package/build/esm/components/ComponentCard.js +124 -0
- package/build/esm/components/ComponentCard.js.map +1 -0
- package/build/esm/components/ComponentCard.module.scss.js +31 -0
- package/build/esm/components/ComputeTab.js +175 -0
- package/build/esm/components/ComputeTab.js.map +1 -0
- package/build/esm/components/CopyableCodeBlock.js +49 -0
- package/build/esm/components/CopyableCodeBlock.js.map +1 -0
- package/build/esm/components/CopyableCodeBlock.module.scss.js +10 -0
- package/build/esm/components/DebuggingTab.js +342 -0
- package/build/esm/components/DebuggingTab.js.map +1 -0
- package/build/esm/components/DebuggingTab.module.scss.js +18 -0
- package/build/esm/components/HookRow.js +180 -0
- package/build/esm/components/HookRow.js.map +1 -0
- package/build/esm/components/HookRow.module.scss.js +16 -0
- package/build/esm/components/ImprovementsTab.js +138 -0
- package/build/esm/components/ImprovementsTab.js.map +1 -0
- package/build/esm/components/ImprovementsTab.module.scss.js +30 -0
- package/build/esm/components/InspectorSelectionHeader.js +65 -0
- package/build/esm/components/InspectorSelectionHeader.js.map +1 -0
- package/build/esm/components/InterceptTab.js +862 -0
- package/build/esm/components/InterceptTab.js.map +1 -0
- package/build/esm/components/InterceptTab.module.scss.js +49 -0
- package/build/esm/components/IssueCard.js +115 -0
- package/build/esm/components/IssueCard.js.map +1 -0
- package/build/esm/components/IssueCard.module.scss.js +24 -0
- package/build/esm/components/LogEntryCard.js +94 -0
- package/build/esm/components/LogEntryCard.js.map +1 -0
- package/build/esm/components/LogEntryCard.module.scss.js +19 -0
- package/build/esm/components/MockEditor.js +316 -0
- package/build/esm/components/MockEditor.js.map +1 -0
- package/build/esm/components/MonitorErrorBoundary.js +64 -0
- package/build/esm/components/MonitorErrorBoundary.js.map +1 -0
- package/build/esm/components/MonitorErrorBoundary.module.scss.js +9 -0
- package/build/esm/components/MonitoringPanel.js +434 -0
- package/build/esm/components/MonitoringPanel.js.map +1 -0
- package/build/esm/components/MonitoringPanel.module.scss.js +81 -0
- package/build/esm/components/ObjectLoadingMetrics.js +60 -0
- package/build/esm/components/ObjectLoadingMetrics.js.map +1 -0
- package/build/esm/components/OsdkAppErrorBoundary.js +68 -0
- package/build/esm/components/OsdkAppErrorBoundary.js.map +1 -0
- package/build/esm/components/OsdkDevTools.js +40 -0
- package/build/esm/components/OsdkDevTools.js.map +1 -0
- package/build/esm/components/OverrideEditor.js +197 -0
- package/build/esm/components/OverrideEditor.js.map +1 -0
- package/build/esm/components/PerformanceTab.js +297 -0
- package/build/esm/components/PerformanceTab.js.map +1 -0
- package/build/esm/components/PrimitiveSelectionPanel.js +220 -0
- package/build/esm/components/PrimitiveSelectionPanel.js.map +1 -0
- package/build/esm/components/PrimitiveSelectionPanel.module.scss.js +26 -0
- package/build/esm/components/issueTypes.js +2 -0
- package/build/esm/components/issueTypes.js.map +1 -0
- package/build/esm/components/resolveComponentName.js +57 -0
- package/build/esm/components/resolveComponentName.js.map +1 -0
- package/build/esm/components/testHelpers.js +312 -0
- package/build/esm/components/testHelpers.js.map +1 -0
- package/build/esm/css.d.ts +20 -0
- package/build/esm/fiber/DegradationNotice.js +193 -0
- package/build/esm/fiber/DegradationNotice.js.map +1 -0
- package/build/esm/fiber/DevtoolsHook.js +252 -0
- package/build/esm/fiber/DevtoolsHook.js.map +1 -0
- package/build/esm/fiber/FiberAccess.js +65 -0
- package/build/esm/fiber/FiberAccess.js.map +1 -0
- package/build/esm/fiber/FiberInspection.js +140 -0
- package/build/esm/fiber/FiberInspection.js.map +1 -0
- package/build/esm/fiber/FiberTags.js +52 -0
- package/build/esm/fiber/FiberTags.js.map +1 -0
- package/build/esm/fiber/HookStateInspector.js +254 -0
- package/build/esm/fiber/HookStateInspector.js.map +1 -0
- package/build/esm/fiber/SafeFiberOperation.js +35 -0
- package/build/esm/fiber/SafeFiberOperation.js.map +1 -0
- package/build/esm/fiber/capabilities.js +180 -0
- package/build/esm/fiber/capabilities.js.map +1 -0
- package/build/esm/fiber/traverseFiber.js +129 -0
- package/build/esm/fiber/traverseFiber.js.map +1 -0
- package/build/esm/fiber/types.js +2 -0
- package/build/esm/fiber/types.js.map +1 -0
- package/build/esm/fiber/validation.js +155 -0
- package/build/esm/fiber/validation.js.map +1 -0
- package/build/esm/hooks/createPollingStore.js +81 -0
- package/build/esm/hooks/createPollingStore.js.map +1 -0
- package/build/esm/hooks/useActiveComponents.js +27 -0
- package/build/esm/hooks/useActiveComponents.js.map +1 -0
- package/build/esm/hooks/useComponentRegistry.js +25 -0
- package/build/esm/hooks/useComponentRegistry.js.map +1 -0
- package/build/esm/hooks/useComputeSelectors.js +43 -0
- package/build/esm/hooks/useComputeSelectors.js.map +1 -0
- package/build/esm/hooks/useConsoleLogs.js +46 -0
- package/build/esm/hooks/useConsoleLogs.js.map +1 -0
- package/build/esm/hooks/useInspectorSelection.js +93 -0
- package/build/esm/hooks/useInspectorSelection.js.map +1 -0
- package/build/esm/hooks/useMetrics.js +23 -0
- package/build/esm/hooks/useMetrics.js.map +1 -0
- package/build/esm/hooks/usePersistedState.js +89 -0
- package/build/esm/hooks/usePersistedState.js.map +1 -0
- package/build/esm/hooks/useRecommendations.js +123 -0
- package/build/esm/hooks/useRecommendations.js.map +1 -0
- package/build/esm/hooks/useSharedTick.js +49 -0
- package/build/esm/hooks/useSharedTick.js.map +1 -0
- package/build/esm/hooks/useTimeElapsed.js +51 -0
- package/build/esm/hooks/useTimeElapsed.js.map +1 -0
- package/build/esm/hooks/useTrackerSubscription.js +97 -0
- package/build/esm/hooks/useTrackerSubscription.js.map +1 -0
- package/build/esm/hooks/useUnusedFieldAnalysis.js +99 -0
- package/build/esm/hooks/useUnusedFieldAnalysis.js.map +1 -0
- package/build/esm/index.js +31 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/inspector/ClickToInspectSystem.js +228 -0
- package/build/esm/inspector/ClickToInspectSystem.js.map +1 -0
- package/build/esm/inspector/components/ComponentLabel.js +175 -0
- package/build/esm/inspector/components/ComponentLabel.js.map +1 -0
- package/build/esm/inspector/components/ComponentLabel.module.scss.js +12 -0
- package/build/esm/inspector/components/InspectorBanner.js +79 -0
- package/build/esm/inspector/components/InspectorBanner.js.map +1 -0
- package/build/esm/inspector/components/InspectorOverlay.js +149 -0
- package/build/esm/inspector/components/InspectorOverlay.js.map +1 -0
- package/build/esm/inspector/components/SelectionHighlight.js +74 -0
- package/build/esm/inspector/components/SelectionHighlight.js.map +1 -0
- package/build/esm/inspector/createClickToInspect.js +21 -0
- package/build/esm/inspector/createClickToInspect.js.map +1 -0
- package/build/esm/inspector/hooks/useAnimatedBounds.js +167 -0
- package/build/esm/inspector/hooks/useAnimatedBounds.js.map +1 -0
- package/build/esm/inspector/index.js +40 -0
- package/build/esm/inspector/index.js.map +1 -0
- package/build/esm/inspector/inspectorController.js +328 -0
- package/build/esm/inspector/inspectorController.js.map +1 -0
- package/build/esm/inspector/types.js +2 -0
- package/build/esm/inspector/types.js.map +1 -0
- package/build/esm/inspector/utils/elementBounds.js +72 -0
- package/build/esm/inspector/utils/elementBounds.js.map +1 -0
- package/build/esm/inspector/utils/interpolation.js +26 -0
- package/build/esm/inspector/utils/interpolation.js.map +1 -0
- package/build/esm/inspector/utils/labelPositioning.js +62 -0
- package/build/esm/inspector/utils/labelPositioning.js.map +1 -0
- package/build/esm/mocking/MockCacheKeyGenerator.js +109 -0
- package/build/esm/mocking/MockCacheKeyGenerator.js.map +1 -0
- package/build/esm/mocking/MockManager.js +281 -0
- package/build/esm/mocking/MockManager.js.map +1 -0
- package/build/esm/prototyping/PrototypeOverrideStore.js +66 -0
- package/build/esm/prototyping/PrototypeOverrideStore.js.map +1 -0
- package/build/esm/prototyping/index.js +18 -0
- package/build/esm/prototyping/index.js.map +1 -0
- package/build/esm/public/vite.js +19 -0
- package/build/esm/public/vite.js.map +1 -0
- package/build/esm/register.js +41 -0
- package/build/esm/register.js.map +1 -0
- package/build/esm/scss.d.ts +20 -0
- package/build/esm/store/ComputeStore.js +269 -0
- package/build/esm/store/ComputeStore.js.map +1 -0
- package/build/esm/store/ConsoleLogStore.js +289 -0
- package/build/esm/store/ConsoleLogStore.js.map +1 -0
- package/build/esm/store/MetricsStore.js +428 -0
- package/build/esm/store/MetricsStore.js.map +1 -0
- package/build/esm/store/MonitorStore.js +288 -0
- package/build/esm/store/MonitorStore.js.map +1 -0
- package/build/esm/store/SubscribableStore.js +38 -0
- package/build/esm/store/SubscribableStore.js.map +1 -0
- package/build/esm/store/WindowErrorStore.js +195 -0
- package/build/esm/store/WindowErrorStore.js.map +1 -0
- package/build/esm/styles.css +19441 -0
- package/build/esm/styles.js +31 -0
- package/build/esm/styles.js.map +1 -0
- package/build/esm/types/compute.js +2 -0
- package/build/esm/types/compute.js.map +1 -0
- package/build/esm/types/emissions.js +2 -0
- package/build/esm/types/emissions.js.map +1 -0
- package/build/esm/types/index.js +23 -0
- package/build/esm/types/index.js.map +1 -0
- package/build/esm/utils/ActionLifecycleTracker.js +178 -0
- package/build/esm/utils/ActionLifecycleTracker.js.map +1 -0
- package/build/esm/utils/CacheEfficiencyAnalyzer.js +198 -0
- package/build/esm/utils/CacheEfficiencyAnalyzer.js.map +1 -0
- package/build/esm/utils/CircularBuffer.js +96 -0
- package/build/esm/utils/CircularBuffer.js.map +1 -0
- package/build/esm/utils/ComponentContextCapture.js +215 -0
- package/build/esm/utils/ComponentContextCapture.js.map +1 -0
- package/build/esm/utils/ComponentPrimitiveDiscovery.js +173 -0
- package/build/esm/utils/ComponentPrimitiveDiscovery.js.map +1 -0
- package/build/esm/utils/ComponentQueryRegistry.js +340 -0
- package/build/esm/utils/ComponentQueryRegistry.js.map +1 -0
- package/build/esm/utils/ComputeMonitor.js +199 -0
- package/build/esm/utils/ComputeMonitor.js.map +1 -0
- package/build/esm/utils/EventTimeline.js +130 -0
- package/build/esm/utils/EventTimeline.js.map +1 -0
- package/build/esm/utils/LinkTraversalTracker.js +116 -0
- package/build/esm/utils/LinkTraversalTracker.js.map +1 -0
- package/build/esm/utils/MockDataGenerator.js +473 -0
- package/build/esm/utils/MockDataGenerator.js.map +1 -0
- package/build/esm/utils/ObservableClientMonitor.js +768 -0
- package/build/esm/utils/ObservableClientMonitor.js.map +1 -0
- package/build/esm/utils/PerformanceRecommendationEngine.js +185 -0
- package/build/esm/utils/PerformanceRecommendationEngine.js.map +1 -0
- package/build/esm/utils/PropertyAccessTracker.js +238 -0
- package/build/esm/utils/PropertyAccessTracker.js.map +1 -0
- package/build/esm/utils/RecommendationMatcher.js +53 -0
- package/build/esm/utils/RecommendationMatcher.js.map +1 -0
- package/build/esm/utils/SubscriptionTracker.js +132 -0
- package/build/esm/utils/SubscriptionTracker.js.map +1 -0
- package/build/esm/utils/UnusedFieldAnalyzer.js +186 -0
- package/build/esm/utils/UnusedFieldAnalyzer.js.map +1 -0
- package/build/esm/utils/WaterfallDetector.js +200 -0
- package/build/esm/utils/WaterfallDetector.js.map +1 -0
- package/build/esm/utils/computePayload.js +37 -0
- package/build/esm/utils/computePayload.js.map +1 -0
- package/build/esm/utils/computeRequest.js +29 -0
- package/build/esm/utils/computeRequest.js.map +1 -0
- package/build/esm/utils/format.js +69 -0
- package/build/esm/utils/format.js.map +1 -0
- package/build/esm/utils/logger.js +31 -0
- package/build/esm/utils/logger.js.map +1 -0
- package/build/esm/vite/constants.js +18 -0
- package/build/esm/vite/constants.js.map +1 -0
- package/build/esm/vite/hookInstaller.js +99 -0
- package/build/esm/vite/hookInstaller.js.map +1 -0
- package/build/esm/vite/index.js +77 -0
- package/build/esm/vite/index.js.map +1 -0
- package/build/types/DevToolsContext.d.ts +3 -0
- package/build/types/DevToolsContext.d.ts.map +1 -0
- package/build/types/components/ActionMetrics.d.ts +6 -0
- package/build/types/components/ActionMetrics.d.ts.map +1 -0
- package/build/types/components/BubbleChart.d.ts +10 -0
- package/build/types/components/BubbleChart.d.ts.map +1 -0
- package/build/types/components/CacheInspectorTab.d.ts +6 -0
- package/build/types/components/CacheInspectorTab.d.ts.map +1 -0
- package/build/types/components/CacheMetrics.d.ts +6 -0
- package/build/types/components/CacheMetrics.d.ts.map +1 -0
- package/build/types/components/ComponentCard.d.ts +13 -0
- package/build/types/components/ComponentCard.d.ts.map +1 -0
- package/build/types/components/ComputeTab.d.ts +6 -0
- package/build/types/components/ComputeTab.d.ts.map +1 -0
- package/build/types/components/CopyableCodeBlock.d.ts +7 -0
- package/build/types/components/CopyableCodeBlock.d.ts.map +1 -0
- package/build/types/components/DebuggingTab.d.ts +6 -0
- package/build/types/components/DebuggingTab.d.ts.map +1 -0
- package/build/types/components/HookRow.d.ts +9 -0
- package/build/types/components/HookRow.d.ts.map +1 -0
- package/build/types/components/ImprovementsTab.d.ts +7 -0
- package/build/types/components/ImprovementsTab.d.ts.map +1 -0
- package/build/types/components/InspectorSelectionHeader.d.ts +12 -0
- package/build/types/components/InspectorSelectionHeader.d.ts.map +1 -0
- package/build/types/components/InterceptTab.d.ts +126 -0
- package/build/types/components/InterceptTab.d.ts.map +1 -0
- package/build/types/components/IssueCard.d.ts +8 -0
- package/build/types/components/IssueCard.d.ts.map +1 -0
- package/build/types/components/LogEntryCard.d.ts +7 -0
- package/build/types/components/LogEntryCard.d.ts.map +1 -0
- package/build/types/components/MockEditor.d.ts +58 -0
- package/build/types/components/MockEditor.d.ts.map +1 -0
- package/build/types/components/MonitorErrorBoundary.d.ts +16 -0
- package/build/types/components/MonitorErrorBoundary.d.ts.map +1 -0
- package/build/types/components/MonitoringPanel.d.ts +8 -0
- package/build/types/components/MonitoringPanel.d.ts.map +1 -0
- package/build/types/components/ObjectLoadingMetrics.d.ts +7 -0
- package/build/types/components/ObjectLoadingMetrics.d.ts.map +1 -0
- package/build/types/components/OsdkAppErrorBoundary.d.ts +18 -0
- package/build/types/components/OsdkAppErrorBoundary.d.ts.map +1 -0
- package/build/types/components/OsdkDevTools.d.ts +2 -0
- package/build/types/components/OsdkDevTools.d.ts.map +1 -0
- package/build/types/components/OverrideEditor.d.ts +26 -0
- package/build/types/components/OverrideEditor.d.ts.map +1 -0
- package/build/types/components/PerformanceTab.d.ts +8 -0
- package/build/types/components/PerformanceTab.d.ts.map +1 -0
- package/build/types/components/PrimitiveSelectionPanel.d.ts +28 -0
- package/build/types/components/PrimitiveSelectionPanel.d.ts.map +1 -0
- package/build/types/components/issueTypes.d.ts +16 -0
- package/build/types/components/issueTypes.d.ts.map +1 -0
- package/build/types/components/resolveComponentName.d.ts +3 -0
- package/build/types/components/resolveComponentName.d.ts.map +1 -0
- package/build/types/components/testHelpers.d.ts +2 -0
- package/build/types/components/testHelpers.d.ts.map +1 -0
- package/build/types/css.d.d.ts +4 -0
- package/build/types/css.d.d.ts.map +1 -0
- package/build/types/fiber/DegradationNotice.d.ts +8 -0
- package/build/types/fiber/DegradationNotice.d.ts.map +1 -0
- package/build/types/fiber/DevtoolsHook.d.ts +7 -0
- package/build/types/fiber/DevtoolsHook.d.ts.map +1 -0
- package/build/types/fiber/FiberAccess.d.ts +2 -0
- package/build/types/fiber/FiberAccess.d.ts.map +1 -0
- package/build/types/fiber/FiberInspection.d.ts +6 -0
- package/build/types/fiber/FiberInspection.d.ts.map +1 -0
- package/build/types/fiber/FiberTags.d.ts +33 -0
- package/build/types/fiber/FiberTags.d.ts.map +1 -0
- package/build/types/fiber/HookStateInspector.d.ts +45 -0
- package/build/types/fiber/HookStateInspector.d.ts.map +1 -0
- package/build/types/fiber/SafeFiberOperation.d.ts +7 -0
- package/build/types/fiber/SafeFiberOperation.d.ts.map +1 -0
- package/build/types/fiber/capabilities.d.ts +38 -0
- package/build/types/fiber/capabilities.d.ts.map +1 -0
- package/build/types/fiber/traverseFiber.d.ts +5 -0
- package/build/types/fiber/traverseFiber.d.ts.map +1 -0
- package/build/types/fiber/types.d.ts +87 -0
- package/build/types/fiber/types.d.ts.map +1 -0
- package/build/types/fiber/validation.d.ts +10 -0
- package/build/types/fiber/validation.d.ts.map +1 -0
- package/build/types/hooks/createPollingStore.d.ts +5 -0
- package/build/types/hooks/createPollingStore.d.ts.map +1 -0
- package/build/types/hooks/useActiveComponents.d.ts +3 -0
- package/build/types/hooks/useActiveComponents.d.ts.map +1 -0
- package/build/types/hooks/useComponentRegistry.d.ts +3 -0
- package/build/types/hooks/useComponentRegistry.d.ts.map +1 -0
- package/build/types/hooks/useComputeSelectors.d.ts +7 -0
- package/build/types/hooks/useComputeSelectors.d.ts.map +1 -0
- package/build/types/hooks/useConsoleLogs.d.ts +7 -0
- package/build/types/hooks/useConsoleLogs.d.ts.map +1 -0
- package/build/types/hooks/useInspectorSelection.d.ts +9 -0
- package/build/types/hooks/useInspectorSelection.d.ts.map +1 -0
- package/build/types/hooks/useMetrics.d.ts +3 -0
- package/build/types/hooks/useMetrics.d.ts.map +1 -0
- package/build/types/hooks/usePersistedState.d.ts +1 -0
- package/build/types/hooks/usePersistedState.d.ts.map +1 -0
- package/build/types/hooks/useRecommendations.d.ts +10 -0
- package/build/types/hooks/useRecommendations.d.ts.map +1 -0
- package/build/types/hooks/useSharedTick.d.ts +1 -0
- package/build/types/hooks/useSharedTick.d.ts.map +1 -0
- package/build/types/hooks/useTimeElapsed.d.ts +1 -0
- package/build/types/hooks/useTimeElapsed.d.ts.map +1 -0
- package/build/types/hooks/useTrackerSubscription.d.ts +16 -0
- package/build/types/hooks/useTrackerSubscription.d.ts.map +1 -0
- package/build/types/hooks/useUnusedFieldAnalysis.d.ts +8 -0
- package/build/types/hooks/useUnusedFieldAnalysis.d.ts.map +1 -0
- package/build/types/index.d.ts +21 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/inspector/ClickToInspectSystem.d.ts +40 -0
- package/build/types/inspector/ClickToInspectSystem.d.ts.map +1 -0
- package/build/types/inspector/components/ComponentLabel.d.ts +3 -0
- package/build/types/inspector/components/ComponentLabel.d.ts.map +1 -0
- package/build/types/inspector/components/InspectorBanner.d.ts +5 -0
- package/build/types/inspector/components/InspectorBanner.d.ts.map +1 -0
- package/build/types/inspector/components/InspectorOverlay.d.ts +3 -0
- package/build/types/inspector/components/InspectorOverlay.d.ts.map +1 -0
- package/build/types/inspector/components/SelectionHighlight.d.ts +3 -0
- package/build/types/inspector/components/SelectionHighlight.d.ts.map +1 -0
- package/build/types/inspector/createClickToInspect.d.ts +3 -0
- package/build/types/inspector/createClickToInspect.d.ts.map +1 -0
- package/build/types/inspector/hooks/useAnimatedBounds.d.ts +2 -0
- package/build/types/inspector/hooks/useAnimatedBounds.d.ts.map +1 -0
- package/build/types/inspector/index.d.ts +13 -0
- package/build/types/inspector/index.d.ts.map +1 -0
- package/build/types/inspector/inspectorController.d.ts +2 -0
- package/build/types/inspector/inspectorController.d.ts.map +1 -0
- package/build/types/inspector/types.d.ts +94 -0
- package/build/types/inspector/types.d.ts.map +1 -0
- package/build/types/inspector/utils/elementBounds.d.ts +3 -0
- package/build/types/inspector/utils/elementBounds.d.ts.map +1 -0
- package/build/types/inspector/utils/interpolation.d.ts +7 -0
- package/build/types/inspector/utils/interpolation.d.ts.map +1 -0
- package/build/types/inspector/utils/labelPositioning.d.ts +3 -0
- package/build/types/inspector/utils/labelPositioning.d.ts.map +1 -0
- package/build/types/mocking/MockCacheKeyGenerator.d.ts +41 -0
- package/build/types/mocking/MockCacheKeyGenerator.d.ts.map +1 -0
- package/build/types/mocking/MockManager.d.ts +103 -0
- package/build/types/mocking/MockManager.d.ts.map +1 -0
- package/build/types/prototyping/PrototypeOverrideStore.d.ts +33 -0
- package/build/types/prototyping/PrototypeOverrideStore.d.ts.map +1 -0
- package/build/types/prototyping/index.d.ts +1 -0
- package/build/types/prototyping/index.d.ts.map +1 -0
- package/build/types/public/vite.d.ts +2 -0
- package/build/types/public/vite.d.ts.map +1 -0
- package/build/types/register.d.ts +1 -0
- package/build/types/register.d.ts.map +1 -0
- package/build/types/scss.d.d.ts +6 -0
- package/build/types/scss.d.d.ts.map +1 -0
- package/build/types/store/ComputeStore.d.ts +47 -0
- package/build/types/store/ComputeStore.d.ts.map +1 -0
- package/build/types/store/ConsoleLogStore.d.ts +29 -0
- package/build/types/store/ConsoleLogStore.d.ts.map +1 -0
- package/build/types/store/MetricsStore.d.ts +42 -0
- package/build/types/store/MetricsStore.d.ts.map +1 -0
- package/build/types/store/MonitorStore.d.ts +86 -0
- package/build/types/store/MonitorStore.d.ts.map +1 -0
- package/build/types/store/SubscribableStore.d.ts +6 -0
- package/build/types/store/SubscribableStore.d.ts.map +1 -0
- package/build/types/store/WindowErrorStore.d.ts +32 -0
- package/build/types/store/WindowErrorStore.d.ts.map +1 -0
- package/build/types/styles.d.ts +1 -0
- package/build/types/styles.d.ts.map +1 -0
- package/build/types/types/compute.d.ts +73 -0
- package/build/types/types/compute.d.ts.map +1 -0
- package/build/types/types/emissions.d.ts +24 -0
- package/build/types/types/emissions.d.ts.map +1 -0
- package/build/types/types/index.d.ts +143 -0
- package/build/types/types/index.d.ts.map +1 -0
- package/build/types/utils/ActionLifecycleTracker.d.ts +39 -0
- package/build/types/utils/ActionLifecycleTracker.d.ts.map +1 -0
- package/build/types/utils/CacheEfficiencyAnalyzer.d.ts +45 -0
- package/build/types/utils/CacheEfficiencyAnalyzer.d.ts.map +1 -0
- package/build/types/utils/CircularBuffer.d.ts +18 -0
- package/build/types/utils/CircularBuffer.d.ts.map +1 -0
- package/build/types/utils/ComponentContextCapture.d.ts +29 -0
- package/build/types/utils/ComponentContextCapture.d.ts.map +1 -0
- package/build/types/utils/ComponentPrimitiveDiscovery.d.ts +62 -0
- package/build/types/utils/ComponentPrimitiveDiscovery.d.ts.map +1 -0
- package/build/types/utils/ComponentQueryRegistry.d.ts +91 -0
- package/build/types/utils/ComponentQueryRegistry.d.ts.map +1 -0
- package/build/types/utils/ComputeMonitor.d.ts +14 -0
- package/build/types/utils/ComputeMonitor.d.ts.map +1 -0
- package/build/types/utils/EventTimeline.d.ts +102 -0
- package/build/types/utils/EventTimeline.d.ts.map +1 -0
- package/build/types/utils/LinkTraversalTracker.d.ts +43 -0
- package/build/types/utils/LinkTraversalTracker.d.ts.map +1 -0
- package/build/types/utils/MockDataGenerator.d.ts +23 -0
- package/build/types/utils/MockDataGenerator.d.ts.map +1 -0
- package/build/types/utils/ObservableClientMonitor.d.ts +62 -0
- package/build/types/utils/ObservableClientMonitor.d.ts.map +1 -0
- package/build/types/utils/PerformanceRecommendationEngine.d.ts +67 -0
- package/build/types/utils/PerformanceRecommendationEngine.d.ts.map +1 -0
- package/build/types/utils/PropertyAccessTracker.d.ts +50 -0
- package/build/types/utils/PropertyAccessTracker.d.ts.map +1 -0
- package/build/types/utils/RecommendationMatcher.d.ts +5 -0
- package/build/types/utils/RecommendationMatcher.d.ts.map +1 -0
- package/build/types/utils/SubscriptionTracker.d.ts +17 -0
- package/build/types/utils/SubscriptionTracker.d.ts.map +1 -0
- package/build/types/utils/UnusedFieldAnalyzer.d.ts +46 -0
- package/build/types/utils/UnusedFieldAnalyzer.d.ts.map +1 -0
- package/build/types/utils/WaterfallDetector.d.ts +28 -0
- package/build/types/utils/WaterfallDetector.d.ts.map +1 -0
- package/build/types/utils/computePayload.d.ts +3 -0
- package/build/types/utils/computePayload.d.ts.map +1 -0
- package/build/types/utils/computeRequest.d.ts +20 -0
- package/build/types/utils/computeRequest.d.ts.map +1 -0
- package/build/types/utils/format.d.ts +5 -0
- package/build/types/utils/format.d.ts.map +1 -0
- package/build/types/utils/logger.d.ts +2 -0
- package/build/types/utils/logger.d.ts.map +1 -0
- package/build/types/vite/constants.d.ts +1 -0
- package/build/types/vite/constants.d.ts.map +1 -0
- package/build/types/vite/hookInstaller.d.ts +1 -0
- package/build/types/vite/hookInstaller.d.ts.map +1 -0
- package/build/types/vite/index.d.ts +20 -0
- package/build/types/vite/index.d.ts.map +1 -0
- package/package.json +114 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/build-css.mjs. Do not edit by hand.
|
|
2
|
+
const styles = {
|
|
3
|
+
"componentCard": "ComponentCard-module__componentCard___CXSvCQzk",
|
|
4
|
+
"dt-fade-up": "ComponentCard-module__dt-fade-up___psFECV6x",
|
|
5
|
+
"header": "ComponentCard-module__header___Jn2yzzpo",
|
|
6
|
+
"headerLeft": "ComponentCard-module__headerLeft___lSFBRZeU",
|
|
7
|
+
"expandIcon": "ComponentCard-module__expandIcon___bVDJMvCw",
|
|
8
|
+
"componentName": "ComponentCard-module__componentName___zi9kmHje",
|
|
9
|
+
"headerRight": "ComponentCard-module__headerRight___Onizt4Xz",
|
|
10
|
+
"hookCountTag": "ComponentCard-module__hookCountTag___Au-g656K",
|
|
11
|
+
"warningTag": "ComponentCard-module__warningTag___SEHm7XTm",
|
|
12
|
+
"renderCount": "ComponentCard-module__renderCount___x5573ve1",
|
|
13
|
+
"avgDuration": "ComponentCard-module__avgDuration___DNliVFhR",
|
|
14
|
+
"healthDot": "ComponentCard-module__healthDot___am-3Y3CP",
|
|
15
|
+
"health_healthy": "ComponentCard-module__health_healthy___SzlgxyYl",
|
|
16
|
+
"health_warning": "ComponentCard-module__health_warning___ArfusCDB",
|
|
17
|
+
"health_error": "ComponentCard-module__health_error___douF5P6Z",
|
|
18
|
+
"issueCountTag": "ComponentCard-module__issueCountTag___nGCcS8sq",
|
|
19
|
+
"healthyLabel": "ComponentCard-module__healthyLabel___4ZF6SbZo",
|
|
20
|
+
"body": "ComponentCard-module__body___8jD0iuDQ",
|
|
21
|
+
"hooks": "ComponentCard-module__hooks___FXXF01wg",
|
|
22
|
+
"inlineIssues": "ComponentCard-module__inlineIssues___KDlbm-3o",
|
|
23
|
+
"inlineIssue": "ComponentCard-module__inlineIssue___NaFdeja5",
|
|
24
|
+
"inlineIssue_error": "ComponentCard-module__inlineIssue_error___Amx-Dk0L",
|
|
25
|
+
"inlineIssue_warning": "ComponentCard-module__inlineIssue_warning___nObMVMm3",
|
|
26
|
+
"inlineIssue_info": "ComponentCard-module__inlineIssue_info___8eBQmfKv",
|
|
27
|
+
"inlineIssueText": "ComponentCard-module__inlineIssueText___2VPigAUS",
|
|
28
|
+
"inlineIssueSuggestion": "ComponentCard-module__inlineIssueSuggestion___tcOUGQc-",
|
|
29
|
+
"dt-shimmer": "ComponentCard-module__dt-shimmer___Tet5666-"
|
|
30
|
+
};
|
|
31
|
+
export default styles;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { Button } from "@blueprintjs/core";
|
|
18
|
+
import classNames from "classnames";
|
|
19
|
+
import React, { useMemo } from "react";
|
|
20
|
+
import { useComputeMetrics, useComputeNetworkPaused, useComputeRecording, useComputeRequests } from "../hooks/useComputeSelectors.js";
|
|
21
|
+
import { formatBytes, formatNumber } from "../utils/format.js";
|
|
22
|
+
import { BubbleChart } from "./BubbleChart.js";
|
|
23
|
+
import styles from "./MonitoringPanel.module.scss.js";
|
|
24
|
+
export const ComputeTab = ({
|
|
25
|
+
computeStore
|
|
26
|
+
}) => {
|
|
27
|
+
const metrics = useComputeMetrics(computeStore);
|
|
28
|
+
const requests = useComputeRequests(computeStore);
|
|
29
|
+
const isRecording = useComputeRecording(computeStore);
|
|
30
|
+
const isNetworkPaused = useComputeNetworkPaused(computeStore);
|
|
31
|
+
const [selectedIds, setSelectedIds] = React.useState([]);
|
|
32
|
+
const selectedIdSet = useMemo(() => new Set(selectedIds), [selectedIds]);
|
|
33
|
+
const recentRequests = useMemo(() => requests.slice(-50).reverse(), [requests]);
|
|
34
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
35
|
+
className: styles.computeControls
|
|
36
|
+
}, isRecording ? /*#__PURE__*/React.createElement(Button, {
|
|
37
|
+
onClick: () => computeStore.setIsRecording(false),
|
|
38
|
+
icon: "stop",
|
|
39
|
+
intent: "danger",
|
|
40
|
+
size: "small"
|
|
41
|
+
}, "Stop Recording") : /*#__PURE__*/React.createElement(Button, {
|
|
42
|
+
onClick: () => computeStore.setIsRecording(true),
|
|
43
|
+
icon: "record",
|
|
44
|
+
intent: "primary",
|
|
45
|
+
size: "small"
|
|
46
|
+
}, "Start Recording"), /*#__PURE__*/React.createElement(Button, {
|
|
47
|
+
onClick: () => computeStore.toggleNetworkPaused(),
|
|
48
|
+
icon: isNetworkPaused ? "play" : "pause",
|
|
49
|
+
size: "small",
|
|
50
|
+
title: "Block all OSDK network requests"
|
|
51
|
+
}, isNetworkPaused ? "Resume" : "Pause", " Network")), (() => /*#__PURE__*/React.createElement("div", {
|
|
52
|
+
className: styles.computeMetricsGrid
|
|
53
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
54
|
+
className: styles.metricCell
|
|
55
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
56
|
+
className: styles.metricLabel
|
|
57
|
+
}, "Total Usage"), /*#__PURE__*/React.createElement("span", {
|
|
58
|
+
className: styles.metricValue
|
|
59
|
+
}, formatNumber(metrics.totalUsage)), /*#__PURE__*/React.createElement("span", {
|
|
60
|
+
className: styles.metricSubtext
|
|
61
|
+
}, metrics.fulfilledCount, " requests")), /*#__PURE__*/React.createElement("div", {
|
|
62
|
+
className: styles.metricCell
|
|
63
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
64
|
+
className: styles.metricLabel
|
|
65
|
+
}, "Last Minute"), /*#__PURE__*/React.createElement("span", {
|
|
66
|
+
className: styles.metricValue
|
|
67
|
+
}, formatNumber(metrics.lastMinuteUsage)), /*#__PURE__*/React.createElement("span", {
|
|
68
|
+
className: styles.metricSubtext
|
|
69
|
+
}, "compute units")), /*#__PURE__*/React.createElement("div", {
|
|
70
|
+
className: styles.metricCell
|
|
71
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
72
|
+
className: styles.metricLabel
|
|
73
|
+
}, "Avg per Request"), /*#__PURE__*/React.createElement("span", {
|
|
74
|
+
className: styles.metricValue
|
|
75
|
+
}, formatNumber(metrics.averageUsagePerRequest)), /*#__PURE__*/React.createElement("span", {
|
|
76
|
+
className: styles.metricSubtext
|
|
77
|
+
}, "compute units")), /*#__PURE__*/React.createElement("div", {
|
|
78
|
+
className: styles.metricCell
|
|
79
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
80
|
+
className: styles.metricLabel
|
|
81
|
+
}, "Avg Response Size"), /*#__PURE__*/React.createElement("span", {
|
|
82
|
+
className: styles.metricValue
|
|
83
|
+
}, formatBytes(metrics.averageResponseBytes)), /*#__PURE__*/React.createElement("span", {
|
|
84
|
+
className: styles.metricSubtext
|
|
85
|
+
}, metrics.requestCount, " total", metrics.fulfilledWithoutUsageCount > 0 && /*#__PURE__*/React.createElement(React.Fragment, null, ", ", metrics.fulfilledWithoutUsageCount, " without usage data")))))(), requests.length > 0 && /*#__PURE__*/React.createElement("div", {
|
|
86
|
+
className: styles.bubbleChartContainer
|
|
87
|
+
}, /*#__PURE__*/React.createElement(BubbleChart, {
|
|
88
|
+
computeStore: computeStore,
|
|
89
|
+
fillHeight: false,
|
|
90
|
+
selectedIds: selectedIds,
|
|
91
|
+
onSelectRequest: id => {
|
|
92
|
+
if (id) {
|
|
93
|
+
setSelectedIds([id]);
|
|
94
|
+
} else {
|
|
95
|
+
setSelectedIds([]);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
99
|
+
className: styles.operationsList
|
|
100
|
+
}, recentRequests.length > 0 ? recentRequests.map(req => /*#__PURE__*/React.createElement(ComputeRequestItem, {
|
|
101
|
+
key: req.id,
|
|
102
|
+
request: req,
|
|
103
|
+
isSelected: selectedIdSet.has(req.id)
|
|
104
|
+
})) : /*#__PURE__*/React.createElement("div", {
|
|
105
|
+
className: styles.emptyState
|
|
106
|
+
}, isRecording ? "No compute requests yet" : "Start recording to track compute usage")));
|
|
107
|
+
};
|
|
108
|
+
const REQUEST_DISPLAY = {
|
|
109
|
+
"fulfilled": {
|
|
110
|
+
icon: "\u2713",
|
|
111
|
+
class: styles.computeFulfilled
|
|
112
|
+
},
|
|
113
|
+
"fulfilled-without-usage": {
|
|
114
|
+
icon: "\u00b7",
|
|
115
|
+
class: styles.computeFulfilledWithoutUsage
|
|
116
|
+
},
|
|
117
|
+
"failed": {
|
|
118
|
+
icon: "\u00d7",
|
|
119
|
+
class: styles.computeFailed
|
|
120
|
+
},
|
|
121
|
+
"pending": {
|
|
122
|
+
icon: "\u22ef",
|
|
123
|
+
class: styles.computePending
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
const DEFAULT_REQUEST_DISPLAY = {
|
|
127
|
+
icon: "\u2022",
|
|
128
|
+
class: ""
|
|
129
|
+
};
|
|
130
|
+
function getUsageClass(usage) {
|
|
131
|
+
if (usage > 1000) {
|
|
132
|
+
return styles.danger;
|
|
133
|
+
}
|
|
134
|
+
if (usage > 100) {
|
|
135
|
+
return styles.warning;
|
|
136
|
+
}
|
|
137
|
+
return styles.success;
|
|
138
|
+
}
|
|
139
|
+
const ComputeRequestItem = ({
|
|
140
|
+
request,
|
|
141
|
+
isSelected
|
|
142
|
+
}) => {
|
|
143
|
+
const {
|
|
144
|
+
icon: requestIcon,
|
|
145
|
+
class: requestClass
|
|
146
|
+
} = REQUEST_DISPLAY[request.type] ?? DEFAULT_REQUEST_DISPLAY;
|
|
147
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
148
|
+
className: classNames(styles.operationItem, {
|
|
149
|
+
[styles.selectedItem]: isSelected
|
|
150
|
+
})
|
|
151
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
152
|
+
className: classNames(styles.operationType, requestClass)
|
|
153
|
+
}, requestIcon), /*#__PURE__*/React.createElement("div", {
|
|
154
|
+
className: styles.operationDetails
|
|
155
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
156
|
+
className: styles.operationSignature
|
|
157
|
+
}, request.requestUrl), /*#__PURE__*/React.createElement("div", {
|
|
158
|
+
className: styles.operationTime
|
|
159
|
+
}, new Date(request.requestTimestamp).toLocaleTimeString()), /*#__PURE__*/React.createElement("div", {
|
|
160
|
+
className: styles.operationMetrics
|
|
161
|
+
}, request.type === "fulfilled" && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
|
|
162
|
+
className: classNames(styles.operationMetric, getUsageClass(request.computeUsage))
|
|
163
|
+
}, formatNumber(request.computeUsage), " CU"), /*#__PURE__*/React.createElement("span", {
|
|
164
|
+
className: styles.operationMetric
|
|
165
|
+
}, formatBytes(request.responsePayloadBytes))), request.type === "fulfilled-without-usage" && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
|
|
166
|
+
className: styles.operationMetric
|
|
167
|
+
}, "no usage data"), /*#__PURE__*/React.createElement("span", {
|
|
168
|
+
className: styles.operationMetric
|
|
169
|
+
}, formatBytes(request.responsePayloadBytes))), request.type === "failed" && /*#__PURE__*/React.createElement("span", {
|
|
170
|
+
className: classNames(styles.operationMetric, styles.danger)
|
|
171
|
+
}, request.error.type), request.type === "pending" && /*#__PURE__*/React.createElement("span", {
|
|
172
|
+
className: styles.operationMetric
|
|
173
|
+
}, "Loading..."))));
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=ComputeTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComputeTab.js","names":["Button","classNames","React","useMemo","useComputeMetrics","useComputeNetworkPaused","useComputeRecording","useComputeRequests","formatBytes","formatNumber","BubbleChart","styles","ComputeTab","computeStore","metrics","requests","isRecording","isNetworkPaused","selectedIds","setSelectedIds","useState","selectedIdSet","Set","recentRequests","slice","reverse","createElement","Fragment","className","computeControls","onClick","setIsRecording","icon","intent","size","toggleNetworkPaused","title","computeMetricsGrid","metricCell","metricLabel","metricValue","totalUsage","metricSubtext","fulfilledCount","lastMinuteUsage","averageUsagePerRequest","averageResponseBytes","requestCount","fulfilledWithoutUsageCount","length","bubbleChartContainer","fillHeight","onSelectRequest","id","operationsList","map","req","ComputeRequestItem","key","request","isSelected","has","emptyState","REQUEST_DISPLAY","class","computeFulfilled","computeFulfilledWithoutUsage","computeFailed","computePending","DEFAULT_REQUEST_DISPLAY","getUsageClass","usage","danger","warning","success","requestIcon","requestClass","type","operationItem","selectedItem","operationType","operationDetails","operationSignature","requestUrl","operationTime","Date","requestTimestamp","toLocaleTimeString","operationMetrics","operationMetric","computeUsage","responsePayloadBytes","error"],"sources":["ComputeTab.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@blueprintjs/core\";\nimport classNames from \"classnames\";\nimport React, { useMemo } from \"react\";\nimport {\n useComputeMetrics,\n useComputeNetworkPaused,\n useComputeRecording,\n useComputeRequests,\n} from \"../hooks/useComputeSelectors.js\";\nimport type { ComputeStore } from \"../store/ComputeStore.js\";\nimport type { ComputeRequest } from \"../types/compute.js\";\nimport { formatBytes, formatNumber } from \"../utils/format.js\";\nimport { BubbleChart } from \"./BubbleChart.js\";\nimport styles from \"./MonitoringPanel.module.scss\";\n\nexport interface ComputeTabProps {\n computeStore: ComputeStore;\n}\n\nexport const ComputeTab: React.FC<ComputeTabProps> = ({ computeStore }) => {\n const metrics = useComputeMetrics(computeStore);\n const requests = useComputeRequests(computeStore);\n const isRecording = useComputeRecording(computeStore);\n const isNetworkPaused = useComputeNetworkPaused(computeStore);\n const [selectedIds, setSelectedIds] = React.useState<string[]>([]);\n\n const selectedIdSet = useMemo(() => new Set(selectedIds), [selectedIds]);\n\n const renderMetrics = () => (\n <div className={styles.computeMetricsGrid}>\n <div className={styles.metricCell}>\n <span className={styles.metricLabel}>Total Usage</span>\n <span className={styles.metricValue}>\n {formatNumber(metrics.totalUsage)}\n </span>\n <span className={styles.metricSubtext}>\n {metrics.fulfilledCount} requests\n </span>\n </div>\n\n <div className={styles.metricCell}>\n <span className={styles.metricLabel}>Last Minute</span>\n <span className={styles.metricValue}>\n {formatNumber(metrics.lastMinuteUsage)}\n </span>\n <span className={styles.metricSubtext}>compute units</span>\n </div>\n\n <div className={styles.metricCell}>\n <span className={styles.metricLabel}>Avg per Request</span>\n <span className={styles.metricValue}>\n {formatNumber(metrics.averageUsagePerRequest)}\n </span>\n <span className={styles.metricSubtext}>compute units</span>\n </div>\n\n <div className={styles.metricCell}>\n <span className={styles.metricLabel}>Avg Response Size</span>\n <span className={styles.metricValue}>\n {formatBytes(metrics.averageResponseBytes)}\n </span>\n <span className={styles.metricSubtext}>\n {metrics.requestCount} total\n {metrics.fulfilledWithoutUsageCount > 0 && (\n <>\n {\", \"}\n {metrics.fulfilledWithoutUsageCount} without usage data\n </>\n )}\n </span>\n </div>\n </div>\n );\n\n const recentRequests = useMemo(\n () => requests.slice(-50).reverse(),\n [requests],\n );\n\n return (\n <>\n <div className={styles.computeControls}>\n {isRecording\n ? (\n <Button\n onClick={() => computeStore.setIsRecording(false)}\n icon=\"stop\"\n intent=\"danger\"\n size=\"small\"\n >\n Stop Recording\n </Button>\n )\n : (\n <Button\n onClick={() => computeStore.setIsRecording(true)}\n icon=\"record\"\n intent=\"primary\"\n size=\"small\"\n >\n Start Recording\n </Button>\n )}\n <Button\n onClick={() => computeStore.toggleNetworkPaused()}\n icon={isNetworkPaused ? \"play\" : \"pause\"}\n size=\"small\"\n title=\"Block all OSDK network requests\"\n >\n {isNetworkPaused ? \"Resume\" : \"Pause\"} Network\n </Button>\n </div>\n\n {renderMetrics()}\n\n {requests.length > 0 && (\n <div className={styles.bubbleChartContainer}>\n <BubbleChart\n computeStore={computeStore}\n fillHeight={false}\n selectedIds={selectedIds}\n onSelectRequest={(id) => {\n if (id) {\n setSelectedIds([id]);\n } else {\n setSelectedIds([]);\n }\n }}\n />\n </div>\n )}\n\n <div className={styles.operationsList}>\n {recentRequests.length > 0\n ? recentRequests.map((req) => (\n <ComputeRequestItem\n key={req.id}\n request={req}\n isSelected={selectedIdSet.has(req.id)}\n />\n ))\n : (\n <div className={styles.emptyState}>\n {isRecording\n ? \"No compute requests yet\"\n : \"Start recording to track compute usage\"}\n </div>\n )}\n </div>\n </>\n );\n};\n\nconst REQUEST_DISPLAY: Record<string, { icon: string; class: string }> = {\n \"fulfilled\": { icon: \"\\u2713\", class: styles.computeFulfilled },\n \"fulfilled-without-usage\": {\n icon: \"\\u00b7\",\n class: styles.computeFulfilledWithoutUsage,\n },\n \"failed\": { icon: \"\\u00d7\", class: styles.computeFailed },\n \"pending\": { icon: \"\\u22ef\", class: styles.computePending },\n};\n\nconst DEFAULT_REQUEST_DISPLAY = { icon: \"\\u2022\", class: \"\" };\n\ninterface ComputeRequestItemProps {\n request: ComputeRequest;\n isSelected: boolean;\n}\n\nfunction getUsageClass(usage: number): string {\n if (usage > 1000) {\n return styles.danger;\n }\n if (usage > 100) {\n return styles.warning;\n }\n return styles.success;\n}\n\nconst ComputeRequestItem: React.FC<ComputeRequestItemProps> = ({\n request,\n isSelected,\n}) => {\n const { icon: requestIcon, class: requestClass } =\n REQUEST_DISPLAY[request.type] ?? DEFAULT_REQUEST_DISPLAY;\n\n return (\n <div\n className={classNames(styles.operationItem, {\n [styles.selectedItem]: isSelected,\n })}\n >\n <span className={classNames(styles.operationType, requestClass)}>\n {requestIcon}\n </span>\n <div className={styles.operationDetails}>\n <div className={styles.operationSignature}>\n {request.requestUrl}\n </div>\n <div className={styles.operationTime}>\n {new Date(request.requestTimestamp).toLocaleTimeString()}\n </div>\n <div className={styles.operationMetrics}>\n {request.type === \"fulfilled\" && (\n <>\n <span\n className={classNames(\n styles.operationMetric,\n getUsageClass(request.computeUsage),\n )}\n >\n {formatNumber(request.computeUsage)} CU\n </span>\n <span className={styles.operationMetric}>\n {formatBytes(request.responsePayloadBytes)}\n </span>\n </>\n )}\n {request.type === \"fulfilled-without-usage\" && (\n <>\n <span className={styles.operationMetric}>\n no usage data\n </span>\n <span className={styles.operationMetric}>\n {formatBytes(request.responsePayloadBytes)}\n </span>\n </>\n )}\n {request.type === \"failed\" && (\n <span className={classNames(styles.operationMetric, styles.danger)}>\n {request.error.type}\n </span>\n )}\n {request.type === \"pending\" && (\n <span className={styles.operationMetric}>\n Loading...\n </span>\n )}\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { Button } from "@blueprintjs/core";
|
|
18
|
+
import classNames from "classnames";
|
|
19
|
+
import React, { useCallback, useRef, useState } from "react";
|
|
20
|
+
import styles from "./CopyableCodeBlock.module.scss.js";
|
|
21
|
+
export const CopyableCodeBlock = ({
|
|
22
|
+
children,
|
|
23
|
+
className
|
|
24
|
+
}) => {
|
|
25
|
+
const [copied, setCopied] = useState(false);
|
|
26
|
+
const copyTimeoutRef = useRef(undefined);
|
|
27
|
+
const handleCopy = useCallback(async () => {
|
|
28
|
+
const text = typeof children === "string" ? children : String(children ?? "");
|
|
29
|
+
try {
|
|
30
|
+
await navigator.clipboard.writeText(text);
|
|
31
|
+
setCopied(true);
|
|
32
|
+
clearTimeout(copyTimeoutRef.current);
|
|
33
|
+
copyTimeoutRef.current = setTimeout(() => setCopied(false), 1500);
|
|
34
|
+
} catch {}
|
|
35
|
+
}, [children]);
|
|
36
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
37
|
+
className: styles.container
|
|
38
|
+
}, /*#__PURE__*/React.createElement("pre", {
|
|
39
|
+
className: classNames(styles.code, className)
|
|
40
|
+
}, children), /*#__PURE__*/React.createElement(Button, {
|
|
41
|
+
variant: "minimal",
|
|
42
|
+
size: "small",
|
|
43
|
+
icon: copied ? "tick" : "clipboard",
|
|
44
|
+
className: classNames(styles.copyButton, copied && styles.copied),
|
|
45
|
+
onClick: () => void handleCopy(),
|
|
46
|
+
"aria-label": "Copy to clipboard"
|
|
47
|
+
}));
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=CopyableCodeBlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CopyableCodeBlock.js","names":["Button","classNames","React","useCallback","useRef","useState","styles","CopyableCodeBlock","children","className","copied","setCopied","copyTimeoutRef","undefined","handleCopy","text","String","navigator","clipboard","writeText","clearTimeout","current","setTimeout","createElement","container","code","variant","size","icon","copyButton","onClick"],"sources":["CopyableCodeBlock.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@blueprintjs/core\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useRef, useState } from \"react\";\nimport styles from \"./CopyableCodeBlock.module.scss\";\n\ninterface CopyableCodeBlockProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport const CopyableCodeBlock: React.FC<CopyableCodeBlockProps> = ({\n children,\n className,\n}) => {\n const [copied, setCopied] = useState(false);\n const copyTimeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n const handleCopy = useCallback(async () => {\n const text = typeof children === \"string\"\n ? children\n : String(children ?? \"\");\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n clearTimeout(copyTimeoutRef.current);\n copyTimeoutRef.current = setTimeout(() => setCopied(false), 1500);\n } catch {\n }\n }, [children]);\n\n return (\n <div className={styles.container}>\n <pre className={classNames(styles.code, className)}>{children}</pre>\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon={copied ? \"tick\" : \"clipboard\"}\n className={classNames(styles.copyButton, copied && styles.copied)}\n onClick={() => void handleCopy()}\n aria-label=\"Copy to clipboard\"\n />\n </div>\n );\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,mBAAmB;AAC1C,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,WAAW,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAC5D,OAAOC,MAAM,MAAM,iCAAiC;AAOpD,OAAO,MAAMC,iBAAmD,GAAGA,CAAC;EAClEC,QAAQ;EACRC;AACF,CAAC,KAAK;EACJ,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGN,QAAQ,CAAC,KAAK,CAAC;EAC3C,MAAMO,cAAc,GAAGR,MAAM,CAAgCS,SAAS,CAAC;EAEvE,MAAMC,UAAU,GAAGX,WAAW,CAAC,YAAY;IACzC,MAAMY,IAAI,GAAG,OAAOP,QAAQ,KAAK,QAAQ,GACrCA,QAAQ,GACRQ,MAAM,CAACR,QAAQ,IAAI,EAAE,CAAC;IAC1B,IAAI;MACF,MAAMS,SAAS,CAACC,SAAS,CAACC,SAAS,CAACJ,IAAI,CAAC;MACzCJ,SAAS,CAAC,IAAI,CAAC;MACfS,YAAY,CAACR,cAAc,CAACS,OAAO,CAAC;MACpCT,cAAc,CAACS,OAAO,GAAGC,UAAU,CAAC,MAAMX,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACnE,CAAC,CAAC,MAAM,CACR;EACF,CAAC,EAAE,CAACH,QAAQ,CAAC,CAAC;EAEd,oBACEN,KAAA,CAAAqB,aAAA;IAAKd,SAAS,EAAEH,MAAM,CAACkB;EAAU,gBAC/BtB,KAAA,CAAAqB,aAAA;IAAKd,SAAS,EAAER,UAAU,CAACK,MAAM,CAACmB,IAAI,EAAEhB,SAAS;EAAE,GAAED,QAAc,CAAC,eACpEN,KAAA,CAAAqB,aAAA,CAACvB,MAAM;IACL0B,OAAO,EAAC,SAAS;IACjBC,IAAI,EAAC,OAAO;IACZC,IAAI,EAAElB,MAAM,GAAG,MAAM,GAAG,WAAY;IACpCD,SAAS,EAAER,UAAU,CAACK,MAAM,CAACuB,UAAU,EAAEnB,MAAM,IAAIJ,MAAM,CAACI,MAAM,CAAE;IAClEoB,OAAO,EAAEA,CAAA,KAAM,KAAKhB,UAAU,CAAC,CAAE;IACjC,cAAW;EAAmB,CAC/B,CACE,CAAC;AAEV,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/build-css.mjs. Do not edit by hand.
|
|
2
|
+
const styles = {
|
|
3
|
+
"container": "CopyableCodeBlock-module__container___sqmTeXF-",
|
|
4
|
+
"copyButton": "CopyableCodeBlock-module__copyButton___L3vWF1Yx",
|
|
5
|
+
"code": "CopyableCodeBlock-module__code___Pn9fDhKT",
|
|
6
|
+
"copied": "CopyableCodeBlock-module__copied___TlrZLIlu",
|
|
7
|
+
"dt-shimmer": "CopyableCodeBlock-module__dt-shimmer___vnQsR71K",
|
|
8
|
+
"dt-fade-up": "CopyableCodeBlock-module__dt-fade-up___HbuWnBAS"
|
|
9
|
+
};
|
|
10
|
+
export default styles;
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { Icon, InputGroup } from "@blueprintjs/core";
|
|
18
|
+
import classNames from "classnames";
|
|
19
|
+
import React, { useCallback, useMemo, useRef, useState } from "react";
|
|
20
|
+
import { createPollingStore } from "../hooks/createPollingStore.js";
|
|
21
|
+
import { useActiveComponents } from "../hooks/useActiveComponents.js";
|
|
22
|
+
import { useConsoleLogs } from "../hooks/useConsoleLogs.js";
|
|
23
|
+
import { formatTime } from "../utils/format.js";
|
|
24
|
+
import { CacheInspectorTab } from "./CacheInspectorTab.js";
|
|
25
|
+
import { ComponentCard } from "./ComponentCard.js";
|
|
26
|
+
import styles from "./DebuggingTab.module.scss.js";
|
|
27
|
+
import { ImprovementsTab } from "./ImprovementsTab.js";
|
|
28
|
+
import { IssueCard } from "./IssueCard.js";
|
|
29
|
+
import { LogEntryCard } from "./LogEntryCard.js";
|
|
30
|
+
import { resolveComponentName } from "./resolveComponentName.js";
|
|
31
|
+
const SEVERITY_ORDER = {
|
|
32
|
+
error: 0,
|
|
33
|
+
warning: 1,
|
|
34
|
+
info: 2
|
|
35
|
+
};
|
|
36
|
+
function collectIssues(monitorStore, now) {
|
|
37
|
+
const issues = [];
|
|
38
|
+
for (const err of monitorStore.getMetricsStore().getActionErrors()) {
|
|
39
|
+
issues.push({
|
|
40
|
+
id: err.id,
|
|
41
|
+
severity: "error",
|
|
42
|
+
category: "action failure",
|
|
43
|
+
title: "Action failed",
|
|
44
|
+
message: err.message,
|
|
45
|
+
suggestion: err.validationErrors?.length ? "Fix validation errors before retrying" : undefined,
|
|
46
|
+
timestamp: err.timestamp,
|
|
47
|
+
expandable: {
|
|
48
|
+
stack: err.stack,
|
|
49
|
+
detailsJson: JSON.stringify({
|
|
50
|
+
actionType: err.actionType,
|
|
51
|
+
parameters: err.parameters
|
|
52
|
+
}, null, 2)
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const windowErrors = monitorStore.getWindowErrorStore().getEntries();
|
|
57
|
+
// Bucketed at 100ms granularity. The lookup checks the current bucket plus
|
|
58
|
+
// the two adjacent buckets so that any console.error within ±100ms of a
|
|
59
|
+
// window error collides regardless of where the timestamps fall.
|
|
60
|
+
const windowErrorBuckets = new Set();
|
|
61
|
+
for (const we of windowErrors) {
|
|
62
|
+
const expandable = {};
|
|
63
|
+
if (we.stack) {
|
|
64
|
+
expandable.stack = we.stack;
|
|
65
|
+
}
|
|
66
|
+
if (we.filename || we.lineno || we.colno) {
|
|
67
|
+
expandable.detailsJson = JSON.stringify({
|
|
68
|
+
filename: we.filename,
|
|
69
|
+
lineno: we.lineno,
|
|
70
|
+
colno: we.colno
|
|
71
|
+
}, null, 2);
|
|
72
|
+
}
|
|
73
|
+
const hasExpandable = expandable.stack !== undefined || expandable.detailsJson !== undefined;
|
|
74
|
+
issues.push({
|
|
75
|
+
id: `windowError-${we.id}`,
|
|
76
|
+
severity: "error",
|
|
77
|
+
category: we.kind === "unhandledrejection" ? "unhandled rejection" : "uncaught error",
|
|
78
|
+
title: we.kind === "unhandledrejection" ? "Unhandled promise rejection" : "Uncaught error",
|
|
79
|
+
message: we.message,
|
|
80
|
+
timestamp: we.timestamp,
|
|
81
|
+
...(hasExpandable ? {
|
|
82
|
+
expandable
|
|
83
|
+
} : {})
|
|
84
|
+
});
|
|
85
|
+
const bucket = Math.floor(we.timestamp / 100);
|
|
86
|
+
windowErrorBuckets.add(`${we.message}|${bucket}`);
|
|
87
|
+
}
|
|
88
|
+
for (const entry of monitorStore.getConsoleLogStore().getEntries()) {
|
|
89
|
+
if (entry.level !== "error") {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const messageText = entry.args.join(" ");
|
|
93
|
+
const bucket = Math.floor(entry.timestamp / 100);
|
|
94
|
+
if (windowErrorBuckets.has(`${messageText}|${bucket - 1}`) || windowErrorBuckets.has(`${messageText}|${bucket}`) || windowErrorBuckets.has(`${messageText}|${bucket + 1}`)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const issue = {
|
|
98
|
+
id: `console-${entry.id}`,
|
|
99
|
+
severity: "error",
|
|
100
|
+
category: "console error",
|
|
101
|
+
title: "console.error",
|
|
102
|
+
message: messageText,
|
|
103
|
+
timestamp: entry.timestamp
|
|
104
|
+
};
|
|
105
|
+
if (entry.source) {
|
|
106
|
+
issue.expandable = {
|
|
107
|
+
detailsJson: JSON.stringify({
|
|
108
|
+
source: entry.source
|
|
109
|
+
}, null, 2)
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
issues.push(issue);
|
|
113
|
+
}
|
|
114
|
+
for (const wr of monitorStore.getPropertyAccessTracker().getWastedRenders()) {
|
|
115
|
+
issues.push({
|
|
116
|
+
id: `wasted-${wr.componentId}-${wr.timestamp}`,
|
|
117
|
+
severity: "warning",
|
|
118
|
+
category: "wasted render",
|
|
119
|
+
title: `${wr.count} renders without property access`,
|
|
120
|
+
message: `${wr.componentName} renders but doesn't use the data`,
|
|
121
|
+
suggestion: "Check if this component needs this data subscription",
|
|
122
|
+
componentId: wr.componentId,
|
|
123
|
+
componentName: wr.componentName,
|
|
124
|
+
timestamp: wr.timestamp
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
for (const up of monitorStore.getPropertyAccessTracker().getUnusedProperties()) {
|
|
128
|
+
issues.push({
|
|
129
|
+
id: `unused-${up.componentId}-${up.propertyName}`,
|
|
130
|
+
severity: "info",
|
|
131
|
+
category: "unused field",
|
|
132
|
+
title: `"${up.propertyName}" loaded but never accessed`,
|
|
133
|
+
message: `${up.componentName} fetches this field but never reads it`,
|
|
134
|
+
suggestion: "Remove from query to reduce payload",
|
|
135
|
+
componentId: up.componentId,
|
|
136
|
+
componentName: up.componentName,
|
|
137
|
+
timestamp: now
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
issues.sort((a, b) => SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity] || b.timestamp - a.timestamp);
|
|
141
|
+
return issues;
|
|
142
|
+
}
|
|
143
|
+
export const DebuggingTab = ({
|
|
144
|
+
monitorStore
|
|
145
|
+
}) => {
|
|
146
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
147
|
+
const [cacheExpanded, setCacheExpanded] = useState(false);
|
|
148
|
+
const [consoleExpanded, setConsoleExpanded] = useState(true);
|
|
149
|
+
const [improvementsExpanded, setImprovementsExpanded] = useState(true);
|
|
150
|
+
const componentRefs = useRef(new Map());
|
|
151
|
+
const activeComponents = useActiveComponents(monitorStore);
|
|
152
|
+
const {
|
|
153
|
+
entries: consoleEntries,
|
|
154
|
+
count: consoleCount,
|
|
155
|
+
clear: clearConsole
|
|
156
|
+
} = useConsoleLogs(monitorStore);
|
|
157
|
+
const issueStore = React.useMemo(() => createPollingStore(() => collectIssues(monitorStore, Date.now()), 2000), [monitorStore]);
|
|
158
|
+
const issues = React.useSyncExternalStore(issueStore.subscribe, issueStore.getSnapshot) ?? [];
|
|
159
|
+
const cacheCountStore = React.useMemo(() => createPollingStore(async () => {
|
|
160
|
+
const entries = await monitorStore.loadCacheEntries();
|
|
161
|
+
return entries.length;
|
|
162
|
+
}, 5000), [monitorStore]);
|
|
163
|
+
const cacheCount = React.useSyncExternalStore(cacheCountStore.subscribe, cacheCountStore.getSnapshot) ?? 0;
|
|
164
|
+
const searchFilter = useCallback(issue => {
|
|
165
|
+
if (!searchQuery.trim()) {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
const q = searchQuery.toLowerCase();
|
|
169
|
+
return issue.title.toLowerCase().includes(q) || issue.message.toLowerCase().includes(q) || (issue.componentName?.toLowerCase().includes(q) ?? false) || issue.category.toLowerCase().includes(q);
|
|
170
|
+
}, [searchQuery]);
|
|
171
|
+
const errorIssues = useMemo(() => issues.filter(i => i.severity === "error").filter(searchFilter), [issues, searchFilter]);
|
|
172
|
+
const filteredConsoleEntries = useMemo(() => {
|
|
173
|
+
if (!searchQuery.trim()) {
|
|
174
|
+
return consoleEntries;
|
|
175
|
+
}
|
|
176
|
+
const q = searchQuery.toLowerCase();
|
|
177
|
+
return consoleEntries.filter(entry => entry.args.some(arg => arg.toLowerCase().includes(q)) || entry.level.includes(q) || (entry.source?.toLowerCase().includes(q) ?? false));
|
|
178
|
+
}, [consoleEntries, searchQuery]);
|
|
179
|
+
const issuesByComponent = useMemo(() => {
|
|
180
|
+
const map = new Map();
|
|
181
|
+
for (const issue of issues) {
|
|
182
|
+
if (issue.componentId) {
|
|
183
|
+
const existing = map.get(issue.componentId);
|
|
184
|
+
if (existing) {
|
|
185
|
+
existing.push(issue);
|
|
186
|
+
} else {
|
|
187
|
+
map.set(issue.componentId, [issue]);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return map;
|
|
192
|
+
}, [issues]);
|
|
193
|
+
const filteredComponents = useMemo(() => {
|
|
194
|
+
if (!searchQuery.trim()) {
|
|
195
|
+
return activeComponents;
|
|
196
|
+
}
|
|
197
|
+
const q = searchQuery.toLowerCase();
|
|
198
|
+
const filtered = new Map();
|
|
199
|
+
for (const [componentId, bindings] of activeComponents) {
|
|
200
|
+
const displayName = resolveComponentName(bindings).toLowerCase();
|
|
201
|
+
if (displayName.includes(q) || componentId.includes(q)) {
|
|
202
|
+
filtered.set(componentId, bindings);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return filtered;
|
|
206
|
+
}, [activeComponents, searchQuery]);
|
|
207
|
+
const handleComponentClick = useCallback(componentId => {
|
|
208
|
+
const el = componentRefs.current.get(componentId);
|
|
209
|
+
if (el) {
|
|
210
|
+
el.scrollIntoView({
|
|
211
|
+
behavior: "smooth",
|
|
212
|
+
block: "center"
|
|
213
|
+
});
|
|
214
|
+
el.click();
|
|
215
|
+
}
|
|
216
|
+
}, []);
|
|
217
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
218
|
+
className: styles.debuggingTab
|
|
219
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
220
|
+
className: styles.controls
|
|
221
|
+
}, /*#__PURE__*/React.createElement(InputGroup, {
|
|
222
|
+
leftIcon: "search",
|
|
223
|
+
placeholder: "Search issues and components...",
|
|
224
|
+
value: searchQuery,
|
|
225
|
+
onChange: e => setSearchQuery(e.target.value),
|
|
226
|
+
className: styles.searchInput,
|
|
227
|
+
fill: true
|
|
228
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
229
|
+
className: styles.feed
|
|
230
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
231
|
+
className: styles.section
|
|
232
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
233
|
+
className: classNames(styles.sectionHeader, styles.errorSectionHeader)
|
|
234
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
235
|
+
icon: "error",
|
|
236
|
+
size: 14,
|
|
237
|
+
color: "var(--dt-red)"
|
|
238
|
+
}), /*#__PURE__*/React.createElement("span", null, "Errors"), /*#__PURE__*/React.createElement("span", {
|
|
239
|
+
className: styles.sectionCount
|
|
240
|
+
}, errorIssues.length)), errorIssues.length === 0 ? /*#__PURE__*/React.createElement("div", {
|
|
241
|
+
className: styles.emptyState
|
|
242
|
+
}, "No errors") : errorIssues.map((issue, index) => /*#__PURE__*/React.createElement(IssueCard, {
|
|
243
|
+
key: issue.id,
|
|
244
|
+
issue: issue,
|
|
245
|
+
onComponentClick: handleComponentClick,
|
|
246
|
+
style: {
|
|
247
|
+
"--entrance-index": index
|
|
248
|
+
}
|
|
249
|
+
}))), /*#__PURE__*/React.createElement("div", {
|
|
250
|
+
className: styles.section
|
|
251
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
252
|
+
type: "button",
|
|
253
|
+
className: styles.sectionHeaderButton,
|
|
254
|
+
onClick: () => setConsoleExpanded(!consoleExpanded)
|
|
255
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
256
|
+
icon: "console",
|
|
257
|
+
size: 14,
|
|
258
|
+
color: "var(--dt-text-tertiary)"
|
|
259
|
+
}), /*#__PURE__*/React.createElement("span", null, "Console"), /*#__PURE__*/React.createElement("span", {
|
|
260
|
+
className: styles.sectionCount
|
|
261
|
+
}, consoleCount), consoleCount > 0 && /*#__PURE__*/React.createElement("span", {
|
|
262
|
+
className: styles.sectionCount,
|
|
263
|
+
role: "button",
|
|
264
|
+
tabIndex: 0,
|
|
265
|
+
onClick: e => {
|
|
266
|
+
e.stopPropagation();
|
|
267
|
+
clearConsole();
|
|
268
|
+
},
|
|
269
|
+
onKeyDown: e => {
|
|
270
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
271
|
+
e.stopPropagation();
|
|
272
|
+
e.preventDefault();
|
|
273
|
+
clearConsole();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}, "clear"), /*#__PURE__*/React.createElement(Icon, {
|
|
277
|
+
icon: consoleExpanded ? "chevron-down" : "chevron-right",
|
|
278
|
+
size: 14,
|
|
279
|
+
className: styles.sectionChevron
|
|
280
|
+
})), consoleExpanded && (filteredConsoleEntries.length === 0 ? /*#__PURE__*/React.createElement("div", {
|
|
281
|
+
className: styles.emptyState
|
|
282
|
+
}, "No console output captured") : filteredConsoleEntries.slice(-100).map((entry, index) => /*#__PURE__*/React.createElement(LogEntryCard, {
|
|
283
|
+
key: entry.id,
|
|
284
|
+
entry: entry,
|
|
285
|
+
style: {
|
|
286
|
+
"--entrance-index": index
|
|
287
|
+
}
|
|
288
|
+
})))), /*#__PURE__*/React.createElement("div", {
|
|
289
|
+
className: styles.section
|
|
290
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
291
|
+
className: styles.sectionHeader
|
|
292
|
+
}, /*#__PURE__*/React.createElement("span", null, "Components"), /*#__PURE__*/React.createElement("span", {
|
|
293
|
+
className: styles.sectionCount
|
|
294
|
+
}, filteredComponents.size)), filteredComponents.size === 0 && /*#__PURE__*/React.createElement("div", {
|
|
295
|
+
className: styles.emptyState
|
|
296
|
+
}, searchQuery ? "No components match your search" : "No active components found"), Array.from(filteredComponents).map(([componentId, bindings], index) => /*#__PURE__*/React.createElement("div", {
|
|
297
|
+
key: componentId,
|
|
298
|
+
ref: el => {
|
|
299
|
+
if (el) {
|
|
300
|
+
componentRefs.current.set(componentId, el);
|
|
301
|
+
} else {
|
|
302
|
+
componentRefs.current.delete(componentId);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}, /*#__PURE__*/React.createElement(ComponentCard, {
|
|
306
|
+
componentId: componentId,
|
|
307
|
+
bindings: bindings,
|
|
308
|
+
formatTime: formatTime,
|
|
309
|
+
monitorStore: monitorStore,
|
|
310
|
+
issues: issuesByComponent.get(componentId),
|
|
311
|
+
style: {
|
|
312
|
+
"--entrance-index": index
|
|
313
|
+
}
|
|
314
|
+
})))), /*#__PURE__*/React.createElement("div", {
|
|
315
|
+
className: styles.section
|
|
316
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
317
|
+
type: "button",
|
|
318
|
+
className: styles.sectionHeaderButton,
|
|
319
|
+
onClick: () => setImprovementsExpanded(!improvementsExpanded)
|
|
320
|
+
}, /*#__PURE__*/React.createElement("span", null, "Improvements"), /*#__PURE__*/React.createElement(Icon, {
|
|
321
|
+
icon: improvementsExpanded ? "chevron-down" : "chevron-right",
|
|
322
|
+
size: 14,
|
|
323
|
+
className: styles.sectionChevron
|
|
324
|
+
})), improvementsExpanded && /*#__PURE__*/React.createElement(ImprovementsTab, {
|
|
325
|
+
monitorStore: monitorStore
|
|
326
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
327
|
+
className: styles.section
|
|
328
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
329
|
+
type: "button",
|
|
330
|
+
className: styles.sectionHeaderButton,
|
|
331
|
+
onClick: () => setCacheExpanded(!cacheExpanded)
|
|
332
|
+
}, /*#__PURE__*/React.createElement("span", null, "Cache"), /*#__PURE__*/React.createElement("span", {
|
|
333
|
+
className: styles.sectionCount
|
|
334
|
+
}, cacheCount, " entries"), /*#__PURE__*/React.createElement(Icon, {
|
|
335
|
+
icon: cacheExpanded ? "chevron-down" : "chevron-right",
|
|
336
|
+
size: 14,
|
|
337
|
+
className: styles.sectionChevron
|
|
338
|
+
})), cacheExpanded && /*#__PURE__*/React.createElement(CacheInspectorTab, {
|
|
339
|
+
monitorStore: monitorStore
|
|
340
|
+
}))));
|
|
341
|
+
};
|
|
342
|
+
//# sourceMappingURL=DebuggingTab.js.map
|