@osdk/react-devtools 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/build/esm/DevToolsContext.js +19 -0
  3. package/build/esm/DevToolsContext.js.map +1 -0
  4. package/build/esm/components/ActionMetrics.js +89 -0
  5. package/build/esm/components/ActionMetrics.js.map +1 -0
  6. package/build/esm/components/BubbleChart.js +175 -0
  7. package/build/esm/components/BubbleChart.js.map +1 -0
  8. package/build/esm/components/BubbleChart.module.scss.js +6 -0
  9. package/build/esm/components/CacheInspectorTab.js +291 -0
  10. package/build/esm/components/CacheInspectorTab.js.map +1 -0
  11. package/build/esm/components/CacheInspectorTab.module.scss.js +39 -0
  12. package/build/esm/components/CacheMetrics.js +55 -0
  13. package/build/esm/components/CacheMetrics.js.map +1 -0
  14. package/build/esm/components/ComponentCard.js +124 -0
  15. package/build/esm/components/ComponentCard.js.map +1 -0
  16. package/build/esm/components/ComponentCard.module.scss.js +31 -0
  17. package/build/esm/components/ComputeTab.js +175 -0
  18. package/build/esm/components/ComputeTab.js.map +1 -0
  19. package/build/esm/components/CopyableCodeBlock.js +49 -0
  20. package/build/esm/components/CopyableCodeBlock.js.map +1 -0
  21. package/build/esm/components/CopyableCodeBlock.module.scss.js +10 -0
  22. package/build/esm/components/DebuggingTab.js +342 -0
  23. package/build/esm/components/DebuggingTab.js.map +1 -0
  24. package/build/esm/components/DebuggingTab.module.scss.js +18 -0
  25. package/build/esm/components/HookRow.js +180 -0
  26. package/build/esm/components/HookRow.js.map +1 -0
  27. package/build/esm/components/HookRow.module.scss.js +16 -0
  28. package/build/esm/components/ImprovementsTab.js +138 -0
  29. package/build/esm/components/ImprovementsTab.js.map +1 -0
  30. package/build/esm/components/ImprovementsTab.module.scss.js +30 -0
  31. package/build/esm/components/InspectorSelectionHeader.js +65 -0
  32. package/build/esm/components/InspectorSelectionHeader.js.map +1 -0
  33. package/build/esm/components/InterceptTab.js +862 -0
  34. package/build/esm/components/InterceptTab.js.map +1 -0
  35. package/build/esm/components/InterceptTab.module.scss.js +49 -0
  36. package/build/esm/components/IssueCard.js +115 -0
  37. package/build/esm/components/IssueCard.js.map +1 -0
  38. package/build/esm/components/IssueCard.module.scss.js +24 -0
  39. package/build/esm/components/LogEntryCard.js +94 -0
  40. package/build/esm/components/LogEntryCard.js.map +1 -0
  41. package/build/esm/components/LogEntryCard.module.scss.js +19 -0
  42. package/build/esm/components/MockEditor.js +316 -0
  43. package/build/esm/components/MockEditor.js.map +1 -0
  44. package/build/esm/components/MonitorErrorBoundary.js +64 -0
  45. package/build/esm/components/MonitorErrorBoundary.js.map +1 -0
  46. package/build/esm/components/MonitorErrorBoundary.module.scss.js +9 -0
  47. package/build/esm/components/MonitoringPanel.js +434 -0
  48. package/build/esm/components/MonitoringPanel.js.map +1 -0
  49. package/build/esm/components/MonitoringPanel.module.scss.js +81 -0
  50. package/build/esm/components/ObjectLoadingMetrics.js +60 -0
  51. package/build/esm/components/ObjectLoadingMetrics.js.map +1 -0
  52. package/build/esm/components/OsdkAppErrorBoundary.js +68 -0
  53. package/build/esm/components/OsdkAppErrorBoundary.js.map +1 -0
  54. package/build/esm/components/OsdkDevTools.js +40 -0
  55. package/build/esm/components/OsdkDevTools.js.map +1 -0
  56. package/build/esm/components/OverrideEditor.js +197 -0
  57. package/build/esm/components/OverrideEditor.js.map +1 -0
  58. package/build/esm/components/PerformanceTab.js +297 -0
  59. package/build/esm/components/PerformanceTab.js.map +1 -0
  60. package/build/esm/components/PrimitiveSelectionPanel.js +220 -0
  61. package/build/esm/components/PrimitiveSelectionPanel.js.map +1 -0
  62. package/build/esm/components/PrimitiveSelectionPanel.module.scss.js +26 -0
  63. package/build/esm/components/issueTypes.js +2 -0
  64. package/build/esm/components/issueTypes.js.map +1 -0
  65. package/build/esm/components/resolveComponentName.js +57 -0
  66. package/build/esm/components/resolveComponentName.js.map +1 -0
  67. package/build/esm/components/testHelpers.js +312 -0
  68. package/build/esm/components/testHelpers.js.map +1 -0
  69. package/build/esm/css.d.ts +20 -0
  70. package/build/esm/fiber/DegradationNotice.js +193 -0
  71. package/build/esm/fiber/DegradationNotice.js.map +1 -0
  72. package/build/esm/fiber/DevtoolsHook.js +252 -0
  73. package/build/esm/fiber/DevtoolsHook.js.map +1 -0
  74. package/build/esm/fiber/FiberAccess.js +65 -0
  75. package/build/esm/fiber/FiberAccess.js.map +1 -0
  76. package/build/esm/fiber/FiberInspection.js +140 -0
  77. package/build/esm/fiber/FiberInspection.js.map +1 -0
  78. package/build/esm/fiber/FiberTags.js +52 -0
  79. package/build/esm/fiber/FiberTags.js.map +1 -0
  80. package/build/esm/fiber/HookStateInspector.js +254 -0
  81. package/build/esm/fiber/HookStateInspector.js.map +1 -0
  82. package/build/esm/fiber/SafeFiberOperation.js +35 -0
  83. package/build/esm/fiber/SafeFiberOperation.js.map +1 -0
  84. package/build/esm/fiber/capabilities.js +180 -0
  85. package/build/esm/fiber/capabilities.js.map +1 -0
  86. package/build/esm/fiber/traverseFiber.js +129 -0
  87. package/build/esm/fiber/traverseFiber.js.map +1 -0
  88. package/build/esm/fiber/types.js +2 -0
  89. package/build/esm/fiber/types.js.map +1 -0
  90. package/build/esm/fiber/validation.js +155 -0
  91. package/build/esm/fiber/validation.js.map +1 -0
  92. package/build/esm/hooks/createPollingStore.js +81 -0
  93. package/build/esm/hooks/createPollingStore.js.map +1 -0
  94. package/build/esm/hooks/useActiveComponents.js +27 -0
  95. package/build/esm/hooks/useActiveComponents.js.map +1 -0
  96. package/build/esm/hooks/useComponentRegistry.js +25 -0
  97. package/build/esm/hooks/useComponentRegistry.js.map +1 -0
  98. package/build/esm/hooks/useComputeSelectors.js +43 -0
  99. package/build/esm/hooks/useComputeSelectors.js.map +1 -0
  100. package/build/esm/hooks/useConsoleLogs.js +46 -0
  101. package/build/esm/hooks/useConsoleLogs.js.map +1 -0
  102. package/build/esm/hooks/useInspectorSelection.js +93 -0
  103. package/build/esm/hooks/useInspectorSelection.js.map +1 -0
  104. package/build/esm/hooks/useMetrics.js +23 -0
  105. package/build/esm/hooks/useMetrics.js.map +1 -0
  106. package/build/esm/hooks/usePersistedState.js +89 -0
  107. package/build/esm/hooks/usePersistedState.js.map +1 -0
  108. package/build/esm/hooks/useRecommendations.js +123 -0
  109. package/build/esm/hooks/useRecommendations.js.map +1 -0
  110. package/build/esm/hooks/useSharedTick.js +49 -0
  111. package/build/esm/hooks/useSharedTick.js.map +1 -0
  112. package/build/esm/hooks/useTimeElapsed.js +51 -0
  113. package/build/esm/hooks/useTimeElapsed.js.map +1 -0
  114. package/build/esm/hooks/useTrackerSubscription.js +97 -0
  115. package/build/esm/hooks/useTrackerSubscription.js.map +1 -0
  116. package/build/esm/hooks/useUnusedFieldAnalysis.js +99 -0
  117. package/build/esm/hooks/useUnusedFieldAnalysis.js.map +1 -0
  118. package/build/esm/index.js +31 -0
  119. package/build/esm/index.js.map +1 -0
  120. package/build/esm/inspector/ClickToInspectSystem.js +228 -0
  121. package/build/esm/inspector/ClickToInspectSystem.js.map +1 -0
  122. package/build/esm/inspector/components/ComponentLabel.js +175 -0
  123. package/build/esm/inspector/components/ComponentLabel.js.map +1 -0
  124. package/build/esm/inspector/components/ComponentLabel.module.scss.js +12 -0
  125. package/build/esm/inspector/components/InspectorBanner.js +79 -0
  126. package/build/esm/inspector/components/InspectorBanner.js.map +1 -0
  127. package/build/esm/inspector/components/InspectorOverlay.js +149 -0
  128. package/build/esm/inspector/components/InspectorOverlay.js.map +1 -0
  129. package/build/esm/inspector/components/SelectionHighlight.js +74 -0
  130. package/build/esm/inspector/components/SelectionHighlight.js.map +1 -0
  131. package/build/esm/inspector/createClickToInspect.js +21 -0
  132. package/build/esm/inspector/createClickToInspect.js.map +1 -0
  133. package/build/esm/inspector/hooks/useAnimatedBounds.js +167 -0
  134. package/build/esm/inspector/hooks/useAnimatedBounds.js.map +1 -0
  135. package/build/esm/inspector/index.js +40 -0
  136. package/build/esm/inspector/index.js.map +1 -0
  137. package/build/esm/inspector/inspectorController.js +328 -0
  138. package/build/esm/inspector/inspectorController.js.map +1 -0
  139. package/build/esm/inspector/types.js +2 -0
  140. package/build/esm/inspector/types.js.map +1 -0
  141. package/build/esm/inspector/utils/elementBounds.js +72 -0
  142. package/build/esm/inspector/utils/elementBounds.js.map +1 -0
  143. package/build/esm/inspector/utils/interpolation.js +26 -0
  144. package/build/esm/inspector/utils/interpolation.js.map +1 -0
  145. package/build/esm/inspector/utils/labelPositioning.js +62 -0
  146. package/build/esm/inspector/utils/labelPositioning.js.map +1 -0
  147. package/build/esm/mocking/MockCacheKeyGenerator.js +109 -0
  148. package/build/esm/mocking/MockCacheKeyGenerator.js.map +1 -0
  149. package/build/esm/mocking/MockManager.js +281 -0
  150. package/build/esm/mocking/MockManager.js.map +1 -0
  151. package/build/esm/prototyping/PrototypeOverrideStore.js +66 -0
  152. package/build/esm/prototyping/PrototypeOverrideStore.js.map +1 -0
  153. package/build/esm/prototyping/index.js +18 -0
  154. package/build/esm/prototyping/index.js.map +1 -0
  155. package/build/esm/public/vite.js +19 -0
  156. package/build/esm/public/vite.js.map +1 -0
  157. package/build/esm/register.js +41 -0
  158. package/build/esm/register.js.map +1 -0
  159. package/build/esm/scss.d.ts +20 -0
  160. package/build/esm/store/ComputeStore.js +269 -0
  161. package/build/esm/store/ComputeStore.js.map +1 -0
  162. package/build/esm/store/ConsoleLogStore.js +289 -0
  163. package/build/esm/store/ConsoleLogStore.js.map +1 -0
  164. package/build/esm/store/MetricsStore.js +428 -0
  165. package/build/esm/store/MetricsStore.js.map +1 -0
  166. package/build/esm/store/MonitorStore.js +288 -0
  167. package/build/esm/store/MonitorStore.js.map +1 -0
  168. package/build/esm/store/SubscribableStore.js +38 -0
  169. package/build/esm/store/SubscribableStore.js.map +1 -0
  170. package/build/esm/store/WindowErrorStore.js +195 -0
  171. package/build/esm/store/WindowErrorStore.js.map +1 -0
  172. package/build/esm/styles.css +19441 -0
  173. package/build/esm/styles.js +31 -0
  174. package/build/esm/styles.js.map +1 -0
  175. package/build/esm/types/compute.js +2 -0
  176. package/build/esm/types/compute.js.map +1 -0
  177. package/build/esm/types/emissions.js +2 -0
  178. package/build/esm/types/emissions.js.map +1 -0
  179. package/build/esm/types/index.js +23 -0
  180. package/build/esm/types/index.js.map +1 -0
  181. package/build/esm/utils/ActionLifecycleTracker.js +178 -0
  182. package/build/esm/utils/ActionLifecycleTracker.js.map +1 -0
  183. package/build/esm/utils/CacheEfficiencyAnalyzer.js +198 -0
  184. package/build/esm/utils/CacheEfficiencyAnalyzer.js.map +1 -0
  185. package/build/esm/utils/CircularBuffer.js +96 -0
  186. package/build/esm/utils/CircularBuffer.js.map +1 -0
  187. package/build/esm/utils/ComponentContextCapture.js +215 -0
  188. package/build/esm/utils/ComponentContextCapture.js.map +1 -0
  189. package/build/esm/utils/ComponentPrimitiveDiscovery.js +173 -0
  190. package/build/esm/utils/ComponentPrimitiveDiscovery.js.map +1 -0
  191. package/build/esm/utils/ComponentQueryRegistry.js +340 -0
  192. package/build/esm/utils/ComponentQueryRegistry.js.map +1 -0
  193. package/build/esm/utils/ComputeMonitor.js +199 -0
  194. package/build/esm/utils/ComputeMonitor.js.map +1 -0
  195. package/build/esm/utils/EventTimeline.js +130 -0
  196. package/build/esm/utils/EventTimeline.js.map +1 -0
  197. package/build/esm/utils/LinkTraversalTracker.js +116 -0
  198. package/build/esm/utils/LinkTraversalTracker.js.map +1 -0
  199. package/build/esm/utils/MockDataGenerator.js +473 -0
  200. package/build/esm/utils/MockDataGenerator.js.map +1 -0
  201. package/build/esm/utils/ObservableClientMonitor.js +768 -0
  202. package/build/esm/utils/ObservableClientMonitor.js.map +1 -0
  203. package/build/esm/utils/PerformanceRecommendationEngine.js +185 -0
  204. package/build/esm/utils/PerformanceRecommendationEngine.js.map +1 -0
  205. package/build/esm/utils/PropertyAccessTracker.js +238 -0
  206. package/build/esm/utils/PropertyAccessTracker.js.map +1 -0
  207. package/build/esm/utils/RecommendationMatcher.js +53 -0
  208. package/build/esm/utils/RecommendationMatcher.js.map +1 -0
  209. package/build/esm/utils/SubscriptionTracker.js +132 -0
  210. package/build/esm/utils/SubscriptionTracker.js.map +1 -0
  211. package/build/esm/utils/UnusedFieldAnalyzer.js +186 -0
  212. package/build/esm/utils/UnusedFieldAnalyzer.js.map +1 -0
  213. package/build/esm/utils/WaterfallDetector.js +200 -0
  214. package/build/esm/utils/WaterfallDetector.js.map +1 -0
  215. package/build/esm/utils/computePayload.js +37 -0
  216. package/build/esm/utils/computePayload.js.map +1 -0
  217. package/build/esm/utils/computeRequest.js +29 -0
  218. package/build/esm/utils/computeRequest.js.map +1 -0
  219. package/build/esm/utils/format.js +69 -0
  220. package/build/esm/utils/format.js.map +1 -0
  221. package/build/esm/utils/logger.js +31 -0
  222. package/build/esm/utils/logger.js.map +1 -0
  223. package/build/esm/vite/constants.js +18 -0
  224. package/build/esm/vite/constants.js.map +1 -0
  225. package/build/esm/vite/hookInstaller.js +99 -0
  226. package/build/esm/vite/hookInstaller.js.map +1 -0
  227. package/build/esm/vite/index.js +77 -0
  228. package/build/esm/vite/index.js.map +1 -0
  229. package/build/types/DevToolsContext.d.ts +3 -0
  230. package/build/types/DevToolsContext.d.ts.map +1 -0
  231. package/build/types/components/ActionMetrics.d.ts +6 -0
  232. package/build/types/components/ActionMetrics.d.ts.map +1 -0
  233. package/build/types/components/BubbleChart.d.ts +10 -0
  234. package/build/types/components/BubbleChart.d.ts.map +1 -0
  235. package/build/types/components/CacheInspectorTab.d.ts +6 -0
  236. package/build/types/components/CacheInspectorTab.d.ts.map +1 -0
  237. package/build/types/components/CacheMetrics.d.ts +6 -0
  238. package/build/types/components/CacheMetrics.d.ts.map +1 -0
  239. package/build/types/components/ComponentCard.d.ts +13 -0
  240. package/build/types/components/ComponentCard.d.ts.map +1 -0
  241. package/build/types/components/ComputeTab.d.ts +6 -0
  242. package/build/types/components/ComputeTab.d.ts.map +1 -0
  243. package/build/types/components/CopyableCodeBlock.d.ts +7 -0
  244. package/build/types/components/CopyableCodeBlock.d.ts.map +1 -0
  245. package/build/types/components/DebuggingTab.d.ts +6 -0
  246. package/build/types/components/DebuggingTab.d.ts.map +1 -0
  247. package/build/types/components/HookRow.d.ts +9 -0
  248. package/build/types/components/HookRow.d.ts.map +1 -0
  249. package/build/types/components/ImprovementsTab.d.ts +7 -0
  250. package/build/types/components/ImprovementsTab.d.ts.map +1 -0
  251. package/build/types/components/InspectorSelectionHeader.d.ts +12 -0
  252. package/build/types/components/InspectorSelectionHeader.d.ts.map +1 -0
  253. package/build/types/components/InterceptTab.d.ts +126 -0
  254. package/build/types/components/InterceptTab.d.ts.map +1 -0
  255. package/build/types/components/IssueCard.d.ts +8 -0
  256. package/build/types/components/IssueCard.d.ts.map +1 -0
  257. package/build/types/components/LogEntryCard.d.ts +7 -0
  258. package/build/types/components/LogEntryCard.d.ts.map +1 -0
  259. package/build/types/components/MockEditor.d.ts +58 -0
  260. package/build/types/components/MockEditor.d.ts.map +1 -0
  261. package/build/types/components/MonitorErrorBoundary.d.ts +16 -0
  262. package/build/types/components/MonitorErrorBoundary.d.ts.map +1 -0
  263. package/build/types/components/MonitoringPanel.d.ts +8 -0
  264. package/build/types/components/MonitoringPanel.d.ts.map +1 -0
  265. package/build/types/components/ObjectLoadingMetrics.d.ts +7 -0
  266. package/build/types/components/ObjectLoadingMetrics.d.ts.map +1 -0
  267. package/build/types/components/OsdkAppErrorBoundary.d.ts +18 -0
  268. package/build/types/components/OsdkAppErrorBoundary.d.ts.map +1 -0
  269. package/build/types/components/OsdkDevTools.d.ts +2 -0
  270. package/build/types/components/OsdkDevTools.d.ts.map +1 -0
  271. package/build/types/components/OverrideEditor.d.ts +26 -0
  272. package/build/types/components/OverrideEditor.d.ts.map +1 -0
  273. package/build/types/components/PerformanceTab.d.ts +8 -0
  274. package/build/types/components/PerformanceTab.d.ts.map +1 -0
  275. package/build/types/components/PrimitiveSelectionPanel.d.ts +28 -0
  276. package/build/types/components/PrimitiveSelectionPanel.d.ts.map +1 -0
  277. package/build/types/components/issueTypes.d.ts +16 -0
  278. package/build/types/components/issueTypes.d.ts.map +1 -0
  279. package/build/types/components/resolveComponentName.d.ts +3 -0
  280. package/build/types/components/resolveComponentName.d.ts.map +1 -0
  281. package/build/types/components/testHelpers.d.ts +2 -0
  282. package/build/types/components/testHelpers.d.ts.map +1 -0
  283. package/build/types/css.d.d.ts +4 -0
  284. package/build/types/css.d.d.ts.map +1 -0
  285. package/build/types/fiber/DegradationNotice.d.ts +8 -0
  286. package/build/types/fiber/DegradationNotice.d.ts.map +1 -0
  287. package/build/types/fiber/DevtoolsHook.d.ts +7 -0
  288. package/build/types/fiber/DevtoolsHook.d.ts.map +1 -0
  289. package/build/types/fiber/FiberAccess.d.ts +2 -0
  290. package/build/types/fiber/FiberAccess.d.ts.map +1 -0
  291. package/build/types/fiber/FiberInspection.d.ts +6 -0
  292. package/build/types/fiber/FiberInspection.d.ts.map +1 -0
  293. package/build/types/fiber/FiberTags.d.ts +33 -0
  294. package/build/types/fiber/FiberTags.d.ts.map +1 -0
  295. package/build/types/fiber/HookStateInspector.d.ts +45 -0
  296. package/build/types/fiber/HookStateInspector.d.ts.map +1 -0
  297. package/build/types/fiber/SafeFiberOperation.d.ts +7 -0
  298. package/build/types/fiber/SafeFiberOperation.d.ts.map +1 -0
  299. package/build/types/fiber/capabilities.d.ts +38 -0
  300. package/build/types/fiber/capabilities.d.ts.map +1 -0
  301. package/build/types/fiber/traverseFiber.d.ts +5 -0
  302. package/build/types/fiber/traverseFiber.d.ts.map +1 -0
  303. package/build/types/fiber/types.d.ts +87 -0
  304. package/build/types/fiber/types.d.ts.map +1 -0
  305. package/build/types/fiber/validation.d.ts +10 -0
  306. package/build/types/fiber/validation.d.ts.map +1 -0
  307. package/build/types/hooks/createPollingStore.d.ts +5 -0
  308. package/build/types/hooks/createPollingStore.d.ts.map +1 -0
  309. package/build/types/hooks/useActiveComponents.d.ts +3 -0
  310. package/build/types/hooks/useActiveComponents.d.ts.map +1 -0
  311. package/build/types/hooks/useComponentRegistry.d.ts +3 -0
  312. package/build/types/hooks/useComponentRegistry.d.ts.map +1 -0
  313. package/build/types/hooks/useComputeSelectors.d.ts +7 -0
  314. package/build/types/hooks/useComputeSelectors.d.ts.map +1 -0
  315. package/build/types/hooks/useConsoleLogs.d.ts +7 -0
  316. package/build/types/hooks/useConsoleLogs.d.ts.map +1 -0
  317. package/build/types/hooks/useInspectorSelection.d.ts +9 -0
  318. package/build/types/hooks/useInspectorSelection.d.ts.map +1 -0
  319. package/build/types/hooks/useMetrics.d.ts +3 -0
  320. package/build/types/hooks/useMetrics.d.ts.map +1 -0
  321. package/build/types/hooks/usePersistedState.d.ts +1 -0
  322. package/build/types/hooks/usePersistedState.d.ts.map +1 -0
  323. package/build/types/hooks/useRecommendations.d.ts +10 -0
  324. package/build/types/hooks/useRecommendations.d.ts.map +1 -0
  325. package/build/types/hooks/useSharedTick.d.ts +1 -0
  326. package/build/types/hooks/useSharedTick.d.ts.map +1 -0
  327. package/build/types/hooks/useTimeElapsed.d.ts +1 -0
  328. package/build/types/hooks/useTimeElapsed.d.ts.map +1 -0
  329. package/build/types/hooks/useTrackerSubscription.d.ts +16 -0
  330. package/build/types/hooks/useTrackerSubscription.d.ts.map +1 -0
  331. package/build/types/hooks/useUnusedFieldAnalysis.d.ts +8 -0
  332. package/build/types/hooks/useUnusedFieldAnalysis.d.ts.map +1 -0
  333. package/build/types/index.d.ts +21 -0
  334. package/build/types/index.d.ts.map +1 -0
  335. package/build/types/inspector/ClickToInspectSystem.d.ts +40 -0
  336. package/build/types/inspector/ClickToInspectSystem.d.ts.map +1 -0
  337. package/build/types/inspector/components/ComponentLabel.d.ts +3 -0
  338. package/build/types/inspector/components/ComponentLabel.d.ts.map +1 -0
  339. package/build/types/inspector/components/InspectorBanner.d.ts +5 -0
  340. package/build/types/inspector/components/InspectorBanner.d.ts.map +1 -0
  341. package/build/types/inspector/components/InspectorOverlay.d.ts +3 -0
  342. package/build/types/inspector/components/InspectorOverlay.d.ts.map +1 -0
  343. package/build/types/inspector/components/SelectionHighlight.d.ts +3 -0
  344. package/build/types/inspector/components/SelectionHighlight.d.ts.map +1 -0
  345. package/build/types/inspector/createClickToInspect.d.ts +3 -0
  346. package/build/types/inspector/createClickToInspect.d.ts.map +1 -0
  347. package/build/types/inspector/hooks/useAnimatedBounds.d.ts +2 -0
  348. package/build/types/inspector/hooks/useAnimatedBounds.d.ts.map +1 -0
  349. package/build/types/inspector/index.d.ts +13 -0
  350. package/build/types/inspector/index.d.ts.map +1 -0
  351. package/build/types/inspector/inspectorController.d.ts +2 -0
  352. package/build/types/inspector/inspectorController.d.ts.map +1 -0
  353. package/build/types/inspector/types.d.ts +94 -0
  354. package/build/types/inspector/types.d.ts.map +1 -0
  355. package/build/types/inspector/utils/elementBounds.d.ts +3 -0
  356. package/build/types/inspector/utils/elementBounds.d.ts.map +1 -0
  357. package/build/types/inspector/utils/interpolation.d.ts +7 -0
  358. package/build/types/inspector/utils/interpolation.d.ts.map +1 -0
  359. package/build/types/inspector/utils/labelPositioning.d.ts +3 -0
  360. package/build/types/inspector/utils/labelPositioning.d.ts.map +1 -0
  361. package/build/types/mocking/MockCacheKeyGenerator.d.ts +41 -0
  362. package/build/types/mocking/MockCacheKeyGenerator.d.ts.map +1 -0
  363. package/build/types/mocking/MockManager.d.ts +103 -0
  364. package/build/types/mocking/MockManager.d.ts.map +1 -0
  365. package/build/types/prototyping/PrototypeOverrideStore.d.ts +33 -0
  366. package/build/types/prototyping/PrototypeOverrideStore.d.ts.map +1 -0
  367. package/build/types/prototyping/index.d.ts +1 -0
  368. package/build/types/prototyping/index.d.ts.map +1 -0
  369. package/build/types/public/vite.d.ts +2 -0
  370. package/build/types/public/vite.d.ts.map +1 -0
  371. package/build/types/register.d.ts +1 -0
  372. package/build/types/register.d.ts.map +1 -0
  373. package/build/types/scss.d.d.ts +6 -0
  374. package/build/types/scss.d.d.ts.map +1 -0
  375. package/build/types/store/ComputeStore.d.ts +47 -0
  376. package/build/types/store/ComputeStore.d.ts.map +1 -0
  377. package/build/types/store/ConsoleLogStore.d.ts +29 -0
  378. package/build/types/store/ConsoleLogStore.d.ts.map +1 -0
  379. package/build/types/store/MetricsStore.d.ts +42 -0
  380. package/build/types/store/MetricsStore.d.ts.map +1 -0
  381. package/build/types/store/MonitorStore.d.ts +86 -0
  382. package/build/types/store/MonitorStore.d.ts.map +1 -0
  383. package/build/types/store/SubscribableStore.d.ts +6 -0
  384. package/build/types/store/SubscribableStore.d.ts.map +1 -0
  385. package/build/types/store/WindowErrorStore.d.ts +32 -0
  386. package/build/types/store/WindowErrorStore.d.ts.map +1 -0
  387. package/build/types/styles.d.ts +1 -0
  388. package/build/types/styles.d.ts.map +1 -0
  389. package/build/types/types/compute.d.ts +73 -0
  390. package/build/types/types/compute.d.ts.map +1 -0
  391. package/build/types/types/emissions.d.ts +24 -0
  392. package/build/types/types/emissions.d.ts.map +1 -0
  393. package/build/types/types/index.d.ts +143 -0
  394. package/build/types/types/index.d.ts.map +1 -0
  395. package/build/types/utils/ActionLifecycleTracker.d.ts +39 -0
  396. package/build/types/utils/ActionLifecycleTracker.d.ts.map +1 -0
  397. package/build/types/utils/CacheEfficiencyAnalyzer.d.ts +45 -0
  398. package/build/types/utils/CacheEfficiencyAnalyzer.d.ts.map +1 -0
  399. package/build/types/utils/CircularBuffer.d.ts +18 -0
  400. package/build/types/utils/CircularBuffer.d.ts.map +1 -0
  401. package/build/types/utils/ComponentContextCapture.d.ts +29 -0
  402. package/build/types/utils/ComponentContextCapture.d.ts.map +1 -0
  403. package/build/types/utils/ComponentPrimitiveDiscovery.d.ts +62 -0
  404. package/build/types/utils/ComponentPrimitiveDiscovery.d.ts.map +1 -0
  405. package/build/types/utils/ComponentQueryRegistry.d.ts +91 -0
  406. package/build/types/utils/ComponentQueryRegistry.d.ts.map +1 -0
  407. package/build/types/utils/ComputeMonitor.d.ts +14 -0
  408. package/build/types/utils/ComputeMonitor.d.ts.map +1 -0
  409. package/build/types/utils/EventTimeline.d.ts +102 -0
  410. package/build/types/utils/EventTimeline.d.ts.map +1 -0
  411. package/build/types/utils/LinkTraversalTracker.d.ts +43 -0
  412. package/build/types/utils/LinkTraversalTracker.d.ts.map +1 -0
  413. package/build/types/utils/MockDataGenerator.d.ts +23 -0
  414. package/build/types/utils/MockDataGenerator.d.ts.map +1 -0
  415. package/build/types/utils/ObservableClientMonitor.d.ts +62 -0
  416. package/build/types/utils/ObservableClientMonitor.d.ts.map +1 -0
  417. package/build/types/utils/PerformanceRecommendationEngine.d.ts +67 -0
  418. package/build/types/utils/PerformanceRecommendationEngine.d.ts.map +1 -0
  419. package/build/types/utils/PropertyAccessTracker.d.ts +50 -0
  420. package/build/types/utils/PropertyAccessTracker.d.ts.map +1 -0
  421. package/build/types/utils/RecommendationMatcher.d.ts +5 -0
  422. package/build/types/utils/RecommendationMatcher.d.ts.map +1 -0
  423. package/build/types/utils/SubscriptionTracker.d.ts +17 -0
  424. package/build/types/utils/SubscriptionTracker.d.ts.map +1 -0
  425. package/build/types/utils/UnusedFieldAnalyzer.d.ts +46 -0
  426. package/build/types/utils/UnusedFieldAnalyzer.d.ts.map +1 -0
  427. package/build/types/utils/WaterfallDetector.d.ts +28 -0
  428. package/build/types/utils/WaterfallDetector.d.ts.map +1 -0
  429. package/build/types/utils/computePayload.d.ts +3 -0
  430. package/build/types/utils/computePayload.d.ts.map +1 -0
  431. package/build/types/utils/computeRequest.d.ts +20 -0
  432. package/build/types/utils/computeRequest.d.ts.map +1 -0
  433. package/build/types/utils/format.d.ts +5 -0
  434. package/build/types/utils/format.d.ts.map +1 -0
  435. package/build/types/utils/logger.d.ts +2 -0
  436. package/build/types/utils/logger.d.ts.map +1 -0
  437. package/build/types/vite/constants.d.ts +1 -0
  438. package/build/types/vite/constants.d.ts.map +1 -0
  439. package/build/types/vite/hookInstaller.d.ts +1 -0
  440. package/build/types/vite/hookInstaller.d.ts.map +1 -0
  441. package/build/types/vite/index.d.ts +20 -0
  442. package/build/types/vite/index.d.ts.map +1 -0
  443. package/package.json +114 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObservableClientMonitor.js","names":["MetricsStore","ActionLifecycleTracker","componentContextCapture","SubscriptionTracker","getDebugMetadata","value","__debugMetadata","undefined","isMockActionEdits","type","hasExperimentalStore","client","__experimentalStore","ObservableClientMonitor","signatureLastRecorded","Map","subscriptionHasLoaded","DEDUP_WINDOW_MS","cleanupIntervalId","wrappedClient","constructor","config","metricsStore","subscriptionTracker","cacheThresholdMs","actionTracker","eventTimeline","cleanupIntervalMs","setInterval","cleanup","pruneSignatureLastRecorded","componentRegistry","linkTraversalTracker","propertyAccessTracker","captureComponentContext","captureQueryParams","mockManager","wrapClient","logger","methodCache","Proxy","get","target","prop","cached","ext","wrapped","wrapObserveObject","observeObject","bind","wrapObserveList","observeList","wrapObserveAggregation","observeAggregation","observeLinks","wrapObserveLinks","wrapApplyAction","applyAction","wrapValidateAction","validateAction","getCacheSnapshot","invalidateAll","invalidateObjects","invalidateObjectType","set","Reflect","bound","recordMockHitIfNeeded","signature","metadata","servedFromMock","record","subscriptionId","timestamp","Date","now","mockId","recordEmissionEvent","objectKey","isOptimistic","classifyCacheEvent","servedFromCache","lastRecorded","has","processEmission","status","hasData","objectCount","debugMetadata","recordEmission","optimisticId","noteEmission","recordOptimisticUpdate","classification","analysis","analyzeEmissions","responseTime","loadTime","effectiveClassification","wasCached","recordCacheHit","recordRevalidation","recordCacheMiss","cleanupSubscription","endSubscription","clearSubscription","delete","createCleanupUnsubscribable","original","unsubscribe","setupObservation","params","componentContext","captureNow","registerBinding","componentId","id","componentName","name","componentDisplayName","displayName","hookType","hookIndex","querySignature","queryParams","isDeduplicated","isDeduplicatedSubscription","recordDeduplication","startSubscription","createCleanupObserverCallbacks","observer","error","err","_cleanupError","unregisterComponent","complete","apiName","primaryKey","options","apiNameStr","String","objectType","cleanupCallbacks","wrappedObserver","next","mock","findMock","response","object","Error","wrapObject","unsubscribable","canonicalWhere","canonicalizeWhereClause","where","whereClause","JSON","stringify","__devtoolsSignature","orderBy","pageSize","resolvedList","list","length","wrappedList","map","obj","index","$primaryKey","aggregate","result","lastUpdated","mockData","Promise","then","unsub","sourceObject","linkName","sourceObjectKey","$apiName","recordTraversal","sourceObjectType","linkedObjects","osdkObj","push","recordLinkedObjects","objects","actionDef","args","actionName","delay","resolve","setTimeout","actualArgs","usePayload","payload","payloadData","parse","parameters","captureActionError","mockResult","injectMockedObjectsFromActionResult","store","promises","allObjects","addedObjects","modifiedObjects","deletedObjects","invalidateObject","editedObjectTypes","allSettled","hasOptimisticUpdate","Boolean","optimisticUpdate","actionId","startAction","optimisticConfigured","existingListeners","__debugListeners","instrumentedOptions","onLayerCreated","registerOptimisticLayer","onLayerCleared","handleLayerCleared","onObjectModified","operation","modifiedBy","onServerObjectsModified","markActionSettled","succeeded","completedAt","start","duration","recordActionValidation","recordActionError","Math","random","toString","slice","actionType","message","stack","validationErrors","extractObjectsFromMockResult","$objectType","injectMockedObjectToCache","Array","isArray","item","reject","key","dispose","clear","clearInterval"],"sources":["ObservableClientMonitor.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 {\n ActionEditResponse,\n InterfaceDefinition,\n ObjectTypeDefinition,\n} from \"@osdk/api\";\nimport type {\n CacheSnapshot,\n ObservableClient,\n ObserveObjectCallbackArgs,\n ObserveObjectsCallbackArgs,\n Unsubscribable,\n} from \"@osdk/client/observable\";\nimport type { MockManager } from \"../mocking/MockManager.js\";\nimport { MetricsStore } from \"../store/MetricsStore.js\";\nimport type {\n ActionError,\n ObservableDebugMetadata,\n OperationMetadata,\n} from \"../types/index.js\";\nimport { ActionLifecycleTracker } from \"./ActionLifecycleTracker.js\";\nimport type { ComponentContext } from \"./ComponentContextCapture.js\";\nimport { componentContextCapture } from \"./ComponentContextCapture.js\";\nimport type {\n ComponentHookBinding,\n ComponentQueryRegistry,\n QueryParams,\n} from \"./ComponentQueryRegistry.js\";\nimport type { EventTimeline } from \"./EventTimeline.js\";\nimport type { LinkTraversalTracker } from \"./LinkTraversalTracker.js\";\nimport type { PropertyAccessTracker } from \"./PropertyAccessTracker.js\";\nimport { SubscriptionTracker } from \"./SubscriptionTracker.js\";\n\ninterface OsdkObject {\n $apiName: string;\n $primaryKey: string | number;\n [key: string]: unknown;\n}\n\ninterface ObserveLinksObserver {\n next(\n value: ObserveObjectsCallbackArgs<\n ObjectTypeDefinition | InterfaceDefinition\n >,\n ): void;\n error(err: unknown): void;\n complete(): void;\n}\n\ninterface AggregationObserver {\n next(value: {\n result: unknown;\n status: string;\n lastUpdated: number;\n error?: Error;\n }): void;\n error(err: unknown): void;\n complete(): void;\n}\n\ninterface ExtendedClientMethods {\n observeLinks?(\n sourceObject: OsdkObject,\n linkName: string,\n options: Record<string, unknown>,\n observer: ObserveLinksObserver,\n ): Unsubscribable;\n getCacheSnapshot?(): Promise<CacheSnapshot>;\n invalidateAll?(): Promise<void>;\n invalidateObjects?(objects: unknown): Promise<void>;\n invalidateObjectType?(objectType: string): Promise<void>;\n}\n\ntype ExtendedObservableClient = ObservableClient & ExtendedClientMethods;\n\ninterface MockActionEdits {\n type: \"edits\";\n addedObjects?: Array<{ objectType: string; primaryKey: string }>;\n modifiedObjects?: Array<{ objectType: string; primaryKey: string }>;\n deletedObjects?: Array<{ objectType: string; primaryKey: string }>;\n editedObjectTypes?: string[];\n}\n\ninterface ExperimentalStore {\n invalidateObject?(\n objectType: string,\n primaryKey: string,\n ): Promise<void>;\n invalidateObjectType?(objectType: string): Promise<void>;\n}\n\nfunction getDebugMetadata(value: unknown): ObservableDebugMetadata | undefined {\n if (\n typeof value === \"object\"\n && value != null\n && \"__debugMetadata\" in value\n ) {\n return (value as { __debugMetadata: ObservableDebugMetadata })\n .__debugMetadata;\n }\n return undefined;\n}\n\nfunction isMockActionEdits(value: unknown): value is MockActionEdits {\n return (\n typeof value === \"object\"\n && value != null\n && \"type\" in value\n && (value as Record<string, unknown>).type === \"edits\"\n );\n}\n\nfunction hasExperimentalStore(\n client: ObservableClient,\n): client is ObservableClient & { __experimentalStore: ExperimentalStore } {\n return (\n \"__experimentalStore\" in client\n && typeof (client as Record<string, unknown>).__experimentalStore\n === \"object\"\n && (client as Record<string, unknown>).__experimentalStore != null\n );\n}\n\nexport interface ObservableClientMonitorConfig {\n metricsStore?: MetricsStore;\n componentRegistry: ComponentQueryRegistry;\n linkTraversalTracker: LinkTraversalTracker;\n propertyAccessTracker: PropertyAccessTracker;\n eventTimeline?: EventTimeline;\n captureComponentContext?: boolean;\n captureQueryParams?: boolean;\n cleanupIntervalMs?: number;\n cacheThresholdMs?: number;\n mockManager?: MockManager;\n}\n\nexport class ObservableClientMonitor {\n private readonly metricsStore: MetricsStore;\n private readonly subscriptionTracker: SubscriptionTracker;\n private readonly signatureLastRecorded = new Map<string, number>();\n private readonly subscriptionHasLoaded = new Map<string, boolean>();\n private readonly DEDUP_WINDOW_MS = 100;\n private readonly actionTracker: ActionLifecycleTracker;\n private readonly cleanupIntervalMs: number;\n private cleanupIntervalId: ReturnType<typeof setInterval> | null = null;\n private componentRegistry: ComponentQueryRegistry;\n private linkTraversalTracker: LinkTraversalTracker;\n private propertyAccessTracker: PropertyAccessTracker;\n private eventTimeline: EventTimeline | null;\n private captureComponentContext: boolean;\n private captureQueryParams: boolean;\n private mockManager: MockManager | null;\n private wrappedClient: ObservableClient | null = null;\n\n constructor(config: ObservableClientMonitorConfig) {\n this.metricsStore = config.metricsStore ?? new MetricsStore();\n this.subscriptionTracker = new SubscriptionTracker(\n config.cacheThresholdMs ?? 10,\n );\n this.actionTracker = new ActionLifecycleTracker(\n this.metricsStore,\n config.eventTimeline,\n );\n this.cleanupIntervalMs = config.cleanupIntervalMs ?? 60000;\n this.cleanupIntervalId = setInterval(\n () => {\n this.subscriptionTracker.cleanup();\n this.pruneSignatureLastRecorded();\n },\n this.cleanupIntervalMs,\n );\n\n this.componentRegistry = config.componentRegistry;\n this.linkTraversalTracker = config.linkTraversalTracker;\n this.propertyAccessTracker = config.propertyAccessTracker;\n this.eventTimeline = config.eventTimeline ?? null;\n this.captureComponentContext = config.captureComponentContext ?? true;\n this.captureQueryParams = config.captureQueryParams ?? true;\n this.mockManager = config.mockManager ?? null;\n }\n\n wrapClient(client: ObservableClient): ObservableClient {\n this.wrappedClient = client;\n\n // Suppress the client's internal BrowserLogger. It writes to console.*\n // which our ConsoleLogStore intercepts, flooding the devtools console tab\n // with hundreds of internal debug logs. The devtools monitoring proxy\n // already captures all the same operations through its own instrumentation.\n if (hasExperimentalStore(client)) {\n (client.__experimentalStore as { logger: unknown }).logger = undefined;\n }\n\n const methodCache = new Map<string | symbol, unknown>();\n\n return new Proxy(client, {\n get: (target, prop: string | symbol) => {\n const cached = methodCache.get(prop);\n if (cached !== undefined) {\n return cached;\n }\n\n const ext = target as ExtendedObservableClient;\n let wrapped: unknown;\n\n if (prop === \"observeObject\") {\n wrapped = this.wrapObserveObject(target.observeObject.bind(target));\n } else if (prop === \"observeList\") {\n wrapped = this.wrapObserveList(target.observeList.bind(target));\n } else if (prop === \"observeAggregation\") {\n wrapped = this.wrapObserveAggregation(\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n target.observeAggregation.bind(target),\n );\n } else if (prop === \"observeLinks\" && ext.observeLinks) {\n wrapped = this.wrapObserveLinks(ext.observeLinks.bind(ext));\n } else if (prop === \"applyAction\") {\n wrapped = this.wrapApplyAction(target.applyAction.bind(target));\n } else if (prop === \"validateAction\") {\n wrapped = this.wrapValidateAction(target.validateAction.bind(target));\n } else if (prop === \"getCacheSnapshot\") {\n wrapped = ext.getCacheSnapshot?.bind(ext);\n } else if (prop === \"invalidateAll\") {\n wrapped = ext.invalidateAll?.bind(ext);\n } else if (prop === \"invalidateObjects\") {\n wrapped = ext.invalidateObjects?.bind(ext);\n } else if (prop === \"invalidateObjectType\") {\n wrapped = ext.invalidateObjectType?.bind(ext);\n }\n\n if (wrapped !== undefined) {\n methodCache.set(prop, wrapped);\n return wrapped;\n }\n\n const value = Reflect.get(target, prop);\n if (typeof value === \"function\") {\n const bound = value.bind(target);\n methodCache.set(prop, bound);\n return bound;\n }\n return value;\n },\n }) as ObservableClient;\n }\n\n private recordMockHitIfNeeded(value: unknown, signature: string): void {\n const metadata = getDebugMetadata(value);\n if (metadata?.servedFromMock && this.eventTimeline) {\n this.eventTimeline.record({\n type: \"MOCK_HIT\",\n subscriptionId: signature,\n timestamp: Date.now(),\n mockId: metadata.mockId,\n });\n }\n }\n\n private recordEmissionEvent(\n signature: string,\n objectKey?: string,\n ): void {\n if (this.eventTimeline) {\n this.eventTimeline.record({\n type: \"EMISSION\",\n subscriptionId: signature,\n objectKey,\n timestamp: Date.now(),\n isOptimistic: false,\n });\n }\n }\n\n private classifyCacheEvent(\n signature: string,\n subscriptionId: string,\n servedFromCache: boolean,\n ): \"hit\" | \"miss\" | \"revalidation\" | \"skip\" {\n const lastRecorded = this.signatureLastRecorded.get(signature) ?? 0;\n const now = Date.now();\n\n if (now - lastRecorded <= this.DEDUP_WINDOW_MS) {\n return \"skip\";\n }\n\n this.signatureLastRecorded.set(signature, now);\n\n if (servedFromCache) {\n return \"hit\";\n }\n if (this.subscriptionHasLoaded.has(subscriptionId)) {\n return \"revalidation\";\n }\n return \"miss\";\n }\n\n private processEmission(\n subscriptionId: string,\n signature: string,\n metadata: OperationMetadata,\n status: string,\n hasData: boolean,\n isOptimistic: boolean,\n objectCount: number,\n value: unknown,\n objectKey?: string,\n ): void {\n const timestamp = Date.now();\n const debugMetadata = getDebugMetadata(value);\n\n this.subscriptionTracker.recordEmission(\n subscriptionId,\n status,\n hasData,\n isOptimistic,\n debugMetadata?.optimisticId,\n timestamp,\n );\n\n this.actionTracker.noteEmission({\n subscriptionId,\n optimisticId: debugMetadata?.optimisticId,\n isOptimistic,\n timestamp,\n objectCount,\n });\n\n if (isOptimistic) {\n this.metricsStore.recordOptimisticUpdate(signature, metadata);\n }\n\n if (status === \"loaded\") {\n const classification = this.classifyCacheEvent(\n signature,\n subscriptionId,\n debugMetadata?.servedFromCache ?? false,\n );\n\n if (classification !== \"skip\") {\n const analysis = this.subscriptionTracker.analyzeEmissions(\n subscriptionId,\n );\n const responseTime = analysis?.loadTime ?? 0;\n const effectiveClassification = analysis?.wasCached\n ? \"hit\"\n : classification;\n\n if (effectiveClassification === \"hit\") {\n this.metricsStore.recordCacheHit(\n signature,\n responseTime,\n metadata,\n objectCount,\n );\n } else if (effectiveClassification === \"revalidation\") {\n this.metricsStore.recordRevalidation(\n signature,\n responseTime,\n metadata,\n objectCount,\n );\n } else {\n this.metricsStore.recordCacheMiss(\n signature,\n responseTime,\n metadata,\n objectCount,\n );\n }\n\n this.subscriptionHasLoaded.set(subscriptionId, true);\n }\n }\n\n this.recordMockHitIfNeeded(value, signature);\n this.recordEmissionEvent(signature, objectKey);\n }\n\n private cleanupSubscription(subscriptionId: string): void {\n this.subscriptionTracker.endSubscription(subscriptionId);\n this.actionTracker.clearSubscription(subscriptionId);\n this.subscriptionHasLoaded.delete(subscriptionId);\n }\n\n private createCleanupUnsubscribable(\n original: Unsubscribable,\n subscriptionId: string,\n ): Unsubscribable {\n return {\n unsubscribe: () => {\n try {\n original.unsubscribe();\n } finally {\n this.cleanupSubscription(subscriptionId);\n }\n },\n };\n }\n\n private setupObservation(params: {\n signature: string;\n metadata: OperationMetadata;\n hookType: ComponentHookBinding[\"hookType\"];\n queryParams: QueryParams;\n }): {\n componentContext: ComponentContext | null;\n subscriptionId: string;\n } {\n const componentContext = this.captureComponentContext\n ? componentContextCapture.captureNow()\n : null;\n\n if (componentContext && this.captureQueryParams) {\n this.componentRegistry.registerBinding({\n componentId: componentContext.id,\n componentName: componentContext.name,\n componentDisplayName: componentContext.displayName,\n hookType: params.hookType,\n hookIndex: 0,\n querySignature: params.signature,\n queryParams: params.queryParams,\n });\n }\n\n const isDeduplicated = this.subscriptionTracker\n .isDeduplicatedSubscription(params.signature);\n if (isDeduplicated) {\n this.metricsStore.recordDeduplication(params.signature, params.metadata);\n }\n\n const subscriptionId = this.subscriptionTracker.startSubscription(\n params.signature,\n );\n\n return { componentContext, subscriptionId };\n }\n\n private createCleanupObserverCallbacks(\n subscriptionId: string,\n componentContext: { id: string } | null,\n observer: { error(err: unknown): void; complete(): void },\n ): { error(err: unknown): void; complete(): void } {\n return {\n error: (err: unknown) => {\n try {\n this.cleanupSubscription(subscriptionId);\n } catch (_cleanupError) {\n }\n if (componentContext) {\n this.componentRegistry.unregisterComponent(componentContext.id);\n }\n observer.error(err);\n },\n complete: () => {\n this.cleanupSubscription(subscriptionId);\n if (componentContext) {\n this.componentRegistry.unregisterComponent(componentContext.id);\n }\n observer.complete();\n },\n };\n }\n\n private wrapObserveObject<T extends ObjectTypeDefinition>(\n original: ObservableClient[\"observeObject\"],\n ): ObservableClient[\"observeObject\"] {\n return (apiName, primaryKey, options, observer): Unsubscribable => {\n const apiNameStr = typeof apiName === \"string\"\n ? apiName\n : apiName.apiName;\n const signature = `object:${apiNameStr}:${String(primaryKey)}`;\n\n const metadata: OperationMetadata = {\n apiName: apiNameStr,\n primaryKey: String(primaryKey),\n };\n\n const { componentContext, subscriptionId } = this.setupObservation({\n signature,\n metadata,\n hookType: \"useOsdkObject\",\n queryParams: {\n type: \"object\",\n objectType: apiNameStr,\n primaryKey: String(primaryKey),\n },\n });\n\n const objectKey = `${apiNameStr}:${primaryKey}`;\n\n const mockManager = this.mockManager;\n const cleanupCallbacks = this.createCleanupObserverCallbacks(\n subscriptionId,\n componentContext,\n observer,\n );\n\n const wrappedObserver = {\n next: (value: ObserveObjectCallbackArgs<T>) => {\n if (mockManager) {\n const mock = mockManager.findMock({\n type: \"object\",\n objectType: apiNameStr,\n primaryKey: String(primaryKey),\n });\n\n if (mock) {\n if (mock.response.type === \"error\") {\n (observer.next as (v: ObserveObjectCallbackArgs<T>) => void)({\n ...value,\n status: \"error\",\n object: undefined,\n isOptimistic: false,\n error: new Error(mock.response.error),\n } as ObserveObjectCallbackArgs<T>);\n return;\n }\n\n if (mock.response.type === \"object\") {\n (observer.next as (v: ObserveObjectCallbackArgs<T>) => void)({\n ...value,\n status: \"loaded\",\n object: mock.response.object,\n isOptimistic: false,\n } as ObserveObjectCallbackArgs<T>);\n return;\n }\n }\n }\n\n this.processEmission(\n subscriptionId,\n signature,\n metadata,\n value.status,\n value.object !== undefined,\n value.isOptimistic,\n value.object !== undefined ? 1 : 0,\n value,\n objectKey,\n );\n\n if (value.object && componentContext) {\n const wrapped = this.propertyAccessTracker.wrapObject(\n value.object,\n objectKey,\n componentContext.id,\n );\n (value as { object: typeof wrapped }).object = wrapped;\n }\n\n (observer.next as (v: ObserveObjectCallbackArgs<T>) => void)(value);\n },\n ...cleanupCallbacks,\n };\n\n const unsubscribable = original(\n apiName,\n primaryKey,\n options,\n wrappedObserver,\n );\n\n return this.createCleanupUnsubscribable(unsubscribable, subscriptionId);\n };\n }\n\n private wrapObserveList(\n original: ObservableClient[\"observeList\"],\n ): ObservableClient[\"observeList\"] {\n return ((\n options: Parameters<ObservableClient[\"observeList\"]>[0],\n observer: Parameters<ObservableClient[\"observeList\"]>[1],\n ): Unsubscribable => {\n const apiNameStr = typeof options.type === \"string\"\n ? options.type\n : options.type.apiName;\n\n const canonicalWhere = this.wrappedClient\n ? this.wrappedClient.canonicalizeWhereClause(options.where ?? {})\n : options.where ?? {};\n const whereClause = JSON.stringify(canonicalWhere);\n\n const signature = (options as { __devtoolsSignature?: string })\n .__devtoolsSignature\n ?? `useOsdkObjects:${apiNameStr}:${whereClause}:${\n JSON.stringify(options.orderBy)\n }`;\n\n const metadata: OperationMetadata = {\n objectType: apiNameStr,\n whereClause,\n pageSize: options.pageSize,\n };\n\n const { componentContext, subscriptionId } = this.setupObservation({\n signature,\n metadata,\n hookType: \"useOsdkObjects\",\n queryParams: {\n type: \"list\",\n objectType: apiNameStr,\n where: options.where,\n orderBy: options.orderBy,\n pageSize: options.pageSize,\n },\n });\n\n const mockManager = this.mockManager;\n const cleanupCallbacks = this.createCleanupObserverCallbacks(\n subscriptionId,\n componentContext,\n observer,\n );\n\n const wrappedObserver = {\n next: (\n value: ObserveObjectsCallbackArgs<\n ObjectTypeDefinition | InterfaceDefinition\n >,\n ) => {\n if (mockManager) {\n const mock = mockManager.findMock({\n type: \"list\",\n objectType: apiNameStr,\n whereClause: options.where as\n | Record<string, unknown>\n | undefined,\n });\n\n if (mock) {\n if (mock.response.type === \"error\") {\n (observer.next as (v: typeof value) => void)(\n {\n ...value,\n status: \"error\",\n resolvedList: [],\n isOptimistic: false,\n error: new Error(mock.response.error),\n } as typeof value,\n );\n return;\n }\n\n if (mock.response.type === \"list\") {\n (observer.next as (v: typeof value) => void)(\n {\n ...value,\n status: \"loaded\",\n resolvedList: mock.response.list,\n isOptimistic: false,\n } as typeof value,\n );\n return;\n }\n }\n }\n\n this.processEmission(\n subscriptionId,\n signature,\n metadata,\n value.status,\n value.resolvedList !== undefined,\n value.isOptimistic,\n value.resolvedList ? value.resolvedList.length : 0,\n value,\n );\n\n if (value.resolvedList && componentContext) {\n const wrappedList = value.resolvedList.map(\n (obj, index: number) => {\n const osdkObj = obj as OsdkObject;\n const objectKey = `${apiNameStr}:${\n osdkObj.$primaryKey || index\n }`;\n return this.propertyAccessTracker.wrapObject(\n obj,\n objectKey,\n componentContext.id,\n );\n },\n );\n (value as { resolvedList: typeof wrappedList }).resolvedList =\n wrappedList;\n }\n\n (observer.next as (v: typeof value) => void)(value);\n },\n ...cleanupCallbacks,\n };\n\n const unsubscribable = original(\n options,\n wrappedObserver as Parameters<typeof original>[1],\n );\n\n return this.createCleanupUnsubscribable(unsubscribable, subscriptionId);\n }) as ObservableClient[\"observeList\"];\n }\n\n private wrapObserveAggregation(\n original: ObservableClient[\"observeAggregation\"],\n ): ObservableClient[\"observeAggregation\"] {\n return ((\n options: Parameters<ObservableClient[\"observeAggregation\"]>[0],\n observer: AggregationObserver,\n ): Unsubscribable | Promise<Unsubscribable> => {\n const apiNameStr = typeof options.type === \"string\"\n ? options.type\n : options.type.apiName;\n\n const signature = `useOsdkAggregation:${apiNameStr}:${\n JSON.stringify(options.where)\n }:${JSON.stringify(options.aggregate)}`;\n\n const metadata: OperationMetadata = {\n objectType: apiNameStr,\n whereClause: JSON.stringify(options.where ?? {}),\n };\n\n const { componentContext, subscriptionId } = this.setupObservation({\n signature,\n metadata,\n hookType: \"useOsdkAggregation\",\n queryParams: {\n type: \"aggregation\",\n objectType: apiNameStr,\n where: options.where,\n aggregate: options.aggregate,\n },\n });\n\n const mockManager = this.mockManager;\n const cleanupCallbacks = this.createCleanupObserverCallbacks(\n subscriptionId,\n componentContext,\n observer,\n );\n\n const wrappedObserver: AggregationObserver = {\n next: (value) => {\n if (mockManager) {\n const mock = mockManager.findMock({\n type: \"list\",\n objectType: apiNameStr,\n whereClause: options.where as\n | Record<string, unknown>\n | undefined,\n });\n\n if (mock) {\n if (mock.response.type === \"error\") {\n observer.next({\n result: undefined,\n status: \"error\",\n lastUpdated: Date.now(),\n error: new Error(mock.response.error),\n });\n return;\n }\n\n if (\n mock.response.type === \"list\"\n || mock.response.type === \"object\"\n ) {\n const mockData = mock.response.type === \"list\"\n ? mock.response.list\n : mock.response.object;\n observer.next({\n result: mockData,\n status: \"loaded\",\n lastUpdated: Date.now(),\n });\n return;\n }\n }\n }\n\n this.processEmission(\n subscriptionId,\n signature,\n metadata,\n value.status,\n value.result !== undefined,\n false,\n value.result !== undefined ? 1 : 0,\n value,\n );\n\n observer.next(value);\n },\n ...cleanupCallbacks,\n };\n\n const result = original(\n options,\n wrappedObserver as Parameters<typeof original>[1],\n );\n\n if (result instanceof Promise) {\n return result.then(unsub =>\n this.createCleanupUnsubscribable(unsub, subscriptionId)\n );\n }\n\n return this.createCleanupUnsubscribable(result, subscriptionId);\n }) as ObservableClient[\"observeAggregation\"];\n }\n\n private wrapObserveLinks(\n original: NonNullable<ExtendedObservableClient[\"observeLinks\"]>,\n ): ExtendedObservableClient[\"observeLinks\"] {\n return ((\n sourceObject: OsdkObject,\n linkName: string,\n options: Record<string, unknown>,\n observer: ObserveLinksObserver,\n ): Unsubscribable => {\n const componentContext = this.captureComponentContext\n ? componentContextCapture.captureNow()\n : null;\n\n const sourceObjectKey =\n `${sourceObject.$apiName}:${sourceObject.$primaryKey}`;\n const signature = `links:${sourceObjectKey}:${linkName}`;\n\n if (componentContext && this.captureQueryParams) {\n this.componentRegistry.registerBinding({\n componentId: componentContext.id,\n componentName: componentContext.name,\n componentDisplayName: componentContext.displayName,\n hookType: \"useLinks\",\n hookIndex: 0,\n querySignature: signature,\n queryParams: {\n type: \"links\",\n sourceObject: sourceObjectKey,\n linkName,\n },\n });\n }\n\n this.linkTraversalTracker.recordTraversal({\n sourceObjectType: sourceObject.$apiName,\n sourceObjectKey: String(sourceObject.$primaryKey),\n linkName,\n timestamp: Date.now(),\n componentId: componentContext?.id,\n subscriptionId: signature,\n });\n\n const wrappedObserver: ObserveLinksObserver = {\n next: (\n value: ObserveObjectsCallbackArgs<\n ObjectTypeDefinition | InterfaceDefinition\n >,\n ) => {\n this.recordMockHitIfNeeded(value, signature);\n this.recordEmissionEvent(signature);\n\n if (value.resolvedList && componentContext) {\n const linkedObjects: Array<\n { objectType: string; primaryKey: string }\n > = [];\n const wrappedList = value.resolvedList.map((obj) => {\n const osdkObj = obj as OsdkObject;\n linkedObjects.push({\n objectType: osdkObj.$apiName,\n primaryKey: String(osdkObj.$primaryKey),\n });\n return this.propertyAccessTracker.wrapObject(\n obj,\n `${osdkObj.$apiName}:${osdkObj.$primaryKey}`,\n componentContext.id,\n );\n });\n this.linkTraversalTracker.recordLinkedObjects({\n subscriptionId: signature,\n linkName,\n objects: linkedObjects,\n });\n (value as { resolvedList: typeof wrappedList }).resolvedList =\n wrappedList;\n }\n\n observer.next(value);\n },\n error: (err: unknown) => observer.error(err),\n complete: () => observer.complete(),\n };\n\n return original(sourceObject, linkName, options, wrappedObserver);\n }) as ExtendedObservableClient[\"observeLinks\"];\n }\n\n private wrapApplyAction(\n original: ObservableClient[\"applyAction\"],\n ): ObservableClient[\"applyAction\"] {\n return async (actionDef, args, options) => {\n const actionName = typeof actionDef === \"string\"\n ? actionDef\n : actionDef.apiName;\n const signature = `action:${actionName}`;\n\n const metadata: OperationMetadata = {\n actionName,\n };\n\n if (this.mockManager) {\n const mock = this.mockManager.findMock({\n type: \"action\",\n actionName,\n });\n\n if (mock) {\n if (mock.delay) {\n await new Promise((resolve) => setTimeout(resolve, mock.delay));\n }\n\n if (mock.response.type === \"passthrough\") {\n let actualArgs = args;\n if (mock.usePayload && mock.payload) {\n try {\n const payloadData = JSON.parse(mock.payload);\n actualArgs = payloadData.parameters || args;\n } catch {\n }\n }\n\n try {\n const result = await original(actionDef, actualArgs, options);\n return result;\n } catch (error) {\n this.captureActionError(actionName, error, actualArgs);\n throw error;\n }\n } else if (mock.response.type === \"error\") {\n throw new Error(mock.response.error);\n } else if (mock.response.type === \"action\") {\n const mockResult = mock.response.result;\n\n this.injectMockedObjectsFromActionResult(mock.id, mockResult);\n\n const store = this.wrappedClient\n && hasExperimentalStore(this.wrappedClient)\n ? this.wrappedClient.__experimentalStore\n : undefined;\n\n if (store && isMockActionEdits(mockResult)) {\n const promises: Promise<void>[] = [];\n\n const allObjects = [\n ...(mockResult.addedObjects || []),\n ...(mockResult.modifiedObjects || []),\n ...(mockResult.deletedObjects || []),\n ];\n for (const obj of allObjects) {\n if (store.invalidateObject) {\n promises.push(\n store.invalidateObject(obj.objectType, obj.primaryKey),\n );\n }\n }\n\n for (const objectType of (mockResult.editedObjectTypes || [])) {\n if (store.invalidateObjectType) {\n promises.push(store.invalidateObjectType(objectType));\n }\n }\n\n await Promise.allSettled(promises);\n }\n\n return mockResult as ActionEditResponse;\n }\n }\n }\n\n const componentContext = componentContextCapture.captureNow();\n const hasOptimisticUpdate = Boolean(options?.optimisticUpdate);\n const actionId = this.actionTracker.startAction({\n signature,\n actionName,\n metadata,\n optimisticConfigured: hasOptimisticUpdate,\n componentId: componentContext?.id,\n });\n\n const existingListeners = (options as {\n __debugListeners?: {\n onLayerCreated?(id: unknown): void;\n onLayerCleared?(id: unknown): void;\n onObjectModified?(\n objectType: string,\n primaryKey: string,\n operation: \"update\" | \"create\" | \"delete\",\n ): void;\n onServerObjectsModified?(\n objects: Array<{\n objectType: string;\n primaryKey: string;\n operation: \"update\" | \"create\" | \"delete\";\n }>,\n ): void;\n };\n } | undefined)?.__debugListeners;\n const debugListeners = {\n onLayerCreated: (id: unknown) => {\n this.actionTracker.registerOptimisticLayer(actionId, id);\n existingListeners?.onLayerCreated?.(id);\n },\n onLayerCleared: (id: unknown) => {\n this.actionTracker.handleLayerCleared(id, Date.now());\n existingListeners?.onLayerCleared?.(id);\n },\n onObjectModified: (\n objectType: string,\n primaryKey: string,\n operation: \"update\" | \"create\" | \"delete\",\n ) => {\n if (this.eventTimeline) {\n this.eventTimeline.record({\n type: \"OBJECT_MODIFIED\",\n actionId,\n objectType,\n primaryKey,\n modifiedBy: \"optimistic\",\n timestamp: Date.now(),\n });\n }\n existingListeners?.onObjectModified?.(\n objectType,\n primaryKey,\n operation,\n );\n },\n onServerObjectsModified: (\n objects: Array<{\n objectType: string;\n primaryKey: string;\n operation: \"update\" | \"create\" | \"delete\";\n }>,\n ) => {\n if (this.eventTimeline) {\n const timestamp = Date.now();\n for (const obj of objects) {\n this.eventTimeline.record({\n type: \"OBJECT_MODIFIED\",\n actionId,\n objectType: obj.objectType,\n primaryKey: obj.primaryKey,\n modifiedBy: \"server\",\n timestamp,\n });\n }\n }\n existingListeners?.onServerObjectsModified?.(objects);\n },\n };\n\n if (hasOptimisticUpdate) {\n this.metricsStore.recordOptimisticUpdate(signature, metadata);\n }\n\n const instrumentedOptions = {\n ...(options ?? {}),\n __debugListeners: debugListeners,\n } as Parameters<typeof original>[2];\n\n try {\n const result = await original(actionDef, args, instrumentedOptions);\n this.actionTracker.markActionSettled({\n actionId,\n succeeded: true,\n completedAt: Date.now(),\n });\n return result;\n } catch (error) {\n this.actionTracker.markActionSettled({\n actionId,\n succeeded: false,\n completedAt: Date.now(),\n });\n this.captureActionError(actionName, error, args);\n throw error;\n }\n };\n }\n\n private wrapValidateAction(\n original: ObservableClient[\"validateAction\"],\n ): ObservableClient[\"validateAction\"] {\n return async (actionDef, args) => {\n const actionName = typeof actionDef === \"string\"\n ? actionDef\n : actionDef.apiName;\n const signature = `validate:${actionName}`;\n const metadata: OperationMetadata = { actionName };\n const start = Date.now();\n\n try {\n return await original(actionDef, args);\n } finally {\n const duration = Date.now() - start;\n this.metricsStore.recordActionValidation(\n signature,\n duration,\n metadata,\n );\n }\n };\n }\n\n private captureActionError(\n actionName: string,\n error: unknown,\n args: unknown,\n ): void {\n this.metricsStore.recordActionError({\n id: `${Date.now()}-${Math.random().toString(36).slice(2)}`,\n actionType: actionName,\n timestamp: Date.now(),\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n parameters: args as Record<string, unknown>,\n validationErrors: (error as Record<string, unknown>)\n ?.validationErrors as ActionError[\"validationErrors\"],\n });\n }\n\n private injectMockedObjectsFromActionResult(\n mockId: string,\n mockResult: unknown,\n ): void {\n if (!this.mockManager || !mockResult) {\n return;\n }\n\n const objects = this.extractObjectsFromMockResult(mockResult);\n\n for (const obj of objects) {\n const objectType = obj.$objectType ?? obj.$apiName;\n const primaryKey = obj.$primaryKey ?? obj.id;\n\n if (\n typeof objectType === \"string\"\n && (typeof primaryKey === \"string\" || typeof primaryKey === \"number\")\n ) {\n this.mockManager.injectMockedObjectToCache(\n mockId,\n objectType,\n primaryKey,\n obj,\n );\n }\n }\n }\n\n private extractObjectsFromMockResult(\n mockResult: unknown,\n ): Array<Record<string, unknown>> {\n const objects: Array<Record<string, unknown>> = [];\n\n if (!mockResult || typeof mockResult !== \"object\") {\n return objects;\n }\n\n const result = mockResult as Record<string, unknown>;\n\n if (result.$objectType || result.$apiName) {\n objects.push(result);\n return objects;\n }\n\n if (Array.isArray(mockResult)) {\n for (const item of mockResult) {\n if (\n item && typeof item === \"object\"\n && (item.$objectType || item.$apiName)\n ) {\n objects.push(item);\n }\n }\n return objects;\n }\n\n if (Array.isArray(result.addedObjects)) {\n for (const item of result.addedObjects) {\n if (item && typeof item === \"object\") {\n objects.push(item as Record<string, unknown>);\n }\n }\n }\n if (Array.isArray(result.modifiedObjects)) {\n for (const item of result.modifiedObjects) {\n if (item && typeof item === \"object\") {\n objects.push(item as Record<string, unknown>);\n }\n }\n }\n\n return objects;\n }\n\n getCacheSnapshot(): Promise<CacheSnapshot> {\n if (!this.wrappedClient) {\n return Promise.reject(new Error(\"No wrapped client available\"));\n }\n const ext = this.wrappedClient as ExtendedObservableClient;\n if (!ext.getCacheSnapshot) {\n return Promise.reject(\n new Error(\"getCacheSnapshot not available on client\"),\n );\n }\n return ext.getCacheSnapshot();\n }\n\n invalidateObjects(objects: unknown): Promise<void> {\n if (!this.wrappedClient) {\n return Promise.reject(new Error(\"No wrapped client available\"));\n }\n const ext = this.wrappedClient as ExtendedObservableClient;\n if (!ext.invalidateObjects) {\n return Promise.reject(\n new Error(\"invalidateObjects not available on client\"),\n );\n }\n return ext.invalidateObjects(objects);\n }\n\n invalidateObjectType(objectType: string): Promise<void> {\n if (!this.wrappedClient) {\n return Promise.reject(new Error(\"No wrapped client available\"));\n }\n const ext = this.wrappedClient as ExtendedObservableClient;\n if (!ext.invalidateObjectType) {\n return Promise.reject(\n new Error(\"invalidateObjectType not available on client\"),\n );\n }\n return ext.invalidateObjectType(objectType);\n }\n\n invalidateAll(): Promise<void> {\n if (!this.wrappedClient) {\n return Promise.reject(new Error(\"No wrapped client available\"));\n }\n const ext = this.wrappedClient as ExtendedObservableClient;\n if (!ext.invalidateAll) {\n return Promise.reject(\n new Error(\"invalidateAll not available on client\"),\n );\n }\n return ext.invalidateAll();\n }\n\n private pruneSignatureLastRecorded(): void {\n const now = Date.now();\n for (const [key, timestamp] of this.signatureLastRecorded) {\n if (now - timestamp > this.cleanupIntervalMs) {\n this.signatureLastRecorded.delete(key);\n }\n }\n }\n\n dispose(): void {\n try {\n this.signatureLastRecorded.clear();\n\n if (\n \"dispose\" in this.metricsStore\n && typeof this.metricsStore.dispose === \"function\"\n ) {\n this.metricsStore.dispose();\n }\n\n this.actionTracker.dispose();\n } finally {\n if (this.cleanupIntervalId) {\n clearInterval(this.cleanupIntervalId);\n this.cleanupIntervalId = null;\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,185 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { CacheEfficiencyAnalyzer } from "./CacheEfficiencyAnalyzer.js";
