@oneuptime/common 14.0.2 → 14.0.5

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 (765) hide show
  1. package/Models/DatabaseModels/Alert.ts +55 -0
  2. package/Models/DatabaseModels/AlertFeed.ts +2 -0
  3. package/Models/DatabaseModels/DatabaseServer.ts +1650 -0
  4. package/Models/DatabaseModels/DatabaseServerEndpoint.ts +540 -0
  5. package/Models/DatabaseModels/DatabaseServerFeed.ts +625 -0
  6. package/Models/DatabaseModels/DatabaseServerLabelRule.ts +514 -0
  7. package/Models/DatabaseModels/DatabaseServerOwnerRule.ts +596 -0
  8. package/Models/DatabaseModels/DatabaseServerOwnerTeam.ts +491 -0
  9. package/Models/DatabaseModels/DatabaseServerOwnerUser.ts +490 -0
  10. package/Models/DatabaseModels/Incident.ts +55 -0
  11. package/Models/DatabaseModels/IncidentAlert.ts +540 -0
  12. package/Models/DatabaseModels/IncidentFeed.ts +2 -0
  13. package/Models/DatabaseModels/Index.ts +18 -0
  14. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +26 -0
  15. package/Models/DatabaseModels/Project.ts +60 -0
  16. package/Models/DatabaseModels/RumApplication.ts +52 -1
  17. package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
  18. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  19. package/Models/DatabaseModels/UserProjectSsoConsent.ts +146 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.ts +28 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.ts +89 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.ts +673 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.ts +51 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  25. package/Server/Middleware/MultipartFormData.ts +1 -1
  26. package/Server/Middleware/TelemetryIngest.ts +15 -8
  27. package/Server/Services/AlertReminderRuleService.ts +100 -24
  28. package/Server/Services/DatabaseServerEndpointService.ts +895 -0
  29. package/Server/Services/DatabaseServerFeedService.ts +128 -0
  30. package/Server/Services/DatabaseServerLabelRuleEngineService.ts +340 -0
  31. package/Server/Services/DatabaseServerLabelRuleService.ts +14 -0
  32. package/Server/Services/DatabaseServerOwnerRuleEngineService.ts +425 -0
  33. package/Server/Services/DatabaseServerOwnerRuleService.ts +14 -0
  34. package/Server/Services/DatabaseServerOwnerTeamService.ts +180 -0
  35. package/Server/Services/DatabaseServerOwnerUserService.ts +173 -0
  36. package/Server/Services/DatabaseServerService.ts +4546 -0
  37. package/Server/Services/DatabaseService.ts +14 -8
  38. package/Server/Services/DockerResourceService.ts +43 -2
  39. package/Server/Services/IncidentAlertService.ts +1811 -0
  40. package/Server/Services/IncidentReminderRuleService.ts +103 -23
  41. package/Server/Services/IncidentService.ts +210 -10
  42. package/Server/Services/IncidentStateTimelineService.ts +24 -0
  43. package/Server/Services/Index.ts +18 -0
  44. package/Server/Services/InventoryItemService.ts +113 -5
  45. package/Server/Services/IoTDeviceService.ts +145 -37
  46. package/Server/Services/OpenTelemetryIngestService.ts +19 -0
  47. package/Server/Services/PodmanResourceService.ts +43 -2
  48. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
  49. package/Server/Services/ServiceService.ts +1 -1
  50. package/Server/Services/TelemetryUsageBillingService.ts +29 -2
  51. package/Server/Services/UserProjectSsoConsentService.ts +74 -0
  52. package/Server/Services/UserService.ts +14 -1
  53. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
  54. package/Server/Types/Database/QueryHelper.ts +30 -1
  55. package/Server/Utils/AI/Toolbox/ResourceTools.ts +69 -1
  56. package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
  57. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +188 -6
  58. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  59. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2262 -755
  60. package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
  61. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
  62. package/Server/Utils/Monitor/MonitorResource.ts +47 -11
  63. package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
  64. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
  65. package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
  66. package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
  67. package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
  68. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  69. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +24 -2
  70. package/Server/Utils/StartServer.ts +26 -6
  71. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  72. package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
  73. package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
  74. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
  75. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
  76. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
  77. package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
  78. package/Server/Utils/Telemetry/Telemetry.ts +16 -0
  79. package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
  80. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
  81. package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
  82. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
  83. package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
  84. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
  85. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
  86. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
  87. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
  88. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
  89. package/Tests/App/Dashboard/BulkIncidentLinkActions.test.tsx +869 -0
  90. package/Tests/App/Dashboard/CephMetricTooltips.test.tsx +1777 -0
  91. package/Tests/App/Dashboard/CloudFleetSummary.test.ts +8 -0
  92. package/Tests/App/Dashboard/CloudMetricTooltips.test.tsx +887 -0
  93. package/Tests/App/Dashboard/ContainerHostMetricTooltips.test.tsx +1309 -0
  94. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
  95. package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
  96. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
  97. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
  98. package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
  99. package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
  100. package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
  101. package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
  102. package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
  103. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
  104. package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
  105. package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
  106. package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
  107. package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
  108. package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
  109. package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
  110. package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
  111. package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
  112. package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
  113. package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
  114. package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
  115. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
  116. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
  117. package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
  118. package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
  119. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
  120. package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
  121. package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +39 -0
  122. package/Tests/App/Dashboard/DockerSwarmClustersListTooltips.test.tsx +414 -0
  123. package/Tests/App/Dashboard/DockerSwarmMetricTooltips.test.ts +796 -0
  124. package/Tests/App/Dashboard/DockerSwarmOverviewTooltips.test.tsx +747 -0
  125. package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
  126. package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
  127. package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +38 -18
  128. package/Tests/App/Dashboard/HostDetailViewTooltips.test.tsx +725 -0
  129. package/Tests/App/Dashboard/HostListColumnTooltips.test.tsx +472 -0
  130. package/Tests/App/Dashboard/HostMetricTooltips.test.ts +709 -0
  131. package/Tests/App/Dashboard/HostOverviewTooltips.test.tsx +698 -0
  132. package/Tests/App/Dashboard/HostTooltipHarness.ts +124 -0
  133. package/Tests/App/Dashboard/HostsListTooltips.test.tsx +395 -0
  134. package/Tests/App/Dashboard/IncidentAlertLinkDialog.test.tsx +691 -0
  135. package/Tests/App/Dashboard/IncidentAlertLinkHelpers.test.ts +458 -0
  136. package/Tests/App/Dashboard/IncidentAlertLinkPages.test.tsx +828 -0
  137. package/Tests/App/Dashboard/IncidentAlertLinkSideMenus.test.tsx +231 -0
  138. package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +689 -0
  139. package/Tests/App/Dashboard/IoTMetricTooltips.test.tsx +1123 -0
  140. package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +837 -0
  141. package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +699 -0
  142. package/Tests/App/Dashboard/KubernetesContainersTabTooltips.test.tsx +320 -0
  143. package/Tests/App/Dashboard/KubernetesCostTooltips.test.tsx +502 -0
  144. package/Tests/App/Dashboard/KubernetesInsightsTooltips.test.tsx +222 -0
  145. package/Tests/App/Dashboard/KubernetesResourceMetricTooltips.test.ts +561 -0
  146. package/Tests/App/Dashboard/KubernetesResourcePagesTooltips.test.tsx +1168 -0
  147. package/Tests/App/Dashboard/LinkIncidentAlertModal.test.tsx +154 -0
  148. package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
  149. package/Tests/App/Dashboard/MetricDescriptionRules.ts +170 -0
  150. package/Tests/App/Dashboard/MetricDescriptionsCatalog.test.ts +206 -0
  151. package/Tests/App/Dashboard/MetricDescriptionsConsistency.test.ts +275 -0
  152. package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
  153. package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
  154. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
  155. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
  156. package/Tests/App/Dashboard/NetworkDeviceTooltips.test.tsx +852 -0
  157. package/Tests/App/Dashboard/NetworkDiagnosticsTooltips.test.tsx +556 -0
  158. package/Tests/App/Dashboard/NetworkMetricTooltips.test.ts +1348 -0
  159. package/Tests/App/Dashboard/NetworkSiteTooltips.test.tsx +679 -0
  160. package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
  161. package/Tests/App/Dashboard/ProxmoxMetricTooltips.test.ts +592 -0
  162. package/Tests/App/Dashboard/ProxmoxOverviewTooltips.test.tsx +1002 -0
  163. package/Tests/App/Dashboard/ProxmoxResourcePageTooltips.test.tsx +923 -0
  164. package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
  165. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
  166. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  167. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
  168. package/Tests/App/Dashboard/ResourceOverviewTileTooltips.test.tsx +1066 -0
  169. package/Tests/App/Dashboard/RumOverviewPage.test.tsx +1195 -0
  170. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
  171. package/Tests/App/Dashboard/ServerlessMetricTooltips.test.tsx +474 -0
  172. package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
  173. package/Tests/App/Dashboard/ServiceMetricTooltips.test.tsx +772 -0
  174. package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +56 -1
  175. package/Tests/App/Dashboard/TelemetryMetricsSignals.test.ts +1207 -0
  176. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
  177. package/Tests/App/Dashboard/TelemetryResourceTabTooltips.test.tsx +437 -0
  178. package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
  179. package/Tests/App/Dashboard/VMwareMetricTooltips.test.ts +801 -0
  180. package/Tests/App/Dashboard/VMwareOverviewTooltips.test.tsx +601 -0
  181. package/Tests/App/Dashboard/VMwareResourcePagesTooltips.test.tsx +646 -0
  182. package/Tests/App/Dashboard/VMwareTooltipHarness.ts +145 -0
  183. package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
  184. package/Tests/ClassStrings.ts +178 -0
  185. package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
  186. package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
  187. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
  188. package/Tests/Models/DatabaseModels/IncidentAlertModel.test.ts +554 -0
  189. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
  190. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +117 -0
  191. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  192. package/Tests/RenderedMarkup.ts +518 -0
  193. package/Tests/ResponsiveVisibility.test.ts +490 -4
  194. package/Tests/ResponsiveVisibility.ts +505 -52
  195. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  196. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
  197. package/Tests/Server/Infrastructure/Postgres/AddIncidentAlertMigration.test.ts +341 -0
  198. package/Tests/Server/Infrastructure/Postgres/AddSessionReplaySameOriginTracePropagationMigration.test.ts +247 -0
  199. package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
  200. package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
  201. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
  202. package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
  203. package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
  204. package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
  205. package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
  206. package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
  207. package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
  208. package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
  209. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
  210. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
  211. package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
  212. package/Tests/Server/Services/IncidentAlertPostgres.test.ts +903 -0
  213. package/Tests/Server/Services/IncidentAlertRegistration.test.ts +96 -0
  214. package/Tests/Server/Services/IncidentAlertService.test.ts +2225 -0
  215. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
  216. package/Tests/Server/Services/IncidentAlertStateCascade.test.ts +970 -0
  217. package/Tests/Server/Services/IncidentCreateFromAlerts.test.ts +1284 -0
  218. package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
  219. package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
  220. package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
  221. package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
  222. package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
  223. package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
  224. package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
  225. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
  226. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
  227. package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
  228. package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
  229. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
  230. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  231. package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
  232. package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
  233. package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
  234. package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
  235. package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
  236. package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
  237. package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
  238. package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
  239. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
  240. package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
  241. package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
  242. package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
  243. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
  244. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
  245. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
  246. package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
  247. package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
  248. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
  249. package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
  250. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
  251. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
  252. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1719 -0
  253. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
  254. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
  255. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
  256. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
  257. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
  258. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
  259. package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
  260. package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
  261. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
  262. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
  263. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
  264. package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
  265. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
  266. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
  267. package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
  268. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
  269. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
  270. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
  271. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +103 -0
  272. package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
  273. package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
  274. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
  275. package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
  276. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
  277. package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
  278. package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
  279. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
  280. package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
  281. package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
  282. package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
  283. package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
  284. package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
  285. package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
  286. package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
  287. package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
  288. package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
  289. package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
  290. package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
  291. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
  292. package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
  293. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +298 -0
  294. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +271 -0
  295. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
  296. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
  297. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
  298. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
  299. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
  300. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
  301. package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +181 -0
  302. package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
  303. package/Tests/Types/Rum/WebVitals.test.ts +173 -0
  304. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
  305. package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
  306. package/Tests/UI/Components/Card.test.tsx +93 -2
  307. package/Tests/UI/Components/FeedOptions.test.ts +6 -0
  308. package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
  309. package/Tests/UI/Components/FieldLabelInfoCardTooltip.test.tsx +413 -0
  310. package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
  311. package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
  312. package/Tests/UI/Components/InfoTooltip.test.tsx +242 -0
  313. package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
  314. package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
  315. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +207 -3
  316. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDeleteVerb.test.tsx +367 -0
  317. package/Tests/UI/Components/ModelTable/BaseModelTableCreateButtonTitle.test.tsx +275 -0
  318. package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
  319. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  320. package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
  321. package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
  322. package/Tests/UI/Components/TableHeaderTooltip.test.tsx +662 -0
  323. package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
  324. package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
  325. package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +166 -9
  326. package/Tests/UI/Rum/RecordingHealthTooltips.test.tsx +447 -0
  327. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +164 -0
  328. package/Tests/UI/Rum/ReplayFrameCapture.test.ts +6750 -0
  329. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
  330. package/Tests/UI/Rum/ReplayRail.test.tsx +723 -12
  331. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +86 -0
  332. package/Tests/UI/Rum/ReplayScreenshot.test.ts +2124 -0
  333. package/Tests/UI/Rum/ReplayScreenshotActions.test.tsx +3288 -0
  334. package/Tests/UI/Rum/ReplayStage.test.tsx +62 -0
  335. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +983 -2
  336. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
  337. package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +149 -0
  338. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +107 -6
  339. package/Tests/UI/Rum/SessionReplayUsersTableTooltips.test.tsx +330 -0
  340. package/Tests/UI/Rum/UserFlowTooltips.test.tsx +886 -0
  341. package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
  342. package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
  343. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +80 -0
  344. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +23 -0
  345. package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
  346. package/Tests/UI/Utils/Navigation.test.ts +102 -0
  347. package/Tests/UI/Utils/PermissionGate.test.ts +76 -0
  348. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
  349. package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +696 -0
  350. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  351. package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
  352. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
  353. package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
  354. package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
  355. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
  356. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
  357. package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
  358. package/Tests/Utils/Rum/SessionTraceState.test.ts +239 -0
  359. package/Tests/Utils/ValueFormatter.test.ts +50 -0
  360. package/Tests/tsconfig.json +16 -0
  361. package/Types/AI/AIResourceContext.ts +7 -0
  362. package/Types/Dashboard/DashboardTemplates.ts +2 -1
  363. package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
  364. package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
  365. package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
  366. package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
  367. package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
  368. package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
  369. package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
  370. package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
  371. package/Types/Email/EmailTemplateType.ts +1 -0
  372. package/Types/Incident/IncidentAlertLink.ts +38 -0
  373. package/Types/Monitor/CephAlertTemplates.ts +18 -0
  374. package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
  375. package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
  376. package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
  377. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
  378. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
  379. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
  380. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
  381. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
  382. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
  383. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
  384. package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
  385. package/Types/Permission.ts +315 -0
  386. package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
  387. package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
  388. package/Types/Rules/RuleRun.ts +12 -0
  389. package/Types/Rum/SessionReplay.ts +25 -6
  390. package/Types/Rum/WebVitals.ts +52 -0
  391. package/Types/Telemetry/EntityType.ts +23 -0
  392. package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
  393. package/Types/Telemetry/ServiceType.ts +8 -0
  394. package/UI/Components/Banner/Banner.tsx +1 -1
  395. package/UI/Components/Card/Card.tsx +1 -1
  396. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
  397. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  398. package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
  399. package/UI/Components/Date/StartAndEndDate.tsx +5 -5
  400. package/UI/Components/Detail/FieldLabel.tsx +8 -0
  401. package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
  402. package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
  403. package/UI/Components/Forms/BasicForm.tsx +1 -1
  404. package/UI/Components/Header/Header.tsx +1 -1
  405. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
  406. package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
  407. package/UI/Components/InfoCard/InfoCard.tsx +47 -1
  408. package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
  409. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
  410. package/UI/Components/Modal/ModalFooter.tsx +1 -1
  411. package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
  412. package/UI/Components/ModelTable/BaseModelTable.tsx +99 -21
  413. package/UI/Components/ModelTable/Column.ts +5 -0
  414. package/UI/Components/Navbar/NavBar.tsx +9 -2
  415. package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
  416. package/UI/Components/Page/Page.tsx +1 -1
  417. package/UI/Components/Pagination/Pagination.tsx +3 -3
  418. package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
  419. package/UI/Components/SideMenu/SideMenu.tsx +4 -1
  420. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
  421. package/UI/Components/StatusPage/ResourceList.tsx +6 -6
  422. package/UI/Components/Table/TableHeader.tsx +47 -2
  423. package/UI/Components/Table/Types/Column.ts +7 -0
  424. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
  425. package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
  426. package/UI/Components/Tooltip/InfoTooltip.tsx +78 -0
  427. package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
  428. package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
  429. package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
  430. package/UI/Styles/Theme.css +8 -1
  431. package/UI/Utils/Navigation.ts +89 -42
  432. package/UI/Utils/PermissionGate.ts +11 -2
  433. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
  434. package/UI/Utils/TelemetryService.ts +4 -3
  435. package/Utils/Incident/IncidentFromAlerts.ts +516 -0
  436. package/Utils/LabelRuleImportExport.ts +2 -0
  437. package/Utils/MetricUnitUtil.ts +103 -11
  438. package/Utils/Monitor/MetricValueFormatter.ts +66 -13
  439. package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
  440. package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
  441. package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
  442. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
  443. package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
  444. package/Utils/Rum/SessionTraceState.ts +212 -0
  445. package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
  446. package/Utils/Telemetry/EntityKey.ts +176 -0
  447. package/Utils/ValueFormatter.ts +16 -0
  448. package/build/dist/Models/DatabaseModels/Alert.js +54 -0
  449. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  450. package/build/dist/Models/DatabaseModels/AlertFeed.js +2 -0
  451. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  452. package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
  453. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
  454. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
  455. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
  456. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
  457. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
  458. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
  459. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
  460. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
  461. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
  462. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
  463. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
  464. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
  465. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
  466. package/build/dist/Models/DatabaseModels/Incident.js +54 -0
  467. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  468. package/build/dist/Models/DatabaseModels/IncidentAlert.js +553 -0
  469. package/build/dist/Models/DatabaseModels/IncidentAlert.js.map +1 -0
  470. package/build/dist/Models/DatabaseModels/IncidentFeed.js +2 -0
  471. package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
  472. package/build/dist/Models/DatabaseModels/Index.js +18 -0
  473. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  474. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  475. package/build/dist/Models/DatabaseModels/Project.js +62 -0
  476. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  477. package/build/dist/Models/DatabaseModels/RumApplication.js +53 -1
  478. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  479. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
  480. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  481. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  482. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  483. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
  484. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
  485. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.js +20 -0
  486. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.js.map +1 -0
  487. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.js +42 -0
  488. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.js.map +1 -0
  489. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
  490. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
  491. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
  492. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js.map +1 -0
  493. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  494. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  495. package/build/dist/Server/Middleware/MultipartFormData.js +1 -1
  496. package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
  497. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  498. package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
  499. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  500. package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
  501. package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
  502. package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
  503. package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
  504. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
  505. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
  506. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
  507. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
  508. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
  509. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
  510. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
  511. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
  512. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
  513. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
  514. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
  515. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
  516. package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
  517. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
  518. package/build/dist/Server/Services/DatabaseService.js +8 -4
  519. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  520. package/build/dist/Server/Services/DockerResourceService.js +30 -3
  521. package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
  522. package/build/dist/Server/Services/IncidentAlertService.js +1370 -0
  523. package/build/dist/Server/Services/IncidentAlertService.js.map +1 -0
  524. package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
  525. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  526. package/build/dist/Server/Services/IncidentService.js +164 -12
  527. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  528. package/build/dist/Server/Services/IncidentStateTimelineService.js +21 -0
  529. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  530. package/build/dist/Server/Services/Index.js +18 -0
  531. package/build/dist/Server/Services/Index.js.map +1 -1
  532. package/build/dist/Server/Services/InventoryItemService.js +88 -5
  533. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  534. package/build/dist/Server/Services/IoTDeviceService.js +111 -24
  535. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
  536. package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
  537. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  538. package/build/dist/Server/Services/PodmanResourceService.js +30 -3
  539. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
  540. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
  541. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  542. package/build/dist/Server/Services/ServiceService.js +1 -1
  543. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  544. package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
  545. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  546. package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
  547. package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
  548. package/build/dist/Server/Services/UserService.js +13 -1
  549. package/build/dist/Server/Services/UserService.js.map +1 -1
  550. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
  551. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  552. package/build/dist/Server/Types/Database/QueryHelper.js +26 -1
  553. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  554. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +46 -0
  555. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
  556. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
  557. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
  558. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +134 -13
  559. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  560. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
  561. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  562. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
  563. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  564. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  565. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  566. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
  567. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  568. package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
  569. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  570. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
  571. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
  572. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
  573. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  574. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
  575. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
  576. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
  577. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  578. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
  579. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  580. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  581. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  582. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +8 -0
  583. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  584. package/build/dist/Server/Utils/StartServer.js +20 -4
  585. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  586. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  587. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  588. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
  589. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
  590. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
  591. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  592. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
  593. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  594. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
  595. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  596. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
  597. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  598. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
  599. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
  600. package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
  601. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  602. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
  603. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  604. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
  605. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
  606. package/build/dist/Types/AI/AIResourceContext.js +7 -0
  607. package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
  608. package/build/dist/Types/Dashboard/DashboardTemplates.js +2 -1
  609. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  610. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
  611. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
  612. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
  613. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
  614. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
  615. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
  616. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
  617. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
  618. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
  619. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
  620. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
  621. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
  622. package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
  623. package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
  624. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
  625. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
  626. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  627. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  628. package/build/dist/Types/Incident/IncidentAlertLink.js +34 -0
  629. package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -0
  630. package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
  631. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  632. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
  633. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
  634. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
  635. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  636. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
  637. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  638. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
  639. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  640. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
  641. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  642. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
  643. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  644. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
  645. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
  646. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
  647. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
  648. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
  649. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
  650. package/build/dist/Types/Permission.js +276 -0
  651. package/build/dist/Types/Permission.js.map +1 -1
  652. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -0
  653. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  654. package/build/dist/Types/Rules/RuleRun.js +4 -0
  655. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  656. package/build/dist/Types/Rum/WebVitals.js +25 -0
  657. package/build/dist/Types/Rum/WebVitals.js.map +1 -1
  658. package/build/dist/Types/Telemetry/EntityType.js +23 -0
  659. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  660. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
  661. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
  662. package/build/dist/Types/Telemetry/ServiceType.js +8 -0
  663. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  664. package/build/dist/UI/Components/Banner/Banner.js +1 -1
  665. package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
  666. package/build/dist/UI/Components/Card/Card.js +1 -1
  667. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  668. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
  669. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  670. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  671. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  672. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
  673. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  674. package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
  675. package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
  676. package/build/dist/UI/Components/Detail/FieldLabel.js +2 -0
  677. package/build/dist/UI/Components/Detail/FieldLabel.js.map +1 -1
  678. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
  679. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
  680. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
  681. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
  682. package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
  683. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  684. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
  685. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  686. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
  687. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
  688. package/build/dist/UI/Components/InfoCard/InfoCard.js +22 -1
  689. package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
  690. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
  691. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
  692. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
  693. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  694. package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
  695. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  696. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
  697. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  698. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +70 -18
  699. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  700. package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
  701. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  702. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  703. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  704. package/build/dist/UI/Components/Page/Page.js +1 -1
  705. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  706. package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
  707. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  708. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
  709. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
  710. package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
  711. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  712. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
  713. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
  714. package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
  715. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
  716. package/build/dist/UI/Components/Table/TableHeader.js +18 -2
  717. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  718. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
  719. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  720. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
  721. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
  722. package/build/dist/UI/Components/Tooltip/InfoTooltip.js +28 -0
  723. package/build/dist/UI/Components/Tooltip/InfoTooltip.js.map +1 -0
  724. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
  725. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
  726. package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
  727. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  728. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
  729. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
  730. package/build/dist/UI/Utils/Navigation.js +66 -33
  731. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  732. package/build/dist/UI/Utils/PermissionGate.js +4 -2
  733. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  734. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
  735. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
  736. package/build/dist/UI/Utils/TelemetryService.js +3 -2
  737. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  738. package/build/dist/Utils/Incident/IncidentFromAlerts.js +306 -0
  739. package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -0
  740. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  741. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  742. package/build/dist/Utils/MetricUnitUtil.js +77 -13
  743. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  744. package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
  745. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
  746. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
  747. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
  748. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
  749. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
  750. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
  751. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
  752. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
  753. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  754. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
  755. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
  756. package/build/dist/Utils/Rum/SessionTraceState.js +154 -0
  757. package/build/dist/Utils/Rum/SessionTraceState.js.map +1 -0
  758. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
  759. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
  760. package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
  761. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  762. package/build/dist/Utils/ValueFormatter.js +15 -0
  763. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  764. package/package.json +1 -1
  765. package/tsconfig.tests.json +7 -5
