@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
@@ -15,7 +15,7 @@ import {
15
15
  screen,
16
16
  within,
17
17
  } from "@testing-library/react";
18
- import React, { ReactElement } from "react";
18
+ import React from "react";
19
19
  import { MemoryRouter } from "react-router-dom";
20
20
  import getJestMockFunction, { MockFunction } from "../../MockType";
21
21
 
@@ -29,32 +29,8 @@ import getJestMockFunction, { MockFunction } from "../../MockType";
29
29
  * one line, and an outline button pinned to the left edge.
30
30
  */
31
31
 
32
- type CapturedTableProps = {
33
- id?: string;
34
- noItemsMessage?: ReactElement;
35
- showRefreshButton?: boolean;
36
- query?: Record<string, unknown>;
37
- };
38
-
39
- let capturedTableProps: CapturedTableProps | null = null;
40
32
  const navigateMock: MockFunction = getJestMockFunction();
41
33
 
42
- jest.mock("../../../UI/Components/ModelTable/AnalyticsModelTable", () => {
43
- return {
44
- __esModule: true,
45
- default: (props: CapturedTableProps): ReactElement => {
46
- capturedTableProps = props;
47
- const react: typeof React = jest.requireActual("react") as typeof React;
48
-
49
- return react.createElement(
50
- "div",
51
- { "data-testid": "security-events-analytics-table" },
52
- props.noItemsMessage || null,
53
- );
54
- },
55
- };
56
- });
57
-
58
34
  jest.mock("../../../UI/Utils/Navigation", () => {
59
35
  return {
60
36
  __esModule: true,
@@ -78,7 +54,6 @@ jest.mock("../../../UI/Utils/Navigation", () => {
78
54
  import SecurityEventsEmptyState, {
79
55
  SECURITY_EVENTS_EMPTY_STATE_ID,
80
56
  } from "../../../../App/FeatureSet/Dashboard/src/Components/SecurityEvents/SecurityEventsEmptyState";
81
- import SecurityEventsTable from "../../../../App/FeatureSet/Dashboard/src/Components/SecurityEvents/SecurityEventsTable";
82
57
  import PageMap from "../../../../App/FeatureSet/Dashboard/src/Utils/PageMap";
83
58
  import RouteMap, {
84
59
  RouteUtil,
@@ -114,7 +89,6 @@ function navigatedTo(): Array<string> {
114
89
  }
115
90
 
116
91
  beforeEach((): void => {
117
- capturedTableProps = null;
118
92
  navigateMock.mockReset();
119
93
  jest.spyOn(ProjectUtil, "getCurrentProjectId").mockReturnValue(PROJECT_ID);
120
94
  });
@@ -249,59 +223,3 @@ describe("SecurityEventsEmptyState", () => {
249
223
  expect(navigateMock).not.toHaveBeenCalled();
250
224
  });
251
225
  });
252
-
253
- describe("SecurityEventsTable empty state wiring", () => {
254
- test("hands the table the Security Events empty state by default", () => {
255
- render(
256
- <MemoryRouter>
257
- <SecurityEventsTable query={{ projectId: PROJECT_ID }} />
258
- </MemoryRouter>,
259
- );
260
-
261
- expect(capturedTableProps).not.toBeNull();
262
- expect(capturedTableProps?.id).toBe("security-events-table");
263
- expect(capturedTableProps?.query).toEqual({ projectId: PROJECT_ID });
264
- /*
265
- * The page's Refresh re-reads a relative window from now and recounts
266
- * the volume chart; the table's own could only re-list its old window.
267
- */
268
- expect(capturedTableProps?.showRefreshButton).toBe(false);
269
- expect(capturedTableProps?.noItemsMessage?.type).toBe(
270
- SecurityEventsEmptyState,
271
- );
272
-
273
- const table: HTMLElement = screen.getByTestId(
274
- "security-events-analytics-table",
275
- );
276
- expect(
277
- within(table).getByRole("heading", { name: "No security events yet" }),
278
- ).toBeInTheDocument();
279
- expect(
280
- within(table).getByRole("button", { name: "Read the setup guide" }),
281
- ).toBeInTheDocument();
282
- expect(
283
- within(table).getByRole("button", {
284
- name: "Connect a security product",
285
- }),
286
- ).toBeInTheDocument();
287
- });
288
-
289
- test("a page that knows events exist can swap in its own message", () => {
290
- render(
291
- <MemoryRouter>
292
- <SecurityEventsTable
293
- query={{ projectId: PROJECT_ID }}
294
- noItemsMessage={<p>Nothing in this window</p>}
295
- />
296
- </MemoryRouter>,
297
- );
298
-
299
- const table: HTMLElement = screen.getByTestId(
300
- "security-events-analytics-table",
301
- );
302
- expect(within(table).getByText("Nothing in this window")).toBeVisible();
303
- expect(
304
- within(table).queryByRole("heading", { name: "No security events yet" }),
305
- ).toBeNull();
306
- });
307
- });
@@ -0,0 +1,248 @@
1
+ import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
2
+ import "@testing-library/jest-dom";
3
+ import { act, cleanup, render } from "@testing-library/react";
4
+ import * as React from "react";
5
+ import { MemoryRouter } from "react-router-dom";
6
+ import SecurityEventsNavTabs from "../../../../App/FeatureSet/Dashboard/src/Components/SecurityEvents/SecurityEventsNavTabs";
7
+ import { getSecurityEventsBreadcrumbs } from "../../../../App/FeatureSet/Dashboard/src/Utils/Breadcrumbs/SecurityEventsBreadcrumbs";
8
+ import PageMap from "../../../../App/FeatureSet/Dashboard/src/Utils/PageMap";
9
+ import { RouteUtil } from "../../../../App/FeatureSet/Dashboard/src/Utils/RouteMap";
10
+ import {
11
+ SecurityEventsTabKey,
12
+ getActiveSecurityEventsTab,
13
+ } from "../../../../App/FeatureSet/Dashboard/src/Utils/SecurityEventsNavigation";
14
+ import { writeTelemetryViewerUrlState } from "../../../../App/FeatureSet/Dashboard/src/Utils/TelemetryViewerUrlState";
15
+ import Link from "../../../Types/Link";
16
+ import { goTo, PROJECT_ID, routeFor } from "./SideMenuHarness";
17
+
18
+ /*
19
+ * The Security Events destinations, as header tabs.
20
+ *
21
+ * They used to be a left side menu, which put this product out of step with
22
+ * every other telemetry signal — Logs, Traces, Metrics and Exceptions all
23
+ * carry theirs in the page header through the same shared TelemetryNavTabs.
24
+ * What is pinned here is what the move must not lose: every destination still
25
+ * reachable exactly once, the tab you are on highlighted, the labels still
26
+ * matching their breadcrumb leaves, and the Events tab carrying the slice the
27
+ * reader is looking at so switching away and back does not silently reset it.
28
+ */
29
+
30
+ interface ExpectedTab {
31
+ label: string;
32
+ pageMapKey: string;
33
+ tab: SecurityEventsTabKey;
34
+ }
35
+
36
+ const EXPECTED_TABS: Array<ExpectedTab> = [
37
+ { label: "Events", pageMapKey: PageMap.SECURITY_EVENTS, tab: "events" },
38
+ {
39
+ label: "Correlate",
40
+ pageMapKey: PageMap.SECURITY_EVENTS_CORRELATE,
41
+ tab: "correlate",
42
+ },
43
+ {
44
+ label: "Detection Rules",
45
+ pageMapKey: PageMap.SECURITY_EVENTS_DETECTION_RULES,
46
+ tab: "detection-rules",
47
+ },
48
+ {
49
+ label: "Threat Intel",
50
+ pageMapKey: PageMap.SECURITY_EVENTS_THREAT_INTEL,
51
+ tab: "threat-intel",
52
+ },
53
+ {
54
+ label: "Monitors",
55
+ pageMapKey: PageMap.SECURITY_EVENTS_MONITORS,
56
+ tab: "monitors",
57
+ },
58
+ {
59
+ label: "Connections",
60
+ pageMapKey: PageMap.SECURITY_EVENTS_CONNECTIONS,
61
+ tab: "connections",
62
+ },
63
+ {
64
+ label: "Setup Guide",
65
+ pageMapKey: PageMap.SECURITY_EVENTS_DOCUMENTATION,
66
+ tab: "setup",
67
+ },
68
+ ];
69
+
70
+ function renderTabs(active: SecurityEventsTabKey): void {
71
+ render(
72
+ <MemoryRouter>
73
+ <SecurityEventsNavTabs active={active} />
74
+ </MemoryRouter>,
75
+ );
76
+ }
77
+
78
+ function anchors(): Array<HTMLAnchorElement> {
79
+ return Array.from(document.querySelectorAll("a"));
80
+ }
81
+
82
+ function labels(): Array<string> {
83
+ return anchors().map((anchor: HTMLAnchorElement): string => {
84
+ return anchor.textContent?.trim() ?? "";
85
+ });
86
+ }
87
+
88
+ function hrefs(): Array<string> {
89
+ return anchors().map((anchor: HTMLAnchorElement): string => {
90
+ return anchor.getAttribute("href") ?? "";
91
+ });
92
+ }
93
+
94
+ function anchorFor(label: string): HTMLAnchorElement {
95
+ const anchor: HTMLAnchorElement | undefined = anchors().find(
96
+ (candidate: HTMLAnchorElement): boolean => {
97
+ return candidate.textContent?.trim() === label;
98
+ },
99
+ );
100
+
101
+ if (!anchor) {
102
+ throw new Error(
103
+ `No tab labelled "${label}". Tabs rendered: ${labels().join(", ")}`,
104
+ );
105
+ }
106
+
107
+ return anchor;
108
+ }
109
+
110
+ beforeEach(() => {
111
+ goTo(`/dashboard/${PROJECT_ID}/security-events`);
112
+ });
113
+
114
+ afterEach(() => {
115
+ cleanup();
116
+ });
117
+
118
+ describe("Security Events header tabs", () => {
119
+ test("every destination is a tab, in the intended order", () => {
120
+ renderTabs("events");
121
+
122
+ expect(labels()).toEqual(
123
+ EXPECTED_TABS.map((tab: ExpectedTab): string => {
124
+ return tab.label;
125
+ }),
126
+ );
127
+ });
128
+
129
+ test("keeps all seven routes reachable exactly once, with icons", () => {
130
+ renderTabs("events");
131
+
132
+ const expectedHrefs: Array<string> = EXPECTED_TABS.map(
133
+ (tab: ExpectedTab): string => {
134
+ return routeFor(tab.pageMapKey);
135
+ },
136
+ );
137
+
138
+ expect(anchors()).toHaveLength(7);
139
+ expect(hrefs()).toEqual(expectedHrefs);
140
+ expect(new Set(hrefs()).size).toBe(hrefs().length);
141
+ expect(new Set(labels()).size).toBe(labels().length);
142
+
143
+ for (const anchor of anchors()) {
144
+ expect(anchor.querySelector("svg")).not.toBeNull();
145
+ }
146
+ });
147
+
148
+ /*
149
+ * A ":projectId" left in an href is the classic failure of these menus: the
150
+ * link renders, reads correctly, and navigates to a page that cannot load.
151
+ */
152
+ test("every href is resolved against the current project", () => {
153
+ renderTabs("events");
154
+
155
+ for (const href of hrefs()) {
156
+ expect(href.startsWith(`/dashboard/${PROJECT_ID}/`)).toBe(true);
157
+ expect(href).not.toContain(":projectId");
158
+ }
159
+ });
160
+
161
+ test.each(EXPECTED_TABS)(
162
+ "$label is the highlighted tab when it is the active one",
163
+ (tab: ExpectedTab): void => {
164
+ renderTabs(tab.tab);
165
+
166
+ const anchor: HTMLAnchorElement = anchorFor(tab.label);
167
+
168
+ expect(anchor).toHaveClass("bg-indigo-50");
169
+ expect(anchor).toHaveClass("text-indigo-700");
170
+ expect(
171
+ Array.from(document.querySelectorAll("a.bg-indigo-50")),
172
+ ).toHaveLength(1);
173
+ },
174
+ );
175
+
176
+ test.each(EXPECTED_TABS)(
177
+ "the route of $label resolves back to its own tab",
178
+ (tab: ExpectedTab): void => {
179
+ expect(getActiveSecurityEventsTab(routeFor(tab.pageMapKey))).toBe(
180
+ tab.tab,
181
+ );
182
+ },
183
+ );
184
+
185
+ test("every tab label matches its breadcrumb leaf", () => {
186
+ for (const tab of EXPECTED_TABS) {
187
+ const trail: Array<Link> | undefined = getSecurityEventsBreadcrumbs(
188
+ RouteUtil.getRouteString(tab.pageMapKey as never),
189
+ );
190
+
191
+ expect(trail).toBeDefined();
192
+ expect(trail?.[trail.length - 1]?.title).toBe(
193
+ tab.pageMapKey === PageMap.SECURITY_EVENTS
194
+ ? "Security Events"
195
+ : tab.label,
196
+ );
197
+ }
198
+ });
199
+ });
200
+
201
+ describe("the Events tab carries the slice the reader is looking at", () => {
202
+ /*
203
+ * Only the Events tab is backed by an explorer, so it is the only tab whose
204
+ * link can describe a slice. Handing a `filters` payload to Detection Rules
205
+ * or Connections would put params on a URL nothing there reads — and
206
+ * re-emit them on the way back as if the user had set them there.
207
+ */
208
+ test("carries the window and chips onto the Events link, and onto no other", () => {
209
+ goTo(`/dashboard/${PROJECT_ID}/security-events/correlate`);
210
+
211
+ act(() => {
212
+ writeTelemetryViewerUrlState({
213
+ range: "PAST_ONE_WEEK",
214
+ filters: JSON.stringify([["severityName", "Critical"]]),
215
+ search: "failed logon",
216
+ });
217
+ });
218
+
219
+ renderTabs("correlate");
220
+
221
+ const eventsHref: string = anchorFor("Events").getAttribute("href") ?? "";
222
+ const params: URLSearchParams = new URLSearchParams(
223
+ eventsHref.slice(eventsHref.indexOf("?")),
224
+ );
225
+
226
+ expect(params.get("range")).toBe("PAST_ONE_WEEK");
227
+ expect(JSON.parse(params.get("filters") as string)).toEqual([
228
+ ["severityName", "Critical"],
229
+ ]);
230
+ expect(params.get("search")).toBe("failed logon");
231
+
232
+ for (const label of ["Correlate", "Detection Rules", "Connections"]) {
233
+ expect(anchorFor(label).getAttribute("href")).not.toContain("?");
234
+ }
235
+ });
236
+
237
+ test("an unscoped page leaves every href bare", () => {
238
+ act(() => {
239
+ writeTelemetryViewerUrlState({});
240
+ });
241
+
242
+ renderTabs("events");
243
+
244
+ for (const href of hrefs()) {
245
+ expect(href).not.toContain("?");
246
+ }
247
+ });
248
+ });