@oneuptime/common 13.0.8 → 14.0.1

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 (514) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Index.ts +4 -0
  4. package/Models/DatabaseModels/Monitor.ts +3 -2
  5. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  6. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
  7. package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
  8. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
  9. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
  10. package/Scripts/generate-service-worker.js +65 -4
  11. package/Server/API/BaseAPI.ts +26 -5
  12. package/Server/API/GlobalConfigAPI.ts +228 -462
  13. package/Server/API/ProjectOIDC.ts +25 -16
  14. package/Server/API/ProjectSSO.ts +24 -16
  15. package/Server/API/StatusPageAPI.ts +100 -42
  16. package/Server/API/TeamMemberAPI.ts +10 -1
  17. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  18. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  19. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  20. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  21. package/Server/EnvironmentConfig.ts +147 -2
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  26. package/Server/Middleware/UserAuthorization.ts +38 -16
  27. package/Server/Services/AuditLogService.ts +84 -1079
  28. package/Server/Services/DatabaseService.ts +10 -0
  29. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  30. package/Server/Services/GlobalConfigService.ts +80 -1
  31. package/Server/Services/Index.ts +4 -0
  32. package/Server/Services/MonitorProbeService.ts +116 -20
  33. package/Server/Services/MonitorService.ts +59 -6
  34. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  35. package/Server/Services/MonitorTemplateService.ts +26 -0
  36. package/Server/Services/ProjectService.ts +284 -0
  37. package/Server/Services/RumSessionPinService.ts +25 -6
  38. package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
  39. package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
  40. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
  41. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
  42. package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
  43. package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
  44. package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
  45. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  46. package/Server/Services/StatusPageService.ts +78 -1
  47. package/Server/Services/TeamMemberService.ts +11 -0
  48. package/Server/Services/TeamService.ts +10 -0
  49. package/Server/Services/UserService.ts +10 -17
  50. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  51. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  52. package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
  53. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  54. package/Server/Types/Markdown.ts +41 -0
  55. package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
  56. package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
  57. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  58. package/Server/Utils/EditionEnforcement.ts +233 -0
  59. package/Server/Utils/FrontendEnvironment.ts +41 -2
  60. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  61. package/Server/Utils/Monitor/AffectedResourceList.ts +148 -0
  62. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
  63. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  64. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
  65. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +720 -465
  66. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  67. package/Server/Utils/Monitor/RootCauseList.ts +139 -0
  68. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
  69. package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
  70. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  71. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  72. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  73. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  74. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  75. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  76. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  77. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  78. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  79. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  80. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  81. package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
  82. package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
  83. package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
  84. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  85. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
  86. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
  87. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  88. package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
  89. package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
  90. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
  91. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
  92. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
  93. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
  94. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  95. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  96. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
  97. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  98. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  99. package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
  100. package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
  101. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
  102. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
  103. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
  104. package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
  105. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  106. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  107. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  108. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  109. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
  110. package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
  111. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
  112. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  113. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  114. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  115. package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
  116. package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
  117. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  118. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  119. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  120. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  121. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  122. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  123. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  124. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  125. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  126. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  127. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  128. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  129. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  130. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  131. package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
  132. package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
  133. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
  134. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  135. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  136. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  137. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  138. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
  139. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  140. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  141. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  142. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  143. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  144. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  145. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  146. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
  147. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
  148. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  149. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
  150. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
  151. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
  152. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
  153. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
  154. package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
  155. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
  156. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  157. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  158. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
  159. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  160. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  161. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  162. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
  163. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  164. package/Tests/Server/Types/Markdown.test.ts +183 -1
  165. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
  166. package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
  167. package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
  168. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  169. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  170. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  171. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  172. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  173. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  174. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
  175. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +1339 -96
  176. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
  177. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
  178. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  179. package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
  180. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
  181. package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
  182. package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
  183. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
  184. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  185. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  186. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  187. package/Tests/Types/API/Route.test.ts +56 -0
  188. package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
  189. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  190. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  191. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  192. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
  193. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  194. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  195. package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
  196. package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
  197. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  198. package/Tests/UI/Components/Icon.test.tsx +26 -0
  199. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  200. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  201. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  202. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  203. package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
  204. package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
  205. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  206. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  207. package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
  208. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  209. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  210. package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
  211. package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
  212. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
  213. package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
  214. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  215. package/Types/API/Hostname.ts +63 -16
  216. package/Types/API/Route.ts +19 -2
  217. package/Types/API/URL.ts +26 -2
  218. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  219. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  220. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  221. package/Types/Database/CanonicalModelInstance.ts +102 -0
  222. package/Types/Database/TableColumn.ts +20 -6
  223. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  224. package/Types/IP/IPv6.ts +6 -1
  225. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
  226. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
  227. package/Types/Monitor/MonitorStep.ts +6 -1
  228. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  229. package/Types/Permission.ts +90 -0
  230. package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
  231. package/Types/Rules/RuleRun.ts +4 -0
  232. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  233. package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
  234. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  235. package/UI/Components/Feed/FeedOptions.ts +427 -0
  236. package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
  237. package/UI/Components/Feed/useFeedItems.ts +28 -9
  238. package/UI/Components/Feed/useFeedOptions.ts +225 -0
  239. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  240. package/UI/Components/Icon/Icon.tsx +1 -1
  241. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  242. package/UI/Components/ModelList/ModelList.tsx +11 -1
  243. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  244. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  245. package/UI/esbuild-enterprise.js +263 -0
  246. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  247. package/Utils/HostAddressUtil.ts +94 -0
  248. package/Utils/LabelRuleImportExport.ts +27 -9
  249. package/Utils/Monitor/MetricValueFormatter.ts +2 -2
  250. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  251. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  252. package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
  253. package/Utils/Slo/SloDuration.ts +22 -6
  254. package/Utils/Slo/SloHealth.ts +8 -7
  255. package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
  256. package/Utils/Slo/SloOverviewText.ts +33 -0
  257. package/Utils/Slo/SloProjection.ts +4 -3
  258. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  259. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  260. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  261. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  262. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  263. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  264. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  265. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  266. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  267. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  268. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  269. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
  270. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
  271. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
  272. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
  273. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
  274. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
  275. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
  276. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
  277. package/build/dist/Server/API/BaseAPI.js +26 -5
  278. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  279. package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
  280. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  281. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  282. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  283. package/build/dist/Server/API/ProjectSSO.js +24 -16
  284. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  285. package/build/dist/Server/API/StatusPageAPI.js +93 -43
  286. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  287. package/build/dist/Server/API/TeamMemberAPI.js +8 -1
  288. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  289. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  290. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  291. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  292. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  293. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  294. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  295. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  296. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  297. package/build/dist/Server/EnvironmentConfig.js +84 -2
  298. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  299. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  300. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  301. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
  302. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
  303. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
  304. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
  305. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  306. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  307. package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
  308. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  309. package/build/dist/Server/Services/AuditLogService.js +71 -740
  310. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  311. package/build/dist/Server/Services/DatabaseService.js +7 -0
  312. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  313. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  314. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  315. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  316. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  317. package/build/dist/Server/Services/Index.js +4 -0
  318. package/build/dist/Server/Services/Index.js.map +1 -1
  319. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  320. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  321. package/build/dist/Server/Services/MonitorService.js +48 -6
  322. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  323. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  324. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  325. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  326. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  327. package/build/dist/Server/Services/ProjectService.js +214 -0
  328. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  329. package/build/dist/Server/Services/RumSessionPinService.js +24 -6
  330. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  331. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
  332. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
  333. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
  334. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
  335. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
  336. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  337. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
  338. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
  339. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
  340. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
  341. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
  342. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
  343. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
  344. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  345. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  346. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  347. package/build/dist/Server/Services/StatusPageService.js +71 -0
  348. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  349. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  350. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  351. package/build/dist/Server/Services/TeamService.js +9 -0
  352. package/build/dist/Server/Services/TeamService.js.map +1 -1
  353. package/build/dist/Server/Services/UserService.js +10 -16
  354. package/build/dist/Server/Services/UserService.js.map +1 -1
  355. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  356. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  357. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  358. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  359. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
  360. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  361. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  362. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  363. package/build/dist/Server/Types/Markdown.js +31 -0
  364. package/build/dist/Server/Types/Markdown.js.map +1 -1
  365. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
  366. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
  367. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
  368. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  369. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  370. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  371. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  372. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  373. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  374. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  375. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  376. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  377. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +67 -0
  378. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  379. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
  380. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  381. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  382. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
  383. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +585 -367
  384. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  385. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  386. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  387. package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
  388. package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
  389. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
  390. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  391. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
  392. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
  393. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  394. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  395. package/build/dist/Types/API/Hostname.js +59 -11
  396. package/build/dist/Types/API/Hostname.js.map +1 -1
  397. package/build/dist/Types/API/Route.js +18 -2
  398. package/build/dist/Types/API/Route.js.map +1 -1
  399. package/build/dist/Types/API/URL.js +23 -2
  400. package/build/dist/Types/API/URL.js.map +1 -1
  401. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  402. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  403. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  404. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  405. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  406. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  407. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  408. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  409. package/build/dist/Types/Database/TableColumn.js +19 -6
  410. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  411. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  412. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  413. package/build/dist/Types/IP/IPv6.js +6 -1
  414. package/build/dist/Types/IP/IPv6.js.map +1 -1
  415. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  416. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  417. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  418. package/build/dist/Types/Permission.js +84 -0
  419. package/build/dist/Types/Permission.js.map +1 -1
  420. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
  421. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  422. package/build/dist/Types/Rules/RuleRun.js +4 -0
  423. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  424. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  425. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  426. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
  427. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  428. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  429. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  430. package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
  431. package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
  432. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
  433. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
  434. package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
  435. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
  436. package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
  437. package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
  438. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  439. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  440. package/build/dist/UI/Components/Icon/Icon.js +1 -1
  441. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  442. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  443. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  444. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  445. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  446. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  447. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  448. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  449. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  450. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  451. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  452. package/build/dist/Utils/HostAddressUtil.js +80 -0
  453. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  454. package/build/dist/Utils/LabelRuleImportExport.js +22 -6
  455. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  456. package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
  457. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  458. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  459. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  460. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  461. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
  462. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
  463. package/build/dist/Utils/Slo/SloDuration.js +13 -5
  464. package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
  465. package/build/dist/Utils/Slo/SloHealth.js +8 -7
  466. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  467. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
  468. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
  469. package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
  470. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
  471. package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
  472. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  473. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  474. package/jest.config.json +3 -1
  475. package/package.json +1 -1
  476. package/test-setup.sh +103 -34
  477. package/tsconfig.json +13 -0
  478. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  479. package/Server/API/TeamComplianceAPI.ts +0 -158
  480. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  481. package/Server/Services/TeamComplianceService.ts +0 -733
  482. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  483. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  484. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  485. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  486. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
  487. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  488. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  489. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
  490. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  491. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  492. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  493. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  494. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  495. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  496. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  497. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  498. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  499. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  500. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  501. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  502. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  503. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  504. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  505. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  506. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  507. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  508. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  509. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  510. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  511. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  512. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  513. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  514. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -0,0 +1,547 @@
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 { cleanup, fireEvent, render, screen } from "@testing-library/react";
11
+ import React from "react";
12
+ import getJestMockFunction, { MockFunction } from "../../MockType";
13
+
14
+ /*
15
+ * Who sees an enterprise feature and who sees its upsell - one tier-aware
16
+ * rule, shared by the enterprise card and the audit log card.
17
+ *
18
+ * OneUptime Cloud (billing on) compares the project's plan with the tier the
19
+ * feature's model is sold at: Scale for SSO / OIDC / SCIM / team compliance,
20
+ * Enterprise for audit logs. The Cloud runs the Enterprise image, so the
21
+ * edition flag is always true there and must not be consulted. Self-hosted
22
+ * (billing off) asks only whether this is the Enterprise Edition.
23
+ *
24
+ * Before this, both cards demanded the Enterprise plan: a Scale customer was
25
+ * walled off from SSO their plan includes. And the edition flag was checked
26
+ * first, which on an Enterprise-image Cloud would unlock everything for
27
+ * every plan.
28
+ *
29
+ * Both billing and the edition are pinned in every test: CI's config.env sets
30
+ * BILLING_ENABLED=true, so anything left to the environment tests the Cloud
31
+ * path only.
32
+ */
33
+
34
+ let billingEnabledForTest: boolean = false;
35
+ let enterpriseEditionForTest: boolean = false;
36
+ let currentPlanForTest: string | null = null;
37
+ let currentPlanThrows: boolean = false;
38
+ let planEnvForTest: Record<string, string> = {};
39
+
40
+ // jsdom does not implement window.open; the call to action uses it.
41
+ const openMock: MockFunction = getJestMockFunction();
42
+ const originalOpen: typeof window.open = window.open;
43
+
44
+ const CLOUD_PLAN_ENV: Record<string, string> = {
45
+ SUBSCRIPTION_PLAN_BASIC: "Free,priceMonthlyId1,priceYearlyId1,0,0,1,0",
46
+ SUBSCRIPTION_PLAN_GROWTH: "Growth,priceMonthlyId2,priceYearlyId2,0,0,2,14",
47
+ SUBSCRIPTION_PLAN_SCALE: "Scale,priceMonthlyId3,priceYearlyId3,0,0,3,0",
48
+ SUBSCRIPTION_PLAN_ENTERPRISE:
49
+ "Enterprise,priceMonthlyId4,priceYearlyId4,-1,-1,4,14",
50
+ };
51
+
52
+ jest.mock("../../../UI/Config", () => {
53
+ const actual: Record<string, unknown> = jest.requireActual(
54
+ "../../../UI/Config",
55
+ ) as Record<string, unknown>;
56
+
57
+ const mocked: Record<string, unknown> = { ...actual };
58
+
59
+ Object.defineProperty(mocked, "BILLING_ENABLED", {
60
+ get: (): boolean => {
61
+ return billingEnabledForTest;
62
+ },
63
+ });
64
+
65
+ Object.defineProperty(mocked, "IS_ENTERPRISE_EDITION", {
66
+ get: (): boolean => {
67
+ return enterpriseEditionForTest;
68
+ },
69
+ });
70
+
71
+ mocked["getAllEnvVars"] = (): Record<string, string> => {
72
+ return planEnvForTest;
73
+ };
74
+
75
+ return mocked;
76
+ });
77
+
78
+ jest.mock("../../../UI/Utils/Project", () => {
79
+ const actual: Record<string, any> = jest.requireActual(
80
+ "../../../UI/Utils/Project",
81
+ ) as Record<string, any>;
82
+
83
+ return {
84
+ __esModule: true,
85
+ ...actual,
86
+ default: {
87
+ ...actual["default"],
88
+ getCurrentPlan: (): string | null => {
89
+ if (currentPlanThrows) {
90
+ throw new Error("Plan ID is invalid");
91
+ }
92
+
93
+ return currentPlanForTest;
94
+ },
95
+ },
96
+ };
97
+ });
98
+
99
+ import EnterpriseFeatureUpgrade, {
100
+ EnterpriseUpgradeCopy,
101
+ EnterpriseUpgradeReason,
102
+ getDefaultUpgradeReason,
103
+ getEnterpriseUpgradeCopy,
104
+ isEnterpriseFeatureEligible as isEnterpriseFeatureEligibleFromCard,
105
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/EnterpriseEdition/EnterpriseFeatureUpgrade";
106
+ import AuditLogsEnterpriseUpgrade, {
107
+ isAuditLogsEnterpriseEligible,
108
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/AuditLogs/AuditLogsEnterpriseUpgrade";
109
+ import {
110
+ AUDIT_LOGS_REQUIRED_PLAN,
111
+ IDENTITY_REQUIRED_PLAN,
112
+ getCurrentPlanOrNull,
113
+ isEnterpriseFeatureEligible,
114
+ isPlanAtLeast,
115
+ } from "../../../../App/FeatureSet/Dashboard/src/Enterprise/EnterpriseEligibility";
116
+ import { PlanType } from "../../../Types/Billing/SubscriptionPlan";
117
+ import IconProp from "../../../Types/Icon/IconProp";
118
+
119
+ type Deployment = "cloud" | "self-hosted-enterprise" | "self-hosted-community";
120
+
121
+ const pinDeployment: (deployment: Deployment) => void = (
122
+ deployment: Deployment,
123
+ ): void => {
124
+ billingEnabledForTest = deployment === "cloud";
125
+ /*
126
+ * The Cloud runs the Enterprise image, so its effective edition is true;
127
+ * pinning it true proves the plan check does not fall back to it.
128
+ */
129
+ enterpriseEditionForTest = deployment !== "self-hosted-community";
130
+ };
131
+
132
+ beforeEach(() => {
133
+ billingEnabledForTest = false;
134
+ enterpriseEditionForTest = false;
135
+ currentPlanForTest = null;
136
+ currentPlanThrows = false;
137
+ planEnvForTest = CLOUD_PLAN_ENV;
138
+ openMock.mockReset();
139
+ window.open = openMock as unknown as typeof window.open;
140
+ });
141
+
142
+ afterEach(() => {
143
+ cleanup();
144
+ window.open = originalOpen;
145
+ });
146
+
147
+ describe("which plan each enterprise feature needs", () => {
148
+ test("SSO, OIDC, SCIM and compliance are Scale; audit logs are Enterprise", () => {
149
+ expect(IDENTITY_REQUIRED_PLAN).toBe(PlanType.Scale);
150
+ expect(AUDIT_LOGS_REQUIRED_PLAN).toBe(PlanType.Enterprise);
151
+ });
152
+ });
153
+
154
+ describe("isPlanAtLeast", () => {
155
+ test.each([
156
+ [PlanType.Scale, PlanType.Free, false],
157
+ [PlanType.Scale, PlanType.Growth, false],
158
+ [PlanType.Scale, PlanType.Scale, true],
159
+ [PlanType.Scale, PlanType.Enterprise, true],
160
+ [PlanType.Enterprise, PlanType.Growth, false],
161
+ [PlanType.Enterprise, PlanType.Scale, false],
162
+ [PlanType.Enterprise, PlanType.Enterprise, true],
163
+ ])(
164
+ "needs %s, has %s -> %s",
165
+ (required: PlanType, current: PlanType, expected: boolean) => {
166
+ expect(isPlanAtLeast(required, current)).toBe(expected);
167
+ },
168
+ );
169
+
170
+ test("no plan is never enough", () => {
171
+ expect(isPlanAtLeast(PlanType.Scale, null)).toBe(false);
172
+ });
173
+
174
+ test("plans that cannot be ordered count as not enough, except an exact match", () => {
175
+ /*
176
+ * With no SUBSCRIPTION_PLAN_* the order is unknown. The upsell check
177
+ * must not throw its way into an error boundary.
178
+ */
179
+ planEnvForTest = {};
180
+
181
+ expect(isPlanAtLeast(PlanType.Scale, PlanType.Enterprise)).toBe(false);
182
+ expect(isPlanAtLeast(PlanType.Scale, PlanType.Scale)).toBe(true);
183
+ });
184
+ });
185
+
186
+ describe("getCurrentPlanOrNull", () => {
187
+ test("passes the project's plan through", () => {
188
+ currentPlanForTest = PlanType.Growth;
189
+ expect(getCurrentPlanOrNull()).toBe(PlanType.Growth);
190
+ });
191
+
192
+ test("turns an unknown plan id into no plan instead of throwing", () => {
193
+ currentPlanThrows = true;
194
+ expect(getCurrentPlanOrNull()).toBeNull();
195
+ });
196
+ });
197
+
198
+ describe("isEnterpriseFeatureEligible on OneUptime Cloud", () => {
199
+ beforeEach(() => {
200
+ pinDeployment("cloud");
201
+ });
202
+
203
+ test.each([
204
+ [PlanType.Free, false],
205
+ [PlanType.Growth, false],
206
+ [PlanType.Scale, true],
207
+ [PlanType.Enterprise, true],
208
+ ])(
209
+ "a %s project gets the Scale-tier features: %s",
210
+ (plan: PlanType, expected: boolean) => {
211
+ currentPlanForTest = plan;
212
+
213
+ expect(isEnterpriseFeatureEligible(PlanType.Scale)).toBe(expected);
214
+ },
215
+ );
216
+
217
+ test.each([
218
+ [PlanType.Growth, false],
219
+ [PlanType.Scale, false],
220
+ [PlanType.Enterprise, true],
221
+ ])(
222
+ "a %s project gets the Enterprise-tier features: %s",
223
+ (plan: PlanType, expected: boolean) => {
224
+ currentPlanForTest = plan;
225
+
226
+ expect(isEnterpriseFeatureEligible(PlanType.Enterprise)).toBe(expected);
227
+ },
228
+ );
229
+
230
+ test("defaults to the Scale tier, so existing callers fix the Scale-plan wall", () => {
231
+ currentPlanForTest = PlanType.Scale;
232
+ expect(isEnterpriseFeatureEligible()).toBe(true);
233
+
234
+ currentPlanForTest = PlanType.Growth;
235
+ expect(isEnterpriseFeatureEligible()).toBe(false);
236
+ });
237
+
238
+ test("never falls back to the edition flag - the Cloud runs the Enterprise image", () => {
239
+ enterpriseEditionForTest = true;
240
+ currentPlanForTest = PlanType.Free;
241
+
242
+ expect(isEnterpriseFeatureEligible(PlanType.Scale)).toBe(false);
243
+ expect(isEnterpriseFeatureEligible(PlanType.Enterprise)).toBe(false);
244
+ });
245
+
246
+ test("a project with no plan, or an unknown one, gets the upsell", () => {
247
+ currentPlanForTest = null;
248
+ expect(isEnterpriseFeatureEligible(PlanType.Scale)).toBe(false);
249
+
250
+ currentPlanThrows = true;
251
+ expect(isEnterpriseFeatureEligible(PlanType.Scale)).toBe(false);
252
+ });
253
+
254
+ test("the card re-exports the same check under its old name", () => {
255
+ expect(isEnterpriseFeatureEligibleFromCard).toBe(
256
+ isEnterpriseFeatureEligible,
257
+ );
258
+ });
259
+ });
260
+
261
+ describe("isEnterpriseFeatureEligible when self-hosted", () => {
262
+ test("the Enterprise Edition gets every feature, whatever the plan says", () => {
263
+ pinDeployment("self-hosted-enterprise");
264
+ currentPlanForTest = PlanType.Free;
265
+
266
+ expect(isEnterpriseFeatureEligible(PlanType.Scale)).toBe(true);
267
+ expect(isEnterpriseFeatureEligible(PlanType.Enterprise)).toBe(true);
268
+ expect(isEnterpriseFeatureEligible()).toBe(true);
269
+ });
270
+
271
+ test("the Community Edition gets none", () => {
272
+ pinDeployment("self-hosted-community");
273
+ currentPlanForTest = PlanType.Enterprise;
274
+
275
+ expect(isEnterpriseFeatureEligible(PlanType.Scale)).toBe(false);
276
+ expect(isEnterpriseFeatureEligible(PlanType.Enterprise)).toBe(false);
277
+ });
278
+
279
+ test("does not even ask for the plan", () => {
280
+ pinDeployment("self-hosted-enterprise");
281
+ currentPlanThrows = true;
282
+
283
+ expect(isEnterpriseFeatureEligible(PlanType.Enterprise)).toBe(true);
284
+ });
285
+ });
286
+
287
+ describe("isAuditLogsEnterpriseEligible", () => {
288
+ test("needs the Enterprise plan on the Cloud - Scale is not enough", () => {
289
+ pinDeployment("cloud");
290
+
291
+ currentPlanForTest = PlanType.Scale;
292
+ expect(isAuditLogsEnterpriseEligible()).toBe(false);
293
+
294
+ currentPlanForTest = PlanType.Enterprise;
295
+ expect(isAuditLogsEnterpriseEligible()).toBe(true);
296
+ });
297
+
298
+ test("follows the edition when self-hosted", () => {
299
+ pinDeployment("self-hosted-enterprise");
300
+ expect(isAuditLogsEnterpriseEligible()).toBe(true);
301
+
302
+ pinDeployment("self-hosted-community");
303
+ expect(isAuditLogsEnterpriseEligible()).toBe(false);
304
+ });
305
+ });
306
+
307
+ describe("the upsell wording (getEnterpriseUpgradeCopy)", () => {
308
+ test("sells the Scale plan, and says the plans above include it", () => {
309
+ const copy: EnterpriseUpgradeCopy = getEnterpriseUpgradeCopy({
310
+ featureName: "SAML Single Sign On",
311
+ requiredPlan: PlanType.Scale,
312
+ reason: EnterpriseUpgradeReason.Plan,
313
+ });
314
+
315
+ expect(copy.ctaTitle).toBe("Upgrade to Scale");
316
+ expect(copy.badge).toBe(PlanType.Scale);
317
+ expect(copy.pitchLine).toBe(
318
+ "SAML Single Sign On is available on the Scale plan and above. Upgrade to enable it for this project.",
319
+ );
320
+ expect(copy.ctaUrl).toBe("https://oneuptime.com/pricing");
321
+ expect(copy.secondaryTitle).toBe("Compare plans");
322
+ });
323
+
324
+ test("sells the Enterprise plan as the top plan", () => {
325
+ const copy: EnterpriseUpgradeCopy = getEnterpriseUpgradeCopy({
326
+ featureName: "Team Compliance Rules",
327
+ requiredPlan: PlanType.Enterprise,
328
+ reason: EnterpriseUpgradeReason.Plan,
329
+ });
330
+
331
+ expect(copy.ctaTitle).toBe("Upgrade to Enterprise");
332
+ expect(copy.pitchLine).toBe(
333
+ "Team Compliance Rules is available on the Enterprise plan. Upgrade to enable it for this project.",
334
+ );
335
+ });
336
+
337
+ test("points at the Enterprise Edition when the plan is not the problem", () => {
338
+ const copy: EnterpriseUpgradeCopy = getEnterpriseUpgradeCopy({
339
+ featureName: "OIDC",
340
+ requiredPlan: PlanType.Scale,
341
+ reason: EnterpriseUpgradeReason.Edition,
342
+ });
343
+
344
+ expect(copy.ctaTitle).toBe("Learn about Enterprise Edition");
345
+ expect(copy.badge).toBe("Enterprise");
346
+ expect(copy.ctaUrl).toBe("https://oneuptime.com/enterprise/overview");
347
+ expect(copy.secondaryTitle).toBe("Read docs");
348
+ expect(copy.secondaryUrl).toBe(
349
+ "https://oneuptime.com/docs/self-hosted/enterprise",
350
+ );
351
+ expect(copy.pitchLine).toBe(
352
+ "OIDC is a OneUptime Enterprise Edition feature. Switch to the Enterprise Edition build to enable it.",
353
+ );
354
+ // Never a plan upgrade.
355
+ expect(copy.pitchLine).not.toContain("plan");
356
+ });
357
+
358
+ test("uses a caller's own sentence for each reason", () => {
359
+ expect(
360
+ getEnterpriseUpgradeCopy({
361
+ featureName: "Audit Logs",
362
+ requiredPlan: PlanType.Enterprise,
363
+ reason: EnterpriseUpgradeReason.Plan,
364
+ planPitchLine: "Plan sentence.",
365
+ editionPitchLine: "Edition sentence.",
366
+ }).pitchLine,
367
+ ).toBe("Plan sentence.");
368
+
369
+ expect(
370
+ getEnterpriseUpgradeCopy({
371
+ featureName: "Audit Logs",
372
+ requiredPlan: PlanType.Enterprise,
373
+ reason: EnterpriseUpgradeReason.Edition,
374
+ planPitchLine: "Plan sentence.",
375
+ editionPitchLine: "Edition sentence.",
376
+ }).pitchLine,
377
+ ).toBe("Edition sentence.");
378
+ });
379
+
380
+ test("defaults the reason from billing", () => {
381
+ pinDeployment("cloud");
382
+ expect(getDefaultUpgradeReason()).toBe(EnterpriseUpgradeReason.Plan);
383
+
384
+ pinDeployment("self-hosted-community");
385
+ expect(getDefaultUpgradeReason()).toBe(EnterpriseUpgradeReason.Edition);
386
+ });
387
+ });
388
+
389
+ describe("EnterpriseFeatureUpgrade", () => {
390
+ const renderCard: (
391
+ extra?: Partial<React.ComponentProps<typeof EnterpriseFeatureUpgrade>>,
392
+ ) => void = (
393
+ extra?: Partial<React.ComponentProps<typeof EnterpriseFeatureUpgrade>>,
394
+ ): void => {
395
+ render(
396
+ <EnterpriseFeatureUpgrade
397
+ title="Single Sign On (SSO)"
398
+ description="Configure SAML SSO for your project."
399
+ featureName="SAML Single Sign On"
400
+ featureDescription="Let team members sign in with your IdP."
401
+ benefits={[
402
+ {
403
+ icon: IconProp.Lock,
404
+ title: "Centralized auth",
405
+ subtitle: "Revoke access from one place.",
406
+ },
407
+ ]}
408
+ {...(extra || {})}
409
+ />,
410
+ );
411
+ };
412
+
413
+ test("on the Cloud, sells the Scale plan by default and opens pricing", () => {
414
+ pinDeployment("cloud");
415
+
416
+ renderCard();
417
+
418
+ expect(screen.getByText("Single Sign On (SSO)")).toBeInTheDocument();
419
+ expect(screen.getByText("SAML Single Sign On")).toBeInTheDocument();
420
+ expect(
421
+ screen.getByText("Let team members sign in with your IdP."),
422
+ ).toBeInTheDocument();
423
+ expect(screen.getByText("Centralized auth")).toBeInTheDocument();
424
+ expect(
425
+ screen.getByText(
426
+ "SAML Single Sign On is available on the Scale plan and above. Upgrade to enable it for this project.",
427
+ ),
428
+ ).toBeInTheDocument();
429
+ expect(screen.getByText("Compare plans")).toBeInTheDocument();
430
+ expect(screen.queryByText("Read docs")).not.toBeInTheDocument();
431
+
432
+ // The header button and the body button carry the same call to action.
433
+ const ctas: Array<HTMLElement> = screen.getAllByText("Upgrade to Scale");
434
+ expect(ctas).toHaveLength(2);
435
+
436
+ fireEvent.click(ctas[0]!);
437
+ expect(openMock).toHaveBeenCalledWith(
438
+ "https://oneuptime.com/pricing",
439
+ "_blank",
440
+ );
441
+ });
442
+
443
+ test("on the Cloud, an Enterprise-tier feature sells Enterprise", () => {
444
+ pinDeployment("cloud");
445
+
446
+ renderCard({ requiredPlan: PlanType.Enterprise });
447
+
448
+ expect(screen.getAllByText("Upgrade to Enterprise")).toHaveLength(2);
449
+ expect(
450
+ screen.getByText(
451
+ "SAML Single Sign On is available on the Enterprise plan. Upgrade to enable it for this project.",
452
+ ),
453
+ ).toBeInTheDocument();
454
+ });
455
+
456
+ test("self-hosted, points at the Enterprise Edition and its docs", () => {
457
+ pinDeployment("self-hosted-community");
458
+
459
+ renderCard();
460
+
461
+ expect(screen.getAllByText("Learn about Enterprise Edition")).toHaveLength(
462
+ 2,
463
+ );
464
+ expect(screen.queryByText("Compare plans")).not.toBeInTheDocument();
465
+
466
+ fireEvent.click(screen.getByText("Read docs"));
467
+ expect(openMock).toHaveBeenCalledWith(
468
+ "https://oneuptime.com/docs/self-hosted/enterprise",
469
+ "_blank",
470
+ );
471
+ });
472
+
473
+ test("an explicit Edition reason wins over billing", () => {
474
+ pinDeployment("cloud");
475
+
476
+ renderCard({ reason: EnterpriseUpgradeReason.Edition });
477
+
478
+ expect(screen.getAllByText("Learn about Enterprise Edition")).toHaveLength(
479
+ 2,
480
+ );
481
+ expect(screen.queryByText("Upgrade to Scale")).not.toBeInTheDocument();
482
+ });
483
+ });
484
+
485
+ describe("AuditLogsEnterpriseUpgrade", () => {
486
+ test("on the Cloud, sells the Enterprise plan with the audit log wording", () => {
487
+ pinDeployment("cloud");
488
+
489
+ render(
490
+ <AuditLogsEnterpriseUpgrade
491
+ title="Audit Logs"
492
+ description="Every change made in this project."
493
+ />,
494
+ );
495
+
496
+ expect(
497
+ screen.getByText(
498
+ "Audit Logs are available on the Enterprise plan. Upgrade to turn on audit logging for this project.",
499
+ ),
500
+ ).toBeInTheDocument();
501
+ expect(screen.getAllByText("Upgrade to Enterprise")).toHaveLength(2);
502
+ // The default feature description and the audit log benefits.
503
+ expect(
504
+ screen.getByText(
505
+ "Record every create, update and delete performed on this project's resources.",
506
+ ),
507
+ ).toBeInTheDocument();
508
+ expect(screen.getByText("Track every change")).toBeInTheDocument();
509
+ expect(screen.getByText("Configurable retention")).toBeInTheDocument();
510
+ });
511
+
512
+ test("self-hosted, points at the Enterprise Edition", () => {
513
+ pinDeployment("self-hosted-community");
514
+
515
+ render(
516
+ <AuditLogsEnterpriseUpgrade
517
+ title="Audit Logs"
518
+ description="Every change made in this project."
519
+ featureDescription="A custom description."
520
+ />,
521
+ );
522
+
523
+ expect(
524
+ screen.getByText(
525
+ "Audit Logs are a OneUptime Enterprise Edition feature. Switch to the Enterprise Edition build to enable audit logging.",
526
+ ),
527
+ ).toBeInTheDocument();
528
+ expect(screen.getByText("A custom description.")).toBeInTheDocument();
529
+ });
530
+
531
+ test("passes an explicit reason through", () => {
532
+ pinDeployment("cloud");
533
+
534
+ render(
535
+ <AuditLogsEnterpriseUpgrade
536
+ title="Audit Logs"
537
+ description="Every change made in this project."
538
+ reason={EnterpriseUpgradeReason.Edition}
539
+ />,
540
+ );
541
+
542
+ expect(screen.getAllByText("Learn about Enterprise Edition")).toHaveLength(
543
+ 2,
544
+ );
545
+ expect(screen.queryByText("Upgrade to Enterprise")).not.toBeInTheDocument();
546
+ });
547
+ });