@osdk/react-devtools 0.10.0 → 0.10.1-main-e39a72892d538f3130e2cd51cee05d83d11fa493
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 +10 -0
- package/build/esm/DevToolsContext.js.map +1 -1
- package/build/esm/components/ActionMetrics.js +2 -2
- package/build/esm/components/ActionMetrics.js.map +1 -1
- package/build/esm/components/BubbleChart.js +1 -1
- package/build/esm/components/BubbleChart.js.map +1 -1
- package/build/esm/components/CacheInspectorTab.js +1 -1
- package/build/esm/components/CacheInspectorTab.js.map +1 -1
- package/build/esm/components/CacheMetrics.js +1 -1
- package/build/esm/components/CacheMetrics.js.map +1 -1
- package/build/esm/components/ComponentCard.js +1 -1
- package/build/esm/components/ComponentCard.js.map +1 -1
- package/build/esm/components/ComputeTab.js +6 -6
- package/build/esm/components/ComputeTab.js.map +1 -1
- package/build/esm/components/CopyableCodeBlock.js.map +1 -1
- package/build/esm/components/DebuggingTab.js +2 -2
- package/build/esm/components/DebuggingTab.js.map +1 -1
- package/build/esm/components/HookRow.js.map +1 -1
- package/build/esm/components/ImprovementsTab.js.map +1 -1
- package/build/esm/components/InspectorSelectionHeader.js.map +1 -1
- package/build/esm/components/InterceptTab.js +5 -5
- package/build/esm/components/InterceptTab.js.map +1 -1
- package/build/esm/components/IssueCard.js.map +1 -1
- package/build/esm/components/LogEntryCard.js.map +1 -1
- package/build/esm/components/MockEditor.js.map +1 -1
- package/build/esm/components/MonitorErrorBoundary.js.map +1 -1
- package/build/esm/components/MonitoringPanel.js +1 -1
- package/build/esm/components/MonitoringPanel.js.map +1 -1
- package/build/esm/components/ObjectLoadingMetrics.js.map +1 -1
- package/build/esm/components/OsdkAppErrorBoundary.js.map +1 -1
- package/build/esm/components/OsdkDevTools.js.map +1 -1
- package/build/esm/components/OverrideEditor.js.map +1 -1
- package/build/esm/components/PerformanceTab.js +8 -8
- package/build/esm/components/PerformanceTab.js.map +1 -1
- package/build/esm/components/PrimitiveSelectionPanel.js +1 -1
- package/build/esm/components/PrimitiveSelectionPanel.js.map +1 -1
- package/build/esm/components/resolveComponentName.js +2 -2
- package/build/esm/components/resolveComponentName.js.map +1 -1
- package/build/esm/components/testHelpers.js.map +1 -1
- package/build/esm/fiber/DegradationNotice.js +2 -2
- package/build/esm/fiber/DegradationNotice.js.map +1 -1
- package/build/esm/fiber/DevtoolsHook.js +4 -4
- package/build/esm/fiber/DevtoolsHook.js.map +1 -1
- package/build/esm/fiber/FiberAccess.js.map +1 -1
- package/build/esm/fiber/FiberInspection.js.map +1 -1
- package/build/esm/fiber/FiberTags.js.map +1 -1
- package/build/esm/fiber/HookStateInspector.js.map +1 -1
- package/build/esm/fiber/SafeFiberOperation.js.map +1 -1
- package/build/esm/fiber/capabilities.js.map +1 -1
- package/build/esm/fiber/traverseFiber.js.map +1 -1
- package/build/esm/fiber/types.js.map +1 -1
- package/build/esm/fiber/validation.js +1 -1
- package/build/esm/fiber/validation.js.map +1 -1
- package/build/esm/hooks/createPollingStore.js.map +1 -1
- package/build/esm/hooks/useActiveComponents.js.map +1 -1
- package/build/esm/hooks/useComponentRegistry.js.map +1 -1
- package/build/esm/hooks/useComputeSelectors.js.map +1 -1
- package/build/esm/hooks/useConsoleLogs.js.map +1 -1
- package/build/esm/hooks/useInspectorSelection.js.map +1 -1
- package/build/esm/hooks/useMetrics.js.map +1 -1
- package/build/esm/hooks/usePersistedState.js.map +1 -1
- package/build/esm/hooks/useRecommendations.js +1 -1
- package/build/esm/hooks/useRecommendations.js.map +1 -1
- package/build/esm/hooks/useSharedTick.js.map +1 -1
- package/build/esm/hooks/useTimeElapsed.js.map +1 -1
- package/build/esm/hooks/useTrackerSubscription.js.map +1 -1
- package/build/esm/hooks/useUnusedFieldAnalysis.js.map +1 -1
- package/build/esm/inspector/ClickToInspectSystem.js.map +1 -1
- package/build/esm/inspector/components/ComponentLabel.js.map +1 -1
- package/build/esm/inspector/components/InspectorBanner.js.map +1 -1
- package/build/esm/inspector/components/InspectorOverlay.js.map +1 -1
- package/build/esm/inspector/components/SelectionHighlight.js.map +1 -1
- package/build/esm/inspector/createClickToInspect.js.map +1 -1
- package/build/esm/inspector/hooks/useAnimatedBounds.js.map +1 -1
- package/build/esm/inspector/inspectorController.js.map +1 -1
- package/build/esm/inspector/utils/elementBounds.js.map +1 -1
- package/build/esm/inspector/utils/interpolation.js.map +1 -1
- package/build/esm/inspector/utils/labelPositioning.js.map +1 -1
- package/build/esm/mocking/MockCacheKeyGenerator.js +3 -3
- package/build/esm/mocking/MockCacheKeyGenerator.js.map +1 -1
- package/build/esm/mocking/MockManager.js +4 -4
- package/build/esm/mocking/MockManager.js.map +1 -1
- package/build/esm/prototyping/PrototypeOverrideStore.js +1 -1
- package/build/esm/prototyping/PrototypeOverrideStore.js.map +1 -1
- package/build/esm/register.js.map +1 -1
- package/build/esm/store/ComputeStore.js.map +1 -1
- package/build/esm/store/ConsoleLogStore.js +2 -2
- package/build/esm/store/ConsoleLogStore.js.map +1 -1
- package/build/esm/store/MetricsStore.js.map +1 -1
- package/build/esm/store/MonitorStore.js.map +1 -1
- package/build/esm/store/WindowErrorStore.js.map +1 -1
- package/build/esm/styles.js.map +1 -1
- package/build/esm/types/compute.js.map +1 -1
- package/build/esm/utils/ActionLifecycleTracker.js.map +1 -1
- package/build/esm/utils/CacheEfficiencyAnalyzer.js.map +1 -1
- package/build/esm/utils/ComponentContextCapture.js +10 -10
- package/build/esm/utils/ComponentContextCapture.js.map +1 -1
- package/build/esm/utils/ComponentPrimitiveDiscovery.js.map +1 -1
- package/build/esm/utils/ComponentQueryRegistry.js +8 -8
- package/build/esm/utils/ComponentQueryRegistry.js.map +1 -1
- package/build/esm/utils/ComputeMonitor.js +2 -2
- package/build/esm/utils/ComputeMonitor.js.map +1 -1
- package/build/esm/utils/EventTimeline.js.map +1 -1
- package/build/esm/utils/LinkTraversalTracker.js +2 -2
- package/build/esm/utils/LinkTraversalTracker.js.map +1 -1
- package/build/esm/utils/MockDataGenerator.js +4 -4
- package/build/esm/utils/MockDataGenerator.js.map +1 -1
- package/build/esm/utils/ObservableClientMonitor.js +2 -2
- package/build/esm/utils/ObservableClientMonitor.js.map +1 -1
- package/build/esm/utils/PerformanceRecommendationEngine.js +1 -1
- package/build/esm/utils/PerformanceRecommendationEngine.js.map +1 -1
- package/build/esm/utils/PropertyAccessTracker.js +3 -3
- package/build/esm/utils/PropertyAccessTracker.js.map +1 -1
- package/build/esm/utils/RecommendationMatcher.js.map +1 -1
- package/build/esm/utils/SubscriptionTracker.js +1 -1
- package/build/esm/utils/SubscriptionTracker.js.map +1 -1
- package/build/esm/utils/UnusedFieldAnalyzer.js +6 -7
- package/build/esm/utils/UnusedFieldAnalyzer.js.map +1 -1
- package/build/esm/utils/WaterfallDetector.js.map +1 -1
- package/build/esm/utils/computePayload.js +2 -2
- package/build/esm/utils/computePayload.js.map +1 -1
- package/build/esm/utils/computeRequest.js.map +1 -1
- package/build/esm/utils/format.js.map +1 -1
- package/build/esm/vite/hookInstaller.js.map +1 -1
- package/build/esm/vite/index.js +2 -3
- package/build/esm/vite/index.js.map +1 -1
- package/build/types/DevToolsContext.d.ts.map +1 -1
- package/build/types/components/ActionMetrics.d.ts.map +1 -1
- package/build/types/components/BubbleChart.d.ts.map +1 -1
- package/build/types/components/CacheInspectorTab.d.ts.map +1 -1
- package/build/types/components/CacheMetrics.d.ts.map +1 -1
- package/build/types/components/ComponentCard.d.ts.map +1 -1
- package/build/types/components/ComputeTab.d.ts.map +1 -1
- package/build/types/components/CopyableCodeBlock.d.ts.map +1 -1
- package/build/types/components/DebuggingTab.d.ts.map +1 -1
- package/build/types/components/HookRow.d.ts.map +1 -1
- package/build/types/components/ImprovementsTab.d.ts.map +1 -1
- package/build/types/components/InspectorSelectionHeader.d.ts.map +1 -1
- package/build/types/components/InterceptTab.d.ts.map +1 -1
- package/build/types/components/IssueCard.d.ts.map +1 -1
- package/build/types/components/LogEntryCard.d.ts.map +1 -1
- package/build/types/components/MockEditor.d.ts.map +1 -1
- package/build/types/components/MonitorErrorBoundary.d.ts.map +1 -1
- package/build/types/components/MonitoringPanel.d.ts.map +1 -1
- package/build/types/components/ObjectLoadingMetrics.d.ts.map +1 -1
- package/build/types/components/OsdkAppErrorBoundary.d.ts.map +1 -1
- package/build/types/components/OsdkDevTools.d.ts.map +1 -1
- package/build/types/components/OverrideEditor.d.ts.map +1 -1
- package/build/types/components/PerformanceTab.d.ts.map +1 -1
- package/build/types/components/PrimitiveSelectionPanel.d.ts.map +1 -1
- package/build/types/components/resolveComponentName.d.ts.map +1 -1
- package/build/types/components/testHelpers.d.ts.map +1 -1
- package/build/types/fiber/DegradationNotice.d.ts.map +1 -1
- package/build/types/fiber/DevtoolsHook.d.ts.map +1 -1
- package/build/types/fiber/FiberInspection.d.ts.map +1 -1
- package/build/types/fiber/HookStateInspector.d.ts.map +1 -1
- package/build/types/fiber/capabilities.d.ts.map +1 -1
- package/build/types/fiber/traverseFiber.d.ts.map +1 -1
- package/build/types/fiber/types.d.ts.map +1 -1
- package/build/types/hooks/useActiveComponents.d.ts.map +1 -1
- package/build/types/hooks/useComponentRegistry.d.ts.map +1 -1
- package/build/types/hooks/useComputeSelectors.d.ts.map +1 -1
- package/build/types/hooks/useConsoleLogs.d.ts.map +1 -1
- package/build/types/hooks/useInspectorSelection.d.ts.map +1 -1
- package/build/types/hooks/useMetrics.d.ts.map +1 -1
- package/build/types/hooks/useRecommendations.d.ts.map +1 -1
- package/build/types/hooks/useUnusedFieldAnalysis.d.ts.map +1 -1
- package/build/types/inspector/ClickToInspectSystem.d.ts.map +1 -1
- package/build/types/inspector/components/ComponentLabel.d.ts.map +1 -1
- package/build/types/inspector/components/InspectorOverlay.d.ts.map +1 -1
- package/build/types/inspector/components/SelectionHighlight.d.ts.map +1 -1
- package/build/types/inspector/hooks/useAnimatedBounds.d.ts.map +1 -1
- package/build/types/mocking/MockManager.d.ts.map +1 -1
- package/build/types/store/ComputeStore.d.ts.map +1 -1
- package/build/types/store/ConsoleLogStore.d.ts.map +1 -1
- package/build/types/store/MetricsStore.d.ts.map +1 -1
- package/build/types/store/MonitorStore.d.ts.map +1 -1
- package/build/types/store/WindowErrorStore.d.ts.map +1 -1
- package/build/types/styles.d.ts +0 -1
- package/build/types/styles.d.ts.map +1 -1
- package/build/types/types/compute.d.ts.map +1 -1
- package/build/types/utils/ActionLifecycleTracker.d.ts.map +1 -1
- package/build/types/utils/CacheEfficiencyAnalyzer.d.ts.map +1 -1
- package/build/types/utils/ComponentContextCapture.d.ts.map +1 -1
- package/build/types/utils/ComponentPrimitiveDiscovery.d.ts.map +1 -1
- package/build/types/utils/ComponentQueryRegistry.d.ts.map +1 -1
- package/build/types/utils/ComputeMonitor.d.ts.map +1 -1
- package/build/types/utils/EventTimeline.d.ts.map +1 -1
- package/build/types/utils/LinkTraversalTracker.d.ts.map +1 -1
- package/build/types/utils/MockDataGenerator.d.ts.map +1 -1
- package/build/types/utils/ObservableClientMonitor.d.ts.map +1 -1
- package/build/types/utils/PerformanceRecommendationEngine.d.ts.map +1 -1
- package/build/types/utils/PropertyAccessTracker.d.ts.map +1 -1
- package/build/types/utils/SubscriptionTracker.d.ts.map +1 -1
- package/build/types/utils/UnusedFieldAnalyzer.d.ts.map +1 -1
- package/build/types/utils/WaterfallDetector.d.ts.map +1 -1
- package/build/types/utils/computeRequest.d.ts.map +1 -1
- package/build/types/vite/index.d.ts.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheEfficiencyAnalyzer.js","names":["CacheEfficiencyAnalyzer","constructor","metricsStore","coldThresholdMs","analyze","cacheSnapshot","snapshot","getSnapshot","metrics","aggregates","totalRequests","cacheHits","cacheMisses","revalidations","hitRate","cacheMissRate","avgNetworkTime","estimateAverageNetworkTime","cacheSavings","entries","sortedByAccess","sort","a","b","metadata","hitCount","hotEntries","slice","coldEntries","filter","e","Date","now","timestamp","totalSize","reduce","sum","size","avgSize","length","recommendations","generateRecommendations","totalEntries","totalSizeBytes","deduplications","score","calculateEfficiencyScore","coldEntriesRatio","recommendationCount","r","level","hitRateTrend","getHitRateTrend","bypassedRequests","averageEntrySize","grade","scoreToGrade","windowSeconds","timeSeries","hitRates","count","Math","min","i","total","push","title","message","toFixed","suggestion","params","max","round","networkResponseTime"],"sources":["CacheEfficiencyAnalyzer.ts"],"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 type { CacheEntry, CacheSnapshot } from \"@osdk/client/observable\";\nimport type { MetricsStore } from \"../store/MetricsStore.js\";\n\nexport interface NetworkMetrics {\n cacheMisses: number;\n networkResponseTime: number;\n}\n\nexport interface CacheRecommendation {\n level: \"critical\" | \"warning\" | \"info\" | \"success\";\n title: string;\n message: string;\n suggestion: string;\n action?: {\n label: string;\n handler: () => void;\n };\n}\n\nexport interface CacheEfficiencyMetrics {\n hitRate: number;\n hitRateTrend: number[];\n cacheMissRate: number;\n cacheSavings: number;\n bypassedRequests: number;\n avgNetworkTime: number;\n totalEntries: number;\n totalSizeBytes: number;\n averageEntrySize: number;\n hotEntries: CacheEntry[];\n coldEntries: CacheEntry[];\n coldThresholdMs: number;\n deduplications: number;\n recommendations: CacheRecommendation[];\n score: number;\n grade: \"A\" | \"B\" | \"C\" | \"D\" | \"F\";\n}\n\nexport class CacheEfficiencyAnalyzer {\n constructor(\n private metricsStore: MetricsStore,\n private coldThresholdMs: number = 5 * 60 * 1000, // 5 minutes\n ) {}\n\n analyze(cacheSnapshot: CacheSnapshot): CacheEfficiencyMetrics {\n const snapshot = this.metricsStore.getSnapshot();\n const metrics = snapshot.aggregates;\n\n const totalRequests = metrics.cacheHits + metrics.cacheMisses\n + metrics.revalidations;\n const hitRate = totalRequests > 0\n ? (metrics.cacheHits + metrics.revalidations) / totalRequests\n : 0;\n const cacheMissRate = 1 - hitRate;\n\n const avgNetworkTime = this.estimateAverageNetworkTime(metrics);\n const cacheSavings = (metrics.cacheHits + metrics.revalidations)\n * avgNetworkTime;\n\n const entries = cacheSnapshot.entries || [];\n const sortedByAccess = [...entries].sort((a, b) =>\n (b.metadata.hitCount || 0) - (a.metadata.hitCount || 0)\n );\n const hotEntries = sortedByAccess.slice(0, 10);\n const coldEntries = entries.filter(e =>\n Date.now() - (e.metadata.timestamp || 0) > this.coldThresholdMs\n );\n\n const totalSize = entries.reduce(\n (sum, e) => sum + (e.metadata.size || 0),\n 0,\n );\n const avgSize = entries.length > 0 ? totalSize / entries.length : 0;\n\n const recommendations = this.generateRecommendations(\n {\n hitRate,\n cacheMissRate,\n totalEntries: entries.length,\n totalSizeBytes: totalSize,\n coldEntries: coldEntries.length,\n cacheHits: metrics.cacheHits,\n cacheMisses: metrics.cacheMisses,\n revalidations: metrics.revalidations,\n deduplications: metrics.deduplications,\n },\n cacheSnapshot,\n );\n\n const score = this.calculateEfficiencyScore({\n hitRate,\n coldEntriesRatio: entries.length > 0\n ? coldEntries.length / entries.length\n : 0,\n totalSizeBytes: totalSize,\n recommendationCount: recommendations.filter(r =>\n r.level === \"warning\" || r.level === \"critical\"\n ).length,\n });\n\n return {\n hitRate,\n hitRateTrend: this.getHitRateTrend(),\n cacheMissRate,\n cacheSavings,\n bypassedRequests: metrics.cacheHits,\n avgNetworkTime,\n totalEntries: entries.length,\n totalSizeBytes: totalSize,\n averageEntrySize: avgSize,\n hotEntries,\n coldEntries,\n coldThresholdMs: this.coldThresholdMs,\n deduplications: metrics.deduplications,\n recommendations,\n score,\n grade: this.scoreToGrade(score),\n };\n }\n\n getHitRateTrend(windowSeconds: number = 60): number[] {\n const snapshot = this.metricsStore.getSnapshot();\n const { cacheHits, cacheMisses, revalidations } = snapshot.timeSeries;\n\n const hitRates: number[] = [];\n const count = Math.min(windowSeconds, cacheHits.length);\n\n for (let i = cacheHits.length - count; i < cacheHits.length; i++) {\n if (i < 0) continue;\n const total = cacheHits[i] + cacheMisses[i] + revalidations[i];\n hitRates.push(total > 0 ? (cacheHits[i] + revalidations[i]) / total : 0);\n }\n\n return hitRates;\n }\n\n private generateRecommendations(\n metrics: {\n hitRate: number;\n cacheMissRate: number;\n totalEntries: number;\n totalSizeBytes: number;\n coldEntries: number;\n cacheHits: number;\n cacheMisses: number;\n revalidations: number;\n deduplications: number;\n },\n cacheSnapshot: CacheSnapshot,\n ): CacheRecommendation[] {\n const recommendations: CacheRecommendation[] = [];\n\n if (\n metrics.hitRate < 0.3\n && metrics.cacheHits + metrics.cacheMisses + metrics.revalidations > 20\n ) {\n recommendations.push({\n level: \"critical\",\n title: \"Very low cache hit rate\",\n message: `Only ${\n (metrics.hitRate * 100).toFixed(1)\n }% of queries are served from cache`,\n suggestion:\n \"Consider increasing cache TTL, prefetching related data, or memoizing components\",\n });\n } else if (\n metrics.hitRate < 0.5\n && metrics.cacheHits + metrics.cacheMisses + metrics.revalidations > 20\n ) {\n recommendations.push({\n level: \"warning\",\n title: \"Low cache hit rate\",\n message: `Only ${\n (metrics.hitRate * 100).toFixed(1)\n }% of queries are served from cache`,\n suggestion:\n \"Enable prefetching or increase cache TTL for frequently accessed data\",\n });\n }\n\n if (metrics.coldEntries > 50) {\n recommendations.push({\n level: \"warning\",\n title: \"Many stale cache entries\",\n message: `${metrics.coldEntries} entries haven't been accessed in ${\n this.coldThresholdMs / 60 / 1000\n } minutes`,\n suggestion: \"Consider implementing automatic cache eviction policy\",\n });\n } else if (\n metrics.coldEntries > 20 && metrics.coldEntries > metrics.totalEntries / 2\n ) {\n recommendations.push({\n level: \"info\",\n title: \"Many cold cache entries\",\n message:\n `${metrics.coldEntries}/${metrics.totalEntries} entries are not actively used`,\n suggestion:\n \"You can safely evict cold entries if memory is constrained\",\n });\n }\n\n if (metrics.totalSizeBytes > 50 * 1024 * 1024) {\n recommendations.push({\n level: \"critical\",\n title: \"Very large cache\",\n message: `Cache is using ${\n (metrics.totalSizeBytes / 1024 / 1024).toFixed(1)\n }MB - potential memory pressure`,\n suggestion:\n \"Implement cache size limits, TTL-based eviction, or LRU eviction policy\",\n });\n } else if (metrics.totalSizeBytes > 10 * 1024 * 1024) {\n recommendations.push({\n level: \"warning\",\n title: \"Large cache\",\n message: `Cache is using ${\n (metrics.totalSizeBytes / 1024 / 1024).toFixed(1)\n }MB`,\n suggestion:\n \"Monitor memory usage and consider implementing cache size limits if not present\",\n });\n }\n\n if (metrics.deduplications > 5) {\n recommendations.push({\n level: \"success\",\n title: \"Good query deduplication\",\n message:\n `${metrics.deduplications} duplicate queries deduplicated - cache is working well!`,\n suggestion:\n \"Keep current architecture - components are efficiently sharing cache\",\n });\n }\n\n if (metrics.hitRate > 0.8) {\n recommendations.push({\n level: \"success\",\n title: \"Excellent cache hit rate\",\n message: `${\n (metrics.hitRate * 100).toFixed(1)\n }% of queries served from cache`,\n suggestion: \"Cache configuration is optimal for your app\",\n });\n }\n\n if (\n metrics.cacheHits + metrics.cacheMisses + metrics.revalidations === 0\n && metrics.totalEntries > 0\n ) {\n recommendations.push({\n level: \"info\",\n title: \"Cache not being used\",\n message: \"Cache entries exist but no hits/misses recorded yet\",\n suggestion: \"Monitor cache usage as you interact with the app\",\n });\n }\n\n return recommendations;\n }\n\n private calculateEfficiencyScore(params: {\n hitRate: number;\n coldEntriesRatio: number;\n totalSizeBytes: number;\n recommendationCount: number;\n }): number {\n let score = 100;\n\n if (params.hitRate < 0.3) {\n score -= 30;\n } else if (params.hitRate < 0.5) {\n score -= 15;\n } else if (params.hitRate < 0.7) {\n score -= 5;\n }\n\n if (params.coldEntriesRatio > 0.5) {\n score -= 20;\n } else if (params.coldEntriesRatio > 0.3) {\n score -= 10;\n }\n\n if (params.totalSizeBytes > 50 * 1024 * 1024) {\n score -= 20;\n } else if (params.totalSizeBytes > 10 * 1024 * 1024) {\n score -= 10;\n }\n\n score -= Math.min(params.recommendationCount * 5, 20);\n\n return Math.max(0, Math.round(score));\n }\n\n private scoreToGrade(score: number): \"A\" | \"B\" | \"C\" | \"D\" | \"F\" {\n if (score >= 90) return \"A\";\n if (score >= 80) return \"B\";\n if (score >= 70) return \"C\";\n if (score >= 60) return \"D\";\n return \"F\";\n }\n\n private estimateAverageNetworkTime(metrics: NetworkMetrics): number {\n if (metrics.cacheMisses > 0 && metrics.networkResponseTime > 0) {\n return metrics.networkResponseTime / metrics.cacheMisses;\n }\n return 200;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"CacheEfficiencyAnalyzer.js","names":["CacheEfficiencyAnalyzer","constructor","metricsStore","coldThresholdMs","analyze","cacheSnapshot","snapshot","getSnapshot","metrics","aggregates","totalRequests","cacheHits","cacheMisses","revalidations","hitRate","cacheMissRate","avgNetworkTime","estimateAverageNetworkTime","cacheSavings","entries","sortedByAccess","sort","a","b","metadata","hitCount","hotEntries","slice","coldEntries","filter","e","Date","now","timestamp","totalSize","reduce","sum","size","avgSize","length","recommendations","generateRecommendations","totalEntries","totalSizeBytes","deduplications","score","calculateEfficiencyScore","coldEntriesRatio","recommendationCount","r","level","hitRateTrend","getHitRateTrend","bypassedRequests","averageEntrySize","grade","scoreToGrade","windowSeconds","timeSeries","hitRates","count","Math","min","i","total","push","title","message","toFixed","suggestion","params","max","round","networkResponseTime"],"sources":["CacheEfficiencyAnalyzer.ts"],"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 type { CacheEntry, CacheSnapshot } from \"@osdk/client/observable\";\n\nimport type { MetricsStore } from \"../store/MetricsStore.js\";\n\nexport interface NetworkMetrics {\n cacheMisses: number;\n networkResponseTime: number;\n}\n\nexport interface CacheRecommendation {\n level: \"critical\" | \"warning\" | \"info\" | \"success\";\n title: string;\n message: string;\n suggestion: string;\n action?: {\n label: string;\n handler: () => void;\n };\n}\n\nexport interface CacheEfficiencyMetrics {\n hitRate: number;\n hitRateTrend: number[];\n cacheMissRate: number;\n cacheSavings: number;\n bypassedRequests: number;\n avgNetworkTime: number;\n totalEntries: number;\n totalSizeBytes: number;\n averageEntrySize: number;\n hotEntries: CacheEntry[];\n coldEntries: CacheEntry[];\n coldThresholdMs: number;\n deduplications: number;\n recommendations: CacheRecommendation[];\n score: number;\n grade: \"A\" | \"B\" | \"C\" | \"D\" | \"F\";\n}\n\nexport class CacheEfficiencyAnalyzer {\n constructor(\n private metricsStore: MetricsStore,\n private coldThresholdMs: number = 5 * 60 * 1000 // 5 minutes\n ) {}\n\n analyze(cacheSnapshot: CacheSnapshot): CacheEfficiencyMetrics {\n const snapshot = this.metricsStore.getSnapshot();\n const metrics = snapshot.aggregates;\n\n const totalRequests =\n metrics.cacheHits + metrics.cacheMisses + metrics.revalidations;\n const hitRate =\n totalRequests > 0\n ? (metrics.cacheHits + metrics.revalidations) / totalRequests\n : 0;\n const cacheMissRate = 1 - hitRate;\n\n const avgNetworkTime = this.estimateAverageNetworkTime(metrics);\n const cacheSavings =\n (metrics.cacheHits + metrics.revalidations) * avgNetworkTime;\n\n const entries = cacheSnapshot.entries || [];\n const sortedByAccess = [...entries].sort(\n (a, b) => (b.metadata.hitCount || 0) - (a.metadata.hitCount || 0)\n );\n const hotEntries = sortedByAccess.slice(0, 10);\n const coldEntries = entries.filter(\n (e) => Date.now() - (e.metadata.timestamp || 0) > this.coldThresholdMs\n );\n\n const totalSize = entries.reduce(\n (sum, e) => sum + (e.metadata.size || 0),\n 0\n );\n const avgSize = entries.length > 0 ? totalSize / entries.length : 0;\n\n const recommendations = this.generateRecommendations(\n {\n hitRate,\n cacheMissRate,\n totalEntries: entries.length,\n totalSizeBytes: totalSize,\n coldEntries: coldEntries.length,\n cacheHits: metrics.cacheHits,\n cacheMisses: metrics.cacheMisses,\n revalidations: metrics.revalidations,\n deduplications: metrics.deduplications,\n },\n cacheSnapshot\n );\n\n const score = this.calculateEfficiencyScore({\n hitRate,\n coldEntriesRatio:\n entries.length > 0 ? coldEntries.length / entries.length : 0,\n totalSizeBytes: totalSize,\n recommendationCount: recommendations.filter(\n (r) => r.level === \"warning\" || r.level === \"critical\"\n ).length,\n });\n\n return {\n hitRate,\n hitRateTrend: this.getHitRateTrend(),\n cacheMissRate,\n cacheSavings,\n bypassedRequests: metrics.cacheHits,\n avgNetworkTime,\n totalEntries: entries.length,\n totalSizeBytes: totalSize,\n averageEntrySize: avgSize,\n hotEntries,\n coldEntries,\n coldThresholdMs: this.coldThresholdMs,\n deduplications: metrics.deduplications,\n recommendations,\n score,\n grade: this.scoreToGrade(score),\n };\n }\n\n getHitRateTrend(windowSeconds: number = 60): number[] {\n const snapshot = this.metricsStore.getSnapshot();\n const { cacheHits, cacheMisses, revalidations } = snapshot.timeSeries;\n\n const hitRates: number[] = [];\n const count = Math.min(windowSeconds, cacheHits.length);\n\n for (let i = cacheHits.length - count; i < cacheHits.length; i++) {\n if (i < 0) continue;\n const total = cacheHits[i] + cacheMisses[i] + revalidations[i];\n hitRates.push(total > 0 ? (cacheHits[i] + revalidations[i]) / total : 0);\n }\n\n return hitRates;\n }\n\n private generateRecommendations(\n metrics: {\n hitRate: number;\n cacheMissRate: number;\n totalEntries: number;\n totalSizeBytes: number;\n coldEntries: number;\n cacheHits: number;\n cacheMisses: number;\n revalidations: number;\n deduplications: number;\n },\n cacheSnapshot: CacheSnapshot\n ): CacheRecommendation[] {\n const recommendations: CacheRecommendation[] = [];\n\n if (\n metrics.hitRate < 0.3 &&\n metrics.cacheHits + metrics.cacheMisses + metrics.revalidations > 20\n ) {\n recommendations.push({\n level: \"critical\",\n title: \"Very low cache hit rate\",\n message: `Only ${(metrics.hitRate * 100).toFixed(\n 1\n )}% of queries are served from cache`,\n suggestion:\n \"Consider increasing cache TTL, prefetching related data, or memoizing components\",\n });\n } else if (\n metrics.hitRate < 0.5 &&\n metrics.cacheHits + metrics.cacheMisses + metrics.revalidations > 20\n ) {\n recommendations.push({\n level: \"warning\",\n title: \"Low cache hit rate\",\n message: `Only ${(metrics.hitRate * 100).toFixed(\n 1\n )}% of queries are served from cache`,\n suggestion:\n \"Enable prefetching or increase cache TTL for frequently accessed data\",\n });\n }\n\n if (metrics.coldEntries > 50) {\n recommendations.push({\n level: \"warning\",\n title: \"Many stale cache entries\",\n message: `${metrics.coldEntries} entries haven't been accessed in ${\n this.coldThresholdMs / 60 / 1000\n } minutes`,\n suggestion: \"Consider implementing automatic cache eviction policy\",\n });\n } else if (\n metrics.coldEntries > 20 &&\n metrics.coldEntries > metrics.totalEntries / 2\n ) {\n recommendations.push({\n level: \"info\",\n title: \"Many cold cache entries\",\n message: `${metrics.coldEntries}/${metrics.totalEntries} entries are not actively used`,\n suggestion:\n \"You can safely evict cold entries if memory is constrained\",\n });\n }\n\n if (metrics.totalSizeBytes > 50 * 1024 * 1024) {\n recommendations.push({\n level: \"critical\",\n title: \"Very large cache\",\n message: `Cache is using ${(\n metrics.totalSizeBytes /\n 1024 /\n 1024\n ).toFixed(1)}MB - potential memory pressure`,\n suggestion:\n \"Implement cache size limits, TTL-based eviction, or LRU eviction policy\",\n });\n } else if (metrics.totalSizeBytes > 10 * 1024 * 1024) {\n recommendations.push({\n level: \"warning\",\n title: \"Large cache\",\n message: `Cache is using ${(\n metrics.totalSizeBytes /\n 1024 /\n 1024\n ).toFixed(1)}MB`,\n suggestion:\n \"Monitor memory usage and consider implementing cache size limits if not present\",\n });\n }\n\n if (metrics.deduplications > 5) {\n recommendations.push({\n level: \"success\",\n title: \"Good query deduplication\",\n message: `${metrics.deduplications} duplicate queries deduplicated - cache is working well!`,\n suggestion:\n \"Keep current architecture - components are efficiently sharing cache\",\n });\n }\n\n if (metrics.hitRate > 0.8) {\n recommendations.push({\n level: \"success\",\n title: \"Excellent cache hit rate\",\n message: `${(metrics.hitRate * 100).toFixed(\n 1\n )}% of queries served from cache`,\n suggestion: \"Cache configuration is optimal for your app\",\n });\n }\n\n if (\n metrics.cacheHits + metrics.cacheMisses + metrics.revalidations === 0 &&\n metrics.totalEntries > 0\n ) {\n recommendations.push({\n level: \"info\",\n title: \"Cache not being used\",\n message: \"Cache entries exist but no hits/misses recorded yet\",\n suggestion: \"Monitor cache usage as you interact with the app\",\n });\n }\n\n return recommendations;\n }\n\n private calculateEfficiencyScore(params: {\n hitRate: number;\n coldEntriesRatio: number;\n totalSizeBytes: number;\n recommendationCount: number;\n }): number {\n let score = 100;\n\n if (params.hitRate < 0.3) {\n score -= 30;\n } else if (params.hitRate < 0.5) {\n score -= 15;\n } else if (params.hitRate < 0.7) {\n score -= 5;\n }\n\n if (params.coldEntriesRatio > 0.5) {\n score -= 20;\n } else if (params.coldEntriesRatio > 0.3) {\n score -= 10;\n }\n\n if (params.totalSizeBytes > 50 * 1024 * 1024) {\n score -= 20;\n } else if (params.totalSizeBytes > 10 * 1024 * 1024) {\n score -= 10;\n }\n\n score -= Math.min(params.recommendationCount * 5, 20);\n\n return Math.max(0, Math.round(score));\n }\n\n private scoreToGrade(score: number): \"A\" | \"B\" | \"C\" | \"D\" | \"F\" {\n if (score >= 90) return \"A\";\n if (score >= 80) return \"B\";\n if (score >= 70) return \"C\";\n if (score >= 60) return \"D\";\n return \"F\";\n }\n\n private estimateAverageNetworkTime(metrics: NetworkMetrics): number {\n if (metrics.cacheMisses > 0 && metrics.networkResponseTime > 0) {\n return metrics.networkResponseTime / metrics.cacheMisses;\n }\n return 200;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -110,11 +110,11 @@ export class ComponentContextCapture {
|
|
|
110
110
|
return /\.(tsx?|jsx?)(\?|:|$)/.test(filePath) && !/node_modules/.test(filePath);
|
|
111
111
|
};
|
|
112
112
|
const extractComponentNameFromPath = filePath => {
|
|
113
|
-
const match = filePath.match(/\/([A-Z][a-zA-Z0-9]*)\.(tsx?|jsx?)[
|
|
113
|
+
const match = filePath.match(/\/([A-Z][a-zA-Z0-9]*)\.(tsx?|jsx?)[?:]/);
|
|
114
114
|
if (match) {
|
|
115
115
|
return match[1];
|
|
116
116
|
}
|
|
117
|
-
const match2 = filePath.match(/([A-Z][a-zA-Z0-9]*)\.(tsx?|jsx?)[
|
|
117
|
+
const match2 = filePath.match(/([A-Z][a-zA-Z0-9]*)\.(tsx?|jsx?)[?:]?$/);
|
|
118
118
|
if (match2) {
|
|
119
119
|
return match2[1];
|
|
120
120
|
}
|
|
@@ -130,8 +130,8 @@ export class ComponentContextCapture {
|
|
|
130
130
|
return {
|
|
131
131
|
componentName: funcName,
|
|
132
132
|
filePath,
|
|
133
|
-
lineNumber: parseInt(lineNum, 10),
|
|
134
|
-
columnNumber: parseInt(colNum, 10)
|
|
133
|
+
lineNumber: Number.parseInt(lineNum, 10),
|
|
134
|
+
columnNumber: Number.parseInt(colNum, 10)
|
|
135
135
|
};
|
|
136
136
|
}
|
|
137
137
|
continue;
|
|
@@ -143,8 +143,8 @@ export class ComponentContextCapture {
|
|
|
143
143
|
return {
|
|
144
144
|
componentName: funcName,
|
|
145
145
|
filePath,
|
|
146
|
-
lineNumber: parseInt(lineNum, 10),
|
|
147
|
-
columnNumber: parseInt(colNum, 10)
|
|
146
|
+
lineNumber: Number.parseInt(lineNum, 10),
|
|
147
|
+
columnNumber: Number.parseInt(colNum, 10)
|
|
148
148
|
};
|
|
149
149
|
}
|
|
150
150
|
continue;
|
|
@@ -162,8 +162,8 @@ export class ComponentContextCapture {
|
|
|
162
162
|
return {
|
|
163
163
|
componentName,
|
|
164
164
|
filePath,
|
|
165
|
-
lineNumber: locationMatch ? parseInt(locationMatch[1], 10) : undefined,
|
|
166
|
-
columnNumber: locationMatch ? parseInt(locationMatch[2], 10) : undefined
|
|
165
|
+
lineNumber: locationMatch ? Number.parseInt(locationMatch[1], 10) : undefined,
|
|
166
|
+
columnNumber: locationMatch ? Number.parseInt(locationMatch[2], 10) : undefined
|
|
167
167
|
};
|
|
168
168
|
}
|
|
169
169
|
}
|
|
@@ -179,8 +179,8 @@ export class ComponentContextCapture {
|
|
|
179
179
|
return {
|
|
180
180
|
componentName: pathName || funcName,
|
|
181
181
|
filePath,
|
|
182
|
-
lineNumber: parseInt(lineNum, 10),
|
|
183
|
-
columnNumber: parseInt(colNum, 10)
|
|
182
|
+
lineNumber: Number.parseInt(lineNum, 10),
|
|
183
|
+
columnNumber: Number.parseInt(colNum, 10)
|
|
184
184
|
};
|
|
185
185
|
}
|
|
186
186
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentContextCapture.js","names":["getComponentId","getComponentName","getSourceLocation","ComponentContextCapture","fiberToId","WeakMap","idCounter","enabled","captureNow","tryStackTraceAnalysis","contextFromFiber","fiber","id","getComponentIdForFiber","name","displayName","getFiberDisplayName","sourceLocation","filePath","fileName","lineNumber","columnNumber","stackTrace","get","shortPath","split","slice","join","set","type","undefined","error","Error","stack","parsed","parseStackTrace","componentName","lines","internalPatterns","internalFuncNames","Set","isInternalFrame","funcName","has","pattern","test","isAppFilePath","extractComponentNameFromPath","match","match2","maxLines","Math","min","length","i","line","chromeMatch","lineNum","colNum","parseInt","firefoxMatch","fileMatch","locationMatch","anyFuncMatch","pathName","nameMatch","disable","enable","clearCache","componentContextCapture"],"sources":["ComponentContextCapture.ts"],"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 {\n getComponentId,\n getComponentName,\n getSourceLocation,\n} from \"../fiber/FiberInspection.js\";\nimport type { Fiber } from \"../fiber/types.js\";\n\nexport interface ComponentContext {\n id: string;\n name: string;\n displayName?: string;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n stackTrace: string;\n}\n\nexport class ComponentContextCapture {\n private fiberToId = new WeakMap<Fiber, string>();\n private idCounter = 0;\n private enabled = true;\n\n captureNow(): ComponentContext | null {\n if (!this.enabled) {\n return null;\n }\n\n return this.tryStackTraceAnalysis();\n }\n\n /**\n * Extract context from a fiber node when one is available.\n * Only use this at click-time when we have a fiber from DOM element.\n */\n contextFromFiber(fiber: Fiber): ComponentContext {\n const id = this.getComponentIdForFiber(fiber);\n const name = getComponentName(fiber);\n const displayName = this.getFiberDisplayName(fiber);\n const sourceLocation = getSourceLocation(fiber);\n\n return {\n id,\n name,\n displayName,\n filePath: sourceLocation?.fileName,\n lineNumber: sourceLocation?.lineNumber,\n columnNumber: sourceLocation?.columnNumber,\n stackTrace: \"\",\n };\n }\n\n getComponentIdForFiber(fiber: Fiber): string {\n let id = this.fiberToId.get(fiber);\n if (!id) {\n id = getComponentId(fiber);\n\n // If no stable ID available, generate one\n if (!id || id === \"unknown-0\") {\n const name = getComponentName(fiber);\n const sourceLocation = getSourceLocation(fiber);\n\n if (sourceLocation) {\n const shortPath =\n sourceLocation.fileName?.split(\"/\").slice(-2).join(\"/\")\n || \"unknown\";\n id = `fiber-${name}-${shortPath}-${sourceLocation.lineNumber || 0}`;\n } else {\n id = `fiber-${name}-${this.idCounter++}`;\n }\n }\n\n this.fiberToId.set(fiber, id);\n }\n return id;\n }\n\n private getFiberDisplayName(fiber: Fiber): string | undefined {\n if (\n typeof fiber.type === \"function\"\n && \"displayName\" in fiber.type\n && typeof fiber.type.displayName === \"string\"\n ) {\n return fiber.type.displayName;\n }\n return undefined;\n }\n\n private tryStackTraceAnalysis(): ComponentContext | null {\n const error = new Error();\n const stack = error.stack || \"\";\n\n const parsed = this.parseStackTrace(stack);\n\n const shortPath = parsed.filePath?.split(\"/\").slice(-2).join(\"/\")\n || \"unknown\";\n const id = `stack-${parsed.componentName || \"Unknown\"}-${shortPath}-${\n parsed.lineNumber || 0\n }`;\n\n return {\n id,\n name: parsed.componentName || \"Unknown\",\n filePath: parsed.filePath,\n lineNumber: parsed.lineNumber,\n columnNumber: parsed.columnNumber,\n stackTrace: stack,\n };\n }\n\n private parseStackTrace(stack: string): {\n componentName: string | null;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n } {\n const lines = stack.split(\"\\n\");\n\n const internalPatterns = [\n /node_modules/,\n /@osdk\\/react/,\n /react-devtools/,\n /ComponentContextCapture/,\n /ObservableClientMonitor/,\n /ComponentQueryRegistry/,\n /packages\\/react\\/build/,\n /packages\\/react\\/esm/,\n /packages\\/react\\/src/,\n /Proxy/,\n ];\n\n const internalFuncNames = new Set([\n \"Proxy\",\n \"ComponentContextCapture\",\n \"Object\",\n \"Array\",\n \"Function\",\n \"Promise\",\n \"eval\",\n \"anonymous\",\n \"Module\",\n ]);\n\n const isInternalFrame = (filePath: string, funcName: string): boolean => {\n if (internalFuncNames.has(funcName)) {\n return true;\n }\n for (const pattern of internalPatterns) {\n if (pattern.test(filePath)) {\n return true;\n }\n }\n return false;\n };\n\n const isAppFilePath = (filePath: string): boolean => {\n for (const pattern of internalPatterns) {\n if (pattern.test(filePath)) {\n return false;\n }\n }\n return /\\.(tsx?|jsx?)(\\?|:|$)/.test(filePath)\n && !/node_modules/.test(filePath);\n };\n\n const extractComponentNameFromPath = (\n filePath: string,\n ): string | null => {\n const match = filePath.match(/\\/([A-Z][a-zA-Z0-9]*)\\.(tsx?|jsx?)[\\?:]/);\n if (match) {\n return match[1];\n }\n const match2 = filePath.match(/([A-Z][a-zA-Z0-9]*)\\.(tsx?|jsx?)[\\?:]?$/);\n if (match2) {\n return match2[1];\n }\n return null;\n };\n\n const maxLines = Math.min(lines.length, 40);\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const chromeMatch = line.match(/at\\s+([A-Z]\\w+)\\s+\\((.*?):(\\d+):(\\d+)\\)/);\n if (chromeMatch) {\n const [, funcName, filePath, lineNum, colNum] = chromeMatch;\n if (!isInternalFrame(filePath, funcName)) {\n return {\n componentName: funcName,\n filePath,\n lineNumber: parseInt(lineNum, 10),\n columnNumber: parseInt(colNum, 10),\n };\n }\n continue;\n }\n\n const firefoxMatch = line.match(/([A-Z]\\w+)@(.*?):(\\d+):(\\d+)/);\n if (firefoxMatch) {\n const [, funcName, filePath, lineNum, colNum] = firefoxMatch;\n if (!isInternalFrame(filePath, funcName)) {\n return {\n componentName: funcName,\n filePath,\n lineNumber: parseInt(lineNum, 10),\n columnNumber: parseInt(colNum, 10),\n };\n }\n continue;\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const fileMatch = line.match(\n /\\((https?:\\/\\/[^)]+|\\/[^)]+)\\)|at\\s+(https?:\\/\\/\\S+|\\/\\S+)/,\n );\n if (fileMatch) {\n const filePath = fileMatch[1] || fileMatch[2];\n if (isAppFilePath(filePath)) {\n const componentName = extractComponentNameFromPath(filePath);\n if (componentName) {\n const locationMatch = filePath.match(/:(\\d+):(\\d+)$/);\n return {\n componentName,\n filePath,\n lineNumber: locationMatch\n ? parseInt(locationMatch[1], 10)\n : undefined,\n columnNumber: locationMatch\n ? parseInt(locationMatch[2], 10)\n : undefined,\n };\n }\n }\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const anyFuncMatch = line.match(/at\\s+(\\w+)\\s+\\((.*?):(\\d+):(\\d+)\\)/);\n if (anyFuncMatch) {\n const [, funcName, filePath, lineNum, colNum] = anyFuncMatch;\n if (\n funcName.length >= 3\n && !internalFuncNames.has(funcName)\n && isAppFilePath(filePath)\n ) {\n const pathName = extractComponentNameFromPath(filePath);\n return {\n componentName: pathName || funcName,\n filePath,\n lineNumber: parseInt(lineNum, 10),\n columnNumber: parseInt(colNum, 10),\n };\n }\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n const nameMatch = line.match(/at\\s+([A-Z]\\w+)/);\n if (nameMatch) {\n const funcName = nameMatch[1];\n if (!internalFuncNames.has(funcName)) {\n return { componentName: funcName };\n }\n }\n }\n\n return { componentName: null };\n }\n\n disable(): void {\n this.enabled = false;\n }\n\n enable(): void {\n this.enabled = true;\n }\n\n clearCache(): void {\n this.fiberToId = new WeakMap();\n }\n}\n\nexport const componentContextCapture: ComponentContextCapture =\n new ComponentContextCapture();\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SACEA,cAAc,EACdC,gBAAgB,EAChBC,iBAAiB,QACZ,6BAA6B;AAapC,OAAO,MAAMC,uBAAuB,CAAC;EAC3BC,SAAS,GAAG,IAAIC,OAAO,CAAgB,CAAC;EACxCC,SAAS,GAAG,CAAC;EACbC,OAAO,GAAG,IAAI;EAEtBC,UAAUA,CAAA,EAA4B;IACpC,IAAI,CAAC,IAAI,CAACD,OAAO,EAAE;MACjB,OAAO,IAAI;IACb;IAEA,OAAO,IAAI,CAACE,qBAAqB,CAAC,CAAC;EACrC;;EAEA;AACF;AACA;AACA;EACEC,gBAAgBA,CAACC,KAAY,EAAoB;IAC/C,MAAMC,EAAE,GAAG,IAAI,CAACC,sBAAsB,CAACF,KAAK,CAAC;IAC7C,MAAMG,IAAI,GAAGb,gBAAgB,CAACU,KAAK,CAAC;IACpC,MAAMI,WAAW,GAAG,IAAI,CAACC,mBAAmB,CAACL,KAAK,CAAC;IACnD,MAAMM,cAAc,GAAGf,iBAAiB,CAACS,KAAK,CAAC;IAE/C,OAAO;MACLC,EAAE;MACFE,IAAI;MACJC,WAAW;MACXG,QAAQ,EAAED,cAAc,EAAEE,QAAQ;MAClCC,UAAU,EAAEH,cAAc,EAAEG,UAAU;MACtCC,YAAY,EAAEJ,cAAc,EAAEI,YAAY;MAC1CC,UAAU,EAAE;IACd,CAAC;EACH;EAEAT,sBAAsBA,CAACF,KAAY,EAAU;IAC3C,IAAIC,EAAE,GAAG,IAAI,CAACR,SAAS,CAACmB,GAAG,CAACZ,KAAK,CAAC;IAClC,IAAI,CAACC,EAAE,EAAE;MACPA,EAAE,GAAGZ,cAAc,CAACW,KAAK,CAAC;;MAE1B;MACA,IAAI,CAACC,EAAE,IAAIA,EAAE,KAAK,WAAW,EAAE;QAC7B,MAAME,IAAI,GAAGb,gBAAgB,CAACU,KAAK,CAAC;QACpC,MAAMM,cAAc,GAAGf,iBAAiB,CAACS,KAAK,CAAC;QAE/C,IAAIM,cAAc,EAAE;UAClB,MAAMO,SAAS,GACbP,cAAc,CAACE,QAAQ,EAAEM,KAAK,CAAC,GAAG,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,IACpD,SAAS;UACdf,EAAE,GAAG,SAASE,IAAI,IAAIU,SAAS,IAAIP,cAAc,CAACG,UAAU,IAAI,CAAC,EAAE;QACrE,CAAC,MAAM;UACLR,EAAE,GAAG,SAASE,IAAI,IAAI,IAAI,CAACR,SAAS,EAAE,EAAE;QAC1C;MACF;MAEA,IAAI,CAACF,SAAS,CAACwB,GAAG,CAACjB,KAAK,EAAEC,EAAE,CAAC;IAC/B;IACA,OAAOA,EAAE;EACX;EAEQI,mBAAmBA,CAACL,KAAY,EAAsB;IAC5D,IACE,OAAOA,KAAK,CAACkB,IAAI,KAAK,UAAU,IAC7B,aAAa,IAAIlB,KAAK,CAACkB,IAAI,IAC3B,OAAOlB,KAAK,CAACkB,IAAI,CAACd,WAAW,KAAK,QAAQ,EAC7C;MACA,OAAOJ,KAAK,CAACkB,IAAI,CAACd,WAAW;IAC/B;IACA,OAAOe,SAAS;EAClB;EAEQrB,qBAAqBA,CAAA,EAA4B;IACvD,MAAMsB,KAAK,GAAG,IAAIC,KAAK,CAAC,CAAC;IACzB,MAAMC,KAAK,GAAGF,KAAK,CAACE,KAAK,IAAI,EAAE;IAE/B,MAAMC,MAAM,GAAG,IAAI,CAACC,eAAe,CAACF,KAAK,CAAC;IAE1C,MAAMT,SAAS,GAAGU,MAAM,CAAChB,QAAQ,EAAEO,KAAK,CAAC,GAAG,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,IAC5D,SAAS;IACd,MAAMf,EAAE,GAAG,SAASsB,MAAM,CAACE,aAAa,IAAI,SAAS,IAAIZ,SAAS,IAChEU,MAAM,CAACd,UAAU,IAAI,CAAC,EACtB;IAEF,OAAO;MACLR,EAAE;MACFE,IAAI,EAAEoB,MAAM,CAACE,aAAa,IAAI,SAAS;MACvClB,QAAQ,EAAEgB,MAAM,CAAChB,QAAQ;MACzBE,UAAU,EAAEc,MAAM,CAACd,UAAU;MAC7BC,YAAY,EAAEa,MAAM,CAACb,YAAY;MACjCC,UAAU,EAAEW;IACd,CAAC;EACH;EAEQE,eAAeA,CAACF,KAAa,EAKnC;IACA,MAAMI,KAAK,GAAGJ,KAAK,CAACR,KAAK,CAAC,IAAI,CAAC;IAE/B,MAAMa,gBAAgB,GAAG,CACvB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EACtB,OAAO,CACR;IAED,MAAMC,iBAAiB,GAAG,IAAIC,GAAG,CAAC,CAChC,OAAO,EACP,yBAAyB,EACzB,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,EACT,MAAM,EACN,WAAW,EACX,QAAQ,CACT,CAAC;IAEF,MAAMC,eAAe,GAAGA,CAACvB,QAAgB,EAAEwB,QAAgB,KAAc;MACvE,IAAIH,iBAAiB,CAACI,GAAG,CAACD,QAAQ,CAAC,EAAE;QACnC,OAAO,IAAI;MACb;MACA,KAAK,MAAME,OAAO,IAAIN,gBAAgB,EAAE;QACtC,IAAIM,OAAO,CAACC,IAAI,CAAC3B,QAAQ,CAAC,EAAE;UAC1B,OAAO,IAAI;QACb;MACF;MACA,OAAO,KAAK;IACd,CAAC;IAED,MAAM4B,aAAa,GAAI5B,QAAgB,IAAc;MACnD,KAAK,MAAM0B,OAAO,IAAIN,gBAAgB,EAAE;QACtC,IAAIM,OAAO,CAACC,IAAI,CAAC3B,QAAQ,CAAC,EAAE;UAC1B,OAAO,KAAK;QACd;MACF;MACA,OAAO,uBAAuB,CAAC2B,IAAI,CAAC3B,QAAQ,CAAC,IACxC,CAAC,cAAc,CAAC2B,IAAI,CAAC3B,QAAQ,CAAC;IACrC,CAAC;IAED,MAAM6B,4BAA4B,GAChC7B,QAAgB,IACE;MAClB,MAAM8B,KAAK,GAAG9B,QAAQ,CAAC8B,KAAK,CAAC,yCAAyC,CAAC;MACvE,IAAIA,KAAK,EAAE;QACT,OAAOA,KAAK,CAAC,CAAC,CAAC;MACjB;MACA,MAAMC,MAAM,GAAG/B,QAAQ,CAAC8B,KAAK,CAAC,yCAAyC,CAAC;MACxE,IAAIC,MAAM,EAAE;QACV,OAAOA,MAAM,CAAC,CAAC,CAAC;MAClB;MACA,OAAO,IAAI;IACb,CAAC;IAED,MAAMC,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAACf,KAAK,CAACgB,MAAM,EAAE,EAAE,CAAC;IAE3C,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,QAAQ,EAAEI,CAAC,EAAE,EAAE;MACjC,MAAMC,IAAI,GAAGlB,KAAK,CAACiB,CAAC,CAAC;MAErB,MAAME,WAAW,GAAGD,IAAI,CAACP,KAAK,CAAC,yCAAyC,CAAC;MACzE,IAAIQ,WAAW,EAAE;QACf,MAAM,GAAGd,QAAQ,EAAExB,QAAQ,EAAEuC,OAAO,EAAEC,MAAM,CAAC,GAAGF,WAAW;QAC3D,IAAI,CAACf,eAAe,CAACvB,QAAQ,EAAEwB,QAAQ,CAAC,EAAE;UACxC,OAAO;YACLN,aAAa,EAAEM,QAAQ;YACvBxB,QAAQ;YACRE,UAAU,EAAEuC,QAAQ,CAACF,OAAO,EAAE,EAAE,CAAC;YACjCpC,YAAY,EAAEsC,QAAQ,CAACD,MAAM,EAAE,EAAE;UACnC,CAAC;QACH;QACA;MACF;MAEA,MAAME,YAAY,GAAGL,IAAI,CAACP,KAAK,CAAC,8BAA8B,CAAC;MAC/D,IAAIY,YAAY,EAAE;QAChB,MAAM,GAAGlB,QAAQ,EAAExB,QAAQ,EAAEuC,OAAO,EAAEC,MAAM,CAAC,GAAGE,YAAY;QAC5D,IAAI,CAACnB,eAAe,CAACvB,QAAQ,EAAEwB,QAAQ,CAAC,EAAE;UACxC,OAAO;YACLN,aAAa,EAAEM,QAAQ;YACvBxB,QAAQ;YACRE,UAAU,EAAEuC,QAAQ,CAACF,OAAO,EAAE,EAAE,CAAC;YACjCpC,YAAY,EAAEsC,QAAQ,CAACD,MAAM,EAAE,EAAE;UACnC,CAAC;QACH;QACA;MACF;IACF;IAEA,KAAK,IAAIJ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,QAAQ,EAAEI,CAAC,EAAE,EAAE;MACjC,MAAMC,IAAI,GAAGlB,KAAK,CAACiB,CAAC,CAAC;MAErB,MAAMO,SAAS,GAAGN,IAAI,CAACP,KAAK,CAC1B,4DACF,CAAC;MACD,IAAIa,SAAS,EAAE;QACb,MAAM3C,QAAQ,GAAG2C,SAAS,CAAC,CAAC,CAAC,IAAIA,SAAS,CAAC,CAAC,CAAC;QAC7C,IAAIf,aAAa,CAAC5B,QAAQ,CAAC,EAAE;UAC3B,MAAMkB,aAAa,GAAGW,4BAA4B,CAAC7B,QAAQ,CAAC;UAC5D,IAAIkB,aAAa,EAAE;YACjB,MAAM0B,aAAa,GAAG5C,QAAQ,CAAC8B,KAAK,CAAC,eAAe,CAAC;YACrD,OAAO;cACLZ,aAAa;cACblB,QAAQ;cACRE,UAAU,EAAE0C,aAAa,GACrBH,QAAQ,CAACG,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAC9BhC,SAAS;cACbT,YAAY,EAAEyC,aAAa,GACvBH,QAAQ,CAACG,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAC9BhC;YACN,CAAC;UACH;QACF;MACF;IACF;IAEA,KAAK,IAAIwB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,QAAQ,EAAEI,CAAC,EAAE,EAAE;MACjC,MAAMC,IAAI,GAAGlB,KAAK,CAACiB,CAAC,CAAC;MAErB,MAAMS,YAAY,GAAGR,IAAI,CAACP,KAAK,CAAC,oCAAoC,CAAC;MACrE,IAAIe,YAAY,EAAE;QAChB,MAAM,GAAGrB,QAAQ,EAAExB,QAAQ,EAAEuC,OAAO,EAAEC,MAAM,CAAC,GAAGK,YAAY;QAC5D,IACErB,QAAQ,CAACW,MAAM,IAAI,CAAC,IACjB,CAACd,iBAAiB,CAACI,GAAG,CAACD,QAAQ,CAAC,IAChCI,aAAa,CAAC5B,QAAQ,CAAC,EAC1B;UACA,MAAM8C,QAAQ,GAAGjB,4BAA4B,CAAC7B,QAAQ,CAAC;UACvD,OAAO;YACLkB,aAAa,EAAE4B,QAAQ,IAAItB,QAAQ;YACnCxB,QAAQ;YACRE,UAAU,EAAEuC,QAAQ,CAACF,OAAO,EAAE,EAAE,CAAC;YACjCpC,YAAY,EAAEsC,QAAQ,CAACD,MAAM,EAAE,EAAE;UACnC,CAAC;QACH;MACF;IACF;IAEA,KAAK,IAAIJ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,QAAQ,EAAEI,CAAC,EAAE,EAAE;MACjC,MAAMC,IAAI,GAAGlB,KAAK,CAACiB,CAAC,CAAC;MACrB,MAAMW,SAAS,GAAGV,IAAI,CAACP,KAAK,CAAC,iBAAiB,CAAC;MAC/C,IAAIiB,SAAS,EAAE;QACb,MAAMvB,QAAQ,GAAGuB,SAAS,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC1B,iBAAiB,CAACI,GAAG,CAACD,QAAQ,CAAC,EAAE;UACpC,OAAO;YAAEN,aAAa,EAAEM;UAAS,CAAC;QACpC;MACF;IACF;IAEA,OAAO;MAAEN,aAAa,EAAE;IAAK,CAAC;EAChC;EAEA8B,OAAOA,CAAA,EAAS;IACd,IAAI,CAAC3D,OAAO,GAAG,KAAK;EACtB;EAEA4D,MAAMA,CAAA,EAAS;IACb,IAAI,CAAC5D,OAAO,GAAG,IAAI;EACrB;EAEA6D,UAAUA,CAAA,EAAS;IACjB,IAAI,CAAChE,SAAS,GAAG,IAAIC,OAAO,CAAC,CAAC;EAChC;AACF;AAEA,OAAO,MAAMgE,uBAAgD,GAC3D,IAAIlE,uBAAuB,CAAC,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ComponentContextCapture.js","names":["getComponentId","getComponentName","getSourceLocation","ComponentContextCapture","fiberToId","WeakMap","idCounter","enabled","captureNow","tryStackTraceAnalysis","contextFromFiber","fiber","id","getComponentIdForFiber","name","displayName","getFiberDisplayName","sourceLocation","filePath","fileName","lineNumber","columnNumber","stackTrace","get","shortPath","split","slice","join","set","type","undefined","error","Error","stack","parsed","parseStackTrace","componentName","lines","internalPatterns","internalFuncNames","Set","isInternalFrame","funcName","has","pattern","test","isAppFilePath","extractComponentNameFromPath","match","match2","maxLines","Math","min","length","i","line","chromeMatch","lineNum","colNum","Number","parseInt","firefoxMatch","fileMatch","locationMatch","anyFuncMatch","pathName","nameMatch","disable","enable","clearCache","componentContextCapture"],"sources":["ComponentContextCapture.ts"],"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 {\n getComponentId,\n getComponentName,\n getSourceLocation,\n} from \"../fiber/FiberInspection.js\";\nimport type { Fiber } from \"../fiber/types.js\";\n\nexport interface ComponentContext {\n id: string;\n name: string;\n displayName?: string;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n stackTrace: string;\n}\n\nexport class ComponentContextCapture {\n private fiberToId = new WeakMap<Fiber, string>();\n private idCounter = 0;\n private enabled = true;\n\n captureNow(): ComponentContext | null {\n if (!this.enabled) {\n return null;\n }\n\n return this.tryStackTraceAnalysis();\n }\n\n /**\n * Extract context from a fiber node when one is available.\n * Only use this at click-time when we have a fiber from DOM element.\n */\n contextFromFiber(fiber: Fiber): ComponentContext {\n const id = this.getComponentIdForFiber(fiber);\n const name = getComponentName(fiber);\n const displayName = this.getFiberDisplayName(fiber);\n const sourceLocation = getSourceLocation(fiber);\n\n return {\n id,\n name,\n displayName,\n filePath: sourceLocation?.fileName,\n lineNumber: sourceLocation?.lineNumber,\n columnNumber: sourceLocation?.columnNumber,\n stackTrace: \"\",\n };\n }\n\n getComponentIdForFiber(fiber: Fiber): string {\n let id = this.fiberToId.get(fiber);\n if (!id) {\n id = getComponentId(fiber);\n\n // If no stable ID available, generate one\n if (!id || id === \"unknown-0\") {\n const name = getComponentName(fiber);\n const sourceLocation = getSourceLocation(fiber);\n\n if (sourceLocation) {\n const shortPath =\n sourceLocation.fileName?.split(\"/\").slice(-2).join(\"/\") ||\n \"unknown\";\n id = `fiber-${name}-${shortPath}-${sourceLocation.lineNumber || 0}`;\n } else {\n id = `fiber-${name}-${this.idCounter++}`;\n }\n }\n\n this.fiberToId.set(fiber, id);\n }\n return id;\n }\n\n private getFiberDisplayName(fiber: Fiber): string | undefined {\n if (\n typeof fiber.type === \"function\" &&\n \"displayName\" in fiber.type &&\n typeof fiber.type.displayName === \"string\"\n ) {\n return fiber.type.displayName;\n }\n return undefined;\n }\n\n private tryStackTraceAnalysis(): ComponentContext | null {\n const error = new Error();\n const stack = error.stack || \"\";\n\n const parsed = this.parseStackTrace(stack);\n\n const shortPath =\n parsed.filePath?.split(\"/\").slice(-2).join(\"/\") || \"unknown\";\n const id = `stack-${parsed.componentName || \"Unknown\"}-${shortPath}-${\n parsed.lineNumber || 0\n }`;\n\n return {\n id,\n name: parsed.componentName || \"Unknown\",\n filePath: parsed.filePath,\n lineNumber: parsed.lineNumber,\n columnNumber: parsed.columnNumber,\n stackTrace: stack,\n };\n }\n\n private parseStackTrace(stack: string): {\n componentName: string | null;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n } {\n const lines = stack.split(\"\\n\");\n\n const internalPatterns = [\n /node_modules/,\n /@osdk\\/react/,\n /react-devtools/,\n /ComponentContextCapture/,\n /ObservableClientMonitor/,\n /ComponentQueryRegistry/,\n /packages\\/react\\/build/,\n /packages\\/react\\/esm/,\n /packages\\/react\\/src/,\n /Proxy/,\n ];\n\n const internalFuncNames = new Set([\n \"Proxy\",\n \"ComponentContextCapture\",\n \"Object\",\n \"Array\",\n \"Function\",\n \"Promise\",\n \"eval\",\n \"anonymous\",\n \"Module\",\n ]);\n\n const isInternalFrame = (filePath: string, funcName: string): boolean => {\n if (internalFuncNames.has(funcName)) {\n return true;\n }\n for (const pattern of internalPatterns) {\n if (pattern.test(filePath)) {\n return true;\n }\n }\n return false;\n };\n\n const isAppFilePath = (filePath: string): boolean => {\n for (const pattern of internalPatterns) {\n if (pattern.test(filePath)) {\n return false;\n }\n }\n return (\n /\\.(tsx?|jsx?)(\\?|:|$)/.test(filePath) && !/node_modules/.test(filePath)\n );\n };\n\n const extractComponentNameFromPath = (filePath: string): string | null => {\n const match = filePath.match(/\\/([A-Z][a-zA-Z0-9]*)\\.(tsx?|jsx?)[?:]/);\n if (match) {\n return match[1];\n }\n const match2 = filePath.match(/([A-Z][a-zA-Z0-9]*)\\.(tsx?|jsx?)[?:]?$/);\n if (match2) {\n return match2[1];\n }\n return null;\n };\n\n const maxLines = Math.min(lines.length, 40);\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const chromeMatch = line.match(/at\\s+([A-Z]\\w+)\\s+\\((.*?):(\\d+):(\\d+)\\)/);\n if (chromeMatch) {\n const [, funcName, filePath, lineNum, colNum] = chromeMatch;\n if (!isInternalFrame(filePath, funcName)) {\n return {\n componentName: funcName,\n filePath,\n lineNumber: Number.parseInt(lineNum, 10),\n columnNumber: Number.parseInt(colNum, 10),\n };\n }\n continue;\n }\n\n const firefoxMatch = line.match(/([A-Z]\\w+)@(.*?):(\\d+):(\\d+)/);\n if (firefoxMatch) {\n const [, funcName, filePath, lineNum, colNum] = firefoxMatch;\n if (!isInternalFrame(filePath, funcName)) {\n return {\n componentName: funcName,\n filePath,\n lineNumber: Number.parseInt(lineNum, 10),\n columnNumber: Number.parseInt(colNum, 10),\n };\n }\n continue;\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const fileMatch = line.match(\n /\\((https?:\\/\\/[^)]+|\\/[^)]+)\\)|at\\s+(https?:\\/\\/\\S+|\\/\\S+)/\n );\n if (fileMatch) {\n const filePath = fileMatch[1] || fileMatch[2];\n if (isAppFilePath(filePath)) {\n const componentName = extractComponentNameFromPath(filePath);\n if (componentName) {\n const locationMatch = filePath.match(/:(\\d+):(\\d+)$/);\n return {\n componentName,\n filePath,\n lineNumber: locationMatch\n ? Number.parseInt(locationMatch[1], 10)\n : undefined,\n columnNumber: locationMatch\n ? Number.parseInt(locationMatch[2], 10)\n : undefined,\n };\n }\n }\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const anyFuncMatch = line.match(/at\\s+(\\w+)\\s+\\((.*?):(\\d+):(\\d+)\\)/);\n if (anyFuncMatch) {\n const [, funcName, filePath, lineNum, colNum] = anyFuncMatch;\n if (\n funcName.length >= 3 &&\n !internalFuncNames.has(funcName) &&\n isAppFilePath(filePath)\n ) {\n const pathName = extractComponentNameFromPath(filePath);\n return {\n componentName: pathName || funcName,\n filePath,\n lineNumber: Number.parseInt(lineNum, 10),\n columnNumber: Number.parseInt(colNum, 10),\n };\n }\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n const nameMatch = line.match(/at\\s+([A-Z]\\w+)/);\n if (nameMatch) {\n const funcName = nameMatch[1];\n if (!internalFuncNames.has(funcName)) {\n return { componentName: funcName };\n }\n }\n }\n\n return { componentName: null };\n }\n\n disable(): void {\n this.enabled = false;\n }\n\n enable(): void {\n this.enabled = true;\n }\n\n clearCache(): void {\n this.fiberToId = new WeakMap();\n }\n}\n\nexport const componentContextCapture: ComponentContextCapture =\n new ComponentContextCapture();\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentPrimitiveDiscovery.js","names":["getComponentName","extractOsdkMetadataFromFiber","MAX_ANCESTOR_WALK_DEPTH","ComponentPrimitiveDiscovery","constructor","registry","discoverPrimitives","fiber","componentName","current","depth","type","metadata","length","buildPrimitivesFromMetadata","return","emptyPrimitivesWithName","primitives","componentId","actions","objectSets","objects","links","queries","aggregations","hookIndexCounters","Map","meta","idx","get","hookType","set","location","push","name","actionName","signature","hookIndex","objectType","whereClause","where","orderBy","pageSize","querySignature","primaryKey","sourceType","sourceObjectType","linkName","aggregate","hasOsdkHooks","getPrimitiveCount"],"sources":["ComponentPrimitiveDiscovery.ts"],"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 { getComponentName } from \"../fiber/FiberInspection.js\";\nimport {\n extractOsdkMetadataFromFiber,\n type OsdkHookMetadata,\n} from \"../fiber/HookStateInspector.js\";\nimport type { Fiber } from \"../fiber/types.js\";\nimport type { ComponentQueryRegistry } from \"./ComponentQueryRegistry.js\";\n\nconst MAX_ANCESTOR_WALK_DEPTH = 15;\n\nexport interface DiscoveredAction {\n name: string;\n signature: string;\n location: string;\n hookIndex: number;\n}\n\nexport interface DiscoveredObjectSet {\n type: string;\n whereClause?: Record<string, unknown>;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n pageSize?: number;\n location: string;\n hookIndex: number;\n querySignature: string;\n}\n\nexport interface DiscoveredObject {\n type: string;\n primaryKey?: string;\n location: string;\n hookIndex: number;\n}\n\nexport interface DiscoveredLink {\n sourceType: string;\n linkName: string;\n location: string;\n hookIndex: number;\n}\n\nexport interface DiscoveredQuery {\n signature: string;\n hookType: string;\n location: string;\n hookIndex: number;\n}\n\nexport interface DiscoveredAggregation {\n type: string;\n whereClause?: Record<string, unknown>;\n aggregate?: Record<string, unknown>;\n location: string;\n hookIndex: number;\n querySignature: string;\n}\n\nexport interface DiscoveredPrimitives {\n componentId: string;\n componentName: string;\n actions: DiscoveredAction[];\n objectSets: DiscoveredObjectSet[];\n objects: DiscoveredObject[];\n links: DiscoveredLink[];\n queries: DiscoveredQuery[];\n aggregations: DiscoveredAggregation[];\n}\n\nexport class ComponentPrimitiveDiscovery {\n constructor(private registry: ComponentQueryRegistry) {}\n\n discoverPrimitives(fiber: Fiber): DiscoveredPrimitives {\n const componentName = getComponentName(fiber);\n\n // Walk up from clicked fiber to find nearest component with OSDK hooks\n let current: Fiber | null = fiber;\n let depth = 0;\n while (current && depth < MAX_ANCESTOR_WALK_DEPTH) {\n if (typeof current.type === \"function\") {\n const metadata = extractOsdkMetadataFromFiber(current);\n if (metadata.length > 0) {\n return this.buildPrimitivesFromMetadata(metadata, componentName);\n }\n }\n current = current.return;\n depth++;\n }\n\n return this.emptyPrimitivesWithName(componentName);\n }\n\n private buildPrimitivesFromMetadata(\n metadata: OsdkHookMetadata[],\n componentName: string,\n ): DiscoveredPrimitives {\n const primitives: DiscoveredPrimitives = {\n componentId: componentName,\n componentName,\n actions: [],\n objectSets: [],\n objects: [],\n links: [],\n queries: [],\n aggregations: [],\n };\n\n const hookIndexCounters = new Map<string, number>();\n\n for (const meta of metadata) {\n const idx = hookIndexCounters.get(meta.hookType) ?? 0;\n hookIndexCounters.set(meta.hookType, idx + 1);\n const location = componentName;\n\n switch (meta.hookType) {\n case \"useOsdkAction\": {\n primitives.actions.push({\n name: meta.actionName ?? \"Unknown Action\",\n signature: `action:${meta.actionName ?? \"unknown\"}`,\n location,\n hookIndex: idx,\n });\n break;\n }\n case \"useOsdkObjects\": {\n primitives.objectSets.push({\n type: meta.objectType ?? \"Unknown\",\n whereClause: meta.where as Record<string, unknown> | undefined,\n orderBy: meta.orderBy as\n | Record<string, \"asc\" | \"desc\">\n | undefined,\n pageSize: meta.pageSize,\n location,\n hookIndex: idx,\n querySignature: `list:${meta.objectType ?? \"unknown\"}`,\n });\n break;\n }\n case \"useOsdkObject\": {\n primitives.objects.push({\n type: meta.objectType ?? \"Unknown\",\n primaryKey: meta.primaryKey,\n location,\n hookIndex: idx,\n });\n break;\n }\n case \"useLinks\": {\n primitives.links.push({\n sourceType: meta.sourceObjectType ?? \"Unknown\",\n linkName: meta.linkName ?? \"Unknown\",\n location,\n hookIndex: idx,\n });\n break;\n }\n case \"useOsdkAggregation\": {\n primitives.aggregations.push({\n type: meta.objectType ?? \"Unknown\",\n whereClause: meta.where as Record<string, unknown> | undefined,\n aggregate: meta.aggregate as Record<string, unknown> | undefined,\n location,\n hookIndex: idx,\n querySignature: `aggregation:${meta.objectType ?? \"unknown\"}`,\n });\n break;\n }\n case \"useOsdkFunction\": {\n primitives.queries.push({\n signature: `function:${meta.objectType ?? \"unknown\"}`,\n hookType: meta.hookType,\n location,\n hookIndex: idx,\n });\n break;\n }\n case \"useObjectSet\": {\n primitives.objectSets.push({\n type: meta.objectType ?? \"Unknown\",\n whereClause: meta.where as Record<string, unknown> | undefined,\n orderBy: meta.orderBy as\n | Record<string, \"asc\" | \"desc\">\n | undefined,\n pageSize: meta.pageSize,\n location,\n hookIndex: idx,\n querySignature: `objectSet:${meta.objectType ?? \"unknown\"}`,\n });\n break;\n }\n }\n }\n\n return primitives;\n }\n\n private emptyPrimitivesWithName(componentName: string): DiscoveredPrimitives {\n return {\n componentId: \"unknown\",\n componentName,\n actions: [],\n objectSets: [],\n objects: [],\n links: [],\n queries: [],\n aggregations: [],\n };\n }\n\n hasOsdkHooks(fiber: Fiber): boolean {\n let current: Fiber | null = fiber;\n let depth = 0;\n while (current && depth < MAX_ANCESTOR_WALK_DEPTH) {\n if (typeof current.type === \"function\") {\n const metadata = extractOsdkMetadataFromFiber(current);\n if (metadata.length > 0) {\n return true;\n }\n }\n current = current.return;\n depth++;\n }\n return false;\n }\n\n getPrimitiveCount(fiber: Fiber): number {\n const primitives = this.discoverPrimitives(fiber);\n return (\n 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 }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ComponentPrimitiveDiscovery.js","names":["getComponentName","extractOsdkMetadataFromFiber","MAX_ANCESTOR_WALK_DEPTH","ComponentPrimitiveDiscovery","constructor","registry","discoverPrimitives","fiber","componentName","current","depth","type","metadata","length","buildPrimitivesFromMetadata","return","emptyPrimitivesWithName","primitives","componentId","actions","objectSets","objects","links","queries","aggregations","hookIndexCounters","Map","meta","idx","get","hookType","set","location","push","name","actionName","signature","hookIndex","objectType","whereClause","where","orderBy","pageSize","querySignature","primaryKey","sourceType","sourceObjectType","linkName","aggregate","hasOsdkHooks","getPrimitiveCount"],"sources":["ComponentPrimitiveDiscovery.ts"],"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 { getComponentName } from \"../fiber/FiberInspection.js\";\nimport {\n extractOsdkMetadataFromFiber,\n type OsdkHookMetadata,\n} from \"../fiber/HookStateInspector.js\";\nimport type { Fiber } from \"../fiber/types.js\";\nimport type { ComponentQueryRegistry } from \"./ComponentQueryRegistry.js\";\n\nconst MAX_ANCESTOR_WALK_DEPTH = 15;\n\nexport interface DiscoveredAction {\n name: string;\n signature: string;\n location: string;\n hookIndex: number;\n}\n\nexport interface DiscoveredObjectSet {\n type: string;\n whereClause?: Record<string, unknown>;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n pageSize?: number;\n location: string;\n hookIndex: number;\n querySignature: string;\n}\n\nexport interface DiscoveredObject {\n type: string;\n primaryKey?: string;\n location: string;\n hookIndex: number;\n}\n\nexport interface DiscoveredLink {\n sourceType: string;\n linkName: string;\n location: string;\n hookIndex: number;\n}\n\nexport interface DiscoveredQuery {\n signature: string;\n hookType: string;\n location: string;\n hookIndex: number;\n}\n\nexport interface DiscoveredAggregation {\n type: string;\n whereClause?: Record<string, unknown>;\n aggregate?: Record<string, unknown>;\n location: string;\n hookIndex: number;\n querySignature: string;\n}\n\nexport interface DiscoveredPrimitives {\n componentId: string;\n componentName: string;\n actions: DiscoveredAction[];\n objectSets: DiscoveredObjectSet[];\n objects: DiscoveredObject[];\n links: DiscoveredLink[];\n queries: DiscoveredQuery[];\n aggregations: DiscoveredAggregation[];\n}\n\nexport class ComponentPrimitiveDiscovery {\n constructor(private registry: ComponentQueryRegistry) {}\n\n discoverPrimitives(fiber: Fiber): DiscoveredPrimitives {\n const componentName = getComponentName(fiber);\n\n // Walk up from clicked fiber to find nearest component with OSDK hooks\n let current: Fiber | null = fiber;\n let depth = 0;\n while (current && depth < MAX_ANCESTOR_WALK_DEPTH) {\n if (typeof current.type === \"function\") {\n const metadata = extractOsdkMetadataFromFiber(current);\n if (metadata.length > 0) {\n return this.buildPrimitivesFromMetadata(metadata, componentName);\n }\n }\n current = current.return;\n depth++;\n }\n\n return this.emptyPrimitivesWithName(componentName);\n }\n\n private buildPrimitivesFromMetadata(\n metadata: OsdkHookMetadata[],\n componentName: string\n ): DiscoveredPrimitives {\n const primitives: DiscoveredPrimitives = {\n componentId: componentName,\n componentName,\n actions: [],\n objectSets: [],\n objects: [],\n links: [],\n queries: [],\n aggregations: [],\n };\n\n const hookIndexCounters = new Map<string, number>();\n\n for (const meta of metadata) {\n const idx = hookIndexCounters.get(meta.hookType) ?? 0;\n hookIndexCounters.set(meta.hookType, idx + 1);\n const location = componentName;\n\n switch (meta.hookType) {\n case \"useOsdkAction\": {\n primitives.actions.push({\n name: meta.actionName ?? \"Unknown Action\",\n signature: `action:${meta.actionName ?? \"unknown\"}`,\n location,\n hookIndex: idx,\n });\n break;\n }\n case \"useOsdkObjects\": {\n primitives.objectSets.push({\n type: meta.objectType ?? \"Unknown\",\n whereClause: meta.where as Record<string, unknown> | undefined,\n orderBy: meta.orderBy as Record<string, \"asc\" | \"desc\"> | undefined,\n pageSize: meta.pageSize,\n location,\n hookIndex: idx,\n querySignature: `list:${meta.objectType ?? \"unknown\"}`,\n });\n break;\n }\n case \"useOsdkObject\": {\n primitives.objects.push({\n type: meta.objectType ?? \"Unknown\",\n primaryKey: meta.primaryKey,\n location,\n hookIndex: idx,\n });\n break;\n }\n case \"useLinks\": {\n primitives.links.push({\n sourceType: meta.sourceObjectType ?? \"Unknown\",\n linkName: meta.linkName ?? \"Unknown\",\n location,\n hookIndex: idx,\n });\n break;\n }\n case \"useOsdkAggregation\": {\n primitives.aggregations.push({\n type: meta.objectType ?? \"Unknown\",\n whereClause: meta.where as Record<string, unknown> | undefined,\n aggregate: meta.aggregate as Record<string, unknown> | undefined,\n location,\n hookIndex: idx,\n querySignature: `aggregation:${meta.objectType ?? \"unknown\"}`,\n });\n break;\n }\n case \"useOsdkFunction\": {\n primitives.queries.push({\n signature: `function:${meta.objectType ?? \"unknown\"}`,\n hookType: meta.hookType,\n location,\n hookIndex: idx,\n });\n break;\n }\n case \"useObjectSet\": {\n primitives.objectSets.push({\n type: meta.objectType ?? \"Unknown\",\n whereClause: meta.where as Record<string, unknown> | undefined,\n orderBy: meta.orderBy as Record<string, \"asc\" | \"desc\"> | undefined,\n pageSize: meta.pageSize,\n location,\n hookIndex: idx,\n querySignature: `objectSet:${meta.objectType ?? \"unknown\"}`,\n });\n break;\n }\n }\n }\n\n return primitives;\n }\n\n private emptyPrimitivesWithName(componentName: string): DiscoveredPrimitives {\n return {\n componentId: \"unknown\",\n componentName,\n actions: [],\n objectSets: [],\n objects: [],\n links: [],\n queries: [],\n aggregations: [],\n };\n }\n\n hasOsdkHooks(fiber: Fiber): boolean {\n let current: Fiber | null = fiber;\n let depth = 0;\n while (current && depth < MAX_ANCESTOR_WALK_DEPTH) {\n if (typeof current.type === \"function\") {\n const metadata = extractOsdkMetadataFromFiber(current);\n if (metadata.length > 0) {\n return true;\n }\n }\n current = current.return;\n depth++;\n }\n return false;\n }\n\n getPrimitiveCount(fiber: Fiber): number {\n const primitives = this.discoverPrimitives(fiber);\n return (\n 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 }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -127,12 +127,12 @@ export class ComponentQueryRegistry {
|
|
|
127
127
|
getComponentBindings(componentId) {
|
|
128
128
|
const bindingIds = this.componentToBindings.get(componentId);
|
|
129
129
|
if (!bindingIds) return [];
|
|
130
|
-
return
|
|
130
|
+
return [...bindingIds].map(id => this.bindings.get(id)).filter(b => b !== undefined);
|
|
131
131
|
}
|
|
132
132
|
getQuerySubscribers(querySignature) {
|
|
133
133
|
const bindingIds = this.queryToBindings.get(querySignature);
|
|
134
134
|
if (!bindingIds) return [];
|
|
135
|
-
return
|
|
135
|
+
return [...bindingIds].map(id => this.bindings.get(id)).filter(b => b !== undefined).filter(b => !b.unmountedAt);
|
|
136
136
|
}
|
|
137
137
|
getBindingBySubscription(subscriptionId) {
|
|
138
138
|
const bindingId = this.subscriptionToBinding.get(subscriptionId);
|
|
@@ -141,7 +141,7 @@ export class ComponentQueryRegistry {
|
|
|
141
141
|
getActiveComponents() {
|
|
142
142
|
const result = new Map();
|
|
143
143
|
for (const [componentId, bindingIds] of this.componentToBindings) {
|
|
144
|
-
const bindings =
|
|
144
|
+
const bindings = [...bindingIds].map(id => this.bindings.get(id)).filter(b => b !== undefined && !b.unmountedAt);
|
|
145
145
|
if (bindings.length > 0) {
|
|
146
146
|
result.set(componentId, bindings);
|
|
147
147
|
}
|
|
@@ -158,8 +158,8 @@ export class ComponentQueryRegistry {
|
|
|
158
158
|
if (!isInternalFrame(filePath)) {
|
|
159
159
|
return {
|
|
160
160
|
file: filePath,
|
|
161
|
-
line: parseInt(chromeMatch[2], 10),
|
|
162
|
-
column: parseInt(chromeMatch[3], 10)
|
|
161
|
+
line: Number.parseInt(chromeMatch[2], 10),
|
|
162
|
+
column: Number.parseInt(chromeMatch[3], 10)
|
|
163
163
|
};
|
|
164
164
|
}
|
|
165
165
|
continue;
|
|
@@ -170,8 +170,8 @@ export class ComponentQueryRegistry {
|
|
|
170
170
|
if (!isInternalFrame(filePath)) {
|
|
171
171
|
return {
|
|
172
172
|
file: filePath,
|
|
173
|
-
line: parseInt(firefoxMatch[2], 10),
|
|
174
|
-
column: parseInt(firefoxMatch[3], 10)
|
|
173
|
+
line: Number.parseInt(firefoxMatch[2], 10),
|
|
174
|
+
column: Number.parseInt(firefoxMatch[3], 10)
|
|
175
175
|
};
|
|
176
176
|
}
|
|
177
177
|
continue;
|
|
@@ -334,7 +334,7 @@ export class ComponentQueryRegistry {
|
|
|
334
334
|
};
|
|
335
335
|
}
|
|
336
336
|
getAllBindings() {
|
|
337
|
-
return
|
|
337
|
+
return [...this.bindings.values()];
|
|
338
338
|
}
|
|
339
339
|
}
|
|
340
340
|
//# sourceMappingURL=ComponentQueryRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentQueryRegistry.js","names":["INTERNAL_FRAME_PATTERNS","CHROME_STACK_RE","FIREFOX_STACK_RE","isInternalFrame","filePath","pattern","test","ComponentQueryRegistry","bindings","Map","componentToBindings","queryToBindings","subscriptionToBinding","bindingIdCounter","changeVersion","changeListeners","Set","getVersion","subscribe","listener","add","delete","notifyChange","registerBinding","options","existingBindings","get","componentId","existingId","existing","hookType","querySignature","unmountedAt","bindingId","stack","Error","location","parseStackTrace","binding","subscriptionId","stackTrace","file","lineNumber","line","columnNumber","column","mountedAt","Date","now","renderCount","lastRenderDuration","avgRenderDuration","set","has","componentBindings","queryBindings","linkSubscription","unregisterComponent","bindingIds","recordRender","duration","getComponentBindings","Array","from","map","id","filter","b","undefined","getQuerySubscribers","getBindingBySubscription","getActiveComponents","result","length","lines","split","i","Math","min","chromeMatch","match","parseInt","firefoxMatch","updateFromFiberDiscovery","discovered","seenComponentIds","component","existingBindingIds","size","componentName","hookMeta","hooks","buildQuerySignature","mapHookType","queryParams","buildQueryParams","hookIndex","objectType","primaryKey","JSON","stringify","where","orderBy","actionName","sourceObjectType","linkName","aggregate","type","pageSize","sourceObject","cleanupOldBindings","maxAgeMs","cleanedCount","entries","clear","getStats","activeBindings","unmountedBindings","values","totalBindings","components","queries","getAllBindings"],"sources":["ComponentQueryRegistry.ts"],"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 type { DiscoveredComponent } from \"../fiber/HookStateInspector.js\";\n\nexport interface ComponentHookBinding {\n componentId: string;\n componentName: string;\n componentDisplayName?: string;\n\n hookType:\n | \"useOsdkObject\"\n | \"useOsdkObjects\"\n | \"useOsdkAction\"\n | \"useOsdkAggregation\"\n | \"useLinks\"\n | \"useObjectSet\";\n hookIndex: number;\n\n subscriptionId: string;\n querySignature: string;\n queryParams: QueryParams;\n\n stackTrace: string;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n mountedAt: number;\n unmountedAt?: number;\n renderCount: number;\n\n lastRenderDuration: number;\n avgRenderDuration: number;\n}\n\nexport type QueryParams =\n | { type: \"object\"; objectType: string; primaryKey: string }\n | {\n type: \"list\";\n objectType: string;\n where?: unknown;\n orderBy?: unknown;\n pageSize?: number;\n }\n | { type: \"action\"; actionName: string }\n | { type: \"links\"; sourceObject: string; linkName: string }\n | { type: \"objectSet\"; baseObjectSet: string; operations: unknown[] }\n | {\n type: \"aggregation\";\n objectType: string;\n where?: unknown;\n aggregate?: unknown;\n };\n\nconst INTERNAL_FRAME_PATTERNS = [\n /node_modules/,\n /@osdk\\/react/,\n /react-devtools/,\n /ComponentContextCapture/,\n /ObservableClientMonitor/,\n /ComponentQueryRegistry/,\n /packages\\/react\\/build/,\n /packages\\/react\\/esm/,\n /packages\\/react\\/src/,\n];\n\nconst CHROME_STACK_RE = /\\((.*?):(\\d+):(\\d+)\\)/;\nconst FIREFOX_STACK_RE = /@(.*?):(\\d+):(\\d+)/;\n\nfunction isInternalFrame(filePath: string): boolean {\n for (const pattern of INTERNAL_FRAME_PATTERNS) {\n if (pattern.test(filePath)) {\n return true;\n }\n }\n return false;\n}\n\nexport class ComponentQueryRegistry {\n private bindings = new Map<string, ComponentHookBinding>();\n private componentToBindings = new Map<string, Set<string>>();\n private queryToBindings = new Map<string, Set<string>>();\n private subscriptionToBinding = new Map<string, string>();\n\n private bindingIdCounter = 0;\n private changeVersion = 0;\n private changeListeners = new Set<() => void>();\n\n getVersion(): number {\n return this.changeVersion;\n }\n\n subscribe(listener: () => void): () => void {\n this.changeListeners.add(listener);\n return () => this.changeListeners.delete(listener);\n }\n\n private notifyChange(): void {\n this.changeVersion++;\n for (const listener of this.changeListeners) {\n listener();\n }\n }\n\n registerBinding(options: {\n componentId: string;\n componentName: string;\n componentDisplayName?: string;\n hookType: ComponentHookBinding[\"hookType\"];\n hookIndex: number;\n querySignature: string;\n queryParams: QueryParams;\n subscriptionId?: string;\n }): string {\n const existingBindings = this.componentToBindings.get(options.componentId);\n if (existingBindings) {\n for (const existingId of existingBindings) {\n const existing = this.bindings.get(existingId);\n if (\n existing\n && existing.hookType === options.hookType\n && existing.querySignature === options.querySignature\n && !existing.unmountedAt\n ) {\n return existingId;\n }\n }\n }\n\n const bindingId = `binding-${this.bindingIdCounter++}`;\n\n const stack = new Error().stack || \"\";\n const location = this.parseStackTrace(stack);\n\n const binding: ComponentHookBinding = {\n ...options,\n subscriptionId: options.subscriptionId || \"\",\n stackTrace: stack,\n filePath: location.file,\n lineNumber: location.line,\n columnNumber: location.column,\n mountedAt: Date.now(),\n renderCount: 0,\n lastRenderDuration: 0,\n avgRenderDuration: 0,\n };\n\n this.bindings.set(bindingId, binding);\n\n if (!this.componentToBindings.has(options.componentId)) {\n this.componentToBindings.set(options.componentId, new Set());\n }\n const componentBindings = this.componentToBindings.get(options.componentId);\n if (componentBindings) {\n componentBindings.add(bindingId);\n }\n\n if (!this.queryToBindings.has(options.querySignature)) {\n this.queryToBindings.set(options.querySignature, new Set());\n }\n const queryBindings = this.queryToBindings.get(options.querySignature);\n if (queryBindings) {\n queryBindings.add(bindingId);\n }\n\n if (options.subscriptionId) {\n this.subscriptionToBinding.set(options.subscriptionId, bindingId);\n }\n\n this.notifyChange();\n return bindingId;\n }\n\n linkSubscription(bindingId: string, subscriptionId: string): void {\n const binding = this.bindings.get(bindingId);\n if (!binding) return;\n\n binding.subscriptionId = subscriptionId;\n this.subscriptionToBinding.set(subscriptionId, bindingId);\n }\n\n unregisterComponent(componentId: string): void {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) {\n return;\n }\n\n const now = Date.now();\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding) {\n binding.unmountedAt = now;\n }\n }\n this.notifyChange();\n }\n\n recordRender(componentId: string, duration: number): void {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) return;\n\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.renderCount++;\n binding.lastRenderDuration = duration;\n binding.avgRenderDuration =\n (binding.avgRenderDuration * (binding.renderCount - 1) + duration)\n / binding.renderCount;\n }\n }\n }\n\n getComponentBindings(componentId: string): ComponentHookBinding[] {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) return [];\n\n return Array.from(bindingIds)\n .map((id) => this.bindings.get(id))\n .filter((b): b is ComponentHookBinding => b !== undefined);\n }\n\n getQuerySubscribers(querySignature: string): ComponentHookBinding[] {\n const bindingIds = this.queryToBindings.get(querySignature);\n if (!bindingIds) return [];\n\n return Array.from(bindingIds)\n .map((id) => this.bindings.get(id))\n .filter((b): b is ComponentHookBinding => b !== undefined)\n .filter((b) => !b.unmountedAt);\n }\n\n getBindingBySubscription(\n subscriptionId: string,\n ): ComponentHookBinding | undefined {\n const bindingId = this.subscriptionToBinding.get(subscriptionId);\n return bindingId ? this.bindings.get(bindingId) : undefined;\n }\n\n getActiveComponents(): Map<string, ComponentHookBinding[]> {\n const result = new Map<string, ComponentHookBinding[]>();\n\n for (const [componentId, bindingIds] of this.componentToBindings) {\n const bindings = Array.from(bindingIds)\n .map((id) => this.bindings.get(id))\n .filter(\n (b): b is ComponentHookBinding => b !== undefined && !b.unmountedAt,\n );\n\n if (bindings.length > 0) {\n result.set(componentId, bindings);\n }\n }\n\n return result;\n }\n\n private parseStackTrace(\n stack: string,\n ): { file?: string; line?: number; column?: number } {\n const lines = stack.split(\"\\n\");\n\n for (let i = 3; i < Math.min(lines.length, 25); i++) {\n const line = lines[i];\n\n const chromeMatch = line.match(CHROME_STACK_RE);\n if (chromeMatch) {\n const filePath = chromeMatch[1];\n if (!isInternalFrame(filePath)) {\n return {\n file: filePath,\n line: parseInt(chromeMatch[2], 10),\n column: parseInt(chromeMatch[3], 10),\n };\n }\n continue;\n }\n\n const firefoxMatch = line.match(FIREFOX_STACK_RE);\n if (firefoxMatch) {\n const filePath = firefoxMatch[1];\n if (!isInternalFrame(filePath)) {\n return {\n file: filePath,\n line: parseInt(firefoxMatch[2], 10),\n column: parseInt(firefoxMatch[3], 10),\n };\n }\n continue;\n }\n }\n\n return {};\n }\n\n updateFromFiberDiscovery(\n discovered: Map<string, DiscoveredComponent>,\n ): void {\n const seenComponentIds = new Set<string>();\n\n for (const [componentId, component] of discovered) {\n seenComponentIds.add(componentId);\n\n const existingBindingIds = this.componentToBindings.get(componentId);\n\n if (existingBindingIds && existingBindingIds.size > 0) {\n for (const bindingId of existingBindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.componentName = component.componentName;\n }\n }\n } else {\n for (const hookMeta of component.hooks) {\n const querySignature = this.buildQuerySignature(hookMeta);\n const hookType = this.mapHookType(hookMeta.hookType);\n const queryParams = this.buildQueryParams(hookMeta);\n\n this.registerBinding({\n componentId,\n componentName: component.componentName,\n hookType,\n hookIndex: 0,\n querySignature,\n queryParams,\n });\n }\n }\n }\n\n const now = Date.now();\n for (const [componentId, bindingIds] of this.componentToBindings) {\n if (!seenComponentIds.has(componentId)) {\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.unmountedAt = now;\n }\n }\n }\n }\n }\n\n private buildQuerySignature(\n hookMeta: DiscoveredComponent[\"hooks\"][0],\n ): string {\n switch (hookMeta.hookType) {\n case \"useOsdkObject\":\n return `object:${hookMeta.objectType}:${hookMeta.primaryKey}`;\n case \"useOsdkObjects\":\n return `useOsdkObjects:${hookMeta.objectType}:${\n JSON.stringify(hookMeta.where)\n }:${JSON.stringify(hookMeta.orderBy)}`;\n case \"useOsdkAction\":\n return `action:${hookMeta.actionName}`;\n case \"useLinks\":\n return `links:${hookMeta.sourceObjectType || \"unknown\"}:${\n hookMeta.linkName || \"unknown\"\n }`;\n case \"useOsdkAggregation\":\n return `aggregation:${hookMeta.objectType}:${\n JSON.stringify(hookMeta.aggregate)\n }`;\n default:\n return `unknown:${JSON.stringify(hookMeta)}`;\n }\n }\n\n private mapHookType(\n hookType: DiscoveredComponent[\"hooks\"][0][\"hookType\"],\n ): ComponentHookBinding[\"hookType\"] {\n switch (hookType) {\n case \"useOsdkObject\":\n return \"useOsdkObject\";\n case \"useOsdkObjects\":\n return \"useOsdkObjects\";\n case \"useOsdkAction\":\n return \"useOsdkAction\";\n case \"useLinks\":\n return \"useLinks\";\n case \"useOsdkAggregation\":\n return \"useOsdkAggregation\";\n default:\n return \"useOsdkObject\";\n }\n }\n\n private buildQueryParams(\n hookMeta: DiscoveredComponent[\"hooks\"][0],\n ): QueryParams {\n switch (hookMeta.hookType) {\n case \"useOsdkObject\":\n return {\n type: \"object\",\n objectType: hookMeta.objectType || \"Unknown\",\n primaryKey: hookMeta.primaryKey || \"\",\n };\n case \"useOsdkObjects\":\n return {\n type: \"list\",\n objectType: hookMeta.objectType || \"Unknown\",\n where: hookMeta.where,\n orderBy: hookMeta.orderBy,\n pageSize: hookMeta.pageSize,\n };\n case \"useOsdkAction\":\n return {\n type: \"action\",\n actionName: hookMeta.actionName || \"Unknown\",\n };\n case \"useLinks\":\n return {\n type: \"links\",\n sourceObject: hookMeta.sourceObjectType || \"Unknown\",\n linkName: hookMeta.linkName || \"Unknown\",\n };\n case \"useOsdkAggregation\":\n return {\n type: \"aggregation\",\n objectType: hookMeta.objectType || \"Unknown\",\n where: hookMeta.where,\n aggregate: hookMeta.aggregate,\n };\n default:\n return {\n type: \"object\",\n objectType: \"Unknown\",\n primaryKey: \"\",\n };\n }\n }\n\n cleanupOldBindings(maxAgeMs: number = 5 * 60 * 1000): number {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [bindingId, binding] of this.bindings.entries()) {\n if (\n binding.unmountedAt\n && now - binding.unmountedAt > maxAgeMs\n ) {\n this.bindings.delete(bindingId);\n\n this.componentToBindings.get(binding.componentId)?.delete(bindingId);\n this.queryToBindings.get(binding.querySignature)?.delete(bindingId);\n if (binding.subscriptionId) {\n this.subscriptionToBinding.delete(binding.subscriptionId);\n }\n\n cleanedCount++;\n }\n }\n\n return cleanedCount;\n }\n\n clear(): void {\n this.bindings.clear();\n this.componentToBindings.clear();\n this.queryToBindings.clear();\n this.subscriptionToBinding.clear();\n }\n\n getStats(): {\n totalBindings: number;\n activeBindings: number;\n unmountedBindings: number;\n components: number;\n queries: number;\n } {\n let activeBindings = 0;\n let unmountedBindings = 0;\n\n for (const binding of this.bindings.values()) {\n if (binding.unmountedAt) {\n unmountedBindings++;\n } else {\n activeBindings++;\n }\n }\n\n return {\n totalBindings: this.bindings.size,\n activeBindings,\n unmountedBindings,\n components: this.componentToBindings.size,\n queries: this.queryToBindings.size,\n };\n }\n\n getAllBindings(): ComponentHookBinding[] {\n return Array.from(this.bindings.values());\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ComponentQueryRegistry.js","names":["INTERNAL_FRAME_PATTERNS","CHROME_STACK_RE","FIREFOX_STACK_RE","isInternalFrame","filePath","pattern","test","ComponentQueryRegistry","bindings","Map","componentToBindings","queryToBindings","subscriptionToBinding","bindingIdCounter","changeVersion","changeListeners","Set","getVersion","subscribe","listener","add","delete","notifyChange","registerBinding","options","existingBindings","get","componentId","existingId","existing","hookType","querySignature","unmountedAt","bindingId","stack","Error","location","parseStackTrace","binding","subscriptionId","stackTrace","file","lineNumber","line","columnNumber","column","mountedAt","Date","now","renderCount","lastRenderDuration","avgRenderDuration","set","has","componentBindings","queryBindings","linkSubscription","unregisterComponent","bindingIds","recordRender","duration","getComponentBindings","map","id","filter","b","undefined","getQuerySubscribers","getBindingBySubscription","getActiveComponents","result","length","lines","split","i","Math","min","chromeMatch","match","Number","parseInt","firefoxMatch","updateFromFiberDiscovery","discovered","seenComponentIds","component","existingBindingIds","size","componentName","hookMeta","hooks","buildQuerySignature","mapHookType","queryParams","buildQueryParams","hookIndex","objectType","primaryKey","JSON","stringify","where","orderBy","actionName","sourceObjectType","linkName","aggregate","type","pageSize","sourceObject","cleanupOldBindings","maxAgeMs","cleanedCount","entries","clear","getStats","activeBindings","unmountedBindings","values","totalBindings","components","queries","getAllBindings"],"sources":["ComponentQueryRegistry.ts"],"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 type { DiscoveredComponent } from \"../fiber/HookStateInspector.js\";\n\nexport interface ComponentHookBinding {\n componentId: string;\n componentName: string;\n componentDisplayName?: string;\n\n hookType:\n | \"useOsdkObject\"\n | \"useOsdkObjects\"\n | \"useOsdkAction\"\n | \"useOsdkAggregation\"\n | \"useLinks\"\n | \"useObjectSet\";\n hookIndex: number;\n\n subscriptionId: string;\n querySignature: string;\n queryParams: QueryParams;\n\n stackTrace: string;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n mountedAt: number;\n unmountedAt?: number;\n renderCount: number;\n\n lastRenderDuration: number;\n avgRenderDuration: number;\n}\n\nexport type QueryParams =\n | { type: \"object\"; objectType: string; primaryKey: string }\n | {\n type: \"list\";\n objectType: string;\n where?: unknown;\n orderBy?: unknown;\n pageSize?: number;\n }\n | { type: \"action\"; actionName: string }\n | { type: \"links\"; sourceObject: string; linkName: string }\n | { type: \"objectSet\"; baseObjectSet: string; operations: unknown[] }\n | {\n type: \"aggregation\";\n objectType: string;\n where?: unknown;\n aggregate?: unknown;\n };\n\nconst INTERNAL_FRAME_PATTERNS = [\n /node_modules/,\n /@osdk\\/react/,\n /react-devtools/,\n /ComponentContextCapture/,\n /ObservableClientMonitor/,\n /ComponentQueryRegistry/,\n /packages\\/react\\/build/,\n /packages\\/react\\/esm/,\n /packages\\/react\\/src/,\n];\n\nconst CHROME_STACK_RE = /\\((.*?):(\\d+):(\\d+)\\)/;\nconst FIREFOX_STACK_RE = /@(.*?):(\\d+):(\\d+)/;\n\nfunction isInternalFrame(filePath: string): boolean {\n for (const pattern of INTERNAL_FRAME_PATTERNS) {\n if (pattern.test(filePath)) {\n return true;\n }\n }\n return false;\n}\n\nexport class ComponentQueryRegistry {\n private bindings = new Map<string, ComponentHookBinding>();\n private componentToBindings = new Map<string, Set<string>>();\n private queryToBindings = new Map<string, Set<string>>();\n private subscriptionToBinding = new Map<string, string>();\n\n private bindingIdCounter = 0;\n private changeVersion = 0;\n private changeListeners = new Set<() => void>();\n\n getVersion(): number {\n return this.changeVersion;\n }\n\n subscribe(listener: () => void): () => void {\n this.changeListeners.add(listener);\n return () => this.changeListeners.delete(listener);\n }\n\n private notifyChange(): void {\n this.changeVersion++;\n for (const listener of this.changeListeners) {\n listener();\n }\n }\n\n registerBinding(options: {\n componentId: string;\n componentName: string;\n componentDisplayName?: string;\n hookType: ComponentHookBinding[\"hookType\"];\n hookIndex: number;\n querySignature: string;\n queryParams: QueryParams;\n subscriptionId?: string;\n }): string {\n const existingBindings = this.componentToBindings.get(options.componentId);\n if (existingBindings) {\n for (const existingId of existingBindings) {\n const existing = this.bindings.get(existingId);\n if (\n existing &&\n existing.hookType === options.hookType &&\n existing.querySignature === options.querySignature &&\n !existing.unmountedAt\n ) {\n return existingId;\n }\n }\n }\n\n const bindingId = `binding-${this.bindingIdCounter++}`;\n\n const stack = new Error().stack || \"\";\n const location = this.parseStackTrace(stack);\n\n const binding: ComponentHookBinding = {\n ...options,\n subscriptionId: options.subscriptionId || \"\",\n stackTrace: stack,\n filePath: location.file,\n lineNumber: location.line,\n columnNumber: location.column,\n mountedAt: Date.now(),\n renderCount: 0,\n lastRenderDuration: 0,\n avgRenderDuration: 0,\n };\n\n this.bindings.set(bindingId, binding);\n\n if (!this.componentToBindings.has(options.componentId)) {\n this.componentToBindings.set(options.componentId, new Set());\n }\n const componentBindings = this.componentToBindings.get(options.componentId);\n if (componentBindings) {\n componentBindings.add(bindingId);\n }\n\n if (!this.queryToBindings.has(options.querySignature)) {\n this.queryToBindings.set(options.querySignature, new Set());\n }\n const queryBindings = this.queryToBindings.get(options.querySignature);\n if (queryBindings) {\n queryBindings.add(bindingId);\n }\n\n if (options.subscriptionId) {\n this.subscriptionToBinding.set(options.subscriptionId, bindingId);\n }\n\n this.notifyChange();\n return bindingId;\n }\n\n linkSubscription(bindingId: string, subscriptionId: string): void {\n const binding = this.bindings.get(bindingId);\n if (!binding) return;\n\n binding.subscriptionId = subscriptionId;\n this.subscriptionToBinding.set(subscriptionId, bindingId);\n }\n\n unregisterComponent(componentId: string): void {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) {\n return;\n }\n\n const now = Date.now();\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding) {\n binding.unmountedAt = now;\n }\n }\n this.notifyChange();\n }\n\n recordRender(componentId: string, duration: number): void {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) return;\n\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.renderCount++;\n binding.lastRenderDuration = duration;\n binding.avgRenderDuration =\n (binding.avgRenderDuration * (binding.renderCount - 1) + duration) /\n binding.renderCount;\n }\n }\n }\n\n getComponentBindings(componentId: string): ComponentHookBinding[] {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) return [];\n\n return [...bindingIds]\n .map((id) => this.bindings.get(id))\n .filter((b): b is ComponentHookBinding => b !== undefined);\n }\n\n getQuerySubscribers(querySignature: string): ComponentHookBinding[] {\n const bindingIds = this.queryToBindings.get(querySignature);\n if (!bindingIds) return [];\n\n return [...bindingIds]\n .map((id) => this.bindings.get(id))\n .filter((b): b is ComponentHookBinding => b !== undefined)\n .filter((b) => !b.unmountedAt);\n }\n\n getBindingBySubscription(\n subscriptionId: string\n ): ComponentHookBinding | undefined {\n const bindingId = this.subscriptionToBinding.get(subscriptionId);\n return bindingId ? this.bindings.get(bindingId) : undefined;\n }\n\n getActiveComponents(): Map<string, ComponentHookBinding[]> {\n const result = new Map<string, ComponentHookBinding[]>();\n\n for (const [componentId, bindingIds] of this.componentToBindings) {\n const bindings = [...bindingIds]\n .map((id) => this.bindings.get(id))\n .filter(\n (b): b is ComponentHookBinding => b !== undefined && !b.unmountedAt\n );\n\n if (bindings.length > 0) {\n result.set(componentId, bindings);\n }\n }\n\n return result;\n }\n\n private parseStackTrace(stack: string): {\n file?: string;\n line?: number;\n column?: number;\n } {\n const lines = stack.split(\"\\n\");\n\n for (let i = 3; i < Math.min(lines.length, 25); i++) {\n const line = lines[i];\n\n const chromeMatch = line.match(CHROME_STACK_RE);\n if (chromeMatch) {\n const filePath = chromeMatch[1];\n if (!isInternalFrame(filePath)) {\n return {\n file: filePath,\n line: Number.parseInt(chromeMatch[2], 10),\n column: Number.parseInt(chromeMatch[3], 10),\n };\n }\n continue;\n }\n\n const firefoxMatch = line.match(FIREFOX_STACK_RE);\n if (firefoxMatch) {\n const filePath = firefoxMatch[1];\n if (!isInternalFrame(filePath)) {\n return {\n file: filePath,\n line: Number.parseInt(firefoxMatch[2], 10),\n column: Number.parseInt(firefoxMatch[3], 10),\n };\n }\n continue;\n }\n }\n\n return {};\n }\n\n updateFromFiberDiscovery(discovered: Map<string, DiscoveredComponent>): void {\n const seenComponentIds = new Set<string>();\n\n for (const [componentId, component] of discovered) {\n seenComponentIds.add(componentId);\n\n const existingBindingIds = this.componentToBindings.get(componentId);\n\n if (existingBindingIds && existingBindingIds.size > 0) {\n for (const bindingId of existingBindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.componentName = component.componentName;\n }\n }\n } else {\n for (const hookMeta of component.hooks) {\n const querySignature = this.buildQuerySignature(hookMeta);\n const hookType = this.mapHookType(hookMeta.hookType);\n const queryParams = this.buildQueryParams(hookMeta);\n\n this.registerBinding({\n componentId,\n componentName: component.componentName,\n hookType,\n hookIndex: 0,\n querySignature,\n queryParams,\n });\n }\n }\n }\n\n const now = Date.now();\n for (const [componentId, bindingIds] of this.componentToBindings) {\n if (!seenComponentIds.has(componentId)) {\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.unmountedAt = now;\n }\n }\n }\n }\n }\n\n private buildQuerySignature(\n hookMeta: DiscoveredComponent[\"hooks\"][0]\n ): string {\n switch (hookMeta.hookType) {\n case \"useOsdkObject\":\n return `object:${hookMeta.objectType}:${hookMeta.primaryKey}`;\n case \"useOsdkObjects\":\n return `useOsdkObjects:${hookMeta.objectType}:${JSON.stringify(\n hookMeta.where\n )}:${JSON.stringify(hookMeta.orderBy)}`;\n case \"useOsdkAction\":\n return `action:${hookMeta.actionName}`;\n case \"useLinks\":\n return `links:${hookMeta.sourceObjectType || \"unknown\"}:${\n hookMeta.linkName || \"unknown\"\n }`;\n case \"useOsdkAggregation\":\n return `aggregation:${hookMeta.objectType}:${JSON.stringify(\n hookMeta.aggregate\n )}`;\n default:\n return `unknown:${JSON.stringify(hookMeta)}`;\n }\n }\n\n private mapHookType(\n hookType: DiscoveredComponent[\"hooks\"][0][\"hookType\"]\n ): ComponentHookBinding[\"hookType\"] {\n switch (hookType) {\n case \"useOsdkObject\":\n return \"useOsdkObject\";\n case \"useOsdkObjects\":\n return \"useOsdkObjects\";\n case \"useOsdkAction\":\n return \"useOsdkAction\";\n case \"useLinks\":\n return \"useLinks\";\n case \"useOsdkAggregation\":\n return \"useOsdkAggregation\";\n default:\n return \"useOsdkObject\";\n }\n }\n\n private buildQueryParams(\n hookMeta: DiscoveredComponent[\"hooks\"][0]\n ): QueryParams {\n switch (hookMeta.hookType) {\n case \"useOsdkObject\":\n return {\n type: \"object\",\n objectType: hookMeta.objectType || \"Unknown\",\n primaryKey: hookMeta.primaryKey || \"\",\n };\n case \"useOsdkObjects\":\n return {\n type: \"list\",\n objectType: hookMeta.objectType || \"Unknown\",\n where: hookMeta.where,\n orderBy: hookMeta.orderBy,\n pageSize: hookMeta.pageSize,\n };\n case \"useOsdkAction\":\n return {\n type: \"action\",\n actionName: hookMeta.actionName || \"Unknown\",\n };\n case \"useLinks\":\n return {\n type: \"links\",\n sourceObject: hookMeta.sourceObjectType || \"Unknown\",\n linkName: hookMeta.linkName || \"Unknown\",\n };\n case \"useOsdkAggregation\":\n return {\n type: \"aggregation\",\n objectType: hookMeta.objectType || \"Unknown\",\n where: hookMeta.where,\n aggregate: hookMeta.aggregate,\n };\n default:\n return {\n type: \"object\",\n objectType: \"Unknown\",\n primaryKey: \"\",\n };\n }\n }\n\n cleanupOldBindings(maxAgeMs: number = 5 * 60 * 1000): number {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [bindingId, binding] of this.bindings.entries()) {\n if (binding.unmountedAt && now - binding.unmountedAt > maxAgeMs) {\n this.bindings.delete(bindingId);\n\n this.componentToBindings.get(binding.componentId)?.delete(bindingId);\n this.queryToBindings.get(binding.querySignature)?.delete(bindingId);\n if (binding.subscriptionId) {\n this.subscriptionToBinding.delete(binding.subscriptionId);\n }\n\n cleanedCount++;\n }\n }\n\n return cleanedCount;\n }\n\n clear(): void {\n this.bindings.clear();\n this.componentToBindings.clear();\n this.queryToBindings.clear();\n this.subscriptionToBinding.clear();\n }\n\n getStats(): {\n totalBindings: number;\n activeBindings: number;\n unmountedBindings: number;\n components: number;\n queries: number;\n } {\n let activeBindings = 0;\n let unmountedBindings = 0;\n\n for (const binding of this.bindings.values()) {\n if (binding.unmountedAt) {\n unmountedBindings++;\n } else {\n activeBindings++;\n }\n }\n\n return {\n totalBindings: this.bindings.size,\n activeBindings,\n unmountedBindings,\n components: this.componentToBindings.size,\n queries: this.queryToBindings.size,\n };\n }\n\n getAllBindings(): ComponentHookBinding[] {\n return [...this.bindings.values()];\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import { hashPayload, stringifyPayload, truncatePayload } from "./computePayload.js";
|
|
18
18
|
import { createMonitorLogger } from "./logger.js";
|
|
19
19
|
const RID_PLACEHOLDER = "ri.compute.tools.rid.placeholder";
|
|
20
|
-
const COMPUTE_COST_ENDPOINTS = [`/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjects`, `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/aggregate`, `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjectsMultipleObjectTypes`];
|
|
20
|
+
const COMPUTE_COST_ENDPOINTS = new Set([`/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjects`, `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/aggregate`, `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjectsMultipleObjectTypes`]);
|
|
21
21
|
const OSDK_URL_PREFIXES = ["/api/v2/ontologies/", "/multipass/", "/ontology-metadata/", "/object-set-watcher/", "/object-set-service/"];
|
|
22
22
|
function isOsdkUrl(pathname) {
|
|
23
23
|
return OSDK_URL_PREFIXES.some(prefix => pathname.startsWith(prefix));
|
|
@@ -193,7 +193,7 @@ export class ComputeMonitor {
|
|
|
193
193
|
}
|
|
194
194
|
doesEndpointTrackComputeCost(pathname) {
|
|
195
195
|
const normalized = pathname.replace(RID_REGEX, RID_PLACEHOLDER);
|
|
196
|
-
return COMPUTE_COST_ENDPOINTS.
|
|
196
|
+
return COMPUTE_COST_ENDPOINTS.has(normalized);
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
//# sourceMappingURL=ComputeMonitor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComputeMonitor.js","names":["hashPayload","stringifyPayload","truncatePayload","createMonitorLogger","RID_PLACEHOLDER","COMPUTE_COST_ENDPOINTS","OSDK_URL_PREFIXES","isOsdkUrl","pathname","some","prefix","startsWith","RID_REGEX","ComputeMonitor","interceptedFetch","constructor","computeStore","logger","originalFetch","globalThis","fetch","eventTimeline","bind","createInterceptedFetch","debug","self","input","init","extractPathnameFromRequest","isRecording","shouldTrack","doesEndpointTrackComputeCost","isPaused","getIsNetworkPaused","isOsdk","hasBody","body","undefined","bodyType","record","type","timestamp","Date","now","parsed","JSON","parse","requestId","createPendingRequest","requestUrl","requestTimestamp","requestPayload","requestPayloadHash","failRequest","Error","reason","json","e","newBody","includeComputeUsage","res","clonedRes","clone","arrayBuffer","jsonRes","text","TextDecoder","decode","parseError","warn","message","computeUsage","status","hasComputeUsage","fulfillRequest","responsePayloadBytes","byteLength","responsePayloadHash","responsePayload","fulfillWithoutUsage","errorCode","errorInstanceId","errorName","statusText","trim","error","request","URL","url","normalized","replace","includes"],"sources":["ComputeMonitor.ts"],"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 type { Logger } from \"@osdk/api\";\nimport type { ComputeStore } from \"../store/ComputeStore.js\";\nimport {\n hashPayload,\n stringifyPayload,\n truncatePayload,\n} from \"./computePayload.js\";\nimport type { EventTimeline } from \"./EventTimeline.js\";\nimport { createMonitorLogger } from \"./logger.js\";\n\nconst RID_PLACEHOLDER = \"ri.compute.tools.rid.placeholder\";\nconst COMPUTE_COST_ENDPOINTS = [\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjects`,\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/aggregate`,\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjectsMultipleObjectTypes`,\n];\n\nconst OSDK_URL_PREFIXES = [\n \"/api/v2/ontologies/\",\n \"/multipass/\",\n \"/ontology-metadata/\",\n \"/object-set-watcher/\",\n \"/object-set-service/\",\n];\n\nfunction isOsdkUrl(pathname: string): boolean {\n return OSDK_URL_PREFIXES.some((prefix) => pathname.startsWith(prefix));\n}\n\nconst RID_REGEX =\n /ri\\.([a-z][a-z0-9-]*)\\.([a-z0-9][a-z0-9-]*)?\\.([a-z][a-z0-9-]*)\\.([a-zA-Z0-9\\-._]+)/;\n\nexport class ComputeMonitor {\n private readonly originalFetch: typeof globalThis.fetch;\n private readonly computeStore: ComputeStore;\n private readonly logger: Logger;\n private readonly eventTimeline: EventTimeline | undefined;\n private interceptedFetch: typeof globalThis.fetch | null = null;\n\n constructor(\n computeStore: ComputeStore,\n logger: Logger = createMonitorLogger(),\n originalFetch: typeof globalThis.fetch = globalThis.fetch,\n eventTimeline?: EventTimeline,\n ) {\n this.computeStore = computeStore;\n this.logger = logger;\n this.eventTimeline = eventTimeline;\n this.originalFetch = originalFetch.bind(globalThis);\n }\n\n createInterceptedFetch(): typeof globalThis.fetch {\n if (this.interceptedFetch) {\n return this.interceptedFetch;\n }\n\n this.logger.debug(\"Creating fetch interceptor\");\n const self = this;\n\n this.interceptedFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const pathname = self.extractPathnameFromRequest(input);\n\n const isRecording = self.computeStore.isRecording();\n const shouldTrack = self.doesEndpointTrackComputeCost(pathname);\n const isPaused = self.computeStore.getIsNetworkPaused();\n const isOsdk = isOsdkUrl(pathname);\n\n self.logger.debug(\"Fetch intercepted:\", {\n pathname,\n isRecording,\n shouldTrack,\n isPaused,\n isOsdk,\n hasBody: init?.body !== undefined,\n bodyType: typeof init?.body,\n });\n\n if (isPaused && isOsdk) {\n self.logger.debug(\"Network paused, blocking OSDK request\");\n self.eventTimeline?.record({\n type: \"OSDK_PAUSE_BLOCK\",\n pathname,\n timestamp: Date.now(),\n });\n if (shouldTrack && isRecording && typeof init?.body === \"string\") {\n let parsed: unknown;\n try {\n parsed = JSON.parse(init.body);\n } catch {\n parsed = undefined;\n }\n if (parsed !== undefined) {\n const requestId = self.computeStore.createPendingRequest({\n requestUrl: pathname,\n requestTimestamp: new Date(),\n requestPayload: truncatePayload(init.body),\n requestPayloadHash: hashPayload(parsed),\n });\n self.computeStore.failRequest(requestId, {\n type: \"osdk-network-paused\",\n });\n }\n }\n throw new Error(\n \"OSDK network requests are paused by OSDK ComputeTools\",\n );\n }\n\n if (!shouldTrack || !isRecording || typeof init?.body !== \"string\") {\n self.logger.debug(\"Skipping tracking:\", {\n reason: !shouldTrack\n ? \"endpoint not tracked\"\n : !isRecording\n ? \"not recording\"\n : \"body not string\",\n });\n return self.originalFetch(input, init);\n }\n\n self.logger.debug(\"Tracking request for:\", pathname);\n\n let json;\n try {\n json = JSON.parse(init.body);\n } catch (e) {\n self.logger.debug(\"Failed to parse request body\", e);\n return self.originalFetch(input, init);\n }\n\n const newBody = stringifyPayload({ ...json, includeComputeUsage: true });\n\n const requestId = self.computeStore.createPendingRequest({\n requestUrl: pathname,\n requestTimestamp: new Date(),\n requestPayload: truncatePayload(newBody),\n requestPayloadHash: hashPayload(json),\n });\n\n self.logger.debug(\"Created pending request:\", requestId);\n\n try {\n const res = await self.originalFetch(input, { ...init, body: newBody });\n\n const clonedRes = res.clone();\n const arrayBuffer = await clonedRes.arrayBuffer();\n\n let jsonRes;\n try {\n const text = new TextDecoder().decode(arrayBuffer);\n jsonRes = JSON.parse(text);\n } catch (parseError) {\n self.logger.warn(\"Failed to parse response as JSON:\", parseError);\n self.computeStore.failRequest(requestId, {\n type: \"fetch-error\",\n message: \"Failed to parse response JSON\",\n });\n return res;\n }\n\n const computeUsage = jsonRes.computeUsage;\n\n self.logger.debug(\"Response received:\", {\n status: res.status,\n computeUsage,\n hasComputeUsage: typeof computeUsage === \"number\",\n });\n\n if (typeof computeUsage === \"number\") {\n self.logger.debug(\n \"Fulfilling request with compute usage:\",\n computeUsage,\n );\n self.computeStore.fulfillRequest(requestId, {\n computeUsage,\n responsePayloadBytes: arrayBuffer.byteLength,\n responsePayloadHash: hashPayload(jsonRes),\n responsePayload: truncatePayload(stringifyPayload(jsonRes)),\n });\n } else if (res.status === 200) {\n self.logger.warn(\n \"Request succeeded but no computeUsage in response\",\n );\n self.computeStore.fulfillWithoutUsage(requestId, {\n responsePayloadBytes: arrayBuffer.byteLength,\n responsePayloadHash: hashPayload(jsonRes),\n responsePayload: truncatePayload(stringifyPayload(jsonRes)),\n });\n } else if (\n typeof jsonRes.errorCode === \"string\"\n && typeof jsonRes.errorInstanceId === \"string\"\n && typeof jsonRes.errorName === \"string\"\n ) {\n self.computeStore.failRequest(requestId, {\n type: \"api-gateway-error\",\n status: res.status,\n errorCode: jsonRes.errorCode,\n errorInstanceId: jsonRes.errorInstanceId,\n errorName: jsonRes.errorName,\n });\n } else {\n self.computeStore.failRequest(requestId, {\n type: \"http-error\",\n status: res.status,\n message: res.statusText.trim() === \"\" ? undefined : res.statusText,\n });\n }\n\n return res;\n } catch (error) {\n self.logger.error(\"Fetch error:\", error);\n self.computeStore.failRequest(\n requestId,\n error instanceof Error\n ? {\n type: \"fetch-error\",\n message: error.message,\n }\n : { type: \"unknown\" },\n );\n throw error;\n }\n };\n\n return this.interceptedFetch;\n }\n\n private extractPathnameFromRequest(request: RequestInfo | URL): string {\n if (request instanceof URL) {\n return request.pathname;\n }\n\n if (typeof request === \"string\") {\n try {\n return new URL(request).pathname;\n } catch {\n return request;\n }\n }\n\n try {\n return new URL(request.url).pathname;\n } catch {\n return request.url;\n }\n }\n\n private doesEndpointTrackComputeCost(pathname: string): boolean {\n const normalized = pathname.replace(RID_REGEX, RID_PLACEHOLDER);\n return COMPUTE_COST_ENDPOINTS.includes(normalized);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ComputeMonitor.js","names":["hashPayload","stringifyPayload","truncatePayload","createMonitorLogger","RID_PLACEHOLDER","COMPUTE_COST_ENDPOINTS","Set","OSDK_URL_PREFIXES","isOsdkUrl","pathname","some","prefix","startsWith","RID_REGEX","ComputeMonitor","interceptedFetch","constructor","computeStore","logger","originalFetch","globalThis","fetch","eventTimeline","bind","createInterceptedFetch","debug","self","input","init","extractPathnameFromRequest","isRecording","shouldTrack","doesEndpointTrackComputeCost","isPaused","getIsNetworkPaused","isOsdk","hasBody","body","undefined","bodyType","record","type","timestamp","Date","now","parsed","JSON","parse","requestId","createPendingRequest","requestUrl","requestTimestamp","requestPayload","requestPayloadHash","failRequest","Error","reason","json","e","newBody","includeComputeUsage","res","clonedRes","clone","arrayBuffer","jsonRes","text","TextDecoder","decode","parseError","warn","message","computeUsage","status","hasComputeUsage","fulfillRequest","responsePayloadBytes","byteLength","responsePayloadHash","responsePayload","fulfillWithoutUsage","errorCode","errorInstanceId","errorName","statusText","trim","error","request","URL","url","normalized","replace","has"],"sources":["ComputeMonitor.ts"],"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 type { Logger } from \"@osdk/api\";\n\nimport type { ComputeStore } from \"../store/ComputeStore.js\";\nimport {\n hashPayload,\n stringifyPayload,\n truncatePayload,\n} from \"./computePayload.js\";\nimport type { EventTimeline } from \"./EventTimeline.js\";\nimport { createMonitorLogger } from \"./logger.js\";\n\nconst RID_PLACEHOLDER = \"ri.compute.tools.rid.placeholder\";\nconst COMPUTE_COST_ENDPOINTS = new Set([\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjects`,\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/aggregate`,\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjectsMultipleObjectTypes`,\n]);\n\nconst OSDK_URL_PREFIXES = [\n \"/api/v2/ontologies/\",\n \"/multipass/\",\n \"/ontology-metadata/\",\n \"/object-set-watcher/\",\n \"/object-set-service/\",\n];\n\nfunction isOsdkUrl(pathname: string): boolean {\n return OSDK_URL_PREFIXES.some((prefix) => pathname.startsWith(prefix));\n}\n\nconst RID_REGEX =\n /ri\\.([a-z][a-z0-9-]*)\\.([a-z0-9][a-z0-9-]*)?\\.([a-z][a-z0-9-]*)\\.([a-zA-Z0-9\\-._]+)/;\n\nexport class ComputeMonitor {\n private readonly originalFetch: typeof globalThis.fetch;\n private readonly computeStore: ComputeStore;\n private readonly logger: Logger;\n private readonly eventTimeline: EventTimeline | undefined;\n private interceptedFetch: typeof globalThis.fetch | null = null;\n\n constructor(\n computeStore: ComputeStore,\n logger: Logger = createMonitorLogger(),\n originalFetch: typeof globalThis.fetch = globalThis.fetch,\n eventTimeline?: EventTimeline\n ) {\n this.computeStore = computeStore;\n this.logger = logger;\n this.eventTimeline = eventTimeline;\n this.originalFetch = originalFetch.bind(globalThis);\n }\n\n createInterceptedFetch(): typeof globalThis.fetch {\n if (this.interceptedFetch) {\n return this.interceptedFetch;\n }\n\n this.logger.debug(\"Creating fetch interceptor\");\n const self = this;\n\n this.interceptedFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> => {\n const pathname = self.extractPathnameFromRequest(input);\n\n const isRecording = self.computeStore.isRecording();\n const shouldTrack = self.doesEndpointTrackComputeCost(pathname);\n const isPaused = self.computeStore.getIsNetworkPaused();\n const isOsdk = isOsdkUrl(pathname);\n\n self.logger.debug(\"Fetch intercepted:\", {\n pathname,\n isRecording,\n shouldTrack,\n isPaused,\n isOsdk,\n hasBody: init?.body !== undefined,\n bodyType: typeof init?.body,\n });\n\n if (isPaused && isOsdk) {\n self.logger.debug(\"Network paused, blocking OSDK request\");\n self.eventTimeline?.record({\n type: \"OSDK_PAUSE_BLOCK\",\n pathname,\n timestamp: Date.now(),\n });\n if (shouldTrack && isRecording && typeof init?.body === \"string\") {\n let parsed: unknown;\n try {\n parsed = JSON.parse(init.body);\n } catch {\n parsed = undefined;\n }\n if (parsed !== undefined) {\n const requestId = self.computeStore.createPendingRequest({\n requestUrl: pathname,\n requestTimestamp: new Date(),\n requestPayload: truncatePayload(init.body),\n requestPayloadHash: hashPayload(parsed),\n });\n self.computeStore.failRequest(requestId, {\n type: \"osdk-network-paused\",\n });\n }\n }\n throw new Error(\n \"OSDK network requests are paused by OSDK ComputeTools\"\n );\n }\n\n if (!shouldTrack || !isRecording || typeof init?.body !== \"string\") {\n self.logger.debug(\"Skipping tracking:\", {\n reason: !shouldTrack\n ? \"endpoint not tracked\"\n : !isRecording\n ? \"not recording\"\n : \"body not string\",\n });\n return self.originalFetch(input, init);\n }\n\n self.logger.debug(\"Tracking request for:\", pathname);\n\n let json;\n try {\n json = JSON.parse(init.body);\n } catch (e) {\n self.logger.debug(\"Failed to parse request body\", e);\n return self.originalFetch(input, init);\n }\n\n const newBody = stringifyPayload({ ...json, includeComputeUsage: true });\n\n const requestId = self.computeStore.createPendingRequest({\n requestUrl: pathname,\n requestTimestamp: new Date(),\n requestPayload: truncatePayload(newBody),\n requestPayloadHash: hashPayload(json),\n });\n\n self.logger.debug(\"Created pending request:\", requestId);\n\n try {\n const res = await self.originalFetch(input, { ...init, body: newBody });\n\n const clonedRes = res.clone();\n const arrayBuffer = await clonedRes.arrayBuffer();\n\n let jsonRes;\n try {\n const text = new TextDecoder().decode(arrayBuffer);\n jsonRes = JSON.parse(text);\n } catch (parseError) {\n self.logger.warn(\"Failed to parse response as JSON:\", parseError);\n self.computeStore.failRequest(requestId, {\n type: \"fetch-error\",\n message: \"Failed to parse response JSON\",\n });\n return res;\n }\n\n const computeUsage = jsonRes.computeUsage;\n\n self.logger.debug(\"Response received:\", {\n status: res.status,\n computeUsage,\n hasComputeUsage: typeof computeUsage === \"number\",\n });\n\n if (typeof computeUsage === \"number\") {\n self.logger.debug(\n \"Fulfilling request with compute usage:\",\n computeUsage\n );\n self.computeStore.fulfillRequest(requestId, {\n computeUsage,\n responsePayloadBytes: arrayBuffer.byteLength,\n responsePayloadHash: hashPayload(jsonRes),\n responsePayload: truncatePayload(stringifyPayload(jsonRes)),\n });\n } else if (res.status === 200) {\n self.logger.warn(\"Request succeeded but no computeUsage in response\");\n self.computeStore.fulfillWithoutUsage(requestId, {\n responsePayloadBytes: arrayBuffer.byteLength,\n responsePayloadHash: hashPayload(jsonRes),\n responsePayload: truncatePayload(stringifyPayload(jsonRes)),\n });\n } else if (\n typeof jsonRes.errorCode === \"string\" &&\n typeof jsonRes.errorInstanceId === \"string\" &&\n typeof jsonRes.errorName === \"string\"\n ) {\n self.computeStore.failRequest(requestId, {\n type: \"api-gateway-error\",\n status: res.status,\n errorCode: jsonRes.errorCode,\n errorInstanceId: jsonRes.errorInstanceId,\n errorName: jsonRes.errorName,\n });\n } else {\n self.computeStore.failRequest(requestId, {\n type: \"http-error\",\n status: res.status,\n message: res.statusText.trim() === \"\" ? undefined : res.statusText,\n });\n }\n\n return res;\n } catch (error) {\n self.logger.error(\"Fetch error:\", error);\n self.computeStore.failRequest(\n requestId,\n error instanceof Error\n ? {\n type: \"fetch-error\",\n message: error.message,\n }\n : { type: \"unknown\" }\n );\n throw error;\n }\n };\n\n return this.interceptedFetch;\n }\n\n private extractPathnameFromRequest(request: RequestInfo | URL): string {\n if (request instanceof URL) {\n return request.pathname;\n }\n\n if (typeof request === \"string\") {\n try {\n return new URL(request).pathname;\n } catch {\n return request;\n }\n }\n\n try {\n return new URL(request.url).pathname;\n } catch {\n return request.url;\n }\n }\n\n private doesEndpointTrackComputeCost(pathname: string): boolean {\n const normalized = pathname.replace(RID_REGEX, RID_PLACEHOLDER);\n return COMPUTE_COST_ENDPOINTS.has(normalized);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|