@oneuptime/common 12.0.30 → 12.0.32

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 (645) hide show
  1. package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
  2. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
  3. package/Models/DatabaseModels/AlertSeverity.ts +44 -0
  4. package/Models/DatabaseModels/AlertState.ts +0 -2
  5. package/Models/DatabaseModels/DetectionRule.ts +16 -5
  6. package/Models/DatabaseModels/Domain.ts +1 -1
  7. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
  8. package/Models/DatabaseModels/Incident.ts +1 -1
  9. package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
  10. package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
  11. package/Models/DatabaseModels/Index.ts +4 -0
  12. package/Models/DatabaseModels/MetricType.ts +0 -2
  13. package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
  14. package/Models/DatabaseModels/MonitorTest.ts +0 -2
  15. package/Models/DatabaseModels/NetworkDevice.ts +234 -5
  16. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
  17. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
  18. package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +501 -0
  19. package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
  20. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
  21. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
  22. package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
  23. package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
  24. package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
  25. package/Models/DatabaseModels/StatusPageResource.ts +0 -2
  26. package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
  27. package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
  28. package/Server/API/GlobalConfigAPI.ts +362 -183
  29. package/Server/API/TelemetryAPI.ts +42 -4
  30. package/Server/EnvironmentConfig.ts +112 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.ts +72 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  35. package/Server/Middleware/MultipartFormData.ts +118 -32
  36. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
  37. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
  38. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
  39. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
  40. package/Server/Services/AlertGroupingEngineService.ts +9 -1
  41. package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
  42. package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
  43. package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
  44. package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
  45. package/Server/Services/AlertReminderRuleService.ts +9 -1
  46. package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
  47. package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
  48. package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
  49. package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
  50. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
  51. package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
  52. package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
  53. package/Server/Services/DatabaseService.ts +39 -9
  54. package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
  55. package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
  56. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
  57. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
  58. package/Server/Services/HostLabelRuleEngineService.ts +9 -1
  59. package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
  60. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
  61. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
  62. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
  63. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
  64. package/Server/Services/IncidentGroupingEngineService.ts +9 -1
  65. package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
  66. package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
  67. package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
  68. package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
  69. package/Server/Services/IncidentReminderRuleService.ts +9 -1
  70. package/Server/Services/IncidentSlaRuleService.ts +9 -1
  71. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
  72. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
  73. package/Server/Services/Index.ts +4 -0
  74. package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
  75. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
  76. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
  77. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
  78. package/Server/Services/KubernetesResourceService.ts +5 -1
  79. package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
  80. package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
  81. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
  82. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
  83. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
  84. package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
  85. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
  86. package/Server/Services/NetworkDeviceRoleService.ts +90 -0
  87. package/Server/Services/NetworkDeviceService.ts +209 -1
  88. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
  89. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
  90. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
  91. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
  92. package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
  93. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
  94. package/Server/Services/ProjectService.ts +85 -0
  95. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
  96. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
  97. package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
  98. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
  99. package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
  100. package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
  101. package/Server/Services/RunbookRuleEngineService.ts +9 -1
  102. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
  103. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
  104. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
  105. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
  106. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
  107. package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
  108. package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
  109. package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
  110. package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
  111. package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
  112. package/Server/Services/TelemetrySourceMapService.ts +266 -23
  113. package/Server/Services/UserNotificationSettingService.ts +0 -6
  114. package/Server/Services/UserService.ts +27 -0
  115. package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
  116. package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
  117. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
  118. package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
  119. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
  120. package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
  121. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
  122. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
  123. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
  124. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
  125. package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
  126. package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
  127. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
  128. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
  129. package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
  130. package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
  131. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +31 -1
  132. package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
  133. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
  134. package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -0
  135. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
  136. package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
  137. package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +318 -0
  138. package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
  139. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +590 -0
  140. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
  141. package/Tests/App/Dashboard/SideMenuHarness.tsx +11 -3
  142. package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
  143. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
  144. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
  145. package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +543 -0
  146. package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
  147. package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
  148. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
  149. package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
  150. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
  151. package/Tests/Server/Infrastructure/Postgres/NetworkDeviceRoleTableMigration.test.ts +476 -0
  152. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
  153. package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
  154. package/Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts +215 -0
  155. package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
  156. package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
  157. package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
  158. package/Tests/Server/Services/NetworkDeviceRoleModel.test.ts +672 -0
  159. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
  160. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
  161. package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
  162. package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -0
  163. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
  164. package/Tests/Server/Services/UserNotificationSettingMonitorDefaults.test.ts +248 -0
  165. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +43 -2
  166. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
  167. package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
  168. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
  169. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
  170. package/Tests/Server/Utils/BasicCron.test.ts +283 -0
  171. package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
  172. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
  173. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
  174. package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +174 -0
  175. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
  176. package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
  177. package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
  178. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
  179. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
  180. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
  181. package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
  182. package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
  183. package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
  184. package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
  185. package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
  186. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
  187. package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
  188. package/Tests/Types/NetworkDevice/DefaultNetworkDeviceRole.test.ts +417 -0
  189. package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
  190. package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
  191. package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
  192. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
  193. package/Tests/UI/Components/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
  194. package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
  195. package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
  196. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
  197. package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
  198. package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
  199. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
  200. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
  201. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
  202. package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
  203. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
  204. package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
  205. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
  206. package/Tests/UI/Components/SideMenuItem.test.tsx +30 -0
  207. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
  208. package/Tests/UI/Components/XAxis.test.ts +270 -5
  209. package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
  210. package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
  211. package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
  212. package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
  213. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +30 -0
  214. package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
  215. package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
  216. package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -0
  217. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
  218. package/Tests/Utils/Monitor/NetworkDeviceRoleCatalog.test.ts +981 -0
  219. package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -0
  220. package/Tests/Utils/NetworkDevice/DeviceRoleKeyUtil.test.ts +538 -0
  221. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
  222. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
  223. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
  224. package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
  225. package/Tests/Utils/Slo/SloEvaluation.test.ts +171 -0
  226. package/Tests/Utils/Slug.test.ts +61 -1
  227. package/Tests/jest.setup.ts +19 -0
  228. package/Types/Date.ts +39 -0
  229. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +61 -0
  230. package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
  231. package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -0
  232. package/Types/Permission.ts +141 -0
  233. package/Types/Rum/SessionReplay.ts +21 -0
  234. package/Types/Telemetry/SourceMap.ts +8 -0
  235. package/UI/Components/Charts/Area/AreaChart.tsx +7 -0
  236. package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
  237. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
  238. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
  239. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
  240. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
  241. package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
  242. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +554 -545
  243. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +337 -371
  244. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +549 -540
  245. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
  246. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
  247. package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
  248. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  249. package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
  250. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
  251. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
  252. package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
  253. package/UI/Components/Charts/Utils/XAxis.ts +125 -18
  254. package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
  255. package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
  256. package/UI/Components/Feed/FeedItem.tsx +4 -5
  257. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
  258. package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
  259. package/UI/Components/Image/Image.tsx +20 -3
  260. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  261. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
  262. package/UI/Components/ModelTable/BaseModelTable.tsx +200 -39
  263. package/UI/Components/Navbar/NavBar.tsx +62 -13
  264. package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
  265. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
  266. package/UI/Components/SideMenu/SideMenu.tsx +12 -2
  267. package/UI/Components/SideMenu/SideMenuItem.tsx +4 -1
  268. package/UI/Components/SideMenu/SideMenuSection.tsx +14 -2
  269. package/UI/Components/Table/TableHeader.tsx +64 -48
  270. package/UI/Components/Table/TableRow.tsx +13 -3
  271. package/UI/Styles/Theme.css +38 -0
  272. package/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
  273. package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -0
  274. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
  275. package/Utils/Monitor/NetworkDeviceRoleCatalog.ts +232 -0
  276. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
  277. package/Utils/Monitor/NetworkTopologyUtil.ts +116 -33
  278. package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
  279. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
  280. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
  281. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
  282. package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
  283. package/Utils/Rules/RuleEngineLimits.ts +32 -0
  284. package/Utils/Rules/RulePatternMatchUtil.ts +1 -1
  285. package/Utils/Slug.ts +34 -1
  286. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
  287. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
  288. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
  289. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
  290. package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
  291. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
  293. package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
  295. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Domain.js +1 -1
  297. package/build/dist/Models/DatabaseModels/Domain.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
  299. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  300. package/build/dist/Models/DatabaseModels/Incident.js +1 -1
  301. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
  303. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
  305. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  307. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
  309. package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +0 -2
  311. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
  313. package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/NetworkDevice.js +239 -6
  315. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
  317. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +521 -0
  320. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
  321. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
  322. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
  323. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -1
  324. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  325. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
  326. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  327. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
  328. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
  330. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
  331. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
  332. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
  333. package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
  334. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  335. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
  336. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
  338. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
  339. package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
  340. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  341. package/build/dist/Server/API/TelemetryAPI.js +31 -3
  342. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  343. package/build/dist/Server/EnvironmentConfig.js +83 -0
  344. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js.map +1 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  353. package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
  354. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  355. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
  356. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  357. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
  358. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  359. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
  360. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  361. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
  362. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  363. package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
  364. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  365. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
  366. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  367. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
  368. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  369. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
  370. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  371. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
  372. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  373. package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
  374. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  375. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
  376. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  377. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
  378. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  379. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
  380. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  381. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
  382. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  383. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
  384. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  385. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
  386. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  387. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
  388. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  389. package/build/dist/Server/Services/DatabaseService.js +31 -5
  390. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  391. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
  392. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  393. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
  394. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  395. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
  396. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  397. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
  398. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  399. package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
  400. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  401. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
  402. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
  404. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
  406. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  407. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
  408. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  409. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
  410. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  411. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
  412. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
  414. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  415. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
  416. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  417. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
  418. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  419. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
  420. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  421. package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
  422. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  423. package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
  424. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  425. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
  426. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  427. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
  428. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  429. package/build/dist/Server/Services/Index.js +4 -0
  430. package/build/dist/Server/Services/Index.js.map +1 -1
  431. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
  432. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  433. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
  434. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  435. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
  436. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  437. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
  438. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  439. package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
  440. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  441. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
  442. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  443. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
  444. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  445. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
  446. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  447. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
  448. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  449. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
  450. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  451. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
  452. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
  453. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
  454. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  455. package/build/dist/Server/Services/NetworkDeviceRoleService.js +70 -0
  456. package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
  457. package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
  458. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  459. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
  460. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  461. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
  462. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  463. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
  464. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  465. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
  466. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  467. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
  468. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  469. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
  470. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  471. package/build/dist/Server/Services/ProjectService.js +65 -0
  472. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  473. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
  474. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  475. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
  476. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  477. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
  478. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  479. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
  480. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  481. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
  482. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  483. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
  484. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  485. package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
  486. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  487. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
  488. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  489. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
  490. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  491. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
  492. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  493. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
  494. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  495. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
  496. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  497. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
  498. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  499. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
  500. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  501. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
  502. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  503. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
  504. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  505. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
  506. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  507. package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
  508. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
  509. package/build/dist/Server/Services/UserNotificationSettingService.js +0 -1
  510. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  511. package/build/dist/Server/Services/UserService.js +25 -0
  512. package/build/dist/Server/Services/UserService.js.map +1 -1
  513. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
  514. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  515. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
  516. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  517. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
  518. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
  519. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
  520. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
  521. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
  522. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  523. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
  524. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  525. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
  526. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  527. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
  528. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  529. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
  530. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  531. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
  532. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  533. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
  534. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  535. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
  536. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
  537. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
  538. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
  539. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
  540. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  541. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
  542. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
  543. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
  544. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
  545. package/build/dist/Types/Date.js +27 -0
  546. package/build/dist/Types/Date.js.map +1 -1
  547. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
  548. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
  549. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js +105 -0
  550. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js.map +1 -0
  551. package/build/dist/Types/Permission.js +126 -0
  552. package/build/dist/Types/Permission.js.map +1 -1
  553. package/build/dist/Types/Rum/SessionReplay.js +19 -0
  554. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  555. package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
  556. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
  558. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
  560. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
  562. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
  563. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
  564. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
  565. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
  566. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
  567. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
  568. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
  569. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +262 -234
  570. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  571. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +146 -153
  572. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  573. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +261 -233
  574. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  575. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
  576. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
  577. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  578. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  579. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
  580. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
  581. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
  582. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  583. package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
  584. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  585. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
  586. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  587. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
  588. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  589. package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
  590. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  591. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
  592. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  593. package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
  594. package/build/dist/UI/Components/Image/Image.js +6 -1
  595. package/build/dist/UI/Components/Image/Image.js.map +1 -1
  596. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  597. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  598. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  599. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  600. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +143 -36
  601. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  602. package/build/dist/UI/Components/Navbar/NavBar.js +44 -9
  603. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  604. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  605. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  606. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +1 -1
  607. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  608. package/build/dist/UI/Components/SideMenu/SideMenu.js +9 -6
  609. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  610. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +1 -1
  611. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  612. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +7 -2
  613. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  614. package/build/dist/UI/Components/Table/TableHeader.js +20 -22
  615. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  616. package/build/dist/UI/Components/Table/TableRow.js +13 -4
  617. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  618. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
  619. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
  620. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
  621. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
  622. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
  623. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
  624. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js +126 -0
  625. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
  626. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
  627. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
  628. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +67 -32
  629. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  630. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js +114 -0
  631. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
  632. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  633. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
  636. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  637. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
  638. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
  639. package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
  640. package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
  641. package/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
  642. package/build/dist/Utils/Slug.js +31 -1
  643. package/build/dist/Utils/Slug.js.map +1 -1
  644. package/jest.config.json +1 -0
  645. package/package.json +2 -2
