@oneuptime/common 13.0.8 → 14.0.0

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 (333) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Monitor.ts +3 -2
  4. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  5. package/Scripts/generate-service-worker.js +65 -4
  6. package/Server/API/BaseAPI.ts +26 -5
  7. package/Server/API/GlobalConfigAPI.ts +228 -462
  8. package/Server/API/ProjectOIDC.ts +25 -16
  9. package/Server/API/ProjectSSO.ts +24 -16
  10. package/Server/API/StatusPageAPI.ts +100 -42
  11. package/Server/API/TeamMemberAPI.ts +10 -1
  12. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  13. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  14. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  15. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  16. package/Server/EnvironmentConfig.ts +147 -2
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  19. package/Server/Middleware/UserAuthorization.ts +38 -16
  20. package/Server/Services/AuditLogService.ts +84 -1079
  21. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  22. package/Server/Services/GlobalConfigService.ts +80 -1
  23. package/Server/Services/MonitorProbeService.ts +116 -20
  24. package/Server/Services/MonitorService.ts +56 -4
  25. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  26. package/Server/Services/MonitorTemplateService.ts +26 -0
  27. package/Server/Services/ProjectService.ts +284 -0
  28. package/Server/Services/RumSessionPinService.ts +25 -6
  29. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  30. package/Server/Services/StatusPageService.ts +78 -1
  31. package/Server/Services/TeamMemberService.ts +11 -0
  32. package/Server/Services/TeamService.ts +10 -0
  33. package/Server/Services/UserService.ts +10 -17
  34. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  35. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  36. package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
  37. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  38. package/Server/Types/Markdown.ts +41 -0
  39. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  40. package/Server/Utils/EditionEnforcement.ts +233 -0
  41. package/Server/Utils/FrontendEnvironment.ts +41 -2
  42. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  43. package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
  44. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  45. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
  46. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  47. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  48. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  49. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  50. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  51. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  52. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  53. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  54. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  55. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  56. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  57. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  58. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  59. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  60. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
  61. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  62. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  63. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
  64. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  65. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  66. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  67. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  68. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  69. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  70. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  71. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  72. package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
  73. package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
  74. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  75. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  76. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  77. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  78. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  79. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  80. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  81. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  82. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  83. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  84. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  85. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  86. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  87. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  88. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  89. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  90. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  91. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  92. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  93. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  94. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  95. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  96. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  97. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  98. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  99. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  100. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  101. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  102. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  103. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  104. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  105. package/Tests/Server/Types/Markdown.test.ts +181 -0
  106. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  107. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  108. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  109. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  110. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  111. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  112. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
  113. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  114. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  115. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  116. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  117. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  118. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  119. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  120. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
  121. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  122. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  123. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  124. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  125. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  126. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  127. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  128. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  129. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  130. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  131. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  132. package/Types/API/Hostname.ts +63 -16
  133. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  134. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  135. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  136. package/Types/Database/CanonicalModelInstance.ts +102 -0
  137. package/Types/Database/TableColumn.ts +20 -6
  138. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  139. package/Types/IP/IPv6.ts +6 -1
  140. package/Types/Monitor/MonitorStep.ts +6 -1
  141. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  142. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  143. package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
  144. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  145. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  146. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  147. package/UI/Components/ModelList/ModelList.tsx +11 -1
  148. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  149. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  150. package/UI/esbuild-enterprise.js +263 -0
  151. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  152. package/Utils/HostAddressUtil.ts +94 -0
  153. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  154. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  155. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  156. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  157. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  158. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  159. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  160. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  161. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  162. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  163. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  164. package/build/dist/Server/API/BaseAPI.js +26 -5
  165. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  166. package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
  167. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  168. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  169. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  170. package/build/dist/Server/API/ProjectSSO.js +24 -16
  171. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  172. package/build/dist/Server/API/StatusPageAPI.js +93 -43
  173. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  174. package/build/dist/Server/API/TeamMemberAPI.js +8 -1
  175. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  176. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  177. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  178. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  179. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  180. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  181. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  182. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  183. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  184. package/build/dist/Server/EnvironmentConfig.js +84 -2
  185. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  186. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  187. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  188. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  189. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  190. package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
  191. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  192. package/build/dist/Server/Services/AuditLogService.js +71 -740
  193. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  194. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  195. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  196. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  197. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  198. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  199. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  200. package/build/dist/Server/Services/MonitorService.js +45 -4
  201. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  202. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  203. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  204. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  205. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  206. package/build/dist/Server/Services/ProjectService.js +214 -0
  207. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  208. package/build/dist/Server/Services/RumSessionPinService.js +24 -6
  209. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  210. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  211. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  212. package/build/dist/Server/Services/StatusPageService.js +71 -0
  213. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  214. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  215. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  216. package/build/dist/Server/Services/TeamService.js +9 -0
  217. package/build/dist/Server/Services/TeamService.js.map +1 -1
  218. package/build/dist/Server/Services/UserService.js +10 -16
  219. package/build/dist/Server/Services/UserService.js.map +1 -1
  220. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  221. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  222. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  223. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  224. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
  225. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  226. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  227. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  228. package/build/dist/Server/Types/Markdown.js +31 -0
  229. package/build/dist/Server/Types/Markdown.js.map +1 -1
  230. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  231. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  232. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  233. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  234. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  235. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  236. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  237. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  238. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +96 -0
  239. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  240. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  241. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  242. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +449 -261
  243. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  244. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  245. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  246. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  247. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  248. package/build/dist/Types/API/Hostname.js +59 -11
  249. package/build/dist/Types/API/Hostname.js.map +1 -1
  250. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  251. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  252. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  253. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  254. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  255. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  256. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  257. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  258. package/build/dist/Types/Database/TableColumn.js +19 -6
  259. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  260. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  261. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  262. package/build/dist/Types/IP/IPv6.js +6 -1
  263. package/build/dist/Types/IP/IPv6.js.map +1 -1
  264. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  265. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  266. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  267. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  268. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  269. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
  270. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  271. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  272. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  273. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  274. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  275. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  276. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  277. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  278. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  279. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  280. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  281. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  282. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  283. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  284. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  285. package/build/dist/Utils/HostAddressUtil.js +80 -0
  286. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  287. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  288. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  289. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  290. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  291. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  292. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  293. package/jest.config.json +3 -1
  294. package/package.json +1 -1
  295. package/test-setup.sh +103 -34
  296. package/tsconfig.json +13 -0
  297. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  298. package/Server/API/TeamComplianceAPI.ts +0 -158
  299. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  300. package/Server/Services/TeamComplianceService.ts +0 -733
  301. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  302. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  303. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  304. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  305. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
  306. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  307. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  308. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
  309. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  310. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  311. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  312. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  313. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  314. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  315. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  316. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  317. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  318. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  319. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  320. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  321. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  322. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  323. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  324. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  325. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  326. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  327. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  328. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  329. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  330. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  331. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  332. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  333. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -0,0 +1,289 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ afterEach,
