@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,773 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import ChartEventKind from "../../../../UI/Components/Charts/Types/ChartEventKind";
3
+ import FormattedReferenceRegion from "../../../../UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion";
4
+ import FormattedTimeReferenceLine from "../../../../UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine";
5
+ import {
6
+ AxisTick,
7
+ BARE_CHART_MARGIN_TOP,
8
+ CategoryXResolver,
9
+ MARKER_RAIL_HEIGHT,
10
+ MarkerCluster,
11
+ PositionedMarker,
12
+ PositionedRegion,
13
+ RAIL_GAP,
14
+ REGION_RAIL_HEIGHT,
15
+ SINGLE_MARKER_CHIP_SIZE,
16
+ buildCategoryXResolver,
17
+ clampHoverCardLeft,
18
+ clusterMarkers,
19
+ getChartMarginTop,
20
+ getChipWidth,
21
+ getMarkerRailY,
22
+ getRailHeight,
23
+ getRegionRailY,
24
+ getRelativeLuminance,
25
+ positionMarkers,
26
+ positionRegions,
27
+ toAnnotationColor,
28
+ truncateLabelToWidth,
29
+ } from "../../../../UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout";
30
+
31
+ /*
32
+ * The annotation rail's geometry, clustering and colour handling live in
33
+ * this module precisely so they can be tested without a DOM: jsdom gives
34
+ * recharts a 0x0 chart and gives us no text metrics, so anything that had
35
+ * to measure would be untestable here.
36
+ */
37
+
38
+ const PLOT: { x: number; y: number; width: number; height: number } = {
39
+ x: 60,
40
+ y: 40,
41
+ width: 500,
42
+ height: 200,
43
+ };
44
+
45
+ function marker(data: {
46
+ bucketIndex: number;
47
+ label?: string | undefined;
48
+ color?: string | undefined;
49
+ kind?: ChartEventKind | undefined;
50
+ strokeDasharray?: string | undefined;
51
+ onClick?: (() => void) | undefined;
52
+ }): FormattedTimeReferenceLine {
53
+ return {
54
+ formattedX: `bucket-${data.bucketIndex}`,
55
+ bucketIndex: data.bucketIndex,
56
+ original: {
57
+ date: new Date("2026-03-02T00:00:00.000Z"),
58
+ label: data.label ?? `event ${data.bucketIndex}`,
59
+ color: data.color,
60
+ kind: data.kind,
61
+ strokeDasharray: data.strokeDasharray,
62
+ onClick: data.onClick,
63
+ },
64
+ };
65
+ }
66
+
67
+ function region(data: {
68
+ start: number;
69
+ end: number;
70
+ label?: string | undefined;
71
+ color?: string | undefined;
72
+ }): FormattedReferenceRegion {
73
+ return {
74
+ formattedX1: `bucket-${data.start}`,
75
+ formattedX2: `bucket-${data.end}`,
76
+ startBucketIndex: data.start,
77
+ endBucketIndex: data.end,
78
+ original: {
79
+ startDate: new Date("2026-03-02T00:00:00.000Z"),
80
+ endDate: new Date("2026-03-02T01:00:00.000Z"),
81
+ label: data.label,
82
+ color: data.color,
83
+ },
84
+ };
85
+ }
86
+
87
+ function labels(count: number): Array<string> {
88
+ return Array.from({ length: count }, (_unused: unknown, index: number) => {
89
+ return `bucket-${index}`;
90
+ });
91
+ }
92
+
93
+ function tick(index: number, coordinate: number, value?: string): AxisTick {
94
+ return { index, coordinate, value: value ?? `bucket-${index}` };
95
+ }
96
+
97
+ describe("buildCategoryXResolver", () => {
98
+ test("fits the point scale from two rendered ticks", () => {
99
+ /*
100
+ * recharts spaces categories evenly, so any two ticks recover the
101
+ * whole line — including the axis padding already baked into their
102
+ * coordinates.
103
+ */
104
+ const resolve: CategoryXResolver = buildCategoryXResolver({
105
+ ticks: [tick(0, 80), tick(48, 326), tick(96, 572)],
106
+ categoryLabels: labels(97),
107
+ plotArea: PLOT,
108
+ axisPaddingPx: 20,
109
+ scaleKind: "point",
110
+ });
111
+
112
+ expect(resolve(0)).toBe(80);
113
+ expect(resolve(48)).toBe(326);
114
+ expect(resolve(96)).toBe(572);
115
+ // An index between ticks interpolates on the same line.
116
+ expect(resolve(24)).toBeCloseTo(203, 6);
117
+ });
118
+
119
+ test("a repeated label does not stop it resolving — the whole point", () => {
120
+ /*
121
+ * A 48h window at 30-minute buckets formats bare HH:mm, so every label
122
+ * appears twice. recharts' categorical scale refuses to resolve ANY
123
+ * label on such a domain, which is why positions come from indices.
124
+ */
125
+ const repeated: Array<string> = [
126
+ ...labels(48).map((_unused: string, index: number) => {
127
+ return `${index}:00`;
128
+ }),
129
+ ...labels(48).map((_unused: string, index: number) => {
130
+ return `${index}:00`;
131
+ }),
132
+ ];
133
+
134
+ const resolve: CategoryXResolver = buildCategoryXResolver({
135
+ ticks: [tick(0, 80, "0:00"), tick(90, 530, "42:00")],
136
+ categoryLabels: repeated,
137
+ plotArea: PLOT,
138
+ axisPaddingPx: 20,
139
+ scaleKind: "point",
140
+ });
141
+
142
+ const dayOne: number | null = resolve(12);
143
+ const dayTwo: number | null = resolve(60);
144
+ expect(dayOne).not.toBeNull();
145
+ expect(dayTwo).not.toBeNull();
146
+ // Same label, different index — and therefore a different position.
147
+ expect(repeated[12]).toBe(repeated[60]);
148
+ expect(dayTwo).toBeGreaterThan(dayOne!);
149
+ });
150
+
151
+ test("indices outside the axis resolve to null", () => {
152
+ const resolve: CategoryXResolver = buildCategoryXResolver({
153
+ ticks: [tick(0, 80), tick(9, 530)],
154
+ categoryLabels: labels(10),
155
+ plotArea: PLOT,
156
+ axisPaddingPx: 20,
157
+ scaleKind: "point",
158
+ });
159
+
160
+ expect(resolve(-1)).toBeNull();
161
+ expect(resolve(10)).toBeNull();
162
+ expect(resolve(9)).toBe(530);
163
+ });
164
+
165
+ test("ticks whose value no longer names their row are not fitted on", () => {
166
+ /*
167
+ * `startEndOnly` hands recharts synthetic explicit ticks. Fitting on
168
+ * one whose index does not address the row it names would skew every
169
+ * marker, so the resolver drops to plot geometry instead.
170
+ */
171
+ const resolve: CategoryXResolver = buildCategoryXResolver({
172
+ ticks: [tick(0, 80, "not-the-row"), tick(9, 530, "also-wrong")],
173
+ categoryLabels: labels(10),
174
+ plotArea: PLOT,
175
+ axisPaddingPx: 20,
176
+ scaleKind: "point",
177
+ });
178
+
179
+ // Analytic point-scale geometry: 60 + 20 .. 60 + 500 - 20.
180
+ expect(resolve(0)).toBe(80);
181
+ expect(resolve(9)).toBe(540);
182
+ });
183
+
184
+ test("falls back to point geometry with no ticks at all", () => {
185
+ const resolve: CategoryXResolver = buildCategoryXResolver({
186
+ ticks: undefined,
187
+ categoryLabels: labels(11),
188
+ plotArea: PLOT,
189
+ axisPaddingPx: 20,
190
+ scaleKind: "point",
191
+ });
192
+
193
+ expect(resolve(0)).toBe(80);
194
+ expect(resolve(10)).toBe(540);
195
+ expect(resolve(5)).toBe(310);
196
+ });
197
+
198
+ test("falls back to band geometry for bar charts", () => {
199
+ /*
200
+ * A band scale gives each category a band and sits it at the centre,
201
+ * so neither the first nor the last category touches the plot edge.
202
+ */
203
+ const resolve: CategoryXResolver = buildCategoryXResolver({
204
+ ticks: [],
205
+ categoryLabels: labels(10),
206
+ plotArea: PLOT,
207
+ axisPaddingPx: 0,
208
+ scaleKind: "band",
209
+ });
210
+
211
+ expect(resolve(0)).toBe(85); // 60 + 0.5 * 50
212
+ expect(resolve(9)).toBe(535); // 60 + 9.5 * 50
213
+ });
214
+
215
+ test("a single category centres in the plot rather than dividing by zero", () => {
216
+ const resolve: CategoryXResolver = buildCategoryXResolver({
217
+ ticks: [],
218
+ categoryLabels: labels(1),
219
+ plotArea: PLOT,
220
+ axisPaddingPx: 20,
221
+ scaleKind: "point",
222
+ });
223
+
224
+ expect(resolve(0)).toBe(310);
225
+ });
226
+
227
+ test("a single tick cannot define a step, so geometry wins", () => {
228
+ const resolve: CategoryXResolver = buildCategoryXResolver({
229
+ ticks: [tick(3, 999)],
230
+ categoryLabels: labels(11),
231
+ plotArea: PLOT,
232
+ axisPaddingPx: 20,
233
+ scaleKind: "point",
234
+ });
235
+
236
+ expect(resolve(0)).toBe(80);
237
+ });
238
+
239
+ test("a zero-width plot never yields NaN", () => {
240
+ const resolve: CategoryXResolver = buildCategoryXResolver({
241
+ ticks: [],
242
+ categoryLabels: labels(10),
243
+ plotArea: { x: 0, y: 0, width: 0, height: 0 },
244
+ axisPaddingPx: 20,
245
+ scaleKind: "point",
246
+ });
247
+
248
+ expect(Number.isFinite(resolve(0))).toBe(true);
249
+ });
250
+ });
251
+
252
+ describe("positionMarkers", () => {
253
+ const resolve: CategoryXResolver = buildCategoryXResolver({
254
+ ticks: [tick(0, 100), tick(10, 500)],
255
+ categoryLabels: labels(11),
256
+ plotArea: PLOT,
257
+ axisPaddingPx: 20,
258
+ scaleKind: "point",
259
+ });
260
+
261
+ test("resolves markers to pixels and sorts them left to right", () => {
262
+ const positioned: Array<PositionedMarker> = positionMarkers({
263
+ markers: [
264
+ marker({ bucketIndex: 8 }),
265
+ marker({ bucketIndex: 1 }),
266
+ marker({ bucketIndex: 5 }),
267
+ ],
268
+ resolveX: resolve,
269
+ });
270
+
271
+ expect(
272
+ positioned.map((entry: PositionedMarker) => {
273
+ return entry.categoryIndex;
274
+ }),
275
+ ).toEqual([1, 5, 8]);
276
+ expect(positioned[0]!.xPixel).toBe(140);
277
+ });
278
+
279
+ test("drops markers whose bucket is off the axis", () => {
280
+ /*
281
+ * A window change can outrun the annotations by a render; a marker
282
+ * pointing at a bucket that no longer exists is skipped rather than
283
+ * drawn at NaN.
284
+ */
285
+ const positioned: Array<PositionedMarker> = positionMarkers({
286
+ markers: [marker({ bucketIndex: 99 }), marker({ bucketIndex: 2 })],
287
+ resolveX: resolve,
288
+ });
289
+
290
+ expect(positioned).toHaveLength(1);
291
+ expect(positioned[0]!.categoryIndex).toBe(2);
292
+ });
293
+
294
+ test("an empty marker list positions nothing", () => {
295
+ expect(positionMarkers({ markers: [], resolveX: resolve })).toEqual([]);
296
+ });
297
+ });
298
+
299
+ describe("clusterMarkers", () => {
300
+ function at(xPixel: number): PositionedMarker {
301
+ return {
302
+ xPixel,
303
+ categoryIndex: xPixel,
304
+ marker: marker({ bucketIndex: xPixel }),
305
+ };
306
+ }
307
+
308
+ test("markers far apart each keep their own chip", () => {
309
+ const clusters: Array<MarkerCluster> = clusterMarkers({
310
+ positioned: [at(100), at(200), at(300)],
311
+ });
312
+
313
+ expect(clusters).toHaveLength(3);
314
+ expect(
315
+ clusters.map((cluster: MarkerCluster) => {
316
+ return cluster.markers.length;
317
+ }),
318
+ ).toEqual([1, 1, 1]);
319
+ });
320
+
321
+ test("markers inside the separation collapse into one counted chip", () => {
322
+ const clusters: Array<MarkerCluster> = clusterMarkers({
323
+ positioned: [at(100), at(104), at(110), at(300)],
324
+ separationPx: 18,
325
+ });
326
+
327
+ expect(clusters).toHaveLength(2);
328
+ expect(clusters[0]!.markers).toHaveLength(3);
329
+ // The chip sits on a real event, not on the average of several.
330
+ expect(clusters[0]!.xPixel).toBe(100);
331
+ expect(clusters[1]!.markers).toHaveLength(1);
332
+ });
333
+
334
+ test("a dense window widens the separation until the chips fit", () => {
335
+ /*
336
+ * 60 markers evenly spread over 600px are 10px apart: at the default
337
+ * separation that is 60 chips, which is a comb, not a rail.
338
+ */
339
+ const positioned: Array<PositionedMarker> = Array.from(
340
+ { length: 60 },
341
+ (_unused: unknown, index: number) => {
342
+ return at(index * 10);
343
+ },
344
+ );
345
+
346
+ const clusters: Array<MarkerCluster> = clusterMarkers({
347
+ positioned,
348
+ maxClusters: 12,
349
+ });
350
+
351
+ expect(clusters.length).toBeLessThanOrEqual(12);
352
+ // Nothing is dropped — every marker is still reachable through a chip.
353
+ expect(
354
+ clusters.reduce((total: number, cluster: MarkerCluster) => {
355
+ return total + cluster.markers.length;
356
+ }, 0),
357
+ ).toBe(60);
358
+ });
359
+
360
+ test("markers stacked on one pixel collapse however many there are", () => {
361
+ const positioned: Array<PositionedMarker> = Array.from(
362
+ { length: 40 },
363
+ () => {
364
+ return at(250);
365
+ },
366
+ );
367
+
368
+ const clusters: Array<MarkerCluster> = clusterMarkers({ positioned });
369
+
370
+ expect(clusters).toHaveLength(1);
371
+ expect(clusters[0]!.markers).toHaveLength(40);
372
+ });
373
+
374
+ test("a cluster takes the colour of the most serious thing in it", () => {
375
+ const clusters: Array<MarkerCluster> = clusterMarkers({
376
+ positioned: [
377
+ {
378
+ xPixel: 100,
379
+ categoryIndex: 1,
380
+ marker: marker({
381
+ bucketIndex: 1,
382
+ kind: ChartEventKind.Change,
383
+ color: "#6366f1",
384
+ }),
385
+ },
386
+ {
387
+ xPixel: 104,
388
+ categoryIndex: 2,
389
+ marker: marker({
390
+ bucketIndex: 2,
391
+ kind: ChartEventKind.Incident,
392
+ color: "#f87171",
393
+ }),
394
+ },
395
+ {
396
+ xPixel: 106,
397
+ categoryIndex: 3,
398
+ marker: marker({
399
+ bucketIndex: 3,
400
+ kind: ChartEventKind.Alert,
401
+ color: "#fbbf24",
402
+ }),
403
+ },
404
+ ],
405
+ });
406
+
407
+ expect(clusters).toHaveLength(1);
408
+ expect(clusters[0]!.kind).toBe(ChartEventKind.Incident);
409
+ expect(clusters[0]!.color).toBe("#f87171");
410
+ });
411
+
412
+ test("a mixed cluster draws solid — dashes mean change event", () => {
413
+ const clusters: Array<MarkerCluster> = clusterMarkers({
414
+ positioned: [
415
+ {
416
+ xPixel: 100,
417
+ categoryIndex: 1,
418
+ marker: marker({ bucketIndex: 1, strokeDasharray: "4 4" }),
419
+ },
420
+ {
421
+ xPixel: 104,
422
+ categoryIndex: 2,
423
+ marker: marker({ bucketIndex: 2 }),
424
+ },
425
+ ],
426
+ });
427
+
428
+ expect(clusters[0]!.strokeDasharray).toBeUndefined();
429
+ });
430
+
431
+ test("a cluster of only change events keeps its dashes", () => {
432
+ const clusters: Array<MarkerCluster> = clusterMarkers({
433
+ positioned: [
434
+ {
435
+ xPixel: 100,
436
+ categoryIndex: 1,
437
+ marker: marker({ bucketIndex: 1, strokeDasharray: "4 4" }),
438
+ },
439
+ {
440
+ xPixel: 104,
441
+ categoryIndex: 2,
442
+ marker: marker({ bucketIndex: 2, strokeDasharray: "4 4" }),
443
+ },
444
+ ],
445
+ });
446
+
447
+ expect(clusters[0]!.strokeDasharray).toBe("4 4");
448
+ });
449
+
450
+ test("cluster ids survive a resize", () => {
451
+ /*
452
+ * A pixel-keyed id would remount the rail on every frame of a window
453
+ * drag and drop any open hover card with it.
454
+ */
455
+ const before: Array<MarkerCluster> = clusterMarkers({
456
+ positioned: [at(100), at(300)],
457
+ });
458
+ const after: Array<MarkerCluster> = clusterMarkers({
459
+ positioned: [
460
+ {
461
+ xPixel: 150,
462
+ categoryIndex: 100,
463
+ marker: marker({ bucketIndex: 100 }),
464
+ },
465
+ {
466
+ xPixel: 450,
467
+ categoryIndex: 300,
468
+ marker: marker({ bucketIndex: 300 }),
469
+ },
470
+ ],
471
+ });
472
+
473
+ expect(after[0]!.id).toBe(before[0]!.id);
474
+ expect(after[1]!.id).toBe(before[1]!.id);
475
+ });
476
+
477
+ test("no markers means no clusters", () => {
478
+ expect(clusterMarkers({ positioned: [] })).toEqual([]);
479
+ });
480
+ });
481
+
482
+ describe("positionRegions", () => {
483
+ const resolve: CategoryXResolver = buildCategoryXResolver({
484
+ ticks: [tick(0, 100), tick(10, 500)],
485
+ categoryLabels: labels(11),
486
+ plotArea: PLOT,
487
+ axisPaddingPx: 20,
488
+ scaleKind: "point",
489
+ });
490
+
491
+ test("resolves a span to its pixel edges", () => {
492
+ const positioned: Array<PositionedRegion> = positionRegions({
493
+ regions: [region({ start: 2, end: 6, label: "Maintenance" })],
494
+ resolveX: resolve,
495
+ });
496
+
497
+ expect(positioned).toHaveLength(1);
498
+ expect(positioned[0]!.x1).toBe(180);
499
+ expect(positioned[0]!.x2).toBe(340);
500
+ });
501
+
502
+ test("reversed endpoints are ordered rather than inverted", () => {
503
+ const positioned: Array<PositionedRegion> = positionRegions({
504
+ regions: [region({ start: 6, end: 2 })],
505
+ resolveX: resolve,
506
+ });
507
+
508
+ expect(positioned[0]!.x1).toBeLessThan(positioned[0]!.x2);
509
+ });
510
+
511
+ test("a region collapsed onto one bucket still gets drawable width", () => {
512
+ const positioned: Array<PositionedRegion> = positionRegions({
513
+ regions: [region({ start: 4, end: 4 })],
514
+ resolveX: resolve,
515
+ minWidthPx: 2,
516
+ });
517
+
518
+ expect(positioned[0]!.x2 - positioned[0]!.x1).toBe(2);
519
+ });
520
+
521
+ test("a region whose buckets left the axis is dropped", () => {
522
+ const positioned: Array<PositionedRegion> = positionRegions({
523
+ regions: [region({ start: 40, end: 60 })],
524
+ resolveX: resolve,
525
+ });
526
+
527
+ expect(positioned).toEqual([]);
528
+ });
529
+ });
530
+
531
+ describe("rail geometry", () => {
532
+ test("nothing to draw costs the plot nothing", () => {
533
+ expect(getRailHeight({ hasMarkers: false, hasRegions: false })).toBe(0);
534
+ expect(
535
+ getChartMarginTop({
536
+ hasMarkers: false,
537
+ hasRegions: false,
538
+ hasTopLegend: false,
539
+ }),
540
+ ).toBe(BARE_CHART_MARGIN_TOP);
541
+ });
542
+
543
+ test("markers alone need one strip, markers plus regions need two", () => {
544
+ const markersOnly: number = getRailHeight({
545
+ hasMarkers: true,
546
+ hasRegions: false,
547
+ });
548
+ const both: number = getRailHeight({ hasMarkers: true, hasRegions: true });
549
+
550
+ expect(markersOnly).toBe(MARKER_RAIL_HEIGHT + RAIL_GAP);
551
+ expect(both).toBe(markersOnly + REGION_RAIL_HEIGHT + RAIL_GAP);
552
+ });
553
+
554
+ test("a top legend buys the rail its strip, so the margin stays bare", () => {
555
+ /*
556
+ * recharts lays a top-aligned legend out between the margin and the
557
+ * plot. Growing the margin would put the rail ABOVE the legend; the
558
+ * legend's own height is padded instead.
559
+ */
560
+ expect(
561
+ getChartMarginTop({
562
+ hasMarkers: true,
563
+ hasRegions: true,
564
+ hasTopLegend: true,
565
+ }),
566
+ ).toBe(BARE_CHART_MARGIN_TOP);
567
+ });
568
+
569
+ test("with no legend the margin has to carry the rail itself", () => {
570
+ const railHeight: number = getRailHeight({
571
+ hasMarkers: true,
572
+ hasRegions: true,
573
+ });
574
+
575
+ expect(
576
+ getChartMarginTop({
577
+ hasMarkers: true,
578
+ hasRegions: true,
579
+ hasTopLegend: false,
580
+ }),
581
+ ).toBe(railHeight);
582
+ });
583
+
584
+ test("both rail strips sit above the plot, region strip on top", () => {
585
+ const plotTop: number = 90;
586
+
587
+ expect(getMarkerRailY(plotTop)).toBeLessThan(plotTop);
588
+ expect(getRegionRailY(plotTop)).toBeLessThan(getMarkerRailY(plotTop));
589
+ // Nothing pokes above the space the margin/legend reserved.
590
+ expect(plotTop - getRegionRailY(plotTop)).toBe(
591
+ getRailHeight({ hasMarkers: true, hasRegions: true }),
592
+ );
593
+ });
594
+
595
+ test("too little headroom slides the rail down instead of off-canvas", () => {
596
+ /*
597
+ * The chart reserves the rail's strip through its margin or its legend
598
+ * padding, but a legend that reports no height at all would leave the
599
+ * rail hanging above the SVG's own edge, where it is clipped away and
600
+ * the feature simply vanishes. Overlapping is the better failure.
601
+ */
602
+ expect(getMarkerRailY(2)).toBe(0);
603
+ expect(getRegionRailY(2)).toBe(0);
604
+ expect(getMarkerRailY(0)).toBe(0);
605
+ });
606
+
607
+ test("a single-marker chip is round; a counted chip widens with its digits", () => {
608
+ expect(getChipWidth(1)).toBe(SINGLE_MARKER_CHIP_SIZE);
609
+ expect(getChipWidth(0)).toBe(SINGLE_MARKER_CHIP_SIZE);
610
+ expect(getChipWidth(9)).toBeGreaterThan(getChipWidth(1));
611
+ expect(getChipWidth(12)).toBeGreaterThan(getChipWidth(9));
612
+ expect(getChipWidth(120)).toBeGreaterThan(getChipWidth(12));
613
+ });
614
+ });
615
+
616
+ describe("clampHoverCardLeft", () => {
617
+ test("centres on its chip when there is room", () => {
618
+ expect(
619
+ clampHoverCardLeft({ anchorX: 400, cardWidth: 288, chartWidth: 900 }),
620
+ ).toBe(256);
621
+ });
622
+
623
+ test("slides back in rather than hanging off the left edge", () => {
624
+ expect(
625
+ clampHoverCardLeft({ anchorX: 20, cardWidth: 288, chartWidth: 900 }),
626
+ ).toBe(4);
627
+ });
628
+
629
+ test("slides back in rather than hanging off the right edge", () => {
630
+ expect(
631
+ clampHoverCardLeft({ anchorX: 890, cardWidth: 288, chartWidth: 900 }),
632
+ ).toBe(608);
633
+ });
634
+
635
+ test("a card wider than the chart pins to the left so its start reads", () => {
636
+ expect(
637
+ clampHoverCardLeft({ anchorX: 100, cardWidth: 288, chartWidth: 200 }),
638
+ ).toBe(4);
639
+ });
640
+ });
641
+
642
+ describe("truncateLabelToWidth", () => {
643
+ test("a label that fits is returned untouched", () => {
644
+ expect(
645
+ truncateLabelToWidth({
646
+ label: "Maintenance",
647
+ maxWidthPx: 400,
648
+ fontSizePx: 9,
649
+ }),
650
+ ).toBe("Maintenance");
651
+ });
652
+
653
+ test("a label that does not fit ends in an ellipsis", () => {
654
+ const shown: string | null = truncateLabelToWidth({
655
+ label: "Scheduled maintenance window",
656
+ maxWidthPx: 40,
657
+ fontSizePx: 9,
658
+ });
659
+
660
+ expect(shown).not.toBeNull();
661
+ expect(shown!.endsWith("…")).toBe(true);
662
+ expect(shown!.length).toBeLessThan("Scheduled maintenance window".length);
663
+ });
664
+
665
+ test("too narrow for even a stub gives nothing, not a one-letter label", () => {
666
+ expect(
667
+ truncateLabelToWidth({
668
+ label: "Maintenance",
669
+ maxWidthPx: 4,
670
+ fontSizePx: 9,
671
+ }),
672
+ ).toBeNull();
673
+ expect(
674
+ truncateLabelToWidth({
675
+ label: "Maintenance",
676
+ maxWidthPx: -20,
677
+ fontSizePx: 9,
678
+ }),
679
+ ).toBeNull();
680
+ });
681
+
682
+ test("a zero font size cannot divide by zero", () => {
683
+ expect(
684
+ truncateLabelToWidth({
685
+ label: "Maintenance",
686
+ maxWidthPx: 40,
687
+ fontSizePx: 0,
688
+ }),
689
+ ).toBeNull();
690
+ });
691
+ });
692
+
693
+ describe("toAnnotationColor", () => {
694
+ /*
695
+ * Severity colours are project-editable rows, and the chart surface
696
+ * flips with the theme, so a marker colour has to be legible on both
697
+ * without knowing which one it is on.
698
+ */
699
+
700
+ test("colours already in the readable band pass through untouched", () => {
701
+ expect(toAnnotationColor("#f87171")).toBe("#f87171");
702
+ expect(toAnnotationColor("#6366f1")).toBe("#6366f1");
703
+ });
704
+
705
+ test("a near-white severity is darkened until it reads on white", () => {
706
+ const clamped: string = toAnnotationColor("#fffbea");
707
+
708
+ expect(clamped).not.toBe("#fffbea");
709
+ expect(getRelativeLuminance(clamped)!).toBeLessThanOrEqual(
710
+ getRelativeLuminance("#fffbea")!,
711
+ );
712
+ expect(getRelativeLuminance(clamped)!).toBeLessThan(0.65);
713
+ });
714
+
715
+ test("a near-black severity is lightened until it reads on the dark surface", () => {
716
+ const clamped: string = toAnnotationColor("#050505");
717
+
718
+ expect(clamped).not.toBe("#050505");
719
+ expect(getRelativeLuminance(clamped)!).toBeGreaterThan(
720
+ getRelativeLuminance("#050505")!,
721
+ );
722
+ });
723
+
724
+ test("clamping is idempotent — a clamped colour is already in band", () => {
725
+ const once: string = toAnnotationColor("#ffffff");
726
+ expect(toAnnotationColor(once)).toBe(once);
727
+ });
728
+
729
+ test("the clamped colour is itself inside the band", () => {
730
+ /*
731
+ * The search has to return the last blend that LANDED in the band, not
732
+ * the last one it probed — otherwise clamping a clamped colour moves it
733
+ * again, and two markers of the same severity could differ.
734
+ */
735
+ for (const input of [
736
+ "#ffffff",
737
+ "#fffbea",
738
+ "#050505",
739
+ "#000000",
740
+ "#fefefe",
741
+ "#0a0a0a",
742
+ ]) {
743
+ const clamped: string = toAnnotationColor(input);
744
+ const luminance: number | null = getRelativeLuminance(clamped);
745
+ expect(luminance).not.toBeNull();
746
+ expect(luminance!).toBeGreaterThanOrEqual(0.09);
747
+ expect(luminance!).toBeLessThanOrEqual(0.62);
748
+ expect(toAnnotationColor(clamped)).toBe(clamped);
749
+ }
750
+ });
751
+
752
+ test("hue survives the clamp: a red severity stays red", () => {
753
+ const clamped: string = toAnnotationColor("#ffe5e5");
754
+ const red: number = parseInt(clamped.slice(1, 3), 16);
755
+ const blue: number = parseInt(clamped.slice(5, 7), 16);
756
+
757
+ expect(red).toBeGreaterThan(blue);
758
+ });
759
+
760
+ test("shorthand hex is understood", () => {
761
+ expect(toAnnotationColor("#f00")).toBe("#f00");
762
+ expect(getRelativeLuminance("#fff")).toBeCloseTo(1, 5);
763
+ });
764
+
765
+ test("anything that is not a plain hex is the caller's to own", () => {
766
+ // A CSS var or a named colour cannot be measured; guessing is worse.
767
+ expect(toAnnotationColor("var(--ou-chart-tick)")).toBe(
768
+ "var(--ou-chart-tick)",
769
+ );
770
+ expect(toAnnotationColor("rebeccapurple")).toBe("rebeccapurple");
771
+ expect(getRelativeLuminance("not a colour")).toBeNull();
772
+ });
773
+ });