@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.
- package/Models/AnalyticsModels/AuditLog.ts +23 -15
- package/Models/DatabaseModels/GlobalConfig.ts +24 -0
- package/Models/DatabaseModels/Monitor.ts +3 -2
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
- package/Scripts/generate-service-worker.js +65 -4
- package/Server/API/BaseAPI.ts +26 -5
- package/Server/API/GlobalConfigAPI.ts +228 -462
- package/Server/API/ProjectOIDC.ts +25 -16
- package/Server/API/ProjectSSO.ts +24 -16
- package/Server/API/StatusPageAPI.ts +100 -42
- package/Server/API/TeamMemberAPI.ts +10 -1
- package/Server/Enterprise/EnterpriseEdition.ts +649 -0
- package/Server/Enterprise/EnterpriseFeature.ts +48 -0
- package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
- package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
- package/Server/EnvironmentConfig.ts +147 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/UserAuthorization.ts +38 -16
- package/Server/Services/AuditLogService.ts +84 -1079
- package/Server/Services/EnterpriseLicenseService.ts +38 -0
- package/Server/Services/GlobalConfigService.ts +80 -1
- package/Server/Services/MonitorProbeService.ts +116 -20
- package/Server/Services/MonitorService.ts +56 -4
- package/Server/Services/MonitorStatusTimelineService.ts +284 -0
- package/Server/Services/MonitorTemplateService.ts +26 -0
- package/Server/Services/ProjectService.ts +284 -0
- package/Server/Services/RumSessionPinService.ts +25 -6
- package/Server/Services/StatusPagePrivateUserService.ts +7 -3
- package/Server/Services/StatusPageService.ts +78 -1
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/TeamService.ts +10 -0
- package/Server/Services/UserService.ts +10 -17
- package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
- package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
- package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
- package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
- package/Server/Types/Markdown.ts +41 -0
- package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
- package/Server/Utils/EditionEnforcement.ts +233 -0
- package/Server/Utils/FrontendEnvironment.ts +41 -2
- package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
- package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
- package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
- package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
- package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
- package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
- package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
- package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
- package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
- package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
- package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
- package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
- package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
- package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
- package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
- package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
- package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
- package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
- package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
- package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
- package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
- package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
- package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
- package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
- package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
- package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
- package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
- package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
- package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
- package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
- package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
- package/Tests/Server/Services/AuditLogService.test.ts +460 -990
- package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
- package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
- package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
- package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
- package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
- package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
- package/Tests/Server/Types/Markdown.test.ts +181 -0
- package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
- package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
- package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
- package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
- package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
- package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
- package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
- package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
- package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
- package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
- package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
- package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
- package/Tests/Utils/HostAddressUtil.test.ts +138 -0
- package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
- package/Types/API/Hostname.ts +63 -16
- package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
- package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
- package/Types/Database/CanonicalModelInstance.ts +102 -0
- package/Types/Database/TableColumn.ts +20 -6
- package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
- package/Types/IP/IPv6.ts +6 -1
- package/Types/Monitor/MonitorStep.ts +6 -1
- package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
- package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
- package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/ModelList/ModelList.tsx +11 -1
- package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
- package/UI/esbuild-enterprise.js +263 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
- package/Utils/HostAddressUtil.ts +94 -0
- package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
- package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
- package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +26 -5
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectOIDC.js +24 -16
- package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
- package/build/dist/Server/API/ProjectSSO.js +24 -16
- package/build/dist/Server/API/ProjectSSO.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +93 -43
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +8 -1
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
- package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +84 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AuditLogService.js +71 -740
- package/build/dist/Server/Services/AuditLogService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +63 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +90 -17
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +45 -4
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +214 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +24 -6
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +71 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +10 -0
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +9 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +10 -16
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +31 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
- package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
- package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +96 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +449 -261
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +59 -11
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
- package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
- package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +19 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
- package/build/dist/Types/IP/IPv6.js +6 -1
- package/build/dist/Types/IP/IPv6.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +5 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/HostAddressUtil.js +80 -0
- package/build/dist/Utils/HostAddressUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
- package/jest.config.json +3 -1
- package/package.json +1 -1
- package/test-setup.sh +103 -34
- package/tsconfig.json +13 -0
- package/Server/API/EnterpriseLicenseAPI.ts +0 -925
- package/Server/API/TeamComplianceAPI.ts +0 -158
- package/Server/Middleware/SCIMAuthorization.ts +0 -141
- package/Server/Services/TeamComplianceService.ts +0 -733
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
- package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
- package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
- package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
- package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
- package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
- package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
- package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
- package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
- package/build/dist/Server/Services/TeamComplianceService.js +0 -537
- package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
- 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
|
+
});
|