@oneuptime/common 12.0.12 → 12.0.14
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/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +32 -5
- package/Models/DatabaseModels/NetworkDevice.ts +64 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
- package/Models/DatabaseModels/StatusPage.ts +59 -0
- package/Models/DatabaseModels/StatusPageOidc.ts +2 -0
- package/Models/DatabaseModels/UserCall.ts +94 -3
- package/Models/DatabaseModels/UserEmail.ts +94 -3
- package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
- package/Models/DatabaseModels/UserPush.ts +37 -0
- package/Models/DatabaseModels/UserSMS.ts +94 -3
- package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -2
- package/Server/API/AIChatAPI.ts +55 -56
- package/Server/API/BaseAPI.ts +79 -14
- package/Server/API/CommonAPI.ts +89 -0
- package/Server/API/MicrosoftTeamsAPI.ts +20 -9
- package/Server/API/SlackAPI.ts +13 -10
- package/Server/API/StatusPageAPI.ts +2197 -2128
- package/Server/API/TelemetryAPI.ts +72 -3
- package/Server/API/UserCallAPI.ts +53 -45
- package/Server/API/UserEmailAPI.ts +53 -44
- package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
- package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
- package/Server/API/UserPushAPI.ts +126 -2
- package/Server/API/UserSmsAPI.ts +53 -44
- package/Server/API/UserWhatsAppAPI.ts +53 -50
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.ts +30 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Middleware/UserAuthorization.ts +11 -2
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/ApiKeyPermissionService.ts +116 -2
- package/Server/Services/DatabaseService.ts +118 -6
- package/Server/Services/LogAggregationService.ts +39 -0
- package/Server/Services/LogService.ts +21 -0
- package/Server/Services/NetworkSiteService.ts +12 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/SpanService.ts +21 -0
- package/Server/Services/TeamMemberService.ts +53 -13
- package/Server/Services/TraceAggregationService.ts +15 -0
- package/Server/Services/UserCallService.ts +55 -24
- package/Server/Services/UserEmailService.ts +83 -17
- package/Server/Services/UserIncomingCallNumberService.ts +49 -85
- package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
- package/Server/Services/UserNotificationRuleService.ts +26 -0
- package/Server/Services/UserPushService.ts +89 -0
- package/Server/Services/UserSmsService.ts +50 -17
- package/Server/Services/UserWhatsAppService.ts +48 -15
- package/Server/Services/WorkspaceNotificationRuleService.ts +172 -220
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
- package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -16
- package/Server/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/APIKey/AccessPermission.ts +16 -40
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +144 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/LogRedaction.ts +576 -0
- package/Server/Utils/Logger.ts +123 -46
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +94 -23
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResource.ts +29 -9
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +28 -7
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +56 -10
- package/Server/Utils/StartServer.ts +30 -9
- package/Server/Utils/StatusPageSearchEngineIndexing.ts +33 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +441 -0
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +488 -46
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +328 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +130 -0
- package/Tests/Models/DatabaseModels/DatabaseBaseModelToJSONObjectCache.test.ts +180 -0
- package/Tests/Models/StatusPageEnableSearchEngineIndexing.test.ts +157 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +23 -1
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +785 -0
- package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +21 -8
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +290 -0
- package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +7 -1
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
- package/Tests/Server/API/StatusPageOverviewCache.test.ts +474 -0
- package/Tests/Server/API/StatusPageSeoSearchEngineIndexing.test.ts +189 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
- package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
- package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
- package/Tests/Server/API/UserSmsApi.test.ts +107 -14
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
- package/Tests/Server/Infrastructure/InMemoryTTLCache.test.ts +158 -0
- package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +9 -60
- package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +24 -15
- package/Tests/Server/Middleware/UserAuthorization.test.ts +79 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +280 -0
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +347 -0
- package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
- package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
- package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
- package/Tests/Server/Services/DatabaseServiceUpdateDebugLogging.test.ts +282 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
- package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
- package/Tests/Server/Services/NetworkSiteService.test.ts +56 -2
- package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
- package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
- package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +267 -0
- package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
- package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
- package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleTestRuleChannels.test.ts +702 -0
- package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
- package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +165 -0
- package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
- package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
- package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
- package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
- package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +48 -36
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +213 -0
- package/Tests/Server/Utils/Browser.test.ts +162 -0
- package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
- package/Tests/Server/Utils/Express.test.ts +371 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +415 -0
- package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +245 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
- package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +374 -4
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +455 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
- package/Tests/Server/Utils/Monitor/NetworkDeviceReachabilityRoundTrip.test.ts +369 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +86 -8
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +64 -0
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCacheStore.test.ts +207 -0
- package/Tests/Server/Utils/StartServerBodyVerify.test.ts +335 -0
- package/Tests/Server/Utils/StatusPageSearchEngineIndexing.test.ts +60 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +435 -0
- package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
- package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
- package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +607 -62
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstalledTeamIdSpace.test.ts +778 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +44 -10
- package/Tests/Types/API/HostnameFromAuthority.test.ts +164 -0
- package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
- package/Tests/Types/Call/CallRequest.test.ts +189 -0
- package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
- package/Tests/Types/Database/AccessControl/ColumnAccessControlCache.test.ts +344 -0
- package/Tests/Types/Database/DatabasePropertyFindOperator.test.ts +518 -0
- package/Tests/Types/Database/TableColumnMetadataCache.test.ts +286 -0
- package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
- package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
- package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
- package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
- package/Tests/Types/Monitor/MonitorStep.test.ts +100 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +360 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
- package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
- package/Tests/Types/StatusPage/SearchEngineIndexing.test.ts +86 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +254 -0
- package/Tests/Types/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- package/Tests/UI/Components/CardSelect.test.tsx +1021 -0
- package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
- package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
- package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
- package/Tests/UI/Components/List.test.tsx +9 -2
- package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
- package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
- package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
- package/Tests/UI/Components/MasterPage.test.tsx +36 -1
- package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
- package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
- package/Tests/UI/Components/Skeleton.test.tsx +71 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
- package/Tests/UI/Components/Tabs.test.tsx +24 -0
- package/Tests/UI/Components/Toast.test.tsx +130 -7
- package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
- package/Tests/UI/Utils/Dropdown.test.ts +423 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
- package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
- package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
- package/Tests/Utils/API.test.ts +16 -2
- package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
- package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +66 -1
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +115 -6
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +610 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +114 -45
- package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/API/Hostname.ts +79 -0
- package/Types/Database/AccessControl/ColumnAccessControl.ts +33 -11
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +33 -11
- package/Types/Database/DatabaseProperty.ts +38 -0
- package/Types/Database/TableColumn.ts +34 -7
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Events/Recurring.ts +16 -1
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/MonitorStep.ts +13 -1
- package/Types/Monitor/MonitorType.ts +345 -40
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +43 -0
- package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
- package/Types/Permission.ts +35 -0
- package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
- package/Types/PushNotification/PushNotificationMessage.ts +15 -0
- package/Types/PushNotification/PushNotificationRequest.ts +8 -16
- package/Types/Service/ServiceLanguage.ts +144 -0
- package/Types/StatusPage/SearchEngineIndexing.ts +61 -0
- package/Types/Telemetry/ResourceEntityFacet.ts +211 -0
- package/Types/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- package/UI/Components/CardSelect/CardSelect.tsx +714 -105
- package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
- package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
- package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
- package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
- package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
- package/UI/Components/CommandPalette/Types.ts +49 -0
- package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/EmptyState/EmptyState.tsx +8 -1
- package/UI/Components/Feed/FeedItem.tsx +1 -1
- package/UI/Components/Footer/Footer.tsx +32 -6
- package/UI/Components/Forms/Fields/FormField.tsx +3 -0
- package/UI/Components/Forms/Types/Field.ts +8 -0
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Loader/PageLoader.tsx +29 -8
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +26 -4
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +23 -2
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- package/UI/Components/MasterPage/MasterPage.tsx +24 -11
- package/UI/Components/Modal/Modal.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
- package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
- package/UI/Components/Navbar/NavBar.tsx +14 -1
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
- package/UI/Components/SideOver/SideOver.tsx +37 -2
- package/UI/Components/Skeleton/Skeleton.tsx +53 -0
- package/UI/Components/Table/Table.tsx +74 -44
- package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
- package/UI/Components/Tabs/Tab.tsx +1 -1
- package/UI/Components/Toast/Toast.tsx +118 -53
- package/UI/Components/Toast/ToastInit.tsx +82 -32
- package/UI/Styles/Theme.css +40 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
- package/UI/Utils/ModelListCache.ts +188 -0
- package/UI/Utils/Project.ts +29 -0
- package/Utils/API.ts +6 -1
- package/Utils/Monitor/MonitorMetricType.ts +16 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +60 -8
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +262 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +41 -24
- package/Utils/Telemetry/CrossSignalScope.ts +75 -4
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +20 -4
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +66 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +60 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js +2 -0
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +48 -35
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +69 -13
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +59 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +20 -6
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +13 -10
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +745 -673
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +34 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +42 -38
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +42 -38
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
- package/build/dist/Server/API/UserPushAPI.js +95 -2
- package/build/dist/Server/API/UserPushAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +42 -38
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +6 -2
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +90 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +89 -6
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +7 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/LogService.js +16 -0
- package/build/dist/Server/Services/LogService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +12 -0
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +69 -30
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/SpanService.js +16 -0
- package/build/dist/Server/Services/SpanService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +43 -7
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +2 -0
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +54 -22
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +78 -17
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +77 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +50 -17
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +137 -164
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +21 -13
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +9 -32
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +87 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/ChannelVerification.js +348 -0
- package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
- package/build/dist/Server/Utils/LogRedaction.js +449 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -0
- package/build/dist/Server/Utils/Logger.js +98 -45
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +65 -13
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +20 -3
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +27 -7
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +29 -10
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +10 -7
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js +24 -0
- package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +311 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -0
- package/build/dist/Server/Utils/TotpAuth.js +127 -8
- package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
- package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
- package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
- package/build/dist/Server/Utils/VerificationCode.js +120 -0
- package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +366 -37
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +63 -0
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +20 -6
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +20 -6
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/DatabaseProperty.js +38 -0
- package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
- package/build/dist/Types/Database/TableColumn.js +24 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Events/Recurring.js +13 -1
- package/build/dist/Types/Events/Recurring.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +9 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +330 -31
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +33 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
- package/build/dist/Types/Service/ServiceLanguage.js +96 -0
- package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
- package/build/dist/Types/StatusPage/SearchEngineIndexing.js +55 -0
- package/build/dist/Types/StatusPage/SearchEngineIndexing.js.map +1 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js +156 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -0
- package/build/dist/Types/Text.js +82 -17
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -14
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/CardSelect/CardSelect.js +360 -40
- package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
- package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/Footer/Footer.js +7 -4
- package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +19 -5
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
- package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
- package/build/dist/UI/Components/Loader/PageLoader.js +15 -5
- package/build/dist/UI/Components/Loader/PageLoader.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +16 -3
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +13 -1
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js +10 -2
- package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
- package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +35 -24
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
- package/build/dist/UI/Components/Tabs/Tab.js +1 -1
- package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
- package/build/dist/UI/Components/Toast/Toast.js +77 -23
- package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
- package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelListCache.js +126 -0
- package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
- package/build/dist/UI/Utils/Project.js +24 -1
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/Utils/API.js +6 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +13 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +34 -7
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +177 -0
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +23 -27
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +44 -4
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/jest.config.json +1 -1
- package/package.json +2 -3
- package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
- package/Tests/__mocks__/otpauth.js +0 -30
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
|
@@ -584,9 +584,37 @@ describe("MicrosoftTeamsUtil.removeTeamFromBotActivity", () => {
|
|
|
584
584
|
});
|
|
585
585
|
|
|
586
586
|
expect(removeSpy).toHaveBeenCalledTimes(1);
|
|
587
|
+
/*
|
|
588
|
+
* Uninstall passes both ids: the bot is already out of the team so the
|
|
589
|
+
* Graph id cannot be looked up, and records written before it was captured
|
|
590
|
+
* are only findable by the thread id. TEAM_ID here is a thread id, matching
|
|
591
|
+
* what channelData.team.id carries.
|
|
592
|
+
*/
|
|
587
593
|
expect(removeSpy).toHaveBeenCalledWith({
|
|
588
594
|
tenantId: TENANT_ID,
|
|
589
|
-
|
|
595
|
+
teamsThreadId: TEAM_ID,
|
|
596
|
+
graphTeamId: undefined,
|
|
597
|
+
});
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
test("an uninstall activity that still carries aadGroupId passes it through", async () => {
|
|
601
|
+
const removeSpy: jest.SpyInstance = jest
|
|
602
|
+
.spyOn(MicrosoftTeamsUtil, "removeTeamFromProjectAuthTokens")
|
|
603
|
+
.mockResolvedValue(undefined as never);
|
|
604
|
+
|
|
605
|
+
await MicrosoftTeamsUtil.removeTeamFromBotActivity({
|
|
606
|
+
activity: teamActivity({
|
|
607
|
+
channelData: {
|
|
608
|
+
team: { id: TEAM_ID, aadGroupId: "graph-team-1" },
|
|
609
|
+
tenant: { id: TENANT_ID },
|
|
610
|
+
},
|
|
611
|
+
}),
|
|
612
|
+
});
|
|
613
|
+
|
|
614
|
+
expect(removeSpy).toHaveBeenCalledWith({
|
|
615
|
+
tenantId: TENANT_ID,
|
|
616
|
+
teamsThreadId: TEAM_ID,
|
|
617
|
+
graphTeamId: "graph-team-1",
|
|
590
618
|
});
|
|
591
619
|
});
|
|
592
620
|
|
|
@@ -884,7 +912,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
|
|
|
884
912
|
|
|
885
913
|
await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
|
|
886
914
|
tenantId: "tenant-abc",
|
|
887
|
-
|
|
915
|
+
teamsThreadId: TEAM_ID,
|
|
888
916
|
});
|
|
889
917
|
|
|
890
918
|
expect(findBySpy).toHaveBeenCalledWith(
|
|
@@ -925,7 +953,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
|
|
|
925
953
|
|
|
926
954
|
await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
|
|
927
955
|
tenantId: "tenant-abc",
|
|
928
|
-
|
|
956
|
+
teamsThreadId: teamToRemove.id,
|
|
929
957
|
});
|
|
930
958
|
|
|
931
959
|
expect(updateSpy).toHaveBeenCalledTimes(1);
|
|
@@ -950,7 +978,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
|
|
|
950
978
|
|
|
951
979
|
await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
|
|
952
980
|
tenantId: "tenant-abc",
|
|
953
|
-
|
|
981
|
+
teamsThreadId: team.id,
|
|
954
982
|
});
|
|
955
983
|
|
|
956
984
|
const savedMiscData: MicrosoftTeamsMiscData = getUpdateArgs(updateSpy, 0)
|
|
@@ -976,7 +1004,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
|
|
|
976
1004
|
|
|
977
1005
|
await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
|
|
978
1006
|
tenantId: "tenant-abc",
|
|
979
|
-
|
|
1007
|
+
teamsThreadId: TEAM_ID,
|
|
980
1008
|
});
|
|
981
1009
|
|
|
982
1010
|
expect(updateSpy).not.toHaveBeenCalled();
|
|
@@ -991,7 +1019,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
|
|
|
991
1019
|
|
|
992
1020
|
await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
|
|
993
1021
|
tenantId: "tenant-abc",
|
|
994
|
-
|
|
1022
|
+
teamsThreadId: TEAM_ID,
|
|
995
1023
|
});
|
|
996
1024
|
|
|
997
1025
|
expect(updateSpy).not.toHaveBeenCalled();
|
|
@@ -1014,7 +1042,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
|
|
|
1014
1042
|
|
|
1015
1043
|
await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
|
|
1016
1044
|
tenantId: "tenant-abc",
|
|
1017
|
-
|
|
1045
|
+
teamsThreadId: team.id,
|
|
1018
1046
|
});
|
|
1019
1047
|
|
|
1020
1048
|
expect(updateSpy).toHaveBeenCalledTimes(3);
|
|
@@ -1068,7 +1096,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
|
|
|
1068
1096
|
|
|
1069
1097
|
await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
|
|
1070
1098
|
tenantId: "tenant-abc",
|
|
1071
|
-
|
|
1099
|
+
teamsThreadId: team.id,
|
|
1072
1100
|
});
|
|
1073
1101
|
|
|
1074
1102
|
expect(updateSpy).toHaveBeenCalledTimes(1);
|
|
@@ -1104,7 +1132,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
|
|
|
1104
1132
|
|
|
1105
1133
|
await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
|
|
1106
1134
|
tenantId: "tenant-abc",
|
|
1107
|
-
|
|
1135
|
+
teamsThreadId: "19:team-aaa@thread.tacv2",
|
|
1108
1136
|
});
|
|
1109
1137
|
|
|
1110
1138
|
expect(updateSpy).not.toHaveBeenCalled();
|
|
@@ -1120,7 +1148,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
|
|
|
1120
1148
|
|
|
1121
1149
|
await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
|
|
1122
1150
|
tenantId: "tenant-abc",
|
|
1123
|
-
|
|
1151
|
+
teamsThreadId: team.id,
|
|
1124
1152
|
});
|
|
1125
1153
|
|
|
1126
1154
|
expect(originalMiscData.installedTeams).toEqual({ [team.id]: team });
|
|
@@ -1495,9 +1523,15 @@ describe("MicrosoftTeamsUtil.handleBotMessageActivity - team install backfill wi
|
|
|
1495
1523
|
});
|
|
1496
1524
|
|
|
1497
1525
|
expect(spies.captureTeamSpy).toHaveBeenCalledTimes(1);
|
|
1526
|
+
/*
|
|
1527
|
+
* onlyIfMissingOrStale, because this runs on every inbound channel message:
|
|
1528
|
+
* once the team is recorded it must cost one read, not a write plus a
|
|
1529
|
+
* possible Bot Framework call to resolve the group id.
|
|
1530
|
+
*/
|
|
1498
1531
|
expect(spies.captureTeamSpy).toHaveBeenCalledWith({
|
|
1499
1532
|
activity: activity,
|
|
1500
1533
|
turnContext: turnContext,
|
|
1534
|
+
onlyIfMissingOrStale: true,
|
|
1501
1535
|
});
|
|
1502
1536
|
expect(spies.captureChatSpy).not.toHaveBeenCalled();
|
|
1503
1537
|
});
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import Hostname from "../../../Types/API/Hostname";
|
|
2
|
+
import { describe, expect, test } from "@jest/globals";
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Hostname.fromAuthority splits a URL authority into a bare host and a real
|
|
6
|
+
* Port. It exists because URL.fromString hands the WHOLE authority to the
|
|
7
|
+
* Hostname constructor, so `URL.fromString("https://example.com:8443/")`
|
|
8
|
+
* yields a hostname of "example.com:8443" and no port at all.
|
|
9
|
+
*
|
|
10
|
+
* Anything that reads the structured accessors rather than toString() then
|
|
11
|
+
* dials a host that does not exist. The SSL Certificate Monitor is one such
|
|
12
|
+
* consumer, which is why a monitor on a non-443 port could never connect —
|
|
13
|
+
* see https://github.com/OneUptime/oneuptime/issues/3225.
|
|
14
|
+
*
|
|
15
|
+
* fromString() is NOT a substitute: it splits on the FIRST colon, which
|
|
16
|
+
* mangles every IPv6 literal.
|
|
17
|
+
*/
|
|
18
|
+
describe("Hostname.fromAuthority", () => {
|
|
19
|
+
describe("host and port", () => {
|
|
20
|
+
test("splits a trailing port off the host", () => {
|
|
21
|
+
const hostname: Hostname = Hostname.fromAuthority("example.com:8443");
|
|
22
|
+
|
|
23
|
+
expect(hostname.hostname).toBe("example.com");
|
|
24
|
+
expect(hostname.port?.toNumber()).toBe(8443);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("leaves a bare host without a port", () => {
|
|
28
|
+
const hostname: Hostname = Hostname.fromAuthority("example.com");
|
|
29
|
+
|
|
30
|
+
expect(hostname.hostname).toBe("example.com");
|
|
31
|
+
expect(hostname.port).toBeUndefined();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("handles localhost with a port", () => {
|
|
35
|
+
const hostname: Hostname = Hostname.fromAuthority("localhost:5000");
|
|
36
|
+
|
|
37
|
+
expect(hostname.hostname).toBe("localhost");
|
|
38
|
+
expect(hostname.port?.toNumber()).toBe(5000);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("handles an IPv4 literal with a port", () => {
|
|
42
|
+
const hostname: Hostname = Hostname.fromAuthority("127.0.0.1:8443");
|
|
43
|
+
|
|
44
|
+
expect(hostname.hostname).toBe("127.0.0.1");
|
|
45
|
+
expect(hostname.port?.toNumber()).toBe(8443);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("round-trips back to the original authority", () => {
|
|
49
|
+
expect(Hostname.fromAuthority("example.com:8443").toString()).toBe(
|
|
50
|
+
"example.com:8443",
|
|
51
|
+
);
|
|
52
|
+
expect(Hostname.fromAuthority("example.com").toString()).toBe(
|
|
53
|
+
"example.com",
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("IPv6 literals", () => {
|
|
59
|
+
test("keeps a bracketed IPv6 address intact and takes its port", () => {
|
|
60
|
+
const hostname: Hostname = Hostname.fromAuthority("[::1]:8443");
|
|
61
|
+
|
|
62
|
+
expect(hostname.hostname).toBe("[::1]");
|
|
63
|
+
expect(hostname.port?.toNumber()).toBe(8443);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("keeps a bracketed IPv6 address with no port intact", () => {
|
|
67
|
+
const hostname: Hostname = Hostname.fromAuthority("[::1]");
|
|
68
|
+
|
|
69
|
+
expect(hostname.hostname).toBe("[::1]");
|
|
70
|
+
expect(hostname.port).toBeUndefined();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test("does not split an unbracketed IPv6 literal", () => {
|
|
74
|
+
/*
|
|
75
|
+
* Two or more colons cannot be a host:port, so every colon belongs to
|
|
76
|
+
* the address. fromString would have returned a host of "2001".
|
|
77
|
+
*/
|
|
78
|
+
const hostname: Hostname = Hostname.fromAuthority("2001:db8::1");
|
|
79
|
+
|
|
80
|
+
expect(hostname.hostname).toBe("2001:db8::1");
|
|
81
|
+
expect(hostname.port).toBeUndefined();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test("a full bracketed IPv6 address survives with its port", () => {
|
|
85
|
+
const hostname: Hostname = Hostname.fromAuthority(
|
|
86
|
+
"[2001:db8::8a2e:370:7334]:9000",
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
expect(hostname.hostname).toBe("[2001:db8::8a2e:370:7334]");
|
|
90
|
+
expect(hostname.port?.toNumber()).toBe(9000);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe("userinfo", () => {
|
|
95
|
+
test("drops userinfo and keeps the host", () => {
|
|
96
|
+
const hostname: Hostname = Hostname.fromAuthority(
|
|
97
|
+
"user:token@hooks.example.com",
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
expect(hostname.hostname).toBe("hooks.example.com");
|
|
101
|
+
expect(hostname.port).toBeUndefined();
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test("drops userinfo and keeps host and port", () => {
|
|
105
|
+
const hostname: Hostname = Hostname.fromAuthority(
|
|
106
|
+
"user:token@example.com:8443",
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
expect(hostname.hostname).toBe("example.com");
|
|
110
|
+
expect(hostname.port?.toNumber()).toBe(8443);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("splits on the LAST @, since userinfo may contain one", () => {
|
|
114
|
+
const hostname: Hostname = Hostname.fromAuthority(
|
|
115
|
+
"user@name:token@example.com:8443",
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
expect(hostname.hostname).toBe("example.com");
|
|
119
|
+
expect(hostname.port?.toNumber()).toBe(8443);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe("malformed input", () => {
|
|
124
|
+
test("an empty authority yields an empty hostname rather than throwing", () => {
|
|
125
|
+
expect(Hostname.fromAuthority("").hostname).toBe("");
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test("a trailing colon with no digits is not treated as a port", () => {
|
|
129
|
+
const hostname: Hostname = Hostname.fromAuthority("example.com:");
|
|
130
|
+
|
|
131
|
+
expect(hostname.hostname).toBe("example.com");
|
|
132
|
+
expect(hostname.port).toBeUndefined();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("surrounding whitespace is trimmed", () => {
|
|
136
|
+
const hostname: Hostname = Hostname.fromAuthority(" example.com:443 ");
|
|
137
|
+
|
|
138
|
+
expect(hostname.hostname).toBe("example.com");
|
|
139
|
+
expect(hostname.port?.toNumber()).toBe(443);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
describe("contrast with fromString", () => {
|
|
144
|
+
test("fromString rejects an IPv6 literal that fromAuthority handles", () => {
|
|
145
|
+
/*
|
|
146
|
+
* Pinned deliberately: it documents WHY fromAuthority exists, and
|
|
147
|
+
* guards against someone 'simplifying' one into the other.
|
|
148
|
+
*
|
|
149
|
+
* fromString splits on the FIRST colon, so "[::1]:8443" becomes a
|
|
150
|
+
* host of "[" - which the Hostname setter rejects outright.
|
|
151
|
+
*/
|
|
152
|
+
expect(Hostname.fromAuthority("[::1]:8443").hostname).toBe("[::1]");
|
|
153
|
+
expect(() => {
|
|
154
|
+
return Hostname.fromString("[::1]:8443");
|
|
155
|
+
}).toThrow();
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test("both agree on the simple host:port case", () => {
|
|
159
|
+
expect(Hostname.fromAuthority("example.com:8443").hostname).toBe(
|
|
160
|
+
Hostname.fromString("example.com:8443").hostname,
|
|
161
|
+
);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import AutoRemediationSuggestionStatus, {
|
|
2
|
+
AutoRemediationSuggestionStatusHelper,
|
|
3
|
+
} from "../../../Types/AutoRemediation/AutoRemediationSuggestionStatus";
|
|
4
|
+
import { describe, expect, test } from "@jest/globals";
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* Contract under test — the lifecycle vocabulary of an auto-remediation
|
|
8
|
+
* suggestion and the single predicate that splits it into terminal vs open.
|
|
9
|
+
*
|
|
10
|
+
* A suggestion is the approvable action object a matched rule attaches to an
|
|
11
|
+
* incident or alert. isTerminalStatus draws the line between states that can
|
|
12
|
+
* still be actioned (Planning, Suggested — a human or the executor may yet
|
|
13
|
+
* move them) and states that are frozen for good (Approved, AutoExecuted,
|
|
14
|
+
* Dismissed, NoneApplicable). Anything downstream that decides whether to show
|
|
15
|
+
* an approve/dismiss control, re-run planning, or leave a suggestion alone
|
|
16
|
+
* relies on this partition being exact — every status classified, none in both
|
|
17
|
+
* halves.
|
|
18
|
+
*
|
|
19
|
+
* The enum is string-valued, so the wire/DB representation of each member is
|
|
20
|
+
* itself part of the contract: renaming a value would silently orphan rows
|
|
21
|
+
* persisted under the old string. These tests pin both the string values and
|
|
22
|
+
* the terminal/open classification.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
* The two open (non-terminal) states — still actionable.
|
|
27
|
+
*/
|
|
28
|
+
const OPEN_STATUSES: Array<AutoRemediationSuggestionStatus> = [
|
|
29
|
+
AutoRemediationSuggestionStatus.Planning,
|
|
30
|
+
AutoRemediationSuggestionStatus.Suggested,
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
/*
|
|
34
|
+
* The four terminal states — frozen, never change again.
|
|
35
|
+
*/
|
|
36
|
+
const TERMINAL_STATUSES: Array<AutoRemediationSuggestionStatus> = [
|
|
37
|
+
AutoRemediationSuggestionStatus.Approved,
|
|
38
|
+
AutoRemediationSuggestionStatus.AutoExecuted,
|
|
39
|
+
AutoRemediationSuggestionStatus.Dismissed,
|
|
40
|
+
AutoRemediationSuggestionStatus.NoneApplicable,
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
describe("AutoRemediationSuggestionStatus enum", () => {
|
|
44
|
+
test("each member's string value matches its name", () => {
|
|
45
|
+
expect(AutoRemediationSuggestionStatus.Planning).toBe("Planning");
|
|
46
|
+
expect(AutoRemediationSuggestionStatus.Suggested).toBe("Suggested");
|
|
47
|
+
expect(AutoRemediationSuggestionStatus.Approved).toBe("Approved");
|
|
48
|
+
expect(AutoRemediationSuggestionStatus.AutoExecuted).toBe("AutoExecuted");
|
|
49
|
+
expect(AutoRemediationSuggestionStatus.Dismissed).toBe("Dismissed");
|
|
50
|
+
expect(AutoRemediationSuggestionStatus.NoneApplicable).toBe(
|
|
51
|
+
"NoneApplicable",
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("declares exactly six members and no extras", () => {
|
|
56
|
+
const values: Array<string> = Object.values(
|
|
57
|
+
AutoRemediationSuggestionStatus,
|
|
58
|
+
);
|
|
59
|
+
expect(values).toHaveLength(6);
|
|
60
|
+
expect(values.slice().sort()).toEqual(
|
|
61
|
+
[
|
|
62
|
+
"Approved",
|
|
63
|
+
"AutoExecuted",
|
|
64
|
+
"Dismissed",
|
|
65
|
+
"NoneApplicable",
|
|
66
|
+
"Planning",
|
|
67
|
+
"Suggested",
|
|
68
|
+
].sort(),
|
|
69
|
+
);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("all member string values are unique", () => {
|
|
73
|
+
const values: Array<string> = Object.values(
|
|
74
|
+
AutoRemediationSuggestionStatus,
|
|
75
|
+
);
|
|
76
|
+
const unique: Set<string> = new Set(values);
|
|
77
|
+
expect(unique.size).toBe(values.length);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe("AutoRemediationSuggestionStatusHelper.isTerminalStatus", () => {
|
|
82
|
+
test.each(TERMINAL_STATUSES)(
|
|
83
|
+
"returns true for terminal status %s",
|
|
84
|
+
(status: AutoRemediationSuggestionStatus) => {
|
|
85
|
+
expect(
|
|
86
|
+
AutoRemediationSuggestionStatusHelper.isTerminalStatus(status),
|
|
87
|
+
).toBe(true);
|
|
88
|
+
},
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
test.each(OPEN_STATUSES)(
|
|
92
|
+
"returns false for open status %s",
|
|
93
|
+
(status: AutoRemediationSuggestionStatus) => {
|
|
94
|
+
expect(
|
|
95
|
+
AutoRemediationSuggestionStatusHelper.isTerminalStatus(status),
|
|
96
|
+
).toBe(false);
|
|
97
|
+
},
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
test("terminal and open sets together cover every enum member with no overlap", () => {
|
|
101
|
+
const allStatuses: Array<AutoRemediationSuggestionStatus> = Object.values(
|
|
102
|
+
AutoRemediationSuggestionStatus,
|
|
103
|
+
);
|
|
104
|
+
const partitioned: Array<AutoRemediationSuggestionStatus> = [
|
|
105
|
+
...TERMINAL_STATUSES,
|
|
106
|
+
...OPEN_STATUSES,
|
|
107
|
+
];
|
|
108
|
+
|
|
109
|
+
/*
|
|
110
|
+
* No status appears in both halves.
|
|
111
|
+
*/
|
|
112
|
+
expect(new Set(partitioned).size).toBe(partitioned.length);
|
|
113
|
+
|
|
114
|
+
/*
|
|
115
|
+
* Every enum member lands in exactly one half.
|
|
116
|
+
*/
|
|
117
|
+
expect(partitioned.slice().sort()).toEqual(allStatuses.slice().sort());
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test("classifies every enum member without leaving any unclassified", () => {
|
|
121
|
+
const allStatuses: Array<AutoRemediationSuggestionStatus> = Object.values(
|
|
122
|
+
AutoRemediationSuggestionStatus,
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
for (const status of allStatuses) {
|
|
126
|
+
const isTerminal: boolean =
|
|
127
|
+
AutoRemediationSuggestionStatusHelper.isTerminalStatus(status);
|
|
128
|
+
const expectedTerminal: boolean = TERMINAL_STATUSES.includes(status);
|
|
129
|
+
expect(isTerminal).toBe(expectedTerminal);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test("is a pure predicate — repeated calls yield the same result", () => {
|
|
134
|
+
for (const status of Object.values(AutoRemediationSuggestionStatus)) {
|
|
135
|
+
const first: boolean =
|
|
136
|
+
AutoRemediationSuggestionStatusHelper.isTerminalStatus(status);
|
|
137
|
+
const second: boolean =
|
|
138
|
+
AutoRemediationSuggestionStatusHelper.isTerminalStatus(status);
|
|
139
|
+
expect(second).toBe(first);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test("returns exactly a boolean, never a truthy/falsy proxy", () => {
|
|
144
|
+
const terminalResult: boolean =
|
|
145
|
+
AutoRemediationSuggestionStatusHelper.isTerminalStatus(
|
|
146
|
+
AutoRemediationSuggestionStatus.Approved,
|
|
147
|
+
);
|
|
148
|
+
const openResult: boolean =
|
|
149
|
+
AutoRemediationSuggestionStatusHelper.isTerminalStatus(
|
|
150
|
+
AutoRemediationSuggestionStatus.Planning,
|
|
151
|
+
);
|
|
152
|
+
expect(typeof terminalResult).toBe("boolean");
|
|
153
|
+
expect(typeof openResult).toBe("boolean");
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test("matches the raw string value of each member (DB/wire representation)", () => {
|
|
157
|
+
/*
|
|
158
|
+
* The enum is string-backed, so a persisted row carries the string, not the
|
|
159
|
+
* TS enum reference. Passing the equivalent raw string must classify the
|
|
160
|
+
* same way — guarding against a future rename that would strand old rows.
|
|
161
|
+
*/
|
|
162
|
+
expect(
|
|
163
|
+
AutoRemediationSuggestionStatusHelper.isTerminalStatus(
|
|
164
|
+
"Dismissed" as AutoRemediationSuggestionStatus,
|
|
165
|
+
),
|
|
166
|
+
).toBe(true);
|
|
167
|
+
expect(
|
|
168
|
+
AutoRemediationSuggestionStatusHelper.isTerminalStatus(
|
|
169
|
+
"Suggested" as AutoRemediationSuggestionStatus,
|
|
170
|
+
),
|
|
171
|
+
).toBe(false);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test("treats an unknown status as non-terminal (no false freeze)", () => {
|
|
175
|
+
/*
|
|
176
|
+
* Defensive edge: a value outside the enum (legacy or corrupt data) is not
|
|
177
|
+
* one of the four terminal constants, so the predicate reports false. That
|
|
178
|
+
* keeps an unrecognized suggestion open/actionable rather than silently
|
|
179
|
+
* frozen.
|
|
180
|
+
*/
|
|
181
|
+
expect(
|
|
182
|
+
AutoRemediationSuggestionStatusHelper.isTerminalStatus(
|
|
183
|
+
"SomethingElse" as AutoRemediationSuggestionStatus,
|
|
184
|
+
),
|
|
185
|
+
).toBe(false);
|
|
186
|
+
expect(
|
|
187
|
+
AutoRemediationSuggestionStatusHelper.isTerminalStatus(
|
|
188
|
+
"" as AutoRemediationSuggestionStatus,
|
|
189
|
+
),
|
|
190
|
+
).toBe(false);
|
|
191
|
+
});
|
|
192
|
+
});
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import Phone from "../../../Types/Phone";
|
|
2
|
+
import { isHighRiskPhoneNumber } from "../../../Types/Call/CallRequest";
|
|
3
|
+
import { describe, expect, test } from "@jest/globals";
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* isHighRiskPhoneNumber(phone) stringifies the Phone and returns true when the
|
|
7
|
+
* resulting string starts with any of a fixed set of high-risk country dialing
|
|
8
|
+
* codes. The matching is a plain String.prototype.startsWith over the raw
|
|
9
|
+
* value, so behavior hinges on: the exact leading characters (including the
|
|
10
|
+
* "+"), the ordering-independent "some" scan, and the boundary between a real
|
|
11
|
+
* code and a number that merely shares leading digits with one.
|
|
12
|
+
*
|
|
13
|
+
* These tests exercise the real branches: every high-risk code (true path),
|
|
14
|
+
* ordinary countries (false path), near-miss prefixes that share leading digits
|
|
15
|
+
* but are not a code, the required leading "+", formatting/length boundaries,
|
|
16
|
+
* and copy-constructed Phone objects.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* The exact high-risk set encoded in CallRequest.ts. Kept as a local literal so
|
|
21
|
+
* the test asserts against a known expectation rather than re-importing the
|
|
22
|
+
* private constant.
|
|
23
|
+
*/
|
|
24
|
+
const HIGH_RISK_DIALING_CODES: Array<string> = [
|
|
25
|
+
"+92",
|
|
26
|
+
"+27",
|
|
27
|
+
"+213",
|
|
28
|
+
"+371",
|
|
29
|
+
"+370",
|
|
30
|
+
"+372",
|
|
31
|
+
"+252",
|
|
32
|
+
"+232",
|
|
33
|
+
"+231",
|
|
34
|
+
"+53",
|
|
35
|
+
"+960",
|
|
36
|
+
"+992",
|
|
37
|
+
"+880",
|
|
38
|
+
"+62",
|
|
39
|
+
"+84",
|
|
40
|
+
"+95",
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
type MakeValidNumberFunction = (dialingCode: string) => string;
|
|
44
|
+
|
|
45
|
+
/*
|
|
46
|
+
* Build a phone string that starts with the given dialing code and satisfies
|
|
47
|
+
* Phone's constructor regex (3 digits, 3 digits, then 4-7 digits => 10-13 total
|
|
48
|
+
* digits). Padding with zeros to 12 total digits keeps every generated number
|
|
49
|
+
* inside the valid range regardless of whether the code has 2 or 3 digits.
|
|
50
|
+
*/
|
|
51
|
+
const makeValidNumber: MakeValidNumberFunction = (
|
|
52
|
+
dialingCode: string,
|
|
53
|
+
): string => {
|
|
54
|
+
const digits: string = dialingCode.replace("+", "");
|
|
55
|
+
const padding: string = "0000000000000".substring(0, 12 - digits.length);
|
|
56
|
+
return "+" + digits + padding;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
describe("isHighRiskPhoneNumber flags every high-risk dialing code", () => {
|
|
60
|
+
test.each(HIGH_RISK_DIALING_CODES)(
|
|
61
|
+
"flags a number starting with %s",
|
|
62
|
+
(dialingCode: string) => {
|
|
63
|
+
const phone: Phone = new Phone(makeValidNumber(dialingCode));
|
|
64
|
+
expect(isHighRiskPhoneNumber(phone)).toBe(true);
|
|
65
|
+
},
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
test("flags Tajikistan (+992) on its own three-digit code, not via +92", () => {
|
|
69
|
+
/*
|
|
70
|
+
* +992 does not start with +92, so it can only be flagged by its own
|
|
71
|
+
* three-digit entry. This guards against a regression where only the
|
|
72
|
+
* shorter code were present.
|
|
73
|
+
*/
|
|
74
|
+
const phone: Phone = new Phone(makeValidNumber("+992"));
|
|
75
|
+
expect(phone.toString().startsWith("+92")).toBe(false);
|
|
76
|
+
expect(isHighRiskPhoneNumber(phone)).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe("isHighRiskPhoneNumber does not flag ordinary / low-risk countries", () => {
|
|
81
|
+
const lowRiskNumbers: Array<string> = [
|
|
82
|
+
"+15551234567", // United States / Canada (+1)
|
|
83
|
+
"+442071234567", // United Kingdom (+44)
|
|
84
|
+
"+491234567890", // Germany (+49)
|
|
85
|
+
"+611234567890", // Australia (+61)
|
|
86
|
+
"+331234567890", // France (+33)
|
|
87
|
+
"+811234567890", // Japan (+81)
|
|
88
|
+
"+861234567890", // China (+86)
|
|
89
|
+
"+551234567890", // Brazil (+55)
|
|
90
|
+
"+521234567890", // Mexico (+52) sits right next to Cuba (+53)
|
|
91
|
+
"+919876543210", // India (+91) sits right next to Pakistan (+92)
|
|
92
|
+
];
|
|
93
|
+
|
|
94
|
+
test.each(lowRiskNumbers)("does not flag %s", (phoneNumber: string) => {
|
|
95
|
+
const phone: Phone = new Phone(phoneNumber);
|
|
96
|
+
expect(isHighRiskPhoneNumber(phone)).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
describe("near-miss prefixes that only share leading digits are not flagged", () => {
|
|
101
|
+
/*
|
|
102
|
+
* Each entry starts with the same first digits as a real high-risk code but
|
|
103
|
+
* diverges before the full code, so startsWith must return false. This is the
|
|
104
|
+
* key discriminating branch: matching is prefix-exact, not "close enough".
|
|
105
|
+
*/
|
|
106
|
+
const nearMisses: Array<[string, string]> = [
|
|
107
|
+
["+254123456789", "Kenya (+254) vs Somalia (+252)"],
|
|
108
|
+
["+994123456789", "Azerbaijan (+994) vs Tajikistan (+992)"],
|
|
109
|
+
["+886123456789", "Taiwan (+886) vs Bangladesh (+880)"],
|
|
110
|
+
[
|
|
111
|
+
"+373123456789",
|
|
112
|
+
"Moldova (+373) vs Latvia/Lithuania/Estonia (+371/+370/+372)",
|
|
113
|
+
],
|
|
114
|
+
["+919876543210", "India (+91) vs Pakistan (+92)"],
|
|
115
|
+
["+521234567890", "Mexico (+52) vs Cuba (+53)"],
|
|
116
|
+
];
|
|
117
|
+
|
|
118
|
+
test.each(nearMisses)("does not flag %s", (phoneNumber: string) => {
|
|
119
|
+
const phone: Phone = new Phone(phoneNumber);
|
|
120
|
+
expect(isHighRiskPhoneNumber(phone)).toBe(false);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe("the leading + is part of the match", () => {
|
|
125
|
+
test("a high-risk number without the leading + is not flagged", () => {
|
|
126
|
+
/*
|
|
127
|
+
* The stored value is exactly what the caller passed. Without the "+", the
|
|
128
|
+
* string is "920000000000", which does not start with "+92".
|
|
129
|
+
*/
|
|
130
|
+
const phone: Phone = new Phone("920000000000");
|
|
131
|
+
expect(phone.toString().startsWith("+")).toBe(false);
|
|
132
|
+
expect(isHighRiskPhoneNumber(phone)).toBe(false);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("the same digits with the leading + are flagged", () => {
|
|
136
|
+
const phone: Phone = new Phone("+920000000000");
|
|
137
|
+
expect(isHighRiskPhoneNumber(phone)).toBe(true);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
describe("formatting and length boundaries", () => {
|
|
142
|
+
test("flags a high-risk number written with separators after the code", () => {
|
|
143
|
+
/*
|
|
144
|
+
* "+232-123-4567" is a valid Phone (3 digits, sep, 3 digits, sep, 4 digits)
|
|
145
|
+
* whose string still starts with the Sierra Leone code "+232".
|
|
146
|
+
*/
|
|
147
|
+
const phone: Phone = new Phone("+232-123-4567");
|
|
148
|
+
expect(isHighRiskPhoneNumber(phone)).toBe(true);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test("flags the shortest valid high-risk number (10 digits)", () => {
|
|
152
|
+
const phone: Phone = new Phone("+9200000000");
|
|
153
|
+
expect(isHighRiskPhoneNumber(phone)).toBe(true);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test("flags the longest valid high-risk number (13 digits)", () => {
|
|
157
|
+
const phone: Phone = new Phone("+9200000000000");
|
|
158
|
+
expect(isHighRiskPhoneNumber(phone)).toBe(true);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
describe("Phone construction variants are evaluated identically", () => {
|
|
163
|
+
test("a Phone copy-constructed from another Phone is still flagged", () => {
|
|
164
|
+
const original: Phone = new Phone("+920000000000");
|
|
165
|
+
const copy: Phone = new Phone(original);
|
|
166
|
+
expect(copy.toString()).toEqual(original.toString());
|
|
167
|
+
expect(isHighRiskPhoneNumber(copy)).toBe(true);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
test("mutating a Phone to a high-risk value changes the result", () => {
|
|
171
|
+
const phone: Phone = new Phone("+15551234567");
|
|
172
|
+
expect(isHighRiskPhoneNumber(phone)).toBe(false);
|
|
173
|
+
phone.phone = "+840000000000";
|
|
174
|
+
expect(isHighRiskPhoneNumber(phone)).toBe(true);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
describe("return value contract", () => {
|
|
179
|
+
test("always returns a strict boolean", () => {
|
|
180
|
+
const flagged: boolean = isHighRiskPhoneNumber(new Phone("+920000000000"));
|
|
181
|
+
const notFlagged: boolean = isHighRiskPhoneNumber(
|
|
182
|
+
new Phone("+15551234567"),
|
|
183
|
+
);
|
|
184
|
+
expect(typeof flagged).toBe("boolean");
|
|
185
|
+
expect(typeof notFlagged).toBe("boolean");
|
|
186
|
+
expect(flagged).toBe(true);
|
|
187
|
+
expect(notFlagged).toBe(false);
|
|
188
|
+
});
|
|
189
|
+
});
|