18
+ import { UnusedFieldAnalyzer } from "./UnusedFieldAnalyzer.js";
19
+ import { WaterfallDetector } from "./WaterfallDetector.js";
20
+ export class PerformanceRecommendationEngine {
21
+ dismissedRecommendations = new Set();
22
+ constructor(metricsStore, registry, timeline) {
23
+ this.metricsStore = metricsStore;
24
+ this.registry = registry;
25
+ this.timeline = timeline;
26
+ this.cacheAnalyzer = new CacheEfficiencyAnalyzer(metricsStore);
27
+ this.fieldAnalyzer = new UnusedFieldAnalyzer(registry, undefined);
28
+ this.waterfallDetector = new WaterfallDetector(registry, timeline);
29
+ }
30
+ generateRecommendations(cacheSnapshot) {
31
+ const recommendations = [];
32
+ const waterfalls = this.waterfallDetector.detectWaterfalls();
33
+ for (const wf of waterfalls) {
34
+ const waterfallId = wf.details.childQuery ? `waterfall-${wf.details.parentQuery}->${wf.details.childQuery}` : `waterfall-${wf.details.parentQuery}`;
35
+ if (this.dismissedRecommendations.has(waterfallId)) {
36
+ continue;
37
+ }
38
+ recommendations.push({
39
+ id: waterfallId,
40
+ level: wf.priority === "high" ? "high" : "medium",
41
+ category: "Performance",
42
+ title: `${wf.type === "LINK_WATERFALL" ? "Link" : "Query"} waterfall - ${wf.timeSaved}ms overhead`,
43
+ description: wf.suggestion,
44
+ impact: `Save ${wf.timeSaved}ms on load time`,
45
+ effort: "Low",
46
+ suggestion: wf.suggestion,
47
+ code: wf.code,
48
+ dismissible: true
49
+ });
50
+ }
51
+ const fieldReport = this.fieldAnalyzer.generateGlobalReport(cacheSnapshot);
52
+ for (const offender of fieldReport.topOffenders.slice(0, 3)) {
53
+ if (this.dismissedRecommendations.has(`field-${offender.querySignature}`)) {
54
+ continue;
55
+ }
56
+ recommendations.push({
57
+ id: `field-${offender.querySignature}`,
58
+ level: offender.wastedBytes > 50000 ? "high" : "medium",
59
+ category: "Bandwidth",
60
+ title: `${offender.componentName} fetches unused data`,
61
+ description: `This component fetches ${offender.fetched.length} properties but only uses ${offender.accessed.length}`,
62
+ impact: `Save ${(offender.wastedBytes / 1024).toFixed(1)}KB bandwidth per load`,
63
+ effort: "Low",
64
+ suggestion: "Use $select to only fetch used properties",
65
+ code: offender.suggestion,
66
+ dismissible: true
67
+ });
68
+ }
69
+ const cacheMetrics = this.cacheAnalyzer.analyze(cacheSnapshot);
70
+ for (const rec of cacheMetrics.recommendations) {
71
+ if (this.dismissedRecommendations.has(`cache-${rec.title}`)) {
72
+ continue;
73
+ }
74
+ if (rec.level === "warning" || rec.level === "critical") {
75
+ recommendations.push({
76
+ id: `cache-${rec.title}`,
77
+ level: rec.level === "critical" ? "critical" : "high",
78
+ category: "Cache",
79
+ title: rec.title,
80
+ description: rec.message,
81
+ impact: rec.suggestion,
82
+ effort: "Medium",
83
+ suggestion: rec.suggestion,
84
+ dismissible: true
85
+ });
86
+ }
87
+ }
88
+ const priorityOrder = {
89
+ critical: 5,
90
+ high: 4,
91
+ medium: 3,
92
+ low: 2,
93
+ info: 1
94
+ };
95
+ return recommendations.sort((a, b) => priorityOrder[b.level] - priorityOrder[a.level]).slice(0, 10); // Top 10 recommendations
96
+ }
97
+ calculatePerformanceScore(cacheSnapshot) {
98
+ const waterfalls = this.waterfallDetector.detectWaterfalls();
99
+ const fieldReport = this.fieldAnalyzer.generateGlobalReport(cacheSnapshot);
100
+ const cacheMetrics = this.cacheAnalyzer.analyze(cacheSnapshot);
101
+ const cacheScore = Math.round(cacheMetrics.score);
102
+ const queryScore = Math.round(100 - Math.min(waterfalls.length * 5, 50));
103
+ const bandwidthScore = Math.round(100 - Math.min(fieldReport.totalWastedBytes / 1024 / 100 * 10, 40));
104
+ const codeQualityScore = Math.round(100 - Math.min((1 - fieldReport.averageEfficiency) * 30, 50));
105
+ const overall = Math.round(cacheScore * 0.3 + queryScore * 0.3 + bandwidthScore * 0.2 + codeQualityScore * 0.2);
106
+ const breakdown = {
107
+ waterfalls: {
108
+ penalty: Math.min(waterfalls.length * 5, 30),
109
+ count: waterfalls.length
110
+ },
111
+ fieldEfficiency: {
112
+ penalty: (1 - fieldReport.averageEfficiency) * 20,
113
+ rate: fieldReport.averageEfficiency
114
+ },
115
+ cacheHitRate: {
116
+ penalty: (1 - cacheMetrics.hitRate) * 20,
117
+ rate: cacheMetrics.hitRate
118
+ },
119
+ wastedBandwidth: {
120
+ penalty: Math.min(fieldReport.totalWastedBytes / 10000, 15),
121
+ bytes: fieldReport.totalWastedBytes
122
+ }
123
+ };
124
+ return {
125
+ overall,
126
+ grade: this.scoreToGrade(overall),
127
+ categories: {
128
+ cache: cacheScore,
129
+ queries: queryScore,
130
+ bandwidth: bandwidthScore,
131
+ codeQuality: codeQualityScore
132
+ },
133
+ breakdown
134
+ };
135
+ }
136
+ scoreToGrade(score) {
137
+ if (score >= 90) {
138
+ return "A";
139
+ }
140
+ if (score >= 80) {
141
+ return "B";
142
+ }
143
+ if (score >= 70) {
144
+ return "C";
145
+ }
146
+ if (score >= 60) {
147
+ return "D";
148
+ }
149
+ return "F";
150
+ }
151
+ dismissRecommendation(id) {
152
+ this.dismissedRecommendations.add(id);
153
+ }
154
+ clearDismissed() {
155
+ this.dismissedRecommendations.clear();
156
+ }
157
+ getSummary(cacheSnapshot) {
158
+ const recommendations = this.generateRecommendations(cacheSnapshot);
159
+ const criticalCount = recommendations.filter(r => r.level === "critical").length;
160
+ const lowEffortCount = recommendations.filter(r => r.effort === "Low").length;
161
+ const mediumEffortCount = recommendations.filter(r => r.effort === "Medium").length;
162
+ const highEffortCount = recommendations.filter(r => r.effort === "High").length;
163
+ const minutesToFix = lowEffortCount * 5 + mediumEffortCount * 20 + highEffortCount * 60;
164
+ const timeToFix = minutesToFix < 60 ? `${minutesToFix} minutes` : `${Math.round(minutesToFix / 60)} hours`;
165
+ const totalImpact = recommendations.reduce((sum, r) => {
166
+ if (r.impact.includes("Save")) {
167
+ const match = r.impact.match(/(\d+)(ms|KB|s)/);
168
+ if (match) {
169
+ const value = parseInt(match[1]);
170
+ const unit = match[2];
171
+ return sum + (unit === "ms" ? value : unit === "KB" ? value / 100 : value * 1000);
172
+ }
173
+ }
174
+ return sum;
175
+ }, 0);
176
+ const estimatedImprovement = totalImpact > 1000 ? `~${(totalImpact / 1000).toFixed(1)}s improvement` : `~${Math.round(totalImpact)}ms improvement`;
177
+ return {
178
+ issueCount: recommendations.length,
179
+ criticalCount,
180
+ timeToFix,
181
+ estimatedImprovement
182
+ };
183
+ }
184
+ }
185
+ //# sourceMappingURL=PerformanceRecommendationEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerformanceRecommendationEngine.js","names":["CacheEfficiencyAnalyzer","UnusedFieldAnalyzer","WaterfallDetector","PerformanceRecommendationEngine","dismissedRecommendations","Set","constructor","metricsStore","registry","timeline","cacheAnalyzer","fieldAnalyzer","undefined","waterfallDetector","generateRecommendations","cacheSnapshot","recommendations","waterfalls","detectWaterfalls","wf","waterfallId","details","childQuery","parentQuery","has","push","id","level","priority","category","title","type","timeSaved","description","suggestion","impact","effort","code","dismissible","fieldReport","generateGlobalReport","offender","topOffenders","slice","querySignature","wastedBytes","componentName","fetched","length","accessed","toFixed","cacheMetrics","analyze","rec","message","priorityOrder","critical","high","medium","low","info","sort","a","b","calculatePerformanceScore","cacheScore","Math","round","score","queryScore","min","bandwidthScore","totalWastedBytes","codeQualityScore","averageEfficiency","overall","breakdown","penalty","count","fieldEfficiency","rate","cacheHitRate","hitRate","wastedBandwidth","bytes","grade","scoreToGrade","categories","cache","queries","bandwidth","codeQuality","dismissRecommendation","add","clearDismissed","clear","getSummary","criticalCount","filter","r","lowEffortCount","mediumEffortCount","highEffortCount","minutesToFix","timeToFix","totalImpact","reduce","sum","includes","match","value","parseInt","unit","estimatedImprovement","issueCount"],"sources":["PerformanceRecommendationEngine.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 { CacheSnapshot } from \"@osdk/client/observable\";\nimport type { MetricsStore } from \"../store/MetricsStore.js\";\nimport { CacheEfficiencyAnalyzer } from \"./CacheEfficiencyAnalyzer.js\";\nimport type { ComponentQueryRegistry } from \"./ComponentQueryRegistry.js\";\nimport type { EventTimeline } from \"./EventTimeline.js\";\nimport { UnusedFieldAnalyzer } from \"./UnusedFieldAnalyzer.js\";\nimport { WaterfallDetector } from \"./WaterfallDetector.js\";\n\nexport type RecommendationLevel =\n | \"critical\"\n | \"high\"\n | \"medium\"\n | \"low\"\n | \"info\";\nexport type RecommendationCategory =\n | \"Performance\"\n | \"Bandwidth\"\n | \"Code Quality\"\n | \"Cache\"\n | \"Queries\";\n\nexport interface Recommendation {\n id: string;\n level: RecommendationLevel;\n category: RecommendationCategory;\n title: string;\n description: string;\n impact: string; // What will improve (e.g., \"Save 50ms on page load\")\n effort: \"Low\" | \"Medium\" | \"High\";\n suggestion: string;\n code?: string;\n dismissible: boolean;\n}\n\nexport interface PerformanceScore {\n overall: number; // 0-100\n grade: \"A\" | \"B\" | \"C\" | \"D\" | \"F\";\n categories: {\n cache: number;\n queries: number;\n bandwidth: number;\n codeQuality: number;\n };\n breakdown: {\n waterfalls: { penalty: number; count: number };\n fieldEfficiency: { penalty: number; rate: number };\n cacheHitRate: { penalty: number; rate: number };\n wastedBandwidth: { penalty: number; bytes: number };\n };\n}\n\nexport class PerformanceRecommendationEngine {\n private cacheAnalyzer: CacheEfficiencyAnalyzer;\n private fieldAnalyzer: UnusedFieldAnalyzer;\n private waterfallDetector: WaterfallDetector;\n private dismissedRecommendations = new Set<string>();\n\n constructor(\n private metricsStore: MetricsStore,\n private registry: ComponentQueryRegistry,\n private timeline: EventTimeline,\n ) {\n this.cacheAnalyzer = new CacheEfficiencyAnalyzer(metricsStore);\n this.fieldAnalyzer = new UnusedFieldAnalyzer(registry, undefined);\n this.waterfallDetector = new WaterfallDetector(registry, timeline);\n }\n\n generateRecommendations(cacheSnapshot: CacheSnapshot): Recommendation[] {\n const recommendations: Recommendation[] = [];\n\n const waterfalls = this.waterfallDetector.detectWaterfalls();\n for (const wf of waterfalls) {\n const waterfallId = wf.details.childQuery\n ? `waterfall-${wf.details.parentQuery}->${wf.details.childQuery}`\n : `waterfall-${wf.details.parentQuery}`;\n\n if (this.dismissedRecommendations.has(waterfallId)) {\n continue;\n }\n\n recommendations.push({\n id: waterfallId,\n level: wf.priority === \"high\" ? \"high\" : \"medium\",\n category: \"Performance\",\n title: `${\n wf.type === \"LINK_WATERFALL\" ? \"Link\" : \"Query\"\n } waterfall - ${wf.timeSaved}ms overhead`,\n description: wf.suggestion,\n impact: `Save ${wf.timeSaved}ms on load time`,\n effort: \"Low\",\n suggestion: wf.suggestion,\n code: wf.code,\n dismissible: true,\n });\n }\n\n const fieldReport = this.fieldAnalyzer.generateGlobalReport(cacheSnapshot);\n for (const offender of fieldReport.topOffenders.slice(0, 3)) {\n if (\n this.dismissedRecommendations.has(`field-${offender.querySignature}`)\n ) {\n continue;\n }\n\n recommendations.push({\n id: `field-${offender.querySignature}`,\n level: offender.wastedBytes > 50000 ? \"high\" : \"medium\",\n category: \"Bandwidth\",\n title: `${offender.componentName} fetches unused data`,\n description:\n `This component fetches ${offender.fetched.length} properties but only uses ${offender.accessed.length}`,\n impact: `Save ${\n (offender.wastedBytes / 1024).toFixed(1)\n }KB bandwidth per load`,\n effort: \"Low\",\n suggestion: \"Use $select to only fetch used properties\",\n code: offender.suggestion,\n dismissible: true,\n });\n }\n\n const cacheMetrics = this.cacheAnalyzer.analyze(cacheSnapshot);\n for (const rec of cacheMetrics.recommendations) {\n if (this.dismissedRecommendations.has(`cache-${rec.title}`)) {\n continue;\n }\n\n if (rec.level === \"warning\" || rec.level === \"critical\") {\n recommendations.push({\n id: `cache-${rec.title}`,\n level: rec.level === \"critical\" ? \"critical\" : \"high\",\n category: \"Cache\",\n title: rec.title,\n description: rec.message,\n impact: rec.suggestion,\n effort: \"Medium\",\n suggestion: rec.suggestion,\n dismissible: true,\n });\n }\n }\n\n const priorityOrder: Record<RecommendationLevel, number> = {\n critical: 5,\n high: 4,\n medium: 3,\n low: 2,\n info: 1,\n };\n\n return recommendations\n .sort((a, b) => priorityOrder[b.level] - priorityOrder[a.level])\n .slice(0, 10); // Top 10 recommendations\n }\n\n calculatePerformanceScore(cacheSnapshot: CacheSnapshot): PerformanceScore {\n const waterfalls = this.waterfallDetector.detectWaterfalls();\n const fieldReport = this.fieldAnalyzer.generateGlobalReport(cacheSnapshot);\n const cacheMetrics = this.cacheAnalyzer.analyze(cacheSnapshot);\n\n const cacheScore = Math.round(cacheMetrics.score);\n const queryScore = Math.round(\n 100 - Math.min(waterfalls.length * 5, 50),\n );\n const bandwidthScore = Math.round(\n 100 - Math.min((fieldReport.totalWastedBytes / 1024 / 100) * 10, 40),\n );\n const codeQualityScore = Math.round(\n 100 - Math.min((1 - fieldReport.averageEfficiency) * 30, 50),\n );\n\n const overall = Math.round(\n cacheScore * 0.3\n + queryScore * 0.3\n + bandwidthScore * 0.2\n + codeQualityScore * 0.2,\n );\n\n const breakdown = {\n waterfalls: {\n penalty: Math.min(waterfalls.length * 5, 30),\n count: waterfalls.length,\n },\n fieldEfficiency: {\n penalty: (1 - fieldReport.averageEfficiency) * 20,\n rate: fieldReport.averageEfficiency,\n },\n cacheHitRate: {\n penalty: (1 - cacheMetrics.hitRate) * 20,\n rate: cacheMetrics.hitRate,\n },\n wastedBandwidth: {\n penalty: Math.min(fieldReport.totalWastedBytes / 10000, 15),\n bytes: fieldReport.totalWastedBytes,\n },\n };\n\n return {\n overall,\n grade: this.scoreToGrade(overall),\n categories: {\n cache: cacheScore,\n queries: queryScore,\n bandwidth: bandwidthScore,\n codeQuality: codeQualityScore,\n },\n breakdown,\n };\n }\n\n private scoreToGrade(score: number): \"A\" | \"B\" | \"C\" | \"D\" | \"F\" {\n if (score >= 90) {\n return \"A\";\n }\n if (score >= 80) {\n return \"B\";\n }\n if (score >= 70) {\n return \"C\";\n }\n if (score >= 60) {\n return \"D\";\n }\n return \"F\";\n }\n\n dismissRecommendation(id: string): void {\n this.dismissedRecommendations.add(id);\n }\n\n clearDismissed(): void {\n this.dismissedRecommendations.clear();\n }\n\n getSummary(cacheSnapshot: CacheSnapshot): {\n issueCount: number;\n criticalCount: number;\n timeToFix: string;\n estimatedImprovement: string;\n } {\n const recommendations = this.generateRecommendations(cacheSnapshot);\n const criticalCount =\n recommendations.filter(r => r.level === \"critical\").length;\n\n const lowEffortCount =\n recommendations.filter(r => r.effort === \"Low\").length;\n const mediumEffortCount =\n recommendations.filter(r => r.effort === \"Medium\").length;\n const highEffortCount =\n recommendations.filter(r => r.effort === \"High\").length;\n\n const minutesToFix = lowEffortCount * 5 + mediumEffortCount * 20\n + highEffortCount * 60;\n const timeToFix = minutesToFix < 60\n ? `${minutesToFix} minutes`\n : `${Math.round(minutesToFix / 60)} hours`;\n\n const totalImpact = recommendations.reduce((sum, r) => {\n if (r.impact.includes(\"Save\")) {\n const match = r.impact.match(/(\\d+)(ms|KB|s)/);\n if (match) {\n const value = parseInt(match[1]);\n const unit = match[2];\n return sum\n + (unit === \"ms\"\n ? value\n : unit === \"KB\"\n ? value / 100\n : value * 1000);\n }\n }\n return sum;\n }, 0);\n\n const estimatedImprovement = totalImpact > 1000\n ? `~${(totalImpact / 1000).toFixed(1)}s improvement`\n : `~${Math.round(totalImpact)}ms improvement`;\n\n return {\n issueCount: recommendations.length,\n criticalCount,\n timeToFix,\n estimatedImprovement,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,238 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { CircularBuffer } from "./CircularBuffer.js";
18
+ export class PropertyAccessTracker {
19
+ componentRenderCycles = new Map();
20
+ wrappedObjects = new WeakMap();
21
+ maxAccesses = 10000;
22
+ maxProxyDepth = 5;
23
+ eventTimeline = null;
24
+ componentNames = new Map();
25
+ componentRenders = new Map();
26
+ componentAccessesPerRender = new Map();
27
+ constructor() {
28
+ this.accesses = new CircularBuffer(this.maxAccesses);
29
+ }
30
+ wrapObject(obj, objectKey, componentId, depth = 0) {
31
+ if (this.wrappedObjects.has(obj)) {
32
+ return obj;
33
+ }
34
+ const renderCycle = this.componentRenderCycles.get(componentId) || 0;
35
+ const proxy = new Proxy(obj, {
36
+ get: (target, prop, receiver) => {
37
+ if (typeof prop === "string" && !prop.startsWith("$")) {
38
+ this.recordAccess({
39
+ componentId,
40
+ objectKey,
41
+ property: prop,
42
+ timestamp: Date.now(),
43
+ renderCycle
44
+ });
45
+ }
46
+ const value = Reflect.get(target, prop, receiver);
47
+ if (typeof prop === "string") {
48
+ const descriptor = Object.getOwnPropertyDescriptor(target, prop);
49
+ if (descriptor && !descriptor.configurable) {
50
+ return value;
51
+ }
52
+ }
53
+ if (value && typeof value === "object" && !Array.isArray(value) && typeof prop === "string" && !prop.startsWith("$") && depth < this.maxProxyDepth) {
54
+ return this.wrapObject(value, `${objectKey}.${prop}`, componentId, depth + 1);
55
+ }
56
+ return value;
57
+ }
58
+ });
59
+ this.wrappedObjects.set(proxy, objectKey);
60
+ return proxy;
61
+ }
62
+ recordAccess(event) {
63
+ this.accesses.push(event);
64
+ if (this.eventTimeline) {
65
+ this.eventTimeline.record({
66
+ type: "PROPERTY_ACCESS",
67
+ componentId: event.componentId,
68
+ objectKey: event.objectKey,
69
+ property: event.property,
70
+ timestamp: event.timestamp,
71
+ renderCycle: event.renderCycle
72
+ });
73
+ }
74
+ }
75
+ setEventTimeline(timeline) {
76
+ this.eventTimeline = timeline;
77
+ }
78
+ incrementRenderCycle(componentId) {
79
+ const current = this.componentRenderCycles.get(componentId) || 0;
80
+ this.componentRenderCycles.set(componentId, current + 1);
81
+ const renders = this.componentRenders.get(componentId) || 0;
82
+ this.componentRenders.set(componentId, renders + 1);
83
+ }
84
+ registerComponent(componentId, componentName) {
85
+ this.componentNames.set(componentId, componentName);
86
+ }
87
+ getAccessedProperties(componentId, objectKey) {
88
+ const properties = new Set();
89
+ for (const access of this.accesses.toArray()) {
90
+ if (access.componentId === componentId && access.objectKey === objectKey) {
91
+ properties.add(access.property);
92
+ }
93
+ }
94
+ return properties;
95
+ }
96
+ getUnusedPropertiesForObject(componentId, objectKey, availableProperties) {
97
+ const accessed = this.getAccessedProperties(componentId, objectKey);
98
+ return availableProperties.filter(prop => !accessed.has(prop));
99
+ }
100
+ findWastedRenders(componentId) {
101
+ const objectAccesses = new Map();
102
+ for (const access of this.accesses.toArray()) {
103
+ if (access.componentId === componentId && access.renderCycle != null) {
104
+ const key = access.objectKey;
105
+ if (!objectAccesses.has(key)) {
106
+ objectAccesses.set(key, {
107
+ accessedProperties: new Set(),
108
+ renderCycles: new Set()
109
+ });
110
+ }
111
+ const data = objectAccesses.get(key);
112
+ if (data) {
113
+ data.accessedProperties.add(access.property);
114
+ data.renderCycles.add(access.renderCycle);
115
+ }
116
+ }
117
+ }
118
+ return Array.from(objectAccesses.entries()).map(([objectKey, data]) => {
119
+ const totalRenders = data.renderCycles.size;
120
+ const propertiesAccessed = data.accessedProperties.size;
121
+ const wastedRenders = Math.max(0, totalRenders - propertiesAccessed);
122
+ return {
123
+ objectKey,
124
+ accessedProperties: data.accessedProperties,
125
+ renderCycles: data.renderCycles,
126
+ wastedRenders
127
+ };
128
+ });
129
+ }
130
+ getRecentAccesses(limit = 100) {
131
+ return this.accesses.getLast(limit).slice();
132
+ }
133
+ getAccessesByComponent(componentId) {
134
+ return this.accesses.toArray().filter(a => a.componentId === componentId);
135
+ }
136
+ getAccessesByObject(objectKey) {
137
+ return this.accesses.toArray().filter(a => a.objectKey === objectKey);
138
+ }
139
+ getAccessFrequency(componentId, objectKey) {
140
+ const frequency = new Map();
141
+ for (const access of this.accesses.toArray()) {
142
+ if (access.componentId === componentId && access.objectKey === objectKey) {
143
+ frequency.set(access.property, (frequency.get(access.property) || 0) + 1);
144
+ }
145
+ }
146
+ return frequency;
147
+ }
148
+ clear() {
149
+ this.accesses.clear();
150
+ this.componentRenderCycles.clear();
151
+ }
152
+ clearComponent(componentId) {
153
+ const remaining = this.accesses.toArray().filter(a => a.componentId !== componentId);
154
+ this.accesses.clear();
155
+ for (const item of remaining) {
156
+ this.accesses.push(item);
157
+ }
158
+ this.componentRenderCycles.delete(componentId);
159
+ }
160
+ getStats() {
161
+ const componentCounts = new Map();
162
+ const objectCounts = new Map();
163
+ const propertyCounts = new Map();
164
+ for (const access of this.accesses.toArray()) {
165
+ componentCounts.set(access.componentId, (componentCounts.get(access.componentId) || 0) + 1);
166
+ objectCounts.set(access.objectKey, (objectCounts.get(access.objectKey) || 0) + 1);
167
+ propertyCounts.set(access.property, (propertyCounts.get(access.property) || 0) + 1);
168
+ }
169
+ return {
170
+ totalAccesses: this.accesses.getSize(),
171
+ uniqueComponents: componentCounts.size,
172
+ uniqueObjects: objectCounts.size,
173
+ uniqueProperties: propertyCounts.size,
174
+ mostAccessedProperties: Array.from(propertyCounts.entries()).sort((a, b) => b[1] - a[1]).slice(0, 10),
175
+ trackedComponents: this.componentRenderCycles.size
176
+ };
177
+ }
178
+ getWastedRenders() {
179
+ const wastedRenders = [];
180
+ const componentRenderAccess = new Map();
181
+ for (const access of this.accesses.toArray()) {
182
+ if (access.renderCycle != null) {
183
+ if (!componentRenderAccess.has(access.componentId)) {
184
+ componentRenderAccess.set(access.componentId, new Set());
185
+ }
186
+ const renderSet = componentRenderAccess.get(access.componentId);
187
+ if (renderSet) {
188
+ renderSet.add(access.renderCycle);
189
+ }
190
+ }
191
+ }
192
+ for (const [componentId, totalRenders] of this.componentRenders) {
193
+ const rendersWithAccess = componentRenderAccess.get(componentId)?.size || 0;
194
+ const wastedCount = totalRenders - rendersWithAccess;
195
+ if (wastedCount > 0 && totalRenders > 5) {
196
+ wastedRenders.push({
197
+ componentId,
198
+ componentName: this.componentNames.get(componentId) || componentId,
199
+ count: wastedCount,
200
+ timestamp: Date.now()
201
+ });
202
+ }
203
+ }
204
+ return wastedRenders;
205
+ }
206
+ getUnusedProperties() {
207
+ const unused = [];
208
+ const componentPropertyAccess = new Map();
209
+ for (const access of this.accesses.toArray()) {
210
+ const key = access.componentId;
211
+ if (!componentPropertyAccess.has(key)) {
212
+ componentPropertyAccess.set(key, new Map());
213
+ }
214
+ const propMap = componentPropertyAccess.get(key);
215
+ if (propMap) {
216
+ propMap.set(access.property, (propMap.get(access.property) || 0) + 1);
217
+ }
218
+ }
219
+ for (const [componentId, propMap] of componentPropertyAccess) {
220
+ const totalRenders = this.componentRenders.get(componentId) || 0;
221
+ if (totalRenders > 5) {
222
+ for (const [property, accessCount] of propMap) {
223
+ if (accessCount < totalRenders * 0.1) {
224
+ unused.push({
225
+ componentId,
226
+ componentName: this.componentNames.get(componentId) || componentId,
227
+ propertyName: property,
228
+ totalRenders,
229
+ accessCount
230
+ });
231
+ }
232
+ }
233
+ }
234
+ }
235
+ return unused;
236
+ }
237
+ }
238
+ //# sourceMappingURL=PropertyAccessTracker.js.map