@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
@@ -1,568 +0,0 @@
1
- import EnterpriseLicenseSyncUtil, {
2
- EnterpriseLicenseSyncResult,
3
- } from "../../Utils/EnterpriseLicense/EnterpriseLicenseSync";
4
- import { JSONObject } from "../../Types/JSON";
5
- import { describe, expect, it } from "@jest/globals";
6
-
7
- /*
8
- * The mapper that turns a license-server response into the GlobalConfig
9
- * columns a self-hosted installation mirrors.
10
- *
11
- * This exists because of a real, reported bug: a customer raised their seat
12
- * limit on oneuptime.com, their installation called home every day as
13
- * designed, and the modal kept showing the old limit forever. The daily job
14
- * read four fields out of the response and silently dropped userLimit, and the
15
- * only other writer of that column is a human re-typing the license key.
16
- *
17
- * Every field here is three-state, and keeping those states apart IS the
18
- * contract:
19
- *
20
- * key absent -> leave the stored column alone. This is what an oneuptime.com
21
- * older than the installation looks like, and collapsing it to
22
- * null would let a daily report wipe a valid license expiry
23
- * and take the installation down.
24
- * null -> the server means "no value"; write null.
25
- * a value -> validate, then write.
26
- *
27
- * The absent case cannot be asserted with toBeUndefined(): reading a missing
28
- * key and reading a key set to undefined both give undefined, and only one of
29
- * them is safe to hand to updateOneById. Every "left alone" assertion below
30
- * therefore goes through Object.keys / toHaveProperty.
31
- */
32
-
33
- const REPORTED_AT: Date = new Date("2026-08-24T10:00:00.000Z");
34
-
35
- type SyncFunction = (payload: JSONObject) => EnterpriseLicenseSyncResult;
36
-
37
- const sync: SyncFunction = (
38
- payload: JSONObject,
39
- ): EnterpriseLicenseSyncResult => {
40
- return EnterpriseLicenseSyncUtil.getGlobalConfigUpdateFromLicenseResponse({
41
- payload: payload,
42
- reportedAt: REPORTED_AT,
43
- });
44
- };
45
-
46
- type KeysFunction = (payload: JSONObject) => Array<string>;
47
-
48
- const keys: KeysFunction = (payload: JSONObject): Array<string> => {
49
- return Object.keys(sync(payload).updateData);
50
- };
51
-
52
- /*
53
- * The exact body Common/Server/API/EnterpriseLicenseAPI.ts sends from
54
- * /report-user-count for a healthy license. Kept in one place so the contract
55
- * test at the bottom and the happy-path tests cannot drift apart.
56
- */
57
- type ServerResponseFunction = (overrides?: JSONObject) => JSONObject;
58
-
59
- const serverResponse: ServerResponseFunction = (
60
- overrides?: JSONObject,
61
- ): JSONObject => {
62
- return {
63
- companyName: "Acme Inc",
64
- expiresAt: "2027-01-01T00:00:00.000Z",
65
- licenseKey: "the-key-the-server-knows",
66
- userLimit: 150,
67
- currentUserCount: 42,
68
- userCountUpdatedAt: "2026-08-24T09:59:00.000Z",
69
- isEvaluationLicense: false,
70
- instances: [
71
- {
72
- instanceId: "instance-1",
73
- host: "oneuptime.acme.internal",
74
- userCount: 42,
75
- isCountedTowardsUsage: true,
76
- lastReportedAt: "2026-08-24T09:59:00.000Z",
77
- version: "12.0.19",
78
- },
79
- ],
80
- token: "signed.jwt.token",
81
- ...overrides,
82
- };
83
- };
84
-
85
- describe("EnterpriseLicenseSyncUtil - the reported bug: the seat limit", () => {
86
- it("writes a raised seat limit, which is the regression this whole file guards", () => {
87
- const result: EnterpriseLicenseSyncResult = sync({ userLimit: 150 });
88
-
89
- expect(result.updateData.enterpriseLicenseUserLimit).toBe(150);
90
- expect(result.warnings).toEqual([]);
91
- });
92
-
93
- it("writes a lowered seat limit too - the sync is not one-directional", () => {
94
- expect(sync({ userLimit: 5 }).updateData.enterpriseLicenseUserLimit).toBe(
95
- 5,
96
- );
97
- });
98
-
99
- it("writes an explicit null, so clearing the limit on oneuptime.com clears it here", () => {
100
- const result: EnterpriseLicenseSyncResult = sync({ userLimit: null });
101
-
102
- expect(Object.keys(result.updateData)).toContain(
103
- "enterpriseLicenseUserLimit",
104
- );
105
- expect(result.updateData.enterpriseLicenseUserLimit).toBeNull();
106
- expect(result.warnings).toEqual([]);
107
- });
108
-
109
- it("leaves the stored limit alone when the server never mentions it", () => {
110
- // An oneuptime.com older than this build. Must be a no-op, not a clear.
111
- expect(keys({ currentUserCount: 3 })).not.toContain(
112
- "enterpriseLicenseUserLimit",
113
- );
114
- });
115
-
116
- it("treats an explicit undefined as silence, not as a clear", () => {
117
- expect(keys({ userLimit: undefined })).not.toContain(
118
- "enterpriseLicenseUserLimit",
119
- );
120
- });
121
-
122
- it("writes zero rather than skipping it on a truthiness check", () => {
123
- const result: EnterpriseLicenseSyncResult = sync({ userLimit: 0 });
124
-
125
- expect(Object.keys(result.updateData)).toContain(
126
- "enterpriseLicenseUserLimit",
127
- );
128
- expect(result.updateData.enterpriseLicenseUserLimit).toBe(0);
129
- });
130
-
131
- it.each([
132
- ["a numeric string", "150"],
133
- ["NaN", Number.NaN],
134
- ["Infinity", Number.POSITIVE_INFINITY],
135
- ["a fraction", 12.5],
136
- ["a negative number", -1],
137
- ["a boolean", true],
138
- ["an object", {}],
139
- ["an array", [150]],
140
- ])(
141
- "refuses to store %s as the seat limit, and says so",
142
- (_label: string, value: unknown) => {
143
- const result: EnterpriseLicenseSyncResult = sync({
144
- userLimit: value,
145
- } as JSONObject);
146
-
147
- expect(Object.keys(result.updateData)).not.toContain(
148
- "enterpriseLicenseUserLimit",
149
- );
150
- expect(result.warnings).toHaveLength(1);
151
- expect(result.warnings[0]).toContain("userLimit");
152
- },
153
- );
154
- });
155
-
156
- describe("EnterpriseLicenseSyncUtil - user count and its timestamp", () => {
157
- it("stores the deduplicated count the server computed across every instance", () => {
158
- const result: EnterpriseLicenseSyncResult = sync({
159
- currentUserCount: 42,
160
- userCountUpdatedAt: "2026-08-24T09:59:00.000Z",
161
- });
162
-
163
- expect(result.updateData.enterpriseLicenseCurrentUserCount).toBe(42);
164
- expect(result.updateData.enterpriseLicenseUserCountUpdatedAt).toEqual(
165
- new Date("2026-08-24T09:59:00.000Z"),
166
- );
167
- });
168
-
169
- it("falls back to the caller's clock when the server sends a count but no stamp", () => {
170
- const result: EnterpriseLicenseSyncResult = sync({ currentUserCount: 7 });
171
-
172
- expect(result.updateData.enterpriseLicenseUserCountUpdatedAt).toEqual(
173
- REPORTED_AT,
174
- );
175
- });
176
-
177
- it("falls back to the caller's clock when the stamp is unparseable", () => {
178
- const result: EnterpriseLicenseSyncResult = sync({
179
- currentUserCount: 7,
180
- userCountUpdatedAt: "last tuesday",
181
- });
182
-
183
- expect(result.updateData.enterpriseLicenseUserCountUpdatedAt).toEqual(
184
- REPORTED_AT,
185
- );
186
- });
187
-
188
- it("stores a count of zero", () => {
189
- const result: EnterpriseLicenseSyncResult = sync({ currentUserCount: 0 });
190
-
191
- expect(result.updateData.enterpriseLicenseCurrentUserCount).toBe(0);
192
- });
193
-
194
- it("never stamps a timestamp onto a count it did not store", () => {
195
- /*
196
- * A fresh stamp on a stale count is the specific lie that made this bug
197
- * hard to see: the modal reads "last reported today" underneath a number
198
- * from weeks ago.
199
- */
200
- const result: EnterpriseLicenseSyncResult = sync({
201
- currentUserCount: "many",
202
- userCountUpdatedAt: "2026-08-24T09:59:00.000Z",
203
- } as JSONObject);
204
-
205
- expect(Object.keys(result.updateData)).not.toContain(
206
- "enterpriseLicenseCurrentUserCount",
207
- );
208
- expect(Object.keys(result.updateData)).not.toContain(
209
- "enterpriseLicenseUserCountUpdatedAt",
210
- );
211
- });
212
-
213
- it.each([
214
- ["a string", "42"],
215
- ["NaN", Number.NaN],
216
- ["Infinity", Number.POSITIVE_INFINITY],
217
- ["a fraction", 4.5],
218
- ["a negative number", -3],
219
- ])(
220
- "keeps the previously stored usage when the count arrives as %s",
221
- (_label: string, value: unknown) => {
222
- const result: EnterpriseLicenseSyncResult = sync({
223
- currentUserCount: value,
224
- } as JSONObject);
225
-
226
- expect(Object.keys(result.updateData)).not.toContain(
227
- "enterpriseLicenseCurrentUserCount",
228
- );
229
- expect(result.warnings).toHaveLength(1);
230
- },
231
- );
232
-
233
- it("keeps the previously stored usage when the server reports null", () => {
234
- const result: EnterpriseLicenseSyncResult = sync({
235
- currentUserCount: null,
236
- });
237
-
238
- expect(Object.keys(result.updateData)).not.toContain(
239
- "enterpriseLicenseCurrentUserCount",
240
- );
241
- expect(result.warnings).toHaveLength(1);
242
- });
243
-
244
- it("leaves both usage columns alone when the server never mentions the count", () => {
245
- expect(keys({ userLimit: 10 })).toEqual(["enterpriseLicenseUserLimit"]);
246
- });
247
-
248
- it("still syncs everything else when only the count is unusable", () => {
249
- /*
250
- * The job used to bail out entirely here, so one malformed count also cost
251
- * the customer that day's seat limit, expiry and evaluation flag.
252
- */
253
- const result: EnterpriseLicenseSyncResult = sync(
254
- serverResponse({ currentUserCount: "nope" }),
255
- );
256
-
257
- expect(result.updateData.enterpriseLicenseUserLimit).toBe(150);
258
- expect(result.updateData.enterpriseLicenseExpiresAt).toEqual(
259
- new Date("2027-01-01T00:00:00.000Z"),
260
- );
261
- expect(result.updateData.enterpriseLicenseIsEvaluation).toBe(false);
262
- expect(result.updateData.enterpriseCompanyName).toBe("Acme Inc");
263
- expect(result.updateData.enterpriseLicenseToken).toBe("signed.jwt.token");
264
- });
265
- });
266
-
267
- describe("EnterpriseLicenseSyncUtil - expiry", () => {
268
- it("stores a renewal, so extending a license on oneuptime.com reaches the installation", () => {
269
- const result: EnterpriseLicenseSyncResult = sync({
270
- expiresAt: "2027-01-01T00:00:00.000Z",
271
- });
272
-
273
- expect(result.updateData.enterpriseLicenseExpiresAt).toEqual(
274
- new Date("2027-01-01T00:00:00.000Z"),
275
- );
276
- });
277
-
278
- it("stores an expiry in the past, because an instance must be able to learn it expired", () => {
279
- const result: EnterpriseLicenseSyncResult = sync({
280
- expiresAt: "2020-01-01T00:00:00.000Z",
281
- });
282
-
283
- expect(result.updateData.enterpriseLicenseExpiresAt).toEqual(
284
- new Date("2020-01-01T00:00:00.000Z"),
285
- );
286
- });
287
-
288
- it("leaves the stored expiry alone when the server never mentions it", () => {
289
- /*
290
- * The compatibility case that matters most: an installation upgraded ahead
291
- * of oneuptime.com must not have its expiry blanked and go dark.
292
- */
293
- expect(keys({ currentUserCount: 1 })).not.toContain(
294
- "enterpriseLicenseExpiresAt",
295
- );
296
- });
297
-
298
- it("treats an explicit null as silence - a report never strips an expiry", () => {
299
- expect(keys({ expiresAt: null })).not.toContain(
300
- "enterpriseLicenseExpiresAt",
301
- );
302
- expect(sync({ expiresAt: null }).warnings).toEqual([]);
303
- });
304
-
305
- it.each([
306
- ["an unparseable string", "not a date"],
307
- ["an empty string", ""],
308
- ["a number", 1767225600000],
309
- ["a boolean", true],
310
- ])(
311
- "keeps the stored expiry when the server sends %s, and says so",
312
- (_label: string, value: unknown) => {
313
- const result: EnterpriseLicenseSyncResult = sync({
314
- expiresAt: value,
315
- } as JSONObject);
316
-
317
- expect(Object.keys(result.updateData)).not.toContain(
318
- "enterpriseLicenseExpiresAt",
319
- );
320
- expect(result.warnings).toHaveLength(1);
321
- expect(result.warnings[0]).toContain("expiresAt");
322
- },
323
- );
324
-
325
- it("accepts a Date instance, in case the transport ever deserializes one", () => {
326
- const expiry: Date = new Date("2027-06-01T00:00:00.000Z");
327
-
328
- expect(
329
- sync({ expiresAt: expiry }).updateData.enterpriseLicenseExpiresAt,
330
- ).toEqual(expiry);
331
- });
332
- });
333
-
334
- describe("EnterpriseLicenseSyncUtil - evaluation flag", () => {
335
- it.each([
336
- [true, true],
337
- [false, false],
338
- ])(
339
- "mirrors the boolean the server sent (%s)",
340
- (value: boolean, expected: boolean) => {
341
- expect(
342
- sync({ isEvaluationLicense: value }).updateData
343
- .enterpriseLicenseIsEvaluation,
344
- ).toBe(expected);
345
- },
346
- );
347
-
348
- it("leaves the stored flag alone when the server never mentions it", () => {
349
- expect(keys({ userLimit: 1 })).not.toContain(
350
- "enterpriseLicenseIsEvaluation",
351
- );
352
- });
353
-
354
- it.each([
355
- ['the string "true"', "true"],
356
- ["a number", 1],
357
- ["null", null],
358
- ])(
359
- "refuses to guess at %s and keeps the stored flag",
360
- (_label: string, value: unknown) => {
361
- const result: EnterpriseLicenseSyncResult = sync({
362
- isEvaluationLicense: value,
363
- } as JSONObject);
364
-
365
- expect(Object.keys(result.updateData)).not.toContain(
366
- "enterpriseLicenseIsEvaluation",
367
- );
368
- expect(result.warnings).toHaveLength(1);
369
- },
370
- );
371
- });
372
-
373
- describe("EnterpriseLicenseSyncUtil - company name", () => {
374
- it("stores a rename", () => {
375
- expect(
376
- sync({ companyName: "Acme Inc" }).updateData.enterpriseCompanyName,
377
- ).toBe("Acme Inc");
378
- });
379
-
380
- it("trims what it stores", () => {
381
- expect(
382
- sync({ companyName: " Acme Inc " }).updateData.enterpriseCompanyName,
383
- ).toBe("Acme Inc");
384
- });
385
-
386
- it.each([
387
- ["an empty string", ""],
388
- ["whitespace", " "],
389
- ["null", null],
390
- ["a number", 42],
391
- ])(
392
- "keeps the stored name rather than blanking the modal for %s",
393
- (_label: string, value: unknown) => {
394
- expect(
395
- Object.keys(sync({ companyName: value } as JSONObject).updateData),
396
- ).not.toContain("enterpriseCompanyName");
397
- },
398
- );
399
-
400
- it("leaves the stored name alone when the server never mentions it", () => {
401
- expect(keys({ userLimit: 1 })).not.toContain("enterpriseCompanyName");
402
- });
403
- });
404
-
405
- describe("EnterpriseLicenseSyncUtil - token", () => {
406
- it("stores a freshly signed token", () => {
407
- expect(sync({ token: "a.b.c" }).updateData.enterpriseLicenseToken).toBe(
408
- "a.b.c",
409
- );
410
- });
411
-
412
- it.each([
413
- ["null, as an expired license gets", null],
414
- ["an empty string", ""],
415
- ["a non-string", 7],
416
- ])(
417
- "never clears the stored token for %s",
418
- (_label: string, value: unknown) => {
419
- /*
420
- * An expired license is legitimately issued no token. Clearing the stored
421
- * one would compound an expiry the customer may be in the middle of
422
- * renewing, and the refreshed expiresAt already tells the truth.
423
- */
424
- expect(
425
- Object.keys(sync({ token: value } as JSONObject).updateData),
426
- ).not.toContain("enterpriseLicenseToken");
427
- },
428
- );
429
-
430
- it("leaves the stored token alone when the server never mentions it", () => {
431
- expect(keys({ userLimit: 1 })).not.toContain("enterpriseLicenseToken");
432
- });
433
- });
434
-
435
- describe("EnterpriseLicenseSyncUtil - instances", () => {
436
- it("stores the instance list", () => {
437
- const instances: Array<JSONObject> = [
438
- {
439
- instanceId: "a",
440
- host: "a.example.com",
441
- isCountedTowardsUsage: false,
442
- },
443
- ];
444
-
445
- expect(
446
- sync({ instances: instances } as JSONObject).updateData
447
- .enterpriseLicenseInstances,
448
- ).toEqual(instances);
449
- });
450
-
451
- it("stores an empty list, so a license that lost its instances shows none", () => {
452
- const result: EnterpriseLicenseSyncResult = sync({ instances: [] });
453
-
454
- expect(Object.keys(result.updateData)).toContain(
455
- "enterpriseLicenseInstances",
456
- );
457
- expect(result.updateData.enterpriseLicenseInstances).toEqual([]);
458
- });
459
-
460
- it.each([
461
- ["null", null],
462
- ["an object", {}],
463
- ["a string", "instance"],
464
- ])(
465
- "keeps the stored list when the server sends %s",
466
- (_label: string, value: unknown) => {
467
- const result: EnterpriseLicenseSyncResult = sync({
468
- instances: value,
469
- } as JSONObject);
470
-
471
- expect(Object.keys(result.updateData)).not.toContain(
472
- "enterpriseLicenseInstances",
473
- );
474
- expect(result.warnings).toHaveLength(1);
475
- },
476
- );
477
-
478
- it("leaves the stored list alone when the server never mentions it", () => {
479
- expect(keys({ userLimit: 1 })).not.toContain("enterpriseLicenseInstances");
480
- });
481
- });
482
-
483
- describe("EnterpriseLicenseSyncUtil - what it must never write", () => {
484
- it("never syncs the license key back onto the installation", () => {
485
- /*
486
- * The installation authenticates with the key it already holds. A response
487
- * must not be able to swap it for a different one.
488
- */
489
- expect(keys(serverResponse())).not.toContain("enterpriseLicenseKey");
490
- });
491
-
492
- it("never invents columns from unknown fields", () => {
493
- expect(
494
- keys({ somethingNew: "from a future oneuptime.com" } as JSONObject),
495
- ).toEqual([]);
496
- });
497
-
498
- it("returns an empty update for an empty response rather than a pile of nulls", () => {
499
- const result: EnterpriseLicenseSyncResult = sync({});
500
-
501
- expect(result.updateData).toEqual({});
502
- expect(result.warnings).toEqual([]);
503
- });
504
-
505
- it("survives a null payload", () => {
506
- const result: EnterpriseLicenseSyncResult =
507
- EnterpriseLicenseSyncUtil.getGlobalConfigUpdateFromLicenseResponse({
508
- payload: null as unknown as JSONObject,
509
- reportedAt: REPORTED_AT,
510
- });
511
-
512
- expect(result.updateData).toEqual({});
513
- });
514
- });
515
-
516
- describe("EnterpriseLicenseSyncUtil - the whole response at once", () => {
517
- it("mirrors every field of a healthy report", () => {
518
- const result: EnterpriseLicenseSyncResult = sync(serverResponse());
519
-
520
- expect(result.warnings).toEqual([]);
521
- expect(result.updateData).toEqual({
522
- enterpriseCompanyName: "Acme Inc",
523
- enterpriseLicenseExpiresAt: new Date("2027-01-01T00:00:00.000Z"),
524
- enterpriseLicenseUserLimit: 150,
525
- enterpriseLicenseCurrentUserCount: 42,
526
- enterpriseLicenseUserCountUpdatedAt: new Date("2026-08-24T09:59:00.000Z"),
527
- enterpriseLicenseIsEvaluation: false,
528
- enterpriseLicenseToken: "signed.jwt.token",
529
- enterpriseLicenseInstances: [
530
- {
531
- instanceId: "instance-1",
532
- host: "oneuptime.acme.internal",
533
- userCount: 42,
534
- isCountedTowardsUsage: true,
535
- lastReportedAt: "2026-08-24T09:59:00.000Z",
536
- version: "12.0.19",
537
- },
538
- ],
539
- });
540
- });
541
-
542
- it("is a no-op against the response an oneuptime.com from before this change would send", () => {
543
- /*
544
- * The old /report-user-count body, verbatim. userLimit already shipped in
545
- * it, so the fix works against every deployed license server; the fields
546
- * added alongside it must simply be left alone.
547
- */
548
- const legacyBody: JSONObject = {
549
- currentUserCount: 42,
550
- userCountUpdatedAt: "2026-08-24T09:59:00.000Z",
551
- userLimit: 150,
552
- isEvaluationLicense: false,
553
- instances: [],
554
- };
555
-
556
- const result: EnterpriseLicenseSyncResult = sync(legacyBody);
557
-
558
- expect(result.warnings).toEqual([]);
559
- expect(Object.keys(result.updateData).sort()).toEqual([
560
- "enterpriseLicenseCurrentUserCount",
561
- "enterpriseLicenseInstances",
562
- "enterpriseLicenseIsEvaluation",
563
- "enterpriseLicenseUserCountUpdatedAt",
564
- "enterpriseLicenseUserLimit",
565
- ]);
566
- expect(result.updateData.enterpriseLicenseUserLimit).toBe(150);
567
- });
568
- });