@oneuptime/common 12.0.15 → 12.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/Index.ts +10 -0
- package/Models/AnalyticsModels/LogCountBaseline.ts +174 -0
- package/Models/AnalyticsModels/SecurityEvent.ts +794 -0
- package/Models/AnalyticsModels/Span.ts +29 -1
- package/Models/AnalyticsModels/SpanCountBaseline.ts +198 -0
- package/Models/DatabaseModels/Alert.ts +42 -0
- package/Models/DatabaseModels/AlertMeasurement.ts +1114 -0
- package/Models/DatabaseModels/AlertMeasurementValue.ts +501 -0
- package/Models/DatabaseModels/AlertStateTimeline.ts +10 -2
- package/Models/DatabaseModels/BillingPaymentMethod.ts +8 -10
- package/Models/DatabaseModels/DetectionRule.ts +487 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +382 -0
- package/Models/DatabaseModels/Incident.ts +42 -0
- package/Models/DatabaseModels/IncidentMeasurement.ts +1114 -0
- package/Models/DatabaseModels/IncidentMeasurementValue.ts +501 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +10 -2
- package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +36 -0
- package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +42 -0
- package/Models/DatabaseModels/Index.ts +20 -0
- package/Models/DatabaseModels/Label.ts +11 -0
- package/Models/DatabaseModels/LlmCostBudget.ts +655 -0
- package/Models/DatabaseModels/LlmModelPrice.ts +481 -0
- package/Models/DatabaseModels/LogSavedView.ts +87 -0
- package/Models/DatabaseModels/MarketingConversion.ts +210 -8
- package/Models/DatabaseModels/MetricSavedView.ts +59 -0
- package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +36 -0
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +42 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +36 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +42 -0
- package/Models/DatabaseModels/Probe.ts +21 -0
- package/Models/DatabaseModels/RunbookLabelRule.ts +36 -0
- package/Models/DatabaseModels/RunbookOwnerRule.ts +42 -0
- package/Models/DatabaseModels/ScheduledMaintenanceMeasurement.ts +1104 -0
- package/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.ts +491 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +10 -2
- package/Models/DatabaseModels/StatusPageLabelRule.ts +36 -0
- package/Models/DatabaseModels/StatusPageOwnerRule.ts +42 -0
- package/Models/DatabaseModels/TableView.ts +15 -0
- package/Models/DatabaseModels/Team.ts +13 -0
- package/Models/DatabaseModels/TeamMember.ts +8 -0
- package/Models/DatabaseModels/TraceSavedView.ts +52 -0
- package/Models/DatabaseModels/WorkflowLabelRule.ts +36 -0
- package/Models/DatabaseModels/WorkflowOwnerRule.ts +42 -0
- package/Server/API/TelemetryAPI.ts +252 -6
- package/Server/API/UserAPI.ts +88 -0
- package/Server/EnvironmentConfig.ts +36 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.ts +88 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.ts +457 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.ts +105 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.ts +77 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Middleware/IdentityRateLimit.ts +672 -0
- package/Server/Services/AccessTokenService.ts +15 -2
- package/Server/Services/AlertMeasurementService.ts +302 -0
- package/Server/Services/AlertMeasurementValueService.ts +508 -0
- package/Server/Services/AlertService.ts +50 -0
- package/Server/Services/AlertStateTimelineService.ts +54 -0
- package/Server/Services/DetectionRuleService.ts +74 -0
- package/Server/Services/GoogleSecOpsConnectionService.ts +89 -0
- package/Server/Services/IncidentMeasurementService.ts +304 -0
- package/Server/Services/IncidentMeasurementValueService.ts +523 -0
- package/Server/Services/IncidentService.ts +51 -0
- package/Server/Services/IncidentStateTimelineService.ts +54 -0
- package/Server/Services/Index.ts +30 -0
- package/Server/Services/LlmCostBudgetService.ts +93 -0
- package/Server/Services/LlmModelPriceService.ts +202 -0
- package/Server/Services/LogAggregationService.ts +1106 -2
- package/Server/Services/LogCountBaselineService.ts +163 -0
- package/Server/Services/MutableMetricService.ts +30 -9
- package/Server/Services/ScheduledMaintenanceMeasurementService.ts +311 -0
- package/Server/Services/ScheduledMaintenanceMeasurementValueService.ts +546 -0
- package/Server/Services/ScheduledMaintenanceService.ts +53 -0
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +188 -1
- package/Server/Services/SecurityEventService.ts +104 -0
- package/Server/Services/SpanCountBaselineService.ts +173 -0
- package/Server/Services/StatusPageService.ts +4 -3
- package/Server/Services/TelemetryUsageBillingService.ts +17 -2
- package/Server/Services/UserService.ts +284 -51
- package/Server/Services/UserTotpAuthService.ts +27 -86
- package/Server/Services/UserWebAuthnService.ts +26 -86
- package/Server/Types/Billing/MeteredPlan/AllMeteredPlans.ts +14 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +10 -0
- package/Server/Types/Database/QueryHelper.ts +1 -1
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
- package/Server/Utils/AI/Toolbox/Index.ts +6 -0
- package/Server/Utils/AI/Toolbox/SecurityEventTools.ts +349 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -4
- package/Server/Utils/Attribution.ts +130 -34
- package/Server/Utils/Marketing/ConversionUploadProvider.ts +98 -16
- package/Server/Utils/Marketing/Providers/GoogleAds.ts +70 -7
- package/Server/Utils/Marketing/Providers/LinkedIn.ts +54 -16
- package/Server/Utils/Marketing/Providers/Meta.ts +52 -18
- package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +37 -10
- package/Server/Utils/Marketing/Providers/Reddit.ts +45 -15
- package/Server/Utils/Measurement/MeasurementDefinitionValidator.ts +209 -0
- package/Server/Utils/Measurement/MeasurementMetricWriter.ts +189 -0
- package/Server/Utils/Monitor/Criteria/CountAnomaly.ts +182 -0
- package/Server/Utils/Monitor/Criteria/LogMonitorCriteria.ts +132 -0
- package/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.ts +35 -0
- package/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.ts +132 -0
- package/Server/Utils/Monitor/DataToProcess.ts +2 -0
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +15 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +20 -0
- package/Server/Utils/Monitor/MonitorResource.ts +16 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +1 -0
- package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +1 -0
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +548 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +262 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +212 -0
- package/Server/Utils/SecurityEvent/SecurityEventRow.ts +101 -0
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +635 -0
- package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +379 -0
- package/Server/Utils/Telemetry/LlmSpan.ts +83 -4
- package/Server/Utils/Telemetry/LogErrorPatternSql.ts +136 -0
- package/Server/Utils/UserPermission/UserPermission.ts +57 -1
- package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +4 -0
- package/Tests/App/Dashboard/CreatePageEntryPointPermissions.test.tsx +306 -0
- package/Tests/App/Dashboard/DangerZone.test.tsx +11 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +4 -0
- package/Tests/App/Dashboard/LogMonitorAttributeOperatorPreview.test.tsx +459 -0
- package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +24 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +6 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +323 -0
- package/Tests/Models/DatabaseModels/ProjectSharedResources.test.ts +386 -0
- package/Tests/Server/API/LogErrorPatternAPI.test.ts +811 -0
- package/Tests/Server/API/UserAuthenticationAPI.test.ts +11 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +11 -2
- package/Tests/Server/API/UserTwoFactorAuthAdminAPI.test.ts +918 -0
- package/Tests/Server/Infrastructure/LocalCache.test.ts +149 -0
- package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +249 -0
- package/Tests/Server/Services/AlertMeasurementService.test.ts +665 -0
- package/Tests/Server/Services/AlertMeasurementValueService.test.ts +389 -0
- package/Tests/Server/Services/DetectionRuleService.test.ts +254 -0
- package/Tests/Server/Services/IncidentMeasurementService.test.ts +394 -0
- package/Tests/Server/Services/IncidentMeasurementValueService.test.ts +816 -0
- package/Tests/Server/Services/LlmCostBudgetService.test.ts +104 -0
- package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +405 -0
- package/Tests/Server/Services/LogErrorPatternAggregation.test.ts +804 -0
- package/Tests/Server/Services/MutableMetricNameRouting.test.ts +83 -0
- package/Tests/Server/Services/ScheduledMaintenanceMeasurementService.test.ts +750 -0
- package/Tests/Server/Services/ScheduledMaintenanceMeasurementValueService.test.ts +478 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +216 -4
- package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +1190 -0
- package/Tests/Server/Types/Database/Permissions/ScopedRoleSharedResourceAccess.test.ts +466 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +265 -0
- package/Tests/Server/Types/Database/QueryHelperTextAndStructuralOperators.test.ts +206 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +6 -0
- package/Tests/Server/Utils/AnalyticsDatabase/FractionalAttributeThreshold.test.ts +224 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +172 -2
- package/Tests/Server/Utils/Attribution.test.ts +228 -1
- package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +153 -92
- package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +123 -6
- package/Tests/Server/Utils/Marketing/GoogleAds.test.ts +253 -1
- package/Tests/Server/Utils/Marketing/LinkedIn.test.ts +282 -0
- package/Tests/Server/Utils/Marketing/Meta.test.ts +304 -0
- package/Tests/Server/Utils/Marketing/MicrosoftAds.test.ts +263 -0
- package/Tests/Server/Utils/Marketing/Reddit.test.ts +259 -0
- package/Tests/Server/Utils/Measurement/MeasurementDefinitionValidator.test.ts +322 -0
- package/Tests/Server/Utils/Measurement/MeasurementMetricWriter.test.ts +373 -0
- package/Tests/Server/Utils/Monitor/Criteria/CountAnomaly.test.ts +221 -0
- package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +236 -0
- package/Tests/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.test.ts +147 -0
- package/Tests/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.test.ts +274 -0
- package/Tests/Server/Utils/Monitor/SecurityEventsMonitorDataExtractor.test.ts +93 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +660 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +308 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +271 -0
- package/Tests/Server/Utils/SecurityEvent/SecurityEventRow.test.ts +272 -0
- package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +511 -0
- package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +497 -0
- package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +380 -0
- package/Tests/Server/Utils/Telemetry/LogErrorPatternSql.test.ts +207 -0
- package/Tests/Server/Utils/UserPermission/ProjectUserGrant.test.ts +293 -0
- package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +194 -0
- package/Tests/Types/Monitor/MonitorStepSecurityEventsMonitor.test.ts +201 -0
- package/Tests/Types/SecurityEvent/OcsfEventClass.test.ts +105 -0
- package/Tests/Types/SecurityEvent/OcsfSeverity.test.ts +111 -0
- package/Tests/Types/Telemetry/LlmCostCatalog.test.ts +516 -0
- package/Tests/UI/Components/ActiveFilterChipsOperatorValues.test.tsx +222 -0
- package/Tests/UI/Components/BulkActionPermissionGating.test.tsx +296 -0
- package/Tests/UI/Components/CardModelDetailPermissionGating.test.tsx +305 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +23 -0
- package/Tests/UI/Components/DictionaryFilterOperatorDisplay.test.ts +239 -0
- package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +267 -0
- package/Tests/UI/Components/DuplicateModel.test.tsx +37 -0
- package/Tests/UI/Components/ModelCardPermissionGating.test.tsx +348 -0
- package/Tests/UI/Components/ModelDelete.test.tsx +25 -1
- package/Tests/UI/Components/ModelFormCreatePermission.test.tsx +342 -0
- package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +680 -0
- package/Tests/UI/Components/OrderedStatesListCreateGate.test.tsx +174 -0
- package/Tests/UI/Components/SavedViewsDropdownSearch.test.tsx +1127 -0
- package/Tests/UI/Components/SavedViewsFacetSection.test.tsx +958 -0
- package/Tests/UI/Components/SavedViewsList.test.ts +699 -0
- package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +640 -0
- package/Tests/UI/Components/SavedViewsSurfaceParity.test.tsx +679 -0
- package/Tests/UI/Components/TableViewLoadFailure.test.tsx +248 -0
- package/Tests/UI/Types/UseComponentOutsideClick.test.tsx +226 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +467 -0
- package/Tests/Utils/Measurement/MeasurementEvaluator.test.ts +639 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +285 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +433 -0
- package/Tests/Utils/SecurityEvent/GenericNormalizer.test.ts +204 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +252 -0
- package/Tests/Utils/SecurityEvent/NormalizerHelpers.test.ts +274 -0
- package/Tests/Utils/SecurityEvent/OcsfNormalizer.test.ts +208 -0
- package/Tests/Utils/SecurityEvent/SecurityEventNormalizer.test.ts +172 -0
- package/Tests/Utils/SecurityEvent/SigmaRuleParser.test.ts +471 -0
- package/Tests/Utils/SecurityEvent/UdmNormalizer.test.ts +361 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +82 -0
- package/Tests/Utils/Telemetry/LogErrorPattern.test.ts +463 -0
- package/Types/AI/AIChatTypes.ts +1 -0
- package/Types/Alerts/AlertMeasurementAnchorType.ts +14 -0
- package/Types/Alerts/AlertStateRole.ts +11 -0
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +16 -0
- package/Types/Dashboard/Chart/ChartType.ts +1 -0
- package/Types/Dashboard/DashboardComponentType.ts +2 -0
- package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.ts +18 -0
- package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.ts +16 -0
- package/Types/Incident/IncidentMeasurementAnchorType.ts +34 -0
- package/Types/Incident/IncidentStateRole.ts +14 -0
- package/Types/Marketing/Attribution.ts +75 -0
- package/Types/Marketing/MarketingConversion.ts +37 -7
- package/Types/Measurement/MeasurementAggregationType.ts +43 -0
- package/Types/Measurement/MeasurementAnchorKind.ts +23 -0
- package/Types/Measurement/MeasurementOccurrence.ts +14 -0
- package/Types/Measurement/MeasurementStatus.ts +34 -0
- package/Types/MeteredPlan/ProductType.ts +1 -0
- package/Types/Monitor/CriteriaFilter.ts +3 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +64 -0
- package/Types/Monitor/MonitorStep.ts +28 -0
- package/Types/Monitor/MonitorStepSecurityEventsMonitor.ts +100 -0
- package/Types/Monitor/MonitorType.ts +20 -0
- package/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.ts +17 -0
- package/Types/Permission.ts +399 -2
- package/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.ts +20 -0
- package/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.ts +16 -0
- package/Types/SecurityEvent/NormalizedSecurityEvent.ts +92 -0
- package/Types/SecurityEvent/OcsfEventClass.ts +205 -0
- package/Types/SecurityEvent/OcsfSeverity.ts +88 -0
- package/Types/SecurityEvent/SecurityEventFormat.ts +23 -0
- package/Types/SecurityEvent/SigmaRule.ts +70 -0
- package/Types/Telemetry/LlmConventions.ts +20 -1
- package/Types/Telemetry/LlmCostCatalog.ts +557 -0
- package/Types/Telemetry/ServiceType.ts +1 -0
- package/Types/Telemetry/TelemetryRetentionConfig.ts +5 -1
- package/Types/Telemetry/TelemetryType.ts +1 -0
- package/Types/TwoFactorAuthStatus.ts +42 -0
- package/Types/UserAuthenticationStatus.ts +18 -0
- package/UI/Components/ActionButton/ActionButtonSchema.ts +7 -0
- package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +35 -2
- package/UI/Components/BulkUpdate/BulkLabelActions.tsx +34 -1
- package/UI/Components/BulkUpdate/BulkOwnerActions.tsx +45 -1
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +3 -0
- package/UI/Components/Button/Button.tsx +37 -2
- package/UI/Components/Card/Card.tsx +6 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +24 -1
- package/UI/Components/Dictionary/DictionaryFilterOperator.ts +57 -0
- package/UI/Components/DuplicateModel/DuplicateModel.tsx +16 -0
- package/UI/Components/Forms/ModelForm.tsx +54 -2
- package/UI/Components/List/ListRow.tsx +6 -0
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +34 -7
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +7 -40
- package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +155 -3
- package/UI/Components/ModelDelete/ModelDelete.tsx +20 -0
- package/UI/Components/ModelDetail/CardModelDetail.tsx +36 -23
- package/UI/Components/ModelList/ModelList.tsx +21 -2
- package/UI/Components/ModelList/StaticModelList.tsx +11 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +168 -62
- package/UI/Components/ModelTable/ModelTable.tsx +16 -10
- package/UI/Components/ModelTable/TableView.tsx +36 -4
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +36 -4
- package/UI/Components/OrderedStatesList/Item.tsx +6 -0
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +81 -47
- package/UI/Components/ResetObjectID/ResetObjectID.tsx +16 -0
- package/UI/Components/SavedViews/SavedViewsFacetSection.tsx +242 -0
- package/UI/Components/SavedViews/SavedViewsList.ts +168 -0
- package/UI/Components/SavedViews/SavedViewsSearchInput.tsx +46 -0
- package/UI/Components/SavedViews/SavedViewsShowMoreButton.tsx +44 -0
- package/UI/Components/Table/TableRow.tsx +12 -0
- package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +152 -2
- package/UI/Types/UseComponentOutsideClick.ts +47 -0
- package/UI/Utils/PermissionGate.ts +277 -0
- package/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.ts +84 -0
- package/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.ts +110 -0
- package/Utils/Dashboard/Components/Index.ts +14 -0
- package/Utils/Measurement/MeasurementEvaluator.ts +359 -0
- package/Utils/Monitor/MonitorSummarySnapshotUtil.ts +1 -0
- package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +93 -11
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +231 -0
- package/Utils/SecurityEvent/GenericNormalizer.ts +208 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +206 -0
- package/Utils/SecurityEvent/NormalizerHelpers.ts +263 -0
- package/Utils/SecurityEvent/OcsfNormalizer.ts +194 -0
- package/Utils/SecurityEvent/SecurityEventNormalizer.ts +82 -0
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +579 -0
- package/Utils/SecurityEvent/UdmNormalizer.ts +442 -0
- package/Utils/Telemetry/CrossSignalScope.ts +46 -9
- package/Utils/Telemetry/LogErrorPattern.ts +350 -0
- package/build/dist/Models/AnalyticsModels/Index.js +10 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/LogCountBaseline.js +159 -0
- package/build/dist/Models/AnalyticsModels/LogCountBaseline.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +596 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/Span.js +24 -1
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js +181 -0
- package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Alert.js +43 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertMeasurement.js +1143 -0
- package/build/dist/Models/DatabaseModels/AlertMeasurement.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js +523 -0
- package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +9 -2
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js +10 -11
- package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +517 -0
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +410 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +43 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentMeasurement.js +1143 -0
- package/build/dist/Models/DatabaseModels/IncidentMeasurement.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js +523 -0
- package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +9 -2
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +20 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Label.js +11 -0
- package/build/dist/Models/DatabaseModels/Label.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LlmCostBudget.js +681 -0
- package/build/dist/Models/DatabaseModels/LlmCostBudget.js.map +1 -0
- package/build/dist/Models/DatabaseModels/LlmModelPrice.js +503 -0
- package/build/dist/Models/DatabaseModels/LlmModelPrice.js.map +1 -0
- package/build/dist/Models/DatabaseModels/LogSavedView.js +87 -0
- package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MarketingConversion.js +224 -8
- package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricSavedView.js +59 -0
- package/build/dist/Models/DatabaseModels/MetricSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Probe.js +21 -0
- package/build/dist/Models/DatabaseModels/Probe.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js +1133 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js +515 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +9 -2
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TableView.js +15 -0
- package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Team.js +13 -0
- package/build/dist/Models/DatabaseModels/Team.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMember.js +8 -0
- package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceSavedView.js +52 -0
- package/build/dist/Models/DatabaseModels/TraceSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +136 -0
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +75 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +29 -1
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js +162 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js +52 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +491 -0
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AccessTokenService.js +13 -2
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertMeasurementService.js +250 -0
- package/build/dist/Server/Services/AlertMeasurementService.js.map +1 -0
- package/build/dist/Server/Services/AlertMeasurementValueService.js +400 -0
- package/build/dist/Server/Services/AlertMeasurementValueService.js.map +1 -0
- package/build/dist/Server/Services/AlertService.js +37 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AlertStateTimelineService.js +48 -0
- package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +50 -0
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +55 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -0
- package/build/dist/Server/Services/IncidentMeasurementService.js +252 -0
- package/build/dist/Server/Services/IncidentMeasurementService.js.map +1 -0
- package/build/dist/Server/Services/IncidentMeasurementValueService.js +413 -0
- package/build/dist/Server/Services/IncidentMeasurementValueService.js.map +1 -0
- package/build/dist/Server/Services/IncidentService.js +41 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +50 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +30 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LlmCostBudgetService.js +89 -0
- package/build/dist/Server/Services/LlmCostBudgetService.js.map +1 -0
- package/build/dist/Server/Services/LlmModelPriceService.js +163 -0
- package/build/dist/Server/Services/LlmModelPriceService.js.map +1 -0
- package/build/dist/Server/Services/LogAggregationService.js +709 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/LogCountBaselineService.js +112 -0
- package/build/dist/Server/Services/LogCountBaselineService.js.map +1 -0
- package/build/dist/Server/Services/MutableMetricService.js +28 -9
- package/build/dist/Server/Services/MutableMetricService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js +254 -0
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js.map +1 -0
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js +434 -0
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js.map +1 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +37 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +134 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventService.js +64 -0
- package/build/dist/Server/Services/SecurityEventService.js.map +1 -0
- package/build/dist/Server/Services/SpanCountBaselineService.js +122 -0
- package/build/dist/Server/Services/SpanCountBaselineService.js.map +1 -0
- package/build/dist/Server/Services/StatusPageService.js +4 -3
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +15 -3
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +262 -42
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTotpAuthService.js +0 -73
- package/build/dist/Server/Services/UserTotpAuthService.js.map +1 -1
- package/build/dist/Server/Services/UserWebAuthnService.js +1 -73
- package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js +13 -0
- package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +10 -0
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +3 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js +257 -0
- package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -4
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Attribution.js +77 -33
- package/build/dist/Server/Utils/Attribution.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +46 -9
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +52 -8
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +41 -17
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js +42 -18
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +24 -11
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +34 -15
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -1
- package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js +109 -0
- package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js.map +1 -0
- package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js +131 -0
- package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js +111 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js +84 -1
- package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js +35 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.js +84 -1
- package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +12 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +10 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +6 -5
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +404 -0
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +145 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +176 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js +69 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +493 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +317 -0
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js +56 -4
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js +112 -0
- package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js.map +1 -0
- package/build/dist/Server/Utils/UserPermission/UserPermission.js +46 -1
- package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
- package/build/dist/Types/AI/AIChatTypes.js +1 -0
- package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
- package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js +15 -0
- package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js.map +1 -0
- package/build/dist/Types/Alerts/AlertStateRole.js +12 -0
- package/build/dist/Types/Alerts/AlertStateRole.js.map +1 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +16 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/Dashboard/Chart/ChartType.js +1 -0
- package/build/dist/Types/Dashboard/Chart/ChartType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js.map +1 -0
- package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js +29 -0
- package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js.map +1 -0
- package/build/dist/Types/Incident/IncidentStateRole.js +15 -0
- package/build/dist/Types/Incident/IncidentStateRole.js.map +1 -0
- package/build/dist/Types/Marketing/Attribution.js +68 -0
- package/build/dist/Types/Marketing/Attribution.js.map +1 -0
- package/build/dist/Types/Marketing/MarketingConversion.js +36 -7
- package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -1
- package/build/dist/Types/Measurement/MeasurementAggregationType.js +40 -0
- package/build/dist/Types/Measurement/MeasurementAggregationType.js.map +1 -0
- package/build/dist/Types/Measurement/MeasurementAnchorKind.js +22 -0
- package/build/dist/Types/Measurement/MeasurementAnchorKind.js.map +1 -0
- package/build/dist/Types/Measurement/MeasurementOccurrence.js +15 -0
- package/build/dist/Types/Measurement/MeasurementOccurrence.js.map +1 -0
- package/build/dist/Types/Measurement/MeasurementStatus.js +32 -0
- package/build/dist/Types/Measurement/MeasurementStatus.js.map +1 -0
- package/build/dist/Types/MeteredPlan/ProductType.js +1 -0
- package/build/dist/Types/MeteredPlan/ProductType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +2 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +59 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +17 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js +64 -0
- package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +19 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js +2 -0
- package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js.map +1 -0
- package/build/dist/Types/Permission.js +347 -2
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js +19 -0
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js.map +1 -0
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js +17 -0
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js.map +1 -0
- package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js +2 -0
- package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js.map +1 -0
- package/build/dist/Types/SecurityEvent/OcsfEventClass.js +181 -0
- package/build/dist/Types/SecurityEvent/OcsfEventClass.js.map +1 -0
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js +81 -0
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -0
- package/build/dist/Types/SecurityEvent/SecurityEventFormat.js +21 -0
- package/build/dist/Types/SecurityEvent/SecurityEventFormat.js.map +1 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js +16 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -0
- package/build/dist/Types/Telemetry/LlmConventions.js +19 -1
- package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmCostCatalog.js +484 -0
- package/build/dist/Types/Telemetry/LlmCostCatalog.js.map +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/Types/Telemetry/TelemetryRetentionConfig.js.map +1 -1
- package/build/dist/Types/Telemetry/TelemetryType.js +1 -0
- package/build/dist/Types/Telemetry/TelemetryType.js.map +1 -1
- package/build/dist/Types/TwoFactorAuthStatus.js +41 -0
- package/build/dist/Types/TwoFactorAuthStatus.js.map +1 -0
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +16 -2
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +15 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js +20 -1
- package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -1
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +1 -1
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +14 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +47 -0
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
- package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js +8 -0
- package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +40 -1
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/List/ListRow.js +4 -1
- package/build/dist/UI/Components/List/ListRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +32 -7
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +2 -17
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +93 -4
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js +13 -0
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +27 -11
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +13 -2
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/ModelList/StaticModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/StaticModelList.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +101 -40
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +9 -7
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js +32 -4
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +19 -2
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/Item.js +4 -1
- package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +33 -32
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +8 -0
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
- package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js +98 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js.map +1 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsList.js +99 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsList.js.map +1 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js +17 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js.map +1 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js +15 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js.map +1 -0
- package/build/dist/UI/Components/Table/TableRow.js +8 -2
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +93 -4
- package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Types/UseComponentOutsideClick.js +39 -0
- package/build/dist/UI/Types/UseComponentOutsideClick.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +164 -0
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js +70 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js +92 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Measurement/MeasurementEvaluator.js +210 -0
- package/build/dist/Utils/Measurement/MeasurementEvaluator.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js +1 -0
- package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +51 -10
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +108 -0
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GenericNormalizer.js +176 -0
- package/build/dist/Utils/SecurityEvent/GenericNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +146 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js +196 -0
- package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js +136 -0
- package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js +64 -0
- package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +388 -0
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/UdmNormalizer.js +328 -0
- package/build/dist/Utils/SecurityEvent/UdmNormalizer.js.map +1 -0
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +29 -7
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/build/dist/Utils/Telemetry/LogErrorPattern.js +284 -0
- package/build/dist/Utils/Telemetry/LogErrorPattern.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,679 @@
|
|
|
1
|
+
import SavedViewsSearchInput from "../../../UI/Components/SavedViews/SavedViewsSearchInput";
|
|
2
|
+
import SavedViewsShowMoreButton from "../../../UI/Components/SavedViews/SavedViewsShowMoreButton";
|
|
3
|
+
import SavedViewsFacetSection from "../../../UI/Components/SavedViews/SavedViewsFacetSection";
|
|
4
|
+
import LogsSavedViewsDropdown, {
|
|
5
|
+
SavedViewsDropdownProps,
|
|
6
|
+
} from "../../../UI/Components/LogsViewer/components/SavedViewsDropdown";
|
|
7
|
+
import TelemetrySavedViewsDropdown from "../../../UI/Components/TelemetryViewer/components/SavedViewsDropdown";
|
|
8
|
+
import { LogsSavedViewOption } from "../../../UI/Components/LogsViewer/types";
|
|
9
|
+
import "@testing-library/jest-dom";
|
|
10
|
+
import {
|
|
11
|
+
RenderResult,
|
|
12
|
+
cleanup,
|
|
13
|
+
fireEvent,
|
|
14
|
+
render,
|
|
15
|
+
screen,
|
|
16
|
+
} from "@testing-library/react";
|
|
17
|
+
import React, { FunctionComponent } from "react";
|
|
18
|
+
import { afterEach, describe, expect, jest, test } from "@jest/globals";
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* Issue 3319 shipped the same behaviour into three places: the logs facet
|
|
22
|
+
* sidebar's section, the logs toolbar dropdown, and the shared telemetry
|
|
23
|
+
* dropdown. Each of those files owns its own tests, and each is happy on its
|
|
24
|
+
* own — which is exactly how three copies drift apart without anyone noticing.
|
|
25
|
+
*
|
|
26
|
+
* Two jobs here. First, the two leaf components are exercised directly, so
|
|
27
|
+
* their fallbacks and guards are pinned from their own side rather than only
|
|
28
|
+
* through whichever caller happens to reach them today. Second, the rules that
|
|
29
|
+
* must be IDENTICAL everywhere — when a search box appears, where the collapsed
|
|
30
|
+
* list is cut, what "+N more" counts, how the applied view is pinned — run
|
|
31
|
+
* through one table across all three surfaces, so a change to any single copy
|
|
32
|
+
* fails here even if that copy's own tests are updated to match.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
const SEARCH_LABEL: string = "Search saved views...";
|
|
36
|
+
|
|
37
|
+
function makeViews(count: number): Array<LogsSavedViewOption> {
|
|
38
|
+
const views: Array<LogsSavedViewOption> = [];
|
|
39
|
+
|
|
40
|
+
for (let index: number = 1; index <= count; index++) {
|
|
41
|
+
views.push({ id: `view-${index}`, name: `View ${index}` });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return views;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/*
|
|
48
|
+
* Saved-view rows are the only buttons that report a pressed state, which
|
|
49
|
+
* makes aria-pressed a sharper handle than the name — the dropdown trigger
|
|
50
|
+
* echoes the applied view's name and would otherwise be counted as a row.
|
|
51
|
+
*/
|
|
52
|
+
function visibleViewNames(): Array<string> {
|
|
53
|
+
return screen
|
|
54
|
+
.queryAllByRole("button")
|
|
55
|
+
.filter((element: HTMLElement): boolean => {
|
|
56
|
+
return element.hasAttribute("aria-pressed");
|
|
57
|
+
})
|
|
58
|
+
.map((element: HTMLElement): string => {
|
|
59
|
+
return element.getAttribute("aria-label") || element.textContent || "";
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
describe("SavedViewsSearchInput — the box names itself", () => {
|
|
64
|
+
afterEach(() => {
|
|
65
|
+
cleanup();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("the search box names itself when the caller says nothing", () => {
|
|
69
|
+
const onChange: (searchText: string) => void = jest.fn();
|
|
70
|
+
|
|
71
|
+
render(<SavedViewsSearchInput value="" onChange={onChange} />);
|
|
72
|
+
|
|
73
|
+
/*
|
|
74
|
+
* Both dropdowns pass no label, so this default is the only name their
|
|
75
|
+
* boxes ever get. Their own tests reach the box through the placeholder,
|
|
76
|
+
* which comes from the same variable — so deleting the fallback would
|
|
77
|
+
* leave them unnamed without failing anything over there.
|
|
78
|
+
*/
|
|
79
|
+
const box: HTMLElement = screen.getByRole("textbox", {
|
|
80
|
+
name: SEARCH_LABEL,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
expect(box).toHaveAttribute("placeholder", SEARCH_LABEL);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("an empty label falls back rather than rendering a nameless box", () => {
|
|
87
|
+
const onChange: (searchText: string) => void = jest.fn();
|
|
88
|
+
|
|
89
|
+
render(<SavedViewsSearchInput value="" label="" onChange={onChange} />);
|
|
90
|
+
|
|
91
|
+
/*
|
|
92
|
+
* The fallback is a `||` and not a `??` on purpose: a host that builds its
|
|
93
|
+
* label from a title which is itself empty would otherwise get an unnamed,
|
|
94
|
+
* unplaceheld text field indistinguishable from any other on the page.
|
|
95
|
+
*/
|
|
96
|
+
expect(screen.getByRole("textbox", { name: SEARCH_LABEL })).toHaveAttribute(
|
|
97
|
+
"placeholder",
|
|
98
|
+
SEARCH_LABEL,
|
|
99
|
+
);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test("a caller's label becomes both the placeholder and the accessible name", () => {
|
|
103
|
+
const onChange: (searchText: string) => void = jest.fn();
|
|
104
|
+
|
|
105
|
+
render(
|
|
106
|
+
<SavedViewsSearchInput
|
|
107
|
+
value=""
|
|
108
|
+
label="Search team views..."
|
|
109
|
+
onChange={onChange}
|
|
110
|
+
/>,
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
/*
|
|
114
|
+
* The component exists because a placeholder is not a label — it vanishes
|
|
115
|
+
* the moment the user types. The two must therefore be the same element
|
|
116
|
+
* carrying the same words, or sighted and non-sighted users are told
|
|
117
|
+
* different things about the same field.
|
|
118
|
+
*/
|
|
119
|
+
expect(screen.getByPlaceholderText("Search team views...")).toBe(
|
|
120
|
+
screen.getByRole("textbox", { name: "Search team views..." }),
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test("the box wears the shared styling unless the caller replaces it", () => {
|
|
125
|
+
const onChange: (searchText: string) => void = jest.fn();
|
|
126
|
+
|
|
127
|
+
render(<SavedViewsSearchInput value="" onChange={onChange} />);
|
|
128
|
+
|
|
129
|
+
const shared: HTMLElement = screen.getByRole("textbox");
|
|
130
|
+
|
|
131
|
+
expect(shared.className).toContain("w-full");
|
|
132
|
+
expect(shared.className).toContain("focus:ring-indigo-200");
|
|
133
|
+
|
|
134
|
+
cleanup();
|
|
135
|
+
|
|
136
|
+
render(
|
|
137
|
+
<SavedViewsSearchInput
|
|
138
|
+
value=""
|
|
139
|
+
className="custom-class"
|
|
140
|
+
onChange={onChange}
|
|
141
|
+
/>,
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
/*
|
|
145
|
+
* A full replacement, not a merge. Pinned because the section only ever
|
|
146
|
+
* takes the default and the dropdowns only ever override, so neither side
|
|
147
|
+
* would notice a caller quietly losing the width, background and focus
|
|
148
|
+
* ring by passing a single utility class.
|
|
149
|
+
*/
|
|
150
|
+
expect(screen.getByRole("textbox").className).toBe("custom-class");
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test("the box reports exactly what was typed, whitespace and all", () => {
|
|
154
|
+
const onChange: (searchText: string) => void = jest.fn();
|
|
155
|
+
|
|
156
|
+
render(<SavedViewsSearchInput value="" onChange={onChange} />);
|
|
157
|
+
|
|
158
|
+
fireEvent.change(screen.getByRole("textbox"), {
|
|
159
|
+
target: { value: " Checkout " },
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
/*
|
|
163
|
+
* Trimming belongs to filterSavedViewsByName, not to the box. If the box
|
|
164
|
+
* trimmed, a two-word query would be untypeable — the space would vanish
|
|
165
|
+
* under the user's fingers as they reached for the second word.
|
|
166
|
+
*/
|
|
167
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
168
|
+
expect(onChange).toHaveBeenCalledWith(" Checkout ");
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe("SavedViewsShowMoreButton — a toggle with nothing to toggle", () => {
|
|
173
|
+
afterEach(() => {
|
|
174
|
+
cleanup();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test("the toggle renders nothing when the list has no tail", () => {
|
|
178
|
+
const onToggle: () => void = jest.fn();
|
|
179
|
+
|
|
180
|
+
const rendered: RenderResult = render(
|
|
181
|
+
<SavedViewsShowMoreButton
|
|
182
|
+
hasMore={false}
|
|
183
|
+
hiddenCount={0}
|
|
184
|
+
isShowingAll={false}
|
|
185
|
+
onToggle={onToggle}
|
|
186
|
+
/>,
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
expect(screen.queryAllByRole("button")).toHaveLength(0);
|
|
190
|
+
expect(rendered.container).toBeEmptyDOMElement();
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test("an expanded list whose tail has gone renders nothing either", () => {
|
|
194
|
+
const onToggle: () => void = jest.fn();
|
|
195
|
+
|
|
196
|
+
const rendered: RenderResult = render(
|
|
197
|
+
<SavedViewsShowMoreButton
|
|
198
|
+
hasMore={false}
|
|
199
|
+
hiddenCount={0}
|
|
200
|
+
isShowingAll={true}
|
|
201
|
+
onToggle={onToggle}
|
|
202
|
+
/>,
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
/*
|
|
206
|
+
* The case that used to print a dead "Show less": expand a long list, then
|
|
207
|
+
* let it shrink until it fits. hasMore is the whole gate precisely so the
|
|
208
|
+
* expanded flag surviving the shrink cannot keep a no-op control on screen.
|
|
209
|
+
*/
|
|
210
|
+
expect(rendered.container).toBeEmptyDOMElement();
|
|
211
|
+
expect(screen.queryAllByRole("button")).toHaveLength(0);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
test("a collapsed toggle prints the exact number it is holding back", () => {
|
|
215
|
+
const onToggle: () => void = jest.fn();
|
|
216
|
+
|
|
217
|
+
render(
|
|
218
|
+
<SavedViewsShowMoreButton
|
|
219
|
+
hasMore={true}
|
|
220
|
+
hiddenCount={7}
|
|
221
|
+
isShowingAll={false}
|
|
222
|
+
onToggle={onToggle}
|
|
223
|
+
/>,
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
expect(screen.getByRole("button", { name: "+7 more" })).toBeInTheDocument();
|
|
227
|
+
|
|
228
|
+
cleanup();
|
|
229
|
+
|
|
230
|
+
render(
|
|
231
|
+
<SavedViewsShowMoreButton
|
|
232
|
+
hasMore={true}
|
|
233
|
+
hiddenCount={1}
|
|
234
|
+
isShowingAll={false}
|
|
235
|
+
onToggle={onToggle}
|
|
236
|
+
/>,
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
// The label is the promise the control makes; both callers derive it here.
|
|
240
|
+
expect(screen.getByRole("button", { name: "+1 more" })).toBeInTheDocument();
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test("an expanded toggle says Show less, with nothing hidden to count", () => {
|
|
244
|
+
const onToggle: () => void = jest.fn();
|
|
245
|
+
|
|
246
|
+
render(
|
|
247
|
+
<SavedViewsShowMoreButton
|
|
248
|
+
hasMore={true}
|
|
249
|
+
hiddenCount={0}
|
|
250
|
+
isShowingAll={true}
|
|
251
|
+
onToggle={onToggle}
|
|
252
|
+
/>,
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
/*
|
|
256
|
+
* hiddenCount is what a collapse would hide, so it is zero while expanded.
|
|
257
|
+
* The label must come from isShowingAll rather than from the count, or an
|
|
258
|
+
* expanded list would advertise "+0 more".
|
|
259
|
+
*/
|
|
260
|
+
expect(
|
|
261
|
+
screen.getByRole("button", { name: "Show less" }),
|
|
262
|
+
).toBeInTheDocument();
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
test("the toggle reports one click and never submits a form", () => {
|
|
266
|
+
const onToggle: () => void = jest.fn();
|
|
267
|
+
const onSubmit: () => void = jest.fn();
|
|
268
|
+
|
|
269
|
+
render(
|
|
270
|
+
<form
|
|
271
|
+
onSubmit={(event: React.FormEvent<HTMLFormElement>) => {
|
|
272
|
+
event.preventDefault();
|
|
273
|
+
onSubmit();
|
|
274
|
+
}}
|
|
275
|
+
>
|
|
276
|
+
<SavedViewsShowMoreButton
|
|
277
|
+
hasMore={true}
|
|
278
|
+
hiddenCount={3}
|
|
279
|
+
isShowingAll={false}
|
|
280
|
+
onToggle={onToggle}
|
|
281
|
+
/>
|
|
282
|
+
</form>,
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
fireEvent.click(screen.getByRole("button", { name: "+3 more" }));
|
|
286
|
+
|
|
287
|
+
/*
|
|
288
|
+
* All three surfaces can sit inside a host page's form. Without the
|
|
289
|
+
* explicit type="button" the default is "submit", and "show more" quietly
|
|
290
|
+
* becomes "submit the page" — invisible until it happens to someone.
|
|
291
|
+
*/
|
|
292
|
+
expect(onToggle).toHaveBeenCalledTimes(1);
|
|
293
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
/*
|
|
298
|
+
* One surface, mounted the same way whichever of the three it is, so the cases
|
|
299
|
+
* below can be written once and read as claims about all of them. The dropdowns
|
|
300
|
+
* need their menu opened before there is a list to look at; the sidebar section
|
|
301
|
+
* is already open, so that difference is absorbed here and nowhere else.
|
|
302
|
+
*/
|
|
303
|
+
interface SurfaceUnderTest {
|
|
304
|
+
label: string;
|
|
305
|
+
mount: (
|
|
306
|
+
savedViews: Array<LogsSavedViewOption>,
|
|
307
|
+
selectedSavedViewId?: string | null,
|
|
308
|
+
) => void;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function mountSection(
|
|
312
|
+
savedViews: Array<LogsSavedViewOption>,
|
|
313
|
+
selectedSavedViewId?: string | null,
|
|
314
|
+
): void {
|
|
315
|
+
const onSelect: (viewId: string) => void = jest.fn();
|
|
316
|
+
|
|
317
|
+
render(
|
|
318
|
+
<SavedViewsFacetSection
|
|
319
|
+
savedViews={savedViews}
|
|
320
|
+
selectedSavedViewId={selectedSavedViewId ?? null}
|
|
321
|
+
onSelect={onSelect}
|
|
322
|
+
/>,
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function makeDropdownSurface(
|
|
327
|
+
label: string,
|
|
328
|
+
Component: FunctionComponent<SavedViewsDropdownProps>,
|
|
329
|
+
): SurfaceUnderTest {
|
|
330
|
+
return {
|
|
331
|
+
label: label,
|
|
332
|
+
mount: (
|
|
333
|
+
savedViews: Array<LogsSavedViewOption>,
|
|
334
|
+
selectedSavedViewId?: string | null,
|
|
335
|
+
): void => {
|
|
336
|
+
const onSelect: (viewId: string) => void = jest.fn();
|
|
337
|
+
|
|
338
|
+
render(
|
|
339
|
+
<Component
|
|
340
|
+
savedViews={savedViews}
|
|
341
|
+
selectedSavedViewId={selectedSavedViewId ?? null}
|
|
342
|
+
onSelect={onSelect}
|
|
343
|
+
/>,
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
// Closed, the only button on screen is the trigger.
|
|
347
|
+
fireEvent.click(screen.getAllByRole("button")[0]!);
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/*
|
|
353
|
+
* The telemetry dropdown's props are the logs ones plus a few optional
|
|
354
|
+
* presentation flags, so a component typed for the logs props stands in for
|
|
355
|
+
* both and every case below runs three times.
|
|
356
|
+
*/
|
|
357
|
+
const SURFACES: Array<SurfaceUnderTest> = [
|
|
358
|
+
{ label: "sidebar section", mount: mountSection },
|
|
359
|
+
makeDropdownSurface("logs dropdown", LogsSavedViewsDropdown),
|
|
360
|
+
makeDropdownSurface("telemetry dropdown", TelemetrySavedViewsDropdown),
|
|
361
|
+
];
|
|
362
|
+
|
|
363
|
+
function typeSearch(text: string): void {
|
|
364
|
+
fireEvent.change(screen.getByPlaceholderText(SEARCH_LABEL), {
|
|
365
|
+
target: { value: text },
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
describe.each(SURFACES)(
|
|
370
|
+
"$label — the same saved-views rules as its two siblings",
|
|
371
|
+
(surface: SurfaceUnderTest) => {
|
|
372
|
+
afterEach(() => {
|
|
373
|
+
cleanup();
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
test("all three surfaces name their search box identically", () => {
|
|
377
|
+
surface.mount(makeViews(6));
|
|
378
|
+
|
|
379
|
+
/*
|
|
380
|
+
* The dropdowns take the string from the component's default; the
|
|
381
|
+
* section builds it from its own title constant. They agree today by
|
|
382
|
+
* coincidence of wording, and nothing else notices the day one moves.
|
|
383
|
+
*/
|
|
384
|
+
expect(
|
|
385
|
+
screen.getByRole("textbox", { name: SEARCH_LABEL }),
|
|
386
|
+
).toBeInTheDocument();
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
test("all three surfaces show the search box at the same list length", () => {
|
|
390
|
+
surface.mount(makeViews(5));
|
|
391
|
+
|
|
392
|
+
expect(screen.queryByRole("textbox")).toBeNull();
|
|
393
|
+
|
|
394
|
+
cleanup();
|
|
395
|
+
surface.mount(makeViews(6));
|
|
396
|
+
|
|
397
|
+
/*
|
|
398
|
+
* Three separate calls to shouldShowSavedViewsSearch. Inline one, or
|
|
399
|
+
* give it its own number, and a user gets a search box in the sidebar
|
|
400
|
+
* and none in the toolbar for the very same list.
|
|
401
|
+
*/
|
|
402
|
+
expect(
|
|
403
|
+
screen.getByRole("textbox", { name: SEARCH_LABEL }),
|
|
404
|
+
).toBeInTheDocument();
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
test("all three surfaces cut the collapsed list at the same row", () => {
|
|
408
|
+
surface.mount(makeViews(12));
|
|
409
|
+
|
|
410
|
+
/*
|
|
411
|
+
* The dropdowns pass no visibleCount and lean on the module default
|
|
412
|
+
* while the section forwards a prop — so this is where the two paths
|
|
413
|
+
* are held to the same answer.
|
|
414
|
+
*/
|
|
415
|
+
expect(visibleViewNames()).toEqual([
|
|
416
|
+
"View 1",
|
|
417
|
+
"View 2",
|
|
418
|
+
"View 3",
|
|
419
|
+
"View 4",
|
|
420
|
+
"View 5",
|
|
421
|
+
]);
|
|
422
|
+
expect(
|
|
423
|
+
screen.getByRole("button", { name: "+7 more" }),
|
|
424
|
+
).toBeInTheDocument();
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
test("all three surfaces pin the applied view into the collapsed slice", () => {
|
|
428
|
+
surface.mount(makeViews(12), "view-11");
|
|
429
|
+
|
|
430
|
+
/*
|
|
431
|
+
* Pinning is the one rule that changes what a user can see without
|
|
432
|
+
* expanding. A surface that stopped forwarding selectedSavedViewId
|
|
433
|
+
* would drop the applied view out of sight on that surface alone.
|
|
434
|
+
*/
|
|
435
|
+
expect(visibleViewNames()).toEqual([
|
|
436
|
+
"View 1",
|
|
437
|
+
"View 2",
|
|
438
|
+
"View 3",
|
|
439
|
+
"View 4",
|
|
440
|
+
"View 5",
|
|
441
|
+
"View 11",
|
|
442
|
+
]);
|
|
443
|
+
expect(screen.getByRole("button", { name: "View 11" })).toHaveAttribute(
|
|
444
|
+
"aria-pressed",
|
|
445
|
+
"true",
|
|
446
|
+
);
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
test("no surface puts a toggle beside a search result", () => {
|
|
450
|
+
surface.mount(makeViews(12));
|
|
451
|
+
|
|
452
|
+
typeSearch("view 1");
|
|
453
|
+
|
|
454
|
+
expect(visibleViewNames()).toEqual([
|
|
455
|
+
"View 1",
|
|
456
|
+
"View 10",
|
|
457
|
+
"View 11",
|
|
458
|
+
"View 12",
|
|
459
|
+
]);
|
|
460
|
+
expect(screen.queryByRole("button", { name: /more$/ })).toBeNull();
|
|
461
|
+
expect(screen.queryByRole("button", { name: "Show less" })).toBeNull();
|
|
462
|
+
|
|
463
|
+
cleanup();
|
|
464
|
+
|
|
465
|
+
/*
|
|
466
|
+
* Expanding first is the order that leaves showAll true underneath the
|
|
467
|
+
* search, so it is where a surface gating the button on the wrong flag
|
|
468
|
+
* would leak a "Show less" over rows the user explicitly asked for.
|
|
469
|
+
*/
|
|
470
|
+
surface.mount(makeViews(12));
|
|
471
|
+
fireEvent.click(screen.getByRole("button", { name: "+7 more" }));
|
|
472
|
+
typeSearch("view 1");
|
|
473
|
+
|
|
474
|
+
expect(visibleViewNames()).toEqual([
|
|
475
|
+
"View 1",
|
|
476
|
+
"View 10",
|
|
477
|
+
"View 11",
|
|
478
|
+
"View 12",
|
|
479
|
+
]);
|
|
480
|
+
expect(screen.queryByRole("button", { name: /more$/ })).toBeNull();
|
|
481
|
+
expect(screen.queryByRole("button", { name: "Show less" })).toBeNull();
|
|
482
|
+
});
|
|
483
|
+
},
|
|
484
|
+
);
|
|
485
|
+
|
|
486
|
+
/*
|
|
487
|
+
* The list can change under any of the three while it is on screen: deleting a
|
|
488
|
+
* saved view refetches and re-renders in place. These surfaces keep their
|
|
489
|
+
* expanded flag across that, so the only thing that can retire a "Show less" is
|
|
490
|
+
* the list itself reporting that it has no tail left. Proving it once, across
|
|
491
|
+
* the table, is what makes the fix belong in SavedViewsList.ts rather than in
|
|
492
|
+
* three renderers.
|
|
493
|
+
*/
|
|
494
|
+
type UpdateSurface = (savedViews: Array<LogsSavedViewOption>) => void;
|
|
495
|
+
|
|
496
|
+
interface ShrinkableSurface {
|
|
497
|
+
label: string;
|
|
498
|
+
mount: (savedViews: Array<LogsSavedViewOption>) => UpdateSurface;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
const SHRINKABLE_SURFACES: Array<ShrinkableSurface> = [
|
|
502
|
+
{
|
|
503
|
+
label: "sidebar section",
|
|
504
|
+
mount: (savedViews: Array<LogsSavedViewOption>): UpdateSurface => {
|
|
505
|
+
const onSelect: (viewId: string) => void = jest.fn();
|
|
506
|
+
|
|
507
|
+
const element: (
|
|
508
|
+
views: Array<LogsSavedViewOption>,
|
|
509
|
+
) => React.ReactElement = (views: Array<LogsSavedViewOption>) => {
|
|
510
|
+
return (
|
|
511
|
+
<SavedViewsFacetSection
|
|
512
|
+
savedViews={views}
|
|
513
|
+
selectedSavedViewId={null}
|
|
514
|
+
onSelect={onSelect}
|
|
515
|
+
/>
|
|
516
|
+
);
|
|
517
|
+
};
|
|
518
|
+
|
|
519
|
+
const rendered: RenderResult = render(element(savedViews));
|
|
520
|
+
|
|
521
|
+
return (next: Array<LogsSavedViewOption>): void => {
|
|
522
|
+
rendered.rerender(element(next));
|
|
523
|
+
};
|
|
524
|
+
},
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
label: "logs dropdown",
|
|
528
|
+
mount: (savedViews: Array<LogsSavedViewOption>): UpdateSurface => {
|
|
529
|
+
return mountOpenDropdown(LogsSavedViewsDropdown, savedViews);
|
|
530
|
+
},
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
label: "telemetry dropdown",
|
|
534
|
+
mount: (savedViews: Array<LogsSavedViewOption>): UpdateSurface => {
|
|
535
|
+
return mountOpenDropdown(TelemetrySavedViewsDropdown, savedViews);
|
|
536
|
+
},
|
|
537
|
+
},
|
|
538
|
+
];
|
|
539
|
+
|
|
540
|
+
function mountOpenDropdown(
|
|
541
|
+
Component: FunctionComponent<SavedViewsDropdownProps>,
|
|
542
|
+
savedViews: Array<LogsSavedViewOption>,
|
|
543
|
+
): UpdateSurface {
|
|
544
|
+
const onSelect: (viewId: string) => void = jest.fn();
|
|
545
|
+
|
|
546
|
+
const element: (views: Array<LogsSavedViewOption>) => React.ReactElement = (
|
|
547
|
+
views: Array<LogsSavedViewOption>,
|
|
548
|
+
) => {
|
|
549
|
+
return (
|
|
550
|
+
<Component
|
|
551
|
+
savedViews={views}
|
|
552
|
+
selectedSavedViewId={null}
|
|
553
|
+
onSelect={onSelect}
|
|
554
|
+
/>
|
|
555
|
+
);
|
|
556
|
+
};
|
|
557
|
+
|
|
558
|
+
const rendered: RenderResult = render(element(savedViews));
|
|
559
|
+
|
|
560
|
+
// Closed, the only button on screen is the trigger.
|
|
561
|
+
fireEvent.click(screen.getAllByRole("button")[0]!);
|
|
562
|
+
|
|
563
|
+
return (next: Array<LogsSavedViewOption>): void => {
|
|
564
|
+
rendered.rerender(element(next));
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
describe.each(SHRINKABLE_SURFACES)(
|
|
569
|
+
"$label — a list that changes size under it",
|
|
570
|
+
(surface: ShrinkableSurface) => {
|
|
571
|
+
afterEach(() => {
|
|
572
|
+
cleanup();
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
test("no surface leaves a Show less over a list that is already whole", () => {
|
|
576
|
+
const update: UpdateSurface = surface.mount(makeViews(12));
|
|
577
|
+
|
|
578
|
+
fireEvent.click(screen.getByRole("button", { name: "+7 more" }));
|
|
579
|
+
|
|
580
|
+
update(makeViews(4));
|
|
581
|
+
|
|
582
|
+
expect(screen.queryByRole("button", { name: "Show less" })).toBeNull();
|
|
583
|
+
expect(screen.queryByRole("button", { name: /more$/ })).toBeNull();
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
test("no surface keeps filtering by a query whose box has gone", () => {
|
|
587
|
+
const update: UpdateSurface = surface.mount(makeViews(6));
|
|
588
|
+
|
|
589
|
+
fireEvent.change(screen.getByPlaceholderText(SEARCH_LABEL), {
|
|
590
|
+
target: { value: "zzz" },
|
|
591
|
+
});
|
|
592
|
+
expect(screen.getByText("No matches found")).toBeInTheDocument();
|
|
593
|
+
|
|
594
|
+
update(makeViews(3));
|
|
595
|
+
|
|
596
|
+
expect(screen.queryByPlaceholderText(SEARCH_LABEL)).toBeNull();
|
|
597
|
+
expect(screen.queryByText("No matches found")).toBeNull();
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
test("every surface still collapses a list that kept its tail", () => {
|
|
601
|
+
const update: UpdateSurface = surface.mount(makeViews(12));
|
|
602
|
+
|
|
603
|
+
fireEvent.click(screen.getByRole("button", { name: "+7 more" }));
|
|
604
|
+
update(makeViews(8));
|
|
605
|
+
|
|
606
|
+
fireEvent.click(screen.getByRole("button", { name: "Show less" }));
|
|
607
|
+
|
|
608
|
+
expect(
|
|
609
|
+
screen.getByRole("button", { name: "+3 more" }),
|
|
610
|
+
).toBeInTheDocument();
|
|
611
|
+
});
|
|
612
|
+
},
|
|
613
|
+
);
|
|
614
|
+
|
|
615
|
+
/*
|
|
616
|
+
* Two mechanisms guard the stale-search bug together, and the shrink cases
|
|
617
|
+
* above are satisfied by only one of them: RTL wraps rerender in act(), which
|
|
618
|
+
* flushes the clearing effect before the first assertion. These pin the other
|
|
619
|
+
* half — that the query does not come back when the list grows again — and
|
|
620
|
+
* they pin it here, in the parity file, because the effect exists in three
|
|
621
|
+
* separate copies and deleting it from either dropdown leaves every other test
|
|
622
|
+
* in the suite green.
|
|
623
|
+
*/
|
|
624
|
+
describe.each(SHRINKABLE_SURFACES)(
|
|
625
|
+
"$label — a list that shrinks and then grows back",
|
|
626
|
+
(surface: ShrinkableSurface) => {
|
|
627
|
+
afterEach(() => {
|
|
628
|
+
cleanup();
|
|
629
|
+
});
|
|
630
|
+
|
|
631
|
+
test("a query the shrinking list threw away does not return with the list", () => {
|
|
632
|
+
const update: UpdateSurface = surface.mount(makeViews(6));
|
|
633
|
+
|
|
634
|
+
fireEvent.change(screen.getByPlaceholderText(SEARCH_LABEL), {
|
|
635
|
+
target: { value: "zzz" },
|
|
636
|
+
});
|
|
637
|
+
expect(screen.getByText("No matches found")).toBeInTheDocument();
|
|
638
|
+
|
|
639
|
+
// Below the threshold the box unmounts; the query must go with it.
|
|
640
|
+
update(makeViews(3));
|
|
641
|
+
expect(screen.queryByPlaceholderText(SEARCH_LABEL)).toBeNull();
|
|
642
|
+
|
|
643
|
+
// ...and a view created afterwards brings the box back empty.
|
|
644
|
+
update(makeViews(6));
|
|
645
|
+
|
|
646
|
+
expect(screen.getByPlaceholderText(SEARCH_LABEL)).toHaveValue("");
|
|
647
|
+
expect(screen.queryByText("No matches found")).toBeNull();
|
|
648
|
+
expect(visibleViewNames()).toEqual([
|
|
649
|
+
"View 1",
|
|
650
|
+
"View 2",
|
|
651
|
+
"View 3",
|
|
652
|
+
"View 4",
|
|
653
|
+
"View 5",
|
|
654
|
+
]);
|
|
655
|
+
expect(
|
|
656
|
+
screen.getByRole("button", { name: "+1 more" }),
|
|
657
|
+
).toBeInTheDocument();
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
test("an expanded list that is also pinning a view keeps its way back", () => {
|
|
661
|
+
const update: UpdateSurface = surface.mount(makeViews(12));
|
|
662
|
+
|
|
663
|
+
fireEvent.click(screen.getByRole("button", { name: "+7 more" }));
|
|
664
|
+
expect(visibleViewNames()).toHaveLength(12);
|
|
665
|
+
|
|
666
|
+
/*
|
|
667
|
+
* Nothing anywhere else asserts the toggle while the list is expanded
|
|
668
|
+
* AND a view is pinned — the branch where hiddenCount is 0 but the
|
|
669
|
+
* control must still be on screen.
|
|
670
|
+
*/
|
|
671
|
+
update(makeViews(7));
|
|
672
|
+
|
|
673
|
+
expect(visibleViewNames()).toHaveLength(7);
|
|
674
|
+
expect(
|
|
675
|
+
screen.getByRole("button", { name: "Show less" }),
|
|
676
|
+
).toBeInTheDocument();
|
|
677
|
+
});
|
|
678
|
+
},
|
|
679
|
+
);
|