@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,582 @@
1
+ import { SeatUsage } from "../../../Server/Enterprise/EnterpriseLicenseSnapshot";
2
+ import * as CoreRedisHealth from "../../../Server/Utils/InstanceHealth/RedisHealth";
3
+ import { describe, expect, test } from "@jest/globals";
4
+ import fs from "fs";
5
+ import path from "path";
6
+ import ts from "typescript";
7
+
8
+ /*
9
+ * Enterprise-only implementation that used to sit in core and now lives in
10
+ * ee/, next to its only callers:
11
+ *
12
+ * PostgresHealth (the PostgreSQL probes) -> ee/Server/Workers/InstanceHealth/
13
+ * RedisHealth's counter-delta half -> ee/Server/Workers/InstanceHealth/
14
+ * EnterpriseLicenseSeats (seat arithmetic) -> ee/Server/License/
15
+ * EnterpriseLicenseSync (response mapper) -> ee/Server/License/
16
+ *
17
+ * The Community image is built with ee/ removed, and it must not carry
18
+ * Enterprise code under the Apache license. So this suite pins that the moved
19
+ * modules are gone from core, that no core file loads them again, and that
20
+ * core kept exactly what core itself uses: RedisHealth's INFO half (the admin
21
+ * health API) and the SeatUsage type (EnterpriseEdition.getSeatUsage()).
22
+ *
23
+ * It runs in the Common test job, where ee/ is deleted, so it reads only
24
+ * packages/.
25
+ */
26
+
27
+ const COMMON_DIR: string = path.resolve(__dirname, "..", "..", "..");
28
+ const PACKAGES_DIR: string = path.resolve(COMMON_DIR, "..");
29
+ const REPOSITORY_ROOT: string = path.resolve(PACKAGES_DIR, "..");
30
+ const APP_DIR: string = path.join(PACKAGES_DIR, "App");
31
+
32
+ interface MovedModule {
33
+ // Repository-relative, without extension: where the module used to be.
34
+ corePath: string;
35
+ // Repository-relative: where it lives now.
36
+ eePath: string;
37
+ }
38
+
39
+ const MOVED_MODULES: ReadonlyArray<MovedModule> = [
40
+ {
41
+ corePath: "packages/Common/Server/Utils/InstanceHealth/PostgresHealth",
42
+ eePath: "ee/Server/Workers/InstanceHealth/PostgresHealth.ts",
43
+ },
44
+ {
45
+ corePath: "packages/Common/Utils/EnterpriseLicense/EnterpriseLicenseSeats",
46
+ eePath: "ee/Server/License/EnterpriseLicenseSeats.ts",
47
+ },
48
+ {
49
+ corePath: "packages/Common/Utils/EnterpriseLicense/EnterpriseLicenseSync",
50
+ eePath: "ee/Server/License/EnterpriseLicenseSync.ts",
51
+ },
52
+ ];
53
+
54
+ // The tests moved with the modules (to ee/Tests/Server/...).
55
+ const MOVED_TESTS: ReadonlyArray<string> = [
56
+ "packages/Common/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts",
57
+ "packages/Common/Tests/Utils/EnterpriseLicenseSeats.test.ts",
58
+ "packages/Common/Tests/Utils/EnterpriseLicenseSync.test.ts",
59
+ ];
60
+
61
+ const CORE_REDIS_HEALTH: string =
62
+ "packages/Common/Server/Utils/InstanceHealth/RedisHealth";
63
+
64
+ // What core's RedisHealth keeps: the INFO read the admin health API shows.
65
+ const CORE_REDIS_EXPORTS: ReadonlyArray<string> = [
66
+ "parseRedisInfo",
67
+ "buildRedisInfoSnapshot",
68
+ "readInfoSnapshot",
69
+ "getRedisInfoSnapshot",
70
+ ];
71
+
72
+ // What moved to ee/Server/Workers/InstanceHealth/RedisHealth.ts.
73
+ const EE_ONLY_REDIS_EXPORTS: ReadonlyArray<string> = [
74
+ "getRedisHealthSnapshot",
75
+ "shouldRollCounterSamples",
76
+ "getCounterDelta",
77
+ "COUNTER_WINDOW_IN_SECONDS",
78
+ "RedisHealthSnapshot",
79
+ "RedisCounterSample",
80
+ "RedisCounterSamples",
81
+ ];
82
+
83
+ /*
84
+ * The Redis key the Enterprise worker keeps its counter baseline under. Built
85
+ * from pieces so this file does not itself contain the literal it looks for.
86
+ */
87
+ const COUNTER_SAMPLE_KEY: string = [
88
+ "oneuptime",
89
+ "instance",
90
+ "health",
91
+ "redis",
92
+ "sample",
93
+ ].join("-");
94
+
95
+ const SOURCE_EXTENSIONS: ReadonlyArray<string> = [
96
+ ".ts",
97
+ ".tsx",
98
+ ".mts",
99
+ ".cts",
100
+ ".js",
101
+ ".jsx",
102
+ ".mjs",
103
+ ".cjs",
104
+ ];
105
+
106
+ // A JavaScript file (.js, .cjs, .mjs), parsed as JS rather than TS.
107
+ const JS_FILE: RegExp = /\.(c|m)?js$/;
108
+
109
+ // Any source extension, as stripped from a resolved module path.
110
+ const SOURCE_EXTENSION: RegExp = /\.(tsx?|mts|cts|jsx?|mjs|cjs)$/;
111
+
112
+ const SKIPPED_DIRECTORIES: ReadonlySet<string> = new Set<string>([
113
+ "node_modules",
114
+ "build",
115
+ "dist",
116
+ ".git",
117
+ "coverage",
118
+ ]);
119
+
120
+ /*
121
+ * Cheap prefilter: a file that names none of the moved modules (or core's
122
+ * RedisHealth, for the named-import check) cannot load them, so it is not
123
+ * parsed.
124
+ */
125
+ const MAY_REFERENCE_MOVED_MODULE: RegExp =
126
+ /PostgresHealth|EnterpriseLicenseSeats|EnterpriseLicenseSync|RedisHealth/;
127
+
128
+ function toRepositoryPath(filePath: string): string {
129
+ return path.relative(REPOSITORY_ROOT, filePath).split(path.sep).join("/");
130
+ }
131
+
132
+ function isSourceFile(fileName: string): boolean {
133
+ if (fileName.endsWith(".d.ts")) {
134
+ return false;
135
+ }
136
+
137
+ return SOURCE_EXTENSIONS.some((extension: string): boolean => {
138
+ return fileName.endsWith(extension);
139
+ });
140
+ }
141
+
142
+ function listSourceFiles(directory: string): Array<string> {
143
+ const found: Array<string> = [];
144
+
145
+ for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
146
+ const fullPath: string = path.join(directory, entry.name);
147
+
148
+ if (entry.isDirectory()) {
149
+ if (!SKIPPED_DIRECTORIES.has(entry.name)) {
150
+ found.push(...listSourceFiles(fullPath));
151
+ }
152
+ continue;
153
+ }
154
+
155
+ if (entry.isFile() && isSourceFile(entry.name)) {
156
+ found.push(fullPath);
157
+ }
158
+ }
159
+
160
+ return found;
161
+ }
162
+
163
+ function getScriptKind(fileName: string): ts.ScriptKind {
164
+ if (fileName.endsWith(".tsx")) {
165
+ return ts.ScriptKind.TSX;
166
+ }
167
+
168
+ if (fileName.endsWith(".jsx")) {
169
+ return ts.ScriptKind.JSX;
170
+ }
171
+
172
+ if (JS_FILE.test(fileName)) {
173
+ return ts.ScriptKind.JS;
174
+ }
175
+
176
+ return ts.ScriptKind.TS;
177
+ }
178
+
179
+ function stripSourceExtension(modulePath: string): string {
180
+ return modulePath.replace(SOURCE_EXTENSION, "");
181
+ }
182
+
183
+ /*
184
+ * The repository-relative module path a specifier loads, without extension,
185
+ * or null for a package outside the repository. "Common/..." and "App/..."
186
+ * are the package specifiers core and ee use for packages/Common and
187
+ * packages/App.
188
+ */
189
+ function resolveSpecifier(
190
+ importingFile: string,
191
+ specifier: string,
192
+ ): string | null {
193
+ const normalized: string = specifier.split("\\").join("/");
194
+ let absolute: string | null = null;
195
+
196
+ if (normalized.startsWith("./") || normalized.startsWith("../")) {
197
+ absolute = path.resolve(path.dirname(importingFile), normalized);
198
+ } else if (normalized.startsWith("Common/")) {
199
+ absolute = path.join(COMMON_DIR, normalized.slice("Common/".length));
200
+ } else if (normalized.startsWith("App/")) {
201
+ absolute = path.join(APP_DIR, normalized.slice("App/".length));
202
+ }
203
+
204
+ if (!absolute) {
205
+ return null;
206
+ }
207
+
208
+ return stripSourceExtension(toRepositoryPath(absolute));
209
+ }
210
+
211
+ function isRequireLikeCall(node: ts.CallExpression): boolean {
212
+ if (node.expression.kind === ts.SyntaxKind.ImportKeyword) {
213
+ return true;
214
+ }
215
+
216
+ if (ts.isIdentifier(node.expression)) {
217
+ return node.expression.text === "require";
218
+ }
219
+
220
+ /*
221
+ * jest.mock / doMock / requireActual / requireMock of a module that no
222
+ * longer exists in core is a stale reference too.
223
+ */
224
+ return (
225
+ ts.isPropertyAccessExpression(node.expression) &&
226
+ ts.isIdentifier(node.expression.expression) &&
227
+ node.expression.expression.text === "jest" &&
228
+ ["mock", "doMock", "requireActual", "requireMock"].includes(
229
+ node.expression.name.text,
230
+ )
231
+ );
232
+ }
233
+
234
+ interface ModuleReference {
235
+ specifier: string;
236
+ // Names imported with `import { a, b as c } from ...` (a and b).
237
+ importedNames: Array<string>;
238
+ }
239
+
240
+ /*
241
+ * Every module a file references, read from the TypeScript AST so that
242
+ * import-shaped text in strings and comments (this file has plenty) is never
243
+ * mistaken for a dependency.
244
+ */
245
+ function readModuleReferences(
246
+ fileName: string,
247
+ source: string,
248
+ ): Array<ModuleReference> {
249
+ const references: Array<ModuleReference> = [];
250
+ const sourceFile: ts.SourceFile = ts.createSourceFile(
251
+ fileName,
252
+ source,
253
+ ts.ScriptTarget.Latest,
254
+ true,
255
+ getScriptKind(fileName),
256
+ );
257
+
258
+ const visit: (node: ts.Node) => void = (node: ts.Node): void => {
259
+ if (
260
+ ts.isImportDeclaration(node) &&
261
+ ts.isStringLiteralLike(node.moduleSpecifier)
262
+ ) {
263
+ const importedNames: Array<string> = [];
264
+ const bindings: ts.NamedImportBindings | undefined =
265
+ node.importClause?.namedBindings;
266
+
267
+ if (bindings && ts.isNamedImports(bindings)) {
268
+ for (const element of bindings.elements) {
269
+ importedNames.push((element.propertyName || element.name).text);
270
+ }
271
+ }
272
+
273
+ references.push({
274
+ specifier: node.moduleSpecifier.text,
275
+ importedNames,
276
+ });
277
+ } else if (
278
+ ts.isExportDeclaration(node) &&
279
+ node.moduleSpecifier &&
280
+ ts.isStringLiteralLike(node.moduleSpecifier)
281
+ ) {
282
+ const importedNames: Array<string> = [];
283
+
284
+ if (node.exportClause && ts.isNamedExports(node.exportClause)) {
285
+ for (const element of node.exportClause.elements) {
286
+ importedNames.push((element.propertyName || element.name).text);
287
+ }
288
+ }
289
+
290
+ references.push({
291
+ specifier: node.moduleSpecifier.text,
292
+ importedNames,
293
+ });
294
+ } else if (
295
+ ts.isImportEqualsDeclaration(node) &&
296
+ ts.isExternalModuleReference(node.moduleReference) &&
297
+ ts.isStringLiteralLike(node.moduleReference.expression)
298
+ ) {
299
+ references.push({
300
+ specifier: node.moduleReference.expression.text,
301
+ importedNames: [],
302
+ });
303
+ } else if (
304
+ ts.isImportTypeNode(node) &&
305
+ ts.isLiteralTypeNode(node.argument) &&
306
+ ts.isStringLiteralLike(node.argument.literal)
307
+ ) {
308
+ references.push({
309
+ specifier: node.argument.literal.text,
310
+ importedNames:
311
+ node.qualifier && ts.isIdentifier(node.qualifier)
312
+ ? [node.qualifier.text]
313
+ : [],
314
+ });
315
+ } else if (ts.isCallExpression(node) && isRequireLikeCall(node)) {
316
+ const firstArgument: ts.Expression | undefined = node.arguments[0];
317
+
318
+ if (firstArgument && ts.isStringLiteralLike(firstArgument)) {
319
+ references.push({ specifier: firstArgument.text, importedNames: [] });
320
+ }
321
+ }
322
+
323
+ ts.forEachChild(node, visit);
324
+ };
325
+
326
+ visit(sourceFile);
327
+
328
+ return references;
329
+ }
330
+
331
+ const MOVED_CORE_PATHS: ReadonlySet<string> = new Set<string>(
332
+ MOVED_MODULES.map((moved: MovedModule): string => {
333
+ return moved.corePath;
334
+ }),
335
+ );
336
+
337
+ /*
338
+ * Each way a core file (repository-relative path) could still depend on the
339
+ * moved code: loading a moved module, or importing an ee-only name from
340
+ * core's RedisHealth.
341
+ */
342
+ function findMovedModuleReferences(
343
+ repositoryPath: string,
344
+ source: string,
345
+ ): Array<string> {
346
+ const violations: Array<string> = [];
347
+ const absolutePath: string = path.join(REPOSITORY_ROOT, repositoryPath);
348
+
349
+ for (const reference of readModuleReferences(repositoryPath, source)) {
350
+ const resolved: string | null = resolveSpecifier(
351
+ absolutePath,
352
+ reference.specifier,
353
+ );
354
+
355
+ if (!resolved) {
356
+ continue;
357
+ }
358
+
359
+ if (MOVED_CORE_PATHS.has(resolved)) {
360
+ violations.push(`${repositoryPath} -> ${reference.specifier}`);
361
+ continue;
362
+ }
363
+
364
+ if (resolved === CORE_REDIS_HEALTH) {
365
+ for (const name of reference.importedNames) {
366
+ if (EE_ONLY_REDIS_EXPORTS.includes(name)) {
367
+ violations.push(
368
+ `${repositoryPath} -> ${name} from ${reference.specifier}`,
369
+ );
370
+ }
371
+ }
372
+ }
373
+ }
374
+
375
+ return violations;
376
+ }
377
+
378
+ interface CoreScanResult {
379
+ scannedFiles: number;
380
+ violations: Array<string>;
381
+ filesWithCounterSampleKey: Array<string>;
382
+ }
383
+
384
+ let cachedCoreScan: CoreScanResult | null = null;
385
+
386
+ // Reads every source file under packages/ once per run.
387
+ function scanCore(): CoreScanResult {
388
+ if (cachedCoreScan) {
389
+ return cachedCoreScan;
390
+ }
391
+
392
+ const files: Array<string> = listSourceFiles(PACKAGES_DIR);
393
+ const violations: Array<string> = [];
394
+ const filesWithCounterSampleKey: Array<string> = [];
395
+
396
+ for (const filePath of files) {
397
+ const source: string = fs.readFileSync(filePath, "utf8");
398
+ const repositoryPath: string = toRepositoryPath(filePath);
399
+
400
+ if (source.includes(COUNTER_SAMPLE_KEY)) {
401
+ filesWithCounterSampleKey.push(repositoryPath);
402
+ }
403
+
404
+ if (!MAY_REFERENCE_MOVED_MODULE.test(source)) {
405
+ continue;
406
+ }
407
+
408
+ violations.push(...findMovedModuleReferences(repositoryPath, source));
409
+ }
410
+
411
+ cachedCoreScan = {
412
+ scannedFiles: files.length,
413
+ violations,
414
+ filesWithCounterSampleKey,
415
+ };
416
+
417
+ return cachedCoreScan;
418
+ }
419
+
420
+ describe("the moved-module scanner's own machinery", () => {
421
+ const FIXTURE: string = "packages/Common/Server/Enterprise/Fixture.ts";
422
+
423
+ test("flags every way of loading a moved module", () => {
424
+ const violations: Array<string> = findMovedModuleReferences(
425
+ FIXTURE,
426
+ [
427
+ 'import { getPostgresHealthSnapshot } from "Common/Server/Utils/InstanceHealth/PostgresHealth";',
428
+ 'import type { SeatUsage } from "../../Utils/EnterpriseLicense/EnterpriseLicenseSeats";',
429
+ 'export * from "../../Utils/EnterpriseLicense/EnterpriseLicenseSync.ts";',
430
+ 'const lazy = import("Common/Utils/EnterpriseLicense/EnterpriseLicenseSync");',
431
+ 'const required = require("../../Utils/EnterpriseLicense/EnterpriseLicenseSeats.js");',
432
+ 'type T = import("Common/Utils/EnterpriseLicense/EnterpriseLicenseSeats").SeatUsage;',
433
+ 'import Postgres = require("../Utils/InstanceHealth/PostgresHealth");',
434
+ 'jest.mock("Common/Server/Utils/InstanceHealth/PostgresHealth", () => { return {}; });',
435
+ ].join("\n"),
436
+ );
437
+
438
+ expect(violations).toEqual([
439
+ `${FIXTURE} -> Common/Server/Utils/InstanceHealth/PostgresHealth`,
440
+ `${FIXTURE} -> ../../Utils/EnterpriseLicense/EnterpriseLicenseSeats`,
441
+ `${FIXTURE} -> ../../Utils/EnterpriseLicense/EnterpriseLicenseSync.ts`,
442
+ `${FIXTURE} -> Common/Utils/EnterpriseLicense/EnterpriseLicenseSync`,
443
+ `${FIXTURE} -> ../../Utils/EnterpriseLicense/EnterpriseLicenseSeats.js`,
444
+ `${FIXTURE} -> Common/Utils/EnterpriseLicense/EnterpriseLicenseSeats`,
445
+ `${FIXTURE} -> ../Utils/InstanceHealth/PostgresHealth`,
446
+ `${FIXTURE} -> Common/Server/Utils/InstanceHealth/PostgresHealth`,
447
+ ]);
448
+ });
449
+
450
+ test("flags an ee-only name imported from core's RedisHealth", () => {
451
+ expect(
452
+ findMovedModuleReferences(
453
+ FIXTURE,
454
+ [
455
+ 'import { getRedisHealthSnapshot, getRedisInfoSnapshot } from "Common/Server/Utils/InstanceHealth/RedisHealth";',
456
+ 'export { COUNTER_WINDOW_IN_SECONDS as W } from "../Utils/InstanceHealth/RedisHealth";',
457
+ ].join("\n"),
458
+ ),
459
+ ).toEqual([
460
+ `${FIXTURE} -> getRedisHealthSnapshot from Common/Server/Utils/InstanceHealth/RedisHealth`,
461
+ `${FIXTURE} -> COUNTER_WINDOW_IN_SECONDS from ../Utils/InstanceHealth/RedisHealth`,
462
+ ]);
463
+ });
464
+
465
+ test("ignores what stays in core, and import-shaped text", () => {
466
+ expect(
467
+ findMovedModuleReferences(
468
+ FIXTURE,
469
+ [
470
+ 'import { getRedisInfoSnapshot, parseRedisInfo, readInfoSnapshot } from "Common/Server/Utils/InstanceHealth/RedisHealth";',
471
+ 'import EnterpriseLicenseUsageUtil from "../../Utils/EnterpriseLicense/EnterpriseLicenseUsage";',
472
+ 'import { SeatUsage } from "./EnterpriseLicenseSnapshot";',
473
+ // Resolves to packages/Common/Server/PostgresHealth, not a moved module.
474
+ 'import Other from "../PostgresHealth";',
475
+ 'import Package from "PostgresHealth";',
476
+ '// import "Common/Server/Utils/InstanceHealth/PostgresHealth";',
477
+ '/* export * from "Common/Utils/EnterpriseLicense/EnterpriseLicenseSync"; */',
478
+ 'const text: string = "Common/Utils/EnterpriseLicense/EnterpriseLicenseSeats";',
479
+ ].join("\n"),
480
+ ),
481
+ ).toEqual([]);
482
+ });
483
+ });
484
+
485
+ describe("Enterprise-only modules live in ee/, not core", () => {
486
+ test.each(
487
+ MOVED_MODULES.map((moved: MovedModule): [string, string] => {
488
+ return [moved.corePath, moved.eePath];
489
+ }),
490
+ )("%s is gone from core (it lives at %s)", (corePath: string) => {
491
+ for (const extension of SOURCE_EXTENSIONS) {
492
+ expect(
493
+ fs.existsSync(path.join(REPOSITORY_ROOT, `${corePath}${extension}`)),
494
+ ).toBe(false);
495
+ }
496
+
497
+ // Nor as a directory module (<path>/index.ts).
498
+ expect(fs.existsSync(path.join(REPOSITORY_ROOT, corePath))).toBe(false);
499
+ });
500
+
501
+ test.each(
502
+ MOVED_TESTS.map((testPath: string): [string] => {
503
+ return [testPath];
504
+ }),
505
+ )("%s moved to ee/Tests with its module", (testPath: string) => {
506
+ expect(fs.existsSync(path.join(REPOSITORY_ROOT, testPath))).toBe(false);
507
+ });
508
+
509
+ test("no core source loads a moved module or an ee-only RedisHealth name", () => {
510
+ const result: CoreScanResult = scanCore();
511
+
512
+ // A sanity floor, so an empty or misrooted scan cannot pass vacuously.
513
+ expect(result.scannedFiles).toBeGreaterThan(1000);
514
+ expect(result.violations).toEqual([]);
515
+ });
516
+
517
+ /*
518
+ * The counter baseline is the Enterprise worker's state. Core reading or
519
+ * writing that key again would mean the delta logic crept back.
520
+ */
521
+ test("no core source touches the Enterprise worker's Redis counter baseline", () => {
522
+ expect(scanCore().filesWithCounterSampleKey).toEqual([]);
523
+ });
524
+
525
+ test("core's RedisHealth keeps the INFO half the admin health API uses", () => {
526
+ const exported: Record<string, unknown> = CoreRedisHealth as Record<
527
+ string,
528
+ unknown
529
+ >;
530
+
531
+ for (const name of CORE_REDIS_EXPORTS) {
532
+ expect(typeof exported[name]).toBe("function");
533
+ }
534
+
535
+ for (const name of EE_ONLY_REDIS_EXPORTS) {
536
+ expect(exported[name]).toBeUndefined();
537
+ }
538
+ });
539
+
540
+ test("core's RedisHealth has no counter-sample code left", () => {
541
+ const source: string = fs.readFileSync(
542
+ path.join(REPOSITORY_ROOT, `${CORE_REDIS_HEALTH}.ts`),
543
+ "utf8",
544
+ );
545
+
546
+ for (const name of EE_ONLY_REDIS_EXPORTS) {
547
+ expect(source).not.toContain(name);
548
+ }
549
+ expect(source).not.toMatch(/COUNTER_SAMPLE|client\.(get|set|expire)\(/);
550
+ });
551
+
552
+ /*
553
+ * EnterpriseEdition.getSeatUsage() and the /global-config/license response
554
+ * hand SeatUsage to core code, so the type stayed in core when the
555
+ * arithmetic moved. This is a compile-time check as much as a runtime one:
556
+ * ts-jest type-checks this file.
557
+ */
558
+ test("SeatUsage is declared in core's EnterpriseLicenseSnapshot", () => {
559
+ const usage: SeatUsage = {
560
+ isEnforced: true,
561
+ userLimit: 10,
562
+ seatsInUse: 4,
563
+ seatsRemaining: 6,
564
+ hasSeatForNewUser: true,
565
+ seatsUsedByOtherInstances: 0,
566
+ };
567
+
568
+ expect(usage.seatsRemaining).toBe(6);
569
+
570
+ const source: string = fs.readFileSync(
571
+ path.join(
572
+ COMMON_DIR,
573
+ "Server",
574
+ "Enterprise",
575
+ "EnterpriseLicenseSnapshot.ts",
576
+ ),
577
+ "utf8",
578
+ );
579
+
580
+ expect(source).toMatch(/export interface SeatUsage \{/);
581
+ });
582
+ });