@oneuptime/common 13.0.1 → 13.0.4

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 (781) hide show
  1. package/Models/AnalyticsModels/RumSession.ts +34 -0
  2. package/Models/DatabaseModels/AlertEpisodeLabelRule.ts +2 -2
  3. package/Models/DatabaseModels/AlertEpisodeOnCallRule.ts +2 -2
  4. package/Models/DatabaseModels/AlertEpisodeOwnerRule.ts +2 -2
  5. package/Models/DatabaseModels/AlertEpisodePrivacyRule.ts +2 -2
  6. package/Models/DatabaseModels/AlertGroupingRule.ts +2 -2
  7. package/Models/DatabaseModels/AlertLabelRule.ts +2 -2
  8. package/Models/DatabaseModels/AlertOnCallRule.ts +2 -2
  9. package/Models/DatabaseModels/AlertOwnerRule.ts +2 -2
  10. package/Models/DatabaseModels/AlertPrivacyRule.ts +2 -2
  11. package/Models/DatabaseModels/AlertReminderRule.ts +6 -4
  12. package/Models/DatabaseModels/AutoRemediationRule.ts +2 -2
  13. package/Models/DatabaseModels/CephClusterLabelRule.ts +2 -2
  14. package/Models/DatabaseModels/CephClusterOwnerRule.ts +2 -2
  15. package/Models/DatabaseModels/CloudResourceLabelRule.ts +2 -2
  16. package/Models/DatabaseModels/CloudResourceOwnerRule.ts +2 -2
  17. package/Models/DatabaseModels/DashboardLabelRule.ts +2 -2
  18. package/Models/DatabaseModels/DashboardOwnerRule.ts +2 -2
  19. package/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.ts +11 -0
  20. package/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.ts +44 -0
  21. package/Models/DatabaseModels/DockerHostLabelRule.ts +2 -2
  22. package/Models/DatabaseModels/DockerHostOwnerRule.ts +2 -2
  23. package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +2 -2
  24. package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +2 -2
  25. package/Models/DatabaseModels/HostLabelRule.ts +2 -2
  26. package/Models/DatabaseModels/HostOwnerRule.ts +2 -2
  27. package/Models/DatabaseModels/IncidentEpisodeLabelRule.ts +2 -2
  28. package/Models/DatabaseModels/IncidentEpisodeOnCallRule.ts +2 -2
  29. package/Models/DatabaseModels/IncidentEpisodeOwnerRule.ts +2 -2
  30. package/Models/DatabaseModels/IncidentEpisodePrivacyRule.ts +2 -2
  31. package/Models/DatabaseModels/IncidentGroupingRule.ts +2 -2
  32. package/Models/DatabaseModels/IncidentLabelRule.ts +2 -2
  33. package/Models/DatabaseModels/IncidentOnCallRule.ts +2 -2
  34. package/Models/DatabaseModels/IncidentOwnerRule.ts +2 -2
  35. package/Models/DatabaseModels/IncidentPrivacyRule.ts +2 -2
  36. package/Models/DatabaseModels/IncidentReminderRule.ts +6 -4
  37. package/Models/DatabaseModels/IncidentSlaRule.ts +2 -2
  38. package/Models/DatabaseModels/IncomingCallPolicy.ts +3 -4
  39. package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +2 -2
  40. package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +2 -2
  41. package/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.ts +254 -0
  42. package/Models/DatabaseModels/Index.ts +2 -0
  43. package/Models/DatabaseModels/IoTFleetLabelRule.ts +2 -2
  44. package/Models/DatabaseModels/IoTFleetOwnerRule.ts +2 -2
  45. package/Models/DatabaseModels/KubernetesClusterLabelRule.ts +2 -2
  46. package/Models/DatabaseModels/KubernetesClusterOwnerRule.ts +2 -2
  47. package/Models/DatabaseModels/MonitorLabelRule.ts +2 -2
  48. package/Models/DatabaseModels/MonitorOwnerRule.ts +2 -2
  49. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +2 -2
  50. package/Models/DatabaseModels/NetworkDeviceLabelRule.ts +2 -2
  51. package/Models/DatabaseModels/NetworkDeviceOwnerRule.ts +2 -2
  52. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +2 -2
  53. package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +2 -2
  54. package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +2 -2
  55. package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +2 -2
  56. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +2 -2
  57. package/Models/DatabaseModels/PodmanHostLabelRule.ts +2 -2
  58. package/Models/DatabaseModels/PodmanHostOwnerRule.ts +2 -2
  59. package/Models/DatabaseModels/ProxmoxClusterLabelRule.ts +2 -2
  60. package/Models/DatabaseModels/ProxmoxClusterOwnerRule.ts +2 -2
  61. package/Models/DatabaseModels/RumApplicationLabelRule.ts +2 -2
  62. package/Models/DatabaseModels/RumApplicationOwnerRule.ts +2 -2
  63. package/Models/DatabaseModels/RunbookLabelRule.ts +2 -2
  64. package/Models/DatabaseModels/RunbookOwnerRule.ts +2 -2
  65. package/Models/DatabaseModels/RunbookRule.ts +2 -2
  66. package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +2 -2
  67. package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +2 -2
  68. package/Models/DatabaseModels/ScheduledMaintenanceReminderRule.ts +6 -4
  69. package/Models/DatabaseModels/ServerlessFunctionLabelRule.ts +2 -2
  70. package/Models/DatabaseModels/ServerlessFunctionOwnerRule.ts +2 -2
  71. package/Models/DatabaseModels/ServiceLabelRule.ts +2 -2
  72. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +283 -4
  73. package/Models/DatabaseModels/ServiceOwnerRule.ts +2 -2
  74. package/Models/DatabaseModels/StatusPageLabelRule.ts +2 -2
  75. package/Models/DatabaseModels/StatusPageMonitorRule.ts +2 -2
  76. package/Models/DatabaseModels/StatusPageOwnerRule.ts +2 -2
  77. package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +2 -2
  78. package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +2 -2
  79. package/Models/DatabaseModels/WorkflowLabelRule.ts +2 -2
  80. package/Models/DatabaseModels/WorkflowOwnerRule.ts +2 -2
  81. package/Server/API/TelemetryAPI.ts +323 -2
  82. package/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.ts +111 -0
  83. package/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.ts +644 -0
  84. package/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.ts +72 -0
  85. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  86. package/Server/Middleware/MultipartFormData.ts +46 -21
  87. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +21 -0
  88. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +21 -0
  89. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +21 -0
  90. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +21 -0
  91. package/Server/Services/AlertGroupingEngineService.ts +27 -0
  92. package/Server/Services/AlertLabelRuleEngineService.ts +27 -0
  93. package/Server/Services/AlertOnCallRuleEngineService.ts +27 -0
  94. package/Server/Services/AlertOwnerRuleEngineService.ts +27 -0
  95. package/Server/Services/AlertPrivacyRuleEngineService.ts +27 -0
  96. package/Server/Services/AlertReminderRuleService.ts +65 -33
  97. package/Server/Services/AutoRemediationRuleEngineService.ts +90 -8
  98. package/Server/Services/CephClusterLabelRuleEngineService.ts +20 -0
  99. package/Server/Services/CephClusterOwnerRuleEngineService.ts +20 -0
  100. package/Server/Services/CloudResourceLabelRuleEngineService.ts +20 -0
  101. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +20 -0
  102. package/Server/Services/DashboardLabelRuleEngineService.ts +20 -0
  103. package/Server/Services/DashboardOwnerRuleEngineService.ts +20 -0
  104. package/Server/Services/DatabaseService.ts +409 -6
  105. package/Server/Services/DockerHostLabelRuleEngineService.ts +20 -0
  106. package/Server/Services/DockerHostOwnerRuleEngineService.ts +20 -0
  107. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +23 -0
  108. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +23 -0
  109. package/Server/Services/HostLabelRuleEngineService.ts +13 -0
  110. package/Server/Services/HostOwnerRuleEngineService.ts +13 -0
  111. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +21 -0
  112. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +21 -0
  113. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +21 -0
  114. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +21 -0
  115. package/Server/Services/IncidentGroupingEngineService.ts +64 -13
  116. package/Server/Services/IncidentLabelRuleEngineService.ts +64 -9
  117. package/Server/Services/IncidentOnCallRuleEngineService.ts +64 -10
  118. package/Server/Services/IncidentOwnerRuleEngineService.ts +64 -10
  119. package/Server/Services/IncidentPrivacyRuleEngineService.ts +64 -10
  120. package/Server/Services/IncidentReminderRuleService.ts +66 -34
  121. package/Server/Services/IncidentSlaRuleService.ts +55 -12
  122. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +20 -0
  123. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +20 -0
  124. package/Server/Services/IncomingCallPolicyPhoneNumberService.ts +184 -0
  125. package/Server/Services/IncomingCallPolicyService.ts +276 -5
  126. package/Server/Services/Index.ts +2 -0
  127. package/Server/Services/IoTFleetLabelRuleEngineService.ts +20 -0
  128. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +20 -0
  129. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +23 -0
  130. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +23 -0
  131. package/Server/Services/LabelService.ts +50 -7
  132. package/Server/Services/MonitorLabelRuleEngineService.ts +20 -0
  133. package/Server/Services/MonitorOwnerRuleEngineService.ts +20 -0
  134. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +2 -0
  135. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +93 -1
  136. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +26 -0
  137. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +25 -0
  138. package/Server/Services/NetworkDeviceService.ts +2 -0
  139. package/Server/Services/NetworkSiteAssignmentRuleService.ts +90 -1
  140. package/Server/Services/NetworkSiteService.ts +242 -29
  141. package/Server/Services/NetworkSiteTypeService.ts +177 -77
  142. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +20 -0
  143. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +20 -0
  144. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +22 -0
  145. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +22 -0
  146. package/Server/Services/PodmanHostLabelRuleEngineService.ts +20 -0
  147. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +20 -0
  148. package/Server/Services/ProjectCallSMSConfigService.ts +156 -7
  149. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +25 -0
  150. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +25 -0
  151. package/Server/Services/RumApplicationLabelRuleEngineService.ts +22 -0
  152. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +22 -0
  153. package/Server/Services/RunbookLabelRuleEngineService.ts +20 -0
  154. package/Server/Services/RunbookOwnerRuleEngineService.ts +20 -0
  155. package/Server/Services/RunbookRuleEngineService.ts +18 -1
  156. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +62 -10
  157. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +62 -11
  158. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +48 -18
  159. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +25 -0
  160. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +25 -0
  161. package/Server/Services/ServiceLabelRuleEngineService.ts +20 -0
  162. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +675 -12
  163. package/Server/Services/ServiceLevelObjectiveService.ts +55 -13
  164. package/Server/Services/ServiceOwnerRuleEngineService.ts +20 -0
  165. package/Server/Services/StatusPageLabelRuleEngineService.ts +20 -0
  166. package/Server/Services/StatusPageMonitorRuleEngineService.ts +31 -2
  167. package/Server/Services/StatusPageMonitorRuleService.ts +34 -1
  168. package/Server/Services/StatusPageOwnerRuleEngineService.ts +20 -0
  169. package/Server/Services/UserService.ts +23 -50
  170. package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +25 -0
  171. package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +25 -0
  172. package/Server/Services/WorkflowLabelRuleEngineService.ts +20 -0
  173. package/Server/Services/WorkflowOwnerRuleEngineService.ts +20 -0
  174. package/Server/Static/Brand/README.md +10 -5
  175. package/Server/Static/Brand/favicons/oneuptime-up-v1.svg +8 -0
  176. package/Server/Types/Database/QueryHelper.ts +88 -0
  177. package/Server/Utils/AI/Toolbox/SloTools.ts +19 -2
  178. package/Server/Utils/IncomingCallPhoneNumber.ts +29 -16
  179. package/Server/Utils/Profiling.ts +13 -1
  180. package/Server/Utils/Rules/MonitorRuleCriteriaCache.ts +38 -0
  181. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +498 -0
  182. package/Server/Utils/Telemetry.ts +3 -1
  183. package/Server/Utils/VendorAssets.ts +3 -0
  184. package/Tests/App/Dashboard/AIInsightViewTriage.test.tsx +348 -0
  185. package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +476 -0
  186. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +25 -0
  187. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +449 -24
  188. package/Tests/App/Dashboard/DashboardPersistentSideMenuLayouts.test.tsx +702 -0
  189. package/Tests/App/Dashboard/ExceptionsLandingRedirect.test.tsx +63 -0
  190. package/Tests/App/Dashboard/FeedOrdering.test.ts +150 -0
  191. package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +279 -100
  192. package/Tests/App/Dashboard/InventoryItemSideMenu.test.tsx +155 -0
  193. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +11 -0
  194. package/Tests/App/Dashboard/PasskeySettings.test.tsx +215 -71
  195. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +347 -0
  196. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +263 -0
  197. package/Tests/App/Dashboard/ResourceFeed.test.tsx +413 -17
  198. package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +138 -0
  199. package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +940 -0
  200. package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +378 -0
  201. package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +735 -0
  202. package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +275 -108
  203. package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +13 -3
  204. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +127 -4
  205. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -4
  206. package/Tests/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.test.ts +362 -0
  207. package/Tests/Models/DatabaseModels/RuleBaseModel.test.ts +69 -0
  208. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +181 -0
  209. package/Tests/Server/API/SessionReplayAPI.test.ts +1303 -145
  210. package/Tests/Server/API/UserTwoFactorSelfService.test.ts +407 -0
  211. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +611 -0
  212. package/Tests/Server/Middleware/MultipartFormData.test.ts +61 -3
  213. package/Tests/Server/Middleware/TelemetryIngestionDisabled.test.ts +211 -0
  214. package/Tests/Server/Services/AlertIncidentRuleCriteriaEngineServices.test.ts +651 -0
  215. package/Tests/Server/Services/AutoRemediationRuleEngineService.test.ts +79 -0
  216. package/Tests/Server/Services/DatabaseServiceRelationOnlyRuleRollout.test.ts +330 -0
  217. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +522 -0
  218. package/Tests/Server/Services/IncidentSlaRuleCriteriaCorrelation.test.ts +99 -0
  219. package/Tests/Server/Services/IncomingCallPolicyPhoneNumberService.test.ts +1540 -0
  220. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +179 -2
  221. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +170 -0
  222. package/Tests/Server/Services/NetworkSiteService.test.ts +559 -53
  223. package/Tests/Server/Services/NetworkSiteTypeService.test.ts +122 -55
  224. package/Tests/Server/Services/ReminderRuleCriteria.test.ts +173 -0
  225. package/Tests/Server/Services/ResourceRuleCriteriaEngineServices.test.ts +170 -0
  226. package/Tests/Server/Services/ScheduledMaintenanceRuleCriteriaCorrelation.test.ts +154 -0
  227. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +2450 -470
  228. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +464 -121
  229. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +281 -0
  230. package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +132 -0
  231. package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +159 -14
  232. package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +6 -8
  233. package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +203 -34
  234. package/Tests/Server/Types/Database/QueryHelperJsonArrayObjects.test.ts +128 -0
  235. package/Tests/Server/Utils/AI/SloTools.test.ts +190 -1
  236. package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +461 -0
  237. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +25 -0
  238. package/Tests/Server/Utils/Billing/BillingFailureNoticeThrottle.test.ts +359 -0
  239. package/Tests/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.test.ts +318 -0
  240. package/Tests/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.test.ts +220 -0
  241. package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +1043 -0
  242. package/Tests/Server/Utils/Execute.test.ts +302 -0
  243. package/Tests/Server/Utils/GracefulShutdown.test.ts +565 -0
  244. package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +36 -20
  245. package/Tests/Server/Utils/LoggerCore.test.ts +597 -0
  246. package/Tests/Server/Utils/Monitor/MonitorTemplateUtil.test.ts +1109 -0
  247. package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +750 -0
  248. package/Tests/Server/Utils/ProductAnalytics.test.ts +404 -0
  249. package/Tests/Server/Utils/Profiling.test.ts +366 -0
  250. package/Tests/Server/Utils/Rules/MonitorRuleCriteriaCache.test.ts +99 -0
  251. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +558 -0
  252. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +711 -0
  253. package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +522 -0
  254. package/Tests/Server/Utils/VendorAssets.test.ts +17 -0
  255. package/Tests/Types/Dashboard/DashboardTemplateEditorialInvariants.test.ts +659 -0
  256. package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +97 -0
  257. package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +1179 -0
  258. package/Tests/Types/Database/AccessControl/OwnedThrough.test.ts +136 -0
  259. package/Tests/Types/OnCallDutyPolicy/LayerUtilCorePaths.test.ts +1014 -0
  260. package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveRotation.test.ts +9 -6
  261. package/Tests/Types/Rules/RuleCriteriaFieldRegistry.test.ts +276 -0
  262. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +180 -1
  263. package/Tests/Types/Telemetry/LlmConventions.test.ts +495 -0
  264. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +13 -6
  265. package/Tests/UI/Components/Alert.test.tsx +532 -93
  266. package/Tests/UI/Components/Feed.test.tsx +241 -0
  267. package/Tests/UI/Components/Forms/BasicFormStepNavigation.test.tsx +368 -0
  268. package/Tests/UI/Components/Forms/FormSummary.test.tsx +454 -0
  269. package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +290 -0
  270. package/Tests/UI/Components/Forms/ModelFormRuleCriteria.test.tsx +331 -0
  271. package/Tests/UI/Components/IconOpticalSize.test.tsx +79 -31
  272. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +6 -6
  273. package/Tests/UI/Components/NavBar.test.tsx +91 -2
  274. package/Tests/UI/Components/PencilButton.test.tsx +211 -0
  275. package/Tests/UI/Components/RuleCriteria/RuleCriteriaBuilder.test.tsx +510 -0
  276. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +350 -0
  277. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +50 -0
  278. package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +329 -0
  279. package/Tests/UI/Components/useFeedItems.test.tsx +107 -0
  280. package/Tests/UI/Rum/ChunkLoader.test.ts +401 -0
  281. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +1 -1
  282. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +7 -1
  283. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +2 -0
  284. package/Tests/UI/Rum/ReplayEngine.test.ts +1069 -5
  285. package/Tests/UI/Rum/ReplayHeader.test.tsx +579 -2
  286. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +23 -5
  287. package/Tests/UI/Rum/ReplayRail.test.tsx +143 -1
  288. package/Tests/UI/Rum/ReplayRenderBudget.test.tsx +338 -0
  289. package/Tests/UI/Rum/ReplaySignals.test.ts +179 -0
  290. package/Tests/UI/Rum/ReplayStage.test.tsx +210 -3
  291. package/Tests/UI/Rum/ReplayTimeline.test.tsx +180 -1
  292. package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +405 -0
  293. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +13 -16
  294. package/Tests/UI/Rum/SessionReplayFacets.test.tsx +199 -0
  295. package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +58 -21
  296. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +2 -0
  297. package/Tests/UI/Rum/SessionReplayTable.test.tsx +717 -4
  298. package/Tests/UI/Rum/SessionReplayUsersPage.test.tsx +435 -0
  299. package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +577 -0
  300. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +1 -1
  301. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -1
  302. package/Tests/UI/Utils/LabelRuleImportExport.test.ts +192 -0
  303. package/Tests/UI/Utils/Navigation.test.ts +30 -0
  304. package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +880 -0
  305. package/Tests/Utils/LabelRuleImportExport.test.ts +158 -0
  306. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +93 -0
  307. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +138 -0
  308. package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +174 -0
  309. package/Tests/Utils/Rules/RuleCriteriaMatcher.test.ts +1424 -0
  310. package/Tests/Utils/Rum/SessionIdentity.test.ts +72 -0
  311. package/Tests/Utils/Rum/SessionReplayHealth.test.ts +884 -0
  312. package/Tests/Utils/Slo/SloBurnRateRuleState.test.ts +374 -28
  313. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +118 -0
  314. package/Types/Dashboard/DashboardTemplates.ts +465 -0
  315. package/Types/OnCallDutyPolicy/Layer.ts +12 -0
  316. package/Types/Rules/RuleCriteria.ts +51 -0
  317. package/Types/Rules/RuleCriteriaFieldRegistry.ts +449 -0
  318. package/Types/Rum/SessionReplay.ts +75 -0
  319. package/Types/Rum/SessionReplayApi.ts +93 -0
  320. package/UI/Components/Alerts/Alert.tsx +102 -72
  321. package/UI/Components/Button/Button.tsx +4 -1
  322. package/UI/Components/Dropdown/Dropdown.tsx +2 -0
  323. package/UI/Components/Feed/Feed.tsx +15 -0
  324. package/UI/Components/Feed/useFeedItems.ts +227 -0
  325. package/UI/Components/Forms/BasicForm.tsx +42 -21
  326. package/UI/Components/Forms/ModelForm.tsx +80 -1
  327. package/UI/Components/Icon/Icon.tsx +3 -35
  328. package/UI/Components/ModelTable/ModelTable.tsx +19 -0
  329. package/UI/Components/Navbar/NavBar.tsx +1 -0
  330. package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +735 -0
  331. package/UI/Components/RuleCriteria/RuleCriteriaModelForm.tsx +209 -0
  332. package/UI/Components/RuleCriteria/RuleCriteriaModelTable.tsx +205 -0
  333. package/UI/Components/RuleCriteria/RuleCriteriaSummary.tsx +123 -0
  334. package/UI/Components/Table/Table.tsx +3 -0
  335. package/UI/Components/Table/TableBody.tsx +3 -0
  336. package/UI/Components/Table/TableRow.tsx +8 -2
  337. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +14 -2
  338. package/UI/Styles/Theme.css +1 -0
  339. package/UI/Utils/LabelRuleImportExport.ts +114 -6
  340. package/UI/Utils/Navigation.ts +1 -2
  341. package/UI/esbuild-config.js +46 -0
  342. package/Utils/Faker.ts +93 -6
  343. package/Utils/LabelRuleImportExport.ts +295 -2
  344. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +108 -8
  345. package/Utils/NetworkSite/CidrMatchUtil.ts +102 -0
  346. package/Utils/NetworkSite/TypeHierarchyUtil.ts +152 -2
  347. package/Utils/Rules/RuleCriteriaMatcher.ts +931 -0
  348. package/Utils/Rum/SessionIdentity.ts +16 -0
  349. package/Utils/Slo/SloBurnRateRuleState.ts +87 -33
  350. package/Utils/Telemetry/OriginAllowList.ts +74 -0
  351. package/build/dist/Models/AnalyticsModels/RumSession.js +32 -0
  352. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js +2 -2
  354. package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js +2 -2
  356. package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js +2 -2
  358. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js +2 -2
  360. package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +2 -2
  362. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/AlertLabelRule.js +2 -2
  364. package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/AlertOnCallRule.js +2 -2
  366. package/build/dist/Models/DatabaseModels/AlertOnCallRule.js.map +1 -1
  367. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +2 -2
  368. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
  369. package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js +2 -2
  370. package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js.map +1 -1
  371. package/build/dist/Models/DatabaseModels/AlertReminderRule.js +6 -5
  372. package/build/dist/Models/DatabaseModels/AlertReminderRule.js.map +1 -1
  373. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js +2 -2
  374. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js.map +1 -1
  375. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js +2 -2
  376. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js.map +1 -1
  377. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js +2 -2
  378. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js.map +1 -1
  379. package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js +2 -2
  380. package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js.map +1 -1
  381. package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js +2 -2
  382. package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js.map +1 -1
  383. package/build/dist/Models/DatabaseModels/DashboardLabelRule.js +2 -2
  384. package/build/dist/Models/DatabaseModels/DashboardLabelRule.js.map +1 -1
  385. package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js +2 -2
  386. package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js.map +1 -1
  387. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js +12 -0
  388. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js.map +1 -0
  389. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js +50 -0
  390. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js.map +1 -0
  391. package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js +2 -2
  392. package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js.map +1 -1
  393. package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js +2 -2
  394. package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js.map +1 -1
  395. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +2 -2
  396. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -1
  397. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +2 -2
  398. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -1
  399. package/build/dist/Models/DatabaseModels/HostLabelRule.js +2 -2
  400. package/build/dist/Models/DatabaseModels/HostLabelRule.js.map +1 -1
  401. package/build/dist/Models/DatabaseModels/HostOwnerRule.js +2 -2
  402. package/build/dist/Models/DatabaseModels/HostOwnerRule.js.map +1 -1
  403. package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js +2 -2
  404. package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js.map +1 -1
  405. package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js +2 -2
  406. package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js.map +1 -1
  407. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js +2 -2
  408. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js.map +1 -1
  409. package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js +2 -2
  410. package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js.map +1 -1
  411. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +2 -2
  412. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
  413. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +2 -2
  414. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
  415. package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js +2 -2
  416. package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js.map +1 -1
  417. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +2 -2
  418. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
  419. package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js +2 -2
  420. package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js.map +1 -1
  421. package/build/dist/Models/DatabaseModels/IncidentReminderRule.js +6 -5
  422. package/build/dist/Models/DatabaseModels/IncidentReminderRule.js.map +1 -1
  423. package/build/dist/Models/DatabaseModels/IncidentSlaRule.js +2 -2
  424. package/build/dist/Models/DatabaseModels/IncidentSlaRule.js.map +1 -1
  425. package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js +3 -4
  426. package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js.map +1 -1
  427. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +2 -2
  428. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
  429. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +2 -2
  430. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
  431. package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js +277 -0
  432. package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js.map +1 -0
  433. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  434. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  435. package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js +2 -2
  436. package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js.map +1 -1
  437. package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js +2 -2
  438. package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js.map +1 -1
  439. package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js +2 -2
  440. package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js.map +1 -1
  441. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js +2 -2
  442. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js.map +1 -1
  443. package/build/dist/Models/DatabaseModels/MonitorLabelRule.js +2 -2
  444. package/build/dist/Models/DatabaseModels/MonitorLabelRule.js.map +1 -1
  445. package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js +2 -2
  446. package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js.map +1 -1
  447. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +2 -2
  448. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  449. package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js +2 -2
  450. package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js.map +1 -1
  451. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js +2 -2
  452. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js.map +1 -1
  453. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +2 -2
  454. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
  455. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +2 -2
  456. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
  457. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +2 -2
  458. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
  459. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +2 -2
  460. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
  461. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +2 -2
  462. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
  463. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +2 -2
  464. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -1
  465. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +2 -2
  466. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -1
  467. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js +2 -2
  468. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js.map +1 -1
  469. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js +2 -2
  470. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js.map +1 -1
  471. package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js +2 -2
  472. package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js.map +1 -1
  473. package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js +2 -2
  474. package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js.map +1 -1
  475. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +2 -2
  476. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
  477. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +2 -2
  478. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
  479. package/build/dist/Models/DatabaseModels/RunbookRule.js +2 -2
  480. package/build/dist/Models/DatabaseModels/RunbookRule.js.map +1 -1
  481. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +2 -2
  482. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
  483. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +2 -2
  484. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
  485. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js +6 -5
  486. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js.map +1 -1
  487. package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js +2 -2
  488. package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js.map +1 -1
  489. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js +2 -2
  490. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js.map +1 -1
  491. package/build/dist/Models/DatabaseModels/ServiceLabelRule.js +2 -2
  492. package/build/dist/Models/DatabaseModels/ServiceLabelRule.js.map +1 -1
  493. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +281 -4
  494. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
  495. package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js +2 -2
  496. package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js.map +1 -1
  497. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +2 -2
  498. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
  499. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +2 -2
  500. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -1
  501. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +2 -2
  502. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
  503. package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +2 -2
  504. package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -1
  505. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +2 -2
  506. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -1
  507. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +2 -2
  508. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
  509. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +2 -2
  510. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
  511. package/build/dist/Server/API/TelemetryAPI.js +211 -4
  512. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  513. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js +60 -0
  514. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js.map +1 -0
  515. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js +301 -0
  516. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js.map +1 -0
  517. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js +30 -0
  518. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js.map +1 -0
  519. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  520. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  521. package/build/dist/Server/Middleware/MultipartFormData.js +38 -21
  522. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  523. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +17 -0
  524. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  525. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +17 -0
  526. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  527. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +17 -0
  528. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  529. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +17 -0
  530. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  531. package/build/dist/Server/Services/AlertGroupingEngineService.js +21 -0
  532. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  533. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +21 -0
  534. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  535. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +21 -0
  536. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  537. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +21 -0
  538. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  539. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +21 -0
  540. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  541. package/build/dist/Server/Services/AlertReminderRuleService.js +44 -26
  542. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  543. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +54 -11
  544. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  545. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +16 -0
  546. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  547. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +16 -0
  548. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  549. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +16 -0
  550. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  551. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +16 -0
  552. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  553. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +16 -0
  554. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  555. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +16 -0
  556. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  557. package/build/dist/Server/Services/DatabaseService.js +235 -10
  558. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  559. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +16 -0
  560. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  561. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +16 -0
  562. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  563. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +16 -0
  564. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  565. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +16 -0
  566. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  567. package/build/dist/Server/Services/HostLabelRuleEngineService.js +12 -0
  568. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  569. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -0
  570. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  571. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +17 -0
  572. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  573. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +17 -0
  574. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  575. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +17 -0
  576. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  577. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +17 -0
  578. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  579. package/build/dist/Server/Services/IncidentGroupingEngineService.js +39 -13
  580. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  581. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +39 -9
  582. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  583. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +39 -10
  584. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  585. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +39 -10
  586. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  587. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +39 -10
  588. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  589. package/build/dist/Server/Services/IncidentReminderRuleService.js +44 -26
  590. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  591. package/build/dist/Server/Services/IncidentSlaRuleService.js +33 -12
  592. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  593. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +16 -0
  594. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  595. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +16 -0
  596. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  597. package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js +127 -0
  598. package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js.map +1 -0
  599. package/build/dist/Server/Services/IncomingCallPolicyService.js +187 -4
  600. package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -1
  601. package/build/dist/Server/Services/Index.js +2 -0
  602. package/build/dist/Server/Services/Index.js.map +1 -1
  603. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +16 -0
  604. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  605. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +16 -0
  606. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  607. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +16 -0
  608. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  609. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +16 -0
  610. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  611. package/build/dist/Server/Services/LabelService.js +39 -7
  612. package/build/dist/Server/Services/LabelService.js.map +1 -1
  613. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +16 -0
  614. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  615. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +16 -0
  616. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  617. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +2 -0
  618. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  619. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +57 -1
  620. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  621. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +17 -0
  622. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  623. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +16 -0
  624. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  625. package/build/dist/Server/Services/NetworkDeviceService.js +2 -0
  626. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  627. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +56 -1
  628. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -1
  629. package/build/dist/Server/Services/NetworkSiteService.js +187 -22
  630. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  631. package/build/dist/Server/Services/NetworkSiteTypeService.js +126 -51
  632. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
  633. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +16 -0
  634. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  635. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +16 -0
  636. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  637. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +16 -0
  638. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  639. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +16 -0
  640. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  641. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +16 -0
  642. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  643. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +16 -0
  644. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  645. package/build/dist/Server/Services/ProjectCallSMSConfigService.js +115 -6
  646. package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
  647. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +16 -0
  648. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  649. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +16 -0
  650. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  651. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +16 -0
  652. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  653. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +16 -0
  654. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  655. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +16 -0
  656. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  657. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +16 -0
  658. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  659. package/build/dist/Server/Services/RunbookRuleEngineService.js +12 -0
  660. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  661. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +38 -9
  662. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  663. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +38 -10
  664. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  665. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +32 -14
  666. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  667. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +16 -0
  668. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  669. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +16 -0
  670. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  671. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +16 -0
  672. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  673. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +554 -12
  674. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
  675. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +50 -14
  676. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  677. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +16 -0
  678. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  679. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +16 -0
  680. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  681. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +25 -2
  682. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  683. package/build/dist/Server/Services/StatusPageMonitorRuleService.js +19 -1
  684. package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -1
  685. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +16 -0
  686. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  687. package/build/dist/Server/Services/UserService.js +14 -49
  688. package/build/dist/Server/Services/UserService.js.map +1 -1
  689. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +16 -0
  690. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
  691. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +16 -0
  692. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
  693. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +16 -0
  694. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  695. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +16 -0
  696. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  697. package/build/dist/Server/Types/Database/QueryHelper.js +67 -0
  698. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  699. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +21 -4
  700. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  701. package/build/dist/Server/Utils/IncomingCallPhoneNumber.js +9 -3
  702. package/build/dist/Server/Utils/IncomingCallPhoneNumber.js.map +1 -1
  703. package/build/dist/Server/Utils/Profiling.js +10 -1
  704. package/build/dist/Server/Utils/Profiling.js.map +1 -1
  705. package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js +30 -0
  706. package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js.map +1 -0
  707. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +344 -0
  708. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  709. package/build/dist/Server/Utils/Telemetry.js +1 -1
  710. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  711. package/build/dist/Server/Utils/VendorAssets.js +2 -0
  712. package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
  713. package/build/dist/Types/Dashboard/DashboardTemplates.js +425 -0
  714. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  715. package/build/dist/Types/OnCallDutyPolicy/Layer.js +11 -0
  716. package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
  717. package/build/dist/Types/Rules/RuleCriteria.js +18 -0
  718. package/build/dist/Types/Rules/RuleCriteria.js.map +1 -0
  719. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +435 -0
  720. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -0
  721. package/build/dist/Types/Rum/SessionReplay.js +64 -0
  722. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  723. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  724. package/build/dist/UI/Components/Alerts/Alert.js +63 -41
  725. package/build/dist/UI/Components/Alerts/Alert.js.map +1 -1
  726. package/build/dist/UI/Components/Button/Button.js +3 -1
  727. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  728. package/build/dist/UI/Components/Dropdown/Dropdown.js +1 -1
  729. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  730. package/build/dist/UI/Components/Feed/Feed.js +4 -1
  731. package/build/dist/UI/Components/Feed/Feed.js.map +1 -1
  732. package/build/dist/UI/Components/Feed/useFeedItems.js +137 -0
  733. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -0
  734. package/build/dist/UI/Components/Forms/BasicForm.js +38 -19
  735. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  736. package/build/dist/UI/Components/Forms/ModelForm.js +65 -1
  737. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  738. package/build/dist/UI/Components/Icon/Icon.js +3 -35
  739. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  740. package/build/dist/UI/Components/ModelTable/ModelTable.js +12 -1
  741. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  742. package/build/dist/UI/Components/Navbar/NavBar.js +1 -0
  743. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  744. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +383 -0
  745. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -0
  746. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js +124 -0
  747. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js.map +1 -0
  748. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js +126 -0
  749. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js.map +1 -0
  750. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js +63 -0
  751. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js.map +1 -0
  752. package/build/dist/UI/Components/Table/Table.js +1 -1
  753. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  754. package/build/dist/UI/Components/Table/TableBody.js +4 -2
  755. package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
  756. package/build/dist/UI/Components/Table/TableRow.js +3 -2
  757. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  758. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +14 -2
  759. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +1 -1
  760. package/build/dist/UI/Utils/LabelRuleImportExport.js +81 -5
  761. package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -1
  762. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  763. package/build/dist/Utils/Faker.js +76 -6
  764. package/build/dist/Utils/Faker.js.map +1 -1
  765. package/build/dist/Utils/LabelRuleImportExport.js +157 -3
  766. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  767. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +81 -5
  768. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  769. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +77 -0
  770. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
  771. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +109 -2
  772. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -1
  773. package/build/dist/Utils/Rules/RuleCriteriaMatcher.js +526 -0
  774. package/build/dist/Utils/Rules/RuleCriteriaMatcher.js.map +1 -0
  775. package/build/dist/Utils/Rum/SessionIdentity.js +13 -1
  776. package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
  777. package/build/dist/Utils/Slo/SloBurnRateRuleState.js +28 -15
  778. package/build/dist/Utils/Slo/SloBurnRateRuleState.js.map +1 -1
  779. package/build/dist/Utils/Telemetry/OriginAllowList.js +61 -0
  780. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
  781. package/package.json +20 -20
