@oneuptime/common 12.0.23 → 12.0.25
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/Span.ts +101 -0
- package/Models/DatabaseModels/DetectionRule.ts +55 -0
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +27 -7
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +67 -0
- package/Models/DatabaseModels/Project.ts +68 -0
- package/Models/DatabaseModels/User.ts +68 -0
- package/Server/API/BaseAPI.ts +0 -24
- package/Server/API/SlackAPI.ts +0 -2
- package/Server/API/TelemetryAPI.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.ts +28 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/GzipRequestBody.ts +311 -0
- package/Server/Middleware/MultipartFormData.ts +87 -3
- package/Server/Middleware/SlackAuthorization.ts +96 -18
- package/Server/Services/DetectionRuleService.ts +73 -6
- package/Server/Services/Index.ts +205 -0
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +59 -0
- package/Server/Services/NetworkDeviceService.ts +148 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +65 -0
- package/Server/Services/OnCallDutyPolicyFeedService.ts +1 -1
- package/Server/Services/ProjectService.ts +29 -19
- package/Server/Services/SecurityEventService.ts +90 -13
- package/Server/Services/StatusPageResourceService.ts +223 -0
- package/Server/Services/TelemetryAttributeService.ts +17 -0
- package/Server/Services/UserService.ts +4 -6
- package/Server/Types/Markdown.ts +161 -67
- package/Server/Utils/AI/Toolbox/OnCallTools.ts +12 -4
- package/Server/Utils/AnalyticsDatabase/Statement.ts +13 -1
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +297 -6
- package/Server/Utils/Attribution.ts +4 -0
- package/Server/Utils/Marketing/MarketingEventUtil.ts +45 -7
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +55 -3
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +21 -0
- package/Server/Utils/StartServer.ts +12 -32
- package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +101 -4
- package/Server/Utils/Telemetry/LlmMetricSpend.ts +181 -0
- package/Server/Utils/Telemetry/LlmSpan.ts +46 -0
- package/Server/Utils/Workspace/Slack/Actions/Auth.ts +0 -12
- package/Server/Views/Partials/AnalyticsConsent.ejs +159 -102
- package/Server/Views/Partials/Head.ejs +2 -1
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +776 -38
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +359 -0
- package/Tests/App/Dashboard/CorrelateGraph.test.tsx +865 -0
- package/Tests/App/Dashboard/CorrelationGraph.test.ts +346 -0
- package/Tests/App/Dashboard/CriteriaFilterConditionDropdown.test.tsx +256 -0
- package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +738 -0
- package/Tests/App/Dashboard/CriteriaFilterMonitorTypeChange.test.ts +1122 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +283 -0
- package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +407 -0
- package/Tests/App/Dashboard/LlmCallsTableIdentity.test.tsx +322 -0
- package/Tests/App/Dashboard/LlmOverview.test.tsx +335 -0
- package/Tests/App/Dashboard/LlmSpanDisplay.test.ts +391 -0
- package/Tests/App/Dashboard/LlmUsageBreakdown.test.tsx +1007 -0
- package/Tests/App/Dashboard/MetricSeriesInvestigateMenu.test.tsx +5 -14
- package/Tests/App/Dashboard/MonitorCriteriaActionToggles.test.tsx +426 -0
- package/Tests/App/Dashboard/MonitorStepsCriteriaAlignmentWiring.test.tsx +352 -0
- package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +278 -0
- package/Tests/App/Dashboard/OnCallLayerShiftPreviewOverrides.test.ts +237 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +2 -2
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +460 -0
- package/Tests/App/Dashboard/SecurityEventAttributeUtil.test.ts +171 -0
- package/Tests/App/Dashboard/SecurityEventCorrelation.test.ts +857 -0
- package/Tests/App/Dashboard/SecurityEventDetailObservables.test.tsx +194 -0
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +124 -0
- package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +79 -19
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +382 -0
- package/Tests/App/StatusPage/BulkAddStatusPageMonitors.test.ts +216 -0
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +590 -11
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +757 -0
- package/Tests/Models/DiscoveryScanNameColumn.test.ts +293 -0
- package/Tests/Server/API/BaseAPI.test.ts +41 -0
- package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +9 -16
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +564 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +120 -4
- package/Tests/Server/Middleware/GzipRequestBody.test.ts +725 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +298 -0
- package/Tests/Server/Middleware/SlackAuthorization.test.ts +262 -5
- package/Tests/Server/Services/AddDetectionRuleDistinctCountColumnsMigration.test.ts +311 -0
- package/Tests/Server/Services/DetectionRuleService.test.ts +134 -2
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +7 -1
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +131 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +194 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +800 -0
- package/Tests/Server/Services/OnCallScheduleAttachRosterRefresh.test.ts +244 -0
- package/Tests/Server/Services/SecurityEventService.test.ts +376 -0
- package/Tests/Server/Services/StatusPageResourceDuplicates.test.ts +703 -0
- package/Tests/Server/Services/TelemetryAttributeServiceSecurityEvent.test.ts +256 -0
- package/Tests/Server/Types/Workflow/Components/ComponentRegistryParity.test.ts +417 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWhereOperators.test.ts +677 -0
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +43 -0
- package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +15 -11
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +369 -8
- package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +35 -0
- package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +387 -4
- package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +386 -0
- package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +804 -0
- package/Tests/Server/Views/AnalyticsConsentPartial.test.ts +48 -5
- package/Tests/Types/Code/YamlSyntax.test.ts +396 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +957 -0
- package/Tests/Types/Monitor/MonitorCriteriaActionValidation.test.ts +598 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +49 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +6 -6
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +4 -4
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +4 -3
- package/Tests/Types/Telemetry/LlmMetricConventions.test.ts +584 -0
- package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +0 -12
- package/Tests/UI/Components/CardModelDetailEdit.test.tsx +1 -17
- package/Tests/UI/Components/CodeEditor.test.tsx +474 -10
- package/Tests/UI/Components/Detail/YamlField.test.tsx +105 -0
- package/Tests/UI/Components/EntityDropdownLabelsBulkAdd.test.tsx +319 -0
- package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +231 -0
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +1 -0
- package/Tests/UI/Components/Forms/ValidationYAML.test.ts +234 -0
- package/Tests/UI/Components/ModelTable/AttributeColumns.test.tsx +573 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableAttributeColumns.test.tsx +824 -0
- package/Tests/UI/Components/ModelTable/ColumnCustomizationModalAddableColumns.test.tsx +707 -0
- package/Tests/UI/Components/SideOver.test.tsx +1 -1
- package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +294 -0
- package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +436 -0
- package/Tests/UI/Components/TableBulkCsvExport.test.tsx +6 -2
- package/Tests/UI/Components/Toggle.test.tsx +25 -0
- package/Tests/UI/Components/YamlEditor.test.tsx +847 -0
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +252 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +221 -0
- package/Tests/Utils/NetworkDiscovery/ScanNameUtil.test.ts +312 -0
- package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +468 -0
- package/Tests/Utils/Telemetry/LlmMetricQuery.test.ts +770 -0
- package/Types/Code/YamlSyntax.ts +396 -0
- package/Types/Exception/ExceptionCode.ts +1 -0
- package/Types/Exception/PayloadTooLargeException.ts +8 -0
- package/Types/Marketing/Attribution.ts +10 -0
- package/Types/Marketing/MarketingEvent.ts +4 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +116 -56
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +2 -1
- package/Types/SecurityEvent/DetectionFindingConstants.ts +11 -0
- package/Types/Telemetry/LlmConventions.ts +255 -0
- package/Types/Telemetry/LlmMetricConventions.ts +329 -0
- package/UI/Components/AutocompleteTextInput/AutocompleteTextInput.tsx +3 -0
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +10 -1
- package/UI/Components/CodeEditor/CodeEditor.tsx +241 -79
- package/UI/Components/CodeEditor/YamlEditor.tsx +369 -0
- package/UI/Components/Detail/Detail.tsx +10 -0
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +33 -0
- package/UI/Components/Forms/Fields/FormField.tsx +31 -0
- package/UI/Components/Forms/Types/Field.ts +8 -0
- package/UI/Components/Forms/Types/FormFieldSchemaType.ts +1 -0
- package/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.ts +2 -0
- package/UI/Components/Forms/Validation.ts +46 -0
- package/UI/Components/Input/Input.tsx +3 -0
- package/UI/Components/ModelTable/AttributeColumns.tsx +321 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +263 -14
- package/UI/Components/ModelTable/Column.ts +8 -0
- package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +310 -0
- package/UI/Components/ModelTable/ColumnPreference.ts +13 -1
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.tsx +2 -2
- package/UI/Components/SideOver/SideOver.tsx +5 -5
- package/UI/Components/StatusPage/ResourceGrid.tsx +82 -2
- package/UI/Components/StatusPage/ResourceList.tsx +197 -38
- package/UI/Components/Toggle/Toggle.tsx +9 -1
- package/UI/Components/Types/FieldType.ts +1 -0
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +73 -1
- package/Utils/NetworkDiscovery/ScanNameUtil.ts +181 -0
- package/Utils/StatusPage/ResourceExplorer.ts +258 -0
- package/Utils/Telemetry/LlmMetricQuery.ts +287 -0
- package/build/dist/Models/AnalyticsModels/Span.js +89 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +57 -0
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +27 -7
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +69 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +76 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +76 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +3 -19
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +0 -2
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +17 -0
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js +21 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js +42 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.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/GzipRequestBody.js +224 -0
- package/build/dist/Server/Middleware/GzipRequestBody.js.map +1 -0
- package/build/dist/Server/Middleware/MultipartFormData.js +71 -2
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Middleware/SlackAuthorization.js +58 -7
- package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +49 -4
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +204 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +50 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +124 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +68 -13
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +25 -45
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventService.js +57 -5
- package/build/dist/Server/Services/SecurityEventService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageResourceService.js +140 -0
- package/build/dist/Server/Services/StatusPageResourceService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryAttributeService.js +17 -0
- package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +2 -12
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +147 -61
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +12 -4
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +12 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +246 -9
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Attribution.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +27 -7
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +42 -7
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +18 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +12 -21
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +76 -5
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js +151 -0
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js +24 -1
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +0 -10
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
- package/build/dist/Types/Code/YamlSyntax.js +212 -0
- package/build/dist/Types/Code/YamlSyntax.js.map +1 -0
- package/build/dist/Types/Exception/ExceptionCode.js +1 -0
- package/build/dist/Types/Exception/ExceptionCode.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +8 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -0
- package/build/dist/Types/Marketing/Attribution.js +10 -0
- package/build/dist/Types/Marketing/Attribution.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +112 -51
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +2 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +9 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmConventions.js +236 -0
- package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmMetricConventions.js +290 -0
- package/build/dist/Types/Telemetry/LlmMetricConventions.js.map +1 -0
- package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js +1 -1
- package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +5 -2
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +206 -76
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js +201 -0
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -0
- package/build/dist/UI/Components/Detail/Detail.js +9 -0
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +16 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +14 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
- package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js +1 -0
- package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js +2 -0
- package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +27 -0
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +1 -1
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/AttributeColumns.js +159 -0
- package/build/dist/UI/Components/ModelTable/AttributeColumns.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +179 -17
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +133 -2
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js +7 -1
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js +2 -2
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -5
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +28 -2
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceList.js +87 -20
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
- package/build/dist/UI/Components/Toggle/Toggle.js +9 -1
- package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
- package/build/dist/UI/Components/Types/FieldType.js +1 -0
- package/build/dist/UI/Components/Types/FieldType.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +37 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js +120 -0
- package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js +171 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -1
- package/build/dist/Utils/Telemetry/LlmMetricQuery.js +175 -0
- package/build/dist/Utils/Telemetry/LlmMetricQuery.js.map +1 -0
- package/jest.config.json +2 -0
- package/package.json +1 -1
- package/tsconfig.json +2 -1
- package/Tests/UI/Components/Toast.test.tsx +0 -197
- package/Tests/UI/Components/ToastStacking.test.tsx +0 -198
- package/UI/Components/Toast/Toast.tsx +0 -189
- package/UI/Components/Toast/ToastInit.tsx +0 -110
- package/build/dist/UI/Components/Toast/Toast.js +0 -123
- package/build/dist/UI/Components/Toast/Toast.js.map +0 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +0 -53
- package/build/dist/UI/Components/Toast/ToastInit.js.map +0 -1
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import ScanNameUtil, {
|
|
2
|
+
DiscoveryScanIdentity,
|
|
3
|
+
} from "../../../Utils/NetworkDiscovery/ScanNameUtil";
|
|
4
|
+
import ColumnLength from "../../../Types/Database/ColumnLength";
|
|
5
|
+
import { describe, expect, it } from "@jest/globals";
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* Contract under test: the optional name on a Network Device Discovery Scan
|
|
9
|
+
* (issue #3391).
|
|
10
|
+
*
|
|
11
|
+
* Three rules are pinned here, because four different layers depend on all
|
|
12
|
+
* three agreeing — the create form, the server's write hooks, the Discovery
|
|
13
|
+
* Scans list, and the probe's own log lines:
|
|
14
|
+
*
|
|
15
|
+
* 1. what gets STORED (normalize): one line, trimmed, and nothing at all
|
|
16
|
+
* rather than an empty string. A scan is either named or it is not;
|
|
17
|
+
* "" is a third state that every `name ?` in the product would read as
|
|
18
|
+
* the first one and render as a blank line above the scan target.
|
|
19
|
+
* 2. what is REJECTED (getValidationError): only two things — a value that
|
|
20
|
+
* is not text, and one that would not fit the varchar(100) column. The
|
|
21
|
+
* field is optional, so absence and blankness are not errors anywhere.
|
|
22
|
+
* 3. what a scan is CALLED (getScanLabel): its name and its target
|
|
23
|
+
* together, falling back to whichever one it has. Every scan that
|
|
24
|
+
* existed before this column did has no name, so the fallback is the
|
|
25
|
+
* common case, not the edge case.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
function scan(name?: unknown, cidr?: unknown): DiscoveryScanIdentity {
|
|
29
|
+
return {
|
|
30
|
+
name: name as string | null | undefined,
|
|
31
|
+
cidr: cidr as string | null | undefined,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const MAX: number = ScanNameUtil.MAX_SCAN_NAME_LENGTH;
|
|
36
|
+
|
|
37
|
+
describe("ScanNameUtil", () => {
|
|
38
|
+
/*
|
|
39
|
+
* The ceiling is the column, not a number this module invented. A name that
|
|
40
|
+
* passes validation and then fails the INSERT would be the worst of both.
|
|
41
|
+
*/
|
|
42
|
+
it("caps names at the width of the ShortText column they are stored in", () => {
|
|
43
|
+
expect(MAX).toBe(ColumnLength.ShortText);
|
|
44
|
+
expect(MAX).toBe(100);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe("normalize", () => {
|
|
48
|
+
it("returns null when there is no name", () => {
|
|
49
|
+
expect(ScanNameUtil.normalize(undefined)).toBeNull();
|
|
50
|
+
expect(ScanNameUtil.normalize(null)).toBeNull();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
/*
|
|
54
|
+
* The distinction that matters most: an operator who typed nothing and one
|
|
55
|
+
* who typed a space have said the same thing, and the column stores the
|
|
56
|
+
* same thing for both.
|
|
57
|
+
*/
|
|
58
|
+
it("returns null for a blank name rather than an empty string", () => {
|
|
59
|
+
expect(ScanNameUtil.normalize("")).toBeNull();
|
|
60
|
+
expect(ScanNameUtil.normalize(" ")).toBeNull();
|
|
61
|
+
expect(ScanNameUtil.normalize(" ")).toBeNull();
|
|
62
|
+
expect(ScanNameUtil.normalize("\t")).toBeNull();
|
|
63
|
+
expect(ScanNameUtil.normalize("\n\n")).toBeNull();
|
|
64
|
+
// A non-breaking space pasted out of a document is still a blank box.
|
|
65
|
+
expect(ScanNameUtil.normalize("\u00A0")).toBeNull();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("keeps an ordinary name exactly as it was typed", () => {
|
|
69
|
+
expect(ScanNameUtil.normalize("Router Discovery - Region 1100")).toBe(
|
|
70
|
+
"Router Discovery - Region 1100",
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("trims the ends", () => {
|
|
75
|
+
expect(ScanNameUtil.normalize(" Switch Discovery ")).toBe(
|
|
76
|
+
"Switch Discovery",
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
/*
|
|
81
|
+
* A name is rendered in one table cell and inlined into log lines. A value
|
|
82
|
+
* pasted out of a spreadsheet cell arrives with a newline in it, and
|
|
83
|
+
* nothing downstream would ever repair that.
|
|
84
|
+
*/
|
|
85
|
+
it("folds a multi-line name onto one line", () => {
|
|
86
|
+
expect(ScanNameUtil.normalize("Router\nDiscovery")).toBe(
|
|
87
|
+
"Router Discovery",
|
|
88
|
+
);
|
|
89
|
+
expect(ScanNameUtil.normalize("Router\r\nDiscovery")).toBe(
|
|
90
|
+
"Router Discovery",
|
|
91
|
+
);
|
|
92
|
+
expect(ScanNameUtil.normalize("Router\tDiscovery")).toBe(
|
|
93
|
+
"Router Discovery",
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("collapses every run of whitespace to a single space", () => {
|
|
98
|
+
expect(ScanNameUtil.normalize("Router Discovery")).toBe(
|
|
99
|
+
"Router Discovery",
|
|
100
|
+
);
|
|
101
|
+
expect(ScanNameUtil.normalize(" WB \n\t Units ")).toBe("WB Units");
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("strips control characters, including ones with no whitespace meaning", () => {
|
|
105
|
+
expect(ScanNameUtil.normalize("Router\u0000Discovery")).toBe(
|
|
106
|
+
"Router Discovery",
|
|
107
|
+
);
|
|
108
|
+
expect(ScanNameUtil.normalize("Router\u007FDiscovery")).toBe(
|
|
109
|
+
"Router Discovery",
|
|
110
|
+
);
|
|
111
|
+
expect(ScanNameUtil.normalize("\u0001\u0002")).toBeNull();
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("leaves punctuation, accents and symbols alone", () => {
|
|
115
|
+
expect(ScanNameUtil.normalize("Switch Discovery — WB Units (v2)")).toBe(
|
|
116
|
+
"Switch Discovery — WB Units (v2)",
|
|
117
|
+
);
|
|
118
|
+
expect(ScanNameUtil.normalize("Zürich / Køge · 10%")).toBe(
|
|
119
|
+
"Zürich / Køge · 10%",
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
/*
|
|
124
|
+
* The value arrives straight from request JSON, so it is genuinely not
|
|
125
|
+
* guaranteed to be a string. normalize() answers "what would be stored",
|
|
126
|
+
* and the answer for a non-string is "nothing" — rejecting it is
|
|
127
|
+
* getValidationError's job, not this one's.
|
|
128
|
+
*/
|
|
129
|
+
it("returns null for anything that is not a string", () => {
|
|
130
|
+
expect(ScanNameUtil.normalize(1100)).toBeNull();
|
|
131
|
+
expect(ScanNameUtil.normalize(0)).toBeNull();
|
|
132
|
+
expect(ScanNameUtil.normalize(true)).toBeNull();
|
|
133
|
+
expect(ScanNameUtil.normalize({ name: "Router" })).toBeNull();
|
|
134
|
+
expect(ScanNameUtil.normalize(["Router"])).toBeNull();
|
|
135
|
+
expect(ScanNameUtil.normalize(NaN)).toBeNull();
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// Normalizing is what gets STORED, so it must not also be a length gate.
|
|
139
|
+
it("does not truncate a name that is too long to store", () => {
|
|
140
|
+
const tooLong: string = "a".repeat(MAX + 50);
|
|
141
|
+
|
|
142
|
+
expect(ScanNameUtil.normalize(tooLong)).toBe(tooLong);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it("is idempotent, so a stored name re-read is left alone", () => {
|
|
146
|
+
const messy: string = " Router \n Discovery — Region 1100 ";
|
|
147
|
+
const once: string | null = ScanNameUtil.normalize(messy);
|
|
148
|
+
|
|
149
|
+
expect(ScanNameUtil.normalize(once)).toBe(once);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
describe("getValidationError", () => {
|
|
154
|
+
it("says nothing about a missing name, because the field is optional", () => {
|
|
155
|
+
expect(ScanNameUtil.getValidationError(undefined)).toBeNull();
|
|
156
|
+
expect(ScanNameUtil.getValidationError(null)).toBeNull();
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it("says nothing about a blank name either", () => {
|
|
160
|
+
expect(ScanNameUtil.getValidationError("")).toBeNull();
|
|
161
|
+
expect(ScanNameUtil.getValidationError(" ")).toBeNull();
|
|
162
|
+
expect(ScanNameUtil.getValidationError("\n\t")).toBeNull();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it("accepts an ordinary name", () => {
|
|
166
|
+
expect(
|
|
167
|
+
ScanNameUtil.getValidationError("Router Discovery - Region 1100"),
|
|
168
|
+
).toBeNull();
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it("accepts a name of exactly the column width", () => {
|
|
172
|
+
expect(ScanNameUtil.getValidationError("a".repeat(MAX))).toBeNull();
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it("rejects a name one character past the column width", () => {
|
|
176
|
+
const error: string | null = ScanNameUtil.getValidationError(
|
|
177
|
+
"a".repeat(MAX + 1),
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
expect(error).not.toBeNull();
|
|
181
|
+
expect(error).toContain(String(MAX));
|
|
182
|
+
expect(error).toContain(String(MAX + 1));
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
/*
|
|
186
|
+
* Length is measured on what would be STORED. Rejecting a value this
|
|
187
|
+
* module was about to shorten by trimming would be refusing to save
|
|
188
|
+
* something perfectly storable.
|
|
189
|
+
*/
|
|
190
|
+
it("measures the normalized name, not the raw one", () => {
|
|
191
|
+
expect(
|
|
192
|
+
ScanNameUtil.getValidationError(` ${"a".repeat(MAX)} \n`),
|
|
193
|
+
).toBeNull();
|
|
194
|
+
|
|
195
|
+
const collapsible: string = `${"a".repeat(MAX - 2)} b`;
|
|
196
|
+
|
|
197
|
+
expect(collapsible.length).toBeGreaterThan(MAX);
|
|
198
|
+
expect(ScanNameUtil.getValidationError(collapsible)).toBeNull();
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it("rejects a value that is not text at all", () => {
|
|
202
|
+
for (const value of [1100, true, { name: "Router" }, ["Router"]]) {
|
|
203
|
+
const error: string | null = ScanNameUtil.getValidationError(value);
|
|
204
|
+
|
|
205
|
+
expect(error).not.toBeNull();
|
|
206
|
+
expect(error).toContain("text");
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
/*
|
|
211
|
+
* A non-string is reported rather than silently dropped: a client sending
|
|
212
|
+
* `{"name": 1100}` has made a type error, and quietly storing no name at
|
|
213
|
+
* all would hide it until someone noticed the scan was unnamed.
|
|
214
|
+
*/
|
|
215
|
+
it("does not accept a non-string merely because it normalizes to nothing", () => {
|
|
216
|
+
expect(ScanNameUtil.normalize(1100)).toBeNull();
|
|
217
|
+
expect(ScanNameUtil.getValidationError(1100)).not.toBeNull();
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
describe("getDisplayName", () => {
|
|
222
|
+
it("is the normalized name", () => {
|
|
223
|
+
expect(ScanNameUtil.getDisplayName(scan(" Router Discovery "))).toBe(
|
|
224
|
+
"Router Discovery",
|
|
225
|
+
);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
* Normalized on the way OUT as well as in, because rows written before the
|
|
230
|
+
* column existed — and any writer that bypasses the hooks — are not
|
|
231
|
+
* guaranteed to have been through normalize().
|
|
232
|
+
*/
|
|
233
|
+
it("is null for a scan with no usable name, whatever the row holds", () => {
|
|
234
|
+
expect(ScanNameUtil.getDisplayName(scan(undefined))).toBeNull();
|
|
235
|
+
expect(ScanNameUtil.getDisplayName(scan(null))).toBeNull();
|
|
236
|
+
expect(ScanNameUtil.getDisplayName(scan(""))).toBeNull();
|
|
237
|
+
expect(ScanNameUtil.getDisplayName(scan(" "))).toBeNull();
|
|
238
|
+
expect(ScanNameUtil.getDisplayName(scan(1100))).toBeNull();
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it("ignores the scan target entirely", () => {
|
|
242
|
+
expect(
|
|
243
|
+
ScanNameUtil.getDisplayName(scan(undefined, "10.15.128.0-255")),
|
|
244
|
+
).toBeNull();
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
it("reads a row that selected no name column at all", () => {
|
|
248
|
+
expect(ScanNameUtil.getDisplayName({})).toBeNull();
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
describe("getScanLabel", () => {
|
|
253
|
+
it("names a named scan and says what it sweeps", () => {
|
|
254
|
+
expect(
|
|
255
|
+
ScanNameUtil.getScanLabel(
|
|
256
|
+
scan("Router Discovery - Region 1100", "10.15.128.0-255"),
|
|
257
|
+
),
|
|
258
|
+
).toBe("Router Discovery - Region 1100 (10.15.128.0-255)");
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
// Exactly what every log line and modal said before names existed.
|
|
262
|
+
it("falls back to the target for an unnamed scan", () => {
|
|
263
|
+
expect(
|
|
264
|
+
ScanNameUtil.getScanLabel(scan(undefined, "10.15.128.0-255")),
|
|
265
|
+
).toBe("10.15.128.0-255");
|
|
266
|
+
expect(ScanNameUtil.getScanLabel(scan("", "192.168.1.0/24"))).toBe(
|
|
267
|
+
"192.168.1.0/24",
|
|
268
|
+
);
|
|
269
|
+
expect(ScanNameUtil.getScanLabel(scan(" ", "192.168.1.0/24"))).toBe(
|
|
270
|
+
"192.168.1.0/24",
|
|
271
|
+
);
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
it("uses the name alone when the target was not selected", () => {
|
|
275
|
+
expect(ScanNameUtil.getScanLabel(scan("Router Discovery"))).toBe(
|
|
276
|
+
"Router Discovery",
|
|
277
|
+
);
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
/*
|
|
281
|
+
* Returned empty rather than invented: the only caller that can see this
|
|
282
|
+
* is one that selected neither column, and each of them appends its own
|
|
283
|
+
* fallback (the scan id).
|
|
284
|
+
*/
|
|
285
|
+
it("is empty when the row carries neither", () => {
|
|
286
|
+
expect(ScanNameUtil.getScanLabel({})).toBe("");
|
|
287
|
+
expect(ScanNameUtil.getScanLabel(scan(null, null))).toBe("");
|
|
288
|
+
expect(ScanNameUtil.getScanLabel(scan(" ", " "))).toBe("");
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
it("normalizes both halves", () => {
|
|
292
|
+
expect(
|
|
293
|
+
ScanNameUtil.getScanLabel(scan(" Router\nDiscovery ", " 10.0.0.0/24 ")),
|
|
294
|
+
).toBe("Router Discovery (10.0.0.0/24)");
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it("ignores a target that is not text", () => {
|
|
298
|
+
expect(ScanNameUtil.getScanLabel(scan("Router Discovery", 10))).toBe(
|
|
299
|
+
"Router Discovery",
|
|
300
|
+
);
|
|
301
|
+
expect(ScanNameUtil.getScanLabel(scan(undefined, 10))).toBe("");
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
it("does not truncate, so a log line always names the whole scan", () => {
|
|
305
|
+
const long: string = "a".repeat(MAX);
|
|
306
|
+
|
|
307
|
+
expect(ScanNameUtil.getScanLabel(scan(long, "10.0.0.0/24"))).toBe(
|
|
308
|
+
`${long} (10.0.0.0/24)`,
|
|
309
|
+
);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
});
|