@oneuptime/common 12.0.13 → 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/OnCallDutyPolicySchedule.ts +14 -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/Server/API/BaseAPI.ts +79 -14
- 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/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/DatabaseService.ts +101 -0
- package/Server/Services/LogAggregationService.ts +5 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/TeamMemberService.ts +53 -13
- 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/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- 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 +28 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -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/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -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/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/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/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/TestingUtils/AuthenticatorApp.ts +248 -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/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/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/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/MonitorStepResourceIdentity.test.ts +690 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -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/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/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/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/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- 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/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/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- 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/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- 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/Feed/FeedItem.tsx +1 -1
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- 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/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.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/Server/API/BaseAPI.js +69 -13
- package/build/dist/Server/API/BaseAPI.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/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 +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.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/DatabaseService.js +74 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +5 -0
- package/build/dist/Server/Services/LogAggregationService.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/TeamMemberService.js +43 -7
- package/build/dist/Server/Services/TeamMemberService.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/Types/Database/QueryHelper.js +27 -0
- package/build/dist/Server/Types/Database/QueryHelper.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/ChannelVerification.js +348 -0
- package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
- 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/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/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/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/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/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.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/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/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/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/Feed/FeedItem.js +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.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/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/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/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
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ONEUPTIME_LABEL_ATTRIBUTE_PREFIX,
|
|
3
|
+
extractOneuptimeLabelNames,
|
|
4
|
+
} from "../../../../Server/Utils/Telemetry/OneuptimeLabel";
|
|
5
|
+
import { JSONArray, JSONObject } from "../../../../Types/JSON";
|
|
6
|
+
import { describe, expect, test } from "@jest/globals";
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* extractOneuptimeLabelNames walks a list of OTel resource attributes and
|
|
10
|
+
* turns any key prefixed with `oneuptime.label.` into a `<dimension>:<value>`
|
|
11
|
+
* label name. The function is pure — it only reaches into the JSON attribute
|
|
12
|
+
* shape — so every case here is a plain input/output assertion with no
|
|
13
|
+
* network, DB, clock, or randomness involved.
|
|
14
|
+
*
|
|
15
|
+
* The OTel attribute shape the function reads is:
|
|
16
|
+
* { key: "oneuptime.label.team", value: { stringValue: "payments" } }
|
|
17
|
+
* The two builders below construct exactly that shape so the intent of each
|
|
18
|
+
* test stays readable, while deliberately-malformed cases are spelled out
|
|
19
|
+
* inline with explicit casts.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/*
|
|
23
|
+
* MAX_LABEL_NAME_LENGTH is a private const in the source (not exported). The
|
|
24
|
+
* tests reference the literal 100 through this local so the boundary cases
|
|
25
|
+
* read clearly and stay in one place; it mirrors the source constant.
|
|
26
|
+
*/
|
|
27
|
+
const MAX_LABEL_NAME_LENGTH: number = 100;
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* Build a well-formed OTel string attribute whose key already carries the
|
|
31
|
+
* `oneuptime.label.` prefix. `dimension` is the part after the prefix.
|
|
32
|
+
*/
|
|
33
|
+
function labelAttribute(dimension: string, stringValue: string): JSONObject {
|
|
34
|
+
return {
|
|
35
|
+
key: `${ONEUPTIME_LABEL_ATTRIBUTE_PREFIX}${dimension}`,
|
|
36
|
+
value: { stringValue: stringValue },
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/*
|
|
41
|
+
* Build an attribute with a fully explicit key (no prefix helper), used for
|
|
42
|
+
* the prefix-matching cases where the raw key string is the thing under test.
|
|
43
|
+
*/
|
|
44
|
+
function rawAttribute(key: string, stringValue: string): JSONObject {
|
|
45
|
+
return {
|
|
46
|
+
key: key,
|
|
47
|
+
value: { stringValue: stringValue },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
describe("extractOneuptimeLabelNames", () => {
|
|
52
|
+
describe("the exported prefix constant", () => {
|
|
53
|
+
test("is the documented `oneuptime.label.` string with a trailing dot", () => {
|
|
54
|
+
expect(ONEUPTIME_LABEL_ATTRIBUTE_PREFIX).toBe("oneuptime.label.");
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("guard clauses / non-iterable inputs return an empty array", () => {
|
|
59
|
+
test("undefined input returns []", () => {
|
|
60
|
+
expect(extractOneuptimeLabelNames(undefined)).toEqual([]);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("null input returns [] (defensive: type says JSONArray, runtime may differ)", () => {
|
|
64
|
+
const nullInput: JSONArray = null as unknown as JSONArray;
|
|
65
|
+
|
|
66
|
+
expect(extractOneuptimeLabelNames(nullInput)).toEqual([]);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("a non-array value returns [] via the Array.isArray guard", () => {
|
|
70
|
+
const objectInput: JSONArray = {
|
|
71
|
+
key: `${ONEUPTIME_LABEL_ATTRIBUTE_PREFIX}team`,
|
|
72
|
+
} as unknown as JSONArray;
|
|
73
|
+
|
|
74
|
+
expect(extractOneuptimeLabelNames(objectInput)).toEqual([]);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("an empty array returns []", () => {
|
|
78
|
+
expect(extractOneuptimeLabelNames([])).toEqual([]);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe("happy path", () => {
|
|
83
|
+
test("a single labelled attribute becomes `<dimension>:<value>`", () => {
|
|
84
|
+
const attributes: JSONArray = [labelAttribute("team", "payments")];
|
|
85
|
+
|
|
86
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual(["team:payments"]);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("a dimension containing dots is preserved verbatim", () => {
|
|
90
|
+
const attributes: JSONArray = [labelAttribute("team.env", "prod")];
|
|
91
|
+
|
|
92
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual(["team.env:prod"]);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("multiple labelled attributes are returned in first-seen order", () => {
|
|
96
|
+
const attributes: JSONArray = [
|
|
97
|
+
labelAttribute("team", "payments"),
|
|
98
|
+
labelAttribute("env", "prod"),
|
|
99
|
+
labelAttribute("region", "us-east"),
|
|
100
|
+
];
|
|
101
|
+
|
|
102
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([
|
|
103
|
+
"team:payments",
|
|
104
|
+
"env:prod",
|
|
105
|
+
"region:us-east",
|
|
106
|
+
]);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test("a numeric-looking string value is kept as a string label", () => {
|
|
110
|
+
const attributes: JSONArray = [labelAttribute("tier", "123")];
|
|
111
|
+
|
|
112
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual(["tier:123"]);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
describe("prefix matching", () => {
|
|
117
|
+
test("keys without the prefix are skipped", () => {
|
|
118
|
+
const attributes: JSONArray = [
|
|
119
|
+
rawAttribute("service.name", "checkout"),
|
|
120
|
+
rawAttribute("host.name", "node-1"),
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test("the prefix must be at the START — an embedded prefix does not match", () => {
|
|
127
|
+
const attributes: JSONArray = [
|
|
128
|
+
rawAttribute(
|
|
129
|
+
`resource.${ONEUPTIME_LABEL_ATTRIBUTE_PREFIX}team`,
|
|
130
|
+
"payments",
|
|
131
|
+
),
|
|
132
|
+
];
|
|
133
|
+
|
|
134
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test("prefix matching is case-sensitive", () => {
|
|
138
|
+
const attributes: JSONArray = [
|
|
139
|
+
rawAttribute("ONEUPTIME.LABEL.team", "payments"),
|
|
140
|
+
];
|
|
141
|
+
|
|
142
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("the prefix without its trailing dot is not a match", () => {
|
|
146
|
+
const attributes: JSONArray = [rawAttribute("oneuptime.label", "team")];
|
|
147
|
+
|
|
148
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test("a key equal to the bare prefix yields an empty dimension and is skipped", () => {
|
|
152
|
+
const attributes: JSONArray = [
|
|
153
|
+
rawAttribute(ONEUPTIME_LABEL_ATTRIBUTE_PREFIX, "payments"),
|
|
154
|
+
];
|
|
155
|
+
|
|
156
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("a dimension that is pure whitespace is skipped after trimming", () => {
|
|
160
|
+
const attributes: JSONArray = [labelAttribute(" ", "payments")];
|
|
161
|
+
|
|
162
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test("surrounding whitespace on the dimension is trimmed away", () => {
|
|
166
|
+
const attributes: JSONArray = [labelAttribute(" team ", "payments")];
|
|
167
|
+
|
|
168
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual(["team:payments"]);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe("key type guard", () => {
|
|
173
|
+
test("a non-string key (number) is skipped", () => {
|
|
174
|
+
const attributes: JSONArray = [
|
|
175
|
+
{
|
|
176
|
+
key: 42,
|
|
177
|
+
value: { stringValue: "payments" },
|
|
178
|
+
} as unknown as JSONObject,
|
|
179
|
+
];
|
|
180
|
+
|
|
181
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test("a missing key is skipped", () => {
|
|
185
|
+
const attributes: JSONArray = [
|
|
186
|
+
{ value: { stringValue: "payments" } } as unknown as JSONObject,
|
|
187
|
+
];
|
|
188
|
+
|
|
189
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test("a null key is skipped (typeof null is not 'string')", () => {
|
|
193
|
+
const attributes: JSONArray = [
|
|
194
|
+
{
|
|
195
|
+
key: null,
|
|
196
|
+
value: { stringValue: "payments" },
|
|
197
|
+
} as unknown as JSONObject,
|
|
198
|
+
];
|
|
199
|
+
|
|
200
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test("a null attribute element is coerced to {} and skipped", () => {
|
|
204
|
+
const attributes: JSONArray = [
|
|
205
|
+
null as unknown as JSONObject,
|
|
206
|
+
labelAttribute("team", "payments"),
|
|
207
|
+
];
|
|
208
|
+
|
|
209
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual(["team:payments"]);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
describe("value extraction", () => {
|
|
214
|
+
test("a missing value wrapper is skipped", () => {
|
|
215
|
+
const attributes: JSONArray = [
|
|
216
|
+
{
|
|
217
|
+
key: `${ONEUPTIME_LABEL_ATTRIBUTE_PREFIX}team`,
|
|
218
|
+
} as unknown as JSONObject,
|
|
219
|
+
];
|
|
220
|
+
|
|
221
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
test("a non-string stringValue (number) is skipped", () => {
|
|
225
|
+
const attributes: JSONArray = [
|
|
226
|
+
{
|
|
227
|
+
key: `${ONEUPTIME_LABEL_ATTRIBUTE_PREFIX}team`,
|
|
228
|
+
value: { stringValue: 5 },
|
|
229
|
+
} as unknown as JSONObject,
|
|
230
|
+
];
|
|
231
|
+
|
|
232
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
test("a null stringValue is skipped", () => {
|
|
236
|
+
const attributes: JSONArray = [
|
|
237
|
+
{
|
|
238
|
+
key: `${ONEUPTIME_LABEL_ATTRIBUTE_PREFIX}team`,
|
|
239
|
+
value: { stringValue: null },
|
|
240
|
+
} as unknown as JSONObject,
|
|
241
|
+
];
|
|
242
|
+
|
|
243
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
test("an OTel intValue (no stringValue) does not become a label", () => {
|
|
247
|
+
const attributes: JSONArray = [
|
|
248
|
+
{
|
|
249
|
+
key: `${ONEUPTIME_LABEL_ATTRIBUTE_PREFIX}count`,
|
|
250
|
+
value: { intValue: 7 },
|
|
251
|
+
} as unknown as JSONObject,
|
|
252
|
+
];
|
|
253
|
+
|
|
254
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test("a raw (non-wrapped) string value is skipped — only the OTel stringValue shape counts", () => {
|
|
258
|
+
const attributes: JSONArray = [
|
|
259
|
+
{
|
|
260
|
+
key: `${ONEUPTIME_LABEL_ATTRIBUTE_PREFIX}team`,
|
|
261
|
+
value: "payments",
|
|
262
|
+
} as unknown as JSONObject,
|
|
263
|
+
];
|
|
264
|
+
|
|
265
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
test("an empty-string value is skipped", () => {
|
|
269
|
+
const attributes: JSONArray = [labelAttribute("team", "")];
|
|
270
|
+
|
|
271
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
test("a whitespace-only value is skipped after trimming", () => {
|
|
275
|
+
const attributes: JSONArray = [labelAttribute("team", " \t ")];
|
|
276
|
+
|
|
277
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([]);
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
test("surrounding whitespace on the value is trimmed away", () => {
|
|
281
|
+
const attributes: JSONArray = [labelAttribute("team", " payments ")];
|
|
282
|
+
|
|
283
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual(["team:payments"]);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test("internal whitespace inside the value is preserved", () => {
|
|
287
|
+
const attributes: JSONArray = [labelAttribute("team", "pay ments")];
|
|
288
|
+
|
|
289
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([
|
|
290
|
+
"team:pay ments",
|
|
291
|
+
]);
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
describe("label-name identity / no collapsing across dimensions", () => {
|
|
296
|
+
test("same value under different dimensions produces two distinct labels", () => {
|
|
297
|
+
const attributes: JSONArray = [
|
|
298
|
+
labelAttribute("team", "prod"),
|
|
299
|
+
labelAttribute("env", "prod"),
|
|
300
|
+
];
|
|
301
|
+
|
|
302
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([
|
|
303
|
+
"team:prod",
|
|
304
|
+
"env:prod",
|
|
305
|
+
]);
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
describe("deduplication", () => {
|
|
310
|
+
test("two identical attributes collapse to a single label", () => {
|
|
311
|
+
const attributes: JSONArray = [
|
|
312
|
+
labelAttribute("team", "payments"),
|
|
313
|
+
labelAttribute("team", "payments"),
|
|
314
|
+
];
|
|
315
|
+
|
|
316
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual(["team:payments"]);
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
test("dedup keeps the first occurrence's position in the result order", () => {
|
|
320
|
+
const attributes: JSONArray = [
|
|
321
|
+
labelAttribute("team", "payments"),
|
|
322
|
+
labelAttribute("env", "prod"),
|
|
323
|
+
labelAttribute("team", "payments"),
|
|
324
|
+
];
|
|
325
|
+
|
|
326
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([
|
|
327
|
+
"team:payments",
|
|
328
|
+
"env:prod",
|
|
329
|
+
]);
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
describe("length cap / truncation at MAX_LABEL_NAME_LENGTH", () => {
|
|
334
|
+
test("a label exactly MAX_LABEL_NAME_LENGTH long is kept whole", () => {
|
|
335
|
+
/*
|
|
336
|
+
* "team:" is 5 chars, so a 95-char value yields a 100-char label — the
|
|
337
|
+
* boundary is `> MAX`, so exactly 100 must NOT be truncated.
|
|
338
|
+
*/
|
|
339
|
+
const value: string = "a".repeat(MAX_LABEL_NAME_LENGTH - "team:".length);
|
|
340
|
+
const attributes: JSONArray = [labelAttribute("team", value)];
|
|
341
|
+
|
|
342
|
+
const result: Array<string> = extractOneuptimeLabelNames(attributes);
|
|
343
|
+
|
|
344
|
+
expect(result).toHaveLength(1);
|
|
345
|
+
expect(result[0]).toHaveLength(MAX_LABEL_NAME_LENGTH);
|
|
346
|
+
expect(result[0]).toBe(`team:${value}`);
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
test("a label one over the cap is truncated to exactly MAX_LABEL_NAME_LENGTH", () => {
|
|
350
|
+
const value: string = "a".repeat(
|
|
351
|
+
MAX_LABEL_NAME_LENGTH - "team:".length + 1,
|
|
352
|
+
);
|
|
353
|
+
const attributes: JSONArray = [labelAttribute("team", value)];
|
|
354
|
+
|
|
355
|
+
const result: Array<string> = extractOneuptimeLabelNames(attributes);
|
|
356
|
+
|
|
357
|
+
expect(result).toHaveLength(1);
|
|
358
|
+
expect(result[0]).toHaveLength(MAX_LABEL_NAME_LENGTH);
|
|
359
|
+
expect(result[0]).toBe(
|
|
360
|
+
`team:${value}`.substring(0, MAX_LABEL_NAME_LENGTH),
|
|
361
|
+
);
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
test("truncation can make two distinct long values collide into one label", () => {
|
|
365
|
+
/*
|
|
366
|
+
* Both labels share their first MAX_LABEL_NAME_LENGTH characters
|
|
367
|
+
* ("team:" + 95 'a's) and only differ afterwards, so the cap makes them
|
|
368
|
+
* identical and the Set collapses them to a single entry.
|
|
369
|
+
*/
|
|
370
|
+
const sharedPrefix: string = "a".repeat(
|
|
371
|
+
MAX_LABEL_NAME_LENGTH - "team:".length,
|
|
372
|
+
);
|
|
373
|
+
const attributes: JSONArray = [
|
|
374
|
+
labelAttribute("team", `${sharedPrefix}${"b".repeat(20)}`),
|
|
375
|
+
labelAttribute("team", `${sharedPrefix}${"c".repeat(20)}`),
|
|
376
|
+
];
|
|
377
|
+
|
|
378
|
+
const result: Array<string> = extractOneuptimeLabelNames(attributes);
|
|
379
|
+
|
|
380
|
+
expect(result).toEqual([`team:${sharedPrefix}`]);
|
|
381
|
+
expect(result[0]).toHaveLength(MAX_LABEL_NAME_LENGTH);
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
test("distinct short values that fit under the cap are NOT collapsed", () => {
|
|
385
|
+
const attributes: JSONArray = [
|
|
386
|
+
labelAttribute("team", "payments"),
|
|
387
|
+
labelAttribute("team", "billing"),
|
|
388
|
+
];
|
|
389
|
+
|
|
390
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([
|
|
391
|
+
"team:payments",
|
|
392
|
+
"team:billing",
|
|
393
|
+
]);
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
describe("mixed / realistic resource attribute lists", () => {
|
|
398
|
+
test("only the valid labelled attributes survive a mixed list", () => {
|
|
399
|
+
const attributes: JSONArray = [
|
|
400
|
+
rawAttribute("service.name", "checkout"),
|
|
401
|
+
labelAttribute("team", "payments"),
|
|
402
|
+
rawAttribute("host.name", "node-1"),
|
|
403
|
+
{
|
|
404
|
+
key: `${ONEUPTIME_LABEL_ATTRIBUTE_PREFIX}count`,
|
|
405
|
+
value: { intValue: 3 },
|
|
406
|
+
} as unknown as JSONObject,
|
|
407
|
+
labelAttribute("env", " staging "),
|
|
408
|
+
labelAttribute("", "ignored"),
|
|
409
|
+
];
|
|
410
|
+
|
|
411
|
+
expect(extractOneuptimeLabelNames(attributes)).toEqual([
|
|
412
|
+
"team:payments",
|
|
413
|
+
"env:staging",
|
|
414
|
+
]);
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
test("does not mutate the input attribute list", () => {
|
|
418
|
+
const attributes: JSONArray = [
|
|
419
|
+
labelAttribute("team", "payments"),
|
|
420
|
+
rawAttribute("service.name", "checkout"),
|
|
421
|
+
];
|
|
422
|
+
const snapshot: string = JSON.stringify(attributes);
|
|
423
|
+
|
|
424
|
+
extractOneuptimeLabelNames(attributes);
|
|
425
|
+
|
|
426
|
+
expect(JSON.stringify(attributes)).toBe(snapshot);
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
test("returns a fresh array on each call", () => {
|
|
430
|
+
const attributes: JSONArray = [labelAttribute("team", "payments")];
|
|
431
|
+
|
|
432
|
+
const first: Array<string> = extractOneuptimeLabelNames(attributes);
|
|
433
|
+
const second: Array<string> = extractOneuptimeLabelNames(attributes);
|
|
434
|
+
|
|
435
|
+
expect(first).not.toBe(second);
|
|
436
|
+
expect(first).toEqual(second);
|
|
437
|
+
});
|
|
438
|
+
});
|
|
439
|
+
});
|