@@ -0,0 +1,847 @@
1
+ import {
2
+ afterEach,
3
+ beforeAll,
4
+ beforeEach,
5
+ describe,
6
+ expect,
7
+ test,
8
+ } from "@jest/globals";
9
+ import fs from "fs";
10
+ import path from "path";
11
+ import {
12
+ ClassCandidate,
13
+ collectClassCandidates,
14
+ describeCandidate,
15
+ } from "../ClassStrings";
16
+ import {
17
+ listScanRoots,
18
+ listSourceFiles,
19
+ toRelativePath,
20
+ } from "../ForeignHiddenRuleGuard";
21
+ import { splitVariants } from "../ResponsiveVisibility";
22
+ import { StyleRule, THEME_RULES } from "./Styles/ThemeStylesheet";
23
+
24
+ /*
25
+ * The dark theme brightens the gray text of a hover reveal while its group is
26
+ * hovered: the facet rows' exclude button and the Profiles hint are
27
+ * text-gray-400 at rest, and Theme.css lifts them to the primary text colour
28
+ * on hover, keyed on attribute substrings -
29
+ *
30
+ * html.dark .group:hover [class*="group-hover"][class*="text-gray-"]
31
+ *
32
+ * The foreign `.hidden{display:none !important}` fix rewrote those reveals
33
+ * from `hidden group-hover:flex` to `flex group-[:not(:hover)]:hidden`, which
34
+ * no longer contains "group-hover". Nothing failed: the elements still showed
35
+ * on hover, only in the wrong colour, and only in dark mode. Review caught it
36
+ * and Theme.css gained a twin selector keyed on "group-[:not(:hover)".
37
+ *
38
+ * These pin that twin from both ends. The sheet has to brighten both shapes
39
+ * with one declaration, and every hover reveal in the source that carries a
40
+ * gray text class has to match one of the rule's substring pairs - so a later
41
+ * rewrite of either the markup or the rule cannot quietly change the colour
42
+ * again. The reveals are found by walking the same trees the foreign-rule
43
+ * guard reads (ForeignHiddenRuleGuard.ts), not by listing them, and the three
44
+ * known ones are checked to be among what the walk found. The class strings
45
+ * come out of each module through ClassStrings.ts, which fills every
46
+ * template's branches in, so a reveal assembled in a template is read whole.
47
+ *
48
+ * jsdom then gives a second opinion: every selector in the sheet it can
49
+ * evaluate is matched against the converted element and against the class it
50
+ * replaced, and the two must be painted by the same declarations. jsdom
51
+ * cannot model :hover - nwsapi drops the pseudo-class entirely while the
52
+ * document has never had focus, and never matches it once something has been
53
+ * focused, because jsdom has no hovered element - so the `.group:hover` gate
54
+ * is taken off before matching and asserted textually instead, and selectors
55
+ * that need some other state (:focus, a pseudo-element, a rule nwsapi cannot
56
+ * parse) are left out. It is the attribute part, which is what the
57
+ * conversion changed, that jsdom answers.
58
+ */
59
+
60
+ // packages/Common/Tests/UI -> the repository root.
61
+ const REPOSITORY_ROOT: string = path.resolve(__dirname, "..", "..", "..", "..");
62
+
63
+ // Exactly as Theme.css spells them.
64
+ const GROUP_HOVER_BRIGHTEN_SELECTOR: string =
65
+ 'html.dark .group:hover [class*="group-hover"][class*="text-gray-"]';
66
+ const NEGATED_HOVER_BRIGHTEN_SELECTOR: string =
67
+ 'html.dark .group:hover [class*="group-[:not(:hover)"][class*="text-gray-"]';
68
+
69
+ const GROUP_HOVER_GATE: string = "html.dark .group:hover ";
70
+
71
+ // The substring the review found missing.
72
+ const NEGATED_HOVER_SUBSTRING: string = "group-[:not(:hover)";
73
+
74
+ // The converted reveals, relative to the repository root.
75
+ const FACET_VALUE_ROW_FILE: string =
76
+ "packages/Common/UI/Components/LogsViewer/components/FacetValueRow.tsx";
77
+ const TELEMETRY_FACET_VALUE_ROW_FILE: string =
78
+ "packages/Common/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx";
79
+ const PROFILES_DASHBOARD_FILE: string =
80
+ "packages/App/FeatureSet/Dashboard/src/Components/Profiles/ProfilesDashboard.tsx";
81
+
82
+ const KNOWN_REVEAL_FILES: Array<string> = [
83
+ FACET_VALUE_ROW_FILE,
84
+ TELEMETRY_FACET_VALUE_ROW_FILE,
85
+ PROFILES_DASHBOARD_FILE,
86
+ ];
87
+
88
+ // The facet rows' exclude button after the fix, and before it (git 17084e6b23).
89
+ const CONVERTED_FACET_EXCLUDE_CLASS: string =
90
+ "flex h-5 w-5 items-center justify-center rounded text-[10px] text-gray-400 transition-colors hover:bg-red-50 hover:text-red-500 group-[:not(:hover)]:hidden";
91
+ const PRE_FIX_FACET_EXCLUDE_CLASS: string =
92
+ "hidden h-5 w-5 items-center justify-center rounded text-[10px] text-gray-400 transition-colors hover:bg-red-50 hover:text-red-500 group-hover:flex";
93
+
94
+ // The Profiles hint with the template's non-highlighted branch filled in.
95
+ const CONVERTED_PROFILES_HINT_CLASS: string =
96
+ "flex-shrink-0 text-[10px] text-gray-400 inline group-[:not(:hover)]:hidden";
97
+ const PRE_FIX_PROFILES_HINT_CLASS: string =
98
+ "flex-shrink-0 text-[10px] text-gray-400 hidden group-hover:inline";
99
+
100
+ // Kept in step with the list in ResponsiveVisibility.ts.
101
+ const DISPLAY_UTILITIES: ReadonlySet<string> = new Set<string>([
102
+ "block",
103
+ "inline-block",
104
+ "inline",
105
+ "flex",
106
+ "inline-flex",
107
+ "table",
108
+ "inline-table",
109
+ "table-caption",
110
+ "table-cell",
111
+ "table-column",
112
+ "table-column-group",
113
+ "table-footer-group",
114
+ "table-header-group",
115
+ "table-row-group",
116
+ "table-row",
117
+ "flow-root",
118
+ "grid",
119
+ "inline-grid",
120
+ "contents",
121
+ "list-item",
122
+ ]);
123
+
124
+ // A selector tail made only of `[class*="..."]` tests.
125
+ const ATTRIBUTE_SUBSTRINGS_ONLY: RegExp = /^(?:\[class\*="[^"]*"\])+$/;
126
+
127
+ // `group-[:not(:hover)]`, `group-[:not(:hover):not(:focus-within)]` ...
128
+ const NEGATED_GROUP_HOVER_VARIANT: RegExp = /^group-\[.*:not\(:hover\).*\]$/;
129
+
130
+ const GRAY_TEXT_UTILITY: RegExp = /^text-gray-\d+/;
131
+
132
+ /* ------------------------------------------------------------------------ */
133
+ /* Theme.css */
134
+ /* ------------------------------------------------------------------------ */
135
+
136
+ /*
137
+ * ThemeStylesheet splits a prelude on every comma, including the ones inside
138
+ * :is(...), so a rule's selector list is rebuilt here and split only on the
139
+ * commas at the top level.
140
+ */
141
+ function splitSelectorList(selectorText: string): Array<string> {
142
+ const selectors: Array<string> = [];
143
+ let depth: number = 0;
144
+ let quote: string | null = null;
145
+ let current: string = "";
146
+
147
+ for (const character of selectorText) {
148
+ if (quote) {
149
+ if (character === quote) {
150
+ quote = null;
151
+ }
152
+ } else if (character === '"' || character === "'") {
153
+ quote = character;
154
+ } else if (character === "(" || character === "[") {
155
+ depth++;
156
+ } else if (character === ")" || character === "]") {
157
+ depth = Math.max(0, depth - 1);
158
+ } else if (character === "," && depth === 0) {
159
+ selectors.push(current.replace(/\s+/g, " ").trim());
160
+ current = "";
161
+ continue;
162
+ }
163
+
164
+ current += character;
165
+ }
166
+
167
+ selectors.push(current.replace(/\s+/g, " ").trim());
168
+
169
+ return selectors.filter(Boolean);
170
+ }
171
+
172
+ function selectorsOf(rule: StyleRule): Array<string> {
173
+ return splitSelectorList(rule.selectors.join(","));
174
+ }
175
+
176
+ function rulesWithSelector(
177
+ rules: Array<StyleRule>,
178
+ selector: string,
179
+ ): Array<StyleRule> {
180
+ return rules.filter((rule: StyleRule): boolean => {
181
+ return selectorsOf(rule).includes(selector);
182
+ });
183
+ }
184
+
185
+ // Every declaration the sheet gives the selector, in source order.
186
+ function declarationsFor(
187
+ rules: Array<StyleRule>,
188
+ selector: string,
189
+ ): Record<string, string> {
190
+ const declarations: Record<string, string> = {};
191
+
192
+ for (const rule of rulesWithSelector(rules, selector)) {
193
+ Object.assign(declarations, rule.declarations);
194
+ }
195
+
196
+ return declarations;
197
+ }
198
+
199
+ /*
200
+ * The substrings a `GATE [class*="a"][class*="b"]...` selector requires of
201
+ * the class attribute, or null for a selector of any other shape.
202
+ */
203
+ function requiredSubstrings(selector: string): Array<string> | null {
204
+ if (!selector.startsWith(GROUP_HOVER_GATE)) {
205
+ return null;
206
+ }
207
+
208
+ const attributePart: string = selector.slice(GROUP_HOVER_GATE.length);
209
+
210
+ if (!ATTRIBUTE_SUBSTRINGS_ONLY.test(attributePart)) {
211
+ return null;
212
+ }
213
+
214
+ return Array.from(
215
+ attributePart.matchAll(/\[class\*="([^"]*)"\]/g),
216
+ (match: RegExpMatchArray): string => {
217
+ return match[1]!;
218
+ },
219
+ );
220
+ }
221
+
222
+ /*
223
+ * The substring pairs of the rule that brightens a group-hover reveal: every
224
+ * gated attribute-substring selector in the rule(s) that carry the original
225
+ * group-hover selector.
226
+ */
227
+ function brightenSubstringSets(rules: Array<StyleRule>): Array<Array<string>> {
228
+ const sets: Array<Array<string>> = [];
229
+
230
+ for (const rule of rulesWithSelector(rules, GROUP_HOVER_BRIGHTEN_SELECTOR)) {
231
+ for (const selector of selectorsOf(rule)) {
232
+ const substrings: Array<string> | null = requiredSubstrings(selector);
233
+
234
+ if (substrings) {
235
+ sets.push(substrings);
236
+ }
237
+ }
238
+ }
239
+
240
+ return sets;
241
+ }
242
+
243
+ // `[class*="x"]` is a plain substring test on the whole attribute value.
244
+ function isBrightened(
245
+ classAttribute: string,
246
+ substringSets: Array<Array<string>>,
247
+ ): boolean {
248
+ return substringSets.some((substrings: Array<string>): boolean => {
249
+ return substrings.every((substring: string): boolean => {
250
+ return classAttribute.includes(substring);
251
+ });
252
+ });
253
+ }
254
+
255
+ /*
256
+ * The sheet as it stood when review found the regression: the same rules,
257
+ * minus every selector keyed on the negated-hover substring.
258
+ */
259
+ function withoutNegatedHoverSelectors(
260
+ rules: Array<StyleRule>,
261
+ ): Array<StyleRule> {
262
+ return rules.map((rule: StyleRule): StyleRule => {
263
+ return {
264
+ ...rule,
265
+ selectors: selectorsOf(rule).filter((selector: string): boolean => {
266
+ return !selector.includes(NEGATED_HOVER_SUBSTRING);
267
+ }),
268
+ };
269
+ });
270
+ }
271
+
272
+ /* ------------------------------------------------------------------------ */
273
+ /* Source */
274
+ /* ------------------------------------------------------------------------ */
275
+
276
+ function tokensOf(classText: string): Array<string> {
277
+ return classText.split(/\s+/).filter(Boolean);
278
+ }
279
+
280
+ /*
281
+ * `group-[:not(:hover)]:hidden` and the like: a group-hover reveal written so
282
+ * the foreign rule cannot pin it shut. Only the unnamed group counts - the
283
+ * Theme.css rule is gated on `.group:hover`, which a named group
284
+ * (`group/nav-row`, revealed by `group-[...]/nav-row:hidden`) never matches.
285
+ */
286
+ function isGroupHoverReveal(token: string): boolean {
287
+ const parts: Array<string> = splitVariants(token);
288
+
289
+ return (
290
+ parts.length === 2 &&
291
+ parts[1] === "hidden" &&
292
+ NEGATED_GROUP_HOVER_VARIANT.test(parts[0]!)
293
+ );
294
+ }
295
+
296
+ interface RevealScan {
297
+ reveals: Array<ClassCandidate>;
298
+ filesRead: number;
299
+ }
300
+
301
+ /*
302
+ * Every class string in the browser source that reveals an element on group
303
+ * hover, found by walking the same trees the foreign-rule guard reads.
304
+ */
305
+ function findGroupHoverReveals(): RevealScan {
306
+ const reveals: Array<ClassCandidate> = [];
307
+ let filesRead: number = 0;
308
+
309
+ for (const root of listScanRoots(REPOSITORY_ROOT)) {
310
+ for (const filePath of listSourceFiles(root)) {
311
+ filesRead++;
312
+ const sourceText: string = fs.readFileSync(filePath, "utf8");
313
+
314
+ if (!sourceText.includes(":not(:hover)")) {
315
+ continue;
316
+ }
317
+
318
+ const relativePath: string = toRelativePath(REPOSITORY_ROOT, filePath);
319
+
320
+ for (const candidate of collectClassCandidates(
321
+ relativePath,
322
+ sourceText,
323
+ )) {
324
+ if (tokensOf(candidate.classText).some(isGroupHoverReveal)) {
325
+ reveals.push(candidate);
326
+ }
327
+ }
328
+ }
329
+ }
330
+
331
+ return { reveals: reveals, filesRead: filesRead };
332
+ }
333
+
334
+ /*
335
+ * Put the pre-fix idiom back: the element's own display utility becomes the
336
+ * bare `hidden` it replaced, and the negated-hover hide becomes the
337
+ * `group-hover:<display>` that used to show it. Every converted reveal was
338
+ * written that way before the fix, so this rebuilds the old class exactly.
339
+ */
340
+ function restorePreFixHoverReveal(classText: string): string {
341
+ const tokens: Array<string> = tokensOf(classText);
342
+ const revealIndex: number = tokens.findIndex(isGroupHoverReveal);
343
+ const displayIndex: number = tokens.findIndex((token: string): boolean => {
344
+ return DISPLAY_UTILITIES.has(token);
345
+ });
346
+
347
+ if (revealIndex === -1 || displayIndex === -1) {
348
+ return classText;
349
+ }
350
+
351
+ const display: string = tokens[displayIndex]!;
352
+ tokens[displayIndex] = "hidden";
353
+ tokens[revealIndex] = `group-hover:${display}`;
354
+
355
+ return tokens.join(" ");
356
+ }
357
+
358
+ function hasGrayText(classText: string): boolean {
359
+ return tokensOf(classText).some((token: string): boolean => {
360
+ return GRAY_TEXT_UTILITY.test(splitVariants(token).pop()!);
361
+ });
362
+ }
363
+
364
+ /* ------------------------------------------------------------------------ */
365
+ /* jsdom */
366
+ /* ------------------------------------------------------------------------ */
367
+
368
+ const USER_ACTION_PSEUDO_CLASS: RegExp =
369
+ /:(?:hover|active|focus|focus-within|focus-visible|visited)\b/;
370
+
371
+ /*
372
+ * The selector with its `.group:hover` gate reduced to `.group`, or null when
373
+ * something jsdom cannot answer is left in it (another user-action
374
+ * pseudo-class, or a pseudo-element). Quoted attribute values are left alone:
375
+ * `[class*="group-[:not(:hover)"]` is a substring, not a pseudo-class.
376
+ */
377
+ function withoutHoverGate(selector: string): string | null {
378
+ const pieces: Array<string> = selector.split(/("[^"]*"|'[^']*')/);
379
+ let rewritten: string = "";
380
+
381
+ for (let index: number = 0; index < pieces.length; index++) {
382
+ const piece: string = pieces[index]!;
383
+
384
+ if (index % 2 === 1) {
385
+ rewritten += piece;
386
+ continue;
387
+ }
388
+
389
+ const ungated: string = piece.replace(/\.group:hover(?![\w-])/g, ".group");
390
+
391
+ if (USER_ACTION_PSEUDO_CLASS.test(ungated) || ungated.includes("::")) {
392
+ return null;
393
+ }
394
+
395
+ rewritten += ungated;
396
+ }
397
+
398
+ return rewritten;
399
+ }
400
+
401
+ interface EvaluableRule {
402
+ selector: string;
403
+ declarations: Record<string, string>;
404
+ }
405
+
406
+ interface EvaluableSheet {
407
+ rules: Array<EvaluableRule>;
408
+ /*
409
+ * Selectors jsdom cannot answer: another user-action state, a
410
+ * pseudo-element, or syntax nwsapi rejects (:fullscreen, some :is(...)).
411
+ */
412
+ skipped: number;
413
+ }
414
+
415
+ /*
416
+ * Every selector in the sheet that jsdom can evaluate once the `.group:hover`
417
+ * gate is lifted - the whole sheet, not just the brighten rule, so a rule
418
+ * that painted the old element and not the new one cannot hide anywhere
419
+ * jsdom can see.
420
+ */
421
+ function jsdomEvaluableSheet(rules: Array<StyleRule>): EvaluableSheet {
422
+ const evaluable: Array<EvaluableRule> = [];
423
+ let skipped: number = 0;
424
+
425
+ for (const rule of rules) {
426
+ for (const selector of selectorsOf(rule)) {
427
+ const ungated: string | null = withoutHoverGate(selector);
428
+
429
+ if (!ungated) {
430
+ skipped++;
431
+ continue;
432
+ }
433
+
434
+ try {
435
+ document.documentElement.matches(ungated);
436
+ } catch {
437
+ skipped++;
438
+ continue;
439
+ }
440
+
441
+ evaluable.push({ selector: ungated, declarations: rule.declarations });
442
+ }
443
+ }
444
+
445
+ return { rules: evaluable, skipped: skipped };
446
+ }
447
+
448
+ // An element carrying the class, inside a `.group` under the dark <html>.
449
+ function mountRevealIn(classAttribute: string): HTMLElement {
450
+ const group: HTMLDivElement = document.createElement("div");
451
+ group.className = "group";
452
+
453
+ const revealed: HTMLButtonElement = document.createElement("button");
454
+ revealed.setAttribute("class", classAttribute);
455
+
456
+ group.appendChild(revealed);
457
+ document.body.appendChild(group);
458
+
459
+ return revealed;
460
+ }
461
+
462
+ /*
463
+ * What the sheet paints on the element, as jsdom matches it: one
464
+ * "property: value" per declaration, sorted, so two elements painted by the
465
+ * same declarations compare equal whichever selector reached them.
466
+ */
467
+ function declarationsOn(
468
+ element: Element,
469
+ sheet: EvaluableSheet,
470
+ ): Array<string> {
471
+ const applied: Array<string> = [];
472
+
473
+ for (const rule of sheet.rules) {
474
+ if (!element.matches(rule.selector)) {
475
+ continue;
476
+ }
477
+
478
+ for (const [property, value] of Object.entries(rule.declarations)) {
479
+ applied.push(`${property}: ${value}`);
480
+ }
481
+ }
482
+
483
+ return applied.sort();
484
+ }
485
+
486
+ // What `before` has that `after` lacks, counting duplicates.
487
+ function missingFrom(
488
+ before: Array<string>,
489
+ after: Array<string>,
490
+ ): Array<string> {
491
+ const remaining: Array<string> = [...after];
492
+
493
+ return before.filter((entry: string): boolean => {
494
+ const index: number = remaining.indexOf(entry);
495
+
496
+ if (index === -1) {
497
+ return true;
498
+ }
499
+
500
+ remaining.splice(index, 1);
501
+ return false;
502
+ });
503
+ }
504
+
505
+ function brightenEntry(): string {
506
+ return `color: ${declarationsFor(THEME_RULES, GROUP_HOVER_BRIGHTEN_SELECTOR)["color"]!}`;
507
+ }
508
+
509
+ /* ------------------------------------------------------------------------ */
510
+
511
+ let revealScan: RevealScan = { reveals: [], filesRead: 0 };
512
+
513
+ /*
514
+ * Parsing ~3,300 files takes seconds. Doing it in beforeAll rather than at
515
+ * module scope keeps it under a timeout and reports a failure as a failed
516
+ * test instead of a suite that could not even be collected.
517
+ */
518
+ beforeAll(() => {
519
+ revealScan = findGroupHoverReveals();
520
+ }, 180000);
521
+
522
+ function revealsIn(file: string): Array<ClassCandidate> {
523
+ return revealScan.reveals.filter((candidate: ClassCandidate): boolean => {
524
+ return candidate.file === file;
525
+ });
526
+ }
527
+
528
+ /*
529
+ * The one reveal a known file holds. A rewrite that drops the negated-hover
530
+ * shape (back to `hidden group-hover:flex`, or to something else entirely)
531
+ * fails here by name, so its dark-mode colour gets looked at again.
532
+ */
533
+ function onlyRevealIn(file: string): ClassCandidate {
534
+ const reveals: Array<ClassCandidate> = revealsIn(file);
535
+
536
+ expect({ file: file, reveals: reveals.length }).toEqual({
537
+ file: file,
538
+ reveals: 1,
539
+ });
540
+
541
+ return reveals[0]!;
542
+ }
543
+
544
+ describe("Theme.css brightens a group-hover reveal in either shape", () => {
545
+ test("both selector shapes are in the sheet, gated on the hovered group", () => {
546
+ expect(
547
+ rulesWithSelector(THEME_RULES, GROUP_HOVER_BRIGHTEN_SELECTOR).length,
548
+ ).toBeGreaterThan(0);
549
+ expect(
550
+ rulesWithSelector(THEME_RULES, NEGATED_HOVER_BRIGHTEN_SELECTOR).length,
551
+ ).toBeGreaterThan(0);
552
+
553
+ /*
554
+ * Same gate, same specificity: the twin differs from the original in the
555
+ * substring it looks for and nothing else, so it wins exactly where the
556
+ * original did.
557
+ */
558
+ expect(
559
+ NEGATED_HOVER_BRIGHTEN_SELECTOR.replace(
560
+ `[class*="${NEGATED_HOVER_SUBSTRING}"]`,
561
+ '[class*="group-hover"]',
562
+ ),
563
+ ).toBe(GROUP_HOVER_BRIGHTEN_SELECTOR);
564
+ });
565
+
566
+ test("both shapes get the same declaration", () => {
567
+ const original: Record<string, string> = declarationsFor(
568
+ THEME_RULES,
569
+ GROUP_HOVER_BRIGHTEN_SELECTOR,
570
+ );
571
+ const twin: Record<string, string> = declarationsFor(
572
+ THEME_RULES,
573
+ NEGATED_HOVER_BRIGHTEN_SELECTOR,
574
+ );
575
+
576
+ expect(original["color"]).toBeDefined();
577
+ expect(twin).toEqual(original);
578
+
579
+ /*
580
+ * The reveals are text-gray-400, which the dark theme remaps to #94a3b8
581
+ * with !important. A brighten without !important would lose to that
582
+ * however specific its selector.
583
+ */
584
+ expect(original["color"]).toContain("!important");
585
+ });
586
+
587
+ test("the rule's substring pairs are the two shapes", () => {
588
+ expect(brightenSubstringSets(THEME_RULES)).toEqual(
589
+ expect.arrayContaining([
590
+ ["group-hover", "text-gray-"],
591
+ [NEGATED_HOVER_SUBSTRING, "text-gray-"],
592
+ ]),
593
+ );
594
+ });
595
+ });
596
+
597
+ describe("helpers", () => {
598
+ test("splitSelectorList keeps :is(...) and quoted commas together", () => {
599
+ expect(
600
+ splitSelectorList(
601
+ 'html.dark :is([class~="a"], [class~="b"]):hover, .x [data-y="1,2"],.z',
602
+ ),
603
+ ).toEqual([
604
+ 'html.dark :is([class~="a"], [class~="b"]):hover',
605
+ '.x [data-y="1,2"]',
606
+ ".z",
607
+ ]);
608
+ });
609
+
610
+ test("requiredSubstrings reads only gated attribute-substring selectors", () => {
611
+ expect(requiredSubstrings(NEGATED_HOVER_BRIGHTEN_SELECTOR)).toEqual([
612
+ NEGATED_HOVER_SUBSTRING,
613
+ "text-gray-",
614
+ ]);
615
+ expect(
616
+ requiredSubstrings('html.dark .group:hover [class~="group-hover:x"]'),
617
+ ).toBeNull();
618
+ expect(requiredSubstrings('html.dark [class*="group-hover"]')).toBeNull();
619
+ });
620
+
621
+ test("isGroupHoverReveal takes the unnamed negated-hover hide only", () => {
622
+ expect(isGroupHoverReveal("group-[:not(:hover)]:hidden")).toBe(true);
623
+ expect(
624
+ isGroupHoverReveal("group-[:not(:hover):not(:focus-within)]:hidden"),
625
+ ).toBe(true);
626
+ expect(
627
+ isGroupHoverReveal(
628
+ "group-[:not(:hover):not(:focus-within)]/nav-row:hidden",
629
+ ),
630
+ ).toBe(false);
631
+ expect(isGroupHoverReveal("group-hover:flex")).toBe(false);
632
+ expect(isGroupHoverReveal("group-[:not(:hover)]:flex")).toBe(false);
633
+ expect(isGroupHoverReveal("hidden")).toBe(false);
634
+ });
635
+
636
+ test("collectClassCandidates expands a template's branches, never its condition", () => {
637
+ const candidates: Array<string> = collectClassCandidates(
638
+ "Fixture.tsx",
639
+ 'const e = <span className={`a b ${isOn ? "" : "c group-[:not(:hover)]:hidden"}`} data-x={mode === "q" ? 1 : 2} />;',
640
+ ).map((candidate: ClassCandidate): string => {
641
+ return candidate.classText;
642
+ });
643
+
644
+ expect(candidates).toContain("a b");
645
+ expect(candidates).toContain("a b c group-[:not(:hover)]:hidden");
646
+ // The substitution is read as part of the template, not on its own.
647
+ expect(candidates).not.toContain("c group-[:not(:hover)]:hidden");
648
+ // Every string literal is still a candidate, the condition included.
649
+ expect(candidates).toContain("q");
650
+ });
651
+
652
+ test("restorePreFixHoverReveal rebuilds the class strings git history has", () => {
653
+ expect(restorePreFixHoverReveal(CONVERTED_FACET_EXCLUDE_CLASS)).toBe(
654
+ PRE_FIX_FACET_EXCLUDE_CLASS,
655
+ );
656
+ expect(restorePreFixHoverReveal(CONVERTED_PROFILES_HINT_CLASS)).toBe(
657
+ PRE_FIX_PROFILES_HINT_CLASS,
658
+ );
659
+ // Nothing to restore.
660
+ expect(restorePreFixHoverReveal("flex text-gray-400")).toBe(
661
+ "flex text-gray-400",
662
+ );
663
+ });
664
+
665
+ test("withoutHoverGate lifts the gate and refuses what jsdom cannot answer", () => {
666
+ expect(withoutHoverGate(NEGATED_HOVER_BRIGHTEN_SELECTOR)).toBe(
667
+ 'html.dark .group [class*="group-[:not(:hover)"][class*="text-gray-"]',
668
+ );
669
+ expect(
670
+ withoutHoverGate('html.dark .group:hover [class~="x"]:hover'),
671
+ ).toBeNull();
672
+ expect(withoutHoverGate("html.dark .group:hover .x::placeholder")).toBe(
673
+ null,
674
+ );
675
+ // `.group:hover` is the gate; `.group-row:hover` is not.
676
+ expect(withoutHoverGate("html.dark .group-row:hover .x")).toBeNull();
677
+ });
678
+ });
679
+
680
+ describe("every group-hover reveal with gray text is brightened in dark mode", () => {
681
+ test("the walk read the tree and found the three converted reveals", () => {
682
+ // A broken walk must not let the main assertion pass over nothing.
683
+ expect(revealScan.filesRead).toBeGreaterThan(1000);
684
+
685
+ for (const file of KNOWN_REVEAL_FILES) {
686
+ onlyRevealIn(file);
687
+ }
688
+ });
689
+
690
+ test.each(KNOWN_REVEAL_FILES)(
691
+ "%s: the revealed element matches one of the rule's substring pairs",
692
+ (file: string) => {
693
+ const reveal: ClassCandidate = onlyRevealIn(file);
694
+
695
+ /*
696
+ * Pinned on purpose: swapping the gray for a class the rule does not
697
+ * key on (text-slate-400, say) would change the colour as surely as
698
+ * dropping the selector did.
699
+ */
700
+ expect(hasGrayText(reveal.classText)).toBe(true);
701
+ expect({
702
+ reveal: describeCandidate(reveal),
703
+ brightened: isBrightened(
704
+ reveal.classText,
705
+ brightenSubstringSets(THEME_RULES),
706
+ ),
707
+ }).toEqual({ reveal: describeCandidate(reveal), brightened: true });
708
+ },
709
+ );
710
+
711
+ test("no reveal anywhere in the source carries gray text the rule misses", () => {
712
+ const substringSets: Array<Array<string>> =
713
+ brightenSubstringSets(THEME_RULES);
714
+
715
+ const missed: Array<string> = revealScan.reveals
716
+ .filter((candidate: ClassCandidate): boolean => {
717
+ return (
718
+ hasGrayText(candidate.classText) &&
719
+ !isBrightened(candidate.classText, substringSets)
720
+ );
721
+ })
722
+ .map(describeCandidate);
723
+
724
+ expect(missed).toEqual([]);
725
+ });
726
+
727
+ test("before the fix the same elements were brightened by the group-hover pair", () => {
728
+ const groupHoverOnly: Array<Array<string>> = [
729
+ ["group-hover", "text-gray-"],
730
+ ];
731
+
732
+ for (const file of KNOWN_REVEAL_FILES) {
733
+ const preFix: string = restorePreFixHoverReveal(
734
+ onlyRevealIn(file).classText,
735
+ );
736
+
737
+ expect({
738
+ preFix: preFix,
739
+ brightened: isBrightened(preFix, groupHoverOnly),
740
+ }).toEqual({ preFix: preFix, brightened: true });
741
+ }
742
+ });
743
+
744
+ /*
745
+ * The regression review found: the rule as it was, without the twin, and
746
+ * the converted markup. Every converted reveal falls out of it - still
747
+ * revealed on hover, but left at the dimmed gray.
748
+ */
749
+ test("control: without the twin selector the converted reveals are not brightened", () => {
750
+ const withoutTwin: Array<Array<string>> = brightenSubstringSets(
751
+ withoutNegatedHoverSelectors(THEME_RULES),
752
+ );
753
+
754
+ expect(withoutTwin.length).toBeGreaterThan(0);
755
+
756
+ for (const file of KNOWN_REVEAL_FILES) {
757
+ const converted: string = onlyRevealIn(file).classText;
758
+
759
+ expect({
760
+ converted: converted,
761
+ brightened: isBrightened(converted, withoutTwin),
762
+ }).toEqual({ converted: converted, brightened: false });
763
+ }
764
+ });
765
+ });
766
+
767
+ describe("jsdom agrees on the attribute part", () => {
768
+ beforeEach(() => {
769
+ document.documentElement.classList.add("dark");
770
+ });
771
+
772
+ afterEach(() => {
773
+ document.body.innerHTML = "";
774
+ document.documentElement.classList.remove("dark");
775
+ });
776
+
777
+ test("the brighten selectors are gated on .group:hover, and jsdom can evaluate the rest of the sheet", () => {
778
+ /*
779
+ * jsdom is handed the selectors without the gate (see the header), so
780
+ * the gate itself is checked here, on the text.
781
+ */
782
+ for (const selector of [
783
+ GROUP_HOVER_BRIGHTEN_SELECTOR,
784
+ NEGATED_HOVER_BRIGHTEN_SELECTOR,
785
+ ]) {
786
+ expect(selector.startsWith(GROUP_HOVER_GATE)).toBe(true);
787
+ }
788
+
789
+ const sheet: EvaluableSheet = jsdomEvaluableSheet(THEME_RULES);
790
+ const evaluated: Array<string> = sheet.rules.map(
791
+ (rule: EvaluableRule): string => {
792
+ return rule.selector;
793
+ },
794
+ );
795
+
796
+ expect(evaluated).toEqual(
797
+ expect.arrayContaining([
798
+ withoutHoverGate(GROUP_HOVER_BRIGHTEN_SELECTOR),
799
+ withoutHoverGate(NEGATED_HOVER_BRIGHTEN_SELECTOR),
800
+ ]),
801
+ );
802
+ // Most of the sheet, so the comparison below is not made over a sliver.
803
+ expect(sheet.rules.length).toBeGreaterThan(sheet.skipped);
804
+ });
805
+
806
+ test.each(KNOWN_REVEAL_FILES)(
807
+ "%s: the sheet paints the converted element exactly as it painted the pre-fix one",
808
+ (file: string) => {
809
+ const converted: string = onlyRevealIn(file).classText;
810
+ const sheet: EvaluableSheet = jsdomEvaluableSheet(THEME_RULES);
811
+
812
+ const before: Array<string> = declarationsOn(
813
+ mountRevealIn(restorePreFixHoverReveal(converted)),
814
+ sheet,
815
+ );
816
+ const after: Array<string> = declarationsOn(
817
+ mountRevealIn(converted),
818
+ sheet,
819
+ );
820
+
821
+ expect(before).toContain(brightenEntry());
822
+ expect(after).toEqual(before);
823
+ },
824
+ );
825
+
826
+ test.each(KNOWN_REVEAL_FILES)(
827
+ "control, %s: without the twin selector the converted element loses exactly the brighten",
828
+ (file: string) => {
829
+ const converted: string = onlyRevealIn(file).classText;
830
+ const sheet: EvaluableSheet = jsdomEvaluableSheet(
831
+ withoutNegatedHoverSelectors(THEME_RULES),
832
+ );
833
+
834
+ const before: Array<string> = declarationsOn(
835
+ mountRevealIn(restorePreFixHoverReveal(converted)),
836
+ sheet,
837
+ );
838
+ const after: Array<string> = declarationsOn(
839
+ mountRevealIn(converted),
840
+ sheet,
841
+ );
842
+
843
+ expect(missingFrom(before, after)).toEqual([brightenEntry()]);
844
+ expect(missingFrom(after, before)).toEqual([]);
845
+ },
846
+ );
847
+ });