@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,297 @@
|
|
|
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, ButtonGroup } from "@blueprintjs/core";
|
|
18
|
+
import classNames from "classnames";
|
|
19
|
+
import React, { useMemo, useState } from "react";
|
|
20
|
+
import { createPollingStore } from "../hooks/createPollingStore.js";
|
|
21
|
+
import { useMetrics } from "../hooks/useMetrics.js";
|
|
22
|
+
import { useRecommendations } from "../hooks/useRecommendations.js";
|
|
23
|
+
import { useUnusedFieldAnalysis } from "../hooks/useUnusedFieldAnalysis.js";
|
|
24
|
+
import { formatTime } from "../utils/format.js";
|
|
25
|
+
import { buildRecommendationMap, getRecommendationsForOperation } from "../utils/RecommendationMatcher.js";
|
|
26
|
+
import { ActionMetrics } from "./ActionMetrics.js";
|
|
27
|
+
import { CacheMetrics } from "./CacheMetrics.js";
|
|
28
|
+
import styles from "./MonitoringPanel.module.scss.js";
|
|
29
|
+
import { ObjectLoadingMetrics } from "./ObjectLoadingMetrics.js";
|
|
30
|
+
const CACHE_OPERATION_TYPES = new Set(["cache-hit", "cache-miss", "revalidation", "deduplication", "optimistic-update"]);
|
|
31
|
+
const ACTION_OPERATION_TYPES = new Set(["action", "action-validation"]);
|
|
32
|
+
const MAX_RECENT_OPERATIONS = 50;
|
|
33
|
+
export const PerformanceTab = ({
|
|
34
|
+
metricsStore,
|
|
35
|
+
monitorStore
|
|
36
|
+
}) => {
|
|
37
|
+
const metrics = useMetrics(metricsStore);
|
|
38
|
+
const {
|
|
39
|
+
report: unusedFieldReport,
|
|
40
|
+
isLoading: analysisLoading
|
|
41
|
+
} = useUnusedFieldAnalysis(monitorStore);
|
|
42
|
+
const {
|
|
43
|
+
recommendations
|
|
44
|
+
} = useRecommendations(monitorStore);
|
|
45
|
+
const [filter, setFilter] = useState("all");
|
|
46
|
+
const recommendationMap = useMemo(() => buildRecommendationMap(recommendations), [recommendations]);
|
|
47
|
+
const enrichmentStore = React.useMemo(() => createPollingStore(async () => {
|
|
48
|
+
const entries = await monitorStore.loadCacheEntries();
|
|
49
|
+
const timeline = monitorStore.getEventTimeline();
|
|
50
|
+
const actions = timeline.getEventsByType("ACTION_START");
|
|
51
|
+
return {
|
|
52
|
+
cacheEntries: entries,
|
|
53
|
+
recentActions: actions.slice(-20)
|
|
54
|
+
};
|
|
55
|
+
}, 2000), [monitorStore]);
|
|
56
|
+
const enrichmentData = React.useSyncExternalStore(enrichmentStore.subscribe, enrichmentStore.getSnapshot);
|
|
57
|
+
const cacheEntries = enrichmentData?.cacheEntries ?? [];
|
|
58
|
+
const recentActions = enrichmentData?.recentActions ?? [];
|
|
59
|
+
const displayNameMap = useMemo(() => {
|
|
60
|
+
const map = new Map();
|
|
61
|
+
for (const entry of cacheEntries) {
|
|
62
|
+
if (entry.data && typeof entry.data === "object") {
|
|
63
|
+
const data = entry.data;
|
|
64
|
+
const primaryKey = data.$primaryKey;
|
|
65
|
+
const objectType = data.$objectType ?? entry.objectType;
|
|
66
|
+
const displayName = data.title ?? data.name ?? data.label ?? data.displayName ?? data.description;
|
|
67
|
+
if (typeof displayName === "string" && displayName.length > 0 && (typeof primaryKey === "string" || typeof primaryKey === "number") && typeof objectType === "string") {
|
|
68
|
+
map.set(`${objectType}:${String(primaryKey)}`, displayName);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return map;
|
|
73
|
+
}, [cacheEntries]);
|
|
74
|
+
const getDisplayNameKey = signature => {
|
|
75
|
+
const parts = signature.split(":");
|
|
76
|
+
if (parts.length >= 3 && parts[0] === "object") {
|
|
77
|
+
return `${parts[1]}:${parts.slice(2).join(":")}`;
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
};
|
|
81
|
+
const findCausingAction = timestamp => {
|
|
82
|
+
for (let i = recentActions.length - 1; i >= 0; i--) {
|
|
83
|
+
const action = recentActions[i];
|
|
84
|
+
const timeDiff = timestamp - action.timestamp;
|
|
85
|
+
if (timeDiff >= 0 && timeDiff < 500) {
|
|
86
|
+
return action;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
};
|
|
91
|
+
const filteredOperations = useMemo(() => metrics.recent.filter(op => {
|
|
92
|
+
if (filter === "all") {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
if (filter === "cache") {
|
|
96
|
+
return CACHE_OPERATION_TYPES.has(op.type);
|
|
97
|
+
}
|
|
98
|
+
if (filter === "actions") {
|
|
99
|
+
return ACTION_OPERATION_TYPES.has(op.type);
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}), [metrics.recent, filter]);
|
|
103
|
+
const operations = filteredOperations.slice(-MAX_RECENT_OPERATIONS).reverse();
|
|
104
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
105
|
+
className: styles.metricsGrid
|
|
106
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
107
|
+
className: styles.metricGroup
|
|
108
|
+
}, /*#__PURE__*/React.createElement("h4", {
|
|
109
|
+
className: styles.metricGroupTitle
|
|
110
|
+
}, "Object Loading"), /*#__PURE__*/React.createElement("div", {
|
|
111
|
+
className: styles.metricGroupContent
|
|
112
|
+
}, /*#__PURE__*/React.createElement(ObjectLoadingMetrics, {
|
|
113
|
+
analysisLoading: analysisLoading,
|
|
114
|
+
unusedFieldReport: unusedFieldReport
|
|
115
|
+
}))), /*#__PURE__*/React.createElement("div", {
|
|
116
|
+
className: styles.metricGroup
|
|
117
|
+
}, /*#__PURE__*/React.createElement("h4", {
|
|
118
|
+
className: styles.metricGroupTitle
|
|
119
|
+
}, "Actions"), /*#__PURE__*/React.createElement("div", {
|
|
120
|
+
className: styles.metricGroupContent
|
|
121
|
+
}, /*#__PURE__*/React.createElement(ActionMetrics, {
|
|
122
|
+
metrics: metrics
|
|
123
|
+
}))), /*#__PURE__*/React.createElement("div", {
|
|
124
|
+
className: styles.metricGroup
|
|
125
|
+
}, /*#__PURE__*/React.createElement("h4", {
|
|
126
|
+
className: styles.metricGroupTitle
|
|
127
|
+
}, "Caching"), /*#__PURE__*/React.createElement("div", {
|
|
128
|
+
className: styles.metricGroupContent
|
|
129
|
+
}, /*#__PURE__*/React.createElement(CacheMetrics, {
|
|
130
|
+
metrics: metrics
|
|
131
|
+
})))), /*#__PURE__*/React.createElement("div", {
|
|
132
|
+
className: styles.filterControls
|
|
133
|
+
}, /*#__PURE__*/React.createElement(ButtonGroup, null, /*#__PURE__*/React.createElement(Button, {
|
|
134
|
+
active: filter === "all",
|
|
135
|
+
onClick: () => setFilter("all"),
|
|
136
|
+
size: "small"
|
|
137
|
+
}, "All"), /*#__PURE__*/React.createElement(Button, {
|
|
138
|
+
active: filter === "cache",
|
|
139
|
+
onClick: () => setFilter("cache"),
|
|
140
|
+
size: "small"
|
|
141
|
+
}, "Cache"), /*#__PURE__*/React.createElement(Button, {
|
|
142
|
+
active: filter === "actions",
|
|
143
|
+
onClick: () => setFilter("actions"),
|
|
144
|
+
size: "small"
|
|
145
|
+
}, "Actions"))), /*#__PURE__*/React.createElement("div", {
|
|
146
|
+
className: styles.operationsList
|
|
147
|
+
}, operations.length > 0 ? operations.map(op => {
|
|
148
|
+
const isCacheOp = op.type !== "action" && op.type !== "action-validation";
|
|
149
|
+
const causingAction = isCacheOp ? findCausingAction(op.timestamp) : null;
|
|
150
|
+
const displayKey = getDisplayNameKey(op.signature);
|
|
151
|
+
return /*#__PURE__*/React.createElement(OperationItem, {
|
|
152
|
+
key: op.id,
|
|
153
|
+
operation: op,
|
|
154
|
+
formatTime: formatTime,
|
|
155
|
+
recommendations: getRecommendationsForOperation(op, recommendationMap),
|
|
156
|
+
displayName: displayKey ? displayNameMap.get(displayKey) : undefined,
|
|
157
|
+
causingActionName: causingAction?.actionName
|
|
158
|
+
});
|
|
159
|
+
}) : /*#__PURE__*/React.createElement("div", {
|
|
160
|
+
className: styles.emptyState
|
|
161
|
+
}, filter === "all" ? "No recent activity" : filter === "cache" ? "No recent cache activity" : "No recent action activity")));
|
|
162
|
+
};
|
|
163
|
+
const OPERATION_DISPLAY = {
|
|
164
|
+
"cache-hit": {
|
|
165
|
+
icon: "\u2713",
|
|
166
|
+
class: styles.cacheHit,
|
|
167
|
+
tooltip: "Cache hit \u2014 served from cache"
|
|
168
|
+
},
|
|
169
|
+
"cache-miss": {
|
|
170
|
+
icon: "\u00d7",
|
|
171
|
+
class: styles.cacheMiss,
|
|
172
|
+
tooltip: "Cache miss \u2014 fetched from network"
|
|
173
|
+
},
|
|
174
|
+
"revalidation": {
|
|
175
|
+
icon: "\u21bb",
|
|
176
|
+
class: styles.revalidation,
|
|
177
|
+
tooltip: "Stale-while-revalidate \u2014 data already served from cache, re-fetching in background"
|
|
178
|
+
},
|
|
179
|
+
"deduplication": {
|
|
180
|
+
icon: "=",
|
|
181
|
+
class: styles.deduplication,
|
|
182
|
+
tooltip: "Deduplicated \u2014 shared with existing subscription"
|
|
183
|
+
},
|
|
184
|
+
"optimistic-update": {
|
|
185
|
+
icon: "\u26a1",
|
|
186
|
+
class: styles.optimistic,
|
|
187
|
+
tooltip: "Optimistic update"
|
|
188
|
+
},
|
|
189
|
+
"action": {
|
|
190
|
+
icon: "\u2699",
|
|
191
|
+
class: styles.action,
|
|
192
|
+
tooltip: "Action"
|
|
193
|
+
},
|
|
194
|
+
"action-validation": {
|
|
195
|
+
icon: "\u2714",
|
|
196
|
+
class: styles.validation,
|
|
197
|
+
tooltip: "Action validation"
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
const DEFAULT_OPERATION_DISPLAY = {
|
|
201
|
+
icon: "\u2022",
|
|
202
|
+
class: "",
|
|
203
|
+
tooltip: ""
|
|
204
|
+
};
|
|
205
|
+
const OperationItem = ({
|
|
206
|
+
operation,
|
|
207
|
+
formatTime,
|
|
208
|
+
recommendations = [],
|
|
209
|
+
displayName,
|
|
210
|
+
causingActionName
|
|
211
|
+
}) => {
|
|
212
|
+
const isAction = operation.type === "action";
|
|
213
|
+
const isValidation = operation.type === "action-validation";
|
|
214
|
+
const {
|
|
215
|
+
icon: operationIcon,
|
|
216
|
+
class: operationClass,
|
|
217
|
+
tooltip: operationTooltip
|
|
218
|
+
} = OPERATION_DISPLAY[operation.type] ?? DEFAULT_OPERATION_DISPLAY;
|
|
219
|
+
const metricBadges = [];
|
|
220
|
+
if (isAction) {
|
|
221
|
+
if (operation.serverRoundTripTime != null) {
|
|
222
|
+
metricBadges.push(/*#__PURE__*/React.createElement("span", {
|
|
223
|
+
key: "server",
|
|
224
|
+
className: styles.operationMetric
|
|
225
|
+
}, "Server ", formatTime(operation.serverRoundTripTime)));
|
|
226
|
+
}
|
|
227
|
+
if (operation.optimisticObserved && operation.optimisticRenderTime != null) {
|
|
228
|
+
metricBadges.push(/*#__PURE__*/React.createElement("span", {
|
|
229
|
+
key: "optimistic",
|
|
230
|
+
className: styles.operationMetric
|
|
231
|
+
}, "Optimistic ", formatTime(operation.optimisticRenderTime)));
|
|
232
|
+
}
|
|
233
|
+
if (operation.optimisticObserved && operation.perceivedSpeedup != null) {
|
|
234
|
+
metricBadges.push(/*#__PURE__*/React.createElement("span", {
|
|
235
|
+
key: "speedup",
|
|
236
|
+
className: classNames(styles.operationMetric, styles.saved)
|
|
237
|
+
}, "Speedup ", formatTime(operation.perceivedSpeedup)));
|
|
238
|
+
}
|
|
239
|
+
if (operation.rollback) {
|
|
240
|
+
metricBadges.push(/*#__PURE__*/React.createElement("span", {
|
|
241
|
+
key: "rollback",
|
|
242
|
+
className: classNames(styles.operationMetric, styles.rollback)
|
|
243
|
+
}, "Rollback"));
|
|
244
|
+
}
|
|
245
|
+
} else if (isValidation) {
|
|
246
|
+
if (operation.responseTime != null) {
|
|
247
|
+
metricBadges.push(/*#__PURE__*/React.createElement("span", {
|
|
248
|
+
key: "validation",
|
|
249
|
+
className: styles.operationMetric
|
|
250
|
+
}, "Validation ", formatTime(operation.responseTime)));
|
|
251
|
+
}
|
|
252
|
+
} else {
|
|
253
|
+
if (operation.responseTime != null) {
|
|
254
|
+
metricBadges.push(/*#__PURE__*/React.createElement("span", {
|
|
255
|
+
key: "response",
|
|
256
|
+
className: styles.operationMetric
|
|
257
|
+
}, formatTime(operation.responseTime)));
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const topRec = recommendations[0];
|
|
261
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
262
|
+
className: styles.operationItem
|
|
263
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
264
|
+
className: classNames(styles.operationType, operationClass),
|
|
265
|
+
title: operationTooltip
|
|
266
|
+
}, operationIcon), /*#__PURE__*/React.createElement("div", {
|
|
267
|
+
className: styles.operationDetails
|
|
268
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
269
|
+
className: styles.operationSignature
|
|
270
|
+
}, (() => {
|
|
271
|
+
if (isAction || isValidation) {
|
|
272
|
+
return operation.actionName ?? operation.signature;
|
|
273
|
+
}
|
|
274
|
+
if (displayName) {
|
|
275
|
+
const parts = operation.signature.split(":");
|
|
276
|
+
if (parts.length >= 2) {
|
|
277
|
+
const objectType = parts[1];
|
|
278
|
+
const truncatedName = displayName.length > 20 ? displayName.slice(0, 20) + "\u2026" : displayName;
|
|
279
|
+
return `${objectType}: ${truncatedName}`;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return operation.signature;
|
|
283
|
+
})(), !isAction && !isValidation && causingActionName && /*#__PURE__*/React.createElement("span", {
|
|
284
|
+
className: styles.actionCauseBadge,
|
|
285
|
+
title: `Triggered by ${causingActionName}`
|
|
286
|
+
}, "\u2190 ", causingActionName), topRec && /*#__PURE__*/React.createElement("span", {
|
|
287
|
+
className: styles.inlineIndicator,
|
|
288
|
+
title: topRec.suggestion
|
|
289
|
+
}, topRec.level === "critical" || topRec.level === "high" ? "⚠️" : "💡")), /*#__PURE__*/React.createElement("div", {
|
|
290
|
+
className: styles.operationTime
|
|
291
|
+
}, new Date(operation.timestamp).toLocaleTimeString()), topRec && /*#__PURE__*/React.createElement("div", {
|
|
292
|
+
className: styles.inlineTip
|
|
293
|
+
}, topRec.title), metricBadges.length > 0 && /*#__PURE__*/React.createElement("div", {
|
|
294
|
+
className: styles.operationMetrics
|
|
295
|
+
}, metricBadges)));
|
|
296
|
+
};
|
|
297
|
+
//# sourceMappingURL=PerformanceTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PerformanceTab.js","names":["Button","ButtonGroup","classNames","React","useMemo","useState","createPollingStore","useMetrics","useRecommendations","useUnusedFieldAnalysis","formatTime","buildRecommendationMap","getRecommendationsForOperation","ActionMetrics","CacheMetrics","styles","ObjectLoadingMetrics","CACHE_OPERATION_TYPES","Set","ACTION_OPERATION_TYPES","MAX_RECENT_OPERATIONS","PerformanceTab","metricsStore","monitorStore","metrics","report","unusedFieldReport","isLoading","analysisLoading","recommendations","filter","setFilter","recommendationMap","enrichmentStore","entries","loadCacheEntries","timeline","getEventTimeline","actions","getEventsByType","cacheEntries","recentActions","slice","enrichmentData","useSyncExternalStore","subscribe","getSnapshot","displayNameMap","map","Map","entry","data","primaryKey","$primaryKey","objectType","$objectType","displayName","title","name","label","description","length","set","String","getDisplayNameKey","signature","parts","split","join","findCausingAction","timestamp","i","action","timeDiff","filteredOperations","recent","op","has","type","operations","reverse","createElement","Fragment","className","metricsGrid","metricGroup","metricGroupTitle","metricGroupContent","filterControls","active","onClick","size","operationsList","isCacheOp","causingAction","displayKey","OperationItem","key","id","operation","get","undefined","causingActionName","actionName","emptyState","OPERATION_DISPLAY","icon","class","cacheHit","tooltip","cacheMiss","revalidation","deduplication","optimistic","validation","DEFAULT_OPERATION_DISPLAY","isAction","isValidation","operationIcon","operationClass","operationTooltip","metricBadges","serverRoundTripTime","push","operationMetric","optimisticObserved","optimisticRenderTime","perceivedSpeedup","saved","rollback","responseTime","topRec","operationItem","operationType","operationDetails","operationSignature","truncatedName","actionCauseBadge","inlineIndicator","suggestion","level","operationTime","Date","toLocaleTimeString","inlineTip","operationMetrics"],"sources":["PerformanceTab.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, ButtonGroup } from \"@blueprintjs/core\";\nimport classNames from \"classnames\";\nimport React, { useMemo, useState } from \"react\";\nimport { createPollingStore } from \"../hooks/createPollingStore.js\";\nimport { useMetrics } from \"../hooks/useMetrics.js\";\nimport { useRecommendations } from \"../hooks/useRecommendations.js\";\nimport { useUnusedFieldAnalysis } from \"../hooks/useUnusedFieldAnalysis.js\";\nimport type { MetricsStore } from \"../store/MetricsStore.js\";\nimport type { MonitorStore } from \"../store/MonitorStore.js\";\nimport type { Operation } from \"../types/index.js\";\nimport type { ActionStartEvent } from \"../utils/EventTimeline.js\";\nimport { formatTime } from \"../utils/format.js\";\nimport type { Recommendation } from \"../utils/PerformanceRecommendationEngine.js\";\nimport {\n buildRecommendationMap,\n getRecommendationsForOperation,\n} from \"../utils/RecommendationMatcher.js\";\nimport { ActionMetrics } from \"./ActionMetrics.js\";\nimport { CacheMetrics } from \"./CacheMetrics.js\";\nimport styles from \"./MonitoringPanel.module.scss\";\nimport { ObjectLoadingMetrics } from \"./ObjectLoadingMetrics.js\";\n\nconst CACHE_OPERATION_TYPES = new Set<Operation[\"type\"]>([\n \"cache-hit\",\n \"cache-miss\",\n \"revalidation\",\n \"deduplication\",\n \"optimistic-update\",\n]);\n\nconst ACTION_OPERATION_TYPES = new Set<Operation[\"type\"]>([\n \"action\",\n \"action-validation\",\n]);\n\nconst MAX_RECENT_OPERATIONS = 50;\n\nexport interface PerformanceTabProps {\n metricsStore: MetricsStore;\n monitorStore: MonitorStore;\n}\n\nexport const PerformanceTab: React.FC<PerformanceTabProps> = (\n { metricsStore, monitorStore },\n) => {\n const metrics = useMetrics(metricsStore);\n const { report: unusedFieldReport, isLoading: analysisLoading } =\n useUnusedFieldAnalysis(monitorStore);\n const { recommendations } = useRecommendations(monitorStore);\n const [filter, setFilter] = useState<\"all\" | \"cache\" | \"actions\">(\"all\");\n\n const recommendationMap = useMemo(\n () => buildRecommendationMap(recommendations),\n [recommendations],\n );\n\n const enrichmentStore = React.useMemo(\n () =>\n createPollingStore(async () => {\n const entries = await monitorStore.loadCacheEntries();\n const timeline = monitorStore.getEventTimeline();\n const actions = timeline.getEventsByType(\"ACTION_START\");\n return {\n cacheEntries: entries,\n recentActions: actions.slice(-20),\n };\n }, 2000),\n [monitorStore],\n );\n const enrichmentData = React.useSyncExternalStore(\n enrichmentStore.subscribe,\n enrichmentStore.getSnapshot,\n );\n const cacheEntries = enrichmentData?.cacheEntries ?? [];\n const recentActions = enrichmentData?.recentActions ?? [];\n\n const displayNameMap = useMemo(() => {\n const map = new Map<string, string>();\n for (const entry of cacheEntries) {\n if (entry.data && typeof entry.data === \"object\") {\n const data = entry.data as Record<string, unknown>;\n const primaryKey = data.$primaryKey;\n const objectType = data.$objectType ?? entry.objectType;\n const displayName = data.title ?? data.name ?? data.label\n ?? data.displayName ?? data.description;\n if (\n typeof displayName === \"string\" && displayName.length > 0\n && (typeof primaryKey === \"string\" || typeof primaryKey === \"number\")\n && typeof objectType === \"string\"\n ) {\n map.set(`${objectType}:${String(primaryKey)}`, displayName);\n }\n }\n }\n return map;\n }, [cacheEntries]);\n\n const getDisplayNameKey = (signature: string): string | null => {\n const parts = signature.split(\":\");\n if (parts.length >= 3 && parts[0] === \"object\") {\n return `${parts[1]}:${parts.slice(2).join(\":\")}`;\n }\n return null;\n };\n\n const findCausingAction = (timestamp: number): ActionStartEvent | null => {\n for (let i = recentActions.length - 1; i >= 0; i--) {\n const action = recentActions[i];\n const timeDiff = timestamp - action.timestamp;\n if (timeDiff >= 0 && timeDiff < 500) {\n return action;\n }\n }\n return null;\n };\n\n const filteredOperations = useMemo(() =>\n metrics.recent.filter((op) => {\n if (filter === \"all\") {\n return true;\n }\n if (filter === \"cache\") {\n return CACHE_OPERATION_TYPES.has(op.type);\n }\n if (filter === \"actions\") {\n return ACTION_OPERATION_TYPES.has(op.type);\n }\n return false;\n }), [metrics.recent, filter]);\n\n const operations = filteredOperations.slice(\n -MAX_RECENT_OPERATIONS,\n ).reverse();\n\n return (\n <>\n <div className={styles.metricsGrid}>\n <div className={styles.metricGroup}>\n <h4 className={styles.metricGroupTitle}>Object Loading</h4>\n <div className={styles.metricGroupContent}>\n <ObjectLoadingMetrics\n analysisLoading={analysisLoading}\n unusedFieldReport={unusedFieldReport}\n />\n </div>\n </div>\n <div className={styles.metricGroup}>\n <h4 className={styles.metricGroupTitle}>Actions</h4>\n <div className={styles.metricGroupContent}>\n <ActionMetrics metrics={metrics} />\n </div>\n </div>\n <div className={styles.metricGroup}>\n <h4 className={styles.metricGroupTitle}>Caching</h4>\n <div className={styles.metricGroupContent}>\n <CacheMetrics metrics={metrics} />\n </div>\n </div>\n </div>\n\n <div className={styles.filterControls}>\n <ButtonGroup>\n <Button\n active={filter === \"all\"}\n onClick={() => setFilter(\"all\")}\n size=\"small\"\n >\n All\n </Button>\n <Button\n active={filter === \"cache\"}\n onClick={() => setFilter(\"cache\")}\n size=\"small\"\n >\n Cache\n </Button>\n <Button\n active={filter === \"actions\"}\n onClick={() => setFilter(\"actions\")}\n size=\"small\"\n >\n Actions\n </Button>\n </ButtonGroup>\n </div>\n\n <div className={styles.operationsList}>\n {operations.length > 0\n ? operations.map((op) => {\n const isCacheOp = op.type !== \"action\"\n && op.type !== \"action-validation\";\n const causingAction = isCacheOp\n ? findCausingAction(op.timestamp)\n : null;\n const displayKey = getDisplayNameKey(op.signature);\n return (\n <OperationItem\n key={op.id}\n operation={op}\n formatTime={formatTime}\n recommendations={getRecommendationsForOperation(\n op,\n recommendationMap,\n )}\n displayName={displayKey\n ? displayNameMap.get(displayKey)\n : undefined}\n causingActionName={causingAction?.actionName}\n />\n );\n })\n : (\n <div className={styles.emptyState}>\n {filter === \"all\"\n ? \"No recent activity\"\n : filter === \"cache\"\n ? \"No recent cache activity\"\n : \"No recent action activity\"}\n </div>\n )}\n </div>\n </>\n );\n};\n\nconst OPERATION_DISPLAY: Record<\n string,\n { icon: string; class: string; tooltip: string }\n> = {\n \"cache-hit\": {\n icon: \"\\u2713\",\n class: styles.cacheHit,\n tooltip: \"Cache hit \\u2014 served from cache\",\n },\n \"cache-miss\": {\n icon: \"\\u00d7\",\n class: styles.cacheMiss,\n tooltip: \"Cache miss \\u2014 fetched from network\",\n },\n \"revalidation\": {\n icon: \"\\u21bb\",\n class: styles.revalidation,\n tooltip:\n \"Stale-while-revalidate \\u2014 data already served from cache, re-fetching in background\",\n },\n \"deduplication\": {\n icon: \"=\",\n class: styles.deduplication,\n tooltip: \"Deduplicated \\u2014 shared with existing subscription\",\n },\n \"optimistic-update\": {\n icon: \"\\u26a1\",\n class: styles.optimistic,\n tooltip: \"Optimistic update\",\n },\n \"action\": { icon: \"\\u2699\", class: styles.action, tooltip: \"Action\" },\n \"action-validation\": {\n icon: \"\\u2714\",\n class: styles.validation,\n tooltip: \"Action validation\",\n },\n};\n\nconst DEFAULT_OPERATION_DISPLAY = { icon: \"\\u2022\", class: \"\", tooltip: \"\" };\n\ninterface OperationItemProps {\n operation: Operation;\n formatTime: (ms: number) => string;\n recommendations?: Recommendation[];\n displayName?: string;\n causingActionName?: string;\n}\n\nconst OperationItem: React.FC<OperationItemProps> = (\n {\n operation,\n formatTime,\n recommendations = [],\n displayName,\n causingActionName,\n },\n) => {\n const isAction = operation.type === \"action\";\n const isValidation = operation.type === \"action-validation\";\n const isCacheOperation = !isAction && !isValidation;\n\n const getEnrichedSignature = (): string => {\n if (isAction || isValidation) {\n return operation.actionName ?? operation.signature;\n }\n if (displayName) {\n const parts = operation.signature.split(\":\");\n if (parts.length >= 2) {\n const objectType = parts[1];\n const truncatedName = displayName.length > 20\n ? displayName.slice(0, 20) + \"\\u2026\"\n : displayName;\n return `${objectType}: ${truncatedName}`;\n }\n }\n return operation.signature;\n };\n\n const {\n icon: operationIcon,\n class: operationClass,\n tooltip: operationTooltip,\n } = OPERATION_DISPLAY[operation.type] ?? DEFAULT_OPERATION_DISPLAY;\n\n const metricBadges: React.ReactNode[] = [];\n\n if (isAction) {\n if (operation.serverRoundTripTime != null) {\n metricBadges.push(\n <span key=\"server\" className={styles.operationMetric}>\n Server {formatTime(operation.serverRoundTripTime)}\n </span>,\n );\n }\n\n if (\n operation.optimisticObserved && operation.optimisticRenderTime != null\n ) {\n metricBadges.push(\n <span key=\"optimistic\" className={styles.operationMetric}>\n Optimistic {formatTime(operation.optimisticRenderTime)}\n </span>,\n );\n }\n\n if (operation.optimisticObserved && operation.perceivedSpeedup != null) {\n metricBadges.push(\n <span\n key=\"speedup\"\n className={classNames(styles.operationMetric, styles.saved)}\n >\n Speedup {formatTime(operation.perceivedSpeedup)}\n </span>,\n );\n }\n\n if (operation.rollback) {\n metricBadges.push(\n <span\n key=\"rollback\"\n className={classNames(styles.operationMetric, styles.rollback)}\n >\n Rollback\n </span>,\n );\n }\n } else if (isValidation) {\n if (operation.responseTime != null) {\n metricBadges.push(\n <span key=\"validation\" className={styles.operationMetric}>\n Validation {formatTime(operation.responseTime)}\n </span>,\n );\n }\n } else {\n if (operation.responseTime != null) {\n metricBadges.push(\n <span key=\"response\" className={styles.operationMetric}>\n {formatTime(operation.responseTime)}\n </span>,\n );\n }\n }\n\n const topRec = recommendations[0];\n\n return (\n <div className={styles.operationItem}>\n <span\n className={classNames(styles.operationType, operationClass)}\n title={operationTooltip}\n >\n {operationIcon}\n </span>\n <div className={styles.operationDetails}>\n <div className={styles.operationSignature}>\n {getEnrichedSignature()}\n {isCacheOperation && causingActionName && (\n <span\n className={styles.actionCauseBadge}\n title={`Triggered by ${causingActionName}`}\n >\n ← {causingActionName}\n </span>\n )}\n {topRec && (\n <span\n className={styles.inlineIndicator}\n title={topRec.suggestion}\n >\n {topRec.level === \"critical\" || topRec.level === \"high\"\n ? \"⚠️\"\n : \"💡\"}\n </span>\n )}\n </div>\n <div className={styles.operationTime}>\n {new Date(operation.timestamp).toLocaleTimeString()}\n </div>\n {topRec && (\n <div className={styles.inlineTip}>\n {topRec.title}\n </div>\n )}\n {metricBadges.length > 0 && (\n <div className={styles.operationMetrics}>{metricBadges}</div>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,220 @@
|
|
|
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, Collapse, Icon } from "@blueprintjs/core";
|
|
18
|
+
import React, { useState } from "react";
|
|
19
|
+
import styles from "./PrimitiveSelectionPanel.module.scss.js";
|
|
20
|
+
export const PrimitiveSelectionPanel = ({
|
|
21
|
+
primitives,
|
|
22
|
+
onSelectPrimitive,
|
|
23
|
+
onClose
|
|
24
|
+
}) => {
|
|
25
|
+
const [openSections, setOpenSections] = useState(new Set(["action", "objectSet", "object", "link", "query", "aggregation"]));
|
|
26
|
+
const toggleSection = section => {
|
|
27
|
+
const newSections = new Set(openSections);
|
|
28
|
+
if (newSections.has(section)) {
|
|
29
|
+
newSections.delete(section);
|
|
30
|
+
} else {
|
|
31
|
+
newSections.add(section);
|
|
32
|
+
}
|
|
33
|
+
setOpenSections(newSections);
|
|
34
|
+
};
|
|
35
|
+
const totalCount = primitives.actions.length + primitives.objectSets.length + primitives.objects.length + primitives.links.length + primitives.queries.length + primitives.aggregations.length;
|
|
36
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
37
|
+
className: styles.panel
|
|
38
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
39
|
+
className: styles.header
|
|
40
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
41
|
+
className: styles.headerContent
|
|
42
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
43
|
+
icon: "cube"
|
|
44
|
+
}), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
45
|
+
className: styles.headerTitle
|
|
46
|
+
}, "Discovered OSDK Usage"), /*#__PURE__*/React.createElement("div", {
|
|
47
|
+
className: styles.headerSubtitle
|
|
48
|
+
}, primitives.componentName, " \xB7 ", totalCount, " ", "item", totalCount !== 1 ? "s" : ""))), /*#__PURE__*/React.createElement(Button, {
|
|
49
|
+
variant: "minimal",
|
|
50
|
+
size: "small",
|
|
51
|
+
icon: "cross",
|
|
52
|
+
onClick: onClose,
|
|
53
|
+
title: "Close"
|
|
54
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
55
|
+
className: styles.content
|
|
56
|
+
}, totalCount === 0 && /*#__PURE__*/React.createElement("div", {
|
|
57
|
+
className: styles.emptyState
|
|
58
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
59
|
+
icon: "search",
|
|
60
|
+
size: 32
|
|
61
|
+
}), /*#__PURE__*/React.createElement("div", null, "No OSDK usage found"), /*#__PURE__*/React.createElement("div", {
|
|
62
|
+
className: styles.emptySubtext
|
|
63
|
+
}, "This component doesn't use any OSDK hooks")), primitives.actions.length > 0 && /*#__PURE__*/React.createElement(PrimitiveSection, {
|
|
64
|
+
title: "Actions",
|
|
65
|
+
icon: "flash",
|
|
66
|
+
count: primitives.actions.length,
|
|
67
|
+
isOpen: openSections.has("action"),
|
|
68
|
+
onToggle: () => toggleSection("action")
|
|
69
|
+
}, primitives.actions.map((action, index) => /*#__PURE__*/React.createElement(PrimitiveItem, {
|
|
70
|
+
key: index,
|
|
71
|
+
icon: "flash",
|
|
72
|
+
title: action.name,
|
|
73
|
+
subtitle: action.location,
|
|
74
|
+
onClick: () => onSelectPrimitive({
|
|
75
|
+
type: "action",
|
|
76
|
+
data: action
|
|
77
|
+
})
|
|
78
|
+
}))), primitives.objectSets.length > 0 && /*#__PURE__*/React.createElement(PrimitiveSection, {
|
|
79
|
+
title: "Object Sets",
|
|
80
|
+
icon: "th-list",
|
|
81
|
+
count: primitives.objectSets.length,
|
|
82
|
+
isOpen: openSections.has("objectSet"),
|
|
83
|
+
onToggle: () => toggleSection("objectSet")
|
|
84
|
+
}, primitives.objectSets.map((objectSet, index) => /*#__PURE__*/React.createElement(PrimitiveItem, {
|
|
85
|
+
key: index,
|
|
86
|
+
icon: "th-list",
|
|
87
|
+
title: objectSet.type,
|
|
88
|
+
subtitle: objectSet.location,
|
|
89
|
+
metadata: [objectSet.whereClause && "filtered", objectSet.orderBy && "sorted", objectSet.pageSize && `${objectSet.pageSize}/page`].filter(x => Boolean(x)),
|
|
90
|
+
onClick: () => onSelectPrimitive({
|
|
91
|
+
type: "objectSet",
|
|
92
|
+
data: objectSet
|
|
93
|
+
})
|
|
94
|
+
}))), primitives.objects.length > 0 && /*#__PURE__*/React.createElement(PrimitiveSection, {
|
|
95
|
+
title: "Objects",
|
|
96
|
+
icon: "cube",
|
|
97
|
+
count: primitives.objects.length,
|
|
98
|
+
isOpen: openSections.has("object"),
|
|
99
|
+
onToggle: () => toggleSection("object")
|
|
100
|
+
}, primitives.objects.map((object, index) => /*#__PURE__*/React.createElement(PrimitiveItem, {
|
|
101
|
+
key: index,
|
|
102
|
+
icon: "cube",
|
|
103
|
+
title: object.type,
|
|
104
|
+
subtitle: object.location,
|
|
105
|
+
metadata: object.primaryKey ? [object.primaryKey] : undefined,
|
|
106
|
+
onClick: () => onSelectPrimitive({
|
|
107
|
+
type: "object",
|
|
108
|
+
data: object
|
|
109
|
+
})
|
|
110
|
+
}))), primitives.links.length > 0 && /*#__PURE__*/React.createElement(PrimitiveSection, {
|
|
111
|
+
title: "Links",
|
|
112
|
+
icon: "link",
|
|
113
|
+
count: primitives.links.length,
|
|
114
|
+
isOpen: openSections.has("link"),
|
|
115
|
+
onToggle: () => toggleSection("link")
|
|
116
|
+
}, primitives.links.map((link, index) => /*#__PURE__*/React.createElement(PrimitiveItem, {
|
|
117
|
+
key: index,
|
|
118
|
+
icon: "link",
|
|
119
|
+
title: link.linkName,
|
|
120
|
+
subtitle: link.location,
|
|
121
|
+
metadata: [`from ${link.sourceType}`],
|
|
122
|
+
onClick: () => onSelectPrimitive({
|
|
123
|
+
type: "link",
|
|
124
|
+
data: link
|
|
125
|
+
})
|
|
126
|
+
}))), primitives.queries.length > 0 && /*#__PURE__*/React.createElement(PrimitiveSection, {
|
|
127
|
+
title: "Advanced Queries",
|
|
128
|
+
icon: "database",
|
|
129
|
+
count: primitives.queries.length,
|
|
130
|
+
isOpen: openSections.has("query"),
|
|
131
|
+
onToggle: () => toggleSection("query")
|
|
132
|
+
}, primitives.queries.map((query, index) => /*#__PURE__*/React.createElement(PrimitiveItem, {
|
|
133
|
+
key: index,
|
|
134
|
+
icon: "database",
|
|
135
|
+
title: query.hookType,
|
|
136
|
+
subtitle: query.location,
|
|
137
|
+
metadata: [query.signature],
|
|
138
|
+
onClick: () => onSelectPrimitive({
|
|
139
|
+
type: "query",
|
|
140
|
+
data: query
|
|
141
|
+
})
|
|
142
|
+
}))), primitives.aggregations.length > 0 && /*#__PURE__*/React.createElement(PrimitiveSection, {
|
|
143
|
+
title: "Aggregations",
|
|
144
|
+
icon: "grouped-bar-chart",
|
|
145
|
+
count: primitives.aggregations.length,
|
|
146
|
+
isOpen: openSections.has("aggregation"),
|
|
147
|
+
onToggle: () => toggleSection("aggregation")
|
|
148
|
+
}, primitives.aggregations.map((aggregation, index) => /*#__PURE__*/React.createElement(PrimitiveItem, {
|
|
149
|
+
key: index,
|
|
150
|
+
icon: "grouped-bar-chart",
|
|
151
|
+
title: aggregation.type,
|
|
152
|
+
subtitle: aggregation.location,
|
|
153
|
+
metadata: [aggregation.whereClause && "filtered", aggregation.aggregate && "aggregated"].filter(x => Boolean(x)),
|
|
154
|
+
onClick: () => onSelectPrimitive({
|
|
155
|
+
type: "aggregation",
|
|
156
|
+
data: aggregation
|
|
157
|
+
})
|
|
158
|
+
})))));
|
|
159
|
+
};
|
|
160
|
+
const PrimitiveSection = ({
|
|
161
|
+
title,
|
|
162
|
+
icon,
|
|
163
|
+
count,
|
|
164
|
+
isOpen,
|
|
165
|
+
onToggle,
|
|
166
|
+
children
|
|
167
|
+
}) => {
|
|
168
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
169
|
+
className: styles.section
|
|
170
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
171
|
+
type: "button",
|
|
172
|
+
className: styles.sectionHeader,
|
|
173
|
+
onClick: onToggle
|
|
174
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
175
|
+
icon: isOpen ? "chevron-down" : "chevron-right",
|
|
176
|
+
size: 12
|
|
177
|
+
}), /*#__PURE__*/React.createElement(Icon, {
|
|
178
|
+
icon: icon
|
|
179
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
180
|
+
className: styles.sectionTitle
|
|
181
|
+
}, title), /*#__PURE__*/React.createElement("span", {
|
|
182
|
+
className: styles.sectionCount
|
|
183
|
+
}, count)), /*#__PURE__*/React.createElement(Collapse, {
|
|
184
|
+
isOpen: isOpen
|
|
185
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
186
|
+
className: styles.sectionContent
|
|
187
|
+
}, children)));
|
|
188
|
+
};
|
|
189
|
+
const PrimitiveItem = ({
|
|
190
|
+
icon,
|
|
191
|
+
title,
|
|
192
|
+
subtitle,
|
|
193
|
+
metadata,
|
|
194
|
+
onClick
|
|
195
|
+
}) => {
|
|
196
|
+
return /*#__PURE__*/React.createElement("button", {
|
|
197
|
+
type: "button",
|
|
198
|
+
className: styles.item,
|
|
199
|
+
onClick: onClick
|
|
200
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
201
|
+
icon: icon,
|
|
202
|
+
size: 14
|
|
203
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
204
|
+
className: styles.itemContent
|
|
205
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
206
|
+
className: styles.itemTitle
|
|
207
|
+
}, title), /*#__PURE__*/React.createElement("div", {
|
|
208
|
+
className: styles.itemSubtitle
|
|
209
|
+
}, subtitle), metadata && metadata.length > 0 && /*#__PURE__*/React.createElement("div", {
|
|
210
|
+
className: styles.itemMetadata
|
|
211
|
+
}, metadata.map((meta, index) => /*#__PURE__*/React.createElement("span", {
|
|
212
|
+
key: index,
|
|
213
|
+
className: styles.metadataTag
|
|
214
|
+
}, meta)))), /*#__PURE__*/React.createElement(Icon, {
|
|
215
|
+
icon: "chevron-right",
|
|
216
|
+
size: 12,
|
|
217
|
+
className: styles.itemChevron
|
|
218
|
+
}));
|
|
219
|
+
};
|
|
220
|
+
//# sourceMappingURL=PrimitiveSelectionPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrimitiveSelectionPanel.js","names":["Button","Collapse","Icon","React","useState","styles","PrimitiveSelectionPanel","primitives","onSelectPrimitive","onClose","openSections","setOpenSections","Set","toggleSection","section","newSections","has","delete","add","totalCount","actions","length","objectSets","objects","links","queries","aggregations","createElement","className","panel","header","headerContent","icon","headerTitle","headerSubtitle","componentName","variant","size","onClick","title","content","emptyState","emptySubtext","PrimitiveSection","count","isOpen","onToggle","map","action","index","PrimitiveItem","key","name","subtitle","location","type","data","objectSet","metadata","whereClause","orderBy","pageSize","filter","x","Boolean","object","primaryKey","undefined","link","linkName","sourceType","query","hookType","signature","aggregation","aggregate","children","sectionHeader","sectionTitle","sectionCount","sectionContent","item","itemContent","itemTitle","itemSubtitle","itemMetadata","meta","metadataTag","itemChevron"],"sources":["PrimitiveSelectionPanel.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, Collapse, Icon } from \"@blueprintjs/core\";\nimport React, { useState } from \"react\";\nimport type {\n DiscoveredAction,\n DiscoveredAggregation,\n DiscoveredLink,\n DiscoveredObject,\n DiscoveredObjectSet,\n DiscoveredPrimitives,\n DiscoveredQuery,\n} from \"../utils/ComponentPrimitiveDiscovery.js\";\nimport styles from \"./PrimitiveSelectionPanel.module.scss\";\n\nexport type PrimitiveType =\n | \"action\"\n | \"objectSet\"\n | \"object\"\n | \"link\"\n | \"query\"\n | \"aggregation\";\n\nexport type SelectedPrimitive =\n | { type: \"action\"; data: DiscoveredAction }\n | { type: \"objectSet\"; data: DiscoveredObjectSet }\n | { type: \"object\"; data: DiscoveredObject }\n | { type: \"link\"; data: DiscoveredLink }\n | { type: \"query\"; data: DiscoveredQuery }\n | { type: \"aggregation\"; data: DiscoveredAggregation };\n\nexport interface PrimitiveSelectionPanelProps {\n primitives: DiscoveredPrimitives;\n onSelectPrimitive: (primitive: SelectedPrimitive) => void;\n onClose: () => void;\n}\n\nexport const PrimitiveSelectionPanel: React.FC<PrimitiveSelectionPanelProps> = (\n {\n primitives,\n onSelectPrimitive,\n onClose,\n },\n) => {\n const [openSections, setOpenSections] = useState<Set<PrimitiveType>>(\n new Set([\"action\", \"objectSet\", \"object\", \"link\", \"query\", \"aggregation\"]),\n );\n\n const toggleSection = (section: PrimitiveType) => {\n const newSections = new Set(openSections);\n if (newSections.has(section)) {\n newSections.delete(section);\n } else {\n newSections.add(section);\n }\n setOpenSections(newSections);\n };\n\n const totalCount = primitives.actions.length\n + primitives.objectSets.length\n + primitives.objects.length\n + primitives.links.length\n + primitives.queries.length\n + primitives.aggregations.length;\n\n return (\n <div className={styles.panel}>\n <div className={styles.header}>\n <div className={styles.headerContent}>\n <Icon icon=\"cube\" />\n <div>\n <div className={styles.headerTitle}>Discovered OSDK Usage</div>\n <div className={styles.headerSubtitle}>\n {primitives.componentName} · {totalCount}{\" \"}\n item{totalCount !== 1 ? \"s\" : \"\"}\n </div>\n </div>\n </div>\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon=\"cross\"\n onClick={onClose}\n title=\"Close\"\n />\n </div>\n\n <div className={styles.content}>\n {totalCount === 0 && (\n <div className={styles.emptyState}>\n <Icon icon=\"search\" size={32} />\n <div>No OSDK usage found</div>\n <div className={styles.emptySubtext}>\n This component doesn't use any OSDK hooks\n </div>\n </div>\n )}\n\n {primitives.actions.length > 0 && (\n <PrimitiveSection\n title=\"Actions\"\n icon=\"flash\"\n count={primitives.actions.length}\n isOpen={openSections.has(\"action\")}\n onToggle={() => toggleSection(\"action\")}\n >\n {primitives.actions.map((action, index) => (\n <PrimitiveItem\n key={index}\n icon=\"flash\"\n title={action.name}\n subtitle={action.location}\n onClick={() =>\n onSelectPrimitive({ type: \"action\", data: action })}\n />\n ))}\n </PrimitiveSection>\n )}\n\n {primitives.objectSets.length > 0 && (\n <PrimitiveSection\n title=\"Object Sets\"\n icon=\"th-list\"\n count={primitives.objectSets.length}\n isOpen={openSections.has(\"objectSet\")}\n onToggle={() => toggleSection(\"objectSet\")}\n >\n {primitives.objectSets.map((objectSet, index) => (\n <PrimitiveItem\n key={index}\n icon=\"th-list\"\n title={objectSet.type}\n subtitle={objectSet.location}\n metadata={[\n objectSet.whereClause && \"filtered\",\n objectSet.orderBy && \"sorted\",\n objectSet.pageSize && `${objectSet.pageSize}/page`,\n ].filter((x): x is string => Boolean(x))}\n onClick={() =>\n onSelectPrimitive({ type: \"objectSet\", data: objectSet })}\n />\n ))}\n </PrimitiveSection>\n )}\n\n {primitives.objects.length > 0 && (\n <PrimitiveSection\n title=\"Objects\"\n icon=\"cube\"\n count={primitives.objects.length}\n isOpen={openSections.has(\"object\")}\n onToggle={() => toggleSection(\"object\")}\n >\n {primitives.objects.map((object, index) => (\n <PrimitiveItem\n key={index}\n icon=\"cube\"\n title={object.type}\n subtitle={object.location}\n metadata={object.primaryKey ? [object.primaryKey] : undefined}\n onClick={() =>\n onSelectPrimitive({ type: \"object\", data: object })}\n />\n ))}\n </PrimitiveSection>\n )}\n\n {primitives.links.length > 0 && (\n <PrimitiveSection\n title=\"Links\"\n icon=\"link\"\n count={primitives.links.length}\n isOpen={openSections.has(\"link\")}\n onToggle={() => toggleSection(\"link\")}\n >\n {primitives.links.map((link, index) => (\n <PrimitiveItem\n key={index}\n icon=\"link\"\n title={link.linkName}\n subtitle={link.location}\n metadata={[`from ${link.sourceType}`]}\n onClick={() => onSelectPrimitive({ type: \"link\", data: link })}\n />\n ))}\n </PrimitiveSection>\n )}\n\n {primitives.queries.length > 0 && (\n <PrimitiveSection\n title=\"Advanced Queries\"\n icon=\"database\"\n count={primitives.queries.length}\n isOpen={openSections.has(\"query\")}\n onToggle={() => toggleSection(\"query\")}\n >\n {primitives.queries.map((query, index) => (\n <PrimitiveItem\n key={index}\n icon=\"database\"\n title={query.hookType}\n subtitle={query.location}\n metadata={[query.signature]}\n onClick={() =>\n onSelectPrimitive({ type: \"query\", data: query })}\n />\n ))}\n </PrimitiveSection>\n )}\n\n {primitives.aggregations.length > 0 && (\n <PrimitiveSection\n title=\"Aggregations\"\n icon=\"grouped-bar-chart\"\n count={primitives.aggregations.length}\n isOpen={openSections.has(\"aggregation\")}\n onToggle={() => toggleSection(\"aggregation\")}\n >\n {primitives.aggregations.map((aggregation, index) => (\n <PrimitiveItem\n key={index}\n icon=\"grouped-bar-chart\"\n title={aggregation.type}\n subtitle={aggregation.location}\n metadata={[\n aggregation.whereClause && \"filtered\",\n aggregation.aggregate && \"aggregated\",\n ].filter((x): x is string => Boolean(x))}\n onClick={() =>\n onSelectPrimitive({\n type: \"aggregation\",\n data: aggregation,\n })}\n />\n ))}\n </PrimitiveSection>\n )}\n </div>\n </div>\n );\n};\n\ninterface PrimitiveSectionProps {\n title: string;\n icon:\n | \"flash\"\n | \"th-list\"\n | \"cube\"\n | \"link\"\n | \"database\"\n | \"grouped-bar-chart\";\n count: number;\n isOpen: boolean;\n onToggle: () => void;\n children: React.ReactNode;\n}\n\nconst PrimitiveSection: React.FC<PrimitiveSectionProps> = ({\n title,\n icon,\n count,\n isOpen,\n onToggle,\n children,\n}) => {\n return (\n <div className={styles.section}>\n <button\n type=\"button\"\n className={styles.sectionHeader}\n onClick={onToggle}\n >\n <Icon icon={isOpen ? \"chevron-down\" : \"chevron-right\"} size={12} />\n <Icon icon={icon} />\n <span className={styles.sectionTitle}>{title}</span>\n <span className={styles.sectionCount}>{count}</span>\n </button>\n <Collapse isOpen={isOpen}>\n <div className={styles.sectionContent}>{children}</div>\n </Collapse>\n </div>\n );\n};\n\ninterface PrimitiveItemProps {\n icon:\n | \"flash\"\n | \"th-list\"\n | \"cube\"\n | \"link\"\n | \"database\"\n | \"grouped-bar-chart\";\n title: string;\n subtitle: string;\n metadata?: string[];\n onClick: () => void;\n}\n\nconst PrimitiveItem: React.FC<PrimitiveItemProps> = ({\n icon,\n title,\n subtitle,\n metadata,\n onClick,\n}) => {\n return (\n <button\n type=\"button\"\n className={styles.item}\n onClick={onClick}\n >\n <Icon icon={icon} size={14} />\n <div className={styles.itemContent}>\n <div className={styles.itemTitle}>{title}</div>\n <div className={styles.itemSubtitle}>{subtitle}</div>\n {metadata && metadata.length > 0 && (\n <div className={styles.itemMetadata}>\n {metadata.map((meta, index) => (\n <span key={index} className={styles.metadataTag}>\n {meta}\n </span>\n ))}\n </div>\n )}\n </div>\n <Icon icon=\"chevron-right\" size={12} className={styles.itemChevron} />\n </button>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|