4
+ beforeEach,
5
+ describe,
6
+ expect,
7
+ it,
8
+ jest,
9
+ } from "@jest/globals";
10
+ import { cleanup, fireEvent, render, screen } from "@testing-library/react";
11
+ import * as React from "react";
12
+ import ObjectID from "../../../Types/ObjectID";
13
+ import Permission, { UserPermission } from "../../../Types/Permission";
14
+ import API from "../../../UI/Utils/API/API";
15
+ import { ListResult } from "../../../UI/Utils/ModelAPI/ModelAPI";
16
+ import getJestMockFunction, { MockFunction } from "../../MockType";
17
+
18
+ /*
19
+ * ModelList's empty state, and the opt-in hideEmptyState.
20
+ *
21
+ * An empty list shows noItemsMessage, and an EMPTY noItemsMessage falls back
22
+ * to "No items found." - so a caller that explains an empty list itself (the
23
+ * status page SSO sign-in says "single sign-on is not available") cannot
24
+ * silence the list by passing "". hideEmptyState does that: an empty list
25
+ * renders no message at all. It hides only the empty state: a search that
26
+ * matches nothing and a failed load still say so.
27
+ */
28
+
29
+ const getListMock: MockFunction = getJestMockFunction();
30
+
31
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
32
+ return {
33
+ __esModule: true,
34
+ default: {
35
+ getList: (...args: Array<any>) => {
36
+ return getListMock(...args);
37
+ },
38
+ },
39
+ };
40
+ });
41
+
42
+ const OWNER_PERMISSIONS: Array<Permission> = [
43
+ Permission.Public,
44
+ Permission.User,
45
+ Permission.CurrentUser,
46
+ Permission.ProjectOwner,
47
+ ];
48
+
49
+ jest.mock("../../../UI/Utils/Permission", () => {
50
+ return {
51
+ __esModule: true,
52
+ default: {
53
+ getAllPermissions: () => {
54
+ return OWNER_PERMISSIONS;
55
+ },
56
+ getProjectPermissions: () => {
57
+ return {
58
+ permissions: OWNER_PERMISSIONS.map((permission: Permission) => {
59
+ return {
60
+ permission,
61
+ labelIds: [],
62
+ _type: "UserPermission",
63
+ } as UserPermission;
64
+ }),
65
+ };
66
+ },
67
+ getGlobalPermissions: () => {
68
+ return { globalPermissions: OWNER_PERMISSIONS };
69
+ },
70
+ },
71
+ };
72
+ });
73
+
74
+ jest.mock("../../../UI/Utils/User", () => {
75
+ return {
76
+ __esModule: true,
77
+ default: {
78
+ isMasterAdmin: () => {
79
+ return false;
80
+ },
81
+ },
82
+ };
83
+ });
84
+
85
+ import ModelList from "../../../UI/Components/ModelList/ModelList";
86
+ import Probe from "../../../Models/DatabaseModels/Probe";
87
+
88
+ const WAIT_TIMEOUT: number = 20000;
89
+
90
+ const FALLBACK_MESSAGE: string = "No items found.";
91
+ const NO_MATCH_MESSAGE: string = "No items match your search";
92
+ const NO_PROBES: string = "No probes yet.";
93
+
94
+ const listOf: (names: Array<string>) => ListResult<Probe> = (
95
+ names: Array<string>,
96
+ ): ListResult<Probe> => {
97
+ const probes: Array<Probe> = names.map((name: string, index: number) => {
98
+ const probe: Probe = new Probe();
99
+ probe.id = new ObjectID(`11111111-1111-4111-8111-11111111111${index}`);
100
+ probe.name = name;
101
+ return probe;
102
+ });
103
+
104
+ return { data: probes, count: probes.length, skip: 0, limit: 10 };
105
+ };
106
+
107
+ interface ListProps {
108
+ noItemsMessage: string;
109
+ hideEmptyState?: boolean | undefined;
110
+ isSearchEnabled?: boolean | undefined;
111
+ onListLoaded?: ((list: Array<Probe>) => void) | undefined;
112
+ }
113
+
114
+ const ProbeList: React.FunctionComponent<ListProps> = (
115
+ props: ListProps,
116
+ ): React.ReactElement => {
117
+ return (
118
+ <ModelList<Probe>
119
+ id="probe-list"
120
+ modelType={Probe}
121
+ titleField="name"
122
+ select={{ name: true }}
123
+ noItemsMessage={props.noItemsMessage}
124
+ hideEmptyState={props.hideEmptyState}
125
+ isSearchEnabled={props.isSearchEnabled}
126
+ onListLoaded={props.onListLoaded}
127
+ />
128
+ );
129
+ };
130
+
131
+ /*
132
+ * Resolves once the list has finished loading, whatever it loaded. The rows
133
+ * and the search box appear a render later (ModelList copies the loaded list
134
+ * into its searched list in an effect), so tests wait for those with findBy.
135
+ */
136
+ const waitForLoad: (onListLoaded: MockFunction) => Promise<void> = async (
137
+ onListLoaded: MockFunction,
138
+ ): Promise<void> => {
139
+ await screen.findByTestId("loaded", {}, { timeout: WAIT_TIMEOUT });
140
+ expect(onListLoaded).toHaveBeenCalledTimes(1);
141
+ };
142
+
143
+ const renderList: (props: Omit<ListProps, "onListLoaded">) => MockFunction = (
144
+ props: Omit<ListProps, "onListLoaded">,
145
+ ): MockFunction => {
146
+ const onListLoaded: MockFunction = getJestMockFunction();
147
+ const Harness: React.FunctionComponent = (): React.ReactElement => {
148
+ const [loaded, setLoaded] = React.useState<boolean>(false);
149
+
150
+ return (
151
+ <div>
152
+ <ProbeList
153
+ {...props}
154
+ onListLoaded={(list: Array<Probe>) => {
155
+ onListLoaded(list);
156
+ setLoaded(true);
157
+ }}
158
+ />
159
+ {loaded ? <span data-testid="loaded" /> : <></>}
160
+ </div>
161
+ );
162
+ };
163
+
164
+ render(<Harness />);
165
+ return onListLoaded;
166
+ };
167
+
168
+ describe("ModelList empty state", () => {
169
+ beforeEach(() => {
170
+ getListMock.mockReset();
171
+ getListMock.mockImplementation(() => {
172
+ return Promise.resolve(listOf([]));
173
+ });
174
+ });
175
+
176
+ afterEach(() => {
177
+ cleanup();
178
+ jest.restoreAllMocks();
179
+ });
180
+
181
+ it("an empty list shows noItemsMessage by default", async () => {
182
+ await waitForLoad(renderList({ noItemsMessage: NO_PROBES }));
183
+
184
+ expect(screen.getByText(NO_PROBES)).toBeInTheDocument();
185
+ });
186
+
187
+ it("an empty noItemsMessage falls back to 'No items found.' (why hideEmptyState exists)", async () => {
188
+ await waitForLoad(renderList({ noItemsMessage: "" }));
189
+
190
+ expect(screen.getByText(FALLBACK_MESSAGE)).toBeInTheDocument();
191
+ });
192
+
193
+ it("hideEmptyState: an empty list shows no message at all", async () => {
194
+ const onListLoaded: MockFunction = renderList({
195
+ noItemsMessage: NO_PROBES,
196
+ hideEmptyState: true,
197
+ });
198
+ await waitForLoad(onListLoaded);
199
+
200
+ expect(screen.queryByText(NO_PROBES)).not.toBeInTheDocument();
201
+ expect(screen.queryByText(FALLBACK_MESSAGE)).not.toBeInTheDocument();
202
+ // The caller still learns the list is empty, to explain it itself.
203
+ expect(onListLoaded.mock.calls[0]?.[0]).toEqual([]);
204
+ });
205
+
206
+ it("hideEmptyState with an empty noItemsMessage shows no fallback either", async () => {
207
+ await waitForLoad(renderList({ noItemsMessage: "", hideEmptyState: true }));
208
+
209
+ expect(screen.queryByText(FALLBACK_MESSAGE)).not.toBeInTheDocument();
210
+ });
211
+
212
+ it("hideEmptyState=false behaves like the default", async () => {
213
+ await waitForLoad(
214
+ renderList({ noItemsMessage: NO_PROBES, hideEmptyState: false }),
215
+ );
216
+
217
+ expect(screen.getByText(NO_PROBES)).toBeInTheDocument();
218
+ });
219
+
220
+ it("hideEmptyState still lists the items of a non-empty list", async () => {
221
+ getListMock.mockImplementation(() => {
222
+ return Promise.resolve(listOf(["WBHQ", "Frankfurt"]));
223
+ });
224
+
225
+ await waitForLoad(
226
+ renderList({ noItemsMessage: NO_PROBES, hideEmptyState: true }),
227
+ );
228
+
229
+ expect(
230
+ await screen.findByText("WBHQ", {}, { timeout: WAIT_TIMEOUT }),
231
+ ).toBeInTheDocument();
232
+ expect(screen.getByText("Frankfurt")).toBeInTheDocument();
233
+ expect(screen.queryByText(NO_PROBES)).not.toBeInTheDocument();
234
+ });
235
+
236
+ it("hideEmptyState does not hide a search that matches nothing", async () => {
237
+ getListMock.mockImplementation(() => {
238
+ return Promise.resolve(listOf(["wbhq"]));
239
+ });
240
+
241
+ await waitForLoad(
242
+ renderList({
243
+ noItemsMessage: NO_PROBES,
244
+ hideEmptyState: true,
245
+ isSearchEnabled: true,
246
+ }),
247
+ );
248
+
249
+ expect(
250
+ await screen.findByText("wbhq", {}, { timeout: WAIT_TIMEOUT }),
251
+ ).toBeInTheDocument();
252
+
253
+ fireEvent.change(
254
+ await screen.findByPlaceholderText(
255
+ "Search...",
256
+ {},
257
+ { timeout: WAIT_TIMEOUT },
258
+ ),
259
+ {
260
+ target: { value: "frankfurt" },
261
+ },
262
+ );
263
+
264
+ expect(
265
+ await screen.findByText(NO_MATCH_MESSAGE, {}, { timeout: WAIT_TIMEOUT }),
266
+ ).toBeInTheDocument();
267
+ expect(screen.queryByText("wbhq")).not.toBeInTheDocument();
268
+ });
269
+
270
+ it("hideEmptyState does not hide a failed load", async () => {
271
+ getListMock.mockImplementation(() => {
272
+ return Promise.reject(new Error("boom"));
273
+ });
274
+ jest
275
+ .spyOn(API, "getFriendlyMessage")
276
+ .mockReturnValue("Could not load the probes.");
277
+
278
+ renderList({ noItemsMessage: NO_PROBES, hideEmptyState: true });
279
+
280
+ expect(
281
+ await screen.findByText(
282
+ "Could not load the probes.",
283
+ {},
284
+ { timeout: WAIT_TIMEOUT },
285
+ ),
286
+ ).toBeInTheDocument();
287
+ expect(screen.queryByText(NO_PROBES)).not.toBeInTheDocument();
288
+ });
289
+ });
@@ -0,0 +1,131 @@
1
+ import { afterEach, describe, expect, test } from "@jest/globals";
2
+ import "@testing-library/jest-dom";
3
+ import { cleanup, render, screen } from "@testing-library/react";
4
+ import * as React from "react";
5
+ import TelemetryViewer from "../../../../UI/Components/TelemetryViewer/TelemetryViewer";
6
+ import TimeRange from "../../../../Types/Time/TimeRange";
7
+
8
+ /*
9
+ * The shared telemetry shell's empty area.
10
+ *
11
+ * For most signals the default is right: an empty list means the filters are
12
+ * too narrow, so it says so and invites the reader to widen them. For a
13
+ * signal a project may not be SENDING at all — security events — that reading
14
+ * is wrong, and the reader needs the setup guide instead. `emptyContent` is
15
+ * the escape hatch for exactly that.
16
+ *
17
+ * This is a shared component with four consumers, so what matters as much as
18
+ * the new branch is that the old one is untouched.
19
+ */
20
+
21
+ interface Item {
22
+ id: string;
23
+ }
24
+
25
+ function renderViewer(
26
+ props: Partial<React.ComponentProps<typeof TelemetryViewer<Item>>> = {},
27
+ ): void {
28
+ render(
29
+ <TelemetryViewer<Item>
30
+ items={[]}
31
+ isLoading={false}
32
+ renderRow={(item: Item): React.ReactElement => {
33
+ return <span>{item.id}</span>;
34
+ }}
35
+ getRowKey={(item: Item): string => {
36
+ return item.id;
37
+ }}
38
+ searchValue=""
39
+ onSearchChange={(): void => {}}
40
+ onSearchSubmit={(): void => {}}
41
+ timeRange={{ range: TimeRange.PAST_ONE_HOUR }}
42
+ onTimeRangeChange={(): void => {}}
43
+ page={1}
44
+ pageSize={50}
45
+ totalCount={0}
46
+ onPageChange={(): void => {}}
47
+ onPageSizeChange={(): void => {}}
48
+ /*
49
+ * Named so the pagination footer reads "No events": its default label
50
+ * is "results", which would collide with the empty block's own
51
+ * "No results" and make these assertions ambiguous.
52
+ */
53
+ itemLabel="events"
54
+ {...props}
55
+ />,
56
+ );
57
+ }
58
+
59
+ afterEach(() => {
60
+ cleanup();
61
+ });
62
+
63
+ describe("the default empty area", () => {
64
+ test("reads as 'nothing matched these filters'", () => {
65
+ renderViewer();
66
+
67
+ expect(screen.getByText("No results")).toBeInTheDocument();
68
+ expect(
69
+ screen.getByText("Try adjusting filters or time range."),
70
+ ).toBeInTheDocument();
71
+ });
72
+
73
+ test("a caller can still name what is missing", () => {
74
+ renderViewer({ emptyMessage: "No traces found" });
75
+
76
+ expect(screen.getByText("No traces found")).toBeInTheDocument();
77
+ expect(
78
+ screen.getByText("Try adjusting filters or time range."),
79
+ ).toBeInTheDocument();
80
+ });
81
+ });
82
+
83
+ describe("emptyContent", () => {
84
+ test("replaces the whole default block, hint included", () => {
85
+ renderViewer({
86
+ emptyMessage: "No results",
87
+ emptyContent: <p>Nothing is sending yet — read the setup guide.</p>,
88
+ });
89
+
90
+ expect(
91
+ screen.getByText("Nothing is sending yet — read the setup guide."),
92
+ ).toBeInTheDocument();
93
+ expect(screen.queryByText("No results")).toBeNull();
94
+ expect(
95
+ screen.queryByText("Try adjusting filters or time range."),
96
+ ).toBeNull();
97
+ });
98
+
99
+ test("is not rendered while the first page is still loading", () => {
100
+ renderViewer({
101
+ isLoading: true,
102
+ emptyContent: <p>Nothing is sending yet.</p>,
103
+ });
104
+
105
+ expect(screen.queryByText("Nothing is sending yet.")).toBeNull();
106
+ });
107
+
108
+ test("is not rendered once there are rows", () => {
109
+ renderViewer({
110
+ items: [{ id: "row-1" }],
111
+ emptyContent: <p>Nothing is sending yet.</p>,
112
+ });
113
+
114
+ expect(screen.getByText("row-1")).toBeInTheDocument();
115
+ expect(screen.queryByText("Nothing is sending yet.")).toBeNull();
116
+ });
117
+
118
+ /*
119
+ * An error is the shell's own branch and wins over both: a reader whose
120
+ * query failed must not be told the project has no data.
121
+ */
122
+ test("an error replaces the list area outright", () => {
123
+ renderViewer({
124
+ error: "clickhouse is down",
125
+ emptyContent: <p>Nothing is sending yet.</p>,
126
+ });
127
+
128
+ expect(screen.getByText(/clickhouse is down/)).toBeInTheDocument();
129
+ expect(screen.queryByText("Nothing is sending yet.")).toBeNull();
130
+ });
131
+ });