@@ -0,0 +1,940 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ afterEach,
4
+ beforeEach,
5
+ describe,
6
+ expect,
7
+ jest,
8
+ test,
9
+ } from "@jest/globals";
10
+ import {
11
+ RenderResult,
12
+ cleanup,
13
+ render,
14
+ screen,
15
+ waitFor,
16
+ } from "@testing-library/react";
17
+ import * as React from "react";
18
+ import getJestMockFunction, { MockFunction } from "../../MockType";
19
+
20
+ /*
21
+ * Mounts the widgets the SLO dashboard template actually ships — every one of
22
+ * them, taken from getTemplateConfig(DashboardTemplateType.Slo) — through the
23
+ * REAL renderers.
24
+ *
25
+ * Everything else in the repo reads this template as a data structure: the
26
+ * editorial suite (Types/Dashboard/SloDashboardTemplate.test.ts) pins which
27
+ * widgets it carries and what arguments they hold, and the invariants suite
28
+ * pins the grid. Neither ever renders one, so nothing catches the case where
29
+ * the shipped ARGUMENTS and the renderer disagree: a template widget stuck on
30
+ * its loading skeleton, a tile printing "null%" before the evaluation worker
31
+ * has run, a chart drawing a broken frame over an empty series, or the one
32
+ * guidance row rendering empty.
33
+ *
34
+ * Every assertion below starts from the template config rather than from
35
+ * hand-built components, so a seventh SLO widget added to the template is
36
+ * covered here without editing this file.
37
+ */
38
+
39
+ const getItemMock: MockFunction = getJestMockFunction();
40
+ const getListMock: MockFunction = getJestMockFunction();
41
+ const aggregateMock: MockFunction = getJestMockFunction();
42
+ const getCurrentProjectIdMock: MockFunction = getJestMockFunction();
43
+ const lineChartRenderMock: MockFunction = getJestMockFunction();
44
+
45
+ /*
46
+ * The arrow wrappers are load bearing: jest.mock is hoisted above the compiled
47
+ * requires, so the mock variables above are still unassigned when the factory
48
+ * runs. Dereferencing them lazily, at call time, is what makes this work.
49
+ */
50
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
51
+ return {
52
+ __esModule: true,
53
+ default: {
54
+ getItem: (...args: Array<any>) => {
55
+ return getItemMock(...args);
56
+ },
57
+ getList: (...args: Array<any>) => {
58
+ return getListMock(...args);
59
+ },
60
+ },
61
+ };
62
+ });
63
+
64
+ jest.mock("../../../UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI", () => {
65
+ return {
66
+ __esModule: true,
67
+ default: {
68
+ aggregate: (...args: Array<any>) => {
69
+ return aggregateMock(...args);
70
+ },
71
+ },
72
+ };
73
+ });
74
+
75
+ jest.mock("../../../UI/Utils/Project", () => {
76
+ return {
77
+ __esModule: true,
78
+ default: {
79
+ getCurrentProjectId: (...args: Array<any>) => {
80
+ return getCurrentProjectIdMock(...args);
81
+ },
82
+ },
83
+ };
84
+ });
85
+
86
+ /*
87
+ * recharts measures a 0x0 parent in jsdom, so the real chart would draw
88
+ * nothing and every "did it mount a chart" assertion would pass for the wrong
89
+ * reason. The stub records the props instead — which is where the reference
90
+ * line lives — and renders a marker the assertions can count.
91
+ *
92
+ * (The real recharts SVG is exercised by SloWidgetChartRendering.test.tsx;
93
+ * what is pinned here is which of the TEMPLATE's charts gets a target line.)
94
+ */
95
+ jest.mock("../../../UI/Components/Charts/Line/LineChart", () => {
96
+ return {
97
+ __esModule: true,
98
+ default: (props: LineChartStubProps): React.ReactElement => {
99
+ lineChartRenderMock(props);
100
+ return React.createElement(
101
+ "div",
102
+ { "data-testid": "line-chart" },
103
+ `points:${props.data[0]?.data.length ?? 0}`,
104
+ );
105
+ },
106
+ };
107
+ });
108
+
109
+ import DashboardSloComponentElement from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Components/DashboardSloComponent";
110
+ import DashboardTextComponentElement from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Components/DashboardTextComponent";
111
+ import { DashboardBaseComponentProps } from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Components/DashboardBaseComponent";
112
+ import ServiceLevelObjective from "../../../Models/DatabaseModels/ServiceLevelObjective";
113
+ import AggregatedResult from "../../../Types/BaseDatabase/AggregatedResult";
114
+ import InBetween from "../../../Types/BaseDatabase/InBetween";
115
+ import DashboardBaseComponent from "../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
116
+ import DashboardSloComponent, {
117
+ SloWidgetDisplayType,
118
+ SloWidgetMetric,
119
+ } from "../../../Types/Dashboard/DashboardComponents/DashboardSloComponent";
120
+ import DashboardTextComponent from "../../../Types/Dashboard/DashboardComponents/DashboardTextComponent";
121
+ import DashboardComponentType from "../../../Types/Dashboard/DashboardComponentType";
122
+ import {
123
+ GetHeightOfDashboardComponent,
124
+ GetWidthOfDashboardComponent,
125
+ } from "../../../Types/Dashboard/DashboardSize";
126
+ import {
127
+ DashboardTemplateType,
128
+ getTemplateConfig,
129
+ } from "../../../Types/Dashboard/DashboardTemplates";
130
+ import DashboardViewConfig from "../../../Types/Dashboard/DashboardViewConfig";
131
+ import { JSONObject } from "../../../Types/JSON";
132
+ import ObjectID from "../../../Types/ObjectID";
133
+ import SloStatus from "../../../Types/ServiceLevelObjective/SloStatus";
134
+ import RangeStartAndEndDateTime from "../../../Types/Time/RangeStartAndEndDateTime";
135
+ import TimeRange from "../../../Types/Time/TimeRange";
136
+ import { SLO_NOT_EVALUATED_TEXT } from "../../../Utils/Slo/SloWidgetFormat";
137
+ import ChartReferenceLineProps from "../../../UI/Components/Charts/Types/ReferenceLineProps";
138
+ import SeriesPoint from "../../../UI/Components/Charts/Types/SeriesPoints";
139
+
140
+ interface LineChartStubProps {
141
+ data: Array<SeriesPoint>;
142
+ referenceLines?: Array<ChartReferenceLineProps> | undefined;
143
+ }
144
+
145
+ // ── the template under test ───────────────────────────────────────────────
146
+
147
+ const TEMPLATE_CONFIG: DashboardViewConfig | null = getTemplateConfig(
148
+ DashboardTemplateType.Slo,
149
+ );
150
+
151
+ /*
152
+ * Cast rather than guarded at every use: "the SLO template resolves to a
153
+ * config at all" is asserted by the first test, which fails loudly before any
154
+ * render assertion can fail confusingly.
155
+ */
156
+ const VIEW_CONFIG: DashboardViewConfig = TEMPLATE_CONFIG as DashboardViewConfig;
157
+
158
+ const TEMPLATE_COMPONENTS: Array<DashboardBaseComponent> =
159
+ TEMPLATE_CONFIG?.components || [];
160
+
161
+ const SLO_WIDGETS: Array<DashboardSloComponent> = TEMPLATE_COMPONENTS.filter(
162
+ (component: DashboardBaseComponent): boolean => {
163
+ return component.componentType === DashboardComponentType.Slo;
164
+ },
165
+ ) as unknown as Array<DashboardSloComponent>;
166
+
167
+ const TEXT_WIDGETS: Array<DashboardTextComponent> = TEMPLATE_COMPONENTS.filter(
168
+ (component: DashboardBaseComponent): boolean => {
169
+ return component.componentType === DashboardComponentType.Text;
170
+ },
171
+ ) as unknown as Array<DashboardTextComponent>;
172
+
173
+ const TILE_WIDGETS: Array<DashboardSloComponent> = SLO_WIDGETS.filter(
174
+ (widget: DashboardSloComponent): boolean => {
175
+ return widget.arguments.displayType === SloWidgetDisplayType.Tile;
176
+ },
177
+ );
178
+
179
+ const CHART_WIDGETS: Array<DashboardSloComponent> = SLO_WIDGETS.filter(
180
+ (widget: DashboardSloComponent): boolean => {
181
+ return widget.arguments.displayType === SloWidgetDisplayType.Chart;
182
+ },
183
+ );
184
+
185
+ /** The widget's own label in a failure message — ids regenerate every call. */
186
+ type GetWidgetLabelFunction = (widget: DashboardSloComponent) => string;
187
+
188
+ const getWidgetLabel: GetWidgetLabelFunction = (
189
+ widget: DashboardSloComponent,
190
+ ): string => {
191
+ return widget.arguments.widgetTitle || "(untitled SLO widget)";
192
+ };
193
+
194
+ type GetWidgetMetricFunction = (
195
+ widget: DashboardSloComponent,
196
+ ) => SloWidgetMetric;
197
+
198
+ const getWidgetMetric: GetWidgetMetricFunction = (
199
+ widget: DashboardSloComponent,
200
+ ): SloWidgetMetric => {
201
+ // Sli is the renderer's own fallback when the argument was never set.
202
+ return widget.arguments.sloMetric || SloWidgetMetric.Sli;
203
+ };
204
+
205
+ // ── fixtures ──────────────────────────────────────────────────────────────
206
+
207
+ const SLO_ID: ObjectID = new ObjectID("33333333-3333-4333-8333-333333333333");
208
+ const PROJECT_ID: ObjectID = new ObjectID(
209
+ "44444444-4444-4444-8444-444444444444",
210
+ );
211
+
212
+ /*
213
+ * A CUSTOM range pins the chart window to fixed instants; a relative range
214
+ * would resolve against the wall clock on every render.
215
+ */
216
+ const START_DATE: Date = new Date("2026-08-10T00:00:00.000Z");
217
+ const END_DATE: Date = new Date("2026-08-10T06:00:00.000Z");
218
+
219
+ const DASHBOARD_RANGE: RangeStartAndEndDateTime = {
220
+ range: TimeRange.CUSTOM,
221
+ startAndEndDate: new InBetween<Date>(START_DATE, END_DATE),
222
+ };
223
+
224
+ /*
225
+ * The dashboard canvas is twelve units wide, so this is the width a real
226
+ * board is laid out against; the helpers below turn each widget's DECLARED
227
+ * units into the pixel box the canvas would give it.
228
+ */
229
+ const TOTAL_DASHBOARD_WIDTH_IN_PX: number = 1200;
230
+
231
+ const SLO_NAME: string = "Checkout availability";
232
+ const TARGET_PERCENTAGE: number = 99.9;
233
+ const SLI_PERCENTAGE: number = 99.95;
234
+ const BUDGET_REMAINING_PERCENTAGE: number = 42.5;
235
+ const BUDGET_REMAINING_SECONDS: number = 3600;
236
+ const BURN_RATE: number = 1.25;
237
+
238
+ /**
239
+ * What each tile must render for the row above. Written out rather than
240
+ * computed so a change in the formatter's rounding or units fails here:
241
+ * the SLI keeps three decimals, the budget percentage one, the budget
242
+ * seconds collapse to whole minutes (3600s -> 60 min) and burn rate is a
243
+ * multiplier.
244
+ *
245
+ * "×" is U+00D7 MULTIPLICATION SIGN, spelled as an escape so a mangled
246
+ * file encoding cannot make this pass by accident.
247
+ */
248
+ interface TileExpectation {
249
+ value: string;
250
+ subline: string | null;
251
+ }
252
+
253
+ const EXPECTED_TILE: Record<SloWidgetMetric, TileExpectation> = {
254
+ [SloWidgetMetric.Sli]: {
255
+ value: "99.95%",
256
+ subline: "target 99.9%",
257
+ },
258
+ [SloWidgetMetric.ErrorBudgetRemaining]: {
259
+ value: "42.5%",
260
+ subline: "60 min remaining",
261
+ },
262
+ [SloWidgetMetric.BurnRate]: {
263
+ value: "1.25×",
264
+ subline: null,
265
+ },
266
+ };
267
+
268
+ /** The renderer's own copy of these strings; neither is exported. */
269
+ const SETUP_MESSAGE: string = "Click to select an SLO";
270
+ const EMPTY_HISTORY_MESSAGE: RegExp = /No history for the selected/i;
271
+
272
+ type BuildSloFunction = (data?: {
273
+ hasTarget?: boolean | undefined;
274
+ }) => ServiceLevelObjective;
275
+
276
+ const buildSlo: BuildSloFunction = (
277
+ data: { hasTarget?: boolean | undefined } = {},
278
+ ): ServiceLevelObjective => {
279
+ const slo: ServiceLevelObjective = new ServiceLevelObjective();
280
+ slo.name = SLO_NAME;
281
+ slo.currentSliPercentage = SLI_PERCENTAGE;
282
+ slo.errorBudgetRemainingPercentage = BUDGET_REMAINING_PERCENTAGE;
283
+ slo.errorBudgetRemainingSeconds = BUDGET_REMAINING_SECONDS;
284
+ slo.currentBurnRate = BURN_RATE;
285
+ slo.sloStatus = SloStatus.Healthy;
286
+
287
+ /*
288
+ * `targetPercentage` is nullable on the model, so leaving it unset is a
289
+ * state a real SLO can be in — and the reference-line rule turns on it.
290
+ */
291
+ if (data.hasTarget !== false) {
292
+ slo.targetPercentage = TARGET_PERCENTAGE;
293
+ }
294
+
295
+ return slo;
296
+ };
297
+
298
+ /**
299
+ * An SLO the evaluation worker has not reached yet. The target is set at
300
+ * creation time, but every state column it maintains is empty — as NULL from
301
+ * Postgres, or absent altogether once a JSON round-trip drops it, which is
302
+ * why both shapes are exercised.
303
+ */
304
+ type BuildUnevaluatedSloFunction = (
305
+ stateValue: null | undefined,
306
+ ) => ServiceLevelObjective;
307
+
308
+ const buildUnevaluatedSlo: BuildUnevaluatedSloFunction = (
309
+ stateValue: null | undefined,
310
+ ): ServiceLevelObjective => {
311
+ const slo: ServiceLevelObjective = new ServiceLevelObjective();
312
+ slo.name = SLO_NAME;
313
+ slo.targetPercentage = TARGET_PERCENTAGE;
314
+
315
+ const emptyState: Record<string, null | undefined> = {
316
+ currentSliPercentage: stateValue,
317
+ errorBudgetRemainingPercentage: stateValue,
318
+ errorBudgetRemainingSeconds: stateValue,
319
+ currentBurnRate: stateValue,
320
+ sloStatus: stateValue,
321
+ };
322
+
323
+ return Object.assign(slo, emptyState) as unknown as ServiceLevelObjective;
324
+ };
325
+
326
+ /** One SloHistory bucket every five minutes, oldest first. */
327
+ type BuildSloHistoryFunction = (rowCount: number) => AggregatedResult;
328
+
329
+ const buildSloHistory: BuildSloHistoryFunction = (
330
+ rowCount: number,
331
+ ): AggregatedResult => {
332
+ const rows: Array<JSONObject> = [];
333
+
334
+ for (let index: number = 0; index < rowCount; index++) {
335
+ rows.push({
336
+ timestamp: new Date(
337
+ START_DATE.getTime() + index * 5 * 60 * 1000,
338
+ ).toISOString(),
339
+ value: 99.9 - index * 0.01,
340
+ });
341
+ }
342
+
343
+ return { data: rows } as unknown as AggregatedResult;
344
+ };
345
+
346
+ const HISTORY_ROW_COUNT: number = 8;
347
+
348
+ // ── rendering ─────────────────────────────────────────────────────────────
349
+
350
+ type BuildPropsFunction = (
351
+ component: DashboardBaseComponent,
352
+ ) => DashboardBaseComponentProps;
353
+
354
+ const buildBaseProps: BuildPropsFunction = (
355
+ component: DashboardBaseComponent,
356
+ ): DashboardBaseComponentProps => {
357
+ /*
358
+ * Size every widget the way the canvas does — from the units the TEMPLATE
359
+ * declares — so the renderers' height-dependent branches (the Text widget
360
+ * scales its font to its row height, the chart reserves rows out of its
361
+ * tile) see the geometry the template actually ships rather than an
362
+ * arbitrary test number. A widget shrunk to a height-1 row in the template
363
+ * would then be exercised at that height here.
364
+ */
365
+ return {
366
+ componentId: component.componentId,
367
+ isEditMode: false,
368
+ isSelected: false,
369
+ key: component.componentId.toString(),
370
+ onComponentUpdate: (): void => {
371
+ // No widget on this template writes back through this.
372
+ },
373
+ totalCurrentDashboardWidthInPx: TOTAL_DASHBOARD_WIDTH_IN_PX,
374
+ dashboardCanvasTopInPx: 0,
375
+ dashboardCanvasLeftInPx: 0,
376
+ dashboardCanvasWidthInPx: TOTAL_DASHBOARD_WIDTH_IN_PX,
377
+ dashboardCanvasHeightInPx: 800,
378
+ dashboardComponentHeightInPx: GetHeightOfDashboardComponent(
379
+ component.heightInDashboardUnits,
380
+ TOTAL_DASHBOARD_WIDTH_IN_PX,
381
+ ),
382
+ dashboardComponentWidthInPx: GetWidthOfDashboardComponent(
383
+ component.widthInDashboardUnits,
384
+ TOTAL_DASHBOARD_WIDTH_IN_PX,
385
+ ),
386
+ dashboardViewConfig: VIEW_CONFIG,
387
+ dashboardStartAndEndDate: DASHBOARD_RANGE,
388
+ metricTypes: [],
389
+ refreshTick: 0,
390
+ variables: undefined,
391
+ };
392
+ };
393
+
394
+ type RenderSloWidgetFunction = (widget: DashboardSloComponent) => RenderResult;
395
+
396
+ const renderSloWidget: RenderSloWidgetFunction = (
397
+ widget: DashboardSloComponent,
398
+ ): RenderResult => {
399
+ return render(
400
+ <DashboardSloComponentElement
401
+ {...buildBaseProps(widget)}
402
+ component={widget}
403
+ />,
404
+ );
405
+ };
406
+
407
+ type RenderTextWidgetFunction = (
408
+ widget: DashboardTextComponent,
409
+ ) => RenderResult;
410
+
411
+ const renderTextWidget: RenderTextWidgetFunction = (
412
+ widget: DashboardTextComponent,
413
+ ): RenderResult => {
414
+ return render(
415
+ <DashboardTextComponentElement
416
+ {...buildBaseProps(widget)}
417
+ component={widget}
418
+ />,
419
+ );
420
+ };
421
+
422
+ /**
423
+ * Picking an objective in the settings panel writes exactly one argument
424
+ * onto the stored widget. Cloned rather than mutated so the template's own
425
+ * components stay unconfigured for every other test in this file.
426
+ */
427
+ type ConfigureSloWidgetFunction = (
428
+ widget: DashboardSloComponent,
429
+ ) => DashboardSloComponent;
430
+
431
+ const configureSloWidget: ConfigureSloWidgetFunction = (
432
+ widget: DashboardSloComponent,
433
+ ): DashboardSloComponent => {
434
+ return {
435
+ ...widget,
436
+ arguments: {
437
+ ...widget.arguments,
438
+ serviceLevelObjectiveId: SLO_ID.toString(),
439
+ },
440
+ };
441
+ };
442
+
443
+ /*
444
+ * Assertions carry the widget's title on both sides so a failure names the
445
+ * offending widget rather than reporting `false !== true` for one of six
446
+ * identical-looking renders.
447
+ */
448
+ type ExpectRenderedFunction = (data: {
449
+ label: string;
450
+ text: string | RegExp;
451
+ }) => Promise<void>;
452
+
453
+ const expectRendered: ExpectRenderedFunction = async (data: {
454
+ label: string;
455
+ text: string | RegExp;
456
+ }): Promise<void> => {
457
+ await waitFor((): void => {
458
+ const isRendered: boolean = screen.queryAllByText(data.text).length > 0;
459
+ expect(
460
+ `${data.label}: ${isRendered ? "renders" : "does not render"} "${String(data.text)}"`,
461
+ ).toBe(`${data.label}: renders "${String(data.text)}"`);
462
+ });
463
+ };
464
+
465
+ type ExpectNotRenderedFunction = (data: {
466
+ label: string;
467
+ text: string | RegExp;
468
+ }) => void;
469
+
470
+ const expectNotRendered: ExpectNotRenderedFunction = (data: {
471
+ label: string;
472
+ text: string | RegExp;
473
+ }): void => {
474
+ const isRendered: boolean = screen.queryAllByText(data.text).length > 0;
475
+ expect(
476
+ `${data.label}: ${isRendered ? "renders" : "does not render"} "${String(data.text)}"`,
477
+ ).toBe(`${data.label}: does not render "${String(data.text)}"`);
478
+ };
479
+
480
+ /** Requests the widget under test issued, whichever route it reached for. */
481
+ type CountRequestsFunction = () => number;
482
+
483
+ const countRequests: CountRequestsFunction = (): number => {
484
+ return (
485
+ getItemMock.mock.calls.length +
486
+ getListMock.mock.calls.length +
487
+ aggregateMock.mock.calls.length
488
+ );
489
+ };
490
+
491
+ type GetLastChartPropsFunction = () => LineChartStubProps;
492
+
493
+ const getLastChartProps: GetLastChartPropsFunction = (): LineChartStubProps => {
494
+ const calls: Array<Array<unknown>> = lineChartRenderMock.mock
495
+ .calls as unknown as Array<Array<unknown>>;
496
+
497
+ return calls[calls.length - 1]![0] as LineChartStubProps;
498
+ };
499
+
500
+ beforeEach((): void => {
501
+ jest.clearAllMocks();
502
+ getCurrentProjectIdMock.mockReturnValue(PROJECT_ID);
503
+ getItemMock.mockResolvedValue(buildSlo());
504
+ getListMock.mockResolvedValue({ data: [], count: 0, skip: 0, limit: 1 });
505
+ aggregateMock.mockResolvedValue(buildSloHistory(HISTORY_ROW_COUNT));
506
+ });
507
+
508
+ afterEach((): void => {
509
+ cleanup();
510
+ });
511
+
512
+ describe("SLO dashboard template — what it ships", () => {
513
+ test("resolves to a config carrying SLO widgets in both display types", () => {
514
+ /*
515
+ * Every loop below iterates one of these arrays, so an empty one would
516
+ * make those tests pass vacuously for ever. This is the guard.
517
+ */
518
+ expect(TEMPLATE_CONFIG).not.toBeNull();
519
+ expect(SLO_WIDGETS.length).toBeGreaterThan(0);
520
+ expect(TEXT_WIDGETS.length).toBeGreaterThan(0);
521
+ expect(TILE_WIDGETS.length).toBeGreaterThan(0);
522
+ expect(CHART_WIDGETS.length).toBeGreaterThan(0);
523
+
524
+ /*
525
+ * A widget whose displayType was dropped would fall out of BOTH groups
526
+ * and be silently skipped by the display-type tests.
527
+ */
528
+ expect(TILE_WIDGETS.length + CHART_WIDGETS.length).toBe(SLO_WIDGETS.length);
529
+
530
+ /*
531
+ * The premise of the setup-state tests: a template cannot know a
532
+ * project's SLO ids, so it ships none. If this ever changes, the widget
533
+ * renders data instead of its setup state and the tests below become
534
+ * meaningless rather than failing for a good reason.
535
+ */
536
+ for (const widget of SLO_WIDGETS) {
537
+ const label: string = getWidgetLabel(widget);
538
+ expect(
539
+ `${label}: ${widget.arguments.serviceLevelObjectiveId || "no objective"}`,
540
+ ).toBe(`${label}: no objective`);
541
+ }
542
+ });
543
+ });
544
+
545
+ describe("SLO dashboard template — unconfigured widgets", () => {
546
+ test("every SLO widget renders its own title in the setup state and queries nothing", async () => {
547
+ expect(SLO_WIDGETS.length).toBeGreaterThan(0);
548
+
549
+ for (const widget of SLO_WIDGETS) {
550
+ const label: string = getWidgetLabel(widget);
551
+ const requestsBefore: number = countRequests();
552
+
553
+ renderSloWidget(widget);
554
+
555
+ await expectRendered({ label: label, text: SETUP_MESSAGE });
556
+
557
+ /*
558
+ * The title is what makes six identical placeholders tell the reader
559
+ * which tile is which before anything is configured — the reason the
560
+ * template sets widgetTitle on every one of them.
561
+ */
562
+ await expectRendered({ label: label, text: label });
563
+
564
+ /*
565
+ * A widget with no objective must not reach ANY endpoint: on a public
566
+ * dashboard the stored id is the authorization decision, so a request
567
+ * without one has nothing the server could scope.
568
+ */
569
+ expect(`${label}: ${countRequests() - requestsBefore} requests`).toBe(
570
+ `${label}: 0 requests`,
571
+ );
572
+
573
+ cleanup();
574
+ }
575
+ });
576
+
577
+ test("an unconfigured Tile offers setup rather than claiming the SLO is unevaluated", async () => {
578
+ expect(TILE_WIDGETS.length).toBeGreaterThan(0);
579
+
580
+ for (const widget of TILE_WIDGETS) {
581
+ const label: string = getWidgetLabel(widget);
582
+
583
+ renderSloWidget(widget);
584
+
585
+ await expectRendered({ label: label, text: SETUP_MESSAGE });
586
+
587
+ /*
588
+ * Two different empty states that must not be confused: "nothing is
589
+ * chosen" is the reader's next action, "not evaluated yet" is a claim
590
+ * about an SLO — and there is no SLO here to make it about.
591
+ */
592
+ expectNotRendered({ label: label, text: SLO_NOT_EVALUATED_TEXT });
593
+
594
+ cleanup();
595
+ }
596
+ });
597
+
598
+ test("an unconfigured Chart offers setup rather than mounting an empty chart", async () => {
599
+ expect(CHART_WIDGETS.length).toBeGreaterThan(0);
600
+
601
+ for (const widget of CHART_WIDGETS) {
602
+ const label: string = getWidgetLabel(widget);
603
+ const chartsBefore: number = lineChartRenderMock.mock.calls.length;
604
+
605
+ renderSloWidget(widget);
606
+
607
+ await expectRendered({ label: label, text: SETUP_MESSAGE });
608
+
609
+ expect(
610
+ `${label}: ${lineChartRenderMock.mock.calls.length - chartsBefore} charts mounted`,
611
+ ).toBe(`${label}: 0 charts mounted`);
612
+
613
+ cleanup();
614
+ }
615
+ });
616
+
617
+ test("reaches the setup state even before a project is resolved", async () => {
618
+ /*
619
+ * The unconfigured branch returns before the project check, so a board
620
+ * opened while the session's project is still unresolved shows the
621
+ * reader what to do instead of the "No project selected." error.
622
+ */
623
+ getCurrentProjectIdMock.mockReturnValue(null);
624
+
625
+ for (const widget of SLO_WIDGETS) {
626
+ const label: string = getWidgetLabel(widget);
627
+
628
+ renderSloWidget(widget);
629
+
630
+ await expectRendered({ label: label, text: SETUP_MESSAGE });
631
+ expectNotRendered({ label: label, text: "No project selected." });
632
+
633
+ cleanup();
634
+ }
635
+ });
636
+ });
637
+
638
+ describe("SLO dashboard template — a configured Objective Health tile", () => {
639
+ test("each tile renders its own metric's number and subline", async () => {
640
+ expect(TILE_WIDGETS.length).toBeGreaterThan(0);
641
+
642
+ const coveredMetrics: Set<SloWidgetMetric> = new Set<SloWidgetMetric>();
643
+
644
+ for (const widget of TILE_WIDGETS) {
645
+ const label: string = getWidgetLabel(widget);
646
+ const metric: SloWidgetMetric = getWidgetMetric(widget);
647
+ const expected: TileExpectation = EXPECTED_TILE[metric];
648
+
649
+ coveredMetrics.add(metric);
650
+
651
+ renderSloWidget(configureSloWidget(widget));
652
+
653
+ await expectRendered({ label: label, text: expected.value });
654
+
655
+ if (expected.subline !== null) {
656
+ await expectRendered({ label: label, text: expected.subline });
657
+ }
658
+
659
+ /*
660
+ * The three tiles read three different columns off the same row, so a
661
+ * tile wired to the wrong metric would still render a plausible
662
+ * number. Pin that each one renders ONLY its own.
663
+ */
664
+ for (const otherMetric of Object.values(SloWidgetMetric)) {
665
+ if (otherMetric === metric) {
666
+ continue;
667
+ }
668
+
669
+ expectNotRendered({
670
+ label: label,
671
+ text: EXPECTED_TILE[otherMetric].value,
672
+ });
673
+ }
674
+
675
+ cleanup();
676
+ }
677
+
678
+ /*
679
+ * The template is an SLO review in the order it is read — where the
680
+ * service is, how much room is left, how fast it is going — so all three
681
+ * numbers have to be on the board.
682
+ */
683
+ expect(coveredMetrics.size).toBe(Object.keys(EXPECTED_TILE).length);
684
+ });
685
+
686
+ test.each([
687
+ ["NULL state columns", null],
688
+ ["absent state columns", undefined],
689
+ ])(
690
+ "says the SLO is not evaluated yet for %s, never null or NaN",
691
+ async (_shape: string, stateValue: null | undefined) => {
692
+ getItemMock.mockResolvedValue(buildUnevaluatedSlo(stateValue));
693
+
694
+ expect(TILE_WIDGETS.length).toBeGreaterThan(0);
695
+
696
+ for (const widget of TILE_WIDGETS) {
697
+ const label: string = getWidgetLabel(widget);
698
+
699
+ const { container }: RenderResult = renderSloWidget(
700
+ configureSloWidget(widget),
701
+ );
702
+
703
+ await expectRendered({ label: label, text: SLO_NOT_EVALUATED_TEXT });
704
+
705
+ /*
706
+ * The whole reason the not-evaluated state exists: the worker's
707
+ * columns are empty until it first runs, and formatting one of them
708
+ * anyway renders "null%" / "NaN%" at tile size.
709
+ */
710
+ const renderedText: string = container.textContent || "";
711
+ const leakedValue: RegExpMatchArray | null =
712
+ renderedText.match(/null|NaN|undefined/i);
713
+
714
+ expect(
715
+ `${label}: ${leakedValue ? leakedValue[0] : "no leaked value"}`,
716
+ ).toBe(`${label}: no leaked value`);
717
+
718
+ // Nor any of the numbers an evaluated SLO would have rendered.
719
+ for (const metric of Object.values(SloWidgetMetric)) {
720
+ expectNotRendered({
721
+ label: label,
722
+ text: EXPECTED_TILE[metric].value,
723
+ });
724
+ }
725
+
726
+ cleanup();
727
+ }
728
+ },
729
+ );
730
+ });
731
+
732
+ describe("SLO dashboard template — the Error Budget Trends charts", () => {
733
+ test("an empty SloHistory series renders the empty state, not a chart", async () => {
734
+ aggregateMock.mockResolvedValue(buildSloHistory(0));
735
+
736
+ expect(CHART_WIDGETS.length).toBeGreaterThan(0);
737
+
738
+ for (const widget of CHART_WIDGETS) {
739
+ const label: string = getWidgetLabel(widget);
740
+ const chartsBefore: number = lineChartRenderMock.mock.calls.length;
741
+
742
+ renderSloWidget(configureSloWidget(widget));
743
+
744
+ await expectRendered({ label: label, text: EMPTY_HISTORY_MESSAGE });
745
+
746
+ /*
747
+ * A chart mounted over zero points draws axes around nothing, which
748
+ * reads as a broken widget rather than as "the worker has not written
749
+ * anything inside this window yet".
750
+ */
751
+ expect(
752
+ `${label}: ${lineChartRenderMock.mock.calls.length - chartsBefore} charts mounted`,
753
+ ).toBe(`${label}: 0 charts mounted`);
754
+
755
+ cleanup();
756
+ }
757
+ });
758
+
759
+ test("every chart plots the history it was given", async () => {
760
+ expect(CHART_WIDGETS.length).toBeGreaterThan(0);
761
+
762
+ for (const widget of CHART_WIDGETS) {
763
+ const label: string = getWidgetLabel(widget);
764
+
765
+ renderSloWidget(configureSloWidget(widget));
766
+
767
+ await expectRendered({
768
+ label: label,
769
+ text: `points:${HISTORY_ROW_COUNT}`,
770
+ });
771
+
772
+ cleanup();
773
+ }
774
+ });
775
+
776
+ test("the SLI chart draws the objective's target as a reference line", async () => {
777
+ const sliChart: DashboardSloComponent | undefined = CHART_WIDGETS.find(
778
+ (widget: DashboardSloComponent): boolean => {
779
+ return getWidgetMetric(widget) === SloWidgetMetric.Sli;
780
+ },
781
+ );
782
+
783
+ /*
784
+ * "Are we above the line" is the question the Error Budget Trends row
785
+ * exists to answer at a glance, so the template must carry an SLI chart
786
+ * for this test to be about anything.
787
+ */
788
+ expect(sliChart).toBeDefined();
789
+
790
+ renderSloWidget(configureSloWidget(sliChart as DashboardSloComponent));
791
+
792
+ await expectRendered({
793
+ label: "SLI chart",
794
+ text: `points:${HISTORY_ROW_COUNT}`,
795
+ });
796
+
797
+ const referenceLines: Array<ChartReferenceLineProps> =
798
+ getLastChartProps().referenceLines || [];
799
+
800
+ expect(referenceLines.length).toBe(1);
801
+ expect(referenceLines[0]!.value).toBe(TARGET_PERCENTAGE);
802
+ expect(referenceLines[0]!.label).toBe(`Target ${TARGET_PERCENTAGE}%`);
803
+ });
804
+
805
+ test("omits the target line when the SLO has no targetPercentage", async () => {
806
+ getItemMock.mockResolvedValue(buildSlo({ hasTarget: false }));
807
+
808
+ const sliChart: DashboardSloComponent | undefined = CHART_WIDGETS.find(
809
+ (widget: DashboardSloComponent): boolean => {
810
+ return getWidgetMetric(widget) === SloWidgetMetric.Sli;
811
+ },
812
+ );
813
+
814
+ expect(sliChart).toBeDefined();
815
+
816
+ renderSloWidget(configureSloWidget(sliChart as DashboardSloComponent));
817
+
818
+ /*
819
+ * The chart still has to draw — otherwise "no reference line" would be
820
+ * true because nothing rendered at all.
821
+ */
822
+ await expectRendered({
823
+ label: "SLI chart without a target",
824
+ text: `points:${HISTORY_ROW_COUNT}`,
825
+ });
826
+
827
+ /*
828
+ * A line at 0 (or at NaN) would read as a target of zero percent, which
829
+ * is a reliability claim the SLO never made.
830
+ */
831
+ expect(getLastChartProps().referenceLines || []).toEqual([]);
832
+ });
833
+
834
+ test("the budget and burn-rate charts never draw a target line", async () => {
835
+ const otherCharts: Array<DashboardSloComponent> = CHART_WIDGETS.filter(
836
+ (widget: DashboardSloComponent): boolean => {
837
+ return getWidgetMetric(widget) !== SloWidgetMetric.Sli;
838
+ },
839
+ );
840
+
841
+ expect(otherCharts.length).toBeGreaterThan(0);
842
+
843
+ for (const widget of otherCharts) {
844
+ const label: string = getWidgetLabel(widget);
845
+
846
+ renderSloWidget(configureSloWidget(widget));
847
+
848
+ await expectRendered({
849
+ label: label,
850
+ text: `points:${HISTORY_ROW_COUNT}`,
851
+ });
852
+
853
+ /*
854
+ * targetPercentage is a percentage of the SLI; drawn across a burn
855
+ * rate ("99.9x") or across remaining budget it is meaningless, and
856
+ * the SLO row carries one on every one of these renders.
857
+ */
858
+ const referenceLines: Array<ChartReferenceLineProps> =
859
+ getLastChartProps().referenceLines || [];
860
+
861
+ expect(`${label}: ${referenceLines.length} reference lines`).toBe(
862
+ `${label}: 0 reference lines`,
863
+ );
864
+
865
+ cleanup();
866
+ }
867
+ });
868
+ });
869
+
870
+ describe("SLO dashboard template — the text rows", () => {
871
+ test("every text row renders its configured sentence in full", () => {
872
+ expect(TEXT_WIDGETS.length).toBeGreaterThan(0);
873
+
874
+ for (const widget of TEXT_WIDGETS) {
875
+ const text: string = widget.arguments.text;
876
+ const { container }: RenderResult = renderTextWidget(widget);
877
+
878
+ const rendered: HTMLElement | null = screen.queryByText(text);
879
+
880
+ expect(`"${text}" -> "${rendered?.textContent ?? ""}"`).toBe(
881
+ `"${text}" -> "${text}"`,
882
+ );
883
+
884
+ // The renderer's own placeholder for a row with nothing to say.
885
+ expect(container.textContent).not.toContain("No text configured");
886
+
887
+ /*
888
+ * Section headers are bold and the guidance row is not — the one
889
+ * visual cue that separates an instruction from a heading.
890
+ */
891
+ const expectedWeight: string = widget.arguments.isBold
892
+ ? "font-semibold"
893
+ : "font-normal";
894
+
895
+ expect(
896
+ `"${text}" -> ${rendered?.className.includes(expectedWeight) ? expectedWeight : rendered?.className}`,
897
+ ).toBe(`"${text}" -> ${expectedWeight}`);
898
+
899
+ cleanup();
900
+ }
901
+ });
902
+
903
+ test("the guidance row renders the whole instruction at a legible size", () => {
904
+ /*
905
+ * Row 1 is the one instruction a reader needs on a freshly created SLO
906
+ * dashboard: every widget above is inert until an objective is picked,
907
+ * and the widgets' own "Click to select an SLO" does nothing in the view
908
+ * mode a template opens in. A clipped or empty render loses that.
909
+ */
910
+ const guidance: DashboardTextComponent | undefined = TEXT_WIDGETS.find(
911
+ (widget: DashboardTextComponent): boolean => {
912
+ return widget.topInDashboardUnits === 1;
913
+ },
914
+ );
915
+
916
+ expect(guidance).toBeDefined();
917
+
918
+ const widget: DashboardTextComponent = guidance as DashboardTextComponent;
919
+ const text: string = widget.arguments.text;
920
+
921
+ renderTextWidget(widget);
922
+
923
+ const rendered: HTMLElement = screen.getByText(text);
924
+
925
+ // Rendered whole: not the first clause, not an ellipsis.
926
+ expect(rendered.textContent).toBe(text);
927
+ expect((rendered.textContent || "").length).toBe(text.length);
928
+
929
+ /*
930
+ * The Text widget scales its font to the row height. A height-1 row that
931
+ * resolved to 0 (or to a non-number) would render the sentence
932
+ * invisibly while every text assertion above still passed.
933
+ */
934
+ const fontSizeInPx: number = Number.parseFloat(rendered.style.fontSize);
935
+
936
+ expect(Number.isFinite(fontSizeInPx)).toBe(true);
937
+ expect(fontSizeInPx).toBeGreaterThan(0);
938
+ expect(fontSizeInPx).toBeLessThanOrEqual(64);
939
+ });
940
+ });