@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,331 @@
|
|
|
1
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
2
|
+
/*
|
|
3
|
+
* Read-only guard + time-macro interpolation for SQL sent to external Data
|
|
4
|
+
* Sources (PostgreSQL, MySQL, SQL Server, ClickHouse).
|
|
5
|
+
*
|
|
6
|
+
* Defense in depth: this classifier is the FIRST layer, applied identically
|
|
7
|
+
* to every engine; connectors add server-enforced layers where the engine
|
|
8
|
+
* supports them (pg `default_transaction_read_only=on`, MySQL
|
|
9
|
+
* `SET SESSION TRANSACTION READ ONLY` + single-statement driver mode,
|
|
10
|
+
* ClickHouse `readonly=1`). SQL Server has no session read-only mode, so
|
|
11
|
+
* this classifier — plus the recommendation to connect with a read-only
|
|
12
|
+
* login — is its enforcement, and the classifier is written to be sound
|
|
13
|
+
* for T-SQL specifically:
|
|
14
|
+
*
|
|
15
|
+
* - `#` is NOT treated as a comment. It is one in MySQL, but in T-SQL
|
|
16
|
+
* `#name` is a temp table — blanking from `#` to end-of-line would hide
|
|
17
|
+
* a smuggled `; DROP ...` from the classifier while SQL Server executed
|
|
18
|
+
* it. MySQL users must write `--` comments instead (false-rejection is
|
|
19
|
+
* the safe failure mode).
|
|
20
|
+
* - Backslash-quote (`\'`) is REJECTED outright rather than parsed:
|
|
21
|
+
* MySQL/ClickHouse treat it as an escaped quote, PostgreSQL (standard
|
|
22
|
+
* conforming strings) as a literal backslash ending the string — two
|
|
23
|
+
* engines, two parse trees, and whichever one the classifier picked
|
|
24
|
+
* would be exploitable on the other. Users write `''` instead, which
|
|
25
|
+
* every engine accepts.
|
|
26
|
+
*
|
|
27
|
+
* The classifier works on a STRIPPED copy of the query: contents of string
|
|
28
|
+
* literals, quoted identifiers and comments are blanked first, so
|
|
29
|
+
* `SELECT 'DROP TABLE x'` passes while comment-smuggling cannot. A column
|
|
30
|
+
* literally named `delete` must be quoted — an accepted false-positive
|
|
31
|
+
* cost. Divergences that remain (e.g. MySQL not nesting block comments)
|
|
32
|
+
* are contained by that engine's server-enforced layer.
|
|
33
|
+
*/
|
|
34
|
+
const ALLOWED_HEAD_KEYWORDS = [
|
|
35
|
+
"SELECT",
|
|
36
|
+
"WITH",
|
|
37
|
+
"SHOW",
|
|
38
|
+
"EXPLAIN",
|
|
39
|
+
"DESCRIBE",
|
|
40
|
+
"DESC",
|
|
41
|
+
];
|
|
42
|
+
/*
|
|
43
|
+
* Any of these appearing ANYWHERE (outside strings/comments/quoted
|
|
44
|
+
* identifiers) rejects the query. Notes:
|
|
45
|
+
* - INTO catches `SELECT ... INTO table` (pg/mssql) and MySQL's
|
|
46
|
+
* `SELECT ... INTO OUTFILE`.
|
|
47
|
+
* - WITH ... DELETE/INSERT data-modifying CTEs are caught by the DML
|
|
48
|
+
* words themselves, which is why the head check alone is not enough.
|
|
49
|
+
* - SET catches session tampering (`SET GLOBAL`, `SET ROLE`).
|
|
50
|
+
* - ANALYZE is intentionally allowed so `EXPLAIN ANALYZE SELECT ...`
|
|
51
|
+
* works; under a read-only transaction it cannot write.
|
|
52
|
+
* - SYSTEM is intentionally NOT listed: `system.*` tables are the most
|
|
53
|
+
* common ClickHouse introspection target and the head check already
|
|
54
|
+
* stops `SYSTEM ...` commands.
|
|
55
|
+
*/
|
|
56
|
+
const FORBIDDEN_KEYWORDS = [
|
|
57
|
+
"INSERT",
|
|
58
|
+
"UPDATE",
|
|
59
|
+
"DELETE",
|
|
60
|
+
"MERGE",
|
|
61
|
+
"UPSERT",
|
|
62
|
+
"REPLACE",
|
|
63
|
+
"DROP",
|
|
64
|
+
"ALTER",
|
|
65
|
+
"CREATE",
|
|
66
|
+
"TRUNCATE",
|
|
67
|
+
"RENAME",
|
|
68
|
+
"GRANT",
|
|
69
|
+
"REVOKE",
|
|
70
|
+
"EXEC",
|
|
71
|
+
"EXECUTE",
|
|
72
|
+
"CALL",
|
|
73
|
+
"DO",
|
|
74
|
+
"COPY",
|
|
75
|
+
"INTO",
|
|
76
|
+
"SET",
|
|
77
|
+
"LOCK",
|
|
78
|
+
"UNLOCK",
|
|
79
|
+
"PREPARE",
|
|
80
|
+
"DEALLOCATE",
|
|
81
|
+
"BEGIN",
|
|
82
|
+
"COMMIT",
|
|
83
|
+
"ROLLBACK",
|
|
84
|
+
"SAVEPOINT",
|
|
85
|
+
"VACUUM",
|
|
86
|
+
"REINDEX",
|
|
87
|
+
"CLUSTER",
|
|
88
|
+
"CHECKPOINT",
|
|
89
|
+
"LISTEN",
|
|
90
|
+
"NOTIFY",
|
|
91
|
+
"REFRESH",
|
|
92
|
+
"LOAD",
|
|
93
|
+
"HANDLER",
|
|
94
|
+
"OUTFILE",
|
|
95
|
+
"DUMPFILE",
|
|
96
|
+
"SHUTDOWN",
|
|
97
|
+
"KILL",
|
|
98
|
+
"USE",
|
|
99
|
+
"ATTACH",
|
|
100
|
+
"DETACH",
|
|
101
|
+
"OPTIMIZE",
|
|
102
|
+
// T-SQL specifics (SQL Server batches don't even need semicolons).
|
|
103
|
+
"BACKUP",
|
|
104
|
+
"RESTORE",
|
|
105
|
+
"DBCC",
|
|
106
|
+
"RECONFIGURE",
|
|
107
|
+
"WAITFOR",
|
|
108
|
+
"OPENQUERY",
|
|
109
|
+
"OPENROWSET",
|
|
110
|
+
"OPENDATASOURCE",
|
|
111
|
+
"OPENXML",
|
|
112
|
+
];
|
|
113
|
+
/*
|
|
114
|
+
* SQL Server system / extended stored procedures (sp_configure,
|
|
115
|
+
* xp_cmdshell, ...) — callable without EXEC in some positions, so they get
|
|
116
|
+
* their own pattern instead of a keyword entry.
|
|
117
|
+
*/
|
|
118
|
+
const FORBIDDEN_PATTERNS = [
|
|
119
|
+
{
|
|
120
|
+
pattern: /\b(?:xp_|sp_)\w+/i,
|
|
121
|
+
description: "system stored procedures (sp_*/xp_*)",
|
|
122
|
+
},
|
|
123
|
+
];
|
|
124
|
+
/*
|
|
125
|
+
* A backslash immediately followed by a quote — the escape style whose
|
|
126
|
+
* meaning differs per engine (see the header comment), so it is rejected
|
|
127
|
+
* outright.
|
|
128
|
+
*/
|
|
129
|
+
const BACKSLASH_ESCAPED_QUOTE_REGEX = /\\['"]/;
|
|
130
|
+
export default class SqlQueryGuard {
|
|
131
|
+
/*
|
|
132
|
+
* Blank the contents of comments, string literals and quoted identifiers
|
|
133
|
+
* (replaced by spaces so token boundaries survive). Handles:
|
|
134
|
+
* -- line comments
|
|
135
|
+
* slash-star block comments (nested, as PostgreSQL and T-SQL allow)
|
|
136
|
+
* 'single quotes' with '' escaping
|
|
137
|
+
* "double-quoted idents" with "" escaping
|
|
138
|
+
* `backtick idents` (MySQL/ClickHouse)
|
|
139
|
+
* [bracket idents] (SQL Server)
|
|
140
|
+
* $tag$ dollar quotes $tag$ (PostgreSQL/ClickHouse)
|
|
141
|
+
*
|
|
142
|
+
* Unterminated regions blank to end-of-input, which fails safe: content
|
|
143
|
+
* is hidden from the ENGINE too or the engine errors on parse.
|
|
144
|
+
*/
|
|
145
|
+
static stripLiteralsAndComments(sql) {
|
|
146
|
+
const output = [];
|
|
147
|
+
const length = sql.length;
|
|
148
|
+
let index = 0;
|
|
149
|
+
const blank = (count) => {
|
|
150
|
+
for (let blanked = 0; blanked < count; blanked++) {
|
|
151
|
+
output.push(" ");
|
|
152
|
+
}
|
|
153
|
+
index += count;
|
|
154
|
+
};
|
|
155
|
+
while (index < length) {
|
|
156
|
+
const char = sql[index];
|
|
157
|
+
const next = index + 1 < length ? sql[index + 1] : "";
|
|
158
|
+
// Line comments: --
|
|
159
|
+
if (char === "-" && next === "-") {
|
|
160
|
+
while (index < length && sql[index] !== "\n") {
|
|
161
|
+
blank(1);
|
|
162
|
+
}
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
// Block comments, nested (PostgreSQL and T-SQL nest).
|
|
166
|
+
if (char === "/" && next === "*") {
|
|
167
|
+
let depth = 0;
|
|
168
|
+
while (index < length) {
|
|
169
|
+
if (sql[index] === "/" && sql[index + 1] === "*") {
|
|
170
|
+
depth++;
|
|
171
|
+
blank(2);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (sql[index] === "*" && sql[index + 1] === "/") {
|
|
175
|
+
depth--;
|
|
176
|
+
blank(2);
|
|
177
|
+
if (depth === 0) {
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
blank(1);
|
|
183
|
+
}
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
// Single-quoted string; '' escape only (see \' rejection above).
|
|
187
|
+
if (char === "'") {
|
|
188
|
+
blank(1);
|
|
189
|
+
while (index < length) {
|
|
190
|
+
if (sql[index] === "'" && sql[index + 1] === "'") {
|
|
191
|
+
blank(2);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (sql[index] === "'") {
|
|
195
|
+
blank(1);
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
blank(1);
|
|
199
|
+
}
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
// Double-quoted identifier; "" escape.
|
|
203
|
+
if (char === '"') {
|
|
204
|
+
blank(1);
|
|
205
|
+
while (index < length) {
|
|
206
|
+
if (sql[index] === '"' && sql[index + 1] === '"') {
|
|
207
|
+
blank(2);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (sql[index] === '"') {
|
|
211
|
+
blank(1);
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
blank(1);
|
|
215
|
+
}
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
// Backtick identifier (MySQL/ClickHouse); `` escape.
|
|
219
|
+
if (char === "`") {
|
|
220
|
+
blank(1);
|
|
221
|
+
while (index < length) {
|
|
222
|
+
if (sql[index] === "`" && sql[index + 1] === "`") {
|
|
223
|
+
blank(2);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (sql[index] === "`") {
|
|
227
|
+
blank(1);
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
blank(1);
|
|
231
|
+
}
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
// Bracket identifier (SQL Server); ]] escape.
|
|
235
|
+
if (char === "[") {
|
|
236
|
+
blank(1);
|
|
237
|
+
while (index < length) {
|
|
238
|
+
if (sql[index] === "]" && sql[index + 1] === "]") {
|
|
239
|
+
blank(2);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (sql[index] === "]") {
|
|
243
|
+
blank(1);
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
blank(1);
|
|
247
|
+
}
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
// Dollar-quoted string (PostgreSQL/ClickHouse): $$..$$ or $tag$..$tag$.
|
|
251
|
+
if (char === "$") {
|
|
252
|
+
const tagMatch = sql
|
|
253
|
+
.substring(index)
|
|
254
|
+
.match(/^\$[A-Za-z_]*\$/);
|
|
255
|
+
if (tagMatch) {
|
|
256
|
+
const tag = tagMatch[0];
|
|
257
|
+
const closeIndex = sql.indexOf(tag, index + tag.length);
|
|
258
|
+
const end = closeIndex === -1 ? length : closeIndex + tag.length;
|
|
259
|
+
blank(end - index);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
output.push(char);
|
|
264
|
+
index++;
|
|
265
|
+
}
|
|
266
|
+
return output.join("");
|
|
267
|
+
}
|
|
268
|
+
/*
|
|
269
|
+
* Throws BadDataException unless the query is a single read-only
|
|
270
|
+
* statement.
|
|
271
|
+
*/
|
|
272
|
+
static assertReadOnlyQuery(sql) {
|
|
273
|
+
if (!sql || sql.trim().length === 0) {
|
|
274
|
+
throw new BadDataException("Query is required.");
|
|
275
|
+
}
|
|
276
|
+
/*
|
|
277
|
+
* Backslash-escaped quotes parse differently across engines (see the
|
|
278
|
+
* header comment) — reject rather than guess.
|
|
279
|
+
*/
|
|
280
|
+
if (BACKSLASH_ESCAPED_QUOTE_REGEX.test(sql)) {
|
|
281
|
+
throw new BadDataException("Backslash-escaped quotes are not allowed in data source queries. Use doubled quotes ('') to escape a quote character.");
|
|
282
|
+
}
|
|
283
|
+
const stripped = this.stripLiteralsAndComments(sql);
|
|
284
|
+
// Single statement only: any ';' other than trailing rejects.
|
|
285
|
+
const withoutTrailingSemicolon = stripped.replace(/;\s*$/, "");
|
|
286
|
+
if (withoutTrailingSemicolon.includes(";")) {
|
|
287
|
+
throw new BadDataException("Only a single SQL statement is allowed per query.");
|
|
288
|
+
}
|
|
289
|
+
const firstWordMatch = withoutTrailingSemicolon.match(/[A-Za-z_]+/);
|
|
290
|
+
const firstWord = firstWordMatch
|
|
291
|
+
? firstWordMatch[0].toUpperCase()
|
|
292
|
+
: "";
|
|
293
|
+
if (!ALLOWED_HEAD_KEYWORDS.includes(firstWord)) {
|
|
294
|
+
throw new BadDataException(`Only read-only queries are allowed (must start with ${ALLOWED_HEAD_KEYWORDS.join(", ")}).`);
|
|
295
|
+
}
|
|
296
|
+
for (const keyword of FORBIDDEN_KEYWORDS) {
|
|
297
|
+
const pattern = new RegExp(`\\b${keyword}\\b`, "i");
|
|
298
|
+
if (pattern.test(withoutTrailingSemicolon)) {
|
|
299
|
+
throw new BadDataException(`Query contains a keyword that is not allowed in read-only data source queries: ${keyword}. Quote it if it is a column or table name.`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
for (const forbidden of FORBIDDEN_PATTERNS) {
|
|
303
|
+
if (forbidden.pattern.test(withoutTrailingSemicolon)) {
|
|
304
|
+
throw new BadDataException(`Query contains ${forbidden.description}, which is not allowed in read-only data source queries.`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
static formatUtcDateTime(date) {
|
|
309
|
+
const pad = (value) => {
|
|
310
|
+
return value.toString().padStart(2, "0");
|
|
311
|
+
};
|
|
312
|
+
return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())} ${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}:${pad(date.getUTCSeconds())}`;
|
|
313
|
+
}
|
|
314
|
+
/*
|
|
315
|
+
* Replace dashboard time macros with concrete values. Longer tokens are
|
|
316
|
+
* replaced first so $__startTimeMs is not corrupted by the $__startTime
|
|
317
|
+
* replacement. Timestamp literals are quoted 'YYYY-MM-DD HH:MM:SS' in
|
|
318
|
+
* UTC — every supported engine parses that form; sessions are expected
|
|
319
|
+
* to run in UTC (documented in the query editor help text).
|
|
320
|
+
*/
|
|
321
|
+
static applyTimeMacros(sql, startDate, endDate) {
|
|
322
|
+
const rangeSeconds = Math.max(Math.floor((endDate.getTime() - startDate.getTime()) / 1000), 0);
|
|
323
|
+
return sql
|
|
324
|
+
.replace(/\$__startTimeMs\b/g, startDate.getTime().toString())
|
|
325
|
+
.replace(/\$__endTimeMs\b/g, endDate.getTime().toString())
|
|
326
|
+
.replace(/\$__startTime\b/g, `'${this.formatUtcDateTime(startDate)}'`)
|
|
327
|
+
.replace(/\$__endTime\b/g, `'${this.formatUtcDateTime(endDate)}'`)
|
|
328
|
+
.replace(/\$__rangeSeconds\b/g, rangeSeconds.toString());
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=SqlQueryGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SqlQueryGuard.js","sourceRoot":"","sources":["../../../../../Server/Utils/DataSource/SqlQueryGuard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { DataSourceTableColumnType, } from "../../../Types/DataSource/DataSourceTableResult";
|
|
2
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
3
|
+
/*
|
|
4
|
+
* Shared row → chart/table shaping for every SQL-family connector
|
|
5
|
+
* (PostgreSQL, MySQL, SQL Server, ClickHouse). One implementation means one
|
|
6
|
+
* behavior: the same query against any engine renders the same chart.
|
|
7
|
+
*
|
|
8
|
+
* Time-series convention (Grafana-compatible):
|
|
9
|
+
* - a TIME column named time / timestamp / date / ts (case-insensitive);
|
|
10
|
+
* - a numeric VALUE column named value (or the first numeric non-time
|
|
11
|
+
* column);
|
|
12
|
+
* - every OTHER column becomes a series label — rows sharing the same
|
|
13
|
+
* label values merge into one series. The chart layer groups on the
|
|
14
|
+
* `attributes` object of each data point.
|
|
15
|
+
*/
|
|
16
|
+
const TIME_COLUMN_NAMES = ["time", "timestamp", "date", "ts"];
|
|
17
|
+
const VALUE_COLUMN_NAME = "value";
|
|
18
|
+
/*
|
|
19
|
+
* A 9-19 digit unsigned integer string — an epoch in seconds through
|
|
20
|
+
* nanoseconds. Shorter numeric strings (bare years, YYYYMMDD) stay on the
|
|
21
|
+
* Date-parse path.
|
|
22
|
+
*/
|
|
23
|
+
const NUMERIC_EPOCH_STRING_REGEX = /^\d{9,19}$/;
|
|
24
|
+
export default class SqlResultShaper {
|
|
25
|
+
/*
|
|
26
|
+
* Clamp raw driver rows to the cap. Connectors fetch cap+1 so the shaper
|
|
27
|
+
* can tell "exactly cap" apart from "more than cap".
|
|
28
|
+
*/
|
|
29
|
+
static clampRows(rows, maxRows) {
|
|
30
|
+
if (rows.length > maxRows) {
|
|
31
|
+
return { rows: rows.slice(0, maxRows), truncated: true };
|
|
32
|
+
}
|
|
33
|
+
return { rows: rows, truncated: false };
|
|
34
|
+
}
|
|
35
|
+
/*
|
|
36
|
+
* Copy of the probe SqlMonitor's cell coercion semantics: keep JSON-safe
|
|
37
|
+
* primitives, ISO-ify dates, never ship raw binary.
|
|
38
|
+
*/
|
|
39
|
+
static coerceCell(value) {
|
|
40
|
+
if (value === null || value === undefined) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
if (typeof value === "number" ||
|
|
44
|
+
typeof value === "boolean" ||
|
|
45
|
+
typeof value === "string") {
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
if (value instanceof Date) {
|
|
49
|
+
return value.toISOString();
|
|
50
|
+
}
|
|
51
|
+
if (Buffer.isBuffer(value)) {
|
|
52
|
+
return "[binary]";
|
|
53
|
+
}
|
|
54
|
+
if (typeof value === "bigint") {
|
|
55
|
+
return value.toString();
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
return JSON.stringify(value);
|
|
59
|
+
}
|
|
60
|
+
catch (_a) {
|
|
61
|
+
return String(value);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
static findTimeColumn(columnNames) {
|
|
65
|
+
return columnNames.find((name) => {
|
|
66
|
+
return TIME_COLUMN_NAMES.includes(name.toLowerCase());
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
static findValueColumn(columnNames, timeColumn, firstRow) {
|
|
70
|
+
const explicit = columnNames.find((name) => {
|
|
71
|
+
return name.toLowerCase() === VALUE_COLUMN_NAME;
|
|
72
|
+
});
|
|
73
|
+
if (explicit) {
|
|
74
|
+
return explicit;
|
|
75
|
+
}
|
|
76
|
+
// First numeric non-time column.
|
|
77
|
+
return columnNames.find((name) => {
|
|
78
|
+
if (name === timeColumn) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
const cell = firstRow[name];
|
|
82
|
+
return (typeof cell === "number" ||
|
|
83
|
+
typeof cell === "bigint" ||
|
|
84
|
+
(typeof cell === "string" &&
|
|
85
|
+
cell.trim() !== "" &&
|
|
86
|
+
Number.isFinite(Number(cell))));
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/*
|
|
90
|
+
* Parse a SQL time cell: Date object, ISO-ish string, or epoch number
|
|
91
|
+
* (ms when >= 1e12, seconds when >= 1e9). Returns null when
|
|
92
|
+
* unparseable.
|
|
93
|
+
*/
|
|
94
|
+
static coerceTimestamp(value) {
|
|
95
|
+
if (value instanceof Date) {
|
|
96
|
+
return isNaN(value.getTime()) ? null : value;
|
|
97
|
+
}
|
|
98
|
+
if (typeof value === "number" || typeof value === "bigint") {
|
|
99
|
+
const numeric = Number(value);
|
|
100
|
+
if (!Number.isFinite(numeric) || numeric <= 0) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
if (numeric >= 1e12) {
|
|
104
|
+
return new Date(numeric);
|
|
105
|
+
}
|
|
106
|
+
if (numeric >= 1e9) {
|
|
107
|
+
return new Date(numeric * 1000);
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
112
|
+
const trimmed = value.trim();
|
|
113
|
+
/*
|
|
114
|
+
* Numeric-string epochs: ClickHouse's JSON format serializes
|
|
115
|
+
* 64-bit integers as strings, and REST payloads routinely quote
|
|
116
|
+
* epoch numbers — route them through the same epoch heuristic as
|
|
117
|
+
* native numbers instead of letting new Date('1700000000000')
|
|
118
|
+
* produce Invalid Date and silently drop the row. 9+ digits only,
|
|
119
|
+
* so short numeric strings (bare years) keep the Date-parse path.
|
|
120
|
+
*/
|
|
121
|
+
if (NUMERIC_EPOCH_STRING_REGEX.test(trimmed)) {
|
|
122
|
+
return this.coerceTimestamp(Number(trimmed));
|
|
123
|
+
}
|
|
124
|
+
/*
|
|
125
|
+
* Engines commonly return 'YYYY-MM-DD HH:MM:SS' with no zone —
|
|
126
|
+
* treat it as UTC (the macros are UTC, and Date.parse would
|
|
127
|
+
* otherwise apply the server's local zone).
|
|
128
|
+
*/
|
|
129
|
+
const spaceSeparated = trimmed.match(/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}(?:\.\d+)?)$/);
|
|
130
|
+
const normalized = spaceSeparated
|
|
131
|
+
? `${spaceSeparated[1]}T${spaceSeparated[2]}Z`
|
|
132
|
+
: trimmed;
|
|
133
|
+
const parsed = new Date(normalized);
|
|
134
|
+
return isNaN(parsed.getTime()) ? null : parsed;
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
static coerceValue(value) {
|
|
139
|
+
if (typeof value === "number") {
|
|
140
|
+
return Number.isFinite(value) ? value : null;
|
|
141
|
+
}
|
|
142
|
+
if (typeof value === "bigint") {
|
|
143
|
+
return Number(value);
|
|
144
|
+
}
|
|
145
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
146
|
+
const numeric = Number(value);
|
|
147
|
+
return Number.isFinite(numeric) ? numeric : null;
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
static rowsToTimeSeries(rows, options) {
|
|
152
|
+
const clamped = this.clampRows(rows, options.maxRows);
|
|
153
|
+
if (clamped.rows.length === 0) {
|
|
154
|
+
return { data: [], truncated: false };
|
|
155
|
+
}
|
|
156
|
+
const firstRow = clamped.rows[0];
|
|
157
|
+
const columnNames = Object.keys(firstRow);
|
|
158
|
+
const timeColumn = this.findTimeColumn(columnNames);
|
|
159
|
+
if (!timeColumn) {
|
|
160
|
+
throw new BadDataException(`Time-series queries must return a time column named one of: ${TIME_COLUMN_NAMES.join(", ")}. Got columns: ${columnNames.join(", ")}. Use the Table widget for non-time-series results.`);
|
|
161
|
+
}
|
|
162
|
+
const valueColumn = this.findValueColumn(columnNames, timeColumn, firstRow);
|
|
163
|
+
if (!valueColumn) {
|
|
164
|
+
throw new BadDataException(`Time-series queries must return a numeric column (name it "value"). Got columns: ${columnNames.join(", ")}.`);
|
|
165
|
+
}
|
|
166
|
+
const labelColumns = columnNames.filter((name) => {
|
|
167
|
+
return name !== timeColumn && name !== valueColumn;
|
|
168
|
+
});
|
|
169
|
+
const data = [];
|
|
170
|
+
for (const row of clamped.rows) {
|
|
171
|
+
const timestamp = this.coerceTimestamp(row[timeColumn]);
|
|
172
|
+
const value = this.coerceValue(row[valueColumn]);
|
|
173
|
+
if (timestamp === null || value === null) {
|
|
174
|
+
continue; // skip unplottable rows rather than failing the chart.
|
|
175
|
+
}
|
|
176
|
+
const point = {
|
|
177
|
+
timestamp: timestamp,
|
|
178
|
+
value: value,
|
|
179
|
+
};
|
|
180
|
+
if (labelColumns.length > 0) {
|
|
181
|
+
const attributes = {};
|
|
182
|
+
for (const labelColumn of labelColumns) {
|
|
183
|
+
const cell = this.coerceCell(row[labelColumn]);
|
|
184
|
+
attributes[labelColumn] = cell === null ? "(unset)" : String(cell);
|
|
185
|
+
}
|
|
186
|
+
point["attributes"] = attributes;
|
|
187
|
+
}
|
|
188
|
+
data.push(point);
|
|
189
|
+
}
|
|
190
|
+
return { data: data, truncated: clamped.truncated };
|
|
191
|
+
}
|
|
192
|
+
static sniffColumnType(value) {
|
|
193
|
+
if (typeof value === "number" || typeof value === "bigint") {
|
|
194
|
+
return DataSourceTableColumnType.Number;
|
|
195
|
+
}
|
|
196
|
+
if (typeof value === "boolean") {
|
|
197
|
+
return DataSourceTableColumnType.Boolean;
|
|
198
|
+
}
|
|
199
|
+
if (value instanceof Date) {
|
|
200
|
+
return DataSourceTableColumnType.Date;
|
|
201
|
+
}
|
|
202
|
+
if (value !== null && typeof value === "object") {
|
|
203
|
+
return DataSourceTableColumnType.Json;
|
|
204
|
+
}
|
|
205
|
+
return DataSourceTableColumnType.Text;
|
|
206
|
+
}
|
|
207
|
+
static rowsToTable(rows, options) {
|
|
208
|
+
const clamped = this.clampRows(rows, options.maxRows);
|
|
209
|
+
if (clamped.rows.length === 0) {
|
|
210
|
+
return { columns: [], rows: [], truncated: false };
|
|
211
|
+
}
|
|
212
|
+
/*
|
|
213
|
+
* Column set = union across rows (drivers can omit NULL columns in
|
|
214
|
+
* some row formats); type sniffed from the first non-null cell.
|
|
215
|
+
*/
|
|
216
|
+
const columnNames = [];
|
|
217
|
+
for (const row of clamped.rows) {
|
|
218
|
+
for (const name of Object.keys(row)) {
|
|
219
|
+
if (!columnNames.includes(name)) {
|
|
220
|
+
columnNames.push(name);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const columns = columnNames.map((name) => {
|
|
225
|
+
const sampleRow = clamped.rows.find((row) => {
|
|
226
|
+
return row[name] !== null && row[name] !== undefined;
|
|
227
|
+
});
|
|
228
|
+
return {
|
|
229
|
+
key: name,
|
|
230
|
+
title: name,
|
|
231
|
+
type: this.sniffColumnType(sampleRow ? sampleRow[name] : null),
|
|
232
|
+
};
|
|
233
|
+
});
|
|
234
|
+
const shapedRows = clamped.rows.map((row) => {
|
|
235
|
+
const shaped = {};
|
|
236
|
+
for (const name of columnNames) {
|
|
237
|
+
shaped[name] = this.coerceCell(row[name]);
|
|
238
|
+
}
|
|
239
|
+
return shaped;
|
|
240
|
+
});
|
|
241
|
+
return {
|
|
242
|
+
columns: columns,
|
|
243
|
+
rows: shapedRows,
|
|
244
|
+
truncated: clamped.truncated,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/*
|
|
248
|
+
* Redact credentials and connection internals from driver errors before
|
|
249
|
+
* they reach API responses (probe SqlMonitor semantics).
|
|
250
|
+
*/
|
|
251
|
+
/*
|
|
252
|
+
* Every user-supplied credential on a connection-settings object,
|
|
253
|
+
* including custom header VALUES (write-only in the model, so they can
|
|
254
|
+
* carry tokens) — the standard secret list for sanitizeError so no
|
|
255
|
+
* connector forgets one.
|
|
256
|
+
*/
|
|
257
|
+
static collectSecrets(settings) {
|
|
258
|
+
return [
|
|
259
|
+
settings.password,
|
|
260
|
+
settings.apiToken,
|
|
261
|
+
settings.username,
|
|
262
|
+
settings.databaseHost,
|
|
263
|
+
...Object.values(settings.customHeaders || {}),
|
|
264
|
+
];
|
|
265
|
+
}
|
|
266
|
+
static sanitizeError(error, secrets) {
|
|
267
|
+
let message = error instanceof Error ? error.message : String(error);
|
|
268
|
+
for (const secret of secrets) {
|
|
269
|
+
if (secret && secret.length >= 4) {
|
|
270
|
+
message = message.split(secret).join("***");
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// DSNs with embedded credentials.
|
|
274
|
+
message = message.replace(/[a-zA-Z]+:\/\/[^\s]*@[^\s]*/g, "[redacted-dsn]");
|
|
275
|
+
// Connection-string password pairs.
|
|
276
|
+
message = message.replace(/(password|pwd)\s*[=:]\s*(\{[^}]*\}|"[^"]*"|'[^']*'|[^;\r\n]+)/gi, "$1=***");
|
|
277
|
+
return message;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=SqlResultShaper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SqlResultShaper.js","sourceRoot":"","sources":["../../../../../Server/Utils/DataSource/SqlResultShaper.ts"],"names":[],"mappings":"AAEA,OAA8B,EAE5B,yBAAyB,GAC1B,MAAM,iDAAiD,CAAC;AACzD,OAAO,gBAAgB,MAAM,2CAA2C,CAAC;AAGzE;;;;;;;;;;;;GAYG;AAEH,MAAM,iBAAiB,GAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC7E,MAAM,iBAAiB,GAAW,OAAO,CAAC;AAO1C;;;;GAIG;AACH,MAAM,0BAA0B,GAAW,YAAY,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC;;;OAGG;IACI,MAAM,CAAC,SAAS,CACrB,IAAoC,EACpC,OAAe;QAEf,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,UAAU,CAAC,KAAc;QACrC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAO,KAAK,KAAK,SAAS;YAC1B,OAAO,KAAK,KAAK,QAAQ,EACzB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,cAAc,CAC3B,WAA0B;QAE1B,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE;YACvC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,eAAe,CAC5B,WAA0B,EAC1B,UAAkB,EAClB,QAAiC;QAEjC,MAAM,QAAQ,GAAuB,WAAW,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE;YACrE,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,iBAAiB,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,iCAAiC;QACjC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE;YACvC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,IAAI,GAAY,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrC,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;gBACxB,OAAO,IAAI,KAAK,QAAQ;gBACxB,CAAC,OAAO,IAAI,KAAK,QAAQ;oBACvB,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;oBAClB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,eAAe,CAAC,KAAc;QAC1C,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/C,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC3D,MAAM,OAAO,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;gBACpB,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YACD,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;gBACnB,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,MAAM,OAAO,GAAW,KAAK,CAAC,IAAI,EAAE,CAAC;YACrC;;;;;;;eAOG;YACH,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/C,CAAC;YACD;;;;eAIG;YACH,MAAM,cAAc,GAA4B,OAAO,CAAC,KAAK,CAC3D,qDAAqD,CACtD,CAAC;YACF,MAAM,UAAU,GAAW,cAAc;gBACvC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;gBAC9C,CAAC,CAAC,OAAO,CAAC;YACZ,MAAM,MAAM,GAAS,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,KAAc;QACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,MAAM,OAAO,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC;YACtC,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,MAAM,CAAC,gBAAgB,CAC5B,IAAoC,EACpC,OAA4B;QAE5B,MAAM,OAAO,GAAe,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAElE,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,QAAQ,GAA4B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QAC3D,MAAM,WAAW,GAAkB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEzD,MAAM,UAAU,GAAuB,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACxE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,gBAAgB,CACxB,+DAA+D,iBAAiB,CAAC,IAAI,CACnF,IAAI,CACL,kBAAkB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,qDAAqD,CAC/F,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAuB,IAAI,CAAC,eAAe,CAC1D,WAAW,EACX,UAAU,EACV,QAAQ,CACT,CAAC;QACF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,gBAAgB,CACxB,oFAAoF,WAAW,CAAC,IAAI,CAClG,IAAI,CACL,GAAG,CACL,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAkB,WAAW,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;YACtE,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,WAAW,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAA2B,EAAE,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAgB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACrE,MAAM,KAAK,GAAkB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;YAChE,IAAI,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACzC,SAAS,CAAC,uDAAuD;YACnE,CAAC;YAED,MAAM,KAAK,GAAoB;gBAC7B,SAAS,EAAE,SAAS;gBACpB,KAAK,EAAE,KAAK;aACM,CAAC;YAErB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,UAAU,GAA2B,EAAE,CAAC;gBAC9C,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;oBACvC,MAAM,IAAI,GAAc,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC1D,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrE,CAAC;gBACA,KAAiC,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC;YAChE,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;IACtD,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,KAAc;QAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC3D,OAAO,yBAAyB,CAAC,MAAM,CAAC;QAC1C,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,yBAAyB,CAAC,OAAO,CAAC;QAC3C,CAAC;QACD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,OAAO,yBAAyB,CAAC,IAAI,CAAC;QACxC,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,yBAAyB,CAAC,IAAI,CAAC;QACxC,CAAC;QACD,OAAO,yBAAyB,CAAC,IAAI,CAAC;IACxC,CAAC;IAEM,MAAM,CAAC,WAAW,CACvB,IAAoC,EACpC,OAA4B;QAE5B,MAAM,OAAO,GAAe,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAElE,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACrD,CAAC;QAED;;;WAGG;QACH,MAAM,WAAW,GAAkB,EAAE,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAiC,WAAW,CAAC,GAAG,CAC3D,CAAC,IAAY,EAAE,EAAE;YACf,MAAM,SAAS,GACb,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAA4B,EAAE,EAAE;gBACjD,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;YACvD,CAAC,CAAC,CAAC;YACL,OAAO;gBACL,GAAG,EAAE,IAAI;gBACT,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;aAC/D,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,MAAM,UAAU,GAAwC,OAAO,CAAC,IAAI,CAAC,GAAG,CACtE,CAAC,GAA4B,EAAE,EAAE;YAC/B,MAAM,MAAM,GAAiC,EAAE,CAAC;YAChD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CACF,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH;;;;;OAKG;IACI,MAAM,CAAC,cAAc,CAAC,QAM5B;QACC,OAAO;YACL,QAAQ,CAAC,QAAQ;YACjB,QAAQ,CAAC,QAAQ;YACjB,QAAQ,CAAC,QAAQ;YACjB,QAAQ,CAAC,YAAY;YACrB,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,IAAI,EAAE,CAAC;SAC/C,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,aAAa,CACzB,KAAc,EACd,OAAkC;QAElC,IAAI,OAAO,GACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEzD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACjC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,8BAA8B,EAAE,gBAAgB,CAAC,CAAC;QAC5E,oCAAoC;QACpC,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,iEAAiE,EACjE,QAAQ,CACT,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Types.js","sourceRoot":"","sources":["../../../../../Server/Utils/DataSource/Types.ts"],"names":[],"mappings":""}
|