@@ -0,0 +1,153 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import {
3
+ StyleRule,
4
+ declaredValue,
5
+ rulesFor,
6
+ selectorsDeclaring,
7
+ } from "./ThemeStylesheet";
8
+
9
+ /*
10
+ * https://github.com/OneUptime/oneuptime/issues/3528: a black box around the
11
+ * graphs.
12
+ *
13
+ * recharts leaves its accessibility layer on, so the root <svg> of every
14
+ * chart carries tabindex="0", and the annotation layer gives the same to the
15
+ * <g> elements it draws for event chips and highlighted windows. Chrome's SVG
16
+ * user-agent stylesheet rings a focused <svg> on plain :focus rather than on
17
+ * :focus-visible the way it treats focusable HTML, so a mouse press inside a
18
+ * chart -- dragging out a zoom range on the Logs and Traces volume charts,
19
+ * clicking an event marker -- paints a hard black rectangle over the data.
20
+ *
21
+ * The fix is four lines of CSS, which is exactly why it needs cover: nothing
22
+ * else in the build would notice a reformat that dropped the descendant
23
+ * selector, or a reorder that let the user-agent ring back in. The rules
24
+ * carry no !important and no extra specificity, so their contract is a
25
+ * cascade contract, and that is what is asserted here rather than the literal
26
+ * text of the file.
27
+ *
28
+ * ChartFocusRingCoverage.test.tsx holds the other half: that the selectors
29
+ * written here still reach the elements recharts actually renders.
30
+ */
31
+
32
+ // The chart surface and the focusable shapes drawn inside it.
33
+ const POINTER_FOCUS_SELECTORS: Array<string> = [
34
+ ".recharts-surface:focus",
35
+ ".recharts-surface [tabindex]:focus",
36
+ ];
37
+
38
+ const KEYBOARD_FOCUS_SELECTORS: Array<string> = [
39
+ ".recharts-surface:focus-visible",
40
+ ".recharts-surface [tabindex]:focus-visible",
41
+ ];
42
+
43
+ describe("Chart focus rings", () => {
44
+ test.each(POINTER_FOCUS_SELECTORS)(
45
+ "%s drops the user-agent focus ring",
46
+ (selector: string) => {
47
+ expect(declaredValue(selector, "outline")).toBe("none");
48
+ },
49
+ );
50
+
51
+ test.each(KEYBOARD_FOCUS_SELECTORS)(
52
+ "%s draws a ring a keyboard reader can see",
53
+ (selector: string) => {
54
+ const outline: string | undefined = declaredValue(selector, "outline");
55
+
56
+ expect(outline).toBeDefined();
57
+ expect(outline).not.toBe("none");
58
+ // Themed, so the ring is legible on the dark canvas as well as the light one.
59
+ expect(outline).toContain("var(--ou-chart-focus-ring)");
60
+ },
61
+ );
62
+
63
+ /*
64
+ * A ring flush against the plot edge reads as a border on the chart itself.
65
+ * The offset is what makes it read as focus.
66
+ */
67
+ test.each(KEYBOARD_FOCUS_SELECTORS)(
68
+ "%s holds the ring off the plot",
69
+ (selector: string) => {
70
+ expect(declaredValue(selector, "outline-offset")).toBe("2px");
71
+ },
72
+ );
73
+
74
+ /*
75
+ * :focus and :focus-visible weigh the same, so the keyboard ring only
76
+ * survives while it is declared later in the file. Reordering the two blocks
77
+ * would leave keyboard users with no focus indicator at all, and no other
78
+ * assertion here would fail.
79
+ */
80
+ test("the keyboard ring is declared after the ring it restores", () => {
81
+ const sourceOrder: (selectors: Array<string>) => Array<number> = (
82
+ selectors: Array<string>,
83
+ ): Array<number> => {
84
+ return selectors.flatMap((selector: string): Array<number> => {
85
+ return rulesFor(selector).map((rule: StyleRule): number => {
86
+ return rule.index;
87
+ });
88
+ });
89
+ };
90
+
91
+ const pointerRuleIndexes: Array<number> = sourceOrder(
92
+ POINTER_FOCUS_SELECTORS,
93
+ );
94
+ const keyboardRuleIndexes: Array<number> = sourceOrder(
95
+ KEYBOARD_FOCUS_SELECTORS,
96
+ );
97
+
98
+ // Ordering says nothing if one side of it went missing.
99
+ expect(pointerRuleIndexes.length).toBe(POINTER_FOCUS_SELECTORS.length);
100
+ expect(keyboardRuleIndexes.length).toBe(KEYBOARD_FOCUS_SELECTORS.length);
101
+
102
+ expect(Math.min(...keyboardRuleIndexes)).toBeGreaterThan(
103
+ Math.max(...pointerRuleIndexes),
104
+ );
105
+ });
106
+
107
+ /*
108
+ * Neither rule is fought over by anything else in the sheet, so neither
109
+ * needs !important to win. If one ever appears here it means something else
110
+ * started competing for the same property, and the pair above stopped being
111
+ * the whole story.
112
+ */
113
+ test.each([...POINTER_FOCUS_SELECTORS, ...KEYBOARD_FOCUS_SELECTORS])(
114
+ "%s wins on the cascade alone",
115
+ (selector: string) => {
116
+ expect(declaredValue(selector, "outline")).not.toContain("!important");
117
+ },
118
+ );
119
+
120
+ describe("the accent the ring is drawn in", () => {
121
+ test.each([":root", "html.dark"])("%s defines it", (selector: string) => {
122
+ expect(declaredValue(selector, "--ou-chart-focus-ring")).toMatch(
123
+ /^#[0-9a-f]{6}$/i,
124
+ );
125
+ });
126
+
127
+ /*
128
+ * A single value cannot clear both canvases. Light and dark carry their
129
+ * own, the way every other --ou-chart-* token in the sheet does.
130
+ */
131
+ test("light and dark do not share one value", () => {
132
+ expect(declaredValue(":root", "--ou-chart-focus-ring")).not.toBe(
133
+ declaredValue("html.dark", "--ou-chart-focus-ring"),
134
+ );
135
+ });
136
+ });
137
+
138
+ /*
139
+ * The fix is deliberately narrow: it silences the ring on charts, and
140
+ * nothing else. A blanket `:focus { outline: none }` would take the focus
141
+ * indicator off the whole dashboard, which is the usual way this class of
142
+ * bug gets "fixed" and is far worse than the black box.
143
+ */
144
+ test("nothing outside the charts had its focus ring silenced", () => {
145
+ const silenced: Array<string> = selectorsDeclaring("outline", "none");
146
+
147
+ expect(silenced.length).toBeGreaterThan(0);
148
+
149
+ for (const selector of silenced) {
150
+ expect(selector.startsWith(".recharts-surface")).toBe(true);
151
+ }
152
+ });
153
+ });
@@ -0,0 +1,377 @@
1
+ import "@testing-library/jest-dom";
2
+ import { cleanup, render } from "@testing-library/react";
3
+ import React from "react";
4
+ import { afterEach, describe, expect, test } from "@jest/globals";
5
+ import { selectorsDeclaring } from "./ThemeStylesheet";
6
+
7
+ /*
8
+ * ResponsiveContainer measures its parent, which is always 0x0 in jsdom, so
9
+ * the chart renders nothing without a fixed size -- and a chart that renders
10
+ * nothing would pass every assertion in this file for the wrong reason. Same
11
+ * shim as ChartAnnotationRail.test.tsx; recharts is otherwise the real thing
12
+ * here, because what is under test is the DOM recharts actually produces.
13
+ */
14
+ jest.mock("recharts", () => {
15
+ const actual: Record<string, any> = jest.requireActual("recharts") as Record<
16
+ string,
17
+ any
18
+ >;
19
+ return {
20
+ ...actual,
21
+ ResponsiveContainer: ({ children }: { children: React.ReactElement }) => {
22
+ return React.cloneElement(children, { width: 800, height: 400 });
23
+ },
24
+ };
25
+ });
26
+
27
+ import AreaChartElement from "../../../UI/Components/Charts/Area/AreaChart";
28
+ import BarChartElement from "../../../UI/Components/Charts/Bar/BarChart";
29
+ import LineChartElement from "../../../UI/Components/Charts/Line/LineChart";
30
+ import ChartCurve from "../../../UI/Components/Charts/Types/ChartCurve";
31
+ import ChartEventKind from "../../../UI/Components/Charts/Types/ChartEventKind";
32
+ import ChartReferenceRegionProps from "../../../UI/Components/Charts/Types/ReferenceRegionProps";
33
+ import ChartTimeReferenceLineProps from "../../../UI/Components/Charts/Types/TimeReferenceLineProps";
34
+ import DataPoint from "../../../UI/Components/Charts/Types/DataPoint";
35
+ import SeriesPoint from "../../../UI/Components/Charts/Types/SeriesPoints";
36
+ import {
37
+ XAxis as ChartXAxis,
38
+ XAxisAggregateType,
39
+ } from "../../../UI/Components/Charts/Types/XAxis/XAxis";
40
+ import XAxisType from "../../../UI/Components/Charts/Types/XAxis/XAxisType";
41
+ import YAxis, {
42
+ YAxisPrecision,
43
+ } from "../../../UI/Components/Charts/Types/YAxis/YAxis";
44
+ import YAxisType from "../../../UI/Components/Charts/Types/YAxis/YAxisType";
45
+ import LogsHistogram from "../../../UI/Components/LogsViewer/components/LogsHistogram";
46
+ import TelemetryHistogram from "../../../UI/Components/TelemetryViewer/components/TelemetryHistogram";
47
+ import { HistogramBucket as LogsHistogramBucket } from "../../../UI/Components/LogsViewer/types";
48
+ import {
49
+ HistogramBucket as TelemetryHistogramBucket,
50
+ HistogramSeriesOption,
51
+ } from "../../../UI/Components/TelemetryViewer/types";
52
+
53
+ /*
54
+ * The other half of the cover for
55
+ * https://github.com/OneUptime/oneuptime/issues/3528.
56
+ *
57
+ * ChartFocusRing.test.ts pins what the stylesheet declares. This file pins
58
+ * that those declarations still land on something: it renders the real charts
59
+ * with real recharts and checks every element the browser could focus inside
60
+ * a plot against the selectors the shipped Theme.css actually carries.
61
+ *
62
+ * The selectors are read out of the stylesheet rather than restated here on
63
+ * purpose. A recharts upgrade that renamed .recharts-surface, dropped the
64
+ * accessibility layer's tabindex, or moved the annotation shapes out from
65
+ * under the surface would leave the CSS silently covering nothing, and a
66
+ * hardcoded copy of the selector list would keep passing right through it.
67
+ */
68
+
69
+ const START: Date = new Date("2026-03-02T00:00:00.000Z");
70
+ const END: Date = new Date("2026-03-02T06:00:00.000Z");
71
+
72
+ function minutesIn(minutes: number): Date {
73
+ return new Date(START.getTime() + minutes * 60 * 1000);
74
+ }
75
+
76
+ function buildSeries(): Array<SeriesPoint> {
77
+ const points: Array<DataPoint> = [];
78
+
79
+ for (let index: number = 0; index < 24; index++) {
80
+ points.push({
81
+ x: new Date(START.getTime() + index * 15 * 60 * 1000),
82
+ y: 100 + index,
83
+ });
84
+ }
85
+
86
+ return [{ seriesName: "latency", data: points }];
87
+ }
88
+
89
+ const X_AXIS: ChartXAxis = {
90
+ legend: "Time",
91
+ options: {
92
+ type: XAxisType.Time,
93
+ min: START,
94
+ max: END,
95
+ aggregateType: XAxisAggregateType.Average,
96
+ },
97
+ };
98
+
99
+ const Y_AXIS: YAxis = {
100
+ legend: "ms",
101
+ options: {
102
+ type: YAxisType.Number,
103
+ min: "auto",
104
+ max: "auto",
105
+ precision: YAxisPrecision.NoDecimals,
106
+ formatter: (value: number): string => {
107
+ return `${value} ms`;
108
+ },
109
+ },
110
+ };
111
+
112
+ /*
113
+ * Annotations are passed to every chart that takes them: the event chips and
114
+ * region pills they draw are focusable <g> elements portalled inside the
115
+ * plot, and they are the reason the selector needs its descendant half.
116
+ */
117
+ const TIME_REFERENCE_LINES: Array<ChartTimeReferenceLineProps> = [
118
+ {
119
+ date: minutesIn(90),
120
+ label: "Incident: API is down",
121
+ kind: ChartEventKind.Incident,
122
+ color: "#f87171",
123
+ },
124
+ ];
125
+
126
+ const REFERENCE_REGIONS: Array<ChartReferenceRegionProps> = [
127
+ {
128
+ startDate: minutesIn(180),
129
+ endDate: minutesIn(240),
130
+ label: "Maintenance",
131
+ color: "#60a5fa",
132
+ },
133
+ ];
134
+
135
+ function logsBuckets(): Array<LogsHistogramBucket> {
136
+ return [
137
+ { time: "2026-03-02T00:00:00.000Z", severity: "Error", count: 4 },
138
+ { time: "2026-03-02T00:05:00.000Z", severity: "Error", count: 9 },
139
+ { time: "2026-03-02T00:10:00.000Z", severity: "Information", count: 21 },
140
+ ];
141
+ }
142
+
143
+ function telemetryBuckets(): Array<TelemetryHistogramBucket> {
144
+ return [
145
+ { time: "2026-03-02T00:00:00.000Z", series: "Ok", count: 108 },
146
+ { time: "2026-03-02T00:05:00.000Z", series: "Unset", count: 837 },
147
+ { time: "2026-03-02T00:10:00.000Z", series: "Ok", count: 42 },
148
+ ];
149
+ }
150
+
151
+ const TELEMETRY_SERIES: Array<HistogramSeriesOption> = [
152
+ { key: "Ok", label: "Ok", color: "#10b981" },
153
+ { key: "Unset", label: "Unset", color: "#9ca3af" },
154
+ ];
155
+
156
+ interface ChartUnderTest {
157
+ name: string;
158
+ render: () => React.ReactElement;
159
+ }
160
+
161
+ /*
162
+ * Every chart in the product that recharts draws. The two histograms are the
163
+ * ones the issue was filed against; the three chart-library charts are the
164
+ * ones the reporter meant by "it happens around all the graphs".
165
+ */
166
+ const CHARTS: Array<ChartUnderTest> = [
167
+ {
168
+ name: "LineChart",
169
+ render: (): React.ReactElement => {
170
+ return (
171
+ <LineChartElement
172
+ data={buildSeries()}
173
+ xAxis={X_AXIS}
174
+ yAxis={Y_AXIS}
175
+ curve={ChartCurve.MONOTONE}
176
+ heightInPx={400}
177
+ sync={false}
178
+ syncid="focus-ring-test"
179
+ showLegend={true}
180
+ timeReferenceLines={TIME_REFERENCE_LINES}
181
+ referenceRegions={REFERENCE_REGIONS}
182
+ />
183
+ );
184
+ },
185
+ },
186
+ {
187
+ name: "AreaChart",
188
+ render: (): React.ReactElement => {
189
+ return (
190
+ <AreaChartElement
191
+ data={buildSeries()}
192
+ xAxis={X_AXIS}
193
+ yAxis={Y_AXIS}
194
+ curve={ChartCurve.MONOTONE}
195
+ heightInPx={400}
196
+ sync={false}
197
+ syncid="focus-ring-test"
198
+ showLegend={true}
199
+ timeReferenceLines={TIME_REFERENCE_LINES}
200
+ referenceRegions={REFERENCE_REGIONS}
201
+ />
202
+ );
203
+ },
204
+ },
205
+ {
206
+ name: "BarChart",
207
+ render: (): React.ReactElement => {
208
+ return (
209
+ <BarChartElement
210
+ data={buildSeries()}
211
+ xAxis={X_AXIS}
212
+ yAxis={Y_AXIS}
213
+ heightInPx={400}
214
+ sync={false}
215
+ syncid="focus-ring-test"
216
+ showLegend={true}
217
+ timeReferenceLines={TIME_REFERENCE_LINES}
218
+ referenceRegions={REFERENCE_REGIONS}
219
+ />
220
+ );
221
+ },
222
+ },
223
+ {
224
+ name: "LogsHistogram",
225
+ render: (): React.ReactElement => {
226
+ return (
227
+ <LogsHistogram
228
+ buckets={logsBuckets()}
229
+ isLoading={false}
230
+ onTimeRangeSelect={(): void => {}}
231
+ />
232
+ );
233
+ },
234
+ },
235
+ {
236
+ name: "TelemetryHistogram",
237
+ render: (): React.ReactElement => {
238
+ return (
239
+ <TelemetryHistogram
240
+ buckets={telemetryBuckets()}
241
+ isLoading={false}
242
+ series={TELEMETRY_SERIES}
243
+ title="Traces over time"
244
+ onTimeRangeSelect={(): void => {}}
245
+ />
246
+ );
247
+ },
248
+ },
249
+ ];
250
+
251
+ /** The selectors Theme.css uses to take the user-agent ring off a chart. */
252
+ const NEUTRALIZING_SELECTORS: Array<string> = selectorsDeclaring(
253
+ "outline",
254
+ "none",
255
+ );
256
+
257
+ function surfacesIn(container: HTMLElement): Array<SVGSVGElement> {
258
+ return Array.from(
259
+ container.querySelectorAll("svg.recharts-surface"),
260
+ ) as Array<SVGSVGElement>;
261
+ }
262
+
263
+ /*
264
+ * Everything inside a plot that the browser can put focus on -- the surface
265
+ * itself plus any tabindex-carrying shape drawn into it. These are exactly
266
+ * the elements Chrome's SVG user-agent stylesheet would ring.
267
+ */
268
+ function focusableChartElements(container: HTMLElement): Array<Element> {
269
+ const focusable: Array<Element> = [];
270
+
271
+ for (const surface of surfacesIn(container)) {
272
+ if (surface.hasAttribute("tabindex")) {
273
+ focusable.push(surface);
274
+ }
275
+
276
+ focusable.push(...Array.from(surface.querySelectorAll("[tabindex]")));
277
+ }
278
+
279
+ return focusable;
280
+ }
281
+
282
+ function describeElement(element: Element): string {
283
+ const testId: string | null = element.getAttribute("data-testid");
284
+
285
+ return [
286
+ element.tagName.toLowerCase(),
287
+ element.getAttribute("class") ? `.${element.getAttribute("class")}` : "",
288
+ testId ? `[data-testid="${testId}"]` : "",
289
+ `[tabindex="${element.getAttribute("tabindex")}"]`,
290
+ ].join("");
291
+ }
292
+
293
+ afterEach((): void => {
294
+ cleanup();
295
+ });
296
+
297
+ describe("Chart focus ring coverage", () => {
298
+ test("the stylesheet still silences something", () => {
299
+ expect(NEUTRALIZING_SELECTORS.length).toBeGreaterThan(0);
300
+ });
301
+
302
+ describe.each(
303
+ CHARTS.map((chart: ChartUnderTest): [string, ChartUnderTest] => {
304
+ return [chart.name, chart];
305
+ }),
306
+ )("%s", (_name: string, chart: ChartUnderTest) => {
307
+ /*
308
+ * The premise of the whole fix. If recharts ever renames this class or
309
+ * stops handing the plot a tabindex, the CSS becomes dead weight and the
310
+ * rest of these assertions stop meaning anything -- so it fails here
311
+ * first, where the message says why.
312
+ */
313
+ test("draws a plot the browser can focus, under the class the fix targets", () => {
314
+ const { container } = render(chart.render());
315
+ const surfaces: Array<SVGSVGElement> = surfacesIn(container);
316
+
317
+ expect(surfaces.length).toBeGreaterThan(0);
318
+
319
+ const focusableSurfaces: Array<SVGSVGElement> = surfaces.filter(
320
+ (surface: SVGSVGElement): boolean => {
321
+ return surface.getAttribute("tabindex") === "0";
322
+ },
323
+ );
324
+
325
+ expect(focusableSurfaces.length).toBeGreaterThan(0);
326
+ });
327
+
328
+ /*
329
+ * The assertion the issue is really about: nothing a pointer can land on
330
+ * inside the plot is left to the user-agent ring.
331
+ */
332
+ test("no focusable element inside the plot is left to the user-agent ring", () => {
333
+ const { container } = render(chart.render());
334
+ const focusable: Array<Element> = focusableChartElements(container);
335
+
336
+ expect(focusable.length).toBeGreaterThan(0);
337
+
338
+ const uncovered: Array<string> = focusable
339
+ .filter((element: Element): boolean => {
340
+ return !NEUTRALIZING_SELECTORS.some((selector: string): boolean => {
341
+ /*
342
+ * Matched without the pseudo-class: jsdom can say whether the
343
+ * element is the surface or sits inside one, which is the part of
344
+ * the selector that decides coverage. Whether :focus is on is the
345
+ * browser's business, and the harness in the pull request covers
346
+ * that end.
347
+ */
348
+ return element.matches(selector.replace(/:focus(-visible)?/g, ""));
349
+ });
350
+ })
351
+ .map(describeElement);
352
+
353
+ expect(uncovered).toEqual([]);
354
+ });
355
+ });
356
+
357
+ /*
358
+ * The annotation shapes are focusable by design -- they are buttons a
359
+ * reader clicks -- and they were getting boxed one by one on every click.
360
+ * The descendant half of the selector is the only thing covering them, so
361
+ * this asserts they are really there to be covered rather than letting the
362
+ * loop above pass on a chart that happened to draw none.
363
+ */
364
+ test("the annotation layer really does put focusable shapes inside the plot", () => {
365
+ const { container } = render(CHARTS[0]!.render());
366
+
367
+ const annotationShapes: Array<Element> = focusableChartElements(
368
+ container,
369
+ ).filter((element: Element): boolean => {
370
+ return Boolean(
371
+ element.getAttribute("data-testid")?.startsWith("chart-annotation"),
372
+ );
373
+ });
374
+
375
+ expect(annotationShapes.length).toBeGreaterThan(0);
376
+ });
377
+ });
@@ -0,0 +1,162 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+
4
+ /*
5
+ * A reader for Common/UI/Styles/Theme.css, shared by the suites that hold the
6
+ * stylesheet to a contract.
7
+ *
8
+ * jsdom's CSS engine is not used for this on purpose. Theme.css is written for
9
+ * a real browser -- :is(), color-mix(), space-separated rgb() with a percent
10
+ * alpha -- and jsdom's parser drops what it cannot model, silently, which
11
+ * would turn a missing rule and an unparsed one into the same green test.
12
+ * Reading the file directly keeps a failure meaning what it says.
13
+ */
14
+
15
+ const THEME_STYLESHEET_PATH: string = path.resolve(
16
+ __dirname,
17
+ "..",
18
+ "..",
19
+ "..",
20
+ "UI",
21
+ "Styles",
22
+ "Theme.css",
23
+ );
24
+
25
+ export interface StyleRule {
26
+ /** Normalised, one entry per comma-separated selector in the prelude. */
27
+ selectors: Array<string>;
28
+ declarations: Record<string, string>;
29
+ /** Source order, which decides the winner between equal specificities. */
30
+ index: number;
31
+ }
32
+
33
+ function normalizeWhitespace(value: string): string {
34
+ return value.replace(/\s+/g, " ").trim();
35
+ }
36
+
37
+ function parseDeclarations(body: string): Record<string, string> {
38
+ const declarations: Record<string, string> = {};
39
+
40
+ for (const declaration of body.split(";")) {
41
+ const separatorAt: number = declaration.indexOf(":");
42
+
43
+ if (separatorAt === -1) {
44
+ continue;
45
+ }
46
+
47
+ const property: string = normalizeWhitespace(
48
+ declaration.slice(0, separatorAt),
49
+ );
50
+ const value: string = normalizeWhitespace(
51
+ declaration.slice(separatorAt + 1),
52
+ );
53
+
54
+ if (property) {
55
+ declarations[property] = value;
56
+ }
57
+ }
58
+
59
+ return declarations;
60
+ }
61
+
62
+ /*
63
+ * Only top-level rules are collected. Everything asserted against this lives
64
+ * at the top level of the sheet; at-rules (@media, @keyframes) are skipped
65
+ * whole so their inner blocks cannot be mistaken for one.
66
+ */
67
+ export function parseTopLevelRules(css: string): Array<StyleRule> {
68
+ const withoutComments: string = css.replace(/\/\*[\s\S]*?\*\//g, "");
69
+ const rules: Array<StyleRule> = [];
70
+
71
+ let prelude: string = "";
72
+ let body: string = "";
73
+ let depth: number = 0;
74
+
75
+ for (const character of withoutComments) {
76
+ if (character === "{") {
77
+ depth++;
78
+
79
+ if (depth === 1) {
80
+ continue;
81
+ }
82
+ }
83
+
84
+ if (character === "}") {
85
+ depth--;
86
+
87
+ if (depth === 0) {
88
+ const selectorText: string = normalizeWhitespace(prelude);
89
+
90
+ if (selectorText && !selectorText.startsWith("@")) {
91
+ rules.push({
92
+ selectors: selectorText.split(",").map(normalizeWhitespace),
93
+ declarations: parseDeclarations(body),
94
+ index: rules.length,
95
+ });
96
+ }
97
+
98
+ prelude = "";
99
+ body = "";
100
+ continue;
101
+ }
102
+ }
103
+
104
+ if (depth === 0) {
105
+ prelude += character;
106
+ } else {
107
+ body += character;
108
+ }
109
+ }
110
+
111
+ return rules;
112
+ }
113
+
114
+ export const THEME_RULES: Array<StyleRule> = parseTopLevelRules(
115
+ fs.readFileSync(THEME_STYLESHEET_PATH, "utf8"),
116
+ );
117
+
118
+ export function rulesFor(selector: string): Array<StyleRule> {
119
+ return THEME_RULES.filter((rule: StyleRule): boolean => {
120
+ return rule.selectors.includes(selector);
121
+ });
122
+ }
123
+
124
+ /*
125
+ * The last declaration wins. Every rule these suites reach for carries no
126
+ * !important and no specificity beyond one class plus one pseudo-class, so
127
+ * source order is the whole tiebreak.
128
+ */
129
+ export function declaredValue(
130
+ selector: string,
131
+ property: string,
132
+ ): string | undefined {
133
+ const matching: Array<StyleRule> = rulesFor(selector).filter(
134
+ (rule: StyleRule): boolean => {
135
+ return rule.declarations[property] !== undefined;
136
+ },
137
+ );
138
+
139
+ return matching[matching.length - 1]?.declarations[property];
140
+ }
141
+
142
+ /**
143
+ * Every selector in the sheet that gives `property` exactly `value` -- the way
144
+ * a suite asks the shipped stylesheet what it actually covers, rather than
145
+ * restating the answer as a literal and testing itself.
146
+ */
147
+ export function selectorsDeclaring(
148
+ property: string,
149
+ value: string,
150
+ ): Array<string> {
151
+ const selectors: Array<string> = [];
152
+
153
+ for (const rule of THEME_RULES) {
154
+ if (rule.declarations[property] !== value) {
155
+ continue;
156
+ }
157
+
158
+ selectors.push(...rule.selectors);
159
+ }
160
+
161
+ return selectors;
162
+ }