@oneuptime/common 12.0.5 → 12.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AIRun.ts +33 -0
- package/Models/DatabaseModels/DataSource.ts +744 -0
- package/Models/DatabaseModels/Index.ts +3 -0
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
- package/Models/DatabaseModels/User.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
- package/Models/DatabaseModels/UserSession.ts +2 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +6 -4
- package/Models/DatabaseModels/UserWebAuthn.ts +5 -3
- package/Server/API/AIInsightAPI.ts +47 -4
- package/Server/API/AIInvestigationAPI.ts +25 -0
- package/Server/API/DashboardAPI.ts +176 -492
- package/Server/API/DataSourceAPI.ts +268 -0
- package/Server/API/StatusPageAPI.ts +11 -1
- package/Server/API/UserAPI.ts +119 -0
- package/Server/Infrastructure/ClickhouseConfig.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.ts +24 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.ts +76 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Infrastructure/Queue.ts +26 -0
- package/Server/Infrastructure/QueueWorker.ts +17 -0
- package/Server/Middleware/TelemetryIngest.ts +8 -3
- package/Server/Services/AIInsightService.ts +132 -12
- package/Server/Services/AIRunService.ts +34 -0
- package/Server/Services/AIService.ts +17 -2
- package/Server/Services/AlertService.ts +38 -32
- package/Server/Services/AnalyticsDatabaseService.ts +8 -4
- package/Server/Services/DataSourceService.ts +200 -0
- package/Server/Services/HostService.ts +92 -0
- package/Server/Services/IncidentService.ts +45 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/MonitorService.ts +49 -0
- package/Server/Services/MonitorStatusService.ts +166 -0
- package/Server/Services/OpenTelemetryIngestService.ts +255 -184
- package/Server/Services/RumSessionPinService.ts +7 -21
- package/Server/Services/StatusPageSubscriberService.ts +13 -0
- package/Server/Services/UserService.ts +280 -9
- package/Server/Static/Vendor/README.md +62 -0
- package/Server/Static/Vendor/fonts/InterVariable.woff2 +0 -0
- package/Server/Static/Vendor/highlight/highlight.min.js +1244 -0
- package/Server/Static/Vendor/highlight/languages/apache.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/bash.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/c.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/cpp.min.js +47 -0
- package/Server/Static/Vendor/highlight/languages/csharp.min.js +49 -0
- package/Server/Static/Vendor/highlight/languages/css.min.js +31 -0
- package/Server/Static/Vendor/highlight/languages/diff.min.js +9 -0
- package/Server/Static/Vendor/highlight/languages/dns.min.js +11 -0
- package/Server/Static/Vendor/highlight/languages/dockerfile.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/go.min.js +20 -0
- package/Server/Static/Vendor/highlight/languages/graphql.min.js +12 -0
- package/Server/Static/Vendor/highlight/languages/http.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/ini.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/java.min.js +38 -0
- package/Server/Static/Vendor/highlight/languages/javascript.min.js +81 -0
- package/Server/Static/Vendor/highlight/languages/json.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/kotlin.min.js +46 -0
- package/Server/Static/Vendor/highlight/languages/lua.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/makefile.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/nginx.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/perl.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/php.min.js +59 -0
- package/Server/Static/Vendor/highlight/languages/powershell.min.js +39 -0
- package/Server/Static/Vendor/highlight/languages/python.min.js +42 -0
- package/Server/Static/Vendor/highlight/languages/r.min.js +26 -0
- package/Server/Static/Vendor/highlight/languages/ruby.min.js +54 -0
- package/Server/Static/Vendor/highlight/languages/rust.min.js +27 -0
- package/Server/Static/Vendor/highlight/languages/scala.min.js +28 -0
- package/Server/Static/Vendor/highlight/languages/sql.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/swift.min.js +68 -0
- package/Server/Static/Vendor/highlight/languages/typescript.min.js +99 -0
- package/Server/Static/Vendor/highlight/languages/xml.min.js +29 -0
- package/Server/Static/Vendor/highlight/languages/yaml.min.js +28 -0
- package/Server/Static/Vendor/highlight/styles/github-dark.min.css +10 -0
- package/Server/Static/Vendor/highlight/styles/vs2015.min.css +1 -0
- package/Server/Static/Vendor/tailwind/tailwind-3.4.5.js +21028 -0
- package/Server/Types/Database/Permissions/BasePermission.ts +7 -0
- package/Server/Types/Database/Permissions/DeletePermission.ts +2 -0
- package/Server/Types/Database/Permissions/ReadPermission.ts +3 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +101 -16
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +2 -2
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +90 -11
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.ts +125 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +25 -15
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +256 -57
- package/Server/Utils/AI/SRE/Insights/InsightStore.ts +76 -18
- package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
- package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +7 -2
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +1793 -0
- package/Server/Utils/Dashboard/PublicDashboardViewConfig.ts +65 -0
- package/Server/Utils/DataSource/ConnectorRegistry.ts +53 -0
- package/Server/Utils/DataSource/Connectors/ClickHouseConnector.ts +338 -0
- package/Server/Utils/DataSource/Connectors/ElasticsearchConnector.ts +717 -0
- package/Server/Utils/DataSource/Connectors/LokiConnector.ts +606 -0
- package/Server/Utils/DataSource/Connectors/MySqlConnector.ts +307 -0
- package/Server/Utils/DataSource/Connectors/PostgresConnector.ts +260 -0
- package/Server/Utils/DataSource/Connectors/PrometheusConnector.ts +555 -0
- package/Server/Utils/DataSource/Connectors/RestApiConnector.ts +597 -0
- package/Server/Utils/DataSource/Connectors/SqlServerConnector.ts +318 -0
- package/Server/Utils/DataSource/EgressGuard.ts +446 -0
- package/Server/Utils/DataSource/HttpFetch.ts +221 -0
- package/Server/Utils/DataSource/SqlQueryGuard.ts +383 -0
- package/Server/Utils/DataSource/SqlResultShaper.ts +372 -0
- package/Server/Utils/DataSource/Types.ts +93 -0
- package/Server/Utils/Database/PostgresErrorTranslator.ts +172 -17
- package/Server/Utils/InProcessMemo.ts +141 -0
- package/Server/Utils/InstanceHealth/TelemetryIngestion.ts +628 -0
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +58 -0
- package/Server/Utils/Monitor/MonitorResource.ts +14 -0
- package/Server/Utils/Response.ts +12 -1
- package/Server/Utils/SSRFProtection.ts +237 -0
- package/Server/Utils/StartServer.ts +8 -0
- package/Server/Utils/StatusPageSubscriberWebhook.ts +30 -0
- package/Server/Utils/Telemetry/CaptureSpan.ts +30 -18
- package/Server/Utils/Telemetry/IngestionTimestamp.ts +75 -0
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +99 -7
- package/Server/Utils/Telemetry/Telemetry.ts +112 -1
- package/Server/Utils/Telemetry.ts +104 -3
- package/Server/Utils/VendorAssets.ts +165 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +28 -5
- package/Server/Utils/Workspace/Slack/Slack.ts +5 -0
- package/Server/Views/Partials/Head.ejs +21 -7
- package/Tests/App/AdminDashboard/AdminProjectsIdFilter.test.tsx +207 -0
- package/Tests/App/AdminDashboard/AdminUsersIdFilter.test.tsx +216 -0
- package/Tests/App/Dashboard/AIInsightViewActions.test.tsx +422 -0
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +10 -3
- package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +387 -0
- package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +199 -0
- package/Tests/App/Dashboard/DataSourceChartSyntheticConfig.test.tsx +736 -0
- package/Tests/App/Dashboard/DataSourceQueryEditor.test.tsx +868 -0
- package/Tests/App/Dashboard/DataSourceWidgetCatalog.test.ts +440 -0
- package/Tests/App/Dashboard/DataSourceWidgetFetching.test.tsx +2109 -0
- package/Tests/App/Dashboard/DataSourceWidgetViews.test.tsx +726 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +514 -3
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +391 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +326 -0
- package/Tests/App/Dashboard/SideMenuHarness.tsx +187 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +6 -1
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
- package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +187 -0
- package/Tests/Server/API/DashboardPublicDataSourceStrip.test.ts +686 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +585 -823
- package/Tests/Server/API/DataSourceAPIRoutes.test.ts +486 -0
- package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +291 -0
- package/Tests/Server/API/UserAuthenticationAPI.test.ts +641 -0
- package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +441 -0
- package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +140 -0
- package/Tests/Server/Services/AIInsightService.test.ts +266 -11
- package/Tests/Server/Services/AIRunAnalysisTldrPersistence.test.ts +160 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +4 -0
- package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
- package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
- package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +397 -0
- package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +41 -2
- package/Tests/Server/Services/IncidentMetricResourceAttributes.test.ts +408 -0
- package/Tests/Server/Services/MonitorStatusServiceDeleteReferenceCleanup.test.ts +351 -0
- package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +171 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +398 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +19 -0
- package/Tests/Server/Services/ProjectCallSMSConfigCredentialUniqueness.test.ts +305 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +36 -1
- package/Tests/Server/Services/RumSessionPinUniqueViolationRecovery.test.ts +163 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +973 -0
- package/Tests/Server/Types/Database/ObjectIdColumnQuery.test.ts +262 -0
- package/Tests/Server/Types/Database/Permissions/TenantPermission.test.ts +358 -0
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +2 -2
- package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +6 -1
- package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +121 -4
- package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
- package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +292 -0
- package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
- package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +857 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardViewConfig.test.ts +480 -0
- package/Tests/Server/Utils/DataSource/ClickHouseConnector.test.ts +759 -0
- package/Tests/Server/Utils/DataSource/ConnectorRegistry.test.ts +37 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +645 -0
- package/Tests/Server/Utils/DataSource/ElasticsearchConnector.test.ts +1206 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +616 -0
- package/Tests/Server/Utils/DataSource/LokiConnector.test.ts +970 -0
- package/Tests/Server/Utils/DataSource/MySqlConnector.test.ts +935 -0
- package/Tests/Server/Utils/DataSource/PostgresConnector.test.ts +854 -0
- package/Tests/Server/Utils/DataSource/PrometheusConnector.test.ts +881 -0
- package/Tests/Server/Utils/DataSource/RestApiConnector.test.ts +1020 -0
- package/Tests/Server/Utils/DataSource/SqlQueryGuard.test.ts +425 -0
- package/Tests/Server/Utils/DataSource/SqlResultShaper.test.ts +555 -0
- package/Tests/Server/Utils/DataSource/SqlServerConnector.test.ts +934 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +228 -7
- package/Tests/Server/Utils/InProcessMemo.test.ts +292 -0
- package/Tests/Server/Utils/InstanceHealth/TelemetryIngestion.test.ts +960 -0
- package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +103 -0
- package/Tests/Server/Utils/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
- package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +143 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +193 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhook.test.ts +101 -0
- package/Tests/Server/Utils/TailwindBuildCopy.test.ts +225 -0
- package/Tests/Server/Utils/Telemetry/ResourceHeartbeatL1Memo.test.ts +355 -0
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +128 -0
- package/Tests/Server/Utils/Telemetry/TelemetryUtilAttributeKeys.test.ts +381 -0
- package/Tests/Server/Utils/Telemetry.test.ts +87 -0
- package/Tests/Server/Utils/VendorAssetIntegrity.test.ts +343 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +671 -0
- package/Tests/Server/Views/OfflineRender.test.ts +297 -0
- package/Tests/Types/Dashboard/DataSourceComponentTypes.test.ts +618 -0
- package/Tests/Types/DateClickhouseFormat.test.ts +192 -0
- package/Tests/Types/Password.test.ts +363 -0
- package/Tests/UI/Components/ConfirmModal.test.tsx +7 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +53 -0
- package/Tests/UI/Components/Modal.test.tsx +281 -1
- package/Tests/UI/Components/ObjectIdFilterPipeline.test.tsx +396 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/Utils/Analytics.test.ts +23 -0
- package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -0
- package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +138 -0
- package/Tests/Utils/DataSource/DataSourceValueReducer.test.ts +526 -0
- package/Tests/Utils/Metrics/MetricResourceAttributeUtil.test.ts +691 -0
- package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
- package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +931 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +288 -0
- package/Tests/Utils/Telemetry/IngestionTimestamp.test.ts +170 -0
- package/Types/AI/AIInsightEvidence.ts +6 -0
- package/Types/Analytics/RevenueEvent.ts +31 -0
- package/Types/Dashboard/DashboardComponentType.ts +31 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.ts +27 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.ts +32 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.ts +30 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.ts +55 -0
- package/Types/DataSource/DataSourceLimits.ts +62 -0
- package/Types/DataSource/DataSourceQueryConfig.ts +41 -0
- package/Types/DataSource/DataSourceTableResult.ts +38 -0
- package/Types/DataSource/DataSourceType.ts +213 -0
- package/Types/Date.ts +43 -3
- package/Types/Password.ts +64 -0
- package/Types/Permission.ts +46 -0
- package/Types/UserAuthenticationStatus.ts +34 -0
- package/UI/Components/Button/Button.tsx +1 -1
- package/UI/Components/ErrorBoundary.tsx +459 -108
- package/UI/Components/Icon/Icon.tsx +10 -9
- package/UI/Components/Modal/ConfirmModal.tsx +6 -1
- package/UI/Components/Modal/Modal.tsx +267 -35
- package/UI/Components/Modal/ModalFooter.tsx +6 -1
- package/UI/Components/MoreMenu/MoreMenu.tsx +19 -4
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +6 -1
- package/UI/Components/StatusPage/ResourceGrid.tsx +314 -0
- package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +808 -0
- package/UI/Components/StatusPage/ResourceList.tsx +570 -0
- package/UI/Styles/Theme.css +18 -0
- package/UI/Utils/API/RequestOptions.ts +7 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +1 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +1 -0
- package/UI/Utils/TestDataSource.ts +61 -0
- package/UI/esbuild-config.js +45 -0
- package/Utils/Analytics.ts +15 -0
- package/Utils/Dashboard/Components/DashboardDataSourceChartComponent.ts +88 -0
- package/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.ts +123 -0
- package/Utils/Dashboard/Components/DashboardDataSourceShared.ts +16 -0
- package/Utils/Dashboard/Components/DashboardDataSourceTableComponent.ts +72 -0
- package/Utils/Dashboard/Components/DashboardDataSourceValueComponent.ts +126 -0
- package/Utils/Dashboard/Components/Index.ts +28 -0
- package/Utils/DataSource/DataSourceQueryText.ts +94 -0
- package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
- package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
- package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
- package/Utils/StatusPage/ResourceExplorer.ts +853 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +34 -0
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DataSource.js +774 -0
- package/build/dist/Models/DatabaseModels/DataSource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +14 -4
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +2 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSession.js +2 -0
- package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +6 -4
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +5 -3
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +34 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +23 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +119 -433
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DataSourceAPI.js +173 -0
- package/build/dist/Server/API/DataSourceAPI.js.map +1 -0
- package/build/dist/Server/API/StatusPageAPI.js +11 -1
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +94 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +49 -0
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js +64 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.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/Infrastructure/Queue.js +27 -0
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +13 -0
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +8 -3
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIInsightService.js +110 -10
- package/build/dist/Server/Services/AIInsightService.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +34 -0
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +16 -2
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +28 -35
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +8 -4
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DataSourceService.js +159 -0
- package/build/dist/Server/Services/DataSourceService.js.map +1 -0
- package/build/dist/Server/Services/HostService.js +74 -0
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +35 -24
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +45 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusService.js +129 -0
- package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +222 -159
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +7 -15
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +10 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +241 -10
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +6 -0
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js +1 -0
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +2 -0
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +68 -12
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +2 -2
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +68 -8
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js +97 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +17 -15
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +178 -54
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +65 -16
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js +303 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +1261 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js +47 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js +42 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js +187 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js +493 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js +399 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js +195 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js +149 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js +362 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js +342 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js +186 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +305 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +134 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js +331 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js +280 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Types.js +2 -0
- package/build/dist/Server/Utils/DataSource/Types.js.map +1 -0
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +103 -9
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
- package/build/dist/Server/Utils/InProcessMemo.js +113 -0
- package/build/dist/Server/Utils/InProcessMemo.js.map +1 -0
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js +406 -0
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +34 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +14 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +9 -1
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +192 -0
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +7 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +24 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +25 -11
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js +32 -0
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +92 -5
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +92 -6
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +93 -6
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +121 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +5 -0
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/Analytics/RevenueEvent.js +26 -0
- package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +27 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js +16 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js +47 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js +10 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js +14 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceType.js +183 -0
- package/build/dist/Types/DataSource/DataSourceType.js.map +1 -0
- package/build/dist/Types/Date.js +38 -3
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Password.js +56 -0
- package/build/dist/Types/Password.js.map +1 -0
- package/build/dist/Types/Permission.js +42 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/UserAuthenticationStatus.js +2 -0
- package/build/dist/Types/UserAuthenticationStatus.js.map +1 -0
- package/build/dist/UI/Components/ErrorBoundary.js +388 -72
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +10 -4
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +178 -19
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +3 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +9 -6
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +7 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +119 -0
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +354 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js +203 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -0
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +1 -6
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +3 -8
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/TestDataSource.js +39 -0
- package/build/dist/UI/Utils/TestDataSource.js.map +1 -0
- package/build/dist/Utils/Analytics.js +4 -0
- package/build/dist/Utils/Analytics.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js +79 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js +111 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js +15 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js +62 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js +112 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/DataSource/DataSourceQueryText.js +64 -0
- package/build/dist/Utils/DataSource/DataSourceQueryText.js.map +1 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js +124 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js +281 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +8 -6
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js +560 -0
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +5 -1
- package/tsconfig.json +12 -10
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
import { describe, expect, test } from "@jest/globals";
|
|
2
|
+
import DashboardComponentType, {
|
|
3
|
+
DataSourceComponentTypes,
|
|
4
|
+
isDataSourceComponentType,
|
|
5
|
+
} from "../../../Types/Dashboard/DashboardComponentType";
|
|
6
|
+
import DashboardBaseComponent from "../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
|
|
7
|
+
import DashboardViewConfig from "../../../Types/Dashboard/DashboardViewConfig";
|
|
8
|
+
import {
|
|
9
|
+
DashboardTemplate,
|
|
10
|
+
DashboardTemplates,
|
|
11
|
+
getTemplateConfig,
|
|
12
|
+
} from "../../../Types/Dashboard/DashboardTemplates";
|
|
13
|
+
import DashboardChartComponentUtil from "../../../Utils/Dashboard/Components/DashboardChartComponent";
|
|
14
|
+
import DashboardValueComponentUtil from "../../../Utils/Dashboard/Components/DashboardValueComponent";
|
|
15
|
+
import DashboardGaugeComponentUtil from "../../../Utils/Dashboard/Components/DashboardGaugeComponent";
|
|
16
|
+
import DashboardTableComponentUtil from "../../../Utils/Dashboard/Components/DashboardTableComponent";
|
|
17
|
+
import DashboardDataSourceChartComponentUtil from "../../../Utils/Dashboard/Components/DashboardDataSourceChartComponent";
|
|
18
|
+
import DashboardDataSourceValueComponentUtil from "../../../Utils/Dashboard/Components/DashboardDataSourceValueComponent";
|
|
19
|
+
import DashboardDataSourceGaugeComponentUtil from "../../../Utils/Dashboard/Components/DashboardDataSourceGaugeComponent";
|
|
20
|
+
import DashboardDataSourceTableComponentUtil from "../../../Utils/Dashboard/Components/DashboardDataSourceTableComponent";
|
|
21
|
+
|
|
22
|
+
/*
|
|
23
|
+
* External Data Source widgets used to be a *mode* of the metric widgets:
|
|
24
|
+
* one component type, two mutually exclusive argument shapes, and a runtime
|
|
25
|
+
* branch everywhere that read them. They are now four component types of
|
|
26
|
+
* their own. This file guards the taxonomy that split created, because the
|
|
27
|
+
* component type is persisted by value inside Dashboard.dashboardViewConfig
|
|
28
|
+
* (JSONB) — a renamed member, a key/value drift, or a widget that quietly
|
|
29
|
+
* joins/leaves the DataSource set orphans every dashboard already saved,
|
|
30
|
+
* and nothing else in the build would notice.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
type HasOwnFunction = (target: Record<string, unknown>, key: string) => boolean;
|
|
34
|
+
|
|
35
|
+
const hasOwn: HasOwnFunction = (
|
|
36
|
+
target: Record<string, unknown>,
|
|
37
|
+
key: string,
|
|
38
|
+
): boolean => {
|
|
39
|
+
return Object.prototype.hasOwnProperty.call(target, key);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
type ArgumentsOfFunction = (
|
|
43
|
+
component: DashboardBaseComponent,
|
|
44
|
+
) => Record<string, unknown>;
|
|
45
|
+
|
|
46
|
+
const argumentsOf: ArgumentsOfFunction = (
|
|
47
|
+
component: DashboardBaseComponent,
|
|
48
|
+
): Record<string, unknown> => {
|
|
49
|
+
return (component.arguments as Record<string, unknown> | undefined) || {};
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const ALL_COMPONENT_TYPES: Array<DashboardComponentType> = Object.values(
|
|
53
|
+
DashboardComponentType,
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const EXPECTED_DATA_SOURCE_TYPES: Array<DashboardComponentType> = [
|
|
57
|
+
DashboardComponentType.DataSourceChart,
|
|
58
|
+
DashboardComponentType.DataSourceValue,
|
|
59
|
+
DashboardComponentType.DataSourceGauge,
|
|
60
|
+
DashboardComponentType.DataSourceTable,
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
interface WidgetDefault {
|
|
64
|
+
label: string;
|
|
65
|
+
component: DashboardBaseComponent;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
* Built once through the same utils the "add widget" flow uses, so these
|
|
70
|
+
* are literally the objects that get written to the database.
|
|
71
|
+
*/
|
|
72
|
+
const METRIC_WIDGET_DEFAULTS: Array<WidgetDefault> = [
|
|
73
|
+
{
|
|
74
|
+
label: "Chart",
|
|
75
|
+
component: DashboardChartComponentUtil.getDefaultComponent(),
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
label: "Value",
|
|
79
|
+
component: DashboardValueComponentUtil.getDefaultComponent(),
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
label: "Gauge",
|
|
83
|
+
component: DashboardGaugeComponentUtil.getDefaultComponent(),
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
label: "Table",
|
|
87
|
+
component: DashboardTableComponentUtil.getDefaultComponent(),
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
|
|
91
|
+
const DATA_SOURCE_WIDGET_DEFAULTS: Array<WidgetDefault> = [
|
|
92
|
+
{
|
|
93
|
+
label: "DataSourceChart",
|
|
94
|
+
component: DashboardDataSourceChartComponentUtil.getDefaultComponent(),
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
label: "DataSourceValue",
|
|
98
|
+
component: DashboardDataSourceValueComponentUtil.getDefaultComponent(),
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
label: "DataSourceGauge",
|
|
102
|
+
component: DashboardDataSourceGaugeComponentUtil.getDefaultComponent(),
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
label: "DataSourceTable",
|
|
106
|
+
component: DashboardDataSourceTableComponentUtil.getDefaultComponent(),
|
|
107
|
+
},
|
|
108
|
+
];
|
|
109
|
+
|
|
110
|
+
/*
|
|
111
|
+
* Argument keys that mean "this widget reads an external Data Source" — the
|
|
112
|
+
* keys the four new widgets ACTUALLY use. A metric widget carrying either of
|
|
113
|
+
* these would be the crammed-together design creeping back.
|
|
114
|
+
*/
|
|
115
|
+
const DATA_SOURCE_ONLY_ARGUMENT_KEYS: Array<string> = ["query", "queries"];
|
|
116
|
+
|
|
117
|
+
/*
|
|
118
|
+
* The keys the pre-split design used to hang external queries off the metric
|
|
119
|
+
* widgets. Kept as a separate list because they name a shape that no longer
|
|
120
|
+
* exists anywhere: an assertion over them can only ever pass, so it guards
|
|
121
|
+
* the old names coming back rather than the current invariant.
|
|
122
|
+
*/
|
|
123
|
+
const REMOVED_DATA_SOURCE_ARGUMENT_KEYS: Array<string> = [
|
|
124
|
+
"dataSourceQueryConfig",
|
|
125
|
+
"dataSourceQueryConfigs",
|
|
126
|
+
];
|
|
127
|
+
|
|
128
|
+
// Argument keys that mean "this widget reads OneUptime's own telemetry".
|
|
129
|
+
const METRIC_ONLY_ARGUMENT_KEYS: Array<string> = [
|
|
130
|
+
"metricQueryConfig",
|
|
131
|
+
"metricQueryConfigs",
|
|
132
|
+
"metricFormulaConfigs",
|
|
133
|
+
"columns",
|
|
134
|
+
"groupByAttributes",
|
|
135
|
+
];
|
|
136
|
+
|
|
137
|
+
interface TemplateComponent {
|
|
138
|
+
templateName: string;
|
|
139
|
+
component: DashboardBaseComponent;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
type CollectTemplateComponentsFunction = () => Array<TemplateComponent>;
|
|
143
|
+
|
|
144
|
+
const collectTemplateComponents: CollectTemplateComponentsFunction =
|
|
145
|
+
(): Array<TemplateComponent> => {
|
|
146
|
+
const collected: Array<TemplateComponent> = [];
|
|
147
|
+
|
|
148
|
+
for (const template of DashboardTemplates) {
|
|
149
|
+
const config: DashboardViewConfig | null = getTemplateConfig(
|
|
150
|
+
template.type,
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
if (!config) {
|
|
154
|
+
// Blank is a catalog entry with no config, by design.
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
for (const component of config.components) {
|
|
159
|
+
collected.push({
|
|
160
|
+
templateName: template.name,
|
|
161
|
+
component: component,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return collected;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
describe("DashboardComponentType taxonomy", () => {
|
|
170
|
+
test("the enum declares exactly the four DataSource* members", (): void => {
|
|
171
|
+
const dataSourceKeys: Array<string> = Object.keys(
|
|
172
|
+
DashboardComponentType,
|
|
173
|
+
).filter((key: string): boolean => {
|
|
174
|
+
return key.startsWith("DataSource");
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
expect(dataSourceKeys.sort()).toEqual(
|
|
178
|
+
[
|
|
179
|
+
"DataSourceChart",
|
|
180
|
+
"DataSourceGauge",
|
|
181
|
+
"DataSourceTable",
|
|
182
|
+
"DataSourceValue",
|
|
183
|
+
].sort(),
|
|
184
|
+
);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test("DataSourceComponentTypes lists precisely those four members", (): void => {
|
|
188
|
+
const listed: Array<string> = DataSourceComponentTypes.map(
|
|
189
|
+
(type: DashboardComponentType): string => {
|
|
190
|
+
return type.toString();
|
|
191
|
+
},
|
|
192
|
+
).sort();
|
|
193
|
+
|
|
194
|
+
const expected: Array<string> = EXPECTED_DATA_SOURCE_TYPES.map(
|
|
195
|
+
(type: DashboardComponentType): string => {
|
|
196
|
+
return type.toString();
|
|
197
|
+
},
|
|
198
|
+
).sort();
|
|
199
|
+
|
|
200
|
+
expect(listed).toEqual(expected);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test("DataSourceComponentTypes contains no duplicates", (): void => {
|
|
204
|
+
const unique: Set<DashboardComponentType> = new Set<DashboardComponentType>(
|
|
205
|
+
DataSourceComponentTypes,
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
expect(unique.size).toBe(DataSourceComponentTypes.length);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test("every DataSourceComponentTypes entry is a real enum member", (): void => {
|
|
212
|
+
for (const type of DataSourceComponentTypes) {
|
|
213
|
+
expect(ALL_COMPONENT_TYPES).toContain(type);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
/*
|
|
218
|
+
* The enum is persisted by VALUE. A key/value drift (renaming the key but
|
|
219
|
+
* not the string, or vice versa) reads fine in TypeScript but silently
|
|
220
|
+
* orphans every widget already stored under the old string.
|
|
221
|
+
*/
|
|
222
|
+
test("every enum key equals its string value", (): void => {
|
|
223
|
+
const entries: Array<[string, string]> = Object.entries(
|
|
224
|
+
DashboardComponentType,
|
|
225
|
+
) as Array<[string, string]>;
|
|
226
|
+
|
|
227
|
+
expect(entries.length).toBeGreaterThan(EXPECTED_DATA_SOURCE_TYPES.length);
|
|
228
|
+
|
|
229
|
+
for (const [key, value] of entries) {
|
|
230
|
+
expect(`${key} => ${value}`).toBe(`${key} => ${key}`);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
test("enum values are unique, so two widget types cannot collide in storage", (): void => {
|
|
235
|
+
const unique: Set<string> = new Set<string>(
|
|
236
|
+
ALL_COMPONENT_TYPES.map((type: DashboardComponentType): string => {
|
|
237
|
+
return type.toString();
|
|
238
|
+
}),
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
expect(unique.size).toBe(ALL_COMPONENT_TYPES.length);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
describe("isDataSourceComponentType", () => {
|
|
246
|
+
/*
|
|
247
|
+
* Iterating the enum rather than hard-coding a deny list is the point: a
|
|
248
|
+
* widget type added later cannot silently join the external-data class
|
|
249
|
+
* (which is, among other things, what the public dashboard excludes).
|
|
250
|
+
*/
|
|
251
|
+
test("returns true for exactly the four DataSource types and false for every other member", (): void => {
|
|
252
|
+
for (const type of ALL_COMPONENT_TYPES) {
|
|
253
|
+
const expected: boolean = EXPECTED_DATA_SOURCE_TYPES.includes(type);
|
|
254
|
+
|
|
255
|
+
expect(`${type}: ${isDataSourceComponentType(type)}`).toBe(
|
|
256
|
+
`${type}: ${expected}`,
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
test("returns true for each of the four DataSource types by name", (): void => {
|
|
262
|
+
expect(
|
|
263
|
+
isDataSourceComponentType(DashboardComponentType.DataSourceChart),
|
|
264
|
+
).toBe(true);
|
|
265
|
+
expect(
|
|
266
|
+
isDataSourceComponentType(DashboardComponentType.DataSourceValue),
|
|
267
|
+
).toBe(true);
|
|
268
|
+
expect(
|
|
269
|
+
isDataSourceComponentType(DashboardComponentType.DataSourceGauge),
|
|
270
|
+
).toBe(true);
|
|
271
|
+
expect(
|
|
272
|
+
isDataSourceComponentType(DashboardComponentType.DataSourceTable),
|
|
273
|
+
).toBe(true);
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
test("the metric widgets it replaced are not data source types", (): void => {
|
|
277
|
+
expect(isDataSourceComponentType(DashboardComponentType.Chart)).toBe(false);
|
|
278
|
+
expect(isDataSourceComponentType(DashboardComponentType.Value)).toBe(false);
|
|
279
|
+
expect(isDataSourceComponentType(DashboardComponentType.Gauge)).toBe(false);
|
|
280
|
+
expect(isDataSourceComponentType(DashboardComponentType.Table)).toBe(false);
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
/*
|
|
284
|
+
* Stored dashboards are JSONB: the componentType reaching this guard is
|
|
285
|
+
* whatever string was written, including strings from an older or newer
|
|
286
|
+
* build. It must answer false rather than throw.
|
|
287
|
+
*/
|
|
288
|
+
test("tolerates arbitrary strings cast in from stored JSONB", (): void => {
|
|
289
|
+
const garbageValues: Array<string> = [
|
|
290
|
+
"",
|
|
291
|
+
" ",
|
|
292
|
+
"\n\t",
|
|
293
|
+
"datasourcechart",
|
|
294
|
+
"DATASOURCECHART",
|
|
295
|
+
"DataSourceChart ",
|
|
296
|
+
" DataSourceChart",
|
|
297
|
+
"DataSource",
|
|
298
|
+
"DataSourceHeatmap",
|
|
299
|
+
"DataSourceChart,DataSourceValue",
|
|
300
|
+
"Chart",
|
|
301
|
+
"{}",
|
|
302
|
+
"[object Object]",
|
|
303
|
+
"0",
|
|
304
|
+
"null",
|
|
305
|
+
"undefined",
|
|
306
|
+
];
|
|
307
|
+
|
|
308
|
+
for (const value of garbageValues) {
|
|
309
|
+
const type: DashboardComponentType = value as DashboardComponentType;
|
|
310
|
+
|
|
311
|
+
expect((): boolean => {
|
|
312
|
+
return isDataSourceComponentType(type);
|
|
313
|
+
}).not.toThrow();
|
|
314
|
+
|
|
315
|
+
expect(
|
|
316
|
+
`${JSON.stringify(value)}: ${isDataSourceComponentType(type)}`,
|
|
317
|
+
).toBe(`${JSON.stringify(value)}: false`);
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
/*
|
|
322
|
+
* Object.prototype keys are the classic way a "set" implemented as a plain
|
|
323
|
+
* object lies. Array.includes does not, and this pins that down.
|
|
324
|
+
*/
|
|
325
|
+
test("prototype-inherited names are not treated as data source types", (): void => {
|
|
326
|
+
const prototypeNames: Array<string> = [
|
|
327
|
+
"__proto__",
|
|
328
|
+
"constructor",
|
|
329
|
+
"toString",
|
|
330
|
+
"hasOwnProperty",
|
|
331
|
+
"valueOf",
|
|
332
|
+
];
|
|
333
|
+
|
|
334
|
+
for (const name of prototypeNames) {
|
|
335
|
+
expect(
|
|
336
|
+
`${name}: ${isDataSourceComponentType(name as DashboardComponentType)}`,
|
|
337
|
+
).toBe(`${name}: false`);
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
test("null and undefined do not throw and are not data source types", (): void => {
|
|
342
|
+
const nullish: Array<unknown> = [null, undefined, 0, NaN, false];
|
|
343
|
+
|
|
344
|
+
for (const value of nullish) {
|
|
345
|
+
expect((): boolean => {
|
|
346
|
+
return isDataSourceComponentType(value as DashboardComponentType);
|
|
347
|
+
}).not.toThrow();
|
|
348
|
+
|
|
349
|
+
expect(isDataSourceComponentType(value as DashboardComponentType)).toBe(
|
|
350
|
+
false,
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
/*
|
|
357
|
+
* THE INVARIANT THE WHOLE CHANGE EXISTS TO ESTABLISH.
|
|
358
|
+
*
|
|
359
|
+
* Before the split, a single widget's arguments could carry both a metric
|
|
360
|
+
* query config and a data source query config, and which one won was decided
|
|
361
|
+
* at render time. The two argument shapes are now disjoint by construction:
|
|
362
|
+
* a metric widget never carries data source config, and a data source widget
|
|
363
|
+
* never carries metric config. Every consumer downstream (the settings form,
|
|
364
|
+
* the fetch layer, the public dashboard filter) relies on that, so the
|
|
365
|
+
* defaults these utils produce are asserted to have no overlapping keys at
|
|
366
|
+
* all — not merely undefined values, but no own property whatsoever, since
|
|
367
|
+
* `key: undefined` still survives into stored JSON as a present key in some
|
|
368
|
+
* serializers and still trips `"key" in args` branches.
|
|
369
|
+
*/
|
|
370
|
+
describe("metric widget defaults carry no data source config", () => {
|
|
371
|
+
/*
|
|
372
|
+
* Non-vacuity guard. DATA_SOURCE_ONLY_ARGUMENT_KEYS is only a real test of
|
|
373
|
+
* the metric widgets if the Data Source widgets are the ones using those
|
|
374
|
+
* keys — otherwise every assertion below passes against a list of names
|
|
375
|
+
* nothing in the product has ever written.
|
|
376
|
+
*/
|
|
377
|
+
test("the data source key list names keys the new widgets really use", (): void => {
|
|
378
|
+
for (const key of DATA_SOURCE_ONLY_ARGUMENT_KEYS) {
|
|
379
|
+
const usedBy: Array<string> = DATA_SOURCE_WIDGET_DEFAULTS.filter(
|
|
380
|
+
(widget: WidgetDefault): boolean => {
|
|
381
|
+
return hasOwn(argumentsOf(widget.component), key);
|
|
382
|
+
},
|
|
383
|
+
).map((widget: WidgetDefault): string => {
|
|
384
|
+
return widget.label;
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
expect(`${key} used by: ${usedBy.length}`).not.toBe(`${key} used by: 0`);
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
test("neither pre-split data source key survives anywhere", (): void => {
|
|
392
|
+
for (const widget of [
|
|
393
|
+
...METRIC_WIDGET_DEFAULTS,
|
|
394
|
+
...DATA_SOURCE_WIDGET_DEFAULTS,
|
|
395
|
+
]) {
|
|
396
|
+
const args: Record<string, unknown> = argumentsOf(widget.component);
|
|
397
|
+
|
|
398
|
+
for (const key of REMOVED_DATA_SOURCE_ARGUMENT_KEYS) {
|
|
399
|
+
expect(`${widget.label}.${key}: ${hasOwn(args, key)}`).toBe(
|
|
400
|
+
`${widget.label}.${key}: false`,
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
test("no metric widget default declares a data source argument key", (): void => {
|
|
407
|
+
for (const widget of METRIC_WIDGET_DEFAULTS) {
|
|
408
|
+
const args: Record<string, unknown> = argumentsOf(widget.component);
|
|
409
|
+
|
|
410
|
+
for (const key of DATA_SOURCE_ONLY_ARGUMENT_KEYS) {
|
|
411
|
+
expect(`${widget.label}.${key}: ${hasOwn(args, key)}`).toBe(
|
|
412
|
+
`${widget.label}.${key}: false`,
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
test("metric widget defaults still carry their own metric config", (): void => {
|
|
419
|
+
const chartArgs: Record<string, unknown> = argumentsOf(
|
|
420
|
+
METRIC_WIDGET_DEFAULTS[0]!.component,
|
|
421
|
+
);
|
|
422
|
+
const valueArgs: Record<string, unknown> = argumentsOf(
|
|
423
|
+
METRIC_WIDGET_DEFAULTS[1]!.component,
|
|
424
|
+
);
|
|
425
|
+
const gaugeArgs: Record<string, unknown> = argumentsOf(
|
|
426
|
+
METRIC_WIDGET_DEFAULTS[2]!.component,
|
|
427
|
+
);
|
|
428
|
+
const tableArgs: Record<string, unknown> = argumentsOf(
|
|
429
|
+
METRIC_WIDGET_DEFAULTS[3]!.component,
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
expect(hasOwn(chartArgs, "metricQueryConfig")).toBe(true);
|
|
433
|
+
expect(hasOwn(valueArgs, "metricQueryConfig")).toBe(true);
|
|
434
|
+
expect(hasOwn(gaugeArgs, "metricQueryConfig")).toBe(true);
|
|
435
|
+
expect(hasOwn(tableArgs, "columns")).toBe(true);
|
|
436
|
+
expect(hasOwn(tableArgs, "groupByAttributes")).toBe(true);
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
test("metric widget defaults keep their original component types", (): void => {
|
|
440
|
+
const types: Array<DashboardComponentType> = METRIC_WIDGET_DEFAULTS.map(
|
|
441
|
+
(widget: WidgetDefault): DashboardComponentType => {
|
|
442
|
+
return widget.component.componentType;
|
|
443
|
+
},
|
|
444
|
+
);
|
|
445
|
+
|
|
446
|
+
expect(types).toEqual([
|
|
447
|
+
DashboardComponentType.Chart,
|
|
448
|
+
DashboardComponentType.Value,
|
|
449
|
+
DashboardComponentType.Gauge,
|
|
450
|
+
DashboardComponentType.Table,
|
|
451
|
+
]);
|
|
452
|
+
});
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
describe("data source widget defaults carry no metric config", () => {
|
|
456
|
+
test("no data source widget default declares a metric argument key", (): void => {
|
|
457
|
+
for (const widget of DATA_SOURCE_WIDGET_DEFAULTS) {
|
|
458
|
+
const args: Record<string, unknown> = argumentsOf(widget.component);
|
|
459
|
+
|
|
460
|
+
for (const key of METRIC_ONLY_ARGUMENT_KEYS) {
|
|
461
|
+
expect(`${widget.label}.${key}: ${hasOwn(args, key)}`).toBe(
|
|
462
|
+
`${widget.label}.${key}: false`,
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
test("each data source widget default is typed as its own component type", (): void => {
|
|
469
|
+
const types: Array<DashboardComponentType> =
|
|
470
|
+
DATA_SOURCE_WIDGET_DEFAULTS.map(
|
|
471
|
+
(widget: WidgetDefault): DashboardComponentType => {
|
|
472
|
+
return widget.component.componentType;
|
|
473
|
+
},
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
expect(types).toEqual(EXPECTED_DATA_SOURCE_TYPES);
|
|
477
|
+
|
|
478
|
+
for (const type of types) {
|
|
479
|
+
expect(`${type} is data source: ${isDataSourceComponentType(type)}`).toBe(
|
|
480
|
+
`${type} is data source: true`,
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
test("the chart default seeds exactly one blank query in a queries array", (): void => {
|
|
486
|
+
const args: Record<string, unknown> = argumentsOf(
|
|
487
|
+
DATA_SOURCE_WIDGET_DEFAULTS[0]!.component,
|
|
488
|
+
);
|
|
489
|
+
|
|
490
|
+
expect(hasOwn(args, "queries")).toBe(true);
|
|
491
|
+
expect(hasOwn(args, "query")).toBe(false);
|
|
492
|
+
|
|
493
|
+
const queries: Array<Record<string, unknown>> = args["queries"] as Array<
|
|
494
|
+
Record<string, unknown>
|
|
495
|
+
>;
|
|
496
|
+
|
|
497
|
+
expect(Array.isArray(queries)).toBe(true);
|
|
498
|
+
expect(queries.length).toBe(1);
|
|
499
|
+
expect(queries[0]!["dataSourceId"]).toBe("");
|
|
500
|
+
expect(queries[0]!["query"]).toBe("");
|
|
501
|
+
expect(typeof queries[0]!["id"]).toBe("string");
|
|
502
|
+
expect((queries[0]!["id"] as string).length).toBeGreaterThan(0);
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
test("the value, gauge and table defaults each seed a single blank query object", (): void => {
|
|
506
|
+
const singleQueryWidgets: Array<WidgetDefault> =
|
|
507
|
+
DATA_SOURCE_WIDGET_DEFAULTS.slice(1);
|
|
508
|
+
|
|
509
|
+
expect(singleQueryWidgets.length).toBe(3);
|
|
510
|
+
|
|
511
|
+
for (const widget of singleQueryWidgets) {
|
|
512
|
+
const args: Record<string, unknown> = argumentsOf(widget.component);
|
|
513
|
+
|
|
514
|
+
expect(`${widget.label} has query: ${hasOwn(args, "query")}`).toBe(
|
|
515
|
+
`${widget.label} has query: true`,
|
|
516
|
+
);
|
|
517
|
+
expect(`${widget.label} has queries: ${hasOwn(args, "queries")}`).toBe(
|
|
518
|
+
`${widget.label} has queries: false`,
|
|
519
|
+
);
|
|
520
|
+
|
|
521
|
+
const query: Record<string, unknown> = args["query"] as Record<
|
|
522
|
+
string,
|
|
523
|
+
unknown
|
|
524
|
+
>;
|
|
525
|
+
|
|
526
|
+
expect(Array.isArray(query)).toBe(false);
|
|
527
|
+
expect(`${widget.label} dataSourceId: ${query["dataSourceId"]}`).toBe(
|
|
528
|
+
`${widget.label} dataSourceId: `,
|
|
529
|
+
);
|
|
530
|
+
expect(`${widget.label} query: ${query["query"]}`).toBe(
|
|
531
|
+
`${widget.label} query: `,
|
|
532
|
+
);
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
/*
|
|
537
|
+
* The blank query ids must be distinct per widget instance, otherwise two
|
|
538
|
+
* widgets dropped on the same dashboard share React keys in the editor.
|
|
539
|
+
*/
|
|
540
|
+
test("blank query ids are unique across freshly built data source widgets", (): void => {
|
|
541
|
+
const ids: Array<string> = [];
|
|
542
|
+
|
|
543
|
+
for (const widget of DATA_SOURCE_WIDGET_DEFAULTS) {
|
|
544
|
+
const args: Record<string, unknown> = argumentsOf(widget.component);
|
|
545
|
+
const query: Record<string, unknown> | undefined = (args["query"] ||
|
|
546
|
+
(
|
|
547
|
+
args["queries"] as Array<Record<string, unknown>> | undefined
|
|
548
|
+
)?.[0]) as Record<string, unknown> | undefined;
|
|
549
|
+
|
|
550
|
+
expect(query).toBeDefined();
|
|
551
|
+
|
|
552
|
+
ids.push(String((query as Record<string, unknown>)["id"]));
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
expect(new Set<string>(ids).size).toBe(ids.length);
|
|
556
|
+
});
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
describe("shipped dashboard templates", () => {
|
|
560
|
+
/*
|
|
561
|
+
* Templates are seeded into a project the moment someone clicks "Create
|
|
562
|
+
* from Template". A data source widget in one would point at a DataSource
|
|
563
|
+
* record the target project has never connected, so it can only ever
|
|
564
|
+
* render an error.
|
|
565
|
+
*/
|
|
566
|
+
test("no template component uses a DataSource widget type", (): void => {
|
|
567
|
+
const offenders: Array<string> = collectTemplateComponents()
|
|
568
|
+
.filter((entry: TemplateComponent): boolean => {
|
|
569
|
+
return isDataSourceComponentType(entry.component.componentType);
|
|
570
|
+
})
|
|
571
|
+
.map((entry: TemplateComponent): string => {
|
|
572
|
+
return `${entry.templateName}/${entry.component.componentType}`;
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
expect(offenders).toEqual([]);
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
test("no template component carries a data source argument key", (): void => {
|
|
579
|
+
const offenders: Array<string> = [];
|
|
580
|
+
|
|
581
|
+
for (const entry of collectTemplateComponents()) {
|
|
582
|
+
const args: Record<string, unknown> = argumentsOf(entry.component);
|
|
583
|
+
|
|
584
|
+
for (const key of DATA_SOURCE_ONLY_ARGUMENT_KEYS) {
|
|
585
|
+
if (hasOwn(args, key)) {
|
|
586
|
+
offenders.push(`${entry.templateName}/${key}`);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
expect(offenders).toEqual([]);
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
/*
|
|
595
|
+
* Guards the two assertions above from passing vacuously if the template
|
|
596
|
+
* walk ever stops finding components.
|
|
597
|
+
*/
|
|
598
|
+
test("the template walk actually visits components", (): void => {
|
|
599
|
+
const visited: Array<TemplateComponent> = collectTemplateComponents();
|
|
600
|
+
|
|
601
|
+
expect(visited.length).toBeGreaterThan(20);
|
|
602
|
+
expect(DashboardTemplates.length).toBeGreaterThan(1);
|
|
603
|
+
|
|
604
|
+
const templatesWithComponents: Set<string> = new Set<string>(
|
|
605
|
+
visited.map((entry: TemplateComponent): string => {
|
|
606
|
+
return entry.templateName;
|
|
607
|
+
}),
|
|
608
|
+
);
|
|
609
|
+
|
|
610
|
+
const catalogNames: Array<string> = DashboardTemplates.map(
|
|
611
|
+
(template: DashboardTemplate): string => {
|
|
612
|
+
return template.name;
|
|
613
|
+
},
|
|
614
|
+
);
|
|
615
|
+
|
|
616
|
+
expect(templatesWithComponents.size).toBe(catalogNames.length - 1);
|
|
617
|
+
});
|
|
618
|
+
});
|